반응형
아이템 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라
자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성은 아주 낮기 때문이다.
자바 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가되었다. 주로 람다를 활요하기 위해서다. 자바 라이브러리의 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상황에서 잘 작동한다. 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운 법이다.
디폴트 메서드는 (컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다. 흔한 일은 아니지만, 일어나지 않으리라는 보장도 없다.
디폴트 메서드라는 도구가 생겼더라도 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다. 디폴트 메서드로 기존 인터페이스에 새로운 메서드를 추가하면 커다란 위험도 딸려 온다.
인터페이스를 릴리스한 후라도 결함을 수정하는 게 가능한 경우도 있겠지만, 절대 그 가능성에 기대서는 안 된다.
핵심 정리
모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기는 어려우며, 디폴트 메서드라는 도구가 생겼더라도 인터페이스를 설계할 때는 세심한 주의를 기울여야 한다.
반응형
'언어 > JAVA' 카테고리의 다른 글
[Effective Java] 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2020.03.20 |
---|---|
[Effective Java] 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2020.03.19 |
[Effective Java] 추상 클래스보다는 인터페이스를 우선하라 (0) | 2020.03.18 |
[Effective Java] 상속을 고려해 설계하고 문서화하라. 그렇지 않았다면 상속을 금지하라 (0) | 2020.03.18 |
[Effective Java] 상속보다는 컴포지션을 사용하라 (0) | 2020.03.17 |