Child() 호출 시 다른 생성자로 위임했으므로 Child()에서 super() 는 암시적으로 호출되지 않음
안녕하세요!
질문하신 내용을 보니 상속과 다형성을 깊게 공부하고 계신 것 같습니다.
질문해주신 내용은 "생성자 위임(this())"과 "부모 생성자 호출(super())"의 관계에 관한 것입니다.
1. 현재 코드 상황 : (생성자 위임이 없는 경우)
class Child extends Parent {
void show( ) { System.out.println("child"); }
}
현재 Child 클래스 안에는 개발자가 직접 작성한 생성자가 아예 없습니다. 이 경우 자바 컴파일러는 아무 일도 하지 않는 기본 생성자(Default Constructor)를 몰래 만들어줍니다.
즉, 컴파일러에 의해 아래와 같이 코드가 자동 완성되어 동작합니다.
class Child extends Parent {
Child() {
super(); // 부모(Parent)의 기본 생성자를 암시적으로 무조건 호출함!
}
void show( ) { System.out.println("child"); }
}
따라서 현재 주어진 코드에서는 new Child()를 실행할 때, 내부적으로 무조건 부모인 Parent()의 생성자가 호출됩니다.
2. 질문하신 상황 : ( this()를 통해 다른 생성자로 위임한 경우 )
질문자님이 말씀하신 "Child() 호출 시 다른 생성자로 위임했으므로..." 라는 상황은 현재 코드에는 없지만, 아래와 같이 코드를 짰을 때를 말씀하시는 것 같습니다.
class Child extends Parent {
// 생성자 1
Child() {
this(10); // 내 클래스의 다른 생성자(생성자 2)로 위임!
// ❌ 컴파일러가 여기에 super()를 암시적으로 삽입하지 않습니다.
}
// 생성자 2
Child(int num) {
// ✔️ 대신, 컴파일러가 여기에 super()를 암시적으로 삽입합니다.
System.out.println("숫자: " + num);
}
}
[결론]
this()를 사용하여 다른 생성자로 책임을 넘긴 그 생성자 내부(Child())에는 컴파일러가 암시적으로 super()를 넣지 않는 것이 맞습니다. (생성자의 첫 줄에는 this()나 super() 중 하나만 올 수 있기 때문입니다.)
하지만, 호출을 위임받은 최종 도착지 생성자(Child(int num))에는 개발자가 명시적으로 super()를 적어주지 않는 이상, 컴파일러가 무조건 맨 윗줄에 super()를 몰래 삽입합니다.
자바의 상속 법칙상, 자식 객체가 태어날 때 부모 객체는 무조건 먼저 태어나야(초기화되어야) 하기 때문입니다. 어떤 경로를 돌고 돌더라도(this()를 여러 번 쓰더라도), 결국 마지막에 실행되는 생성자에서 부모의 생성자(super())는 반드시 한 번은 호출되게 되어 있습니다.
따라서, super()의 호출 시점이 다른 생성자로 넘어갔을 뿐, 부모 생성자가 호출되지 않는 것은 아닙니다.
주어진 코드에는 "다른 생성자 위임"이 없으므로 super()가 암시적으로 잘 호출됩니다.
만약 질문하신 대로 위임을 했다면, 위임한 곳(this())에서는 super()가 안 불리지만, 위임을 받은 최종 생성자에서는 반드시 super()가 호출됩니다.
오늘도 즐거운 하루 되세요.
-
관리자2026-04-17 09:32:10
안녕하세요!
질문하신 내용을 보니 상속과 다형성을 깊게 공부하고 계신 것 같습니다.
질문해주신 내용은 "생성자 위임(this())"과 "부모 생성자 호출(super())"의 관계에 관한 것입니다.
1. 현재 코드 상황 : (생성자 위임이 없는 경우)
class Child extends Parent {
void show( ) { System.out.println("child"); }
}
현재 Child 클래스 안에는 개발자가 직접 작성한 생성자가 아예 없습니다. 이 경우 자바 컴파일러는 아무 일도 하지 않는 기본 생성자(Default Constructor)를 몰래 만들어줍니다.
즉, 컴파일러에 의해 아래와 같이 코드가 자동 완성되어 동작합니다.
class Child extends Parent {
Child() {
super(); // 부모(Parent)의 기본 생성자를 암시적으로 무조건 호출함!
}
void show( ) { System.out.println("child"); }
}
따라서 현재 주어진 코드에서는 new Child()를 실행할 때, 내부적으로 무조건 부모인 Parent()의 생성자가 호출됩니다.
2. 질문하신 상황 : ( this()를 통해 다른 생성자로 위임한 경우 )
질문자님이 말씀하신 "Child() 호출 시 다른 생성자로 위임했으므로..." 라는 상황은 현재 코드에는 없지만, 아래와 같이 코드를 짰을 때를 말씀하시는 것 같습니다.
class Child extends Parent {
// 생성자 1
Child() {
this(10); // 내 클래스의 다른 생성자(생성자 2)로 위임!
// ❌ 컴파일러가 여기에 super()를 암시적으로 삽입하지 않습니다.
}
// 생성자 2
Child(int num) {
// ✔️ 대신, 컴파일러가 여기에 super()를 암시적으로 삽입합니다.
System.out.println("숫자: " + num);
}
}
[결론]
this()를 사용하여 다른 생성자로 책임을 넘긴 그 생성자 내부(Child())에는 컴파일러가 암시적으로 super()를 넣지 않는 것이 맞습니다. (생성자의 첫 줄에는 this()나 super() 중 하나만 올 수 있기 때문입니다.)
하지만, 호출을 위임받은 최종 도착지 생성자(Child(int num))에는 개발자가 명시적으로 super()를 적어주지 않는 이상, 컴파일러가 무조건 맨 윗줄에 super()를 몰래 삽입합니다.
자바의 상속 법칙상, 자식 객체가 태어날 때 부모 객체는 무조건 먼저 태어나야(초기화되어야) 하기 때문입니다. 어떤 경로를 돌고 돌더라도(this()를 여러 번 쓰더라도), 결국 마지막에 실행되는 생성자에서 부모의 생성자(super())는 반드시 한 번은 호출되게 되어 있습니다.
따라서, super()의 호출 시점이 다른 생성자로 넘어갔을 뿐, 부모 생성자가 호출되지 않는 것은 아닙니다.
주어진 코드에는 "다른 생성자 위임"이 없으므로 super()가 암시적으로 잘 호출됩니다.
만약 질문하신 대로 위임을 했다면, 위임한 곳(this())에서는 super()가 안 불리지만, 위임을 받은 최종 생성자에서는 반드시 super()가 호출됩니다.
오늘도 즐거운 하루 되세요.
-
지*성2026-04-17 17:26:40그러니까 해설이 틀렸다는 말입니다. 해설은 인자가 없는 생성자에서도 super() 를 호출하는 것으로 해설하고 있습니다