필드/메서드 다형성은 프로그램의 유연성을 높여주며, 새로운 타입을 추가하거나 기존 타입을 변경할 때, 코드 수정을 최소화할 수 있도록 한다.
필드 다형성은 클래스의 필드(변수)가 다양한 타입의 객체를 참조할 수 있는 성질이다.
Car car = new Car();
car.tire = new Tire(); // Car 객체의 tire 필드에 Tire 객체를 할당
car.run(); // Tire 객체의 run 메서드를 실행
car.tire = new HankookTire(); // tire 필드를, Tire 클래스를 상속받은 HankookTire 객체로 재할당
car.run(); // HankookTire 객체의 run 메서드를 실행
car.tire = new KumhoTire(); // tire 필드를, Tire 클래스를 상속받은 KumhoTire 객체로 재할당
car.run(); // KumhoTire 객체의 run 메서드를 실행
Car 클래스의 tire 필드는 Tire, HankookTire, KumhoTire 등 다양한 타입의 타이어 객체를 참조할 수 있다.HankookTire, KumhoTire 객체가 Tire 객체를 상속받았기 때문매개변수 다형성은 메서드가 다양한 타입의 객체를 매개변수로 받을 수 있게 해주는 성질을 말한다.
public class Driver {
public void drive(Vehicle vehicle) { // 매개변수로 Vehicle 객체를 입력받는다.
vehicle.run();
}
}
Driver driver = new Driver();
driver.drive(new Vehicle()); // Vehicle 객체를 매개변수로 drive 메서드 호출
driver.drive(new Taxi()); // Vehicle 객체를 상속받은, Taxi 객체를 매개변수로 drive 메서드 호출
driver.drive(new Bus()); // Vehicle 객체를 상속받은, Bus 객체를 매개변수로 drive 메서드 호출
drive 메서드는 Vehicle 타입의 매개변수를 받게 되어 있다.Vehicle 클래스를 상속받는 Taxi나 Bus와 같은 하위 클래스의 인스턴스도 Vehicle 타입으로 간주되므로, 이들도 drive 메서드의 매개변수로 전달될 수 있다.