JAVA
자바의 컴파일: 바이트코드와 JVM
HipPopoTamUs
2024. 7. 18. 01:05
.java 파일과 .class 파일의 관계
자바 개발자는 소스 코드를 .java 파일에 작성한다. 이 파일을 자바 컴파일러(javac)를 사용하여 컴파일하면, 바이트코드로 이루어진 .class 파일이 생성된다.
- .java 파일: 사람이 읽을 수 있는 자바 소스 코드
- .class 파일: JVM이 이해할 수 있는 바이트코드. .java 파일에서 우리가 작성한 클래스마다 개별적인 바이트코드로 컴파일되어 각각의 .class 파일로 만들어진다. 예를 들어, 하나의 .java 파일에 두 개의 클래스가 정의되어 있으면, 컴파일 시 두 개의 .class 파일이 생성된다. 내부 클래스의 경우에도 별도의 .class 파일이 생성된다.
바이트 코드
바이트코드는 자바 컴파일러가 자바 소스 코드(.java 파일)를 컴파일하여 생성하는 중간 코드 형태이다. 바이트코드는 JVM이 이해하고 실행할 수 있는 명령어 집합으로, 플랫폼 독립적이다. 즉, 바이트코드는 특정 운영체제나 하드웨어에 종속되지 않으며, JVM이 설치된 모든 환경에서 동일하게 실행될 수 있다.
Compile Once, Run Anywhere
"한 번 컴파일하면, 어디서나 실행할 수 있다". 이는 자바의 핵심 철학 중 하나이다.
바이트코드는 JVM에서 실행되기 때문에, JVM이 설치되어 있는 어떤 운영체제에서도 실행이 가능하다. 따라서 자바는 플랫폼 독립적인 프로그래밍 언어이다.
JIT 컴파일러
JIT 컴파일러는 JVM의 일부로, 런타임 시점에 자주 실행되는 코드(핫스팟)를 네이티브 기계어로 변환하여 성능을 최적화한다. JIT 컴파일러는 변환된 네이티브 코드를 캐시하여 이후 실행 시 빠르게 실행될 수 있도록 한다. 이를 통해 자바 애플리케이션의 실행 성능이 크게 향상된다.
클래스 로더
클래스 로더는 .class 파일을 읽어들여 JVM의 메모리에 로드하는 JVM의 구성 요소이다. 이를 통해 자바 애플리케이션이 실행 중에 필요한 클래스를 동적으로 로드하고 사용할 수 있게 된다. 클래스 로더는 세 가지 주요 종류가 있다:
- Bootstrap Class Loader: 가장 기본적인 클래스 로더로, JRE의 핵심 클래스를 로드한다.
- Extension Class Loader: JRE의 확장 클래스들을 로드한다.
- Application Class Loader: 애플리케이션의 클래스패스에 있는 클래스를 로드한다.