변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.
"멤버변수(클래스변수와 인스턴수변수)와 배열의 초기화는 선택적이지만,
지역변수의 초기화는 필수적이다."
→ 인스턴스 초기화 블럭 : 인스턴스변수를 초기화 하는데 사용.
→ 클래스 초기화 블럭 : 클래스변수를 초기화 하는데 사용.
변수를 선언과 동시에 초기화 하는것을 명시적 초기화라고 한다.
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
//...
}
클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되며,
인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
class InitBlock {
static { /* 클래스 초기화 블럭 */ }
{ /* 인스턴스 초기화블럭 입니다. */ }
//....
}
//인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용한다.
class InitTest {
static int cv = 1; //명시적 초기화
int iv = 1; //명시적 초기화
static { cv = 2; } // 클래스 초기화 블럭
{ int iv = 2; } // 인스턴스 초기화 블럭
InitTest() { // 생성자
iv = 3;
}
}
→ 클래스변수 초기화(1~3) : 클래스가 처음 메모리에 로딩될 때 차례대로 수행됨.
→ 인스턴스변수 초기화(4~7) : 인스턴스를 생성할 때 차례대로 수행됨
cv가 메모리(method area)에 생성되고, cv에는 int형의 기본값인 0이 cv에 저장된다.
그 다음에는 명시적 초기화(int cv = 1)에 의해서 cv에 1이 저장된다.
마지막으로 클래스 초기화 블럭(cv = 2)이 수행되어 cv에는 2가 저장된다.
InitTest클래스의 인스턴스가 생성되면서 iv가 메모리(heap)에 존재하게 된다.
iv 역시 int형 변수이므로 기본값 0이 저장된다.
명시적 초기화에 의해서 iv에 1이 저장되고
인스턴스 초기화 블럭이 수행되어 iv에 2가 저장된다.
마지막으로 생성자가 수행되어 iv에는 3이 저장된다.