클래스 멤버 변수의 초기화 순서

Single Ko·2023년 4월 6일
0

java

목록 보기
21/28

초기화 순서

  1. Static block & Static variable : 정적 변수 및 정적 블록은 클래스에 나타나는 순서대로 먼저 초기화됩니다. static 변수와 블록은 클래스가 JVM(Java Virtual Machine)에 로드될 때 한 번만 초기화됩니다.

  2. Instance variable & Instance initializer blocks: 인스턴스 변수 및 인스턴스 초기화 블록은 클래스에 나타나는 순서대로 다음에 초기화됩니다. 새 객체가 생성될 때마다 초기화됩니다.

  3. Constructors: 마지막으로 클래스의 생성자가 실행됩니다. 생성자는 객체의 상태를 초기화하는 데 사용되며 클래스의 새 인스턴스가 생성될 때마다 호출됩니다. 클래스에 여러 생성자가 있는 경우 호출되는 특정 생성자는 객체 생성 중에 전달된 매개 변수에 따라 다릅니다.

초기화 순서 예제 코드로 보기.

  class Example {
    static int staticVar = print("Static variable initialized");
    
    static {
        print("Static block executed");
    }

    int instanceVar = print("Instance variable initialized");
    
    {
        print("Instance initializer block executed");
    }

    Example() {
        print("Constructor executed");
    }

    public static int print(String message) {
        System.out.println(message);
        return 0;
    }

    public static void main(String[] args) {
        Example obj1 = new Example();
        Example obj2 = new Example();
    }
}

출력

Static variable initialized
Static block executed          //static 영역은 시작하자마자 가장 먼저 초기화
Instance variable initialized  // obj1을 생성 -> Instance초기화 후 생성자 초기화
Instance initializer block executed
Constructor executed
Instance variable initialized  // obj2를 생성 -> Instance초기화 후 생성자 초기화.
Instance initializer block executed
Constructor executed

결론

  • Static은 로드 될 때 가장 먼저 메모리에 올라가 초기화 된 뒤 더이상 나타나지 않는 걸 볼 수 있다. 이후 new Example()을 통해 객체를 생성할 때 Instance가 먼저 초기화 된 뒤 생성자가 초기화 되는 것을 볼 수 있다.

  • 이렇듯 코드로 확인 할 수 있는 작업은 코드로 직접 확인 해 보는것이 가장 좋은거 같다.

번외

  • static키워드의 특징
    • static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용이 가능하다. 인스턴스 생성 없이 사용 가능.
    • 모든 객체가 메모리를 공유한다는 특징이 있고, GC관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 된다.
    • 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어 매번 메모리에 로딩하고 값을 읽는것보다 일종의 전역변수와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일 수 있다.
    • 프로그램 내에 공통으로 사용되는 데이터들을 관리할 떄 이용한다.
profile
공부 정리 블로그

0개의 댓글