[Effective Java] item21 - 인터페이스는 구현하는 쪽을 생각해 설계하라

신민철·2023년 5월 3일
1

Effective Java

목록 보기
21/23
post-thumbnail

자바 8 전에는 인터페이스에 메소드를 추가할 방법이 없었다. 그런데 디폴트 메소드라는 방법이 생겼는데 이것을 사용하면 되지 않을까라는 물음이 생길 수 있다. 하지만, 대부분의 메소드가 디폴트 메소드가 아니기에 구현체에 대한 정보 없이 인터페이스에서 적히는 것이기 때문에 명확히 작동되리라는 보장이 없다.

자바 8에서는 람다식을 적용하기 위해 기존 컬렉션을 위한 인터페이스에 메소드들이 많이 추가되었는데, 그렇지만 범용성이 있는 메소드였기 때문에 에러 없이 대부분 잘 동작했다. 하지만, 우리도 똑같이 기존 인터페이스에 디폴트 메소드를 추가해도 된다는 뜻은 아니다.

자바 라이브러리에 있는 디폴트 메소드도 구현체의 상황을 잘 모르기에 인터페이스의 디폴트 메소드를 재정의하고 다른 메소드에서는 호출 전에 필요 작업(ex. 동기화)을 수행하도록 만들었다.

따라서 디폴트 메소드를 인터페이스에 적용하는 것은 매우 신중을 기해야 하는 일이다!

디폴트 메소드는 인터페이스를 기존의 것에서 확장시킬 수 있는 새로운 도구이지만 설계할 때는 세심한 주의가 요구된다! 특히 기존의 것에 추가하는 것은 더더욱!

이런 것을 방지하기 위해서는 릴리즈 전에 테스트하는 것이 가장 확실한 방법이다! 인터페이스를 서로 다른 최소 3가지 이상의 방법으로 구현해보고 릴리즈하는 것이 좋을 것이다.

0개의 댓글