1. 멤버변수의 초기화 시기와 순서
클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번 초기화 된다.
인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이루어진다.
클래스변수의 초기화 순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭
인스턴스변수의 초기화 순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자
2. 멤버변수 초기화 순서 예시
class InitTest {
// 명시적 초기화
static int cv = 1;
int iv = 1;
static { cv = 2; } // 클래스 초기화 블럭
{ iv = 2; } // 인스턴스 초기화 블럭
// 생성자
InitTest() {
iv = 3;
}
}
클래스변수 초기화(1 ~ 3) : 클래스가 처음 메모리에 로딩될 때 차례대로 수행
인스턴스변수 초기화(4 ~ 7) : 인스턴스를 생성할 때 차례대로 수행
* 클래스변수는 항상 인스턴스변수보다 먼저 생성되고 초기화 된다.
- cv가 메모리(method area)에 생성되고, cv에는 int형의 기본값인 0이 저장된다.
- 명시적 초기화에 의해 cv에 1이 저장된다.
- 클래스 초기화 블럭이 수행되어 cv에는 2가 저장된다.
- InitTest 클래스의 인스턴스가 생성되면서 iv가 메모리(heap)에 생성되며, 기본값 0이 저장된다.
- 명시적 초기화에 의해 iv에 1이 저장된다.
- 인스턴스 초기화 블럭에 의해 iv에 2가 저장된다.
- 생성자가 수행되어 iv에는 3이 저장된다.
참고문헌 : 남궁성(2016), Java의 정석, 도우출판