티스토리 뷰
반응형
🔷 부모 메서드에서 호출한 메서드가 자식 메서드를 실행하는 이유: 자바 동적 바인딩 이해
✅ 상황 설명
자바에서 상속을 사용하면 다음과 같은 코드가 만들어질 수 있습니다.
Printer printer = new ColorPrinter();
printer.start();
- ✅ Printer는 부모 클래스
- ✅ ColorPrinter는 Printer를 상속한 자식 클래스
- ✅ 부모 타입의 변수 printer가 자식 객체를 참조
이제 메서드를 호출해 보겠습니다.
printer.start();
이때 실제로 실행되는 메서드는 부모의 start()일까요? 자식의 start()일까요? 자식 클래스에서 start()를 오버라이드했다면, 결과는 자식의 start()가 실행됩니다.
이 부분까지는 이해가 쉽습니다. 왜냐하면 자식이 메서드를 덮어썼기 때문입니다. 하지만 혼란스러운 건 그다음입니다.
✅ 의문 상황
부모 클래스에 이런 메서드가 있다고 해 보겠습니다.
class Printer {
public void start() {
System.out.print("P");
printContent(); // 부모 클래스 안에서 호출
}
public void printContent() {
System.out.print("Q");
}
}
자식 클래스에서 printContent()를 오버라이드한 상태로 실행하면 어떤 출력이 나올까요?
class ColorPrinter extends Printer {
@Override
public void printContent() {
System.out.print("R");
}
}
이제 실행합니다.
Printer printer = new ColorPrinter();
printer.start();
많은 사람들이 예상하기를:
start()는 부모의 메서드니까, printContent()도 부모의 것이 호출되지 않을까?
하지만 실제 출력은:
PR
부모의 start()가 실행되지만, 그 안에서 호출한 printContent()는 자식의 메서드가 실행됩니다.
✅ 동작 원리
이 질문에 대한 답이 바로 자바의 동적 바인딩입니다.
✅ 동작 방식
자바는 메서드 호출 시점을 기준으로 두 가지를 구분합니다.
즉:
- ✅ Printer printer = new ColorPrinter(); → 컴파일 시에는 Printer의 메서드만 호출 가능하다고 판단
- ✅ 실행 시에는 ColorPrinter 객체이므로, 오버라이드된 메서드가 있으면 그것을 실행
부모 클래스의 메서드 안에서 메서드를 호출할 때도 여전히 this는 자식 객체입니다. this.printContent()가 호출되는 것과 같습니다. 그래서 자식이 오버라이드한 메서드가 실행됩니다.
✅ 설계 목적
자바가 이렇게 설계된 이유는 명확합니다.
- ✅ 부모 타입으로도 자식 객체를 다룰 수 있게 하고
- ✅ 부모 코드에서 자식의 동작을 그대로 활용할 수 있도록
- ✅ 다형성을 실현하기 위해
✅ 실행 순서 시각화
실행 흐름을 디버깅 모드처럼 단계별로 화살표로 표현했습니다.
printer.start() ⇨ ColorPrinter.start()
⇨ super.start() ⇨ Printer.start()
⇨ printContent() ⇨ ColorPrinter.printContent()
📋 출력 결과:
PR
- ✅ "P" → 부모의 start() 출력
- ✅ "R" → 부모의 start() 안에서 호출된 printContent() (자식 메서드 실행)
✅ 결론 정리
- 부모 메서드 안에서 호출하는 메서드도 결국 this.메서드()로 호출됩니다.
- this는 현재 객체를 가리키므로, 자식 객체일 때는 자식의 메서드가 실행됩니다.
- 이것이 바로 자바의 동적 바인딩입니다.
✅ 요약
- ✅ 부모 메서드도 현재 객체의 상태를 기준으로 동작
- ✅ 부모 메서드 안에서 호출된 메서드가 자식의 메서드인 이유는 this가 여전히 자식 객체이기 때문
- ✅ 자바는 항상 실제 객체의 타입을 기준으로 메서드를 호출
반응형
'자바' 카테고리의 다른 글
| 자바의 상속과 오버라이딩 완전 정리 (2) | 2025.07.14 |
|---|---|
| 오버라이딩이란 무엇인가 — 자바(Java)와 C++의 바인딩 차이 (1) | 2025.07.14 |
| 자바의 상속과 메모리 구조를 이해하기 위한 기초부터 완전한 설명 (0) | 2025.07.14 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디알고리즘
- Python
- 동적계획법
- 파이썬코딩
- 브루트포스
- 그래프 탐색
- 코딩
- HTML
- 알고리즘
- 문제 풀이
- DP
- 알고리즘기초
- 알고리즘문제풀이
- 그리디
- 프로그래머스
- dfs
- 백준
- 동적 계획법
- 문자열처리
- 상속
- python 알고리즘
- 프로그래밍
- 문제풀이
- 코딩테스트
- 코딩 테스트
- 파이썬
- C++
- c언어
- 알고리즘 문제풀이
- 객체지향
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
글 보관함
반응형
