본 내용은 자바의 정석 3rd Edition을 참고하여 작성되었습니다. 개인적으로 학습한 내용을 복습하기 목적이기 때문에 내용상 오류가 있을 수 있습니다.
1. 변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 변수 초기화 라고 한다. 변수의 초기화는 경우에 따라 필수적일수도 선택적일수도 있지만 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 바람직하다. 멤버변수는 초기화를 하지 않아도 변수의 타입에 맞는 기본값으로 초기화가 이루어지지만 지역변수는 사용하기 전에 반드시 초기화가 이루어져야 한다.
각 타입의 기본값(default value)
자료형 | 기본값 |
---|---|
boolean | false |
char | '\u0000' |
byte , short , int | 0 |
long | 0 |
float | 0.0f |
double | 0.0d or 0.0 |
renference value | null |
멤버변수를 초기화하는 방법은 다음과 같다.
- 명시적 초기화(explicit initialization)
- 생성자(constructor)
- 초기화 블럭(initialization block)
- 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화하는데 사용
- 클래스 초기화 블럭 : 클래스를 초기화하는데 사용
2. 명시적 초기화
변수 선언과 동시에 초기화 하는 것을 명시적 초기화(explicit initialization), 변수의 초기화라고 한다. 가장 기본적이면서도 간단한 초기화 방법이므로 여러 초기화 방법 중에서도 가장 우선적으로 고려되어야 한다.
3. 초기화 블럭
초기화 블럭의 종류에 따라 정리하면 다음과 같다.
-
클래스 초기화 블럭
- 클래스를 초기화하는데 사용한다.
- 클래스가 처음 메모리에 로딩될 때 한번만 수행된다.
-
인스턴스 초기화 블럭
- 인스턴스 변수를 초기화하는데 사용한다.
- 생성자와 같이 인스턴스가 생성될 때 수행된다.
- 인스턴스 초기화 블럭이 생성자보다 먼저 수행된다.
초기화 블럭 내에는 메서드 내에서와 같이 조건문, 반복문, 예외처리구문 등을 자유롭게 사용할 수 있으므로, 초기화 작업이 복잡하여 명시적 초기화만으로는 부족한 경우 초기화 블럭을 사용한다.
인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행되야 하는 코드를 넣는데 사용 한다. 아래와 같이 모든 생성자에서 공통으로 수행되어야 하는 문장들이 있을 때, 이 문장들을 각 생성자마다 써주기보다는 인스턴스 블럭에 넣어줌으로써 코드가 보다 간결하게 작성할 수 있다.
초기화 블럭 예제 1 : 초기화 순서
예제를 통해 초기화 순서가 어떻게 진행되는지 보자.
콘솔화면에서와 같이 클래스 초기화 블럭, 인스턴스 블럭, 생성자 순으로 초기화가 진행된다. 초기화 블럭의 경우 메모리에 로딩될 때 한번만 초기화가 이루어지고, 인스턴스 블럭과 생성자는 인스턴스가 생성될 때마다 초기화가 수행된다.
초기화 블럭 예제 2 : static
초기화 블럭(클래스 초기화 블럭)
위의 예제에서는 명시적 초기화를 통해 배열 arr
을 생성하고, 클래스 초기화 블럭을 이용해서 배열의 각 요소들을 random()
을 사용해 임의의 값을 채우도록 했다. 이처럼 배열이나 예외처리가 필요한 초기화에는 명시적 초기화만으로는 복잡한 초기화 작업을 할 수 없기 때문에 클래스 초기화 작업을 사용하도록 하는 것이 좋다.
4. 멤버변수의 초기화 시기와 순서
클래스 변수
- 초기화 시점 : 클래스가 처음 로딩될 때 딱 한번
- 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
인스턴스 변수
- 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
- 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자