더북(TheBook)

정답

완성형 예제입니다.

 

해설

public void fill(Car car)

 

코드를 보면 메서드의 매개변수로 Car 타입만 들어가야 합니다. 그런데 실제 사용하는 코드를 보면 fill(suv)처럼 Suv 타입도 들어가고, Car 타입이 아닌데도 해당 메서드를 에러 없이 사용하고 있습니다. Suv, Truck, Bus 타입이 Car 타입으로 형변환돼서 fill 메서드를 실행하는 것입니다. 하위 타입을 상위 타입으로 형변환할 때는 묵시적으로 형변환이 일어납니다.

 

다만, fill 메서드에 인자로 Car의 하위 클래스들이 들어가면 해당 메서드 안에서 사용될 때 Car 타입으로 형변환이 일어난 상태이므로, 하위 클래스에서 추가로 정의한 부분에는 접근할 수 없음에 주의합니다.

 

 

문제 2 Car를 상속받은 Bus 클래스에는 announcements 메서드가 있습니다. 하지만 타입이 Car 타입인 경우에는 announcements 메서드가 있어도 사용할 수 없습니다. 다음 코드에서 car.announcements();에 에러가 발생합니다. 에러가 발생하지 않고 announcements(); 메서드를 사용하도록 코드를 알맞게 수정하세요.

package javaStudy;
public class CarExam {
    public static void main(String[] args) {
        Car car = new Bus();
        car.run();
        car.announcements();
    }
}
package javaStudy;
public class Car{

    public void run() {
        System.out.println("차가 달립니다.");
    }
}
package javaStudy;
public class Bus extends Car{
    public void announcements() {
        System.out.println("안내방송을 합니다.");
    }
}

 

실행결과

차가 달립니다.
안내방송을 합니다.

 

정답

((Bus)car).announcements();

 

혹은 아래처럼 사용해도 됩니다.

 

Bus bus = null;
bus = (Bus) car;
bus.announcements();

 

해설

Car를 상속받은 Bus 클래스에는 announcements() 메서드가 있습니다. 하지만 타입이 Car형이므로 announcements() 메서드를 사용할 수 없습니다. car.announcements();에서 오류가 발생합니다. 상속 관계에서 부모 타입으로 자식 타입을 사용할 수는 있으나 타입이 부모 타입일 경우에 자식이 추가로 정의한 메서드에 접근할 수 없습니다. 이때 메서드를 사용하기 위해서는 Car 타입을 Bus 타입으로 형변환해야 합니다. 하위 타입을 상위 타입으로 형변환할 때는 묵시적으로 형변환이 일어나지만, 지금처럼 반대의 경우에는 반드시 명시적으로 형변환해줘야 합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.