자바란?
자바(Java)는 1995년 썬 마이크로시스템즈(Sun Microsystems)에서 개발된 객체 지향 프로그래밍 언어이다. WORA(Write Once, Run Anywhere)라는 철학을 바탕으로 높은 이식성을 제공한다. 자바는 JVM(Java Virtual Machine)을 통해 실행되며, 안정성과 보안성을 갖춘 언어로 다양한 분야에서 널리 사용되고 있다.
특징
- 객체 지향 언어: 캡슐화, 상속, 다형성을 지원한다.
- 높은 이식성: JVM을 통해 실행되기 때문에 OS 독립적으로 작동한다.
- 자동 메모리 관리: 객체 생성 시 메모리 영역을 자동으로 할당하고, 사용이 완료되면 GC(Garbage Collection)을 통해 자동으로 사용하지 않는 객체를 제거한다.
- 동적 로딩 지원: 프로그램 실행시 모든 클래스가 로딩되지 않고, 필요한 시점에 클래스를 로딩하여 사용할 수 있다.
단점
- 느린 실행 속도: JVM을 거쳐야 하므로, 다른 언어에 비해 실행 속도가 느리다.
- 높은 메모리 사용량: GC(Garbage Collection)으로 인해 메모리 사용량이 높다.
- 긴 코드의 길이: 다른 언어에 비해 작성해야 하는 코드의 길이가 길다.
- 불편한 예외처리: 예외 처리가 잘 되있지만, 일일이 예외처리를 지정해줘야한다는 불편함이 있다.
SE? JDK? JRE?
Java SE(Standard Edition)
자바의 표준안이다. 자바라는 언어가 어떤한 문법적인 구성을 가졌는지와 같은 것들을 정의하고 있다. 즉,구체적인 소프트웨어가 아니라 그 소프트웨어의 설계도라고 할 수 있다.
Java EE(Java Enterprise Edition)
Java SE의 확장판으로 대규모 기업용 에디션이다.
Java ME(Java Micro Edition)
피쳐폰, PDA 폰, 셋톱박스, 프린터와 같은 작은 임베디드 기기들 같은 작은 기기를 다루는데 이용하는 에디션이다.
JDK(Java Development Kit)
Java SE의 표준안에 따라 만들어진 구체적인 소프트웨어이다. 자바 코드를 컴파일하는 컴파일러와 개발에 필요한 각종의 도구, JRE가 포함되어 있다. 자바 개발을 위한 도구 모음으로, 컴파일러(javac), 실행기(java), 디버거 등이 포함됩니다. JDK는 JRE를 포함합니다.
JRE(Java Runtime Environment)
자바 애플리케이션을 실행하기 위한 환경으로, JVM과 표준 라이브러리를 포함한다. 자바를 작성된 응용프로그램이 실행되기 위한 최소환경으로 개발이 아닌 응용프로그램의 실행만을 위해서는 JRE가 필요하다.
자바 버전별 특징
Java 8
- Lambda 표현식, Stream API 도입.
- 새로운 날짜/시간 API 제공.
- 디폴트 메서드를 통한 인터페이스 확장.
Java 11
- LTS(Long-Term Support) 제공.
- HTTP Client API 추가.
- var 키워드를 통한 지역 변수 타입 추론.
Java 17
- 최신 LTS 버전으로 안정성과 성능 향상.
- Sealed 클래스와 Switch 패턴 매칭 지원.
- 향상된 NullPointerException 메시지 제공.
Java 21
- Java 플랫폼에 경량 가상 스레드를 도입
JAVA 실행 과정
- 개발자가 .java 확장자의 파일 작성한다.
- javac를 사용하여 자바 컴파일러(Java Compiler)를 통해 바이트 코드(.class) 파일로 변환한다. 바이트 코드 파일은 컴퓨터가 읽을 수 없고, JVM이 이해할 수 있는 코드이다.
- 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달한다.
- 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area), 즉, JVM의 메모리에 올린다.
- 실행 엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다. 이때, 실행 엔진은 두가지 방식으로 실행된다.
- 인터프리터(Interpreter): 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점이 있다.
- JIT 컴파일러(Just-In-Time Compiler): 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에 해당 메서드를 더 이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식이다.
main 메서드
main 메서드는 모든 자바 프로그램의 시작으로, JVM이 프로그램 실행을 위해 호출한다.
- static: 객체 생성 없이 호출 가능하다. 런타임 시작 시점에 메서드를 실행할 객체가 없기 때문에 메서드 실행이 불가능하다. 따라서 static을 사용하여 객체의 생성없이 메모리에 할당시켜 메서드를 호출할 수 있도록 하는 것이다.
- public: 모든 곳에서 접근 가능하다.
- void: 반환된 객체에 대해 JVM이 아무 작업도 수행하지 않기 때문에 반환값의 의미가 없다.
- String[] args: 명령줄 인수를 배열 형태로 전달한다.
상수와 리터럴
상수(Constant)
한 번 설정된 후 값을 변경할 수 없는 변수이다.
final 키워드를 사용하여 선언된다.
리터럴(Literal)
코드 내에서 직접 값을 표현한 것이다.
예를 들어, 숫자, 문자열, 불리언 값 등이 있다.
final int MAX_VALUE = 100; // 상수
int number = 42; // 리터럴
기본 타입과 참조 타입
기본 타입은 정수(int), 실수(double), 문자(char), 불리언(boolean) 등 자바에서 제공하는 8가지 원시 자료형이다.
참조 타입은 객체, 배열 등과 같이 메모리 상의 주소를 저장하는 변수이다.
Call by Value? Call by Reference?
Call by Reference는 변수의 메모리 주소를 직접 전달하여, 메서드 내부에서 변수 자체를 변경할 수 있는 방식을 의미한다.
자바는 Call by Value 방식을 사용한다.
기본 타입은 변수에 저장된 값이 메서드 호출 시 복사되어 전달된다. 참조 타입은 객체 자체를 전달하지 않고, 객체를 가리키는 참조 값을 복사하여 전달한다. 따라서 객체의 내용은 메서드 내부에서 변경될 수 있지만, 참조 변수 자체는 원본에 영향을 주지 않는다.
자바가 Call by Value인 이유는 모든 매개변수가 값의 복사본으로 전달되기 때문이다. 참조 타입의 경우에도 참조 주소가 복사되므로 원본 객체의 내용은 변경될 수 있지만 참조 변수 자체는 메서드 호출의 영향을 받지 않는다.
void modify(int value) {
value += 10; // 기본 타입, 원본 변경 없음
}
void modifyList(List<Integer> list) {
list.add(10); // 참조 타입, 원본 변경 가능
}
Object 클래스
Object 클래스는 자바의 모든 클래스가 암묵적으로 상속받는 최상위 클래스이다. 주요 메서드는 다음과 같다.
- toString(): 객체의 문자열 표현 반환.
- equals(): 논리적 동등성 비교.
- hashCode(): 객체의 주소 값을 이용해서 해싱(hashing) 기법을 통해 만든 객체의 해시 코드를 반환.
- clone(): 객체 복제.
- finalize(): Garbage Collection 전에 호출.
왜 equals()와 hashCode()는 같이 재정의할까?
Collection(HashMap, HashSet, HashTable)은 객체가 논리적으로 같은지 비교할 때 위와 같은 과정을 거치는데, equals()만 재정의할 경우, 다른 객체로 판단할 수 있기 때문이다.
직렬화
직렬화(Serialization)는 객체를 바이트 스트림으로 변환하여 저장하거나 네트워크로 전송할 수 있게 하는 변환하는 과정이다. 이를 위해 Serializable 인터페이스를 구현해야 하며, 역직렬화(Deserialization)를 통해 객체를 복원할 수 있다.
참고 자료
'프로그래밍 언어 > Java' 카테고리의 다른 글
자바 스터디 1주차 (2) (1) | 2025.01.03 |
---|
댓글