본문 바로가기

Language & Framework/Java

자바 멤버 변수의 초기화 순서 예제

 

위 코드는 어떤 순서로 실행될까?

멤버 변수의 초기화 시기와 순서는 다음과 같다.

 

초기화 시기

1. 클래스 : 클래스가 처음 로드될 때 한 번 초기화.

2. 인스턴스 : 새로운 인스턴스가 생성될 때마다 각각의 인스턴스가 초기화.

 

초기화 순서

1. 클래스 변수의 기본값 ( ex > static int num; ) => int의 기본값은 0이다.

2. 클래스 변수의 명시적 초기화 ( ex > static int num = 10; )

3. 클래스 초기화 블럭 ( ex > static { num = 20; } )

4. 인스턴스 변수의 기본값 ( ex > String title; ) => String의 기본값은 null이다.(참조형 변수)

5. 인스턴스 변수의 명시적 초기화 ( ex > String title = "나는 제목이다" )

6. 인스턴스 초기화 블럭 ( ex > { title = "난 사실 제목 아니다" } )

7. 인스턴스 생성자 ( ex > DOC(String title) { this.title = title } )

 

* 단순히 클래스랑 인스턴스가 종류가 달라서 이렇게 나열한 것이 아니라 멤버 변수는 늘 클래스가 먼저 초기화되고 그 다음 인스턴스가 초기화된다.

 

위의 내용을 숙지하고 결과를 보도록 하자.

 

1. 늘 클래스가 먼저 초기화되기 때문에 제일 먼저 "접속!"이 출력되고 있다.

2. 그 후 인스턴스가 생성될 때마다 초기화되며 "ready.."가 출력되고 있다.

3. 기본적으로 extension은 명시적 초기화가 되어있지 않기 때문에 초기화 블럭에 있는 ".txt"가 대입되어 있으나 초기화 블럭보다 생성자가 더 나중에 초기화되므로 생성자에서 직접적으로 extension 값을 정해주면 해당 값이 적용된다.

4. 제목 없음 뒤에 붙어있는 count는 클래스 변수이기 때문에 처음에 값을 명시적으로 정해준 이후 초기화되지 않고 count++에 의해 인스턴스가 생성될 때마다 값이 증가하고 있다.