Java
[JVM 밑바닥까지 파헤치기] 6-1. 클래스 파일 구조: 클래스 파일
noahkim_
2024. 12. 22. 13:48
저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 클래스 파일 (.class)
- 하나의 클래스 또는 인터페이스를 정의
- 바이트를 하나의 단위로 하는 이진 스트림 집합체 (빅 엔디언 방식)
- 하위 호환성을 유지하며 확장 중
2. 구조
항목 | 설명 |
매직 넘버 |
클래스 파일인지 확인하는 용도 (항상 0xCAFEBABE로 시작)
|
버전 번호 |
마이너/메이저 버전 (JDK 버전 기준 증가)
|
상수 풀 (Constant Pool) |
문자열, 숫자, 메서드/필드 참조 등 심벌 참조 + 리터럴 상수 저장소
|
접근 플래그 |
클래스/인터페이스의 접근 수준 (e.g., ACC_PUBLIC, ACC_FINAL)
|
클래스 인덱스 |
현재 클래스, 슈퍼클래스, 인터페이스 정의 (상수 풀 인덱스로 지정)
|
필드 테이블 |
클래스에 정의된 멤버 변수들의 정보 저장 (이름, 타입, 접근 플래그 등)
|
메서드 테이블 |
클래스에 정의된 메서드들에 대한 정보 저장
|
속성 테이블 |
각 필드/메서드/클래스의 속성 (e.g., Code, LineNumberTable) 저장
|
예시) 클래스 파일 구조
더보기
ClassFile {
u4 magic; // 매직 넘버 (0xCAFEBABE)
u2 minor_version; // 클래스 파일의 마이너 버전
u2 major_version; // 클래스 파일의 메이저 버전
u2 constant_pool_count; // 상수 풀 항목의 개수
cp_info constant_pool[constant_pool_count-1]; // 상수 풀 테이블
u2 access_flags; // 접근 플래그 (public, final 등)
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]; // 속성 테이블
}
예시) 필드/메서드 테이블 구조
더보기
struct {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
- access_flags: 접근자(public, static 등)
- name_index / descriptor_index: 상수 풀의 Utf8 인덱스
예시) 속성 테이블
더보기
struct {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length]; // 실제 속성 데이터
}
- 모든 속성의 이름은 상수 풀의 Utf8을 참조
- 종류: Code, SourceFile, ConstantValue, Exceptions 등 약 30개
- 속성마다 구조가 달라 (제약이 느슨함 → 확장성 있음)
상수 풀
- 3가지 유형이 존재함
구분 | 예시 | 설명 |
리터럴 | CONSTANT_Utf8_info, Integer, Float |
문자열, 숫자 값 등 고정 리터럴 값
|
참조 | Methodref, Fieldref, Class 등 |
클래스/메서드/필드 이름, 디스크립터, FQCN 등
|
동적 링크 | InvokeDynamic, MethodHandle 등 |
런타임 중 클래스 로딩/링크에 필요한 참조
|