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;
}
}
'Backend > Java-Spring' 카테고리의 다른 글
[알고리즘] 알고리즘 성능을 분석하는 상환 분석 (Amortized Analysis) (1) | 2023.11.22 |
---|---|
[Java] 추상클래스와 인터페이스의 비교 (2) | 2023.10.17 |
[Java] 연속된 부분 배열의 최대 합 구하기 (1) | 2023.10.08 |
[Java] public static void main(String[] args) {} 에 대한 분석 (0) | 2023.09.08 |
[Java] Math과 Random의 비교로 살펴보는 static의 역할 (0) | 2023.09.06 |