정처기 실기를 준비하면서 겉핥기식으로 알고 있던 자바에 대해 조금 더 깊게 알게 되었는데, 그중 헷갈렸던 자바 문제를 보면서 초기화 시점을 정리해 보았다.

이 문제의 답이 무엇일까?

여기에서 알고 있어야 하는 것은 두 가지이다.
1. 부모 클래스에서 메서드를 호출할 때 오버라이딩 한 메서드가 자식 클래스에 있다면 부모 클래스가 아닌 자식 클래스의 메서드가 호출된다는 것.
2. 부모 클래스에서 메서드를 호출했을 때, 자식 클래스 변수의 값이 호출된다면 아직 초기화가 되지 않아 기본값인 0이 출력된다는 것.
여기에서는 두 번째인 초기화 순서에 대해 조금 더 정리할 것이다.
🔷 Java 객체 생성 시 초기화 순서
new Child();
라고 객체를 생성하면, JVM은 다음 순서로 초기화 및 실행을 하게 된다.
- 부모 클래스의 인스턴스 변수 초기화
- 부모 클래스의 생성자 실행
- 자식 클래스의 인스턴스 변수 초기화
- 자식 클래스의 생성자 실행
생성자보다 인스턴스 변수 초기화가 먼저 일어나는 게 맞지만, 자식 클래스의 인스턴스 변수 초기화는 부모 생성자 호출이 끝난 뒤에 이뤄진다.
즉, 부모 클래스의 생성자에서 오버라이딩된 메서드를 호출할 때 발생하게 되면 자식 클래스의 인스턴스 변수는 아직 초기화되지 않아 기본값이 0이 나온다는 것이다.
🔸예제: 자식의 v가 아직 초기화되지 않은 상태에서 show() 호출됨
public class Main {
public static void main(String[] args) {
new Child();
}
}
class Parent {
public Parent() {
System.out.println("Parent constructor");
show(); // 여기서 자식의 오버라이딩된 show() 호출됨
}
public void show() {
System.out.println("Parent show");
}
}
class Child extends Parent {
int v = 10; // 아직 초기화되지 않음
public Child() {
System.out.println("Child constructor");
}
@Override
public void show() {
System.out.println("Child show, v = " + v);
}
}
🔹출력 결과
Parent constructor
Child show, v = 0
Child constructor
🔍 왜 v = 0이 나오는가?
- 부모 생성자 안에서 show()를 호출했을 때,
- 실제 호출된 메서드는 자식 클래스에서 오버라이딩한 show()
- 그러나 이 시점에는 자식의 인스턴스 변수 v는 아직 초기화되지 않았음 → JVM 기본값 0.
✅ 요약
상황
|
설명
|
생성자보다 먼저 인스턴스 변수가 초기화되는가?
|
예. 일반적으로는 먼저 초기화됨
|
부모 생성자 호출 중 자식의 show()가 호출되면?
|
자식의 변수는 아직 초기화되지 않음
|
그래서 어떤 문제가 생기는가?
|
자식 변수 값이 0 등 기본값으로 출력됨
|
'지식' 카테고리의 다른 글
11개 디자인패턴 자세히 알아보기 (4) | 2025.07.09 |
---|---|
AWS 구조와 서비스 내용 정리 (0) | 2025.06.05 |
[정처기] 디자인패턴 총 정리 (0) | 2025.05.21 |
[정처기] UML 다이어그램 총 정리 (0) | 2025.04.10 |
[정처기] OSI 7 Layer 총 정리 (0) | 2025.04.03 |