문제
다음 Java 코드의 실행 결과를 쓰시오.
Javainterface Calculator { int BASE = 10; default int multiply(int x) { return x * BASE; } } interface Advanced extends Calculator { int BASE = 100; default int multiply(int x) { return x * BASE + 5; } } class MyCalc implements Advanced { int BASE = 1000; public int multiply(int x) { return x * BASE; } } public class Main { public static void main(String[] args) { Calculator c = new MyCalc(); Advanced a = new MyCalc(); System.out.println(c.BASE + " " + a.BASE + " " + c.multiply(2)); } }
정답
10 100 2000
10100200010 100 2000
해설
인터페이스 필드는 static final이므로 정적 바인딩됩니다. c.BASE는 Calculator의 10, a.BASE는 Advanced의 100을 참조합니다. 메서드는 동적 디스패치로 MyCalc의 multiply가 호출되어 2 * 1000 = 2000이 반환됩니다. 인터페이스의 상수는 컴파일 타임에 결정되지만, 클래스 필드와 메서드는 런타임에 실제 객체 타입에 따라 결정됩니다.