다형성 - 역할과 구현 예제 2
새로운 Model3 차량을 추가해야 하는 요구사항이 들어왔습니다.
이 요구사항을 맞추려면 기존에 Driver
코드를 많이 변경해야 합니다.
드라이버는 K3Car
도 운전할 수 있고, Model3Car
도 운전할 줄 있어야 합니다.
참고로 돌을 동시에 운전하는 것은 아닙니다.
package poly.car0;
public class CarMain0 {
public static void main(String[] args) {
Driver driver = new Driver();
K3Car k3Car = new K3Car();
driver.setK3Car(k3Car);
driver.drive();
// 추가
Model3Car model3Car = new Model3Car();
driver.setK3Car(null);
driver.setModel3Car(model3Car);
driver.drive();
}
}
- K3를 운전하던 운전자가 Model3로 차량을 변경해서 운전하는 코드입니다.
-
driver.setK3Car(null)
을 통해서 기존K3Car
의 참조를 제거합니다. -
driver.setModel3Car(model3Car)
를 통해서 새로운model3Car
의 참조를 추가합니다. -
driver.drive()
를 호출합니다.
실행 결과
자동차를 운전합니다.
K3Car.startEngine
K3Car.pressAccelerator
K3Car.offEngine
자동차를 운전합니다.
Model3Car.startEngine
Model3Car.pressAccelerator
Model3Car.offEngine
여기서 새로운 차량을 추가한다면 또 다시 Driver
코드를 많이 변경해야 합니다.
만약 운전할 수 있는 차량의 종류가 계속 늘어난다면 점점 더 변경해야 하는 코드가 많아질 것입니다.
- “이 코드의 본질적인 문제는 자동차가 늘어나는데, 자동차 운전자의 코드를 계속해서 뜯어 고쳐야한다는 것 입니다.”
- 이런 문제가 생기는 이유는 “역할과 구현을 분리하지 않았기 때문입니다”.