강의

멘토링

로드맵

Inflearn brand logo image

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

메리님의 프로필 이미지
메리

작성한 질문수

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

같지만 다른 것들

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

해결된 질문

작성

·

36

0

제가 제대로 이해한 것이 맞는지 헷갈려서 질문 드려요 ㅠ
부모 자식 클래스 관계에서 super()라는 명시적 호출이 생략되어 있는 거고, 상속 관계에서는 무조건 자식 생성자 생성하기 전에 부모 생성자부터 생성하는 건 이해했습니다.

근데 그럼 상속 관계에서 명시적 호출 super()이 아닌, this()라고 선언 해놓았을 경우, 부모 생성자를 생성하지 않고 자식 생성자만 생성하는 건가요?

너무 헷갈리네요 ..

답변 2

1

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

아뇨, 부모 생성자를 생성하지 않는 경우는 없습니다.

아무 동작하지 않더라도 부모 생성자를 갔다 온 것입니다.

 

  • 부모 생성자는 항상 한 번 호출됩니다.

  • 자식 생성자에서 this(…)를 써도, 그 체인 끝에 있는 어떤 자식-쪽 생성자에서는 결국 super(…)로 부모 생성자를 호출해야 하므로, 부모 생성자를 무조건 실행합니다.

  • 만약 부모 클래스에 매개변수가 있는 생성자만 존재한다면, 자식 클래스가 직접super(…)를 써서 맞는 매개변수를 넘겨 주어야 합니다. 그렇지 않으면 컴파일 오류가 납니다. (자동으로 생성해주지 않음)

 

위의 3가지는 아실 겁니다. 말씀하신 것은 자식 생성자에서 this()를 바로 썼을 때 같은데,

자식 생성자에서 this를 쓴다는 것은 자기자신의 어딘가로 생성자를 보낸다는 것이죠?

그럼 최소 생성자는 2개라는 뜻입니다. 아래 예제 보시죠.

 

class Parent {
    Parent() {
        System.out.println("Parent()");
    }
}

class Child extends Parent {
    Child() {              // ①
        this(42);          // ② 같은 클래스 다른 생성자 호출
        System.out.println("Child()");
    }
    Child(int x) {         // ③
        // super();        // ← 안 써도 자동 삽입
        System.out.println("Child(int)");
    }
}

public class Demo {
    public static void main(String[] args) {
        new Child();
    }
}

 

위의 코드의 출력문은

Parent()

Child(int)

Child()

 

입니다.

 

 

  • Child()this(42)

  • Child(int) → (Java가 자동으로 생성한) super()

  • 이후 Child(int) 본문, 이어서 Child() 본문

 

무조건 부모 생성자에는 언젠가는 갔다와야합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 메리님께서 자바에서의 상속과 생성자 호출 순서에 대해 궁금하신 점을 남겨주셨군요.

자바에서 객체를 생성할 때, 상속 관계가 있다면 자식 클래스의 생성자 호출이 시작되기 전에 부모 클래스의 생성자가 호출됩니다. 이는 상속된 부모 클래스를 초기화하여 자식 클래스가 사용할 준비를 하기 위함입니다.

super()와 this()의 차이

  1. super():

    • super()는 부모 클래스의 생성자를 명시적으로 호출하는 데 사용됩니다. 자식 생성자 내에서 첫 번째 줄에 위치하게 됩니다.
    • 명시적 호출이 없을 때에도 Java는 부모 클래스의 기본 생성자를 자동으로 호출합니다.
  2. this():

    • this()는 같은 클래스 내의 다른 생성자를 호출할 때 사용됩니다.
    • 만약 자식 생성자에서 this()를 사용하여 다른 생성자를 호출하는 경우, 해당 생성자가 종료되기 전까지는 부모 생성자를 호출하지 않습니다.

따라서, this()를 사용해서 같은 클래스 내의 다른 생성자를 먼저 호출했다 하더라도, 최종적으로 super()가 호출되거나, 부모 클래스의 기본 생성자가 호출될 때까지 부모 생성자는 생성됩니다. 이는 자식 클래스의 생성이 끝나기 전에 부모 클래스가 먼저 초기화돼야 한다는 규칙에 의해 보장됩니다.

관련 답변 링크

이와 관련하여 더 자세한 이해를 돕기 위한 관련 질문들을 확인해보세요:

이 답변이 도움이 되었기를 바랍니다. 추가적으로 궁금한 점이 있으면 언제든지 질문 주시면 기쁘겠습니다.

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

메리님의 프로필 이미지
메리

작성한 질문수

질문하기