티스토리 뷰

반응형

🔷 부모 메서드에서 호출한 메서드가 자식 메서드를 실행하는 이유: 자바 동적 바인딩 이해

✅ 상황 설명

자바에서 상속을 사용하면 다음과 같은 코드가 만들어질 수 있습니다.

Printer printer = new ColorPrinter();
printer.start();
    
  • Printer는 부모 클래스
  • ColorPrinterPrinter를 상속한 자식 클래스
  • ✅ 부모 타입의 변수 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가 여전히 자식 객체이기 때문
  • ✅ 자바는 항상 실제 객체의 타입을 기준으로 메서드를 호출
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
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
글 보관함
반응형