item 37 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์•„์ดํ…œ37 ordinal ์ธ๋ฑ์‹ฑ ๋Œ€์‹  EnumMap์„ ์‚ฌ์šฉํ•˜๋ผ

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์„ ๋˜์งˆ ๊ฒƒ์ด๋‹ค.

๋” ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ธ enumMap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค!

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)โ€
๋Š” ์ผ๋ฐ˜ ์›์น™์˜ ํŠน์ˆ˜ํ•œ ์‚ฌ๋ก€๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ