TIL 2023-01-25 항해99 D+17

황원준·2023년 1월 25일

hanghae99

목록 보기
17/24

1. 문제점

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();
    }
}

문제를 푸는데는 지장이 없었다. 개념적인 부분이라 헷갈린 것도 있고 해서 이렇게 올리는거다.

2. 시도 해본 것들

답은

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(); 메서드를 넣었다. 하지만, 정작 중요한건 그냥 답만 맞고 내가 이해를 못한거다. 왜 그런지 말이다.

3. 해결법

자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 그래서 자손 클래스의 인스턴스가 조상 클래스의 멤버들을 사용할 수 있다. 이 때, 조상 클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.

4. 알게 된 점

조상 클래스의 호출은 클래스의 상속관계를 올라가면서 계속 반복되고 마지막으로 모든 클래스의 최고 조상인 Object 클래스의 생성자 Object()까지 가서야 끝이 난다.

profile
좋은 개발자가 되기 위해 노력 하는 개린이

0개의 댓글