본문 바로가기
Backend/Java-Spring

[Java] 자식클래스 생성자에서 super()의 필요성

by 벨롭 (valop) 2023. 9. 13.

Java에서는 상속을 통해 부모 클래스의 멤버 (필드와 메소드)를 물려줄 수 있다.

 

class Person {
    String name;
    int age;
}

class Student extends Person {
    String school;
    int grade;
    
    Student (String school, int grade) {
        this.school = school;
        this.grade = grade;
    }
}


public class Main{
    public static void main(String[] args) {
        Student s1 = new Student("한국고등학교", 1);
        
       	System.out.println("이름: " + s1.name);
    }
}

 

 extends 키워드를 이용해 Person 클래스를 상속받은 Student 클래스를 만들었다. 그리고 main()에서 Student의 인스턴스를 생성하였다. 이 과정을 통해서 코드의 중복작성 없이 Student 클래스는 Person클래스의 name과 age 필드를 사용할 수 있다.

 

그런데 코드를 자세히 보면 한 가지 의문점이 든다.

분명 우리는 자식 클래스의 인스턴스만 생성했는데, 어떻게 객체를 생성하지 않은 부모클래스의 필드를 사용할 수 있을까?

 

 

 

 

 

 

사실 우리 눈에만 보이지 않을 뿐, 컴파일 과정에서는 자식 객체의 생성자가 호출될 때 부모객체를 생성한 다음 자식 객체를 생성한다.

 

class Student extends Person {
    String school;
    int grade;
    
    Student (String school, int grade) {
    	super();
        this.school = school;
        this.grade = grade;
    }
}

 

자식 클래스의 생성자의 맨 첫줄에는 부모클래스의 생성자를 호출하기 위한 super()가 숨겨져있다. 만약 개발자가 직접 추가하지 않았다면 컴파일 과정에서 자동으로 호출되며. 부모 클래스의 기본 생성자를 호출한다.

 

 

 

 

 

 

class Person {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

만약 위 코드처럼 부모클래스에 기본 생성자가 없다면 어떻게 될까? 

 

 

arguments가 없기 때문에 컴파일 에러가 발생한다. 그래서 부모클래스가 기본 생성자를 가지고 있지 않을  경우, 자식 클래스의 생성자에 직접 super(파라미터) 를 추가해야한다.

 

class Student extends Person {
    String school;
    int grade;
    
    Student (String name, int age, String school, int grade) {
    	super(name, age);
        this.school = school;
        this.grade = grade;
    }
}