더북(TheBook)

Employee 클래스가 Person 인터페이스의 기본 메서드를 상속받을 수 있을까? 언뜻 보면 그럴 수 있을 것도 같다. 하지만 Identified.getId가 수행할 동작을 Person.getId 메서드가 실제로 하는지 컴파일러가 어떻게 알 수 있을까? 예를 들어 Person.getId는 사람의 ID 번호가 아닌 프로이트의 이드(Freudian id) 레벨을 반환할 수도 있다.3

자바 설계자들은 안전성과 일관성을 따르기로 했다. 두 인터페이스가 어떻게 충돌하는지는 중요하지 않다. 적어도 한 인터페이스에서 구현을 제공하면 컴파일러는 오류를 보고하며, 모호성을 해결하는 일은 프로그래머의 책임이다.

Note ≣

두 인터페이스 모두 공유 메서드의 기본 구현을 제공하지 않으면 충돌이 일어나지 않는다. 이 경우 구현 클래스에 메서드를 구현하거나 메서드를 구현하지 않고 클래스를 abstract로 선언하면 된다.


Note ≣

클래스가 슈퍼클래스를 확장(4장 상속과 리플렉션 참고)하고 인터페이스를 구현해서 두 인터페이스가 모두 같은 메서드를 상속받을 때는 규칙이 더 간단하다. 이때 슈퍼클래스의 메서드만 중요하고 인터페이스의 기본 메서드는 무시된다. 실제로 이런 사례가 인터페이스 간 충돌보다 일반적이다. 4장에서 자세히 설명한다.


3 이드(id)는 지그문트 프로이트(Sigmund Freud)가 자아(ego), 초자아(superego)와 더불어 정신을 구성하는 이론적 요소로 정의한 정신분석학 용어다. 태어나면서부터 존재하는 본능적 충동의 원천을 의미한다. 영어의 it에 해당하는 라틴어이며, 원어는 독일어 에스(es)다. 결국 본문에서 말하고 싶은 말은 메서드의 이름만으로는 Person의 기본 메서드인 getIdEmployee 객체에 맞는 동작을 수행하는지 컴파일러는 알 수 없다는 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.