문제
다음 Java 코드의 실행 결과를 쓰시오.
Javaabstract class Vehicle { String name = "Vehicle"; abstract void move(); String getName() { return name; } } class Car extends Vehicle { String name = "Car"; void move() { System.out.print("drive "); } String getName() { return name; } } class Truck extends Car { String name = "Truck"; void move() { System.out.print("haul "); } } public class Main { public static void main(String[] args) { Vehicle v = new Truck(); v.move(); System.out.println(v.name + " " + v.getName()); } }
정답
haul Vehicle Car
haul Vehicle Car
해설
Vehicle v = new Truck()로 선언했을 때, v.move()는 동적 바인딩으로 실제 객체인 Truck의 move() 메서드가 호출되어 'haul '을 출력한다. v.name은 필드이므로 정적 바인딩되어 선언 타입인 Vehicle의 name 필드 값 'Vehicle'을 참조한다. v.getName()은 동적 바인딩으로 Truck의 메서드를 찾는데, Truck은 getName()을 오버라이드하지 않았으므로 상위 클래스인 Car의 getName()이 호출된다. Java에서 필드는 오버라이딩이 아닌 은닉(hiding)이므로, Car.getName() 메서드 내의 name은 Car 클래스에 선언된 name 필드 'Car'를 참조한다. 따라서 출력 결과는 haul Vehicle Car이다.