public class Car{
public void run()
}
public class OpenCar extends Car{
public void openTop()
}
Car c1 = new OpenCar();
// 참조타입 : Car, 인스턴스 : OpenCar
위의 코드를 참고하면, c1이라는 참조변수는 OpenCar인스턴스를 참조하고 있다.
즉, 부모타입으로 자식 인스턴스를 참조하고있다.
근데 왜 OpenCar c1 = new OpenCar();
라고 하면 될 것을 부모 타입으로 자식 인스턴스를 참조할까?
그 이유는 두가지가 있다.
- 부모 타입의 메서드만 사용가능하도록 하기 위해
- 부모 타입의 메서드만 사용하라고 명시하기 위해
위의 예시를 참조하면
c1.run();
c1.openTop();
run메서드는 실행할 수 있지만, openTop 메서드는 실행할 수 없다.
그렇다면 왜 이렇게 설계 돼있을까?
만약 내 오픈카를 발렛파킹을 맡긴다고 생각해보자.
근데 주차를 해주는 사람이 오픈카의 윗판을 열었다 닫았다하면서 주차를 한다고 생각해보자.
쓸모없는 짓을 하는 것이고 매우 킹받을 것이다..!
그리고 부모타입으로 자식 인스턴스를 참조하면 내가 작성한 코드를 다른 사람이 볼 때,
아~ 부모타입의 메서드만 사용할 수 있겠구나
라고 알 수 있다.