κΈ°μ‘΄μ μ λ€λ¦ 컨ν
μ΄λ(Set<E>, Map<K, V> λ±)μμλ μ§μ λ κ°μμ νμ
λ§€κ°λ³μλ§ μ¬μ©ν μ μλ€.
μλ₯Ό λ€μ΄, Set<E>μλ μμμ νμ
μ λ»νλ λ¨ νλμ νμ
λ§€κ°λ³μλ§ μμΌλ©΄ λλ©°, Map<K,V> μλ ν€μ κ°μ λ»νλ 2κ°λ§ νμνλ€.
{% hint style="warning" %} νμ§λ§ 컨ν μ΄λ μμ²΄κ° μλ "ν€"λ₯Ό λ§€κ°λ³μνν λ€μ, 컨ν μ΄λμ κ°μ λ£κ±°λ λΊ λ λ§€κ°λ³μνν ν€λ₯Ό ν¨κ» μ 곡νλ€λ©΄ λ μ μ°νκ² μ¬λ¬ νμ μ λ°μ μ μμ§ μμκΉ? {% endhint %}
λ°λ‘ μ΄λ¬ν μ€κ³ λ°©μμ, μ°λ¦¬λ νμ μμ μ΄μ’ 컨ν μ΄λ ν¨ν΄μ΄λΌκ³ νλ€.
public class Favorites {
public <T> void putFavorite(Class<T> type, T instance); // ν€κ° λ§€κ°λ³μν λ¨
public <T> T getFavorite(Class<T> type);
}컨ν μ΄λλ₯Ό νμ λ³λ‘ λλμ§ μκ³ , ν€ μ체μ νμ μ λ§€κ°λ³μννλ λ°©μμ μ μνκ³ μλ€. μ¦, νΉμ ν€μ μνλ νμ μ μ§μ νκ³ , κ°μ μ μ₯νκ±°λ μ‘°νν λ μ΄ ν€μ ν¨κ» νμ μ 보λ₯Ό μ 곡νμ¬ λ μ μ°νκ² μ¬λ¬ νμ μ κ°μ μ μ₯νκ³ κ΄λ¦¬ν μ μλ ꡬ쑰λ₯Ό μκ°νλ κ²μ΄λ€.
{% hint style="info" %} μμ λ₯Ό 보기 μ , μ¬κΈ°μ μ λ€λ¦μ Set, Map<K,V> λ±μ 컬λ μ κ³Ό Threadl_ocal, AtomicReference λ±μ λ¨μΌμμ 컨ν μ΄λμλ νν μ°μΈλ€. μ΄λ° λͺ¨λ μ°μμμ λ§€κ°λ³μνλλ λμμ (μμκ° μλ) 컨ν μ΄λ μμ μ΄λ€. {% endhint %}
μ¬κΈ°μ "λ§€κ°λ³μνλλ λμμ΄ μ»¨ν
μ΄λ μμ "μ΄λΌλ κ²μ, μ λ€λ¦ νμ
μ΄ μ μ©λλ λ²μκ° μ»¨ν
μ΄λ νμ
μ΄λΌλ μλ―Έμ΄λ€. μ¦, Set<E>, Map<K, V>, ThreadLocal<T>, AtomicReference<T> λ±μμ μ λ€λ¦ νμ
μ ν΄λΉ 컨ν
μ΄λμ ꡬ쑰 μ체λ₯Ό νμ
μΌλ‘ λ§€κ°λ³μννκ³ μλ€λ λ»μ΄λ€.
μμ(Element)μ 컨ν μ΄λ(Container) ꡬλΆ
- μμ (Element): 컨ν
μ΄λ μμ μ μ₯λλ μ€μ λ°μ΄ν°, μλ₯Ό λ€μ΄
Set<Integer>μμ μμλIntegerνμ μ λ°μ΄ν°λ€μ΄ λλ€. - 컨ν
μ΄λ(Container): μμλ€μ λ΄λ κ·Έλ¦μΌλ‘, μμλ€μ΄ λ΄κΈ°λ ꡬ쑰 μμ²΄κ° μ»¨ν
μ΄λμ΄λ€. μλ₯Ό λ€μ΄
Set<Integer>μμSetμ΄ μ»¨ν μ΄λμ ν΄λΉνλ€.
λ§€κ°λ³μνλ λμμ΄ "컨ν μ΄λ"λΌλ μλ―Έ
Set<E> κ°μ μ λ€λ¦ 컬λ μ
μ μλ‘ λ€μ΄λ³΄λ©΄, Set<Integer>, Set<String>κ³Ό κ°μ΄ νΉμ νμ
μ μμλ€μ λ΄λ κ΅¬μ‘°λ‘ λ§€κ°λ³μνλ λΏ, μ λ€λ¦ νμ
λ§€κ°λ³μ Eκ° "μμ"λ₯Ό μ§μ λ§€κ°λ³μννλ κ²μ΄ μλλ€.
μ¦, μ λ€λ¦ νμ μΌλ‘ μ μλ κ²μ μμμ νμ μ΄ μλ "컨ν μ΄λ"κ° μμλ₯Ό μ΄λ€ νμ μΌλ‘ κ΄λ¦¬νλκ°λ₯Ό κ²°μ νλ κ²μ΄λ€.
μμ 1: Set<E>
Set<String> stringSet = new HashSet<>();
Set<Integer> intSet = new HashSet<>();Set<String>κ³ΌSet<Integer>λ λ λ€ "Set"μ΄λΌλ λμΌν 컨ν μ΄λμ΄λ€.- λ€λ§, μ λ€λ¦ νμ
λ§€κ°λ³μ
Eλ₯Ό ν΅ν΄ 컨ν μ΄λκ° μ΄λ€ νμ μ μμ(StringλλInteger)λ₯Ό κ°μ§μ§ μ μνλ€.
μμ 2: AtomicReference<T>
AtomicReference<String> atomicString = new AtomicReference<>("hello");
AtomicReference<Integer> atomicInt = new AtomicReference<>(123);AtomicReferenceλ λ¨μΌ μμλ₯Ό λ΄λ 컨ν μ΄λμ΄λ©°, μ λ€λ¦ νμ λ§€κ°λ³μTλ λ΄κΈΈ μμμ νμ μ μ§μ ν λΏ, μμ μ체λ₯Ό λ§€κ°λ³μννλ κ²μ μλλλ€.- μ¦, 컨ν
μ΄λ(μ¬κΈ°μλ
AtomicReference)κ°StringλλIntegerνμ μ μμλ₯Ό λ΄λ λ°©μμ λ§€κ°λ³μννλ κ²μ΄λ€.
// Set μμ: μ¬λ¬ μμλ₯Ό κ΄λ¦¬
Set<String> stringSet = new HashSet<>();
stringSet.add("hello");
stringSet.add("world");
// AtomicReference μμ: λ¨μΌ μμλ₯Ό μμμ μΌλ‘ κ΄λ¦¬
AtomicReference<String> atomicString = new AtomicReference<>("hello");
atomicString.set("world");λ°λΌμ μ λ€λ¦ λ§€κ°λ³μλ νμ "컨ν μ΄λκ° μμλ₯Ό μ΄λ€ νμ μΌλ‘ μ·¨κΈνλμ§"λ₯Ό κ²°μ νλ©°, μμκ° μ§μ λ§€κ°λ³μνλλ κ²μ΄ μλλΌ, 컨ν μ΄λκ° μμμ νμ μ λ°λΌ ꡬ쑰λ₯Ό κ΄λ¦¬νλ λ°©μμ μ μνλ κ²μ΄λ€. γ·
λ€μκ³Ό κ°μ ꡬ쑰μμ, Key κ°μ²΄ μμ²΄κ° νΉμ νμ
μ λ§€κ°λ³μλ‘ μ μλλ©°, μ΄ ν€μ ν¨κ» 컨ν
μ΄λμμ κ°μ λ£κ³ λΉΌλ λ°©μμ μμ μ΄λ€.
// Key ν΄λμ€μ νμ
λ§€κ°λ³μ μ μ
public class Key<T> {
// νμ
μμ ν ν€ ν΄λμ€
}
// 컨ν
μ΄λ ν΄λμ€
public class Container {
private final Map<Key<?>, Object> values = new HashMap<>();
// κ°μ μ μ₯ν λ νμ
μ λ§λ ν€λ₯Ό μ¬μ©
public <T> void put(Key<T> key, T value) {
values.put(key, value);
}
// κ°μ μ‘°νν λ νμ
μ λ§λ ν€λ₯Ό μ¬μ©νμ¬ νμ
μμ μ± λ³΄μ₯
public <T> T get(Key<T> key) {
return (T) values.get(key);
}
}μ΄ λ°©μμ ν΅μ¬μ, 컨ν μ΄λκ° μλ ν€ κ°μ²΄μ νμ λ§€κ°λ³μλ₯Ό λΆμ¬νμ¬, μ¬λ¬ νμ μ κ°μ νλμ 컨ν μ΄λμ νμ μμ νκ² λ΄κ³ κ΄λ¦¬ν μ μλ€λ μ μ΄λ€.
컨ν μ΄λλ₯Ό ν΄λμ€λ‘ μ΄ν΄νλ©΄ μκΈ° νΈνλ€
μ¬μ€ class μ νμ
μ΄ Class<T> μ λ€λ¦μ΄κΈ° λλ¬Έμ, κ° νμ
μ Class κ°μ²΄λ₯Ό λ§€κ°λ³μνν ν€ μν λ‘ μ¬μ©νλ κ²μ΄ κ°λ₯ν΄μ§λ€. ex) String.class νμ
μ Class<String>, Integer.classμ νμ
μ Class<Integer>
ννΈ, μ»΄νμΌνμ νμ μ 보μ λ°νμ νμ μ 보λ₯Ό μμλ΄κΈ° μν΄ λ©μλλ€μ΄ μ£Όκ³ λ°λ class λ¦¬ν° λ΄μ νμ ν ν°(type token)μ΄λΌ νλ€.
{% hint style="success" %} κ°μ₯ μ€μν κ²μ, μ°λ¦¬λ μ΄λ₯Ό ν΅ν΄ μ λ€λ¦μμμ μ»΄νμΌνμ νμ μμ μ±μ΄ μλ λ°νμ νμ μμ μ±μ μ»μ μ μλ€λ κ²μ΄λ€. {% endhint %}
public class Favorites{
private Map<Class<?>, Object> favorites = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), instance);
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}Map<Class<?>, Object>
ν€λ₯Ό λΉνμ μ μΈ μμΌλμΉ΄λ νμ μΌλ‘ μ μΈνμκΈ° λλ¬Έμ, μ΄λ₯Ό ν΅ν΄μ λ€μν λ§€κ°λ³μν νμ μ ν€λ₯Ό νμ©ν μ μκ² λμλ€. λ§μ½Map<Class<T>, Object>μλ€λ©΄ μ€μ§ νκ°μ§ νμ μ ν€λ§ λ΄μ μ μμμ κ²μ΄λ€.Class.cast
valueκ°Objectνμ μ΄λ―λ‘ λ§΅μ λ£μλ κ°μ΄ ν€ νμ μ μΈμ€ν΄μ€λΌλ κ²μ΄ 보μ₯λμ§ μλλ€. λ°λΌμ λ§΅μμ κ°μ Έμ¬λλcastλ©μλλ₯Ό μ¬μ©ν΄ μ΄ κ°μ²΄ μ°Έμ‘°λ₯Όclassκ°μ²΄κ° κ°λ¦¬ν€λTνμ μΌλ‘ λμ λ³ννκ³ μλ€.
κ·Έλ°λ° cast λ©μλκ° λ¨μ§ μΈμλ₯Ό κ·Έλλ‘ λ°ννκΈ°λ§ νλ€λ©΄ κ΅³μ΄ μ μ¬μ© νλ κ²μΌκΉ?
κ·Έ μ΄μ λ cast λ©μλμ μκ·Έλμ²κ° Class ν΄λμ€κ° μ λ€λ¦μ΄λΌλ μ΄μ μ μλ²½ν νμ©νκΈ° λλ¬Έμ΄λ€. λ€μ μ½λμμ λ³΄λ― castμ λ°ν νμ μ Class κ°μ²΄μ νμ λ§€κ°λ³μμ κ°λ€.
π cast λ©μλ
νλ³ν μ°μ°μμ λμ λ²μ μΌλ‘, μ£Όμ΄μ§ μΈμκ° Class κ°μ²΄κ° μλ €μ£Όλ νμ μ μΈμ€ν΄μ€μΈμ§ κ²μ¬ν λ€μ, λ§λ€λ©΄ λ°ννκ³ μλλ©΄ClassCastExceptionμ λμ§λ€. μ΄λ₯Ό νμ©νλ©΄,Tλ‘ λΉκ²μ¬ νλ³νμ νμ§ μμλ λλ€. νμ μ λμ± μμ νκ² λ§λ€μ΄μ€λ€.public class Class<T>{ T cast(Object obj); }
{% hint style="info" %}
μ’λ, μμΈν value κ° Object νμ
μ΄λ―λ‘ λ§΅μ λ£μλ κ°μ΄ ν€ νμ
μ μΈμ€ν΄μ€λΌλ κ²μ΄ 보μ₯λμ§ μλλ€. λ°λΌμ λ§΅μμ κ°μ Έμ¬λλ cast λ©μλλ₯Ό μ¬μ©ν΄ μ΄ κ°μ²΄ μ°Έμ‘°λ₯Ό class κ°μ²΄κ° κ°λ¦¬ν€λ T νμ
μΌλ‘ λμ λ³ννκ³ μλ€ λΆλΆμ λν΄ μμ보μ
{% endhint %}
μ΄ μ€λͺ
μ Class.cast() λ©μλλ₯Ό μ΄μ©ν΄ Favorites ν΄λμ€μμ νμ
μμ μ±μ 보μ₯νλ λ°©λ²
- κ°μ Object νμ
μΌλ‘ μ μ₯:
Favoritesν΄λμ€μfavoritesλ§΅μμλ ν€λ‘Class<T>νμ μ, κ°μΌλ‘Objectνμ μ μ¬μ©νκ³ μλ€.- μ¬κΈ°μ
Objectνμ μ λͺ¨λ νμ μ κ°μ²΄λ₯Ό μ μ₯ν μ μμ§λ§, νμ μ΄ λ§μ§ μλ κ°μ΄ μ μ₯λ κ°λ₯μ±μ΄ μλ€.
- νμ
μμ μ± λ¬Έμ :
- λ§΅μ κ°μ΄
Objectλ‘ μ μ₯λλ―λ‘, νΉμ ν€μ μΌμΉνλ νμ μ μΈμ€ν΄μ€λ§ μ μ₯λλλ‘ λ³΄μ₯ν λ°©λ²μ΄ μλ€. - μλ₯Ό λ€μ΄,
Class<String>νμ μ ν€λ₯Ό μ¬μ©ν΄Stringμ μ μ₯νμ΄μΌ νμ§λ§, λ€λ₯Έ νμ μ κ°μ μ€μλ‘ μ μ₯ν μ μλ μνμ΄ μλ€.
- λ§΅μ κ°μ΄
- Class.cast()μ μν :
Class.cast()λ©μλλ λμ ν λ³νμ μ 곡νμ¬, λ§΅μμ κ°μ κ°μ Έμ¬ λClass<T>ν€μ μ§μ λ νμ μΌλ‘ μμ νκ² λ³νν΄μ€λ€.- μλ₯Ό λ€μ΄,
Class<String>ν€λ₯Ό μ¬μ©νμ¬ κ°μ Έμ€λ κ²½μ°,Class.cast()λ λ°νλλ κ°μ΄StringμΈμ§ νμΈνκ³ λ§μΌλ©΄ κ·Έλλ‘ λ°ννλ€. λ§μ½Stringμ΄ μλλ©΄ClassCastExceptionμ΄ λ°μνλ€.
- Favorites ν΄λμ€μ λμ μ리:
putFavoriteλ©μλμμλClass<T>ν€μTνμ μ μΈμ€ν΄μ€λ₯Ό ν¨κ» μ λ¬λ°μ μ μ₯νλ€. μ΄λ λ§΅μObjectνμ μΌλ‘ μ μ₯νμ§λ§,getFavoriteλ©μλλClass.cast()λ₯Ό ν΅ν΄Tλ‘ λ°νλλ―λ‘ νμ μμ μ±μ΄ ν보λλ€.
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type)); // T νμ
μΌλ‘ λ³νν΄ μμ νκ² λ°ν
}type.cast(favorites.get(type))λfavorites.get(type)μΌλ‘ μ»μ΄μ¨Objectνμ μ κ°μtypeμ΄ κ°λ¦¬ν€λ νμ μΌλ‘ νλ³ννλ€.typeμ΄String.classμΌ λcast()λObjectκ°μStringμΌλ‘ λ³ννκ³ ,Integer.classμΌ λλIntegerλ‘ λ³ννλ€.
Class.cast()λ©μλλ₯Ό νμ©ν¨μΌλ‘μ¨Favoritesν΄λμ€λ μ¬λ¬ νμ μ κ°μ²΄λ₯ΌMap<Class<?>, Object>μ μμ νκ² μ μ₯νκ³ κΊΌλΌ μ μλ€. μ΄λ₯Ό ν΅ν΄ λμ ν λ³ν κ³Όμ μμ νμ μμ μ±μ μ μ§νκ³ , μλͺ»λ νλ³ν μClassCastExceptionμ λ°μμμΌ μ€λ₯λ₯Ό λ°©μ§ν μ μλ€.
ν΄λΌμ΄μΈνΈ νμ©
public static void main(String[] args) {
Favorites f = new Favorites();
f.putFavorite(String.class, "Java");
f.putFavorite(Integer.class, 0xcafebabe);
f.putFavorite(Class.class, Favorites.class);
String favoriteString = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);
// Java cafebabe Favorites μΆλ ₯
System.out.printf("%s %x %s%n", favoriteString,
favoriteInteger, favoriteClass.getName());
}μ΄λ κ² Favorites μΈμ€ν΄μ€λ νμ μμ νλ©° μΌλ°μ μΈ λ§΅κ³Ό λ¬λ¦¬ μ¬λ¬ κ°μ§ νμ μ μμλ₯Ό λ΄μ μ μκΈ° λλ¬Έμ, νμ μμ μ΄μ’ 컨ν μ΄λλΌκ³ ν μ μλ€.
{% hint style="info" %}
μ λ€λ¦ νμ
μ μ¬μ©ν μΌλ°μ μΈ μ»¨ν
μ΄λ(Set<E>, Map<K,V>)μ νμ
μμ μ΄μ’
컨ν
μ΄λ ν¨ν΄μ μ°¨μ΄μ μ λ§€κ°λ³μνλλ λμμ΄ μ»¨ν
μ΄λ μμ μΈμ§, ν€μΈμ§μμ λμ¨λ€.
{% endhint %}
μ λ€λ¦ 컨ν
μ΄λμΈ Set<E>, Map<K,V>λ 컨ν
μ΄λ μ체μ ꡬ쑰λ₯Ό λ§€κ°λ³μννλ€.
μ¦, νΉμ νμ μ μμλ₯Ό λ΄λ κ΅¬μ‘°λ‘ μ»¨ν μ΄λλ₯Ό μ€μ νκ³ , κ° μ»¨ν μ΄λμ μ μλ νμ λ§€κ°λ³μμ λ°λΌ λ΄μ μ μλ μμ νμ μ΄ κ³ μ λλ€.
-
μμ:
Set<String> stringSet = new HashSet<>(); // String νμ μμλ§ μ μ₯ κ°λ₯ Set<Integer> intSet = new HashSet<>(); // Integer νμ μμλ§ μ μ₯ κ°λ₯ Map<String, Integer> map = new HashMap<>(); // ν€λ String, κ°μ Integer νμ μΌλ‘ κ³ μ
Set<E>μμEλ ν΄λΉSetμ΄ λ΄μ μμμ νμ μ λνλ΄λ©°, μ΄ μ»¨ν μ΄λμ λ€λ₯Έ νμ μ κ°μ λ£μ μ μλ€.Map<K,V>μμKμVλ κ°κ° ν€μ κ°μ νμ μ λνλ΄λ©°, μ΄Mapμ νΉμ νμ μ ν€μ κ°λ§ μ¬μ©ν μ μλ€.
λ°λΌμ, μΌλ°μ μΈ μ λ€λ¦ 컨ν
μ΄λμμ λ§€κ°λ³μνλλ λμμ 컨ν
μ΄λ μ체μ΄λ€. Setμ΄λ Mapμ΄λ , νΉμ νμ
μΌλ‘ μ νλ νλμ νμ
μ λ΄κΈ° μν μ€μ μ ν΄μ£Όλ κ²μ΄λ€.
νμ μμ μ΄μ’ 컨ν μ΄λ ν¨ν΄μ 컨ν μ΄λμ λ€μν νμ μ κ°μ²΄λ₯Ό λ΄μ μ μλλ‘ μ€κ³λ ν¨ν΄μ΄λ€.
μ΄ ν¨ν΄μμλ μ λ€λ¦ ν€(
Class<T>)λ₯Ό μ¬μ©ν΄ 컨ν μ΄λ μμ μλ‘ λ€λ₯Έ νμ μ μμλ₯Ό μμ νκ² μ μ₯νκ³ μ‘°νν μ μλ€.
-
νΉμ§:
- 컨ν μ΄λ μμ²΄κ° μλ, ν€λ₯Ό λ§€κ°λ³μννμ¬ μ»¨ν μ΄λμ μ¬λ¬ νμ μ λ΄μ μ μκ² νλ€.
- κ° ν€μ λν΄ ν΄λΉ ν€μ μΌμΉνλ νμ μ κ°μ΄ μ μ₯λλ―λ‘ νμ μμ μ±μ μ μ§νλ€.
-
μμ μ½λ:
public class Favorites { private Map<Class<?>, Object> favorites = new HashMap<>(); public <T> void putFavorite(Class<T> type, T instance) { favorites.put(type, instance); } public <T> T getFavorite(Class<T> type) { return type.cast(favorites.get(type)); } } // μ¬μ© μμ Favorites favorites = new Favorites(); favorites.putFavorite(String.class, "Hello, world!"); // String νμ μ μ₯ favorites.putFavorite(Integer.class, 123); // Integer νμ μ μ₯ String favoriteString = favorites.getFavorite(String.class); // μμ νκ² String νμ μΌλ‘ κΊΌλ Integer favoriteInteger = favorites.getFavorite(Integer.class); // μμ νκ² Integer νμ μΌλ‘ κΊΌλ
Favoritesν΄λμ€λ μ¬λ¬ νμ μ κ°μ λ΄μ μ μμ§λ§,Class<T>νμ ν€λ₯Ό ν΅ν΄ κ° κ°μ νμ μ μλ³νκ³ νμ μ λ°λΌ μμ νκ² μ‘°νν μ μλ€.putFavoriteκ³ΌgetFavoriteλ©μλλ μ λ€λ¦ ν€λ₯Ό ν΅ν΄ κ°μ νμ μ 보μ₯ν©λλ€. μ΄ λ°©μμΌλ‘ νλμ 컨ν μ΄λμ μ¬λ¬ νμ μ κ°μ²΄λ₯Ό μ μ₯ν μ μλ€.
λΉκ΅:
- μΌλ° μ λ€λ¦ 컨ν μ΄λλ νλμ νμ λ§μ λ§€κ°λ³μννμ¬ λμΌ νμ μμλ€λ§ λ΄λ μ©λλ‘ μ¬μ©νλ€.
- νμ
μμ μ΄μ’
컨ν
μ΄λλ ν€(
Class<T>)λ₯Ό ν΅ν΄ μλ‘ λ€λ₯Έ νμ μ κ°μ²΄λ₯Ό λ΄κ³ κ΄λ¦¬ν μ μλλ‘ νλμ 컨ν μ΄λλ‘ μ¬λ¬ νμ μ μμ νκ² κ΄λ¦¬νλ€.
κ²°λ‘ μ μΌλ‘, μ λ€λ¦ 컨ν μ΄λλ 컨ν μ΄λ μ체μ νμ μ λ§€κ°λ³μννκ³ , νμ μμ μ΄μ’ 컨ν μ΄λλ ν€λ₯Ό λ§€κ°λ³μννμ¬ λ€μν νμ μ μμ νκ² κ΄λ¦¬ν μ μλλ‘ νλ€.
1) μ μμ μΈ ν΄λΌμ΄μΈνΈκ° Class κ°μ²΄λ₯Ό μ λ€λ¦μ΄ μλ λ‘ νμ μΌλ‘ λκΈ°λ©΄ Favorites μΈμ€ν΄μ€μ νμ μμ μ±μ΄ μ½κ² κΉ¨μ§λ€.
μλ μ½λμμλ Class λ‘ νμ
μΌλ‘ λ€μ μΊμ€ν
νμ¬ μ λ¬νμΌλ, μ»΄νμΌ νμμμλ λ¬Έμ μμ΄ Map μ μ μ₯μ΄ λλ€. μ΄ν κΊΌλ΄μ¬λ String κ°μ²΄λ₯Ό Integer λ‘ μΊμ€ν
νλ € νλ λ°νμμμ μμΈκ° λ°μνλ€.
f.putFavorite((Class)Integer.class, "λ¬Έμμ΄");
int result = f.getFavorite(Integer.class); // ClassCastException- μμ κ°μ΄ μ
μμ μΌλ‘
(Class)μ κ°μ μΊμ€ν μ ν΅ν΄ λ‘νμ μ μ¬μ©νλ κ²μ λν μ·¨μ½μ μ΄ μλ€. - κ·Έλ₯ μ€ννλ©΄, λ°νμμ
ClassCastExceptionμ λ§λκ² λ κ²μ΄λ€.
μ²¨κ³ λ‘ μ€μ κ°λ°ν λλ μ»΄νμΌ κ³Όμ μμ λΉκ²μ¬ κ²½κ³ κ° λ°μνκΈ° λλ¬Έμ, μ§μΌλ§ μ§λ€λ©΄ λ°νμμ νμ
μμ μ±μ΄ 보μ₯λ κ²μ΄λ€.
μ΄μ²λΌ μΈμ€ν΄μ€κ° νμ
λΆλ³μμ μ΄κΈ°λ μΌμ΄ μλλ‘ λ³΄μ₯νλ €λ©΄, λ€μκ³Ό κ°μ΄ λμ νλ³ν(cast)μ ν΅ν΄ μΈμλ‘ μ£Όμ΄μ§ instance μ νμ
μ΄ type μΌλ‘ λͺ
μν νμ
κ³Ό κ°μμ§ νμΈνλ©΄ λλ€.
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), type.cast(instance));
}νμ©
java.util.Collections μ checkedSet(), checkedList(), checkedMap() λ©μλλ€λ ν΄λΉ λ°©μμ μ μ©ν 컬λ μ
λνΌλ€μ΄λ€. ν΄λΉ ν΄λμ€λ€μ λͺ¨λ CheckedCollection μ μμ λ°μκ³ , typeCheck λ©μλλ₯Ό ν΅ν΄ μΆκ° μ°μ°μμ νμ
μ 체ν¬νμ¬ μμ μ±μ 보μ₯νλ€.
νμ κ²μ¦μ ν΅ν΄ νμ μμ μ±μ μ§ν€λ λ°©μμ μ λ€λ¦ νμ κ³Ό λμ νλ³ν(
cast)μ ν¨κ» μ¬μ©νμ¬ μ»¬λ μ μ΄ νμ©λ νμ μΈμ κ°μΌλ‘ μ€μΌλμ§ μλλ‘ λ°©μ§ν μ μλ€.Collections.checkedList()λ±λ κ°μ μλ¦¬λ‘ λμνμ¬, λ€μν νμ μ λ€λ£¨λ Java νλ‘κ·Έλ¨μμ μκΈ°μΉ λͺ»ν νμ μ€λ₯λ₯Ό λ§μμ£Όλ μ€μν κΈ°λ₯μ νλ€.
λ€μ λ§ν΄, κ·Έλ¬λκΉ,
Stringμ΄λString[]μ μ μ₯ν μ μμ§λ§,List<String>μ μ μ₯ν μ μλ€. Listμ μ μ₯νλ €λ μ½λλ μ»΄νμΌλμ§ μμ κ²μ΄λ€.
{% hint style="info" %} List<E>λ μ€μ²΄ν λΆκ° νμ μ΄λΌλ λ§μ λ» {% endhint %}
μλ°μμ μ λ€λ¦ νμ
μ μΈμ€ν΄μ€ν(instantiation)μ κ΄ν κ²μ΄λ€. μ΄κ²μ μ λ€λ¦ νμ
μ΄ λ°νμ μμ μ€μ νμ
μ 보λ₯Ό μ μ§νμ§ μλλ€λ κ²μ μλ―Ένλ€.
μ λ€λ¦μ μ»΄νμΌ μμλ§ μ ν¨νκ³ λ°νμμλ μκ±°(erasure)λλ€. λ°λΌμ μ»΄νμΌλ¬λ μ λ€λ¦ νμ μ μ¬μ©νμ¬ μ½λλ₯Ό κ²μ¬νμ§λ§, λ°νμμλ μ λ€λ¦ νμ μ μ€μ νμ μ 보λ₯Ό μ κ±°νμ¬ λͺ¨λ μ λ€λ¦ νμ μ μμ νμ (raw type)μΌλ‘ λ³ννλ€. μ΄λ νΈνμ± λ° μνΈνμ±μ μ μ§νκΈ° μν κ²μ΄λ€.
κ·Έ κ²°κ³Όλ‘ μ λ€λ¦ νμ μ λν μ€μ²΄νλ νμ μ 보λ λ°νμμ μ¬μ©ν μ μλ€. λ°λΌμ List<String>κ³Ό κ°μ μ λ€λ¦ νμ μ λ°νμμ Listλ‘λ§ μΈμλλ€. μ΄κ²μ΄ "List<String>μ΄ μ€μ²΄ν λΆκ° νμ "μ΄λΌλ λ§μ μλ―Έλ€.
μ€μ²΄ν λΆκ° νμ
μ 리νλ μ
(reflection)μ μ¬μ©νμ¬ μ λ€λ¦ νμ
μ μ€μ νμ
μ 보λ₯Ό λμ μΌλ‘ μΆμΆνλ κ²μ΄ λΆκ°λ₯νλ€λ κ²μ μλ―Ένλ€. λ°λΌμ λ°νμμμλ μ λ€λ¦ νμ
μ νλΌλ―Έν°νλ νμ
μ 보λ₯Ό μ¬μ©νλ κ²μ μ΄λ €μμ§λ€. νμ§λ§ μ΄κ²μ΄ μ»΄νμΌ μμλ μ λ€λ¦ νμ
μ μμ μ±μ 보μ₯νλ μ΄μ μ€ νλμ΄λ€.
{% hint style="info" %}
μ€νλ§μμλ ParameterizedTypeReferenceλΌλ ν΄λμ€
{% endhint %}
μ°ννκΈ° μν λ°©λ²μΌλ‘λ μνΌ νμ
ν ν°μ μ¬μ©ν μ μλ€. μνΌ νμ
μ ν ν°μΌλ‘ μ¬μ©νλ€λ λ»μ΄λ€.μ€νλ§μμλ ParameterizedTypeReferenceλΌλ ν΄λμ€λ‘ 미리 ꡬνν΄λμλ€.
Favirotes f = new Favorites();
List<String> pets = Arrays.asList("κ°μμ§", "κ³ μμ΄");
f.putFavorite(new TypeRef<List<String>>(){}, pets);
List<String> list = f.getFavorite(new TypeRef<List<String>>(){});μμ²λΌ μ΄μ©νμ¬ ν΄κ²°νλ€.
μΆμ² : https://soft-dino.tistory.com/62
μ€νλ§μ RestTemplateμ μ¬μ©νμ¬ HTTP μμ²μ 보λ΄κ³ , μλ΅μ λ°μ λ μ λ€λ¦ νμ μ μ μ§νκ³ μΆμ κ²½μ°μ μ¬μ©ν μ μλ€.
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
public class ParameterizedTypeReferenceExample {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity("https://api.example.com/data", String.class);
String body = response.getBody();
System.out.println("Response body: " + body);
// μ λ€λ¦ νμ
μ μ μ§νκΈ° μν΄ ParameterizedTypeReference μ¬μ©
ResponseEntity<List<MyObject>> listResponse = restTemplate.exchange(
"https://api.example.com/data",
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<MyObject>>() {}
);
List<MyObject> dataList = listResponse.getBody();
System.out.println("Response body with ParameterizedTypeReference: " + dataList);
}
}μμ μμμμλ RestTemplateμ μ¬μ©νμ¬ GET μμ²μ 보λ΄κ³ μλ΅μ λ°λλ€. 첫 λ²μ§Έ μμ²μ λ¨μν λ¬Έμμ΄μ λ°μμ¨λ€.
νμ§λ§ λ λ²μ§Έ μμ²μ List<MyObject>μ κ°μ μ λ€λ¦ νμ μ λ°μμ¨λ€. μ΄ λ ParameterizedTypeReferenceλ₯Ό μ¬μ©νμ¬ μ λ€λ¦ νμ μ 보λ₯Ό μ μ§νλ€.
μ£Όμμ¬ν
{% hint style="danger" %} ParameterizedTypeReferenceλ₯Ό μ¬μ©ν λ μ£Όμν΄μΌ ν μ μ μ΅λͺ ν΄λμ€λ₯Ό μμ±νλ€λ μ μ΄λ€. {% endhint %}
μ΄λ μ΅λͺ ν΄λμ€λ₯Ό μμ±νλ κ²μ΄λ―λ‘ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ νλλ§ μ¬μ©ν μ μλ€. λ°λΌμ λμΌν μ λ€λ¦ νμ μ λν΄ μ¬λ¬ λ² μ¬μ©νλ €λ©΄ λ§€λ² μλ‘μ΄ ParameterizedTypeReference μΈμ€ν΄μ€λ₯Ό μμ±ν΄μΌ νλ€.
νμ ν κ·Όμ΄λ?
νμ ν ν°μ μ λ€λ¦ νμ μ 보λ₯Ό λ°νμμ μμ νκ² νμ©νκΈ° μν΄ μ¬μ©νλ κ°μ²΄μ΄λ€. μ£Όλ‘
Class<T>λ₯Ό νμ ν ν°μΌλ‘ μ¬μ©νμ¬, νΉμ νμ μ μ 보λ₯Ό λ΄μClassκ°μ²΄λ₯Ό ν€λ‘ νμ©νλ€. μ΄λ₯Ό ν΅ν΄ μ»΄νμΌ μμ μμ νΉμ νμ μ μ§μ νκ³ , λ°νμμ ν΄λΉ νμ μ μΈμ€ν΄μ€λ₯Ό μμ νκ² λ€λ£° μ μκ² λλ€. μλ₯Ό λ€μ΄Map<Class<?>, Object>ννλ‘ μ¬λ¬ νμ μ μμ νκ² λ΄λ 컨ν μ΄λλ₯Ό ꡬνν λ μ μ©νλ€.
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Favorites {
// Class<?> νμ
μ ν€λ‘ νκ³ Object νμ
μ κ°μΌλ‘ κ°μ§λ λ§΅
private Map<Class<?>, Object> favorites = new HashMap<>();
// νμ
ν ν°μ μ¬μ©ν΄ κ°μ²΄ μ μ₯ (T νμ
μΈμ€ν΄μ€)
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), instance);
}
// νμ
ν ν°μ μ¬μ©ν΄ κ°μ²΄ λ°ν, μ μ₯λ νμ
κ³Ό λ§€ννμ¬ λ°ν
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
public static void main(String[] args) {
Favorites f = new Favorites();
// κ° νμ
λ³λ‘ Classλ₯Ό νμ
ν ν°μΌλ‘ μ¬μ©ν΄ μ μ₯
f.putFavorite(String.class, "Java");
f.putFavorite(Integer.class, 42);
f.putFavorite(Class.class, Favorites.class);
// νμ
ν ν°μΌλ‘ μμ νκ² κ°μ²΄λ₯Ό κΊΌλ
String favoriteString = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);
// μΆλ ₯
System.out.printf("%s %d %s%n", favoriteString, favoriteInteger, favoriteClass.getName());
}
}π νμ μ νμ ν ν°μ΄λ?
νμ μ νμ λ§€κ°λ³μ(E extends Delayed)λ νμ μ μμΌλμΉ΄λ(? extends Delayed)μ μ¬μ©νμ¬ νν κ°λ₯ν νμ μ μ ννλ ν ν°
Favoritesκ° μ΄λ€ Class κ°μ²΄λ λ°μλ€μ΄λ―λ‘ λΉνμ μ νμ
ν ν°μ΄λΌ ν μ μλ€. μ΄ λ©μλλ€μ΄ νμ©νλ νμ
μ μ ννκ³ μΆλ€λ©΄, νμ μ νμ
ν ν°μ νμ©νμ.
// λμ μμμ λ¬λ €μλ μ λν
μ΄μ
μ λ°νμμ μ½μ΄ μ€λ κΈ°λ₯
public <T extends Annotation> T getAnnotation(Class<T> annotationType);
μ΄ λ©μλλ ν ν°μΌλ‘ λͺ μν νμ μ μ λν μ΄μ μ΄ λμ μμμ λ¬λ € μλ€λ©΄ κ·Έ μ λν μ΄μ μ λ°ννκ³ , μλ€λ©΄ Nullμ λ°ννλ€. μ΄λ₯Ό ν΅ν΄ μμκ° νμ μμ μ΄μ’ 컨ν μ΄λμ²λΌ λμνκ² νλ€.
μ λν
μ΄μ
APIμ AnnotatedElement μΈν°νμ΄μ€μμ λ°νμμ νΉμ μ λν
μ΄μ
μ κ°μ Έμ€λ λ©μλμ μ
public <T extends Annotation> T getAnnotation(Class<T> annotationType);- μ¬κΈ°μ
annotationTypeμ νμ μ νμ ν ν°μΌλ‘Annotationμ μμλ°λ νμ λ§ λ°μ μ μλλ‘ μ ννλ€. - μ΄ λ©μλλ λͺ
μλ νμ
μ μ λν
μ΄μ
μ΄ μμμ λ¬λ € μμΌλ©΄ ν΄λΉ μ λν
μ΄μ
μ λ°ννκ³ , μμΌλ©΄
nullμ λ°ννλ€. μ΄λ₯Ό ν΅ν΄ μμκ° νμ μμ μ΄μ’ 컨ν μ΄λμ²λΌ λμνκ² νλ€.
μΌλ°μ μΌλ‘ Class<?> νμ
κ°μ²΄λ₯Ό Class<? extends Annotation>λ‘ νλ³ννλ©΄ λΉκ²μ¬ κ²½κ³ κ° λ°μνλ€. νμ§λ§ Class ν΄λμ€μ asSubclass λ©μλλ₯Ό μ¬μ©νλ©΄ λμ νμ
κ²μ¦μ ν΅ν΄ μ΄λ¬ν νλ³νμ μμ νκ² μνν μ μλ€.
static Annotation getAnnotation(AnnotatedElement element, String annotationTypeName) {
Class<?> annotationType = null; // λΉνμ μ νμ
ν ν°
try {
annotationType = Class.forName(annotationTypeName);
} catch (Exception ex) {
throw new IllegalArgumentException(ex);
}
// `asSubclass`λ₯Ό ν΅ν΄ μμ νκ² νλ³ννμ¬ νμ μ νμ
ν ν° μ μ©
return element.getAnnotation(annotationType.asSubclass(Annotation.class));
}asSubclass λ©μλμ μν
asSubclassλ©μλλ νΈμΆλClass<?>κ°μ²΄λ₯Ό μμ νκ² μ§μ λClassμ μλΈν΄λμ€λ‘ νλ³ννλ€.- μ΄λ νλ³νμ μ±κ³΅νλ©΄ μΈμλ‘ λ°μ ν΄λμ€ κ°μ²΄λ₯Ό λ°ννκ³ , μ€ν¨ μ
ClassCastExceptionμ λμ§λ€.
컨ν μ΄λ μμ²΄κ° μλ ν€λ₯Ό νμ λ§€κ°λ³μλ‘ λ°κΎΈλ©΄ νμ μμ μ΄μ’ 컨ν μ΄λλ₯Ό λ§λ€ μ μλ€.
컬λ μ
APIλ‘ λνλλ μΌλ°μ μΈ μ λ€λ¦ ννμμλ ν 컨ν
μ΄λκ° λ€λ£° μ μλ νμ
λ§€κ°λ³μμ μκ° κ³ μ λμ΄ μλ€. νμ§λ§ 컨ν
μ΄λ μμ²΄κ° μλ ν€λ₯Ό νμ
λ§€κ°λ³μλ‘ λ°κΎΈλ©΄ μ΄λ° μ μ½μ΄ μλ νμ
μμ μ΄μ’
컨ν
μ΄λλ₯Ό λ§λ€ μ μλ€.
Classλ₯Ό ν€λ‘ μ°λ©°, μ΄λ κ² μ°μ΄λClassκ°μ²΄λ₯Ό νμ ν ν°μ΄λΌ νλ€.- μ§μ ꡬνν ν€ νμ λ μ¬μ© κ°λ₯νλ€.
- λ°μ΄ν°λ² μ΄μ€μ νμ ννν
DatabaseRowνμ μλ μ λ€λ¦ νμ μΈColumn<T>λ₯Ό ν€λ‘ μ¬μ©ν μ μλ€.
μΆμ² λ° μ°Έκ³
.png)



