Notice
Recent Posts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 힙
- binary search
- Stack
- Sort
- 완전탐색
- 선형자료구조
- heap
- 내돈후기
- 이진탐색
- 알고리즘잡스
- basic data-structure
- 큐
- hint
- 고급정렬
- 간단한 완전탐색
- 스택
- 정렬
- 개념
- Simple Brute-Force Algorithm
- Divide and Conquer
- 깊이우선탐색
- 기본자료구조
- Adv. recursive function
- 우선순위 큐
- Queue
- 동적계획법
- 매개 변수 탐색
- parametric search
- dfs
- Advanced Sort
- Today
- Total
루시와 프로그래밍 이야기
ITEM33. 타입 안전 이종 컨테이너를 고려하라 본문
※여기서 컨테이너란?
java.util 라이브러리에는 컨테이너(container) 클래스 들이 있으며, 그것의 기본 타입들은 List, Set, Queue, Map 이다.
http://asuraiv.blogspot.com/2015/05/java-container.html
이종 컨테이너 패턴 (type safe heterogeneous container pattern)
제네릭은 Set<E>, Map<K, V> 등의 컬렉션과 ThreadLocal<T>, AtomicReference<T> 등의 단일원소 컨테이너도 흔히 쓰인다. 이런 모든 쓰임에서 매개변수화되는 대상은 원소가 아닌 컨테이너 자신이다. 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한된다.
예를들어, Set 에는 원소의 타입을 뜻하는 단 하나의 타입 매개변수만 있으면 되며, Map 에는 key, value의 타입을 뜻하는 2개만 필요한 식이다.
더 유연한 방식이 필요할때가 있다. 데이터베이스희 행(row)은 임의 개수의 열(column)을 가질 수 있는데, 모두 열을 타입 안전하게 이용할 수 있다면 더 편할 것이다. 여기에 쉬운 해법이 있다.
컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄때 매개변수화한 키를 함께 제공하면 된다.
이렇게 하면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해 줄 것이다.
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), type.cast(instance));
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}
public class Main {
public static void main(String[] args) {
Favorites favorites = new Favorites();
favorites.putFavorite((Class)Integer.class, "Integer 의 인스턴스가 아닙니다.");
}
}
정리
- 컬렉션 API로 대표되는 일반적인 제네릭 형태에서는 한 컨테이너가 다룰 수 있는 타입 매개변수의 수가 고정되어 있다.
- 하지만 컨테이너 자체가 아닌 키를 타입 매개변수로 바꾸면, 이런 제약이 없는 타입 안전 이종 컨테이너를 만들 수 있다.
- 타입 안전 이종 컨테이너는 Class를 키로 쓰며, 이런 식으로 쓰이는 Class 객체를 타입 토큰이라 한다.
- 또한, 직접 구현한 키 타입도 쓸 수 있다.
- 예컨대 테이터 베이스의 행을 표현한 DatabaseRaw타입에는 제네릭 타입인 Colum<T>를 키로 사용할 수 있다.
'스터디 > 이펙티브 자바' 카테고리의 다른 글
ITEM43 람다보다는 메서드 참조를 사용하라 (0) | 2022.11.18 |
---|---|
ITEM42 익명 클래스보다는 람다를 사용하라 (0) | 2022.11.18 |
ITEM32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) | 2022.10.13 |
ITEM31. 한정적 와일드카드를 사용해 API 유연성을 높이라 (0) | 2022.10.13 |
ITEM30. 이왕이면 제네릭 메서드로 만들라 (0) | 2022.10.13 |
Comments