본문 바로가기

Programming/JAVA

[Effective JAVA] item 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라

서론

  • 인터페이스에 메서드 추가하면 보통 컴파일 오류가 발생함
    • 왜냐면 추가된 메서드가 기존 인터페이스에 존재할 가능성이 굉장히 낮기 때문

디폴트 메서드(Default Method)

  • 인터페이스의 디폴트 메서드를 재정의 하지 않은 모든 구현 클래스에서는 디폴트 구현이 사용됨
  • 기존 인터페이스에 메서드를 추가하는 것은 어려운 일은 아니나, 기존 구현체들과 모든게 매끄럽게 연동된다는 보장은 없음
    (자바 7까지는 현 인터페이스에 새로운 메서드가 추가될 일은 영원히 없다는 가정 하에 작성되었기 때문임)
  • 자바 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가됨
    • 이는 람다를 활용하기 위해서임
    • 대부분의 자바 라이브러리에 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상황에서 잘 작동하나,
      생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드 작성은 굉장히 어려움
  • 예시. 자바 8의 Collection 인터페이스 중 removeIf 메서드
    • boolean 함수가 true를 반환하는 모든 원소를 제거함
    • Default 구현은 반복자를 이용해 순회하며 각 원소를 인수로 넣어 프레디키트를 호출하고,
      프레디키트가 true를 반환하면 반복자의 remove 메서드를 호출해 원소를 제거함
    • 이 메서드는 기본적으로 구현된 Default 메서드임
  • Default 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있음
    • 자바 8부터 컬렉션 인터페이스에 꽤 많은 디폴트 메서드를 추가하였으며, 이로 기존에 짜여진 코드가 영향을 받게 되었었음
    • 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 정말 필요한 경우가 아니라면 피해야 함
      추가하려는 디폴트 메서드가 기존 구현체들과 충돌하지 않는지 심사숙고하는 것은 굉장히 당연함
    • 반면, Default 메서드는 새로운 인터페이스를 만드는 경우 표준 메서드 구현을 제공하는 데에 아주 유용한 수단이기에 그 인터페이스 구현을 더욱 쉽게 활용할 수 있게 해줌
  • 위 나열된 내용의 핵심은 Default 메서드 도구가 생겼더라도 인터페이스 설계시 세심한 주의를 기울여야 한다는 것.
  • Default 메서드는 구현 클래스들이 동일하게 사용하는 만큼 많은 경우의 수를 고려해 개발해야 함
  • 새로운 인터페이스라면 반드시! 테스트를 거치고 릴리즈 해야 함
    • 릴리즈 후 결함 수정이 가능하긴 하지만, 이에 기대서는 안 됨.
    • 개발의 언어가 아닌 일상의 언어로 이야기하자면, 한 번에 끝낼거 두 번에 걸쳐서 하는 일이 발생할 수 있음.