강의

멘토링

커뮤니티

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

elly_sally님의 프로필 이미지
elly_sally

작성한 질문수

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

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

6번째 문제 질문입니다

해결된 질문

작성

·

28

·

수정됨

0

이전까지 업캐스팅에서 부모의 기본생성자를 먼저 출력하고 다음에 자식의 생성자를 실행한다고 배웠는데 여기선 빼고 바로 B의 생성자로 가는 이유가 무엇인가요 앞 문제와 파라미터가 들어간 메인함수는 똑같은데 오버로딩과 무슨 관련이 있나요

B의 기본생성자에서 명시적으로 파라미터가 들어간 부모 생성자를 호출하기에 부모 기본생성자를 생략해도 되는건가요

 

답변 2

0

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

안녕하세요! 다음 질문에는 몇 분 몇 초를 함께 써주시면 좋겠습니다.

6번 문제라고 해주셔서 바로 확인할 수는 있었습니다만 몇 분 몇 초가 훨씬 더 찾기 수월합니다.. 😃

 

업캐스팅에서 부모의 기본생성자를 먼저 출력하고 다음에 자식의 생성자를 실행한다고 배웠는데 여기선 빼고 바로 B의 생성자로 가는 이유가 무엇인가요?

 

일단 우리가 자세하게 배우지 않은 것 중에 부모의 생성자가 불리는 것이 없으면 무조건 기본 생성자가 불린다. 라는 원칙이 있었습니다. 말 그대로 부모의 생성자 중에 하나가 불리면 부모의 기본생성자는 불리지 않습니다. (단, 다른 생성자 중에서 this()로 직접 자기 자신을 호출하면 호출됩니다.)

 

지금 앞의 5번과 6번의 차이는 자식 생성자인 B(int i)안에 super(10);이 없었느냐 생겼느냐입니다.

 

사실 뒤(섹션 10에서 "생성자 호출순서"만 다뤄보자!)에서 설명을 드리지만 우리가 묻지도 따지지도 않고 부모 기본생성자를 부르라고 배우는 이유는,

 

명시적으로 부모 생성자를 부르지 않을 때는 Java 언어가 자식 생성자 가장 위에 super()를 추가로 넣어주기 때문에 그렇습니다. 그래서 제가 문제를 풀 때는 자식 생성자에 특별한 것이 없으면 바로 부모의 기본생성자로 가는 것입니다.

지금은 super(10)이 있죠. 그래서 어떤 생성자를 부르는 지 명확하게 보기 위해서 B로 가는 것입니다.

 

만약에 없다? 그러면 볼 것도 없이 부모의 기본생성자로 가면 되는 것이죠.

그래서 본래 코드를 볼 때는 자식생성자 -> 어떤 부모생성자를 부르는지 확인 -> 부모생성자가서 코드 확인 순으로 확인하고

출력은 그 반대로 합니다. 부모부터 필드가 초기화 되어야 하기 때문이죠.

 

제가 항상 같은 설명과 답변으로 말씀드리는 것이 "생성자는 단 한 번만 호출된다. 단, 본인들끼리 부르는 것도 한 번으로 친다."입니다. 명시적으로 부모의 생성자 중에 파라미터가 있는 것을 불렀으니 당연히 그곳으로 가야하죠.

 

이에 대해서는 당연히 뒤에서 더 자세하게 다룹니다.

생성자의 호출순서에 대해서 더 깊게 배우는 것은 섹션 10에서 "생성자 호출순서"만 다뤄보자! 가 있습니다. 그곳에서 더 다양한 예제를 배울 수 있습니다.

 

0

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

자바에서 객체가 생성될 때 생성자 호출의 순서는 혼란스러울 수 있지만, 이론을 이해하고 나면 훨씬 이해하기 쉬워집니다. 특히, 상속 관계에 있는 클래스에서는 생성자의 호출 순서가 중요합니다.

자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때, 명시적으로 super() 를 사용해 특정 부모 생성자를 호출할 수 있습니다. 만약 자식 클래스의 생성자 내에서 super() 를 명시적으로 호출하지 않으면, 자바 컴파일러는 자동으로 부모 클래스의 기본 생성자(super() 즉, 파라미터 없는 생성자)를 호출합니다.

확인해야 할 사항

  • B의 기본 생성자에서 특정 부모 생성자를 호출: B의 생성자에서 파라미터가 있는 부모 생성자를 명시적으로 super(파라미터)를 사용해 호출하면, 기본 생성자는 호출되지 않습니다.
  • 오버로딩과 관련성: 오버로딩은 메서드 이름은 같지만 파라미터가 다른 메서드를 선언하는 것입니다. 생성자도 오버로딩할 수 있으며, 각각의 오버로딩된 생성자는 명시적으로 호출되지 않는 이상 자동으로 호출되지 않습니다.

예시는 다음과 같습니다

class A {
    public A() {
        System.out.println("생성자 of A");
    }
    public A(int a) {
        System.out.println("생성자 of AA" + a);
    }
}

class B extends A {
    public B(int b) {
        super(b);  // 'super(b)' 구문이 부모의 AA(int)를 호출
        System.out.println("생성자 BB" + b);
    }
}

위 코드에서는 B(int b) 생성자가 호출될 때, super(b) 구문으로 인해 부모 클래스 A(int a) 생성자가 호출됩니다. 이때, 기본 생성자 A()는 호출되지 않습니다.

참고할 수 있는 링크

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

elly_sally님의 프로필 이미지
elly_sally

작성한 질문수

질문하기