인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

melon2641님의 프로필 이미지

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

업캐스팅 (부모 형태, 자식 생성자)

업캐스팅 문제 예시 3번 11:50

해결된 질문

작성

·

62

0

코드상 자식에서 draw를 없애면 부모의 draw를 실행하게되어 계속 무한반복인데,

무한반복이 없다고 치고 자식클래스의 this.draw는 출력이 어떻게 되는지 궁금합니다.

답변 2

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요, 무한반복이 없다고 치고가 무슨 말씀인지 모르겠습니다.

자식 클래스의 메서드의 주석을 지우면 바로 자식 메서드를 호출하고 끝납니다.

무한 반복 자체가 발생하지 않죠.

 

그건 업캐스팅 문제 예시 2번에서 다뤘습니다.

melon2641님의 프로필 이미지
melon2641
질문자

제가 코드 이해를 잘못해서 말을 헷갈리게 했네요 죄송합니다.
다시 질문드립니다.
예시 3번의 코드 상 메인함수의 b.draw(); 를 실행하게 되면 업캐스팅 상황이지만 자식클래스 B의 draw가 없는 상황이기 때문에 클래스A의 draw가 실행되어 무한반복 되는 상황인데,
여기서 저의 가정은
클래스 A의 draw가
sout ("b");
draw(); <- 이부분을 지우고
paint();를 넣게 되면
클래스B부분의 paint가 실행되는데

여기서 다시
super.draw(); <-이부분을 지우고
sout("c);

this.draw();가 실행된다면

부모의 draw를 호출하는지

this이기 때문에 클래스B의 draw메서드가 없어
에러가 나는지 궁금합니다.

 

요약 :

*최종적으로 궁금한 부분은 클래스B부분의 paint(); 부분 중 this.draw가 실행된다면 에러가 나는지 실행이 되는지(된다면 어떻게?) 궁금합니다.

주말코딩님의 프로필 이미지
주말코딩
지식공유자

public class MainClass {
    public static void main(String[] args) {
        A b = new B();

        b.paint();
        b.draw();
    }
}

class A {
    public A() {
        System.out.println("Constructor of A");
    }

    public void paint() {
        System.out.print("A");
        draw();
    }

    public void draw() {
        System.out.print("B");
        paint();
    }
}

class B extends A {
    public B() {
        System.out.println("Constructor of B");
    }

    public void paint() {
        System.out.print("C");
        this.draw();
    }
}

 

이 형태의 코드를 말씀하시나요?

이것도 단순합니다.

main 함수에서 b.paint를 불렀는데 가보니 draw를 부릅니다.

자식에는 이미 부모의 메서드를 상속받아왔기 때문에 부모 것을 똑같이 실행합니다.

draw에서는 자식이 오버라이딩했으니 C를 출력하겠죠.

 

결국 CBCBCBCBCB 무한출력합니다.

 

출력값:

Constructor of A

Constructor of B

CBCBCBCBCBCB...무한출력

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. melon2641님.

질문하신 내용은 자식 클래스에서 draw 메서드가 없는 상황에서 부모의 draw 메서드를 호출하는 경우와 관련이 있습니다. Java의 상속과 메서드 호출 관점에서 설명드리면 다음과 같습니다.

핵심 설명:

  1. 상속 및 메서드 호출: 상속 관계에서 자식 클래스에 특정 메서드가 정의되어 있지 않다면, 그 메서드는 부모 클래스에서 정의된 것이 호출됩니다. 이런 경우, 자식 클래스 객체를 통해 메서드를 호출하더라도, 부모 클래스의 메서드가 실행됩니다.

  2. this.draw의 의미: 만약 자식 클래스 내에서 this.draw를 호출한다면, draw 메서드가 자식 클래스에 정의되어 있는지 확인하고, 없다면 부모 클래스에서 찾습니다. this는 생성된 객체 자신의 메서드를 호출하도록 지시하며, 여기서는 상속된 부모의 메서드가 호출되어 부모 클래스의 draw 메서드가 실행됩니다.

예시:

  • 부모 클래스에서 draw가 정의된 상태에서 자식 클래스에서 this.draw()를 호출하면 parentdraw 메서드가 실행됩니다.

관련된 토론 링크:

비슷한 주제에 대한 추가 토론을 원하시면, 아래의 링크들을 참고해 보세요.
- 업캐스팅 강의 16:35 질문 있습니까?
- 자바 상속과 draw 메서드 호출

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.