Effective Java - 아이템 21: 인터페이스는 구현하는 쪽을 생각해 설계하라

최대 1 분 소요

디폴트 메서드

디폴트 메서드(default method)를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 ‘삽입’될 뿐이다. 그로인해 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운 법이다.

디폴트 메서드의 위험성

디폴트 메서드로 기존 인터페이스에 새로운 메서드를 추가하면 커다란 위험도 딸려 온다. 디폴트 메서드는(컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다. 인터페이스에 내재된 결함이 이를 포함한 API에 어떤 재앙을 몰고 올지 알 수 없다.

기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다. 추가하려는 디폴트 메서드가 기존 구현체들과 충돌하지 않을지 심사숙고해야 함도 당연하다. 반면, 새로운 인터페이스를 만드는 경우라면 표준적인 메서드 구현을 제공하는 데 아주 유용한 수단이며, 그 인터페이스를 더 쉽게 구현해 활용할 수 있게끔 해준다. 한편, 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아님을 명심해야 한다.

릴리스 전에 테스트를 반드시 해라

새로운 인터페이스라면 릴리스 전에 반드시 테스트를 거쳐야 한다. 릴리스하기 전에 결함을 찾아야 한다. 인터페이스를 릴리스 한 후라도 결함을 수정하는게 가능한 경우도 있겠지만, 그 가능성에 기대서는 안 된다.

댓글남기기