11.9 다형성 (Polymorphism)
객체지향 프로그래밍의 꽃, 다형성입니다. 인터페이스를 사용하면 프로그램을 수정하지 않고도 부품(구현 객체)을 자유롭게 교체할 수 있습니다. 이것이 자바가 가진 가장 강력한 무기입니다.
💡 핵심 비유: USB 포트와 타이어
“컴퓨터의 USB 포트(인터페이스)에는 마우스, 키보드, 카메라 등 무엇이든 꽂을 수 있다. 꽂히는 게 무엇이냐에 따라 컴퓨터의 기능이 확장된다.”
1. 필드의 다형성 (부품 교체)
자동차 클래스를 만들 때, 타이어를 HankookTire라고 딱 정해놓는 것보다, Tire 인터페이스로 선언해두면 나중에 훨씬 유연해집니다.
class Car {
// 인터페이스 타입으로 선언 (한국타이어든 금호타이어든 다 들어와!)
Tire frontTire = new HankookTire();
void run() {
frontTire.roll(); // 굴러갑니다.
}
}
나중에 성능이 더 좋은 MichelinTire가 나오면?
Car myCar = new Car();
// 코드 수정 없이 타이어만 쏙 교체!
myCar.frontTire = new MichelinTire();
2. 매개변수의 다형성 (만능 입구)
메소드의 매개변수를 인터페이스 타입으로 선언하면, 그 인터페이스를 구현한 어떤 객체든지 매개변수로 받을 수 있습니다.
// 운전자가 운전을 합니다.
void drive(Vehicle vehicle) {
vehicle.run();
}
Driver driver = new Driver();
// 버스 운전
driver.drive(new Bus());
// 택시 운전 (메소드 코드는 그대로인데, 동작이 바뀜!)
driver.drive(new Taxi());
이처럼 “하나의 코드로 다양한 실행 결과가 나오는 성질”이 바로 다형성입니다.
서브목차