반응형
예제
// 인터페이스 참조한 예
Set<String> set = new LinkedHashSet<>();
// 그렇지 않은 예
LinkedHashSet<String> set = new LinkedHashSet<>();
LinkedHashSet 은 Set 인터페이스를 상속받고 있다.
위의 예제에서는 LinkedHashSet을 Set 타입으로 업캐스팅하여 사용하고 있다.
※ 주의: 업캐스팅으로 인해 set은 Set 타입이므로 LinkedHashSet 에만 존재하는 기능을 사용할 수 없게 됨
WHY?? 왜 인터페이스를 참조하라는 걸까?
( 더 나은 성능을 위해 ) 원래의 타입을 변경해야 하는 경우
예제
// 인터페이스를 참조한 예
// 구현체(LinkedHashSet -> HashSet)를 변경해도 코드는 변경되지 않음
Set<String> set = new HashSet<>();
...
set.add(...);
set.get(...);
...
// 그렇지 않은 예
// 관련된 코드를 변경해야 함
HashSet<String> set = new HashSet<>();
...
public HashSet<String> get() {
...
}
public HashSet<String> remove() {
...
}
...
적절한 인터페이스가 없을 경우 객체의 클래스 중 필요한 기능을 충족하는 덜 구체적인(상위) 클래스를 타입으로 사용하자!!
- String, Integer와 같은 값 클래스인 경우
- 클래스 기반으로 작성된 프레임워크가 제공하는 객체들: OutputStream ...
- 인터페이스에는 없는 기능을 사용해야 하는 경우
반응형
'Java' 카테고리의 다른 글
[Java] LinkedList 순회하기 위한 ListIterator 사용하기 (0) | 2023.10.29 |
---|---|
[이펙티브 자바] Item1 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2023.02.23 |
[Java] 조합 알고리즘 java 코드로 구현하기 (2) | 2023.02.06 |
[이펙티브 자바] Item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2023.01.30 |
Stack에 대하여 (2) | 2022.10.05 |