본문 바로가기
IT/Java

이펙티브 자바 5장 - 제네릭 2

by 봉즙 2019. 12. 5.

이왕이면 제네릭 메서드로 만들라

메서드 역시 제네릭으로 만들 수 있으며 클라이언트에서 입력 매개 변수와 반환값을 명시적으로 형변환해야하는 메서드보다 안전하며 사용하기도 쉽다.

재귀적 한정 타입 : 자기 자신이 들어간 표현식을 사용하여 타입 메개변수의 허용범위를 정하는 것

 

한정적 와일드 카드를 사용해 API 유연성을 높여라

유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하게되면 API가 유연해진다.

와일드 카드 공식

  • 펙스 (PECS) : 매개변수화 타입 T가 생산자라면 <? extends T>를 사용하며 소비자라면 <? super T>를 사용

반환타입에는 한정적  와일드 카드를 사용해서는 안된다. 유연성을 높여주는 것이 아니라 클라이언트 코드에서도 와일트 카드 타입을 사용해야 한다.

클래스 사용자가 와일트 카드 타입을 신경써야한다면 API에 문제가 있는 것일 가능성이 크다.

만약 컴파일러가 올바른 타입을 추론하지 못하면 명시적 타입 인수를 사용해 타입을 알려주면 된다.

타입 매개 변수 E의 경우에는 Comparable<E>보다는 Comparable<? super E>를 사용하는 것이 좋다. Comparator의 경우에도 마찬가지로 소비자이기에 와일드카드를 사용하는 방식을 쓴다.

기본적으로 메서드 선언 타입 매개변수가 한번만 나온다면 와일드 카드로 대체한다.

 

 

제네릭과 가변인수를 함께 쓸 떄는 신중하라

가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어며 내부로 감춰야 했을 이 배열을 클라이언트에 노출하는 문제가 생기며 varargs 매개 변수에 제네릭이나 매개 변수화 타입이 포함되면 컴파일 경고가 발생하게 된다. 매개변수화 타입의 변수가 타입이 다른 객체를 참조하면 힙 오염이 발생한다.

제네릭이나 매개변수 화 타입의 varargs 매개변수 ( 가변 매개 변수)를 받는 메서드는 유용하기에 모순을 허용하게 된다.

 

타입 안전 이종컨테이너를 고려하라

일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정되어있다. 하지만 컨테이너 자체가 아닌 키를 타입 매개변수로 바구면 이런 제약이 없는 안전 이종 컨테이너를 만들 수 있다. 타입 안전 이종컨테이너는 Class를 키로 쓰며, Class 객체를 타입 토큰이라 한다. 직접  구현한 키타입도 사용할 수 있다.

'IT > Java' 카테고리의 다른 글

이펙티브 자바 6장 - enum 2  (0) 2020.01.03
이펙티브 자바 6장 - enum  (0) 2019.12.12
이펙티브 자바 5장  (0) 2019.12.03
이펙티브 자바 4장 -2  (0) 2019.12.02
이펙티브 자바 4장 - 1  (0) 2019.11.27

댓글