언어/JAVA

[Effective Java] 한정적 와일드카드를 사용해 API 유연성을 높이라

2020. 3. 24. 23:16
반응형

아이템 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
'언어/JAVA' 카테고리의 다른 글
  • [Effective Java] 타입 안전 이종 컨테이너를 고려하라
  • [Effective Java] 제네릭과 가변인수를 함께 쓸 때는 신중하라
  • [Effective Java] 이왕이면 제네릭 메서드로 만들라
  • [Effective Java] 이왕이면 제네릭 타입으로 만들라
지나가던 개발자
지나가던 개발자
지나가던 개발자
나의 발전을 위한 공간
지나가던 개발자
전체
오늘
어제
  • 분류 전체보기 (221)
    • 언어 (86)
      • C++ (43)
      • JAVA (43)
    • 게임 개발 (4)
      • 간단한 RPG 게임 만들기 (4)
      • 게임 개발 이슈 해결 (0)
    • 백준 문제풀이 (36)
      • PLATINUM (0)
      • GOLD (13)
      • SILVER (21)
      • BRONZE (2)
    • 프로그래머스 문제풀이 (32)
      • LEVEL 5 (0)
      • LEVEL 4 (0)
      • LEVEL 3 (7)
      • LEVEL 2 (19)
      • LEVEL 1 (6)
    • SQL 문제풀이 (15)
      • 프로그래머스 (4)
      • 해커랭크 (11)
    • 디자인 패턴 (1)
    • 웹 (17)
      • 웹 이론 정리 (17)
    • CS 지식 (28)
      • 알고리즘 (0)
      • 데이터베이스 (11)
      • 자료구조 (0)
      • 네트워크 (7)
      • 그래픽스 (0)
      • 운영체제 (9)
      • 기타 (1)
    • Git (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 깃 허브

공지사항

인기 글

태그

  • mysql
  • Chapter 6
  • 객체 지향 설계
  • 프로그래머스
  • 백준
  • BOJ
  • 클래스와 인터페이스
  • 상속
  • 객체 생성과 파괴
  • level 1
  • 소멸자 및 대입 연산자
  • 열거 타입과 애너테이션
  • Silver 3
  • 설계 및 선언
  • Level 2
  • java
  • Chapter 4
  • 해커랭크
  • c++
  • Gold 5

최근 댓글

최근 글

hELLO · Designed By 정상우.
지나가던 개발자
[Effective Java] 한정적 와일드카드를 사용해 API 유연성을 높이라
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.