문제
다음 Java 코드의 실행 결과를 쓰시오.
Javainterface Device { String brand = "Generic"; default String getBrand() { return "Default"; } int getPower(); } abstract class Electronics implements Device { String brand = "Electronics"; abstract String getModel(); public String getBrand() { return this.brand + "-" + Device.super.getBrand(); } } class Laptop extends Electronics { String brand = "Laptop"; String model = "Pro"; public int getPower() { return 65; } public String getModel() { return model; } public String getBrand() { return super.brand + "-" + Device.brand + "-" + getPower(); } } public class Main { public static void main(String[] args) { Device d = new Laptop(); Electronics e = (Electronics) d; System.out.println(d.brand + "|" + e.brand + "|" + d.getBrand()); } }
정답
Generic|Electronics|Electronics-Generic-65
Generic|Electronics|Electronics-Generic-65
해설
인터페이스 필드 brand는 정적 바인딩되어 d.brand는 Device.brand인 Generic을 참조한다. 클래스 필드도 참조 변수 타입 기준으로 접근되므로 e.brand는 Electronics.brand인 Electronics를 참조한다. 반면 메서드는 동적 바인딩되어 d.getBrand()는 실제 객체인 Laptop의 getBrand()가 호출된다. super.brand는 Electronics.brand, Device.brand는 인터페이스 상수, getPower()는 65를 반환하므로 최종 결과는 Generic|Electronics|Electronics-Generic-65이다.