7.3 부모 생성자 호출 (super)
자바에서 자식 객체를 생성하면, 기묘하게도 부모 객체가 먼저 생성됩니다.
내가 new Child()를 했는데, 왜 Parent가 먼저 만들어질까요?
💡 핵심 비유: 2층 집 짓기
“1층(부모)을 짓지 않고 2층(자식)을 짓는 건 불가능하다.” 자식 객체는 부모 객체라는 기반(Foundation) 위에 만들어집니다.
1. super() - 부모를 부르는 주문
모든 생성자의 첫 줄에는 super()라는 코드가 숨어 있습니다.
이것은 “부모님 먼저 생성되세요!”라고 호출하는 명령어입니다.
public class Child extends Parent {
public Child() {
// 개발자가 안 적으면 컴파일러가 몰래 적어줌!
super();
System.out.println("자식 생성 완료");
}
}
[실행 순서]
new Child()호출Child생성자 진입 ->super()만남Parent생성자로 이동 -> 부모 생성 완료- 다시
Child로 돌아옴 -> 자식 생성 완료
2. 부모에게 매개변수가 필요하다면?
만약 부모 클래스에 기본 생성자(매개변수 없는 거)가 없고, 매개변수가 있는 생성자만 있다면?
컴파일러는 super()를 자동으로 못 넣어줍니다. (어떤 값을 넣어야 할지 모르니까요!)
이때는 개발자가 직접 super(값)을 넣어줘야 합니다.
예제: 사람(이름 필수) -> 학생
Person.java (부모)
public class Person {
String name;
// 이름 없이는 사람을 만들 수 없다!
public Person(String name) {
this.name = name;
}
}
Student.java (자식)
public class Student extends Person {
public Student(String name) {
// super(); // ❌ 에러! (부모는 이름 없이 생성 불가)
super(name); // ✅ OK! (받은 이름을 부모에게 전달)
}
}
3. 예제 코드: 원리와 동작
Main.java
public class Main {
public static void main(String[] args) {
System.out.println("=== 학생 객체 생성 시작 ===");
Student s = new Student("홍길동");
System.out.println("=== 학생 객체 생성 끝 ===");
}
}
실행 결과
=== 학생 객체 생성 시작 ===
Person(홍길동) 생성자 실행 (1층 공사 완료)
Student 생성자 실행 (2층 공사 완료)
=== 학생 객체 생성 끝 ===
서브목차