Generic κ³Ό Enum
1. Generic
1.1 νμ
νλΌλ―Έν° λ¬Έλ²
Java μ μ λλ¦(Generic) μ ν΄λμ€, μΈν°νμ΄μ€, λ©μλλ₯Ό μ μν λ νμ
νλΌλ―Έν°(type parameter) λ₯Ό μ¬μ©νμ¬ λ€μν νμ
μ λν΄ λμνλ μΌλ°νλ μ½λλ₯Ό μμ±ν μ μκ² ν΄μ£Όλ κΈ°λ₯μ. νμ
νλΌλ―Έν°λ λ³΄ν΅ <>
κΊ½μ κ΄νΈλ‘ νννλ©°, ν΄λμ€λ μΈν°νμ΄μ€ μ΄λ¦ λ€ λλ λ©μλ μ μΈλΆμμ λͺ
μν¨. μλ₯Ό λ€μ΄ JDK μ List<E>
μΈν°νμ΄μ€λ μμμ νμ
μ λνλ΄λ μ λ€λ¦ νμ
λ§€κ°λ³μ E
λ₯Ό μ μΈνλ©°, Iterator<E>
μ ν¨κ» μ λ€λ¦μΌλ‘ μ μλμ΄ μμ. λν Comparable<T>
μΈν°νμ΄μ€ μμ int compareTo(T o)
μ κ°μ΄ νμ
νλΌλ―Έν° T
λ₯Ό μ¬μ©ν¨. μ΄λ¬ν <T>
, <K, V>
μ κ°μ νκΈ°λ²μ κ°κ° νμ
νλΌλ―Έν°μ μ΄λ¦μ λνλ΄λ©°, μ¬λ¬ κ°μΌ λ μΌνλ‘ κ΅¬λΆν¨.
μ λ€λ¦ νμ
μ μ¬μ© μμ ꡬ체μ μΈ νμ
μΈμλ₯Ό μ 곡νμ¬ νλΌλ―Έν°ν λ νμ
μ λ§λ¬. μλ₯Ό λ€μ΄ List<String>
μ List<E>
μ E
λ₯Ό String
μΌλ‘ μ§μ ν νλΌλ―Έν°ν νμ
μ. ν΄λμ€μ μΈν°νμ΄μ€μμλ μλμ κ°μ΄ νμ
νλΌλ―Έν°λ₯Ό μ μΈνκ³ μ¬μ©ν μ μμ. λ©μλμλ μ λ€λ¦μ μ μ©ν μ μλλ°, λ©μλ λ¦¬ν΄ νμ
μμ <T>
λ±μ λͺ
μνμ¬ μ λ€λ¦ λ©μλ λ‘ μ μΈν¨. (μμ±μμλ μ λ€λ¦ νμ
νλΌλ―Έν°λ₯Ό μ μΈν μ μμ.)
//μ λ€λ¦ μΈν°νμ΄μ€ μμ : μ
λ ₯ νμ
Fλ₯Ό μΆλ ₯ νμ
Tλ‘ λ³ννλ μΈν°νμ΄μ€
interface Converter<F, T> {
T convert(F from);
}
// μ λ€λ¦ ν΄λμ€ μμ : λ κ°μ κ°μ μμΌλ‘ 보κ΄νλ ν΄λμ€
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
// μ λ€λ¦ λ©μλ μμ : λ°°μ΄μ λͺ¨λ μμλ₯Ό μΆλ ₯νλ λ©μλ
class GenericUtils {
public static <T> void printArray(T[] arr) {
for(T element : arr) {
System.out.println(element);
}
}
}
μ μ½λμμ Converter<F, T>
λ μΈν°νμ΄μ€μ νμ
νλΌλ―Έν° μ¬μ© μμμ΄λ©°, Pair<K, V>
λ ν΄λμ€μ λ κ°μ νμ
νλΌλ―Έν°λ₯Ό μ μΈν μμ. GenericUtils.printArray
λ©μλλ <T>
λΌλ νμ
νλΌλ―Έν°λ₯Ό μ μΈνμ¬, λ©μλ λ΄λΆμμ μμμ μ°Έμ‘°ν νμ
λ°°μ΄μ λ°μ μΆλ ₯ν μ μλλ‘ ν μ λ€λ¦ λ©μλ μ. μ΄μ²λΌ μ λ€λ¦ νμ
μ΄λ λ©μλλ₯Ό μ μΈν λ νμ
λ§€κ°λ³μλ₯Ό νμ
μ΄ νμν μμΉ(νλ νμ
, λ©μλ νλΌλ―Έν° λ° λ³ν νμ
λ±) μ μ¬μ©ν μ μμ. μ€μ μ¬μ© μμλ new Pair<String, Integer>("apple", 3)
μ²λΌ νμ
μΈμλ₯Ό ꡬ체μ μΈ νμ
μΌλ‘ μ§μ ν΄μΌ νλ©°, μ»΄νμΌλ¬λ μ λ€λ¦ νμ
μ κ²μ¬νμ¬ νμ
μμ μ±μ 보μ₯ν΄μ€. (Java 7 λΆν°λ μμ±μ νΈμΆ μ νμ
μΆλ‘ μ΄ κ°λ₯ν΄ new Pair<>("apple", 3)
μ κ°μ΄ μμ±μμͺ½ κΊ½μ λ₯Ό μλ΅νλ λ€μ΄μλͺ¬λ μ°μ°μ λ μ¬μ©ν μ μμ.)
1.2 μ μ½ μ‘°κ±΄κ³Ό bounded type(extends, λ€μ€ bound λ±)
μ λ€λ¦ νμ
νλΌλ―Έν°λ μ μ½ μ‘°κ±΄(bound) μ μ§μ νμ¬ μ¬μ©ν νμ
μ μν λλ ννμ μ νν μ μμ. μν κ²½κ³(Upper Bound) λ₯Ό μ§μ ν λλ extends
ν€μλλ₯Ό μ¬μ©ν¨. μλ₯Ό λ€μ΄ class NumberBox<T extends Number>
λΌκ³ μ μΈνλ©΄ μ΄ ν΄λμ€μ νμ
νλΌλ―Έν° T
λ Number
μ νμ ν΄λμ€λ€λ§ νμ©λ¨. μΈν°νμ΄μ€μ λν μνλ extends
λ‘ νκΈ°νλ©°, μ¬λ¬ κ°μ μνμ μ§μ νλ λ€μ€ bound λ κ°λ₯ν¨. μλ₯Ό λ€μ΄ <T extends Number & Comparable<T>>
λΌκ³ νλ©΄ T
λ Number
λ₯Ό μμλ°κ³ λμμ Comparable<T>
μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€μ¬μΌ ν¨. λ€μ€ bound λ₯Ό μ§μ ν λλ ν΄λμ€λ ν λ²λ§ μ§μ ν μ μκ³ (Number
κ°μ ν΄λμ€ μνμ λ μ΄μ λμ΄ν μ μμ), ν΄λμ€ μνμ μ μΌ μμ μ μ΄μΌ ν¨. μΈν°νμ΄μ€ μνμ μ¬λ¬ κ° μ§μ ν μ μμΌλ©°, &
κΈ°νΈλ‘ μ°κ²°ν¨.
νμ
νλΌλ―Έν°μ μνμ μ§μ νλ©΄ κ·Έ νμ
μΌλ‘ μ¬μ©ν μ μλ λ©€λ²λ λ©μλκ° μ νμ λ°λΌ λ¬λΌμ§. μλ₯Ό λ€μ΄ <T extends Number>
λ‘ μ μΈλ T
λ Number
μ λ©μλλ€(intValue()
, doubleValue()
λ±) μ μ¬μ©ν μ μμ. λ°λ©΄ νν κ²½κ³(Lower Bound) λ νμ
νλΌλ―Έν° μ μΈμμλ μ§μ μ¬μ©ν μ μκ³ (μ λ€λ¦ νμ
λ§€κ°λ³μμ super
λ₯Ό μ¬μ©ν μλ μμ.) ννμ μ£Όλ‘ μμΌλμΉ΄λμμ μ¬μ©λ¨.(μλ μμΌλ μΉ΄λ μΉμ
μ°Έμ‘°). μ 리νλ©΄, νμ
λ³μμ μ νμλ extends
λ₯Ό μ¬μ©νκ³ , Java μ λ€λ¦μμλ ν΄λμ€λ μΈν°νμ΄μ€λ μ νμλ λͺ¨λ extends
λ₯Ό μ΄λ€λ μ μ μ μν΄μΌν¨. (implements
λ₯Ό μ°μ§ μμΌλ©°, super
λ νμ
λ³μ μ μΈμμλ νμ©λμ§ μμ)
λ€μμ νμ
νλΌλ―Έν°μ μνμ μ μ©ν ν΄λμ€ μμμ. RestrictedBox
λ νμ
λ§€κ°λ³μ T
λ₯Ό Number
μ νμμ΄λ©΄μ Comparable<T>
λ₯Ό ꡬνν νμ
μΌλ‘ μ ννκ³ μμ. λ°λΌμ T
λ μ«μ νμ
(Number νμ) μ΄λ©° μλ‘ λΉκ΅ κ°λ₯νλ―λ‘, ν΄λμ€ λ΄λΆμμ compareTo
λ₯Ό μ¬μ©ν μ μμ.
// λ€μ€ μν(Bound) μ κ°μ§λ μ λ€λ¦ ν΄λμ€ μμ
class RestricedBox<T extends Number & Comparable<T>> {
private T value;
public RestrictedBox(T value) {
this.value = value;
}
public T getValue() {
return value;
}
// κ°κ³Ό λ€λ₯Έ T κ°μ ν¬κΈ°λ₯Ό λΉκ΅νλ λ©μλ (Comparable<T> μ¬μ© κ°λ₯)
public int compareTo(T other) {
return value.compareTo(other);
}
}
μ μ½λμ²λΌ <T extends μμνμ
>
ννλ‘ μ μΈνλ©΄ Tλ ν΄λΉ μμνμ
μΌλ‘ μ νλ¨. λ§μ½ T μ μ¬λ¬ 쑰건μ κ±Έκ³ μΆλ€λ©΄ <T extends ClassA & InterfaceB & InterfaceC>
μ κ°μ΄ μ μΈν¨. μ£Όμ : μνμ ν΄λμ€λ νλλ§ μ§μ κ°λ₯νλ©°, ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό ν¨κ» μ§μ νλ€λ©΄ ν΄λμ€ μνμ λ¨Όμ λͺ
μν΄μΌ ν¨.
1.3 μμΌλμΉ΄λ(?, ? extends, ? super)
μ λ€λ¦μ μ¬μ©νλ€ λ³΄λ©΄, ꡬ체μ μΈ νμ
μΈμλ₯Ό μ§μ νμ§ μκ³ , μμΌλμΉ΄λ(?) λ‘ ννν΄μΌ νλ κ²½μ°κ° μμ. μμΌλμΉ΄λλ μ λ€λ¦ νμ
μ μ¬μ©ν λ κ·Έ νμ
μ΄ μ΄λ€ νμ
μΈμ§ νμ€νμ§ μκ±°λ μκ΄ μμ μ λνλ΄λ μ©λλ‘, ?
λ¨λ
μΌλ‘ λλ extends
, super
ν€μλμ ν¨κ» μ¬μ©ν¨.
?
(무μ ν μμΌλ μΉ΄λ) : νΉμ μ ν μμ΄ "μ΄λ€ νμ μ΄λ λ μ μλ€." λ μλ―Έλ₯Ό κ°μ§. μλ₯Ό λ€μ΄List<?>
λ "μ무 νμ μ κ°μ²΄λ₯Ό λ΄μ μ μλ 리μ€νΈ" λ₯Ό λ»ν¨.List<?>
λ μ¬μ€μList<? extends Object>
μ λμΌν¨. μμΌλμΉ΄λλ₯Ό μ ν μμ΄ μ¬μ©ν λλ μ£Όλ‘ λ©μλ λ΄λΆμμ νμ μ μμ‘΄νμ§ μλ λ‘μ§μ μ²λ¦¬νκ±°λ, μ λ€λ¦ νμ κ°μ κ΄κ³λ₯Ό κ°μ ν νμκ° μμ λμ. 무μ ν μμΌλμΉ΄λμΌ κ²½μ° λ°μ΄ν°λ₯Ό μΆκ° μ½μ ν μ μκ³ (νμ μ μ μ μμΌλ―λ‘ μ»΄νμΌλ¬κ° λ§μ), κ°μ Έμ¬ λλObject
νμ μΌλ‘λ§ μ»μ μ μμ.? extends T
(μνμ΄ μλ μμΌλμΉ΄λ) : ꡬ체μ μΈ νμ μΈμλ λͺ¨λ₯΄μ§λ§ μ΄λ€ νΉμ νμT
μ νμ νμ μΌλ‘ μ ννκ³ μΆμ λ μ¬μ©ν¨.? extends T
μμΌλ μΉ΄λλ₯Ό μ¬μ©ν μ λ€λ¦ νμ μ ν΄λΉ νμ μμ κ°μ κΊΌλ΄(read) λ³Ό λ μμ νκ²T
λ‘ μ·¨κΈ ν μ μλ€λ μ₯μ μ΄ μμ. μλ₯Ό λ€μ΄List<? extends Number>
λNumber
μ νμ νμ λ€λ‘ ꡬμ±λ 리μ€νΈλ₯Ό κ°λ¦¬ν¬ μ μλλ°, μ΄ λ¦¬μ€νΈμμ μμλ₯Ό κΊΌλ΄λ©΄ νμNumber
λ‘ λ°μλ€μΌ μ μμ. κ·Έλ¬λ μ»΄νμΌλ¬λ 리μ€νΈμ μλ‘μ΄ μμλ₯Ό μΆκ°νλ κ²μ λ§μ. μλνλ©΄List<? extends Number>
κ° κ°λ¦¬ν€λ μ€μ 리μ€νΈκ°List<Integer>
μΈμ§List<Double>
μΈμ§ μ μ μκΈ° λλ¬Έμ, μμμNumber
λ₯Ό λ£λ μμ μ νμ λΆμΌμΉ μνμ΄ μκΈ° λλ¬Έμ. λ°λΌμ? extends T
λ₯Ό μ°λ©΄ μ½κΈ° μ μ© μΌλ‘ μ¬μ©νκ² λκ³ , μΆκ° μ½μ μ ν μ μμ.(null μΆκ° μ λλ§ μμΈμ μΌλ‘ νμ©λμ§λ§ νΉλ³ν κ²½μ°λ₯Ό μ μΈνλ©΄ νμ©λμ§ μμ)? super T
( ννμ΄ μλ μμΌλ μΉ΄λ ) : μ΄λ€ νΉμ νμT
μ μμ νμ μΌλ‘ μ ννκ³ μΆμ λ μ¬μ©ν¨.? super T
μμΌλμΉ΄λλ₯Ό μ¬μ©ν μ λ€λ¦ νμ μ ν΄λΉ νμ μ κ°μ μΆκ°(write) ν λ μμ νκ²T
νμ μΌλ‘ λ£μ μ μλ€ λ νΉμ§μ΄ μμ. μλ₯Ό λ€μ΄List<? super Integer>
λInteger
μ μμ νμ 리μ€νΈ(List<Number>
,List<Object>
λ±)λ₯Ό κ°λ¦¬ν¬ μ μλλ°, μ΄ λ¦¬μ€νΈμInteger
κ°μ μΆκ°νλ κ²μ νμ μμ ν¨. μλνλ©΄ μ€μ 리μ€νΈκ°Number
λObject
νμ μ 리μ€νΈλΌλ©΄Integer
λ κ·Έ νμλ‘μ μ μ₯λ μ μκΈ° λλ¬Έμ. νμ§λ§ λ°λλ‘ κΊΌλ΄μ¬ λλ νμ μ΄ λͺ¨νΈνλ―λ‘Object
λ‘λ§ μ»μ μ μμ. λ°λΌμ? super T
λ₯Ό μ°λ©΄ μ°κΈ° μ μ© λͺ©μ μΌλ‘ νμ©λλ©°, μμλ₯Ό μ½μ΄μ μ¬μ©ν λλ μ¦μT
νμ μμ 보μ₯νμ§ λͺ»ν¨.(νμνλ€λ©΄ μΊμ€ν μ΄ νμν¨.)
μ΄λ¬ν μμΌλμΉ΄λ μ¬μ© ν¨ν΄μ μμ½νλ μ λͺ
ν μμΉμ΄ PECS(Producer Extends, Consumer Super) μ. μ¦, λ°μ΄ν°λ₯Ό μμ°(μ 곡) νλ λ§€κ°λ³μλ ? extends
λ‘ λ°κ³ , μλΉ(μΆκ° μ μ₯) νλ λ§€κ°λ³μλ ? super
λ‘ λ°μΌλΌλ κ°μ΄λλΌμΈμ. λ§μ½ ν λ³μμμ λ°μ΄ν° μ
λ ₯κ³Ό μΆλ ₯ μν μ λͺ¨λ ν΄μΌ νλ€λ©΄ μμΌλμΉ΄λλ₯Ό μ°μ§ μκ³ νμ
νλΌλ―Έν° μ체λ₯Ό μ¬μ©νλ κ²μ΄ μμ ν¨.
μμΌλμΉ΄λ νμ© μμ½ :
List<? extends T>
:T
μ νμ νμ λ€μ λ΄λ 리μ€νΈ. μ½κΈ° λT
λ‘ μμ νκ² κ°λ₯, μ°κΈ° (μΆκ°)λ λΆκ°λ₯.(Producer μ©λ)
List<? super T>
:T
μ μμ νμ λ€μ λ΄λ 리μ€νΈ. μ½κΈ° μμλObject
λ‘λ§ νλ, μ°κΈ° λT
(λλ κ·Έ νμ) κ°μ²΄ μΆκ° κ°λ₯.(Comsumer μ©λ)
List<?>
: λΆνΉμ νμ μ 리μ€νΈ.Object
μ΄μΈ ꡬ체μ νμ μΌλ‘ μ½κΈ° λΆκ°, μ°κΈ° λΆκ°.(List<? extends Object>
μ λμΌ)
μμΌλ μΉ΄λμ λμ μμ
μλ μ½λμμ ? extends Number
μ ? super Integer
리μ€νΈμ μ°¨μ΄λ₯Ό 보μ¬μ€.
List<Integer> intList = Arrays.asList(1, 2, 3);
List<? extends Number> numList = intList;
Number num = numList.get(0); // OK : Number λ‘ μ½κΈ°
// numList.add(4); // μ»΄νμΌ μ€λ₯ : extends μμΌλμΉ΄λλ μΆκ° λΆκ°
List<Object> objList = new ArrayList<>();
List<? super Integer> superList = objList;
superList.add(100); // OK : Integer μΆκ° κ°λ₯
Object obj = superList.get(0); // OK : Ojbect λ‘ μ½κΈ°( Integer μμ μ μ μμ)
μ μ½λμμ numList
λ Integer
리μ€νΈλ₯Ό λ°μμ§λ§ List<? extends Number>
λ‘ μ μΈλμκΈ° λλ¬Έμ Number
λ‘ κ° μ½κΈ°(get
) κ° κ°λ₯ν¨. κ·Έλ¬λ add
λ©μλλ μ»΄νμΌ μλ¬μΈ κ²μ λ³Ό μ μμ. λ°λλ‘ superList
λ Object
리μ€νΈλ₯Ό κ°λ¦¬ν€μ§λ§ List<? super Integer>
νμ
μΌλ‘ μ μΈλμκΈ° λλ¬Έμ Integer
κ°μ μΆκ°(add
) νλ κ²μ νμ©λ¨. λ€λ§ get
μΌλ‘ κ°μ Έμ¨ κ°μ Object
νμ
μΌλ‘λ§ μ»μ΄μ§. μ΄μ²λΌ μμΌλμΉ΄λλ μ λ€λ¦ νμ
μ λ³΄λ€ μ μ°νκ² λ€λ£¨κ² ν΄μ£Όμ§λ§, extends
μ super
μ λ°λΌ μ½κΈ°/μ°κΈ°μ μ μ½μ΄ λ€λ₯΄λ―λ‘ μ μμΉμ λ°λΌ μ¬μ©νλ κ²μ΄ μ’μ.
1.4 νμ
μκ±°(Type Erasure)μ μ λ€λ¦μ νκ³
Java μ μ λ€λ¦μ μ»΄νμΌ νμ μλ§ μ ν¨νκ³ λ°νμμλ νμ μ λ³΄κ° μκ±° λ¨. μ΄λ₯Ό νμ μκ±°(type erasure) λΌκ³ λΆλ₯΄λ©°, Java μ»΄νμΌλ¬λ μ λ€λ¦μ ꡬννκΈ° μν΄ μ»΄νμΌ μ λ€μκ³Ό κ°μ μμ μ μνν¨.
λͺ¨λ μ λ€λ¦ νμ λ³μλ€μ κ·Έ μν κ²½κ³ νμ μ΄λ Object λ‘ λμΉ ν¨.(μν κ²½κ³κ° μλ€λ©΄
Object
λ‘ μΉν). μλ₯Ό λ€μ΄ μ»΄νμΌλ¬λList<String>
κ³ΌList<Integer>
λ₯Ό λ λ€ λ΄λΆμ μΌλ‘λ λ¨μνList
(νΉμList<Object>
) λ‘ κ°μ£Όν¨.μ λ€λ¦μΌλ‘ μΈν΄ νμν΄μ§ νμ μΊμ€ν μ½λλ₯Ό μ μ ν μ½μ νμ¬ νμ μμ μ±μ μ μ§ν¨.
μ λ€λ¦ νμ μ μμνμ¬ νμμμ νλ³νλλ κ²½μ° bridge method λ±μ μμ±νμ¬ λ€νμ±μ΄ μ λλ‘ μ μ§λλλ‘ ν¨.
κ·Έ κ²°κ³Ό λ°μ΄νΈμ½λμλ μ λ€λ¦ νμ μ λ³΄κ° λ€μ΄κ°μ§ μμΌλ©° , λ°νμμλ μ λ€λ¦ νμ μΈμμ λ°λ₯Έ λ³λμ ν΄λμ€κ° μμ±λμ§ μμ. λ°λΌμ μ λ€λ¦ μμ²΄λ‘ μΈν λ°νμ μ€λ²ν€λλ μ‘΄μ¬νμ§ μμ . μ΄λ C++μ ν νλ¦Ώκ³Ό λ¬λ¦¬, Java μ μ λ€λ¦μ μ»΄νμΌ μμλ§ λμνκ³ λ°νμμ μν₯μ΄ μλ€λ μ€μν νΉμ§μ.
νμ§λ§ νμ μκ±°λ‘ μΈν΄ λͺ κ°μ§ μ μ½μ¬νκ³Ό μ£Όμμ μ΄ μκΉ.
instanceof
μ μΊμ€ν μ μ ν : λ°νμμλ μ λ€λ¦ νμ μΈμ μ λ³΄κ° μ§μμ§λ―λ‘, νΉμ μ λ€λ¦ νμ μΌλ‘μinstanceof
κ²μ¬λ λΆκ°λ₯ν¨. μλ₯Ό λ€μ΄obj instanceof List<String>
μ κ°μ μ½λλ μ»΄νμΌ μ€λ₯μ. μ΄λ JVM μ΄ λ°νμμList<String>
κ³ΌList<Integer>
λ₯Ό ꡬλΆν μ μκΈ° λλ¬Έμ. μ€μ λ‘new ArrayList<String>()
λ‘ λ§λ 리μ€νΈμnew ArrayList<Integer>()
λ‘ λ§λ 리μ€νΈμ ν΄λμ€νμ μ μΆλ ₯ν΄λ³΄λ©΄ λ λ€java.util.ArrayList
λ‘ λνλ¨. μλ₯Ό λ€μ΄:
List<String> listA = new ArrayList<>();
List<Integer> listB = new ArrayList<>();
System.out.println(listA.getClass() == listB.getClass()); // true(λλ€ ArrayList)
μ κ²°κ³Όμμ λ 리μ€νΈμ ν΄λμ€κ° λμΌ(ture
) ν¨μ νμΈν μ μμ. μ¦, λ°νμμλ μ λ€λ¦ νμ
μΈμμ ꡬλΆμ΄ μλ κ²μ. λ°λΌμ, instanceof ArrayList<String>
κ°μ μ½λλ μλ―Έκ° μμΌλ©° μ»΄νμΌλ¬κ° μ΄λ₯Ό κΈμ§ν¨. instanceof
λ μ€μ§ μμ(raw) νμ
μ΄λ νμ λμ§ μμ μμΌλμΉ΄λ(ArrayList<?>
) λ±μ λν΄μλ§ μ¬μ©ν μ μμ.
μ λ€λ¦ νμ μ λ°°μ΄ μμ± λΆκ° : μ λ€λ¦ νμ μ 보λ λ°νμμ μκ±°λλ―λ‘, μ λ€λ¦ νμ μ λ°°μ΄ μ μμ±ν μ μμ. μλ₯Ό λ€μ΄
List<String>[] array = new List<String>[10];
κ³Ό κ°μ μ½λλ μ»΄νμΌ μ μ€λ₯κ° λ°μν¨. μ΄λ λ°°μ΄μ΄ λ°νμμ μμ μ΄ λ΄λ μμμ νμ μ νμΈνλ νΉμ§(곡λ³μ±) μ΄ μλλ°, μ λλ¦ νμ μ λ°°μ΄μ κ²½μ° μ΄γ λ₯Ό κ²μ¬ν λ°©λ²μ΄ μκΈ° λλ¬Έμ. λ§μ½ μ λ€λ¦ λ°°μ΄μ΄ νμ©λλ€λ©΄, λ°°μ΄μ νμ μμ μ±μ κΉ¨λ¨λ¦΄ μ μλ μν©μ΄ μ겨λ λ°νμμ μμΈλ₯Ό λ°μμν€μ§ λͺ»νκ³ μλͺ»λ μΊμ€ν λ¬Έμ κ° λ°μν μ μμ. μ΄λ¬ν μ΄μ λ‘ Java μμλ λΉκ²μ¦(unchecked) μΊμ€νΈ κ²½κ³ λ₯Ό κ°μνκ³Object
λ°°μ΄μ μμ±ν λ€ μ λ€λ¦ νμ μΌλ‘ μΊμ€ν νλ μ°ν λ°©λ²μ μ°μ§ μλ ν, μ§μ μ μΈ μ λ€λ¦ λ°°μ΄ μμ±μ κΈμ§λ¨.κΈ°ν μ ν : μ λ€λ¦ νμ μ μ λ³΄κ° μκ±°λλ―λ‘, ν΄λμ€μ static νλμλ νμ λ³μ μ¬μ©μ΄ λΆκ°λ₯ ν¨. static νλλ ν΄λμ€ μμ€μμ λ¨ νλλ§ μ‘΄μ¬νλλ°, νμ λ§€κ°λ³μλ μΈμ€ν΄μ€λ³λ‘ λ¬λ¦¬μ§ μ μμΌλ―λ‘ λͺ¨μμ΄ μκΈ°κΈ° λλ¬Έμ. λν μμΈ ν΄λμ€(Throwable νμ)μ μ λ€λ¦μ μ μ© ν μ μμΌλ©°, μ λ€λ¦ νμ μ throws μ μ μ¬μ©νκ±°λ catch μ μ νμ λ³μλ‘ μμΈλ₯Ό μ‘λ κ² λ μ νλ¨. λ©μλ μ€λ²λ‘λ© μμλ νμ μκ±° κ²°κ³Ό μκ·Έλμ²κ° κ°μμ§λ κ²½μ° μ€λ²λ‘λ©μ΄ μ±λ¦½λμ§ μμ.( μλ₯Ό λ€μ΄,
void method(List<String> x)
μvoid method(List<Integer> x)
λ λ λ€void method(List x)
λ‘ μκ±°λλ―λ‘ λμμ μ μν μ μμ).
μμ½νλ©΄, Java μ μ λ€λ¦μ μ»΄νμΌλ¬κ° κ°ν νμ
κ²μ¬λ₯Ό ν΄μ£Όλ λ¬Έλ²μ μΈ μ₯μΉμ΄λ©°, λ°νμμλ λͺ¨λ μ λ€λ¦ νμ
μ΄ μμ νμ
(raw type) μΌλ‘ μ·¨κΈ λ¨. μ΄λ¬ν ꡬνμΌλ‘ μ±λ₯μ μ΄μ μ΄ μμ§λ§, μμ κ°μ νκ³μ μ μν΄μ ν¨. νΉν instanceof
λ λ°°μ΄ μμ± μμλ μ λ€λ¦ νμ
μ 보λ₯Ό μ¬μ©ν μ μλ€λ μ μ κΈ°μ΅ν΄μΌ ν¨.
List<String> list = new ArrayList<>();
// if (list instanceof ArrayList<String>) { ... } // μ»΄νμΌ μ€λ₯: μ λ€λ¦ νμ
μΌλ‘ instanceof λΆκ°
// List<String>[] listArray = new List<String>[5]; // μ»΄νμΌ μ€λ₯: μ λ€λ¦ λ°°μ΄ μμ± λΆκ°
// (μ£Όμ) μ λ€λ¦ νμ
μ λ°νμ νμ
νμΈμ λΆκ°λ₯
System.out.println(list.getClass()); // μΆλ ₯ μ: class java.util.ArrayList (νμ
μΈμ λΆλͺ
)
μ μ½λμμ 보λ―μ΄, instanceof ArrayList<String>
κ°μ κ²μ¬λ νμ©λμ§ μμΌλ©° μ λ€λ¦ λ°°μ΄ μμ±λ μ»΄νμΌμ΄ λ§μ. λ§μ§λ§ μΆλ ₯ κ²°κ³Όμμ list
μ μ€μ ν΄λμ€ νμ
μ ArrayList
λ‘λ§ λνλκ³ , <String>
μ 보λ νμΈν μ μμ. μ΄μ²λΌ μ λ€λ¦μ μ€λ‘μ§ μ»΄νμΌ μμ μ νμ
μμ μ±μ μν λꡬ μ΄λ©°, λ°νμμλ νμ
μ΄ μ§μμ§λ€λ μ¬μ€μ μ΄ν΄ν΄μΌν¨.(νμνλ€λ©΄ 리νλ μ
λ±μ κΈ°λ²μΌλ‘ μΌλΆ μ λ€λ¦ νμ
μ 보 (Class<T>
μΈμ λ±) λ₯Ό λ€λ£° μ μμ§λ§, μΌλ°μ μΈ μν©μμλ νμ
μκ±°λ‘ μΈν΄ μ λ€λ¦ νμ
μΈμλ λ°νμμ νμ©λμ§ μμ.)
2. μ΄κ±°ν(Enum)
2.1 κΈ°λ³Έ λ¬Έλ²κ³Ό μ¬μ© μ
Java μ μ΄κ±°ν(enum) μ λͺ κ°μ§ μμλ€μ μ§ν© μ νλμ νμ
μΌλ‘ νννλ νΉλ³ν ν΄λμ€μ. enum μ ν΄λμ€μ μ μ¬νκ² μ μνμ§λ§, 미리 μ ν΄μ§ μ¬λ¬ μμ(constants) λ₯Ό λμ΄νμ¬ κ·Έ κ°λ€λ§ κ°μ§ μ μλλ‘ ν¨. μ μΈ λ¬Έλ²μ enum μ΄κ±°ν μ΄λ¦ { μμ1, μμ2, ... }
ννλ‘ μ¬μ©ν¨. μλ₯Ό λ€μ΄ μμΌμ λνλ΄λ μ΄κ±°νμ λ€μκ³Ό κ°μ΄ μ μν μ μμ.
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
μ΄λ κ² μ΄κ±°λ μ΄λ¦λ€μ΄ Day
enum νμ
μ μμ λ€μ΄λ©°, κ°κ° Day.SUNDAY
, Day.MONDAY
μ²λΌ μ¬μ©ν μ μμ.
μ¬μ€ enum μΌλ‘ μ μΈλ κ° μμλ ν΄λΉ enum νμ
μ public static final κ°μ²΄ λ‘ κ°μ£Όλ¨. Enum νμ
μ λ΄λΆμ μΌλ‘ java.lang.Enum
ν΄λμ€λ₯Ό μμνλ©°, λ€λ₯Έ ν΄λμ€λ₯Ό μμν μλ μμ.(μλ° μΈμ΄μμ λ€μ€ μμμ μ§μνμ§ μμΌλ―λ‘, μ΄λ―Έ Enum μ μμν μ΄κ±°νμ μΆκ° μμμ΄ λΆκ°λ₯ν¨.) λμ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ νλ, λ©μλ, μμ±μλ₯Ό κ°μ§ μ μμ΄μ, λ¨μν μμ λͺ¨μ μ΄μμ κΈ°λ₯μ μ 곡ν¨.
μ»΄νμΌλ¬λ enumμ μ»΄νμΌν λ λͺ κ°μ§ νΈμ κΈ°λ₯μ μλμΌλ‘ μ 곡ν¨. κ·Έ μ€ μμ£Ό μ°μ΄λ κ²μ΄ values()
λ©μλ μ. λͺ¨λ enum νμ
μ λͺ¨λ μμλ₯Ό λ΄μ λ°°μ΄μ λ°ννλ static T[] values() λ©μλ λ₯Ό κ°μ§λ©°, μμ μ μΈ μμμ λ°λΌ λ°°μ΄μ λ΄μ λλ €μ€. μ΄λ₯Ό ν΅ν΄ μ΄κ±°νμ λͺ¨λ κ°λ€μ μν(iterate) ν μ μμ. λν valueOf(String name)
λ©μλλ₯Ό μλ μμ±νμ¬, ν΄λΉ enum νμ
μμ μ£Όμ΄μ§ μ΄λ¦κ³Ό μΌμΉνλ μμ λ₯Ό λ°νν΄μ€. μλ₯Ό λ€μ΄ Day.valueOf("MONDAY")
λ Day.MONDAY
μμλ₯Ό λλ €μ€. μ΄λ μΈμλ‘ μ λ¬ν λ¬Έμμ΄κ³Ό λμΌν μ΄λ¦μ μμκ° μλ€λ©΄ IllegalArgumentException
μ΄ λ°μν¨.
κ·Έ μΈμλ, κ° enum μμλ ordinal()
λ©μλ λ₯Ό κ°μ§κ³ μλλ°, μ΄λ ν΄λΉ μμκ° μ΄κ±°ν μ μΈμμ μ μλ μμ index λ₯Ό μλ―Ένλ μ μλ₯Ό λ°νν¨. μλ₯Ό λ€μ΄ Day.SUNDAY.ordinal()
μ΄ 0
, Day.MONDAY.ordinal()
μ΄ 1
μ λ°ννλ μμ. ( 첫 μμμ ordinal μ΄ 0λΆν° μμ). μ΄ ordinal κ°μ μμμ μμλ₯Ό λνλ΄μ§λ§, μ΄κ±°ν μμμ μμλ λ³κ²½λ μ μμΌλ―λ‘ ordinal κ°μ λΉμ¦λμ€ λ‘μ§μ μ§μ μ¬μ©νλ κ²μ κΆμ₯λμ§ μμ . λμ μμμ κ³ μ ν μλ―Έκ° νμνλ©΄ λ³λμ κ°μ νλλ‘ μ μνλ κ²μ΄ μ’μ. λ§μ§λ§μΌλ‘ name()
λ©μλλ μμ μ μΈλͺ
μ κ·Έλλ‘ λ¬Έμμ΄λ‘ λ°νν¨. μ΄ κ°μ μ΄κ±°ν μ μΈμμμ μ΄λ¦κ³Ό μ ννκ² μΌμΉνλ©°, κΈ°λ³Έμ μΌλ‘ toString()
λ©μλλ κ°μ κ°μ λ°ννμ§λ§ νμμ λ°λΌ toString()
μ μ€λ²λΌμ΄λνμ¬ μΆλ ₯μ©μΌλ‘ λ€λ₯Έ λ¬Έμμ΄μ μ 곡ν μλ μμ.
μμμ½λ
κ°λ¨ν λ 벨(Level) μ΄κ±°νμ μ μνκ³ , μ 곡λλ λ©μλλ€μ νμ©ν μμ.
enum Level { LOW, MEDIUM, HIGH }
for(Level lv : Level.values()) {
System.out.println(lv + " - ordinal: " + lv.ordinal());
}
Level selected = Level.valueOf("HIGH");
System.out.println("Name: " + selected.name());
μ€ν κ²°κ³Ό μ:
LOW - ordinal: 0
MEDIUM - ordinal: 1
HIGH - ordinal: 2
Name: HIGH
μ μμμ Level.values()
λ₯Ό ν΅ν΄ [LOW, MEDIUM, HIGH]
μμμ μμ λͺ©λ‘μ μ»μ΄ for-each
λ‘ μννκ³ , κ° μμμ μ΄λ¦κ³Ό ordinal()
κ°μ μΆλ ₯νμ. κ·Έ λ€μ Level.valueOf("HIGH")
λ₯Ό μ΄μ©ν΄ λ¬Έμμ΄ "HIGH" μ λμλλ μμλ₯Ό μ»μ΄λ΄μ΄, κ·Έ name()
μ μΆλ ₯νμ
values()
: λͺ¨λ μμ λ₯Ό μ μ μμλλ‘ λ΄μ λ°°μ΄μ λ°νvalueOf(String)
: μ΄λ¦κ³Ό μΌμΉνλ μμ λ₯Ό λ°ν.(λμλ¬Έμ μ νν μΌμΉν΄μΌ νλ©°, μμΌλ©΄ μμΈ)ordinal()
: μμμ μμ μΈλ±μ€ (0λΆν° μμ) λ₯Ό λ°ν.name()
: μμμ μ΄λ¦ λ¬Έμμ΄ μ λ°ν. (μ£Όλ‘ λλ²κΉ μ΄λ μ μ₯μ©μΌλ‘ μ¬μ©, νμμtoString()
μ€λ²λΌμ΄λ κ°λ₯)
μ΄ μΈμλ enum μ Enum
ν΄λμ€μ λ©μλμΈ compareTo()
(μ μ μμ λΉκ΅)λ equals()
, hashcode()
λ±μ΄ κΈ°λ³Έ μ 곡λλ©°, switch
λ¬Έμμλ μ΄κ±°ν μμλ₯Ό case λ μ΄λΈλ‘ μ¬μ©ν μ μλ λ± λ€μν νΈμκ° μμ.
2.2 μμλ³ λ©μλ μ€λ²λΌμ΄λ©( μ λ΅ ν¨ν΄ μμ©)
Java μ μ΄κ±°νμ κ° μμλ§λ€ κ°κΈ° λ€λ₯Έ λμμ ꡬν ν μ μλ κ°λ ₯ν κΈ°λ₯μ κ°μ§κ³ μμ. μ¬μ€ μ΄κ±°νμ ν΄λμ€μ΄κΈ° λλ¬Έμ λ΄λΆμ λ©μλλ₯Ό μ μν μ μκ³ , κ° enum μμλ ν΄λΉ enum ν΄λμ€μ μΈμ€ν΄μ€ μ΄λ―λ‘ νμν κ²½μ° μμλ³λ‘ λ©μλλ₯Ό μ€λ²λΌμ΄λ ν μ μμ. μ΄λ₯Ό νμ©νλ©΄ νλμ enum μμλ§λ€ μλ‘ λ€λ₯Έ νλ κ·μΉμ λΆμ¬ν μ μλλ°, μ΄λ¬ν ν¨ν΄μ νν μ λ΅ ν¨ν΄(Strategy Pattern) μ μ΄κ±°νμΌλ‘ ꡬνν κ²κ³Ό μ μ¬ν¨.
μμλ³λ‘ λ©μλλ₯Ό λ€λ₯΄κ² ꡬννλ λ°©λ²μΌλ‘λ μΆμ λ©μλ μ μΈ ν μμλ³ κ΅¬ν μ 곡 μ λ§μ΄ μ¬μ©ν¨. μ¦, enum ν΄λμ€ μμ μΆμ λ©μλλ₯Ό μ μΈνκ³ , κ° μμκ° κ·Έ λ©μλλ₯Ό ꡬ체μ μΌλ‘ μ€λ²λΌμ΄λ νλλ‘ λ§λλ κ²μ. μ΄λ κ² νλ©΄ enum μμλ₯Ό μΆκ°νλ κ²λ§μΌλ‘ μλ‘μ΄ λμμ μ½κ² νμ₯ν μ μκ³ , λ³λμ switch
λ¬Έμ΄λ λΆκΈ° μμ΄ λ€νμ±μ νμ©ν μ μμ. μλλ κ°λ¨ν κ³μ°κΈ° μ°μ°μ enum μΌλ‘ ꡬνν μμμ. Operation
μ΄κ±°νμ μ¬μΉμ°μ°μ λνλ΄λ μμλ€μ κ°μ§λ©°, μΆμ λ©μλ apply
λ₯Ό μ μΈνκ³ κ° μμλ§λ€ μ΄λ₯Ό ꡬνν¨.
enum Operation {
PLUS {
@Override
public int apply(int x, int y) { return x + y; }
},
MINUS {
@Override
public int apply(int x, int y) { return x - y; }
}
MULTIPLY {
@Override
public int apply(int x, int y) { return x * y; }
}
DIVIDE {
@Override
public int apply(int x, int y) { return x / y; }
}
public abstract int apply(int x, int y);
}
// μ¬μ© μ
System.out.println(Operation.PLUS,apply(3,4)); // result : 7
System.out.println(Operation.DIVIDE.apply(8,2)); // result : 4
μ μ½λμμ Operation
enum μ apply(int, int)
λΌλ μΆμ λ©μλλ₯Ό κ°μ§κ³ μκ³ , κ° μμ(PLUS, MINUS, MULTIPLY, DIVIDE) κ° μμ λ§μ λ°©μμΌλ‘ μ΄ λ©μλλ₯Ό ꡬννκ³ μμ. Operation.PLUS.apply(3,4)
λ λ΄λΆμ μΌλ‘ PLUS μμμ ꡬνλ μ½λλ₯Ό μ€ννμ¬ 3 + 4 κ²°κ³Όλ₯Ό λ°ννκ³ , Operation.DIVIDE.apply(8,2)
λ DIVIDE μμμ ꡬνμ μ€νν¨. μ΄μ²λΌ κ° μμκ° λ
립μ μΈ λ‘μ§μ κ°μ§ μ μμΌλ―λ‘, μλ‘μ΄ μ°μ°μ μΆκ°νλ €λ©΄ enum μ μμλ₯Ό μΆκ°νκ³ ν΄λΉ μμμ λ©μλλ₯Ό ꡬννκΈ°λ§ νλ©΄ λ¨. λ³λμ 쑰건λΆκΈ° μ½λ λ³κ²½ μμ΄λ νμ₯μ΄ κ°λ₯νλ©°, μ΄κ±°ν μμ²΄κ° μ°μ° μ§ν©κ³Ό λμμ μΊ‘μννλ―λ‘ μ½λκ° κΉλν΄μ§. μ΄κ²μ μΌμ’
μ enum μ μ¬μ©ν μ λ΅ ν¨ν΄ ꡬνμΌλ‘ λ³Ό μ μμΌλ©°, λνμ μΈ νμ© μ¬λ‘μ. (Java API μμλ java.math.RoundingMode
μ κ° μμκ° round
λ©μλλ₯Ό λ€λ₯΄κ² ꡬννλ λ± μ μ¬ν κΈ°λ²μ΄ νμ©λμ΄ μμ)
λ§μ½ enum μμ κ³΅ν΅ λ©μλλ₯Ό κ° μμκ° μλ‘ λ€λ₯΄κ² λμνλλ‘ νκ³ μΆλ€λ©΄ κΌ μΆμ λ©μλκ° μλμ΄λ λ¨. νμν λ©μλλ₯Ό μ μνκ³ , κΈ°λ³Έ ꡬνμ λ£μ λ€ νΉμ μμμμλ§ μ΄λ₯Ό μ€λ²λΌμ΄λ ν μλ μμ. νμ§λ§ λλΆλΆμ κ²½μ° μμ²λΌ μΆμ λ©μλλ₯Ό μ μΈνλ ν¨ν΄μ΄ λ§μ΄ μ°μ. μ΄λ¬ν κΈ°λ₯ λλΆμ μ΄κ±°ν μμ κ°κ°μ΄ νλμ ν΄λμ€μ²λΌ λμνλλ‘ λ§λ€ μ μκ³ , κ΄λ ¨λ μνλ λ©μλλ₯Ό κ°μ§ μλ μμ.
2.3 μ΄κ±°νμ μΈν°νμ΄μ€ ꡬν
μ΄κ±°νμ λ΄λΆμ μΌλ‘ Enum μ νμ₯ν ν΄λμ€ μ΄λ―λ‘, λ€λ₯Έ μΌλ° ν΄λμ€μ²λΌ μΈν°νμ΄μ€λ₯Ό ꡬν(implements) ν μλ μμ. μ΄κ±°νμ΄ μΈν°νμ΄μ€λ₯Ό ꡬννλ©΄, κ·Έ μΈν°νμ΄μ€ νμ μΌλ‘ μ΄κ±°ν μμλ₯Ό λ€λ£° μ μμ΄ λ€νμ±μ΄ μ¦κ°νκ³ , μ΄κ±°ν μμλ€μκ² νΉμ νμλ₯Ό κ°μ ν μ μλ€λ μ₯μ μ΄ μμ. μΈν°νμ΄μ€λ₯Ό ꡬννλ enum μ ν΄λΉ μΈν°νμ΄μ€μ μΆμ λ©μλλ₯Ό ꡬνν΄μΌ νλλ°, μ΄ κ΅¬νμ κ° μμλ³λ‘ λ€λ₯΄κ² ν μλ μκ³ , 곡ν΅λκ² ν μλ μμ. μμλ³λ‘ λ€λ₯΄κ² νλ €λ©΄ μμ μ€λͺ ν κ²μ²λΌ enum λ΄μ μΆμ λ©μλλ₯Ό μ μΈνκ±°λ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆμ λ©μλννμ¬ κ° μμκ° μ€λ²λΌμ΄λνκ² λ§λ€λ©΄ λ¨.
μλ₯Ό λ€μ΄, κ°λ¨ν μΈν°νμ΄μ€λ₯Ό enum μΌλ‘ ꡬνν΄λ΄. λ€μ μ½λλ Greeting
μ΄λΌλ μΈν°νμ΄μ€λ₯Ό λ§λ€κ³ , GreetingType
μ΄κ±°νμ΄ μ΄λ₯Ό ꡬνν μ¬λ‘μ. κ° μμλ greet()
λ©μλλ₯Ό μκΈ°λ§μ λ°©μμΌλ‘ μ€λ²λΌμ΄λνκ³ μμ.
interface Greeting {
void greet();
}
enum GreetingType implements Greeting {
HELLO {
@Override
public void greet() {
System.out.println("Hello!");
}
},
GOODBYE {
@Override
public void greet() {
System.out.println("Goodbye!");
}
}
}
// μ¬μ© μ
Greeting hello = GreetingType.HELLO;
hello.greet(); // result : Hello
GreetingType.GOODBYE.greet(); // result Goodbye!
μμμ GreetingType
μ΄κ±°νμ Greeting
μΈν°νμ΄μ€λ₯Ό ꡬννμΌλ―λ‘, GreetingType
μ λͺ¨λ μμλ Greeting
νμ
μΌλ‘ μ·¨κΈλ μ μμ. HELLO
μ GOODBYE
μμ κ°κ°μ΄ greet()
λ©μλμ ꡬνμ μ 곡νμ¬, νΈμΆ μ μλ‘ λ€λ₯Έ λ©μμ§λ₯Ό μΆλ ₯ν¨. μ΄μ²λΌ μ΄κ±°νμ΄ μΈν°νμ΄μ€λ₯Ό ꡬννλ©΄ κ° μμλ₯Ό μΈν°νμ΄μ€μ ꡬνμ²΄λ‘ νμ© ν μ μμ. μλ₯Ό λ€μ΄ μΈμλ‘ Greeting
νμ
μ λ°λ λ©μλμ GreetingType.HELLO
λ₯Ό μ λ¬ν μ μκ³ , μ΄λ λ€νμ μΌλ‘ λμν¨.
μ΄κ±°νμ μ¬λ¬ μΈν°νμ΄μ€λ₯Ό ꡬνν μλ μμ. μ°Έκ³ λ‘, Java μ λͺ¨λ enum μ μ»΄νμΌ μ μλμΌλ‘ java.lang.Enum
μ μμνκ³ java.lang.Comparable
κ³Ό java.io.Serializable
μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘ λμ΄ μμ. λ°λΌμ enum κ° λΉκ΅λ μ§λ ¬ν λ±μ΄ κΈ°λ³Έμ μΌλ‘ κ°λ₯νλ©°, μΆκ°λ‘ κ°λ°μκ° μνλ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ κΈ°λ₯μ νμ₯ν μ μμ. μΈν°νμ΄μ€λ₯Ό ν΅ν΄ enum μμμ νλμ μΆμννλ©΄, enum μ μ¬μ©νλ μ½λ μ
μ₯μμ ꡬνμ λͺ°λΌλ ν΄λΉ μΈν°νμ΄μ€ λ©μλλ₯Ό νΈμΆνμ¬ μΌκ΄λ λμμ μ΄λμ΄λΌ μ μλ€λ μ΄μ λ μμ.
2.4 EnumSet κ³Ό EnumMap
Java Collections Framework λ μ΄κ±°νκ³Ό ν¨κ» μ°κΈ°μ μ΅μ νλ 컬λ μ
ꡬνμ²΄λ‘ EnumSet κ³Ό EnumMap ν΄λμ€λ₯Ό μ 곡ν¨. μ΄λ€μ λ΄λΆ ꡬνμ μ΄κ±°νμ νΉννμ¬, μ΄κ±°ν μμλ₯Ό λ€λ£° λ μ±λ₯κ³Ό λ©λͺ¨λ¦¬ ν¨μ¨μ λμΌ μ μλ μλ£κ΅¬μ‘°μ. μ΄κ±°ν νμ
μ μ© μ΄λΌλ μ μ½μ΄ μμ§λ§, κ·Έλ§νΌ μΌλ°μ μΈ Set
μ΄λ Map
ꡬνλ³΄λ€ λ°μ΄λ μ΅μ νκ° μ΄λ£¨μ΄μ Έ μμ.
EnumSet :
EnumSet<E extends Enum<E>>
μ νΉμ μ΄κ±°ν νμ μ κ°λ§ λ΄μ μ μλ μ§ν©(Set) ꡬν체μ. λͺ¨λ μμκ° λμΌν enum νμ μ΄μ΄μΌ νλ©°, λ΄λΆμ μΌλ‘ λΉνΈ 벑ν°(bit vector) λ‘ μμλ€μ κ΄λ¦¬ν¨. κ° μ΄κ±°ν μμμ νλμ λΉνΈκ° λμλλ©°, μμκ° EnumSet μ ν¬ν¨λλ©΄ κ·Έ λΉνΈκ° 1λ‘ μ€μ λλ μμ λ§€μ° μ»΄ν©νΈν ννμ μ¬μ©ν¨. μ΄λ¬ν ꡬ쑰 λλΆμ λ©λͺ¨λ¦¬ κ³΅κ° μ ν¨μ¨μ μΌλ‘ μ°κ³ μ°μ° μλλ λ§€μ° λΉ λ¦ . λΉνΈ μ°μ°μΌλ‘ ꡬνλμ΄ μμΌλ―λ‘ ν©μ§ν©, κ΅μ§ν© λ±μ μ§ν© μ°μ°λ λΉ λ₯΄κ² μνλλ©°, μμμ μ‘΄μ¬ μ¬λΆ 체ν¬, μΆκ°/μμ λ±μ΄ μμ μκ° O(1) μ κ°λ₯ν¨. EnumSet μ μ ν΅μ μΈ μ μ λΉνΈ λ§μ€ν¬λ₯Ό λ체νλ νμ μμ ν λμ μΌλ‘ κΆμ₯λλ©°, μ΄κ±°ν μμλ€μ μ§ν©μΌλ‘ λ€λ£¨μ΄μΌ ν λ μ΅μμ μ±λ₯μ μ 곡ν¨. EnumSet μ μμ±ν λλ μΌλ°μ μΌλ‘ μ μ ν©ν 리 λ©μλλ₯Ό μ¬μ©ν¨. μλ₯Ό λ€μ΄EnumSet.of(A, B)
λ μ£Όμ΄μ§ μμλ€λ‘ ꡬμ±λ EnumSetμ λ§λ€κ³ ,EnumSEt.allOf(EnumType.class)
λ ν΄λΉ μ΄κ±°νμ λͺ¨λ μμλ₯Ό ν¬ν¨νλ EnumSet μ λ§λ¬.EnumSet.noneOf(EnumType.class)
λ λΉμ΄μλ EnumSet μ μμ±ν¨. λ€μμ EnumSet μ¬μ© μμμ.
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
EnumSet<Day> weekend = EnumSet.of(Day.SAT, DAY.SUN);
System.out.println(weekend); // result : [SAT, SUN]
EnumSet<Day> workdays = EnumSet.complementOf(weekend);
System.out.println(workdays); // result : [MON, TUE, WED, THU, FRI]
μ μ½λμμ EnumSet.of(Day.SAT, Day.SUN)
μ SAT
μ SUN
λ§ λ΄μ EnumSet μ μμ±νκ³ complementOf
λ©μλλ μ£Όμ΄μ§ EnumSet μ ν¬ν¨λμ§ μλ μ΄κ±°ν κ°λ€λ‘ ꡬμ±λ μλ‘μ΄ EnumSet μ λ°νν¨. λ°λΌμ workdays
λ μ£Όλ§μ μ μΈν μμΌλ€λ‘ μ±μμ§. EnumSet μ λ΄λΆμ μΌλ‘ λΉνΈ μ°μ°μ νμ©νλ―λ‘, μμ κ°μκ° λ§μλ λΉ λ₯΄κ² λμνλ©°, HashSet λλΉ μ±λ₯μ μ΄μ μ΄ νΌ. λ¨, EnumSet μ enum νμ
λΉ νλμ λΉνΈμ
μΌλ‘ ννλλ―λ‘ λμμ μ¬λ¬ enum νμ
μ νΌν©νμ¬ μ μ₯ν μ μμΌλ©°, null
κ°λ νμ©λμ§ μμ. (null μ λ£μΌλ €κ³ νλ©΄ NullPointerException
λ°μ). λλΆλΆμ κ²½μ° μ΄λ¬ν μ νμ λ¬Έμ κ° λμ§ μμΌλ©°, μ΄κ±°ν μμμ μ§ν©μ λ€λ£° λ EnumSet μ μ¬μ©νλ κ²μ΄ κΆμ₯λ¨.
EnumMap :
EnumMap<K extends Enum<K, V>
λ μ΄κ±°νμ ν€λ‘ μ¬μ©νλ μ μ© Map ꡬν체 μ. EnumMapμ ν€λ λͺ¨λ κ°μ enum νμ μ΄μ΄μΌ νλ©°, λ΄λΆμ μΌλ‘ λ°°μ΄ μ μ΄μ©ν΄ ꡬνλμ΄ μμ. μ΄κ±°ν μμμordinal()
κ°μ λ°°μ΄ index λ‘ μ¬μ©νμ¬ λμλλ κ°μ μ μ₯νλ―λ‘, ν΄μ±(Hashing) μ μ¬μ©νμ§ μκ³ λ λ§€μ° λΉ λ₯Έ μ‘°ν/κ°±μ μ±λ₯ μ 보μ. κΈ°λ³Έμ°μ°(μ‘°ν, μΆκ°, μμ λ±) μ΄ μμ μκ° μ μ€νλλ©°, μΌλ°μ μΈ HashMap 보λ€λ ν¨μ¨μ μ. λν λ°°μ΄ κΈ°λ° κ΅¬ν λλΆμ λ©λͺ¨λ¦¬λ μ΄κ±°ν μμ κ°μμ λ± λ§μΆ° μ¬μ©ν μ μμ΄ λλΉκ° μ κ³ λ©λͺ¨λ¦¬ μ¬μ©μ΄ μ»΄ν©νΈ ν¨. EnumMap μ μμ±ν λλ ν€λ‘ μ¬μ©ν enum μClass
κ°μ²΄κ° νμν¨. μλ₯Ό λ€μ΄new EnumMap<>(Day.class)
μ²λΌ enum νμ μ μ§μ νλ©΄ ν΄λΉ enum μ λͺ¨λ κ°μ λ΄μ μ μλ λ΄λΆ λ°°μ΄μ΄ μ€μ λ¨.(μ΄κΈ°μλ κ°μ΄ λΉμ΄μκ³ , νμν ν€μ λν΄μλ§ κ°μ΄ μ±μμ§.) EnumMap μ iterator(μν) μ μ΄κ±°ν μ μ μμ(μμ°μμ) λ₯Ό μ μ§νλ κ²λ νΉμ§μ. μ΄λ HashMap μ΄ ν΄μκ° μμλ‘ ν€λ₯Ό λ°°μΉνλ κ²κ³Ό λ¬λ¦¬, EnumMap μ μ΄κ±°ν μμμ μμλ₯Ό λ°λ₯΄λ―λ‘ μμΈ‘ κ°λ₯ν μμλ₯Ό 보μ. λ€μμ EnumMap μ¬μ© μμμ.
EnumMap<Day, String> dayType = new EnumMap<>(Day.class);
dayType.put(Day.MON, "Weekday");
dayType.put(Day.SAT, "Weekend");
System.out.println(dayType.get(Day.MON)); // result : Weekday
System.out.println(dayType); // result {MON=Weekday, SAT=Weekend}
μ μ½λμμ dayType
μ Day
μ΄κ±°νμ ν€λ‘ νκ³ λ¬Έμμ΄μ κ°μΌλ‘ κ°μ§λ EnumType μ. Day.MON
ν€μ "Weekday"
λ₯Ό λ£κ³ , Day.SAT
ν€μ "Weekend"
λ₯Ό λ£μ ν μ‘°νμ μΆλ ₯ μλ₯Ό 보μ¬μ€. μΆλ ₯ κ²°κ³Όλ₯Ό 보면 {MON=Weekday, SAT=Weekend}
μ κ°μ΄ ν€μ μ μΈ μμ(μμμΌμ΄ ν μμΌλ³΄λ€ μμ μμ) κ° μ μ§λμ΄ λνλ¨.
EnumMap μ λͺ¨λ ν€λ₯Ό λ°°μ΄λ‘ μ§μ μ κ·Ό νλ―λ‘ λ§€μ° λΉ λ₯΄λ©°, ν€μ μ 체 κ°―μκ° μ΄κ±°ν μμμ μλ‘ νμ λκΈ° λλ¬Έμ HashMap μ²λΌ μ©λμ΄ λμ μΌλ‘ λμ΄λλ κ³Όμ λ μμ. λ°λΌμ μ΄κ±°νμ ν€λ‘ μ¬μ©ν΄μΌ νλ μν©μμλ νμ EnumMap μ μ°μ μ μΌλ‘ κ³ λ € νλ κ²μ΄ μ’μ. μλ₯Ό λ€μ΄ μ΄κ±°ν μμλ₯Ό μ΄λ€ κ°μ λ§€ννλ κ²½μ° (switch
λ¬ΈμΌλ‘μΌμΌμ΄ λΆκΈ°νλ λμ ) EnumMap μ μμ-κ° μμ λ£μ΄ κ΄λ¦¬νλ©΄ μ½λκ° κΉλν΄μ§κ³ μ±λ₯λ μ°μν¨. EnumMap λ EnumSet κ³Ό λ§μ°¬κ°μ§λ‘ null ν€λ₯Ό μ¬μ©ν μ μμ§λ§ null κ°μ νμ©ν¨. κ·Έλ¦¬κ³ thread-safe νμ§ μμΌλ―λ‘ μ¬λ¬ μ°λ λμμ λμ μμ μ΄ νμνλ©΄ λ³λλ‘ λκΈ°ννκ±°λ Collections.synchronizedMap
μΌλ‘ κ°μΈμΌν¨.
Last updated
Was this helpful?