클래스 파일
자바 소스코드가 실행이 되려면 자바 컴파일러(javac)를 통해 소스코드를 클래스파일로 변환해야 한다.
컴파일된 클래스파일은 어떤 구조로 되어있을까?
클래스 파일의 데이터 형식
8비트 바이트의 스트림으로 구성된다.
16비트 및 32비트의 데이터는 각각 2개, 4개의 연속된 8비트를 읽어서 구성된다.
멀티바이트의 경우 항상 big endian 순서로 저장된다.
u1 → unsigned 1byte
u2 → unsigned 2byte
u4 → unsigned 4byte
클래스 파일 구조
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
매직넘버
모든 클래스 파일은 0xCAFEBABE라는 매직넘버로 시작한다.
보통 매직넘버는 파일 종류를 식별하는 용도로 사용된다.
클래스 파일 포맷 버전
클래 스 파일 버전 값은 클래스로더의 호환성 보장을 위해 꼭 필요한 값이다.
- Java 17 버전으로 빌드한다면 class version 61 ex) 00 00 00 3D
호환되지 않는 버전의 클래스 파일을 로딩하려고 하는 경우 런타임에 UnsupportedClassVersionError
예외가 발생한다.
class file format major versions
Java SE | Released | Major | Supported majors |
---|---|---|---|
8 | March 2014 | 52 | 45 .. 52 |
9 | September 2017 | 53 | 45 .. 53 |
10 | March 2018 | 54 | 45 .. 54 |
11 | September 2018 | 55 | 45 .. 55 |
12 | March 2019 | 56 | 45 .. 56 |
13 | September 2019 | 57 | 45 .. 57 |
14 | March 2020 | 58 | 45 .. 58 |
15 | September 2020 | 59 | 45 .. 59 |
16 | March 2021 | 60 | 45 .. 60 |
17 | September 2021 | 61 | 45 .. 61 |
상수 풀
2바이트의 상수의 개수값이 먼저오고 그 뒤로 코드에 등장하는 상수값이 모여있다.
클래스명, 상수명, 상수 값, 필드명, 메서드명과 같은 값들이 존재한다.
JVM은 코드 실행 시 런타임에 배치된 메모리가 아니라, 해당 상수 풀 테이블을 찾아보고 필요한 값을 참조한다.