초기화 블럭
1. 클래스 초기화 블럭
- 클래스 변수의 복잡한 초기화에 사용된다.
- 보통 "static { ... }" 형식으로 사용된다.
- 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행된다.
- 앞서 배운 내용이지만, 클래스 초기화이므로 인스턴스 변수를 초기화하지 못한다.
2. 인스턴스 초기화 블럭
- 인스턴스 변수의 복잡한 초기화에 사용된다.
- 보통 "{ ... }" 형식으로 사용된다.
- 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
- 인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로
수행돼야 하는 코드를 넣는데 사용한다.
- 아래의 예제를 통해 이해하자.
( 위 예제에서 두 생성자는 "this.x++"을 중복되어 사용되고 있다. )
( 이럴 경우 인스턴스 생성자를 만들어서 아래의 코드처럼 수행한다. )
( 이처럼 코드의 중복을 제거하는 것은 코드의 신뢰성을 높여주고, 오류의 발생 가능성을 줄여
준다는 장점이 있다. )
3. 예제(1) - 초기화 블럭이 실행되는 순서
4. 예제(2) - 제품 시리얼 번호 만들어보기.
5. 예제(3) - 서로 다른 문서 이름 작성하기.
6. 예제(4) - 전체 순서 흐름 파악하기
( 첫 번째로, 클래스 초기화(기본값(1) -> 명시적 초기화(2) -> 클래스 초기화 블럭(3)) )
( 두 번째로, 인스턴스 초기화(기본값(4) -> 명시적 초기화(5) -> 인스턴스 초기화 블럭(6) -> 생성자(7)) )
(여기서 주의할 점은 클래스 초기화 과정에서 명시적 초기화를 할 때 iv는 초기화 되지 않는다.)
1. cv=0
2. cv=1
3. cv=2
4. cv=2, iv=0
5. cv=2, iv=1
6. cv=2, iv=2
7. cv=2, iv=3
( 이때, cv=0 또는 iv=0은 변수 생성 시점이다. )
7. JVM 마다 클래스 로딩 시키는 상황이 다르다.
(1) 클래스가 필요할 때 바로 메모리에 로딩하도록 설계한다.
( 클래스가 필요한 시점은 클래스 맴버를 사용하거나 인스턴스를 생성할 때이다. )
(2) 실행 효율을 높이기 위해서 사용될 클래스들을 프로그램이 시작될 때 미리 로딩하도록 설계한다.