카테고리 없음

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

VSFe 2021. 3. 8. 00:00
인터페이스는 구현하는 쪽을 생각해 설계하라!

기존에 존재하는 인터페이스에 메소드를 추가하면 매우 높은 확률로 컴파일 오류가 날 것이다. 그것을 구현하는 클래스마다 해당 메소드를 몽땅 구현해야하기 때문이다!

앞에서 디폴트 메소드를 배웠기에, 그것을 사용하면 되는거 아니냐고 할 수 있지만 현실적으로 모든 메소드가 디폴트 메소드가 될 수 없기 때문에... 또한 디폴트 메소드는 구현 클래스에 대한 정보 없이 상위 레벨에서 작성되는 부분이기 때문에, 구현 클래스에서 정확히 작동할 것이라는 보장도 없다.

자바 8부터는 람다식을 활용하기 위해 디폴트 메소드들이 많이 추가되었지만, 그걸 보고 우리도 디폴트 메소드를 막 만들어도 된다고 생각하면 큰일난다! 이유는 윗 문단에서 적어놨고...

심지어 자바 라이브러리에 있는 디폴트 메소드들도 모든 상황을 잘 반영하는 것은 아니다! 그래서 이것을 보정하기 위해서 구현한 인터페이스의 디폴트 메소드를 재정의하고 다른 메소드를 하나 더 만들어서 해당 메소드 호출전 필요한 작업 (ex. 동기화 등) 을 수행하도록 만들었다.

문제는 해당 부분이 자바 8부터 생겨난 만큼, 이전에 해당 인터페이스를 받는 서드파티 코드의 경우 위에서 서술한 작업을 진행하지 않은 경우가 많다! 결국 기존에 존재하는 인터페이스에 메소드를 추가하는 작업은 신중해야 한다.

결론만 말하면, 디폴트 메소드라는 도구는 매우 훌륭하지만, 결국 인터페이스를 설계하는 과정에서 신경쓸 것이 많다! 물론 새로운 인터페이스를 만드는 과정에서 사용하는 것이라면 아주 유용한 수단일지 몰라도, 기존 클래스에 추가하는 것이라면...

결국 릴리즈 전에 테스트를 거치는게 제일 이롭다. 수많은 개발자가 인터페이스를 다양한 방식으로 구현할테니, 인터페이스를 설계하는 입장에선 최소 3가지 이상의 다양한 방법으로 인터페이스를 구현해 보아야 한다.