카테고리 없음

[JAVA] super, this에 대한 이해

codecodekode 2024. 10. 15. 15:11

[23년 3회 - 1번]

다음은 Java 코드로 작성한 프로그램이다. 올바른 출력 결과를 작성하시오.

코드 분석

  1. main 메소드에서 B b = new B();로 B 클래스의 객체 b를 생성합니다.
  2. b.paint() 호출:
    • B 클래스의 paint() 메서드를 실행합니다.
    • super.draw()는 부모 클래스 A의 draw()를 호출하여, "B"가 출력됩니다.
    • 그다음 System.out.print("C")를 출력하여 "C"가 출력됩니다.
    • 마지막으로 this.draw()는 현재 객체 B의 draw() 메서드를 호출하므로 "D"가 출력됩니다.
    따라서, b.paint() 호출 시 "BCD"가 출력됩니다.
  3. b.draw() 호출:
    • 이는 B 클래스의 draw() 메서드를 가리키므로, "D"가 출력됩니다.

그런데, 내가 놓친 부분

  • A 클래스의 paint() 메서드도 주목해야 합니다. B 클래스에서 paint() 메서드를 오버라이드하기는 했지만, 부모 클래스 A의 paint() 메서드에서 draw()가 호출되는데, 이 호출은 다시 B 클래스의 draw()를 참조합니다.
    • 구체적으로, A 클래스의 paint() 메서드에서 draw()를 호출할 때, 이는 동적 바인딩에 의해 B 클래스의 draw()가 호출됩니다. 따라서 "D"가 출력됩니다.

다시 한 번 전체 흐름 정리

  1. b.paint() 호출:
    • super.draw() → "B" 출력 (부모 클래스 A의 draw() 호출).
    • System.out.print("C") → "C" 출력.
    • this.draw() → "D" 출력 (B 클래스의 draw() 메서드 호출).
    따라서 이 호출로 "BCD"가 출력됩니다.
  2. b.draw() 호출:
    • B 클래스의 draw() 메서드 호출 → "D" 출력.
  3. 처음에 호출된 A 클래스의 paint() 메서드에서의 draw() 호출
    • 이 호출은 동적 바인딩에 의해 B 클래스의 draw()가 호출되므로, "D"가 출력됩니다.

최종 출력 결과

코드 복사
BDCDD