*이 포스트는 남궁성님의 '자바의 정석'책을 참고하여 작성했습니다.
* 클래스 초기화 블록 - 클래스 변수의 복잡한 초기화에 사용된다.
* 인스턴스 초기화 블록 - 인스턴스 변수의 복잡한 초기화에 사용된다.
* 초기화 블록 예제
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 StaticBlockTest {
static int[] arr = new int[10];
static { //클래스 초기화 블럭
for(int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 10) + 1;
}
}
public static void main(String[] args) {
for(int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
}
-> 명시적 초기화를 통해 배열 arr을 생성하고, 클래스 초기화 블럭을 이용해서 배열의 각 요소들을 random()을 사용해서 임의의 값으로 채웠다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java(오버로딩(oveloading) VS 오버라이딩(overriding)) (0) | 2017.08.17 |
---|---|
Java(오버라이딩(overriding)) (0) | 2017.08.17 |
Java(인스턴스,this,this()) (0) | 2017.08.04 |
Java(클래스(static) 메서드와 인스턴스 메서드) (0) | 2017.08.03 |
Java(변수 정리) (0) | 2017.07.31 |