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

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 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]);

์œ„ ์ฝ”๋“œ๋Š” ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

  1. ๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ์€ ์ž˜ ํ˜ธํ•œ๋˜์ง€ ์•Š๋Š”๋ฐ, ๊ฐ™์ด ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  2. ์ถœ๋ ฅ ์‹œ ์ง์ ‘ ๋ ˆ์ด๋ธ”์„ ๋‹ฌ์•„์•ผ ํ•œ๋‹ค. (๋‹จ์ˆœ ์ธ๋ฑ์Šค๋Š” ์˜๋ฏธ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—)
  3. ์—ด๊ฑฐ ํƒ€์ž…๊ณผ ๋‹ฌ๋ฆฌ ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๋Œ€์‹  ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ 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)

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