-
item 31 한정적 와일드카드를 사용해 API 유연성을 높이라책/이펙티브 자바 2022. 3. 23. 20:54
ITEM 31 한정적 와일드카드를 사용해 API 유연성을 높이라
매개변수화 타입은 불공변이다
서로 다른 타입 Type1과 Type2가 있는 경우 List<Type1>은 List<Type2>의 하위 타입도 상위 타입도 아니다 List<String>은 List<Object>의 하위 타입이 아니다 List<Object>에는 어떤 객체든 들어가지만 List<String>은 문자열만 넣을수 있어서 리스코프 치환 원칙에 어긋난다
매개변수화 타입이 불공변인 경우 유연성이 떨어진다
자바에서는 이를 대체하는 방법으로 한정적 와일드카드타입이라는 특별한 매개변수 타입을 제공한다
유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하라
펙스(PECS) 공식 (와일드카드 타입을 사용하는 기본 원칙) 매개변수화 타입 T가 생산자라면 <? extends T> 를 사용 소비자라면 <? super T>를 사용
public static <E> Set<E> union(Set<E> s1, Set<E> s2) s1, s2 모두 E의 생산자이다 PECS 공식을 적용하면 아래와 같다 public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) 반환 타입에서 한정적 와일드카드 타입을 사용하면 클라이언트 코드에서 와일드 카드 타입을 사용해야 되므로 오히려 비 효율적이다 따라서 반환 타입은 여전히 Set<E>을 사용한다
- 클래스 사용자가 와일드카드 타입을 신경 써야 한다면 그 API에 문제가 있을 가능성이 높다
생산자 : 입력 매개변수로부터 이 컬렉션으로 원소를 옮겨 담는것
소비자 : 이 컬렉션 인스턴스의 원소를 입력 매개변수로 옮겨 담는다면 매개변수를 소비자라고 한다
복잡도가 조금 증가 하더라도 와일드 카드 타입을 사용하면 API 가 훨씬 유연해진다
많이 사용되는 라이브러리를 만든다면 와일드 카드 타입을 적절하게 사용하자
PECS 공식을 사용하자 생산자는 extends, 소비자는 super , Comparable 과 Comparator은 모두 소비자다
'책 > 이펙티브 자바' 카테고리의 다른 글
item 33 타입 안전 이종 컨테이너를 고려하라 (0) 2022.03.25 item 32 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) 2022.03.24 item 30 이왕이면 제네릭 메서드로 만들어라 (0) 2022.03.22 item 29 이왕이면 제네릭 타입으로 만들라 (0) 2022.03.21 item 28 배열보다는 리스트를 사용하라 (0) 2022.03.19