class InitTest{
int x; //인스턴스 변수
int y = x; //인스턴스 변수
void method()
{
int i; //지역변수
int j = i; //에러, 지역변수를 초기화하지 않고 사용
}
}
멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.
변수 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
class Car{
int door = 4; //기본형(primitive type) 변수의 초기화
Engine e = new Engine(); //참조형(reference type) 변수의 초기화
}
복잡한 초기화 작업이 필요할 경우 '초기화 블럭(initialization block)' 또는 생성자를 사용해야 한다.
클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용된다.
class InitBlock{
static { /* 클래스 초기화블럭 입니다. */}
{/* 인스턴스 초기화 블럭 입니다. */}
}
인스턴스 변수의 초기화는 주로 생성자를 사용
인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용
Car(){
count++;
serialNo = count;
color = "White";
gearType = "Auto";
}
Car(String color, String gearType){
count++; //같은 코드 중복
serialNo = count; //같은 코드 중복
this.color = color;
this.gearType = gearType;
}
{ //인스턴스 초기화 블럭
count++;
serialNo = count;
}
Car(){
color = "White";
gearType = "Auto";
}
Car(String color, String gearType){
this.color = color;
this.gearType = gearType;
}
예제)
class BlockTest{
static{ //클래스 초기화 블럭
System.out.println("static { }");
}
{ //인스턴스 초기화 블럭
System.out.println( "{}");
}
public BlockTest()
{
System.out.println("생성자");
}
public static void main(String args[])
{
System.out.println("BlockTest bt = new BlockTest(); ");
BlockTest bt = new BlockTest();
System.out.println("BlockTest bt2 = new BlockTest();");
BlockTest bt2 = new BlockTest();
}
}
실행결과
static{}
BlocktTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자
BlockTest가 메모리에 로딩될 때,
클래스 초기화 블럭은 처음 메모리에 로딩될 때 한번만 수행되었지만, 인스턴스 초기화 블럭은 인스턴스가 생서오딜 때 마다 수행되었다.
- 클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다.
- 인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때 마다 각 인스턴스별로 초기화가 이루어진다.
- 클래스변수의 초기화 순서: 기본값 - 명시적초기화 - 클래스 초기화 블럭
- 인스턴스변수의 초기화 순서: 기본값 - 명시적초기화 - 인스턴스 초기화 블럭 - 생성자