프로그래밍 언어/Java

Java(초기화 블록)

benjykim 2017. 8. 4. 21:06
반응형

*이 포스트는 남궁성님의 '자바의 정석'책을 참고하여 작성했습니다.


* 클래스 초기화 블록 - 클래스 변수의 복잡한 초기화에 사용된다.


* 인스턴스 초기화 블록 - 인스턴스 변수의 복잡한 초기화에 사용된다.




* 초기화 블록 예제


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()을 사용해서 임의의 값으로 채웠다.

반응형