문제
다음 Java 코드의 출력 결과는?
Javapublic class Main{ public static class Parent { public int x(int i) { return i + 2; } public static String id() { return "P";} } public static class Child extends Parent { public int x(int i) { return i + 3; } public String x(String s) { return s + "R"; } public static String id() { return "C"; } } public static void main(String[] args) { Parent ref = new Child(); System.out.println(ref.x(2) + ref.id()); } }
① 4P ② 5P ③ 5C ④ 4C
정답
2번
해설
정답: 2. 인스턴스 메서드 x(int)는 오버라이딩되어 Child의 메서드가 실행되므로 2+3=5이다. static 메서드 id()는 참조 타입 Parent 기준으로 호출되어 P가 붙는다.
오답 풀이
- 1번: x(int)를 Parent 기준으로 계산한 값이다.
- 2번: 동적 바인딩과 static 메서드 숨김 규칙을 모두 반영한 결과이다.
- 3번: static 메서드도 동적 바인딩된다고 잘못 본 결과이다.
- 4번: x와 id 모두 잘못 판단한 값이다.
보충 개념 Java에서 오버라이딩된 인스턴스 메서드는 실제 객체 타입 기준으로 실행된다. static 메서드는 오버라이딩이 아니라 숨김이며 참조 타입 기준으로 결정된다.