[아이템 33] 타입 안전 이종 컨테이너를 고려하라. 타입 안전 이종 컨테이너 패턴이란 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공하는 방식입니다. 1 2 3 4 5 // 타입 안전 이종 컨테이너 패턴 - API public class Favorites { public <T> void putFavorite(Class<T> type, T instance); public <T> getFavorite(Class<T> type); } 다음은 Favorite 클래스를 사용하는 예시입니다. 1 2 3 4 5 6 7 8 9 10 // 타입 안전 이종 컨태이너 패턴 - 클라이언트 Favorites f = new Favorites(); f....
4장 제네릭
[아이템 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라
[아이템 32] 제네릭과 가변인수를 함께 쓸 때는 신중하라. 가변인수와 제네릭은 자바 5에 함께 추가되었는데 이 둘은 서로 어울리지 않습니다. 가변인수(varargs)란 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는 것입니다. 구현 방식에 허점이 있습나다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어집니다. 그런데 내부로 감춰야 했을 이 배열을 그만 클라이언트에 노출하는 문제가 생겼습니다. 그 결과 verargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생합니다. 실체화 불가 타입은 런타임에 컴파일보다 타입 관련 정보를 적게 담고 있습니다....
[아이템 31] 한정적 와일드카드를 사용해 API 유연성을 높여라
[아이템 31] 한정적 와일드카드를 사용해 API 유연성을 높여라. 때론 불공변 방식보다 유연한 무언가가 필요할 때가 있습니다. 아이템29의 Stack 클래스를 떠올려보면 1 2 3 4 5 6 public class Stack<T> { public Stack(); public void push (E e); public E pop(); public boolean isEmpty(); } 여기서 일련의 원소를 스택에 넣는 메서드를 추가한다고 하면 1 2 3 4 5 public void pushAll(Iterable<E> src) { for (E e : src) { push(e); } } Iterable src의 원소 타입의 스택의 원소 타입과 일치하면 잘 작동합니다....
[아이템 30] 이왕이면 제네릭 메서드로 만들라
[아이템 30] 이왕이면 제네릭 메서드로 만들라. 제네릭 메서드는 대표적으로 Collections의 알고리즘 메서드(binarySearch, sort 등..)가 있습니다. 사용 방법은 리턴타입 앞에다 타입을 명시해주면 됩니다. 다음은 두 집합의 합집합을 반환하는 문제가 있는 메서드입니다. 1 2 3 4 5 6 // raw tyoe 사용 - 수용 불가 public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 컴파일은 되지만 경고가 발생합니다. 경고를 없애려면 이 메서드 타입을 안전하게 만들어야 합니다....
[아이템 29] 이왕이면 제네릭 타입으로 만들라
[아이템 29] 이왕이면 제네릭 타입으로 만들라. 아이템7에서 다루었던 스택 코드를 제네릭으로 변형한 코드입니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class Stack<E> { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; // 경고 메세지 타입이 안전하지 않음 } public void push(E e) { ensoureCapaciy(); elements[size++] = e; } public E pop() { if (size == 0) { throw new EmptyStackException(); } E result = elements[--size]; elements[size] = null; return result; } ....