자바(Java)의 컴파일 과정은 크게 4단계로 진행됩니다.
먼저 짚고 넘어가야할 것은, 자바는 JVM을 통해 OS에 독립적인 특징을 갖고 있다는 것입니다. 이는 즉 자바 코드가 컴파일되면 바로 CPU에서 읽히는 기계어로 변환되는 것이 아닌, 중간 역할을 하는 JVM을 거쳐야한다는 뜻이기도 합니다.
1. 개발자의 자바 소스 코드 작성 (.java 파일)
자바 프로그램은 .java 확장자를 가진 소스 코드 파일로 작성됩니다.
흔히 우리가 작성하는 자바 코드를 의미합니다.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
2. 자바 컴파일러(Java Compiler, javac) - 바이트코드 변환 (.class 파일)
자바 컴파일러(javac)는 .java 소스 파일을 바이트코드(Bytecode)로 변환합니다.
바이트코드는 .class 확장자를 가지며, CPU가 직접 실행할 수 있는 기계어가 아니라 JVM(Java Virtual Machine)이 이해할 수 있는 중간 코드입니다.
특징
- 특정 운영체제(OS)나 하드웨어(CPU)에 종속되지 않음
- JVM이 해석할 수 있도록 최적화된 형태
- 사람이 읽기 어려운 이진 데이터 형식
javac HelloWorld.java
3. JVM(Java Virtual Machine) - 바이트코드 실행
JVM은 .class 바이트코드를 실행하는 역할을 합니다.
먼저 바이트 코드는 JVM의 클래스 로더에 전달됩니다.
JVM의 주요 역할
- 클래스 로더(Class Loader)
- 컴파일된 클래스 파일을 JVM의 메모리 영역 중 Runtime Data Areas에 필요한 파일을 올려주는 역할을 담당
- 필요한 클래스(라이브러리)들을 동적으로 클래스 로딩(모든 클래스를 일괄적으로 올리는 것이 아님->메모리 효율화)
- 동적 클래스 로딩이란, JVM에서 실행에 필요한 모든 클래스 파일을 메모리에 올려놓지 않고, 필요한 시점에 동적으로 메모리에 올리는 기술을 의미
- 인터프리터가 개발자가 작성한 코드를 한 줄씩 읽다가, 메모리에 올라와있지 않는 클래스를 읽어야 할 때면 클래스 로더에게 해당 클래스를 메모리에 올려줄 것을 요청
- 따라서 클래스 로더는 자신의 클래스 패스를 뒤져 해당 클래스를 찾아 메서드 영역에 업로드. 이런 동작 과정을 클래스 동적 로딩이라 정의
- 클래스 로더에서 class 파일을 로딩하는 순서는 아래 3단계로 구성
- Loading(로딩) : 클래스 파일(.class)을 가져와서 JVM 메모리에 업로드.
- 이후 바이트코드를 분석해서 클래스 메타데이터를 Method Area에 저장
- 클래스명,부모 클래스 정보, 메서드 정보, 필드 정보 등
- 이후 바이트코드를 분석해서 클래스 메타데이터를 Method Area에 저장
- Linking(링킹) : 클래스 파일 사용을 위한 검증
- 1) Verification(검증) : .class파일이 올바른 형식인지 검증. 보안검사
- 2) Preparation(준비) : static 변수들의 메모리 할당 및 기본값 설정
- 3) Resolution(해결) : 참조된 다른 클래스 등 실제 메모리 주소 연결
- Initialization(초기화) : 클래스 변수들을 적정 값으로 초기화
- static 변수들의 실제값으로 초기화
- Loading(로딩) : 클래스 파일(.class)을 가져와서 JVM 메모리에 업로드.
- 실행 엔진(Execution Engine)
- 바이트코드를 기계어로 변환 후 실행
- 실행 방식: 인터프리터(Interpreter) + JIT(Just-In-Time) 컴파일러
- 인터프리터: 한 줄씩 번역하여 실행 (빠른 시작)
- JIT 컴파일러: 반복 실행되는 코드(핫스팟)를 미리 최적화하여 변환 (성능 향상)
JVM의 실행 엔진에는 JIT(Just-In-Time) 컴파일러가 포함되어 있습니다.
JIT 컴파일러는 실행 중에 반복적으로 사용되는 코드(핫스팟, Hotspot)를 기계어로 변환하여 캐싱합니다.
- 초기에 인터프리터 방식으로 실행되지만, 실행 속도를 향상시키기 위해 자주 실행되는 코드를 미리 기계어로 변환
- 이를 통해 실행 성능 개선
4. 실행 환경(운영체제 + JVM)
JVM이 기계어로 변환한 코드를 운영체제(OS)에서 실행합니다.
즉, 자바 프로그램은 운영체제(OS)에서 직접 실행되는 것이 아니라, JVM을 통해 실행됩니다.
이 덕분에 운영체제와 독립적인 실행 환경이 가능하여, Windows, Mac, Linux 등 어디서든 동일한 코드가 실행될 수 있습니다.
'Development > Java' 카테고리의 다른 글
JVM 밑바닥까지 파헤치기 (8) | 2025.03.21 |
---|---|
자바는 왜 객체지향 언어인가요? (4) | 2025.03.15 |
객체지향 설계원칙 : SOLID 란? (3) | 2024.02.27 |
객체 지향 프로그래밍이란?? 객체 지향의 4가지 특징 Feat.캡상추다 (2) | 2024.02.26 |
boolean 바인딩 에러.. boolean과 Boolean의 차이 (2) | 2024.02.02 |