← 질문 목록
#379깊이 0

클래스 내 정적 변수와 정적 블록의 초기화 순서는 무엇으로 결정되는가?

언어 · 런타임

소스 코드에 선언된 순서대로 결정된다. 컴파일러가 위에서 아래로 코드를 읽으며 정적 초기화 식과 정적 블록을 하나의 클래스 초기화 메소드로 합치기 때문이다.

  1. 바이트코드 로드클래스가 JVM에 처음 로딩된다

  2. 상단 정적 멤버코드 위쪽에 선언된 변수나 블록이 먼저 실행된다

  3. 하단 정적 멤버코드 아래쪽에 선언된 변수나 블록이 이어서 실행된다

클래스가 처음 참조될 때 JVM은 클래스 로더로 바이트코드를 읽는다. 로딩이 끝나면 링크 과정을 거쳐 초기화 단계인 클래스 초기화 메소드를 호출한다. 이 메소드 내부에는 클래스 영역에 정의한 정적 변수 대입 식과 정적 블록 코드가 선언 순서대로 들어있다.

부모 클래스가 있다면 부모 클래스의 정적 초기화가 자식 클래스보다 먼저 일어난다. 자식 클래스를 메모리에 올리려면 부모 클래스 정보가 먼저 필요하기 때문이다. 정적 초기화는 클래스가 로딩되는 시점에 단 한 번만 실행된다.

정적 멤버 사이의 의존 관계가 선언 순서와 맞지 않으면 컴파일 에러가 나거나 의도하지 않은 기본값이 들어간다. 아직 초기화하지 않은 아래쪽 변수를 위쪽 정적 블록에서 참조하면 전방 참조 오류가 생긴다.

추천 꼬리질문

0/300

적은 내용은 AI 학습에 쓰일 수 있습니다. 이름이나 연락처는 넣지 말아 주세요.

관련 질문

클래스 내 정적 변수와 정적 블록의 초기화 순서는 무엇으로 결정되는가?