반응형

java -- initialization block ( 초기화 블록 )


참고 : https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

          http://stackoverflow.com/questions/12550135/static-block-vs-initializer-block-in-java

         http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

        https://www.youtube.com/playlist?list=PLmCsXDGbJHdhaAC8UP3kbG1ZQM1duQGDN  ==> 동영상



** 위의 Youtube 동영상 강좌 먼저 보기 !!!!



멤버변수 ( field ) 초기화의 예 


    private int a = 3



그러나 이경우에는 초기화시에 에러 핸들링이나, for loop 를 이용한 배열 초기화 같은 복잡한 것은 못한다. 


==> 해결책 : 

 1) 인스턴스 변수의 경우 ( 3가지 방법 )

    - 생성자에서 복잡한 초기화 가능 

    - 또는 initializer block 사용.

    - 또는 final method 사용.


2) 클래스 변수의 경우

  - static initialization block 사용



** 인스턴스 초기화 블럭 ( instance initializer block )

  - 객체 생성할때마다 호출됨.

  - super 생성자 이후에 실행됨.

  - 생성자 보다 먼저 실행됨.

  - 모든 생성자의 공통 코드를 instance initializer block 에 넣으면 코드 줄일수 있다.



** 클래스 초기화 블럭 ( static initializer block )

  - class 로딩시에 호출된다.

  - 인스턴스 변수나 인스턴스 메소드에 접근 못함. 



<< 예제 >>



public class InitializationBlockTest {
public static void main(String[] args) {
MyInitBlock.b = 33; // static initializer block 호출됨.
System.out.println("-------------- instance 생성 전 ------------------");
MyInitBlock block = new MyInitBlock();
System.out.println("-------------------------------------------------");
new MyInitBlock();
System.out.println("---------------- instance 생성 후 -----------------");
}
}
class MyInitBlock extends MySuper {
private int a;
public int[] arr = new int[5];
public static int b;
// instance initializer block (인스턴스 초기화 블럭)
{
System.out.println(" +++++ initializer block 실행 +++++ " );
a = 11;
// b = 22;
for(int i=0; i<5 ; i++){
arr[i] = i*3;
}
System.out.println("인스턴스변수 a = " + a);
System.out.println("인스턴스변수 arr 길이 = " + arr.length);
System.out.println("클래스변수 b = " + b);
}
// static initializer block (클래스 초기화 블럭)
static {
// a = 1; // error
b = 2;
System.out.println(" **** static initialization block 실행 ***** " );
}
MyInitBlock(){
super();
System.out.println(" .. >>>> constructor <<<<..");
}
}
class MySuper {
MySuper(){
System.out.println(" .. >>>> super constructor <<<<..");
}
}



-- 실행 결과





<< 아래와 같이 코드를 변경한 경우에는 >>




--- 실행 결과





반응형
Posted by 자유프로그램
,