Backend/Java

Java가 컴파일 되는 과정에 대하여

chillmyh 2024. 2. 20. 21:33

Java 컴파일 과정

자바의 컴파일 과정은 크게 다섯 단계로 나눌 수 있습니다.

개발자가 작성한 소스코드(.java)부터 시작하여, 실행 가능한 애플리케이션으로 변환될 때까지의 과정을 함께 살펴보겠습니다.

 

1. 자바 소스코드 작성

모든 것은 개발자가 자바 소스코드(.java 파일)를 작성하는 것으로 시작됩니다.

이 코드는 애플리케이션의 로직을 정의하며, 자바의 문법에 따라 구성됩니다.

 

2. 자바 컴파일러(Java Compiler)에 의한 컴파일

작성된 소스코드는 자바 컴파일러(javac)에 의해 컴파일됩니다. 컴파일 과정에서 소스코드는 자바 바이트코드(.class 파일)로 변환됩니다.

이 바이트코드는 JVM이 이해할 수 있는 중간 형태로, 아직 기계가 직접 실행할 수는 없습니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.

 

3. 클래스 로더(Class Loader)에 의한 동적 로딩

컴파일된 바이트코드는 JVM의 클래스 로더에 의해 동적으로 로딩됩니다. 클래스 로더는 다음과 같은 세부 과정을 거칩니다.

 

- 로드 : 필요한 클래스 파일들을 JVM의 메모리로 로드합니다.

- 검증 : 로드된 클래스 파일이 JVM 명세와 자바 언어 명세를 준수하는지 검증합니다.

- 준비 : 클래스가 사용할 메모리를 할당하고, 필드와 메서드의 기본 구조를 준비합니다.

- 분석 : 클래스 파일 내의 모든 심볼릭 레퍼런스를 실제 메모리 주소가 참조할 수 있는 직접 레퍼런스로 변환합니다.

- 초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. 이 과정에서 static 초기화 블록이 실행될 수 있습니다.

 

4. 실행엔진(Execution Engine)에 의한 실행

클래스 로더에 의해 메모리에 올려진 바이트코드는 실행 엔진에 의해 실행됩니다. 실행 엔진은 다음 두 가지 방식을 사용합니다.

 

- 인터프리터 : 바이트코드를 한 줄씩 읽어서 실행합니다. 각 명령어가 실행될 때마다 해석이 필요하기 때문에, 전체 실행 속도는 비교적 느립니다.

- JIT 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 방식인 JIT 컴파일러는, 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.