아이템 31 : 한정적 와일드카드를 사용해 API 유연성을 높이라
유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하라.
한편, 입력 매개변수가 생산자와 소비자 역할을 동시에 한다면 와일드카드 타입을 써도 좋을 게 없다.
다음 공식을 외워두면 어떤 와일드카드 타입을 써야 하는지 기억하는데 도움이 된다.
PECS : producer-extends, consumer-super
반환 타입에는 한정적 와일드카드 타입을 사용하면 안 된다. 클라이언트 코드에서도 와일드카드 타입을 써야 하기 때문이다.
제대로만 사용한다면 클래스 사용자는 와일드카드 타입이 쓰였다는 사실조차 의식하지 못할 것이다. 받아들여야 할 매개변수를 받고 거절해야 할 매개변수는 거절작하는 작업이 알아서 이뤄진다. 클래스 사용자가 와일드카드 타입을 신경 써야 한다면 그 API에 무슨 문제가 있을 가능성이 크다.
타입 매개변수와 와일드카드에는 공통되는 부분이 있어서, 메서드를 정의할 때 둘 중 어느 것을 사용해도 괜찮을 때가 많다. 이럴 때는 어떻게 해야 할까?
기본 규칙은 이렇다. 메서드 선언에 타입 매개변수가 한 번만 나오면 와일드카드로 대체하라. 이때 비한정적 타입 매개변수라면 비한정적 와일드카드로 바꾸고, 한정적 타입 매개변수라면 한정적 와일드카드로 바꾸면 된다.
핵심 정리
조금 복잡하더라도 와일드카드 타입을 적용하면 API가 훨씬 유연해진다. 그러니 널리 쓰일 라이브러리를 작성한다면 반드시 와일드카드 타입을 적절히 사용해줘야 한다. PECS 공식을 기억하자. 즉, 생산자(producer)는 extends를 소비자(consumer)는 super를 사용한다. Comparable과 Comparator는 모두 소비자라는 사실도 잊지 말자.
'언어 > JAVA' 카테고리의 다른 글
[Effective Java] 타입 안전 이종 컨테이너를 고려하라 (0) | 2020.03.26 |
---|---|
[Effective Java] 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2020.03.25 |
[Effective Java] 이왕이면 제네릭 메서드로 만들라 (0) | 2020.03.23 |
[Effective Java] 이왕이면 제네릭 타입으로 만들라 (0) | 2020.03.23 |
[Effective Java] 배열보다는 리스트를 사용하라 (0) | 2020.03.22 |