문제
다음 Java 코드의 실행 결과를 쓰시오.
Javaabstract class Animal { String name = "Animal"; abstract String sound(); String getName() { return name + "-Base"; } } interface Pet { String name = "Pet"; default String getName() { return name + "-Interface"; } } class Dog extends Animal implements Pet { String name = "Dog"; String sound() { return "Woof"; } String getName() { return super.name + "-" + Pet.super.getName(); } } public class Main { public static void main(String[] args) { Animal a = new Dog(); Pet p = (Pet) a; System.out.println(a.name + " " + p.name + " " + a.getName()); } }
정답
Animal Pet Animal-Pet-Interface
Animal Pet Animal-Pet-InterfaceAnimalPetAnimal-Pet-Interface
해설
- a.name: Animal 타입으로 선언되어 정적 바인딩으로 "Animal" 필드 참조
- p.name: Pet 인터페이스 타입으로 캐스팅되어 인터페이스 상수 "Pet" 참조
- a.getName(): Dog 클래스에서 오버라이딩된 메서드가 동적 바인딩됨. super.name은 Animal의 "Animal" 필드, Pet.super.getName()은 인터페이스의 default 메서드로 "Pet-Interface" 반환하여 "Animal-Pet-Interface"가 됨