핵심 정리
유연성을 위해 구체 클래스가 아닌 인터페이스 타입을 사용하자.
매개변수, 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라.
예시 1
// 좋은 예. 인터페이스를 타입으로 사용했다.
Set<Son> sonSet = new LinkedHashSet<>();
// 쉽게 구현 클래스를 교체할 수 있다.
Set<Son> sonSet = new HashSet<>();
예시 2
// 나쁜 예. 클래스를 타입으로 사용했다.
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();
주의해야 할 점
: 원래의 클래스가 특정 메소드를 제공하고, 그 메소드를 사용하는 코드가 있다면, 새로운 클래스도 반드시 그 메소드를 제공해야 한다.
- 예시:
- LinkedHashSet은 순서를 가지는 반면, HashSet는 순서를 가지지 않는다. 원래 LinkedHashSet을 사용할 때, 순서에 의존적인 코드를 구현했다면, HashSet을 사용하더라도 같은 기능을 제공해야 한다.
적합한 인터페이스가 없는 경우
: 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다.
1. 값 클래스
: ex. String, BigInteger
- 실제 값을 표현하는 데 중점을 두기 때문에, 주로 불변(final)하며, method보다는 데이터를 나타낸다. 또한, 적합한 인터페이스가 거의 없다.
- 따라서 값 클래스를 매개변수, 변수, 필드, 반환 타입으로 사용해도 괜찮다.
2. 클래스 기반 작성된 프레임워크
: ex. OutputStream 등 java.io 패키지의 여러 클래스
- 클래스가 프레임워크의 기본적인 구성요소로 사용된다. 또한, 적합한 인터페이스가 거의 없다.
- 따라서 클래스 타입을 직접 사용해야 할 수 있다.
3. 인터페이스에 없는 특별한 메소드를 제공하는 클래스
: PriorityQueue클래스
- 예: PriorityQueue 클래스는 Queue 인터페이스에는 없는 comparator 메소드를 제공한다.
- 이러한 메소드를 사용해야 하는 경우 클래스 타입을 직접 사용해야 한다.
적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 상위의 클래스를 타입으로 사용하자.
'Language > Java' 카테고리의 다른 글
[effective java] 아이템 66. 네이티브 메서드는 신중히 사용하라. (0) | 2023.07.27 |
---|---|
[effective java] 아이템 65. 리플렉션보다는 인터페이스를 사용하라. (0) | 2023.07.27 |
[effective java] 아이템 63. 문자열 연결은 느리니 주의하라. (0) | 2023.07.27 |
[effective java] 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라. (0) | 2023.07.27 |
[effective java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라. (0) | 2023.07.27 |