현실에서 상속의 의미는 부모가 자식에게 물려주는 것입니다. 프로그래밍 세계에서는 자식이 부모를 선택합니다.
현실에서 부모가 없으면 자식도 없습니다. 자바에서도 부모 객체가 먼저 생성되며 그 다음 자식 객체가 생성이 됩니다.
ApplePhone extends Phone { ... }
ApplePhone iphone = new ApplePhone
예를들어 ApplePhone 객체만 생성하는 것처럼 보입니다. 하지만, 실제 부모 객체인 Phone 객체가 먼저 생성되고 이후 자식 객체인 Iphone 객체가 생성됩니다.
모든 객체는 클래스의 생성자를 호출해야만 합니다. 부모 객체도 똑같이 생성자를 호출해야 합니다. 그럼 부모 객체를 생성하기 위해서는 부모 생성자를 어디에서 호출해야 하나요? 바로 자식 생성자에 숨어 있습니다. 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출됩니다.
예를들어 생성자가 명시적으로 선언되지 않았다면 컴파일러는 다음과 같은 기본 생성자를 생성하게 됩니다.
public ApplePhone() { super(); }
첫 줄에 super(); 추가된 모습을 볼 수 있습니다. super()는 부모의 기본 생성자를 호출합니다. 즉 Phone 클래스의 다음 생성자를 호출하게 됩니다.
public Phone() { ... }
Phone.java 소스 코드에서 ApplePhone의 생성자가 선언되어 있지는 않지만 컴파일러에 의해 기본 생성자가 만들어져서 문제 없이 실행됩니다. 명시적으로 직접 생성자를 선언하고 싶다면 아래와 같이 명시할 수 있습니다.
자식클래스 (매개변수, ... ) {
super( 매개값, ... );
}
super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출합니다. 매개값 타입과 일치하는 부모 생성자가 없을 경우에는 컴파일 오류가 발생합니다. super(매개값, ...)가 생략되면 컴파일러에 의해 super()가 자동적으로 추가되어 부모의 기본 생성자가 존재해야 합니다. 부모 클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위한 super(매개값, ...)을 명시적으로 호출해야 합니다. super(매개값, ...)는 반드시 자식 생성자 첫 줄 위에 위치해야 합니다.
그렇지 않는다면 컴파일 에러가 발생하게 됩니다.
// 부모클래스
public class Phone {
public String name;
public String color;
public Phone(String name, String color) {
this.name = name;
this.color = color;
}
}
// 자식클래스
public class ApplePhone extends Phone {
public int phoneId;
public ApplePhone(String name, String color, int phoneId) {
super(name, phoneId); // 부모 생성자 호출
this.phoneId = phoneId;
}
}
Phone 클래스는 기본 생성자고 name, color을 매개값으로 받아 객체를 생성시키는 생성자만 있습니다. 그렇기 때문에 Phone을 상속하는 자식클래스는 생성자에 super(name, color)로 Phone 클래스의 생성자를 호출해야 합니다.
ApplePhone 클래스의 생성자는 name, color, phoneId를 매개값으로 받아 name과 color를 다시 부모 생성자를 호출하기 위해 매개값으로 넘겨줍니다.
ApplePhone 클래스 생성자 안에 super(name, color)은
Phone 생성자인 Phone(name, color)를 호출합니다.
그리고 만약 부모 생성자 호출 부분을 주석처리하면
Implicit super consturctor Phone() is undefined. Must explicitly invoke another constructor" 라는 컴파일 오류가 발생합니다. 이는 부모의 기본 생성자가 없어 명시적으로 호출하라는 의미입니다.
매핑 어노테이션 (@Enumerated, @Temporal, @Lob, @Transient, @Access) (0) | 2024.01.12 |
---|---|
엔티티 매핑 (@Table, Sequence) (0) | 2024.01.11 |
어노테이션 (메타데이터 리플랙션 @Retention @Target) (0) | 2024.01.09 |
열거 타입 정리 (JAVA) (1) | 2024.01.08 |
JVM 튜닝 방법 (Jrokit) (1) | 2024.01.07 |
댓글 영역