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

인터페이스 타입으로 선언

  • 적합한 인터페이스가 있다면, 매개변수뿐 아니라 반환 값, 변수, 필드를 전부 인터페이스 타입으로 선언하도록 한다.

  • 구현 클래스를 교체하고자 할 때 새 클래스의 생성자를 호출하기만 하면 된다.

  • 실제 클래스를 사용해야 하는 상황은 생성할 때 뿐이다.

  • 원래 클래스가 인터페이스 일반 규약 이외의 기능을 제공하고 주변 코드가 이 기능에 의해 동작한다면, 새로운 클래스도 반드시 같은 기능을 제공해야 한다.

    • 예를 들어 LinkedHashSet 선언 주변 코드가 순서가 보장됨을 가정하고 동작하는 상황에서, 순서가 보장되지 않는 HashSet으로 변경하면 문제가 생길 수 있다.

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

  • 아래 경우들에 대해서는 인터페이스 대신 클래스 타입을 사용한다.

    • 값 클래스는 여러 가지로 구현되지 않기 때문에 final인 경우가 많고 인터페이스가 존재하지 않는 경우가 많다. 따라서 매개변수, 변수, 필드, 반환 타입으로 사용해도 무방하다.

    • 클래스 기반으로 작성된 프레임워크가 제공하는 객체들의 경우, 기반 클래스(보통은 추상 클래스)를 사용해 참조하는 것이 좋다. ex) OutputStream ...

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

Last updated