Item 64. Interface Reference

객체는 인터페이스를 사용해 참조하라

타입으로는 클래스보다는 인터페이스가 더 낫기 때문에, 적합한 인터페이스가 있다면 매개변수, 반환값, 변수, 필드를 모두 인터페이스 타입으로 선언하는 것이 좋다. 실제 클래스는 생성할 때만 사용하고 그 외에는 인터페이스로만 사용하는 것이 좋다.

구현체 변경 시 주의점

인터페이스로 선언하면 구현 클래스 생성자만 변경하는 것으로도 다른 구현체로 쉽게 교체할 수 있어 훨씬 더 유연한 코드를 작성할 수 있다. 하지만 교체하려는 클래스 역시 같은 기능을 제공해야하기 때문에 주의해야한다.

  • LinkedHashSet -> HashSet 교체: 바꾸면서 순서가 보장되지 않는다는 문제가 생긴다.

  • HashMap -> LinkedHashMap 교체: 성능은 비슷하게 유지하면서 순서가 보장되는 클래스로 교체할 수 있다.

클래스를 사용해야하는 경우

  • 적합한 인터페이스가 없는 경우

    • 여러 가지로 구현될 수 있도록 설계되지 않은 클래스들로, 이 경우엔 클래스를 사용해도 된다.

    • String, BigInteger, BigDecimal 등 존재

  • 클래스 기반으로 작성된 프레임워크가 제공하는 객체들

    • 이 경우에도 특정 구현 클래스보다는 기반 클래스를 사용하는 것이 좋다.

    • InputStream, OutputStream, ExecutorService 등 존재

  • 인터페이스에는 없는 특별한 메서드를 제공하는 클래스

    • PriorityQueue 클래스는 Queue 인터페이스에는 없는 comparator 메서드를 제공한다.

    • 이 경우에도 특별한 메서드를 사용하기 위해 클래스를 사용하는 것이 좋다.

    • 이런 경우는 특수한 상황에서만 사용하고, 가능하면 인터페이스 기반으로 사용하는 것이 좋다.

Last updated

Was this helpful?