강의

멘토링

로드맵

Inflearn brand logo image

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

뿐뿐님의 프로필 이미지
뿐뿐

작성한 질문수

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

Java언어 기출문제의 변형

4분 40초 상속과 생성자 연쇄 호출 문제

해결된 질문

작성

·

85

0

A s2=new B('Y') 구문 부분이 명확히 이해가 안되어 질문드립니다.

아래에 쓴 해석이 맞는지 확인 부탁드립니다.

해석)

A s2=new B('Y') 가 생성되었을 때,

상속의 원칙으로 부모의 기본 생성자를 호출해야되나

B(char x)의 첫줄에 this()로 인해

자신의 클래스[B class]의 기본 생성자[B()]가 호출되며,

기본생성자의 출력구문이 모두 종료된 후

다시 B(char x)으로 돌아와 남은 출력 구문을 실행하고 종료.


헷갈리는 부분이 있어 다른 질문도 드립니다.

 

1. B(char x)의 this로 인해 자신의 기본 생성자인 B()를 실행했을 때

super()가 없었어도 A클래스의 기본생성자를 호출하고

B클래스의 기본 생성자를 호출한 뒤

B(char x)의 출력구문을 실행한다.

-> 이게 맞다면

왜 super()가 없었어도 A클래스의 기본생성자를 호출되는지?

그리고, 만약 A클래스에 기본 생성자가 없었다면

출력이 어떻게 되는지 궁금합니다.

 

2. B(char x)에 this가 없었다면

부모의 기본 생성자가 호출이 되고

다시 돌아와 출력문이 실행되는지 궁금합니다.

 

3. main에서 생성자가 생성이 될 때마다

생성자에 명시적으로 super나 this가 없다면

부모의 기본 생성자가 호출이 되는지 궁금합니다

-> main에서 업케스팅 형태로

생성1

생성2

생성3

...

인 경우에서 생성부분에 파라미터가 있든 없든

명시적으로 super나 this가 없다면

각각 실행마다 부모의 기본 생성자가 실행이 되는지


적다보니 질문이 많이 생겼습니다..

확인 부탁드립니다 감사합니다!

답변 2

0

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

안녕하세요, 답변드립니다.

  1. Java의 규칙입니다. 자바에서는 생성자 내에 this()super() 호출이 명시되지 않으면, 컴파일러가 자동으로 부모 클래스의 기본 생성자super()를 삽입합니다. 제가 업캐스팅이나 상속에서 계속 말하는 "부모의 기본 생성자는 자동 호출된다"에 해당하는 부분입니다.

  2. 네, 부모를 호출하고 돌아옵니다. 출력값은 XAY가 됩니다. 메인 기준에서 첫 줄 실행되어서 X가 되고, 그 다음 줄에서 부모 갔다가(A) 그 다음에 나머지 출력(Y)합니다.

  3. 몇 줄을 넣어도 객체를 생성할 때마다 부모를 부릅니다. 객체가 태어날 때마다 그렇게 되기 때문에, 계속 부모의 생성자가 출력될 것입니다. 그런데 확실하게 super(파라미터)가 없다는 가정이신 것이죠? 그러면 기본만 생성됩니다.

     

"무조건 부모의 기본 생성자만 호출된다" <- 이렇게 외우는 것은 위험합니다. 명시적으로 파라미터 있는 생성자를 호출 할 수도 있으니까요. (super(파라미터)) 코드에 따라 부모의 기본 생성자를 안 부르는 경우도 있으니까 제가 올려 놓은 여러 예제를 보시면 됩니다.

 

특히 업캐스팅 쪽은 거의 모든 예제를 다 올려놨기 때문에 모든 챕터를 보셨다면 그 이외의 문제가 나올 수가 없습니다.

0

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

Java의 상속과 생성자 호출에 대해 자세한 질문을 해주셨습니다. 이러한 개념은 실전에서 자주 혼란을 겪게 만들 수 있는 부분입니다. 관련된 이전 질문과 답변을 통해 조금 더 명확히 해보겠습니다.

관련 질문/답변 URL

  1. Java 언어 기출문제의 변형 (inflearn)
  2. 자바 기출 변형 4분30초 (inflearn)

설명

아래 내용을 바탕으로 질문하신 점들을 하나씩 답변드리겠습니다.

해석에 대한 설명:

  • A s2=new B(‘Y’) 실행 시, B(char x) 생성자가 호출됩니다. B(char x) 생성자 내의 this()는 같은 클래스의 다른 생성자, 즉 B() 기본 생성자를 호출합니다.
  • B()가 호출되면 자동으로 super()가 추가되어 부모 클래스인 A의 기본 생성자가 먼저 호출됩니다. 그러므로 A()의 해당 구문이 실행되지요.
  • B() 기본 생성자가 끝나면 다시 B(char x)의 나머지 부분이 실행되어 ‘Y’가 출력됩니다.

질문 1:

  • super()가 없을 때 부모 생성자 호출 여부: Java에서는 자식 클래스의 생성자에서 super()가 명시되지 않으면 기본적으로 부모 클래스의 기본 생성자를 자동으로 호출하게 됩니다. 따라서 super()가 명시되지 않아도 A 클래스의 기본 생성자가 호출 됩니다.
  • A클래스에 기본 생성자가 없을 때: 부모 클래스에서 기본 생성자가 정의되지 않은 경우, 컴파일러는 오류를 발생시킵니다. 따라서 기본 생성자가 필요하다면 명시적으로 A()를 정의하거나 다른 형태의 super() 호출로 부모 생성자를 호출해야 합니다.

질문 2:

  • B(char x)에 this가 없을 때의 동작: this()가 없다면, 자식 클래스 생성자의 첫 줄에서 super()가 자동으로 호출됩니다. 따라서 부모 클래스의 기본 생성자가 먼저 실행되고 나서 현재 생성자의 나머지 부분이 실행됩니다.

질문 3:

  • 생성자 호출 시 부모의 기본 생성자 호출 여부: 생성자 내에 super() 또는 this()가 명시되지 않으면 기본적으로 부모 클래스의 기본 생성자가 자동으로 호출됩니다. 이는 모든 객체 생성 시에 명시된 부모 클래스의 기본적인 동작 방식입니다. 각각의 객체 인스턴스 생성마다 부모의 기본 생성자가 호출되지 않는 경우는 다른 super() 형태가 명시적으로 호출되었을 때입니다.

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

뿐뿐님의 프로필 이미지
뿐뿐

작성한 질문수

질문하기