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?