더북(TheBook)

방금 두 인터페이스 사이의 이름 충돌을 설명했다. 이제 슈퍼클래스를 확장하면서 인터페이스 하나를 구현하여, 이 둘에서 같은 메서드를 상속하는 클래스를 고려해보자. 예를 들어, Person은 클래스고 Student는 다음과 같이 정의했다고 하자.


class Student extends Person implements Named { ... }


 

이 경우에는 오직 슈퍼클래스의 메서드만 중요하며, 인터페이스의 모든 디폴트 메서드는 단순히 무시된다. 이 예제에서 StudentPerson에서 getName 메서드를 상속하며, Named 인터페이스에서 getName의 디폴트 구현 제공 여부는 아무 상관이 없다. 이것이 바로 ‘클래스 우선class wins’ 규칙이다.

‘클래스 우선’ 규칙은 자바 7과 호환성을 보장한다. 인터페이스에 디폴트 메서드를 추가해도 해당 메서드가 존재하기 전부터 동작하던 코드에는 아무런 영향을 주지 않는다.

Caution

Object 클래스에 있는 메서드 중 하나를 재정의하는 디폴트 메서드는 만들 수 없다. 예를 들어, List 같은 인터페이스에서는 toString이나 equals에 해당하는 디폴트 메서드가 매력적인 방법일 수 있지만 정의할 수 없다. ‘클래스 우선’ 규칙의 결과로, 이러한 메서드는 결코 Object.toString이나 Object.equals보다 우선할 수 없다.

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