7-3. 다음의 코드는 컴파일하면 에러가 발생한다. 그 이유를 설명하고 에러를 수정하기 위해서는 코드를 어떻게 바꾸어야 하는가?
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
// (구현)
Product(int price) {
this.price = price;
bonusPoint = (int) (price / 10.0);
}
}
class Tv extends Product {
Tv() {
}
public String toString() {
return "Tv";
}
}
class Exercise7_3 {
public static void main(String[] args) {
Tv t = new Tv();
}
}
문제를 푸는데는 지장이 없었다. 개념적인 부분이라 헷갈린 것도 있고 해서 이렇게 올리는거다.
답은
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
// (구현)
Product () {
// 부모 클래스에 기본 생성자를 만들어 준다.
}
Product(int price) {
this.price = price;
bonusPoint = (int) (price / 10.0);
}
}
class Tv extends Product {
Tv() {
// super(1000); // 자식 클래스에서 인스턴스를 생성할 때 기본 생성자가 호출 되어야 한다. 그래서 조상의 생성자를 호출시킴!!
}
public String toString() {
return "Tv";
}
}
class Exercise7_3 {
public static void main(String[] args) {
Tv t = new Tv();
}
}
부모 클래스인 Product에 기본 생성자를 만들어 줌으로써 문제를 해결 가능하고 자식 클래스에서 인스턴스를 생성할 때 기본생성자가 호출 되어야 한다. 그래서 조상의 생성자를 호출시키는 메서드
super(); 메서드를 넣었다. 하지만, 정작 중요한건 그냥 답만 맞고 내가 이해를 못한거다. 왜 그런지 말이다.
자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 그래서 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있다. 이 때, 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.
조상 클래스의 호출은 클래스의 상속관계를 올라가면서 계속 반복되고 마지막으로 모든 클래스의 최고 조상인 Object 클래스의 생성자 Object()까지 가서야 끝이 난다.