Search
Duplicate
๐Ÿ˜€

11. enum

ํƒœ๊ทธ
Enum
EnumSet

Enum

๋ฐ์ดํ„ฐ ์ค‘์—์„œ๋Š” ์š”์ผ ( ์›”, ํ™”, ์ˆ˜, ๋ชฉ, ๊ธˆ, ํ† , ์ผ ), ๊ณ„์ ˆ( ๋ด„, ์—ฌ๋ฆ„, ๊ฐ€์„, ๊ฒจ์šธ) ๋“ฑ๊ณผ ๊ฐ™์ด ๋ช‡ ๊ฐ€์ง€ ํ•œ์ •๋œ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.
์š”์ผ, ๊ณ„์ ˆ๊ณผ ๊ฐ™์ด ํ•œ์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ฐ€์ง€๋Š” ํƒ€์ž…์„ Enumeration Type์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์—ด๊ฑฐํƒ€์ž…์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’( ์›”, ํ™” ,์ˆ˜ ๋“ฑ )๋“ค์„ ์—ด๊ฑฐ ์ƒ์ˆ˜( Enumeration constant)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
JAVA 1.5๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์—ด๊ฑฐํ˜• ํƒ€์ž…๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋ฉฐ enum ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ก€๋กœ ์—ด๊ฑฐํƒ€์ž…์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JAVA Class ๋ช…์ฒ˜๋Ÿผ ์—ด๊ฑฐํƒ€์ž…์˜ ์ด๋ฆ„์„ ์ •ํ•˜๊ณ  ํƒ€์ž…์ด๋ฆ„์œผ๋กœ ์ฒซ ๊ธ€์ž ๋Œ€๋ฌธ์ž๋กœ ํ•˜์—ฌ .java ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Enum๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

JAVA์—์„œ ์—ด๊ฑฐ ์ƒ์ˆ˜๋Š” ์ƒ์ˆ˜ ๊ฐ๊ฐ์„ ๋‚ด๋ถ€์ ์œผ๋กœ public static final ํ•„๋“œ์ด๋ฉด์„œ ๊ฐ์ฒด๋กœ ์ œ๊ณต๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. static์ด ๋ถ™์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ์ƒ์ˆ˜๋Š” ํด๋ž˜์Šค๋ณ€์ˆ˜๋กœ ํด๋ž˜์Šค๋กœ๋”๊ฐ€ ๋กœ๋“œ ์‹œ์ ์— JVM Method์˜์—ญ์— ํ•ด๋‹น ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ํ•ญ์ƒ ์ƒ์ฃผ์‹œ์ผœ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „์—๋Š” ์–ธ์ œ๋“ ์ง€ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๊ณต๊ฐ„์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

Enum๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ธฐํ™”

Week today = Week.MONDAY;
Java
๋ณต์‚ฌ
Heap์˜์—ญ์— Week ๊ฐ์ฒด๋Š” MONDAY๋ถ€ํ„ฐ SUNDAY๊นŒ์ง€ ๊ฐ๊ฐ java.lang.Enumํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ณ ์œ ์˜ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  Method ์˜์—ญ์˜ ์—ด๊ฑฐ์ƒ์ˆ˜๋“ค์€ ํ•ด๋‹น Heap์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค.
today๋ณ€์ˆ˜๋Š” JVM Stack์˜์—ญ์—์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ stack์˜์—ญ์˜ today๋Š” Method ์˜์—ญ์— ์žˆ๋Š” MONDAY์˜ ๊ฐ์ฒด์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋ฏ€๋กœ today์™€ Week.MONDAY๋Š” Heap์— ์ƒ์„ฑ๋œ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ด…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
Week thisWeek = Week.SUNDAY; Week nextWeek = Week.SUNDAY; thisWeek == nextWeek // true
Java
๋ณต์‚ฌ

Enum ํƒ€์ž…์˜ ๋“ฑ์žฅ ๋ฐ ์žฅ์ 

1.
์ƒ์ˆ˜์™€ ๋ฆฌํ„ฐ๋Ÿด์ด ๋…ผ๋ฆฌ์ ์ธ ์—ฐ๊ด€์ด ์—†์Œ.
2.
์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…๋ผ๋ฆฌ ์ด๋ฆ„์ด ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Œ.
3.
์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…์ž„์—๋„ ๋น„๊ตํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•จ
์ด์ฒ˜๋Ÿผ ์ƒ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์„œ ๊ด€๋ฆฌํ•  ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ๋“ค์„ ๋ชจ๋‘ ์ทจํ•˜๋ฉด์„œ ์ƒ์ˆ˜๋“ค์„ ๋”์šฑ ๊ฐ„๋‹จํžˆ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.

Enum ํƒ€์ž…์˜ ์ •์˜ ๋ฐ ์‚ฌ์šฉ

Enum ํƒ€์ž…์˜ ์„ ์–ธ

public enum ํ‚ค์›Œ๋“œ๋Š” ์—ด๊ฑฐ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค์›Œ๋“œ์ด๋‹ค.
์—ด๊ฑฐ ํƒ€์ž…์„ ์„ ์–ธํ–ˆ๋‹ค๋ฉด ์ด์ œ ์—ด๊ฑฐ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค. ์—ด๊ฑฐ ์ƒ์ˆ˜๋Š” ์—ด๊ฑฐ ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๊ด€๋ก€์ ์œผ๋กœ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๋‹จ์–ด์ผ ๊ฒฝ์šฐ๋Š” LOGIN_SUCCESS, LOGIN_FAILED์™€ ๊ฐ™์ด _๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ด๋‹ค.
public enum Season { SPRING, SUMMER, AUTUMN, WINTER }
Java
๋ณต์‚ฌ

Enum ํƒ€์ž…์˜ ์‚ฌ์šฉ

Enum ํƒ€์ž…๋„ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค.
// ์—ด๊ฑฐํƒ€์ž… ๋ณ€์ˆ˜; Season season; Season weddingSeason; // ์—ด๊ฑฐํƒ€์ž… ๋ณ€์ˆ˜ = ์—ด๊ฑฐํƒ€์ž….์—ด๊ฑฐ์ƒ์ˆ˜; Season weddingSeason = Season.AUTUMN; // null์˜ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ Season season = null;
Java
๋ณต์‚ฌ

Enum์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ

java.lang.Enum
java.lang ์— ํฌํ•จ๋œ Enum ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ž๋ฐ” ์—ด๊ฑฐํ˜•์˜ ์กฐ์ƒ์ด๋‹ค. ๋ชจ๋“  ์—ด๊ฑฐํ˜•์€ Enum ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— enum type์€ ๋ณ„๋„์˜ ์ƒ์†์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋‘ java.lang.Enum ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด ์žˆ๋‹ค. toString์„ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ๋Š” final๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

name()

์—ด๊ฑฐ ๊ฐ์ฒด์˜ ๋ฌธ์ž์—ด ๋ฆฌํ„ด
Season season = Season.SPRING; String name = season.name();// "SPRING"
Java
๋ณต์‚ฌ

ordinal()

์—ด๊ฑฐ ๊ฐ์ฒด๊ฐ€ ๋ช‡ ๋ฒˆ์งธ์ธ์ง€๋ฅผ ๋ฆฌํ„ด
public enum Season { SPRING,// 0 SUMMER,// 1 AUTUMN,// 2 WINTER// 3 } Season season = Season.AUTUMN; int ordinal = season.ordinal();// 2
Java
๋ณต์‚ฌ

compareTo()

๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ ์—ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ „ ํ›„๋กœ ๋ช‡ ๋ฒˆ์งธ ์œ„์น˜ํ•˜๋Š”์ง€ ๋น„๊ต
Season season1 = Season.SPRING;// 0 Season season2 = Season.WINTER;// 3int result1 = season1.compareTo(season2);// -3int result2 = season2.compareTo(season1);// 3
Java
๋ณต์‚ฌ

valueOf()

๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด๊ณผ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๋Š” ์—ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์„ ๋ฐ›์•„ ์—ด๊ฑฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
Season season = Season.valueOf("SPRING")
Java
๋ณต์‚ฌ

values()

์—ด๊ฑฐ ํƒ€์ž…์˜ ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ์ฒด๋“ค์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด ๋ฆฌํ„ด
Season[] seasons = Season.values(); for(Season season : seasons) { System.out.println(season); }
Java
๋ณต์‚ฌ

EnumSet

EnumSet์€ enum ํด๋ž˜์Šค๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ํŠนํ™”๋œ Set ์ปฌ๋ ‰์…˜(๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต ์ €์žฅํ•  ์ˆ˜ ์—†๊ณ , ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐ)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. EnumSet์€ Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , AbstractSet์„ ์ƒ์†ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ EnumSet์˜ ๋‚ด๋ถ€๋Š” ๋น„ํŠธ ๋ฒกํ„ฐ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.
EnumSet์˜ ์ค‘์š”ํ•œ ํŠน์ง• ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
โ€ข
EnumSet์€ AbstractSet ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
โ€ข
์˜ค์ง ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜๋งŒ์„ ๊ฐ’์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฐ’์€ ๊ฐ™์€ enum type์ด์–ด์•ผ ํ•œ๋‹ค.
โ€ข
null value๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. NullPointerException์„ ๋˜์ง€๋Š” ๊ฒƒ๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข
ordinal ๊ฐ’์˜ ์ˆœ์„œ๋Œ€๋กœ ์š”์†Œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
โ€ข
tread-safeํ•˜์ง€ ์•Š๋‹ค. ๋™๊ธฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Collections.synchronizedMap์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€์—์„œ ๋™๊ธฐํ™”๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.
โ€ข
๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” arithmetic bitwise operation์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ธฐ๋ณธ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(1)์ด๋‹ค.