item 37 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
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;
}
}
- ์ด์ ์ ์์ ์ฌ์ ์๋ฌผ๋ค์ ๋ฐฐ์ด ํ๋๋ก ๊ด๋ฆฌํ๊ณ , ์ด๋ค์ ์์ ์ฃผ๊ธฐ(ํํด์ด์ด, ์ฌ๋ฌํด์ด์ด, ๋ํด์ด์ด)๋ณ๋ก ๋ฌถ์ด๋ณด์.
- ์์ ์ฃผ๊ธฐ๋ณ๋ก ์ด 3๊ฐ์ ์งํฉ์ ๋ง๋ค๊ณ ์ ์์ ํ ๋ฐํด ๋๋ฉฐ ๊ฐ ์๋ฌผ์ ํด๋น ์งํฉ์ ๋ฃ๋๋ค. ์ด๋ ์ด๋ค ํ๋ก๊ทธ๋๋จธ๋ ์งํฉ๋ค์ ๋ฐฐ์ด ํ๋์ ๋ฃ๊ณ ์์ ์ฃผ๊ธฐ์ ordinal ๊ฐ์ ๊ทธ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ ค ํ ๊ฒ์ด๋ค.
// ์๋ชป๋ ์์!!
Set<Plant>[] plantsByLifeCycle = (Set<Plant>[])new Set[Plant.LifeCycle.values().length];
for (int i = 0; i < plantsByLifeCycle.length; i++) {
plantsByLifeCycle[i] = new HashSet<>();
}
for (Plant p : garden) {
plantsByLifeCycle[p.lifeCycle.ordinal()].add(p);
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
for (int i = 0; i < plantsByLifeCycle.length; i++) {
System.out.printf("%s: %s%n", Plant.LifeCycle.values()[i], plantsByLifeCycle[i]);
}
- ๋์์ ํ์ง๋ง ๋ฌธ์ ๊ฐ ํ๊ฐ๋์ด๋ค. ๋ฐฐ์ด์ ์ ๋ค๋ฆญ๊ณผ ํธํ๋์ง ์์ผ๋ ๋น๊ฒ์ฌ ํ๋ณํ์ ์ํํด์ผ ํ๊ณ ๊น๋ํ ์ปดํ์ผ๋์ง ์์ ๊ฒ์ด๋ค. ๋ฐฐ์ด์ ๊ฐ ์ธ๋ฑ์ค์ ์๋ฏธ๋ฅผ ๋ชจ๋ฅด๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ์ง์ ๋ ์ด๋ธ์ ๋ฌ์์ผ ํ๋ค. ๊ฐ์ฅ ์ฌ๊ฐํ ๋ฌธ์ ๋ ์ ํํ ์ ์ซ๊ฐ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์ด ์ง์ ๋ณด์ฆํด์ผ ํ๋ค๋ ์ ์ด๋ค. ์ ์๋ ์ด๊ฑฐ ํ์ ๊ณผ ๋ฌ๋ฆฌ ํ์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ชป๋ ๊ฐ์ ์ฌ์ฉํ๋ฉด ์๋ชป๋ ๋์์ ๋ฌต๋ฌตํ ์ํํ๊ฑฐ๋ (์ด์ด ์ข๋ค๋ฉด) ArrayIndexOutOf BoundsException์ ๋์ง ๊ฒ์ด๋ค.
Map<Plant.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);
- ๋ ์งง๊ณ ๋ช ๋ฃํ๊ณ ์์ ํ๊ณ ์ฑ๋ฅ๋ ์๋ ๋ฒ์ ๊ณผ ๋น๋ฑํ๋ค.
- ์์ ํ์ง ์์ ํ๋ณํ์ ์ฐ์ง ์๊ณ , ๋งต์ ํค์ธ ์ด๊ฑฐ ํ์ ์ด ๊ทธ ์์ฒด๋ก ์ถ๋ ฅ์ฉ ๋ฌธ์์ด์ ์ ๊ณตํ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ์ง์ ๋ ์ด๋ธ์ ๋ฌ ์ผ๋ ์๋ค. ๋์๊ฐ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ ๊ฐ๋ฅ์ฑ๋ ์์ฒ๋ด์๋๋ค.
//์ด์
Arrays.stream(garden).collect(groupingBy(p -> p.lifeCycle));
- ์ด๋ EnumMap์ด ์๋ ๊ณ ์ ํ ๋งต ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ enumMap์ ์จ์ ์ป์ ๊ณต๊ฐ๊ณผ ์ฑ๋ฅ ์ด์ ์ด ์ฌ๋ผ์ง๋ค.
Arrays.stream(garden).collect(groupingBy(p -> p.lifeCycle, () -> new EnumMap<>(LifeCycle.class), toSet()))
- groupingBy์ ๊ตฌํ์ฒด๋ฅผ ๋ช ์ํด์ ํธ์ถํ๋ฉด ๋ณด๋ค๋ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ป๊ธฐ ์ํด ordinal์ ์ฐ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ข์ง ์์ผ๋, ๋์ Enum Map์ ์ฌ์ฉํ๋ผ.
๋ค์ฐจ์ ๊ด๊ณ๋ EnumMap<..., EnumMap<...>>์ผ๋ก ํํํ๋ผ.
โ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋จธ๋ Enum.ordinal์ (์ฌ๋งํด์๋) ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค(์์ดํ 35)โ
๋ ์ผ๋ฐ ์์น์ ํน์ํ ์ฌ๋ก๋ค.