Skip to content

Latest commit

 

History

History
28 lines (21 loc) · 1.5 KB

item64.md

File metadata and controls

28 lines (21 loc) · 1.5 KB

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

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

객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐이다.

// 좋은 예
Set<Son> sonSet = new LinkedHashSet<>();

// 나쁜 예
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

인터페이스 타입의 장점

  • 인터페이스 타입을 사용하면 클라이언트 코드를 수정하지 않고도 참조 객체를 변경할 수 있다.
  • 다른 타입의 객체를 사용하더라도 컴파일에러/런타임에러에 대한 걱정을 하지 않아도 된다.

인터페이스 타입의 단점

  • 인터페이스 타입에 선언된 메서드를 구현한 메서드만 사용이 가능하다.
  • 특정 구현체의 내부 메서드를 사용할 수 없다.

클래스를 참조해야 하는 경우

  • String, BigInteger 같은 값 클래스처럼 적합한 인터페이스가 없을 경우
    • Integer, Long과 같은 타입을 사용할 때는 Number와 같은 상위 타입을 사용하지 말아야 한다.
  • 인터페이스에는 없는 메서드를 사용할 경우
    • PriorityQueue 클래스에는 Queue 인터페이스에는 없는 comparator 메서드를 제공한다.
  • 적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인(상위의)클래스를 타입으로 사용하자.