코드를 작성하고 실행해 보면 각 유닛의 이동 방향과 속도 정보가 모두 잘 표시됩니다. 특히 지상 유닛은 이동한다고 표현하고, 공중 유닛은 날아간다고 표현하는 것을 볼 수 있습니다.
그런데 실행결과처럼 나오면 공중 공격 유닛인 우주 순양함이 지상 유닛 이동에 포함돼 보입니다. 또한, 많은 지상 유닛과 공중 유닛을 이동할 때마다 지상 유닛인지 공중 유닛인지 구분해 move()와 fly() 메서드를 적용하는 것은 너무 번거롭네요. fly() 메서드를 사용할 때 유닛의 이름 정보까지 전달해야 하는 불편함도 있고요. 이런 경우에 메서드 오버라이딩(메서드 재정의, method overriding)을 사용할 수 있습니다. 메서드 오버라이딩은 상속 관계일 때 자식 클래스에서 부모 클래스에 정의한 메서드를 그대로 사용하지 않고 같은 이름으로 메서드를 새롭게 정의해 사용하는 방법입니다.
FlyableAttackUnit 클래스가 상속받는 부모 클래스는 AttackUnit 클래스와 Flyable 클래스입니다. 이 중에서 AttackUnit 클래스는 Unit 클래스를 상속받으므로 결국 FlyableAttackUnit 클래스에서도 Unit 클래스의 모든 내용을 그대로 사용할 수 있습니다.
여기서는 Unit 클래스에 정의한 move() 메서드를 FlyableAttackUnit 클래스에서 오버라이딩해 보겠습니다. 메서드 오버라이딩할 때는 부모 클래스에 정의한 메서드를 그대로 자식 클래스에서 동일한 이름과 전달값으로 정의하고, 메서드 동작만 원하는 대로 변경하면 됩니다.