이론 정리/java

java 초기화

철매존 2023. 1. 22. 01:43
728x90

Initialization

변수의 초기화

변수를 처음 선언하고 초기화 하는 것이다.
선언하자마자 자신이 사용하고 싶은 값으로 초기화 해주는것이 좋다.

명시적 초기화(explicit initialization)

변수를 선언함과 동시에 초기화

말 그대로 변수를 선언함과 동시에 초기화한다.

초기화 블럭(initialization block)

명시적 초기화에 비해 복잡한 초기화 작업이 필요할 때에 사용한다.

두 가지 종류가 있는데

  • 클래스 초기화블럭
    • 클래스변수의 초기화에 사용
      • 클래스가 메모리에 처음 로딩될 떄에 한 번 수행
  • 인스턴스 초기화블럭
    • 인스턴스 초기화에 사용
      • 생성자와 같이 인스턴스를 생성할 때 마다 수행
        • 인스턴스 초기화 블럭이 생성자 초기화 블럭보다 먼저 수행된다.

그래서 초기화 블럭이 뭔데?

public class Test {
    int count = 0;
    int serialNo = 0;
    String color;
    String gearType;

    public Test() {
        count++;                                    // 중복코드
        serialNo = count;                           // 중복코드
        color = "White";
        gearType = "Auto";
    }

    public Test(String color, String gearType) {
        count++;                                    // 중복코드
        serialNo = count;                           // 중복코드
        this.color = color;
        this.gearType = gearType;
    }
}

이런 식으로 중복되는 코드가 사용되는 코드가 있을 때에

public class Test {
    int count = 0;
    int serialNo = 0;
    String color;
    String gearType;

    // 인스턴스 초기화 블럭
    {
        count++;
        serialNo = count;
    } 

    public Test() {
        color = "White";
        gearType = "Auto";
    }

    public Test(String color, String gearType) {
        this.color = color;
        this.gearType = gearType;
    }
}

인스턴스 초기화 블럭을 사용하여 초기화 할 수 있다.
한번 이를 확인해 보면

public class Test {
    static {
        System.out.println("static { }");       // 클래스 초기화 블럭
    }

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

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

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

        System.out.println("Test test2 = new Test();");
        Test test2 = new Test();
    }
}
static { }
Test test = new Test();
{ }
생성자
Test test2 = new Test();
{ }
생성자

이렇게

  1. 클래스 초기화 블록이 가장 먼저 수행
  2. Test객체 생성 시 인스턴스 최기화 블럭 실행

이 된다.
또한 클래스 초기화 블럭은 최초 1회만, 인스턴스 초기화 블럭은 인스턴스 생성 시마다 수행됨이 확인된다.