변수의 초기화
변수 선언 이후에 처음 값을 저장하는 것을 변수의 초기화라고 한다. 멤버변수의 경우에는 초기화를 하지 않아도 자동으로 변수의 자료형에 맞는 기본값으로 초기화 되지만 지역변수(메서드의 변수)의 경우에는 사용 전에 반드시 초기화를 해야한다.
멤버변수의 초기화 방법에는 명시적 초기화, 생성자을 사용한 초기화, 초기화 블럭을 사용하는 등의 방법이 있다.
명시적 초기화
변수를 선언함과 동시에 초기화하는 것을 명시적 초기화라고 한다. 가장 기본적인 방식의 초기화로 형태는 아래와 같다.
int door = 5; - 기본형 변수의 초기화
A a = new A(); - 참조형 변수의 초기화
명시적 초기화는 간단하지만 복잡한 초기화가 필요한 경우에는 생성자를 통하거나, 초기화 블록을 사용한다.
초기화 블럭
1. 인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용
- 인스턴스 초기화 블럭은 단순히 클래스 내에 블럭 {}을 만들고 그 안에 코드를 작성하기만 하면 된다.
- 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
- 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다.
- 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용된다.(중복제거)
2. 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용
- 클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 단순히 static를 덧붙이기만 하면 된다.
- 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩 될 때 한번만 수행된다.
초기화 블럭 내에서는 메서드 내에서와 같이 조건, 반복, 예외처리 구문 등을 자유롭게 사용 가능하다.
class InitBlock{
static{ 클래스 초기화 블럭의 내용}
{인스턴스 초기화 블럭}
}
형태는 위와 같다.
위와 같이 배열이 필요한 경우 명시적 초기화 만으로는 복잡한 초기화가 어렵기 때문에 클래스 초기화 블럭을 통해서 복잡한 초기화 작업을 실행할 수 있다.
멤버변수의 초기화 시기와 순서
클래스 변수
- 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화
- 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
- 항상 인스턴스 변수보다 먼저 생성되고, 초기화
인스턴스 변수
- 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
- 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자
위 클래스는 클래스 변수와 인스턴스 변수를 각각 1개씩 가지고 있으며, 초기화 순서는 아래와 같다.
1. 메모리에 cv가 생성되고, cv에는 int 형의 기본 값인 0이 저장
2. 명시적 초기화에 의해 cv에는 1의 값이 저장
3. 클래스 초기화에 의해 cv에는 2의 값이 저장
4. InitTest의 인스턴스가 생성되면서 iv가 메모리에 존재하게 되고, int 형의 기본 값인 0 저장
5. 명시적 초기화에 의해 iv에 1 저장
6. 인스턴스 초기화 블럭에 의해 iv에 2 저장
7. 마지막으로 생성자 수행되면서 iv에 3 저장