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

박서영님의 프로필 이미지
박서영

작성한 질문수

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

Java: 상속을 정리하는 문제 10개

상속정리10문제강좌 5분41초

해결된 질문

작성

·

99

0

자식이 태어나기 전 부모가 무조건 태어나야한다고 했었는데,

여기서는 이미 child(){ 안에 super();이라고하는 부모 생성자를 호출하고있어서 사실상 의미가 중복되어 한번만 태어나는 것인가요?

아니면 (자식이 태어나기 전 부모가 무조건 태어나야한다고 )<- 이 말은 업캐스팅에서만 해당되나요?

답변 1

0

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

저 예제에서는 사실상 없어도 똑같습니다.

업캐스팅이든 아니든 생성자 호출을 명시적으로 하면 그 생성자를 부르면 되고,

없으면 기본생성자 부르시면 됩니다.

 

그건 형태에 따라 달라지는 게 아니라 그냥 Java 언어의 동작 원칙입니다.

주의하실 건, 다른 생성자에서도 super() 혹은 this()로 기본 생성자로 코드의 흐름이 흘러갈 수 있다는 것을 주의하셔야 합니다.

박서영님의 프로필 이미지
박서영
질문자

  • 아, 강의를 끝까지 보니 이해가 되었습니다. 유형 10의 경우는 상속된 자식이 태어나기 전 부모의 기본생성자가 없어 자식 역시 태어날 수 없어 오류였고, 유형1은 부모 기본생성자가 존재하기 때문에 사실상 super()가 자식 메소드 child()안에 없어도 자바 내에서 저절로 자식을 태어나게끔 해줬을거라는 말씀이시죠??

     

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

네, 원래는 아무 생성자도 작성하지 않으면 Java가 실행될 때 기본 생성자를 끼워 넣어줍니다. 그런데 지금은 파라미터 있는 생성자가 있죠. 이 경우에는 기본 생성자 안 만들어줍니다. 그런데 실행시키려고 하니까 없어서 오류 뱉습니다. (유형 10)

 

유형1은 애초에 기본 생성자가 있습니다. 그래서 super()가 있으나 없으나 기본 생성자를 부릅니다. 그런데 super()를 써 놓으면 뭔가 수험생들이 더 헷갈릴 것 같으니 넣어서 시험 낼 수도 있습니다. 동작은 쓰나 안쓰나 똑같이 정상적으로 돌아가거든요.

 

class Parent {
    int x = 25;
    Parent() {
        this(5);
        System.out.println("Parent default");
    }
    Parent(int x) {
        System.out.println("Parent: " + x);
    }
}
class Child extends Parent {
    int x = 10;
    Child() {
        this.display();
        System.out.println("Child default");
    }
    void display() {
        System.out.println(x);
    }
}
public class TestInheritance {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

 

출력값:

Parent: 5

Parent default

10

Child default

박서영님의 프로필 이미지
박서영

작성한 질문수

질문하기