해결된 질문
작성
·
47
답변 2
0
질문 순서대로 정/오 여부를 판단해드리겠습니다.
B의 생성자를 호출해야하는데, b는 a를 상속한 것이기 때문에 a의 기본 생성자를 호출해야한다.
앞에까지는 맞고, 뒤는 틀렸습니다. new B('Y')이기 때문에 B의 생성자 중에 문자 1개짜리 생성자를 선택해서 Y를 넣어야 합니다. 그 다음에 무조건 부모의 기본생성자를 가느냐? 아닙니다. 따라가다가 부모생성자를 호출하는 것이 없을 때만 그렇습니다. 지금은 this()로 본인 클래스의 파라미터 없는 생성자로 코드 흐름을 보냈고, 거기에서 부모 생성자 파라미터 1개짜리를 명시적으로 호출합니다.
자식이 생성되는 과정에서 부모를 최소 1번 불렀습니다. 그러면 자식은 정상적으로 생성을 끝 마칠 수 있습니다.
매개변수가 있는 B생성자의 this()를 만나 A가 한 번 더 출력이 되어 XAABY가 출력이 되는 것이 아닌가요?
B 생성자의 this()는 파라미터 없는 생성자를 호출하라는 뜻입니다. 그곳에는 부모 생성자를 명시적으로 호출하고 A가 아니라 B를 출력하라고 되어있죠. A가 한 번 더 출력되는 것과 관련 없는 코드입니다.
B의 기본 생성자가 호출이 끝나고 다시 돌아온 다음에서야 나머지 코드를 출력하다가 Y가 출력됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. 최선규님.
지금 질문하신 내용은 자바의 상속과 생성자 호출 순서에 관련된 부분으로, 많은 분들이 헷갈릴 수 있는 주제입니다. 관련하여 이미 여러 번 논의된 질문과 답변이 있어, 이를 통해 설명드리겠습니다.
위 링크의 답변들은 생성자 호출 순서와 관련된 비슷한 문제에 대해 자세한 설명을 제공하고 있습니다.
질문하신 코드의 핵심을 살펴보면, A s2 = new B('Y');
라는 라인이 질문의 주된 원인입니다. 해당 만드는 구문에서는 다음과 같은 순서로 생성자가 호출됩니다:
A s1 = new A('X');
로 인해 A(char x)
생성자가 호출되어 ‘X’를 출력합니다.A s2 = new B('Y');
의 경우:B(char x)
생성자가 호출됩니다.B(char x)
내부에서 this();
로 인해 B()
기본 생성자가 호출됩니다.B()
생성자를 호출하기 앞서 super()
가 자동으로 추가되어 A()
기본 생성자가 호출되어 ‘A’를 출력합니다.B()
생성자의 본문에서 ‘B’를 출력합니다.B(char x)
의 후속 코드에서 ‘Y’를 출력합니다.이로 인해, 출력은 “XABY”가 됩니다.
다시 말씀드리자면, super()
호출은 this()
호출보다 우선합니다. 따라서 B
클래스의 기본 생성자를 호출하기 전에 A
클래스의 기본 생성자가 호출됩니다. super()
호출은 두 번 수행되지 않으며, 각각의 객체 생성 시 딱 한 번만 이루어진다는 점을 유의해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.