초보개발자 긍.응.성
(이펙티브 자바 3) 5장 제네릭 정리 본문
제네릭이 자바 8 이후부터등장했다. 제네릭 등장 이전에는 로 타입을 이용하였으며 이는 타입 안전하지 못했다.
특징
제네릭은 컴파일 타임에 타입에 대하여 체크를 한다. 또한 컴파일 타임에 타입에 대한 검증하기에 런타임에는 타입이 소거된다.
제네릭 클래스와 제네릭 메서드
제네릭을 사용한다면 타입에 사용할 여러 타입에 대하여 별도의 클래스 또는 메서드를 만들어 줄 필요 없다. 제네릭 클래스 또는 제네릭 메서드를 이용하여 한번에 처리할 수 있기 때문이다.
비검사 경고
제네릭을 사용하기 시작하면 수많은 unchecked 경고를 볼 수 있다. 사용한 제네릭에 타입 안전성이 보장되지 않다면 이러한 경고들이 발생한다. 될 수 있는 한 모든 unchecked 경고를 없애자. 없앨 수 없지만 타입 안전하다 확신할 수 있다면 @SuppressWarings("unchecked") 애너테이션을 달아 경고를 제거하자.
한정적 와일드카드 타입을 이용하여 API를 만들어라
조금 복잡하더라도 한정적 와일드카드 타입을 사용하여 API의 유연성을 높일 수 있다. PECS (producer-extends, consumer-super)의 공식에 맞추어 절적한 한정적 와일드카드타입을 사용하자.
가변 인수와 제네릭을 함께 사용하는 것은 피하자
가변인수를 메서드(varargs)와 제네릭을 함께 사용하면 힙 오염이 발생할 가능성이 높다. 가변 인수 메서드를 호출하면 가변 인수를 담기 위한 배열이 자동으로 만들어지기 때문이다. 가능한 가변 인수 메서드는 List<E>로 대체하자.
타입 안정 이종 컨테이너
컬렉션 API로 대표되는 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수 수가 고정되어 있다. 컨테이너 자체가 아닌 키를 매개변수로 바꾸면 이런 제약을 없앨 수 있다. 관련된 디자인 패턴으로 타입 안정 이종 컨테이너 패턴(type safe heterogeneous container pattern)이 존재한다.
public class Favorite {
private Map<Class<?>, Object> favorites = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), instace);
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}
자세한 타입 이종 컨테이너 패턴은 이 링크를 참고하자.
제네릭 용어 정리
용어 | 영문명 | ex. |
매개변수화 타입 | parameterized type | List<String> |
실제 타입 매개변수 | actual type parameter | String |
제네릭 타입 | generic type | List<E> |
정규 타입 매개변수 | formal type parameter | E |
비한정적 와일드카드 타입 | unbounded wildcard type | List<?> |
로 타입 | raw type | List |
한정적 타입 매개변수 | bounded type parameter | <E extends Number> |
재귀적 타입 한정 | recursive type bound | <T extends Comparable<T>> |
한정적 와일드 카드 타입 | bounded wildcard type | List<? extends Number> |
제네릭 메서드 | generic method | static <E> List<E> asList(E[] a) |
타입 토큰 | type token | String.class |
'책 정리 > 이펙티브 자바 3' 카테고리의 다른 글
(이펙티브 자바 3) 9장 일반적인 프로그래밍 원칙 정리 (0) | 2020.12.03 |
---|---|
(이펙티브 자바 3) 8장 메서드 정리 (0) | 2020.12.01 |
(이펙티브 자바 3) 7장 람다와 스트림 정리 (0) | 2020.11.30 |
(이펙티브 자바 3) 6장 열거 타입과 애너테이션 정리 (0) | 2020.11.27 |
(이펙티브 자바 3) 28. 배열보다는 리스트를 사용하라 (0) | 2020.11.23 |
(이펙티브 자바 3) 27. 비검사 경고를 제거하라 (0) | 2020.11.10 |
(이펙티브 자바 3) 26. 로 타입은 사용하지 말라 (0) | 2020.11.07 |
(이펙티브 자바 3) 25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2020.11.01 |