Java에서 클래스의 멤버 변수(initial instance variables)는 다음과 같은 순서로 초기화 된다:

  1. 기본 초기화(Default Initialization): 모든 멤버 변수는 해당 자료형의 기본 값으로 자동 초기화 된다. 예를 들어, int 타입의 변수는 0으로, boolean 타입의 변수는 **false**로 초기화된다.

  2. 명시적 초기화(Explicit Initialization): 멤버 변수를 선언할 때 직접 값을 할당하는 방식으로 초기화 할 수 있다. 이 경우 명시적으로 지정한 값으로 변수가 초기화 된다.

  3. 인스턴스 초기화 블록(Instance Initialization Block): 클래스의 인스턴스가 생성될 때 실행되는 블록으로, **{}(중괄호)**로 묶인 코드 블록이다. 해당 블록은 인스턴스 변수를 초기화하기 위해 사용된다. 인스턴스 초기화 블록은 생성자보다 먼저 실행되며, 생성자마다 중복 코드를 작성하지 않고 인스턴스 변수를 초기화하는 데 사용될 수 있다.

  4. 생성자(Constructor) 초기화: 생성자는 인스턴스가 생성될 때 호출되는 특별한 메서드이다. 생성자를 사용하여 멤버 변수를 초기화할 수 있다. 생성자 초기화는 명시적 초기화와 인스턴스 초기화 블록 다음에 실행된다.

따라서, 멤버 변수의 초기화는 위의 순서대로 진행된다. 명시적 초기화는 변수 선언 시 값을 할당하는 방식으로 초기화하며, 인스턴스 초기화 블록은 인스턴스 생성 시점에 실행되는 블록입니다. 생성자는 클래스의 인스턴스가 생성될 때 실행되며, 생성자를 통해 멤버 변수를 초기화할 수 있습니다. 이러한 초기화 순서는 클래스의 인스턴스화 및 멤버 변수의 일관된 초기 상태를 보장하기 위해 필요합니다.

public class MyClass {
    private static int staticVariable = initializeStaticVariable();
    private int instanceVariable = initializeInstanceVariable();

    static {
        System.out.println("Static initialization block");
    }

    {
        System.out.println("Instance initialization block");
    }

    public MyClass() {
        System.out.println("Constructor");
    }

    private static int initializeStaticVariable() {
        System.out.println("Initializing static variable");
        return 10;
    }

    private int initializeInstanceVariable() {
        System.out.println("Initializing instance variable");
        return 20;
    }

    public static void main(String[] args) {
        MyClass myObj = new MyClass();
    }
}
(클래스 초기화 from 클래스 로더)
Initializing static variable
Static initialization block
(인스턴스 생성)
Initializing instance variable (heap 영역)
Instance initialization block
Constructor

Reference