Link
Today
Total
10-17 04:29
Archives
관리 메뉴

초보개발자 긍.응.성

(이펙티브 자바 3) 5장 제네릭 정리 본문

책 정리/이펙티브 자바 3

(이펙티브 자바 3) 5장 제네릭 정리

긍.응.성 2020. 11. 25. 01:33
반응형

제네릭이 자바 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

 

반응형
Comments