전공/객체지향프로그래밍

[객체지향프로그래밍][Java] Initialization (정적 초기화 블록, 인스턴스 초기화 블록)

Campus Coder 2023. 6. 7. 15:22
728x90
반응형

정적 초기화 블록

static {
    // 정적 멤버 변수 초기화 코드
}

 

  • 실행 타이밍: 정적 초기화 블록은 클래스가 로드될 때 한 번만 실행(해당 클래스의 첫 번째 인스턴스를 생성하기 전)
  • 실행 순서: 클래스 내에 정의된 순서대로 정적 초기화 블록이 실행
  • 예외 처리: 정적 초기화 블록 내에서 발생하는 예외는 명시적으로 처리해야 함
  • 멤버 변수 초기화: 정적 초기화 블록은 주로 정적(static) 멤버 변수를 초기화하는 데 사용, 이 블록 내에서 정적 멤버 변수에 값을 할당할 수 있으며, 복잡한 초기화 로직이 필요한 경우에 유용하게 사용됨

 

예시 1

public class Main {
    public static void main(String[] args) {
        System.out.println("Cls.field1: " + Cls.field1);
        System.out.println("Cls.field2: " + Cls.field2);
    }
}

class Cls {
    static {
        field1 = "field1 In the static initialization block";
        // System.out.println(field1); // 컴파일 에러
        field2 = "field2 In the static initialization block";
        // System.out.println(field2); // 컴파일 에러
    }
    static String field1 = "field1 In the declaration";
    static String field2;
}
Cls.field1: field1 In the declaration
Cls.field2: field2 In the static initialization block

 

예시 2

class Cls1 {
    static int[] arr;
    static {
        int size = 100;
        arr = new int[size];
        for (int i = 0; i < size; i++)
            arr[i] = i;
    }
}

class Cls2 {
    static {
        int size = 100;
        arr = new int[size];
        for (int i = 0; i < size; i++)
            arr[i] = i; // 컴파일 에러
    }
    static int[] arr;
}

 

 

인스턴스 초기화 블록

{
    // 인스턴스 멤버 변수 초기화 코드
}
  • 실행 타이밍: 인스턴스 초기화 블록은 해당 클래스의 인스턴스가 생성될 때마다 실행(인스턴스가 생성되는 순간에 실행)
  • 실행 순서: 인스턴스 초기화 블록은 생성자(Constructor)보다 먼저 실행
  • 예외 처리: 인스턴스 초기화 블록 내에서 발생하는 예외를 명시적으로 처리해야 함
  • 멤버 변수 초기화: 인스턴스 초기화 블록은 주로 인스턴스 멤버 변수를 초기화하는 데 사용, 이 블록 내에서 인스턴스 멤버 변수에 값을 할당할 수 있으며, 복잡한 초기화 로직이 필요한 경우에 유용하게 사용됨

 

예시 1

class Product {
    static int count = 0;
    Integer domesticSerialNo = 10;

    {
        ++count;
        domesticSerialNo = count;
    }
    
    {
        internationalSerialNo = domesticSerialNo + 10000;
        // System.out.println(internationalSerialNo); // compile-error
    }
    
    Integer internationalSerialNo = 20;
    public Product() {}
}

 

예시 2

public class Main {
    public static void main(String[] args) {
        new Product();
    }
}

class Product {
    static int count = 0;
    Integer domesticSerialNo = 10;

    {
        ++count;
        domesticSerialNo = count;
    }
    Integer internationalSerialNo = 20;

    {
        internationalSerialNo = domesticSerialNo + 10000;
        System.out.println(internationalSerialNo);
    }
    
    static {
        count = 10;
    }
    public Product() {
        System.out.println(domesticSerialNo);
    }
}
10011
11
728x90
반응형