[Why]
- 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 소개했다.
- 디폴트 메서드를 선언하면, 인터페이스 구현 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다.
- 하지만 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다.
- e.g.) 자바 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가되었다. 주로 람다를 활용하기 위해서다.
- 디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다.
[How]
- 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다.
- 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아님을 명심해야 한다.
이런 형태로 인터페이스를 변경하면 반드시 기존 클라이언트를 망가뜨리게 된다. - 새로운 인터페이스라면 릴리스 전에 반드시 테스트를 거쳐야 한다.
'독서찰기(讀書札記) > 이펙티브 자바' 카테고리의 다른 글
[아이템 23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2022.02.05 |
---|---|
[아이템 22] 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2022.02.05 |
골격 구현(skeletal implementation) 클래스란? (0) | 2022.02.04 |
[아이템 20] 추상 클래스보다는 인터페이스를 우선하라 (0) | 2022.02.04 |
[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. (0) | 2022.01.25 |