item 37 sijun - 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 Sring toString() {
return name;
}
}์ ์ฝ๋๋ ์๋ฌผ์ ๋ํ๋ธ ๊ฐ๋จํ ํด๋์ค์ด๋ค.
๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์์ ์์๋ฅผ ๊บผ๋ผ ๋ ordinal ๋ฉ์๋๋ก ์ธ๋ฑ์ค๋ฅผ ์ป๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ด๋ค ๋จ์ ์ด ์๋์ง ์๋ ์ฝ๋ ์์๋ฅผ ํตํด ๋ณด์ฌ์ค๋ค.
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]);์ ์ฝ๋๋ ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
- ๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ์ ์ ํธํ๋์ง ์๋๋ฐ, ๊ฐ์ด ์ฌ์ฉํ์๋ค.
- ์ถ๋ ฅ ์ ์ง์ ๋ ์ด๋ธ์ ๋ฌ์์ผ ํ๋ค. (๋จ์ ์ธ๋ฑ์ค๋ ์๋ฏธ๋ฅผ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์)
- ์ด๊ฑฐ ํ์ ๊ณผ ๋ฌ๋ฆฌ ํ์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ์ ์๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋์ ์๋ ์ฝ๋์ฒ๋ผ EnumMap์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. EnumMap์ ์ด๊ฑฐ ํ์
์ ํค๋ก ์ฌ์ฉํ๋๋ก ์ค๊ณ๋ ์์ฃผ ๋น ๋ฅธ Map ๊ตฌํ์ฒด์ด๋ค.
// ์ฝ๋ 37-2 EnumMap์ ์ฌ์ฉํด ๋ฐ์ดํฐ์ ์ด๊ฑฐ ํ์
์ ๋งคํํ๋ค. (227์ชฝ)
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);๋ ์งง๊ณ ๋ช ๋ฃํ๊ณ ์์ ํ๊ณ ์ฑ๋ฅ๋ ์๋ ๋ฒ์ ๊ณผ ๋น๋ฑํ๋ค. ์์ ํ์ง ์์ ํ๋ณํ์ ์ฐ์ง ์๊ณ , ๋งต์ ํค์ธ ์ด๊ฑฐ ํ์ ์ด ๊ทธ ์์ฒด๋ก ์ถ๋ ฅ์ฉ ๋ฌธ์์ด์ ์ ๊ณตํ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ์ง์ ๋ ์ด๋ธ์ ๋ฌ ์ผ๋ ์๋ค. ๋์๊ฐ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ ๊ฐ๋ฅ์ฑ๋ ์์ฒ๋ด์๋๋ค.
์คํธ๋ฆผ(์์ดํ 45)์ ์ฌ์ฉํด ๋งต์ ๊ด๋ฆฌํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ค์ผ ์ ์๋ค. ๋ค์์ ์ ์์ ๋์์ ๊ฑฐ์ ๊ทธ๋๋ก ๋ชจ๋ฐฉํ ๊ฐ์ฅ ๋จ์ํ ํํ์ ์คํธ๋ฆผ ๊ธฐ๋ฐ ์ฝ๋์ด๋ค.
System.out.println(Arrays.stream(garden)
.collect(groupingBy(p -> p.lifeCycle)));์ ์ฝ๋๋ EnumMap์ด ์๋ ๊ณ ์ ํ ๋งต ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ EnumMap์ ์จ์ ์ป์ ๊ณต๊ฐ๊ณผ ์ฑ๋ฅ ์ด์ ์ด ์ฌ๋ผ์ง๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์๋ ์ฝ๋๋ ์ ์ฝ๋์ ๊ฐ์ ๋ ๋ฒ์ ์ด๋ค.
Arrays.stream(garden)
.collect(groupingBy(p -> p.lifeCycle,
() -> new EnumMap<>(LifeCycle.class), toSet())));๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ป๊ธฐ ์ํด ordinal์ ์ฐ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ข์ง ์์ผ๋, ๋์ EnumMap์ ์ฌ์ฉํ๋ผ. ๋ค์ฐจ์ ๊ด๊ณ๋ EnumMap<..., EnumMap<...>>์ผ๋ก ํํํ๋ผ. ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋จธ๋ Enum.ordinal์ (์ฌ๋งํด์๋) ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค(์์ดํ 35)