1 minute read

아래의 코드와 같이 static { } 혹은 { } 블록을 종종 볼 수 있다.
이러한 블록들은 초기화 블럭(initialization block)이라고 하고 클래스 초기화 블럭, 인스턴스 초기화 블럭으로 나뉜다.
class BlockTest{
    static {                // 클래스 초기화 블럭
        System.out.println("static { }");
    }

    {                       // 인스턴스 초기화 블럭
        System.out.println("{ }");
    }

    public BlockTest(){
        System.out.println("생성자");
    }

    public static void main(String args[]){
        System.out.println("BlockTest bt = new BlockTest(); ");
        BlockTest bt = new BlockTest();

        System.out.println("BlockTset bt2 = new BlockTest();");
        BlockTest b2 = new BlockTest();
    }
}

클래스 초기화 블록

class BlockTest {
    public static Map<String, String> classMap;
    
    // 클래스 초기화 블럭
    static  {
        map = new HashMap<>();
        map.put("foo","bar");
    }

    public static void main(String[] args) {
        Test.map.keySet().forEach(System.out::println); // foo
    }
}
클래스 초기화 블록은 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 복잡한 초기화에 사용되고
클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행된다.

인스턴스 초기화 블록

class BlockTest {
    public String name;
    
    {
        name = "hongjae";
    }   

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.name); // hongjae
    }
}
인스턴스 초기화 블록은 인스턴스 변수의 복잡한 초기화에 사용되고 인스턴스가 생성될 때 마다 "생성자보다 먼저" 수행된다.
인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에, 인스턴스 초기화 블럭은 잘 사용되지 않는데 
대신 생성자 오버로딩으로 인해 여러 생성자에서 공통적으로 수행되어져야 하는 코드가 있는 경우
생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어 두면 코드의 중복을 줄일 수 있어서 좋다.
class BlockTest {
    private String name;
    
    public BlockTest() {
        System.out.println("BlockTest 인스턴스 생성");
    }
    
    public BlockTest(String name) {
        System.out.println("BlockTest 인스턴스 생성");
        this.name = name;
    }
}
위와 같이 생성자마다 중복되는 System.out.println("BlockTest 인스턴스 생성"); 코드를 인스턴스 블록을 사용하여
class BlockTest {
    private String name;
    
    {
        System.out.println("BlockTest 인스턴스 생성");
    }   
    
    public BlockTest() {
        
    }
    
    public BlockTest(String name) {
        this.name = name;
    }
}
위의 코드처럼 중복을 제거할 수 있다.

초기화 순서

1. 클래스 변수 : 기본값(0 or null 등등) → 명시적 초기화 → 클래스 초기화 블록
2. 인스턴스 변수 : 기본값(0 or null 등등) → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
class BlockTest{
    public static String name = "hongjae"; // 명시적 초기화
    public int age = 10; // 명시적 초기화

    static {  // 클래스 초기화 블럭
        System.out.println(name);
        name = "jaehong";
        System.out.println(name);
        
    }

    {        // 인스턴스 초기화 블럭
        System.out.println(age);
        age = 100;
        System.out.println(age);
    }

    public BlockTest(){ // 생성자 초기화
        age = 1000;
        System.out.println(age);
    }

    public static void main(String args[]){
        BlockTest blockTest = new BlockTest();
    }
}
출력 결과
// hongjae
// jaehong
// 10
// 100
// 1000

Categories:

Updated:

Comments