목적: 초기화 블럭은 생성자와 뭐가 다를까? 생성자와 초기화 블럭의 실행 순서는 무엇이 더 먼저인가?
초기화 블록은 말 그대로 초기화를 위한 블록이다.
static 변수와 instance 변수의 경우 따로 초기화를 하지 않으면 기본 값이 세팅된다. 그러나 지역변수의 경우 반드시 초기화해야만 사용할 수 있는데, 그 초기화 방법 중 하나가 초기화 블록이다.
초기화 블럭은 static 초기화 블럭과 인스턴스 초기화 블럭이 있다.
각각 static {}, {} 으로 활용한다.
다음은 초기화 블록의 사용 예시이다.
위의 경우, 메인 메서드와 초기화 블럭 중 무엇이 먼저 실행되는지를 알 수 있다.
우선, static 초기화 영역이 가장 먼저 실행된다. 그 다음, "main method start" 가 화면에 찍힌다.
그리고 객체생성을 하며 인스턴스 초기화가 실행된다.
따라서 세 번째로는 "인스턴스 초기화 영역"가 찍힐 것이다. 그 바로 다음, 생성자가 실행되며 "생성자 호출" 이 찍힌다.
실제 찍힌 메세지를 확인해 보면 다음과 같다.
즉, 1. main method 보다 static 초기화가 선행된다.
2. 초기화블럭이 먼저 실행되고 나서 생성자가 실행된다.
이 두 가지를 알 수 있다.
다른 예시를 확인해보자.
위 화면의 소스코드 흐름을 읽어보자.
우선, static 초기화블록이 없으므로, static int cnt 는 0으로 자동 초기화된다.
그 다음, p1이 객체생성되며, 인스턴스 초기화 블록이 실행된다. serialNo 역시 0으로 초기화된다.
"인스턴스 초기화 블럭 시작, cnt:0 , secrialNo:0" 찍힌다. 이후 cnt는 1, serialNo 역시 1이 된다.
다음으로 "인스턴스 초기화 블럭 끝, cnt:1, serialNo:1"이 찍힌다.
그리고 p1의 생성자가 실행된다. 따라서 "Product() 생성자" 가 찍힌다.
p2, p3이 그대로 반복된다.
마지막에는 "p1 serialNo:1, p2 serialNo:2, p3 serialNo:3" 이 각각 찍힌다. (이유는 각 객체에서 cnt 값을 serialNo에 복사했기 때문이다.)
그리고 객체 생성 수(cnt) 는 3이 찍힌다.
실제 결과는 다음과 같다.
코드가 처음 실행되었을때의 순서는 어떨까?
다음과 같다.
클래스 변수, 클래스 메서드 메모리 할당>클래스변수 초기화>클래스 초기화 블럭 호출
여기에 유의해서다음의 예시를 확인해보자.
가장 먼저, 클래스 변수 cnt 가 0으로 초기화되고, static 초기화 블럭이 실행된다.
그런데, static 초기화 블럭에서 같은 클래스 영역 내에 정의된 메서드를 호출한다. 따라서 static void test 메서드가 "static method 1"을 찍는다.
이후 "static block 2" 이 찍힌다.
그 다음, 메인으로 돌아간다. 메인에서 다시 test 메서드를 호출했으므로, "static method 3"이 찍힌다.
이후 객체생성을 하므로, 인스턴스 초기화 블럭으로 간다. 그런데 인스턴스 초기화 블럭에서 인스턴스 메서드를 호출했으므로, 따라서 "instance method 4", "instance block 5"가 차례로 찍힌다.
그 다음, 생성자가 실행된다. 그러나 생성자에서 다시 인스턴스 메서드를 호출했으므로 "instance method 6" "constructor 7" 이 차례로 찍힌다.
이후 cnt 8~ 11은 4~7번과 동일한 방식으로 반복된다.
따라서 결과는 다음과 같다.
다소 복잡하지만, 초기화블럭과 생성자의 실행 순서를 확실하게 확인할 수 있는 예시였다.
끝으로, 클래스 초기화는 처음에 한 번만 실행된다는 점.
그리고 메서드는 누군가 불러줘야만 처음으로 실행된다는 점.
인스턴스 초기화는 객체 생성을 해야 진행된다는 점.
이 세가지를 유의하도록 하자.
'Study > Java' 카테고리의 다른 글
[자바] 인터렉션 연습문제 _ 그래픽카드 (0) | 2023.12.01 |
---|---|
[자바]1130 수업 소스코드 아카아브 (0) | 2023.11.30 |
[자바] 인터페이스 예제 풀이 (0) | 2023.11.29 |
[자바] 오버로딩과 오버라이딩 (0) | 2023.11.21 |
[자바] 생성자, this 의 사용 (0) | 2023.11.17 |
댓글