변수를 선언하고 처음으로 값을 저장하는 것.
지역변수는 사용하기 전에 반드시 초기화해야 한다.
선언 예 설명
int i=0; int j=0; int형 변수 i/j 선언 후 0으로 초기화 한다.
int i=0, j=0 같은 타입의 변수는 콤마(,)를 사용해서 함께 선언/초기화할 수 있다.
int i=0, long j=0 error. 타입이 다른 변수는 함께 선언/초기화 할 수 없다.
int i=0; int j=i 변수 i에 저장된 값으로 변수 j를 초기화한다.
int j=i; int i=0 error. 변수 i가 선언되기 전에 i를 사용할 수 없다.





명시적 초기화 Explicit initialization

변수를 선언과 동시에 초기화하는 것.
public class Hello{
    int a = 0;
    String str = "";
}

복잡한 초기화 작업이 필요할 때는 초기화 블럭 또는 생성자를 사용한다.




초기화 블럭 Initialization block


인스턴스 초기화 블럭

클래스 내에 블럭{ }을 만든다.
인스턴스를 생성할 때마다 생성자보다 먼저 수행된다.
모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는다.
public class Hello{
    int a = 0;

    { 
        a++;
    }
}

수행 순서: 기본값 - 명시적 초기화 - 인스턴스 초기화 블럭 - 생성자



클래스 초기화 블럭

클래스 내에 static이 붙은 블럭{ }을 만든다.
클래스가 메모리에 처음 로딩될 때 한번만 수행된다.
배열이나 예외 처리가 필요한 초기화에서 추가적으로 사용한다.
public class Hello{
    static int arr[] = new int[10];

    static { 
        for(int i=0; i<10; i++){
	    arr[i] = (int)(Math.random()*10);
	}
    }
}

수행 순서: 기본값 - 명시적 초기화 - 클래스 초기화 블럭



멤버변수의 초기화 시기와 순서

public class Hello{
    int iv = 1;
    static int cv = 1;

    static {  cv++;  }		
    {  iv++;  }

    Hello(){ iv++ }
}

•  클래스 초기화 블럭
  기본값 명시적 초기화 클래스 초기화 블럭
cv 0 1 2
•  인스턴스 초기화 블럭
  기본값 명시적 초기화 인스턴스 초기화 블럭 생성자
cv 2 2 2 2
iv 0 1 2 3




참고 서적: 자바의 정석 3판