책/이펙티브 자바

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은 모두 소비자다