본문 바로가기

아는 만큼 보인다/Concurrency

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

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

1. static 변수 선언부 : 클래스가 로드 될 때 (메모리 모델상 Methd area 에 올라감)
                               변수가 제일 먼저 초기화 됨

2. 필드 변수 선언부 : 객체 생성 될 때 (메모리 모델상 Heap area에 올라감)
                              생성자 block 보다 앞서 초기화 함

3. 생성자 block : 객체 생성 될 때 (메모리 모델상 Heap area에 올라감)
                        JVM이 내부적으로 locking (thread safe 영역임)
                        필드 변수 중 final 변수의 가시화는 (다른 스레드에 공개하는 시점은) 생성자 block이 끝난 다음.
                        필드 변수 선언부에서 이미 초기화 되었다면 그 값들은 덮어 씀

 

 

참고: http://cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=jW1T&fldid=BagZ&datanum=32&openArticle=true&docid=jW1TBagZ3220050717102526

초기화 시점
    * 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
    * 인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

초기화 순서
    * 클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
    * 인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자