๐ฏ ์์ดํ 37. ordinal ์ธ๋ฑ์ฑ ๋์ EnumMap์ ์ฌ์ฉํ๋ผ.
public class Plant {
enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL }
final String name;
final LifeCycle lifeCycle;
Plant(String name, LifeCycle lifeCycle) {
this.name = name;
this.lifeCycle = lifeCycle;
}
@Override public String toString() {
return name;
}
}
- ordinal()์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ์ฌ์ฉ - ๋ฐ๋ผ ํ์ง ๋ง ๊ฒ!
public static void main(String[] args) {
Plant[] garden = {
new Plant("๋ฐ์ง", LifeCycle.ANNUAL),
new Plant("์บ๋ฌ์จ์ด", LifeCycle.BIENNIAL),
new Plant("๋", LifeCycle.ANNUAL),
new Plant("๋ผ๋ฒค๋", LifeCycle.PERENNIAL),
new Plant("ํ์ฌ๋ฆฌ", LifeCycle.BIENNIAL),
new Plant("๋ก์ฆ๋ง๋ฆฌ", LifeCycle.PERENNIAL)
};
// ์ฝ๋ 37-1 ordinal()์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ์ฌ์ฉ - ๋ฐ๋ผ ํ์ง ๋ง ๊ฒ! (226์ชฝ)
Set<Plant>[] plantsByLifeCycleArr = (Set<Plant>[]) new Set[Plant.LifeCycle.values().length];
for (int i = 0; i < plantsByLifeCycleArr.length; i++){
plantsByLifeCycleArr[i] = new HashSet<>();
}
for (Plant p : garden) {
plantsByLifeCycleArr[p.lifeCycle.ordinal()].add(p);
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
for (int i = 0; i < plantsByLifeCycleArr.length; i++) {
System.out.printf("%s: %s%n", Plant.LifeCycle.values()[i], plantsByLifeCycleArr[i]);
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ๋์์ ํ์ง๋ง ๋ฌธ์ ๊ฐ ํ๊ฐ๋์ด๋ค. ๋ฐฐ์ด์ ์ ๋ค๋ฆญ๊ณผ ํธํ๋์ง ์์ผ๋ ๋น๊ฒ์ฌ ํ๋ณํ์ ์ํํด์ผ ํ๊ณ ๊น๋ํ ์ปดํ์ผ๋์ง ์์ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ์ด๊ฑฐ ํ์
์ ํค๋ก ์ฌ์ฉํ๋๋ก ์ค๊ณํ ์์ฃผ ๋น ๋ฅธ Map ๊ตฌํ์ฒด๊ฐ ์กด์ฌํ๋๋ฐ, ๋ฐ๋ก EnumMap์ด๋ค.
- EnumMap์ ์ฌ์ฉํด ๋ฐ์ดํฐ์ ์ด๊ฑฐ ํ์ ์ ๋งคํํ๋ค.
Map<LifeCycle, Set<Plant>> plantsByLifeCycle = new EnumMap<>(Plant.LifeCycle.class);
for (Plant.LifeCycle lc : Plant.LifeCycle.values()) {
plantsByLifeCycle.put(lc, new HashSet<>());
}
for (Plant p : garden) {
plantsByLifeCycle.get(p.lifeCycle).add(p);
}
System.out.println(plantsByLifeCycle);
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์งง๊ณ ๋ช
๋ฃํ๊ณ ์์ ํ๊ณ ์ฑ๋ฅ๋ ์๋ ๋ฒ์ ๊ณผ ๋น๋ฑํ๋ค. ์์ ํ์ง ์์ ํ๋ณํ์ ์ฐ์ง ์๊ณ ,
๋งต์ ํค์ธ ์ด๊ฑฐ ํ์
์ด ๊ทธ ์์ฒด๋ก ์ถ๋ ฅ์ฉ ๋ฌธ์์ด์ ์ ๊ณตํ๋ ์ถ๋ ฅ ๊ดใน์ ์ง์ ๋ ์ด๋ธ์ ๋ฌ ์ผ๋ ์๋ค.
- ์คํธ๋ฆผ์ ์ฌ์ฉํ ์ฝ๋
System.out.println(Arrays.stream(garden).collect(groupingBy(p -> p.lifeCycle)));
System.out.println(Arrays.stream(garden).collect(groupingBy(p -> p.lifeCycle, () -> new EnumMap<>(LifeCycle.class), toSet())));
๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ป๊ธฐ ์ํด ordinal์ ์ฐ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ข์ง ์์ผ๋, ๋์ EnumMap์ ์ฌ์ฉํ๋ผ.๋ค์ฐจ์ ๊ด๊ณ๋ EnumMap<...,EnumMap<...>>์ผ๋ก ํํํ๋ผ. "์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋จธ๋ Enum.ordinal์ (์ฌ๋งํด์๋) ์ฌ์ฉํ์ง ๋ง์์ผํ๋ค."
์ฐธ๊ณ ์๋ฃ
Joshua Bloch, ใEffective Java 3/Eใ, ๊ฐ์๋งต์ ์ฎ๊น, ํ๋ก๊ทธ๋๋ฐ์ธ์ฌ์ดํธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=