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 등
런타임 중 클래스 로딩/링크에 필요한 참조