다음 Java 프로그램의 출력값을 쓰시오.
interface Label {
default String name() { return "I"; }
}
class Parent {
String name() { return "P"; }
String call() { return name(); }
}
class Child extends Parent implements Label {
public String name() { return super.name() + "C"; }
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.print(p.call() + ":" + ((Label) p).name());
}
}모범답안
PC:PC
풀이와 판단 근거
p의 선언형은 Parent지만 실제 객체는 Child이므로 인스턴스 메서드 name은 동적 디스패치되어 Child.name이 실행된다. Parent.call 내부의 name 호출도 같은 규칙을 적용받아 PC를 반환한다.
Label로 형 변환해 호출해도 실제 객체가 재정의한 Child.name이 선택되며, 인터페이스의 기본 메서드 I는 클래스 메서드보다 우선하지 않는다.
자주 틀리는 지점
- Parent.call 안에서는 Parent.name이 고정 호출된다고 판단
- 인터페이스로 형 변환했으므로 기본 메서드 I가 실행된다고 판단
- super.name이 Child.name을 다시 호출한다고 계산
자동 판정 방식
한글·영문 동의어와 문항별 필수 개념을 확인하며, 정답 단어가 부정되거나 반대 개념과 함께 쓰이면 자동 정답으로 확정하지 않습니다. 부분점수는 ITPASSLAB의 학습용 예상 점수입니다.