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

wisdom·2022년 11월 9일
0

Effetctive Java

목록 보기
64/80
post-thumbnail

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

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


인터페이스 사용 장점

인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해진다.
나중에 구현 크래스를 교체하고자 한다면, 그저 새 클래스의 생성자(혹은 다른 정적 팩터리)를 호출해주기만 하면 된다.


예시

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

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

인터페이스 대신 클래스 타입을 사용해도 되는 경우

적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다.

1. String과 BigInteger 같은 값 클래스

값 클래스를 여러 가지로 구현될 수 있다고 생각하고 설계하는 일은 거의 없다.
값 클래스는 매개변수, 변수, 필드, 반환 타입으로 사용해도 무방하다.

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

이런 경우라도 특정 구현 클래스보다는 (보통은 추상 클래스인) 기반 클래스를 사용해 참조하는게 좋다. OutStream 등 java.io 패키지의 여러 클래스가 이 부류에 속한다.

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

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

이러한 클래스 타입을 직접 사용하는 경우, 클래스 타입에서 제공하는 추가 메서드를 꼭 사용해야 하는 경우로 최소화해야 하며, 절대 남발하지 말아야 한다.

profile
백엔드 개발자

0개의 댓글