โ ํ๋ก๊ทธ๋๋ฐ์์๋ ํ๊ท ์ ์ธ ์์ค์ ๋ ธ๋๋ ฅ์ ์ ์งํ๋ ๊ฒ๋ณด๋ค ์๊ฐ์ด ์๋ฌผ์ฒ๋ผ ์์๋๋ ์์คํ ์๊ฐ์ ๋์น์ง ์๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ทธ๋์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์์ ๋ ์๋ช ์ด๋ค. โ- ์๋ฐฑ์ค
๋๋ ํ๋ก๊ทธ๋๋จธ๋ค ์ ์

Enum ์ด๊ฑฐ ํ์
๋จผ์ Enum์ "Enumeration"์ ์ฝ์๋ค. Enumeration์ "์ด๊ฑฐ, ๋ชฉ๋ก, ์ผ๋ํ" ๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ณดํต ํ๊ธ๋ก๋ ์ด๊ฑฐํ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฆ, ์ด๊ฑฐํ(enum)์ ์์, ๋ฉค๋ฒ๋ผ ๋ถ๋ฆฌ๋ ๋ช ๋ช ๋ ๊ฐ์ ์งํฉ์ ์ด๋ฃจ๋ ์๋ฃํ์ด๋ค. ์ด๋ ต๊ฒ ์๊ฐํ ํ์ ์์ด ์์ ๋ฐ์ดํฐ๋ค์ ์งํฉ ์ผ๋ก ์น๋ถํ๋ฉด ๋๋ค.
๋จผ์ Enum์ "Enumeration"์ ์ฝ์๋ค.
Enumeration์ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ณด๋ฉด ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ ..๋ฑ ์ฌ๋ฌ๊ฐ์ ๋ฌถ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ผ์ด ๋น๋ฒํ๋ค. ์ด ๋ฌถ์ ๋ฐ์ดํฐ ์ค์๋ ๋ฐ์ดํฐ ์ฃผ์ ์ ๋ฐ๋ผ ๋ช๊ฐ์ง๋ก ํ์ ๋ ๊ฐ๋ง์ ๊ฐ์ง๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
๋ํ์ ์ผ๋ก๋ '์์ผ' ์ด๋ '๊ณ์ ' ๋๋ '์ฃผ์ฌ์' ๊ฐ์ ์์ ๋ฅผ ๋ค ์ ์๋ค. ์์ผ์ ์,ํ,์,๋ชฉ,๊ธ,ํ ,์ผ ์ด๋ ๊ฒ 7๊ฐ์ง ๋ฐ์ ์๊ณ , ๊ณ์ ๋ ๋ด,์ฌ๋ฆ,๊ฐ์,๊ฒจ์ธ 4๊ฐ์ง ๊ณ์ ๋ก ํ์ ๋์ด ์์ผ๋ฉฐ, ์ฃผ์ฌ์๋ 1,2,3,4,5,6 ์ซ์๊ฐ 6๊ฐ๋ก๋ง ๊ตฌ์ฑ๋์ด ์๋ค.
์ด์ ๊ฐ์ด ์ ํด์ ธ ์๋ ํ์ ๋ ๋ฐ์ดํฐ ๋ฌถ์์ ์ด๊ฑฐํ ํ์ ์ธ Enum ์ผ๋ก ๋ฌถ์ด์ฃผ๋ฉด ๋ณด๋ค ๊ตฌ์กฐ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ํ ์ ์๋ค.
๊ณผ๊ฑฐ์ ์์๋ฅผ ์ด๋ป๊ฒ ์ ์ํ๋๊ฐ?
final ์์
๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ final ์ ์ด์๋ฅผ ์ด์ฉํด ๋ณ์๋ฅผ ์์ํ ํ๋ ๊ฒ์ผ ๊ฒ์ด๋ค.
final ์ ์ด์๋ฅผ ํ ๋นํจ์ผ๋ก์จ์ ์ฌ์ฉํ์ฌ ํ๋ฒ ์ง์ ํ๋ฉด ๋ฐ๋์ง ์๊ฒ ์ค์ ๋๋ฉฐ, ๋์์ static์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋ฒ๋ง ํ ๋น ๋๊ฒ ์ค์ ๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ ๊ทผ์ ์ด์๋ค ๋๋ฌธ์ ๊ฐ๋
์ฑ์ด ๊ทธ๋ ๊ฒ ์ข์ง ๋ชปํ๋ค๋ผ๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
class EnumExample {
private final static int MONDAY = 1;
private final static int TUESDAY = 2;
private final static int WEDNESDAY = 3;
private final static int THURSDAY = 4;
private final static int FRIDAY = 5;
private final static int SATURDAY = 6;
private final static int SUNDAY = 7;
public static void main(String[] args) {
int day = EnumExample.MONDAY;
switch (day) {
case EnumExample.MONDAY:
System.out.println("์์์ผ ์
๋๋ค.");
break;
case EnumExample.TUESDAY:
System.out.println("ํ์์ผ ์
๋๋ค.");
break;
case EnumExample.WEDNESDAY:
System.out.println("์์์ผ ์
๋๋ค.");
break;
}
}
}

์ธํฐํ์ด์ค ์์
interface๋ ๋ฐ๋์ ์ถ์ ๋ฉ์๋๋ง ์ ์ธํ ์ ์๋ ๊ฒ์ด ์๋๋ค. ์ธํฐํ์ด์ค ๋ด์์๋ ์์๋ฅผ ์ ์ธํ ์ ์๋๋ฐ, ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ๋ public static final ์์ฑ์ ์๋ตํ ์ ์๋ ํน์ง์ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๊ฒ ๋๋ค.
interface DAY {
int MONDAY = 1;
int TUESDAY = 2;
int WEDNESDAY = 3;
int THURSDAY = 4;
int FRIDAY = 5;
int SATURDAY = 6;
int SUNDAY = 7;
}
interface MONTH {
int JANUARY = 1;
int FEBRUARY = 2;
int MARCH = 3;
int APRIL = 4;
int MAY = 5;
int JUNE = 6;
int JULY = 7;
int AUGUST = 8;
int SEPTEMBER = 9;
int OCTOBER = 10;
int NOVEMBER = 11;
int DECEMBER = 12;
}
ํ์ง๋ง ์ธํฐํ์ด์ค๋ก ์์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
์กฐ๊ธ ์๋ก ์ ์ธ ๋ฌธ์ ์ด๊ธด ํ๋ฐ, ์์๊ฐ ๊ฒฐ๊ตญ์ ์ ์๊ฐ์ด๋ผ๋ ๋ฌธ์ ์ด๋ค. ์์๋ '๋ณํ์ง ์๋ ๊ฐ'์ด๋ผ๋ ์๋ฏธ์ด์ง๋ง '๊ณ ์ ํ ๊ฐ' ์ด๋ผ๋ ์๋ฏธ๋ ์ด๋์ ๋ ๋ดํฌํ๊ณ ์๋ค.
๊ทธ๋์ ์๋ ์ฝ๋ ์ฒ๋ผ ๋ค๋ฅธ ์งํฉ์ ์ ์๋ ์์๋ค ๋ผ๋ฆฌ ์๋ก ๋น๊ตํ๋ ๋ก์ง์ด ๊ฐ๋ฅํ๊ฑฐ๋, ์๋ชป๋ ์์๊ฐ ํ ๋น๋์์์๋ ๊ฒฐ๊ตญ์ ์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๋ฌ์์ด ์คํ๋๋ค๋ ์ ์ด๋ค. ์ด๊ฒ์ด ๋ฌด์์ด ๋ฌธ์ ๋ ์ผ์๋ ์๊ฒ ์ง๋ง ํ๋ก๊ทธ๋จ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ๊ฐ๋ฐ์์ ์ค์๊ฐ ์ฆ์์ง๋ฉฐ ์ด๋ฌํ ์ ์ฝ์ ์ด์ง ์๋ ์์๋ค ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
public static void main(String[] args) {
int day = DAY.MONDAY;
// ์์๋ฅผ ๋น๊ตํ๋ ๋
ผ๋ฆฌ์ ์ผ๋ก ์๋ชป๋ ํ์๋ฅผ ํจ์ผ๋ก์จ day ๋ณ์์ ๋ค๋ฅธ ์์๊ฐ์ด ๋ค์ด๊ฐ๋ฒ๋ฆผ
if (DAY.MONDAY == MONTH.JANUARY) {
// ...
day = MONTH.JANUARY;
}
// day ๋ณ์์ ์๋ ์์๋ MONTH ์์์ด๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด๋ฌธ์์ ๊ฑธ๋ฌ์ ธ์ผ ๋์ง๋ง,
// ๊ฒฐ๊ตญ ์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ์๋๊ณ ๊ทธ๋๋ก ์ํ๋จ -> ํ๋ก๊ทธ๋จ ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ
switch (day) {
case DAY.MONDAY:
System.out.println("์์์ผ ์
๋๋ค.");
break;
case DAY.TUESDAY:
System.out.println("ํ์์ผ ์
๋๋ค.");
break;
case DAY.WEDNESDAY:
System.out.println("์์์ผ ์
๋๋ค.");
break;
}
}

์์ฒด ํด๋์ค ์์
๋ฐ๋ผ์ ์์๋ฅผ ์ ์๊ฐ์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๋ ๋ฆฝ๋ ๊ณ ์ ์ ๊ฐ์ฒด๋ก ์ ์ธํ์๋ ์ทจ์ง๋ก ์์ฒด ํด๋์ค ์ธ์คํด์คํ๋ฅผ ์ด์ฉํด ์์์ฒ๋ผ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด ๋ฑ์ฅํ์๋ค.
์๊ธฐ ์์ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ ํ๊ณ final static ํ ํจ์ผ๋ก์จ ๊ณ ์ ์ ๊ฐ์ฒด๋ฅผ ์ป๊ฒ๋์ด ์ด๋ฅผ ์์์ฒ๋ผ ํ์ฉํ๋ ๊ฒ์ด๋ค.
class Day {
// ์๊ธฐ ์์ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ ํ๊ณ final static ํ ํจ์ผ๋ก์จ ๊ณ ์ ์ ๊ฐ์ฒด ์์๋ฅผ ์ป๊ฒ ๋จ
public final static Day MONDAY = new Day();
public final static Day TUESDAY = new Day();
public final static Day WEDNESDAY = new Day();
}
class Month {
public final static Month JANUARY = new Month();
public final static Month FEBRUARY = new Month();
public final static Month MARCH = new Month();
}
ํ์ง๋ง ๊ฐ๋ ์ฑ์ด ๋ค์ ์์ข์์ก๊ณ , ๋ฌด์๋ณด๋ค ์ด๋ฌํ ๋ฐฉ์์ if๋ฌธ์์๋ ๋ฌธ์ ๋ ์์ง๋ง switch๋ฌธ์์ ์ฌ์ฉํ ์ ์๋ค๋ ํฐ ๋จ์ ์ด ์๋ค. ๊ทธ ์ด์ ๋ switch ๋ฌธ์ ์กฐ๊ฑด์ ๋ค์ด๊ฐ๋ ๋ฐ์ดํฐ ํ์ ์ด ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
public static void main(String[] args) {
Day day = Day.MONDAY;
// if๋ฌธ์ ๋ฌธ์ ์์ง๋ง
if(day == Day.MONDAY) {
System.out.println("์์์ผ ์
๋๋ค.");
}
// switch๋ฌธ์์๋ ์ฌ์ฉํ ์ ์๋ค
switch (day) {
case DAY.MONDAY:
System.out.println("์์์ผ ์
๋๋ค.");
break;
case DAY.TUESDAY:
System.out.println("ํ์์ผ ์
๋๋ค.");
break;
case DAY.WEDNESDAY:
System.out.println("์์์ผ ์
๋๋ค.");
break;
}
}


enum ์์
์ด๋ฌํ ๋ฌธ์ ๋ค ๋๋ฌธ์ ์๋ฐ์์๋ ์์ ์์๋ง์ ๋ค๋ฃจ๋ enum ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ฐฐํฌํ ๊ฒ์ด๋ค.
์์ ์์ ์ฝ๋๋ฅผ enum ์ผ๋ก ๋ฐ๊ฟ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
enum Day{
MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
enum Month{
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY,
AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}
enum์ ํต์ฌ์ ์ด๋ฌํ ์์๋ฅผ ๋จ์ํ ์ ์๋ก ์น๋ถํ์ง๋ง๊ณ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๊ฐ์ฒดํํด์ ๊ด๋ฆฌํ์๋ ์ทจ์ง์ด๋ค.
์๋ฅผ๋ค์ด C์ธ์ด์ enum์ ๊ทธ๋ฅ ์ ์์ด๋ฉฐ, C++์ enum์ ํ์ ์ด์ง๋ง, JAVA์ enum์ ์ธํฐํ์ด์ค์ ๊ฐ์ด ๋ ๋ฆฝ๋ ํน์ํ ํด๋์ค๋ก ๊ตฌ๋ถํ๋ค. ์ฆ, ์ผ์ข ์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํ(heap) ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฉฐ ๊ฐ enum ์์๋ค์ ๋ณ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ๊ฐ์ง์ผ๋ก์จ ์๋ฒฝํ ๋ ๋ฆฝ๋ ์์๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๊ฒ์ด๋ค.
๋ํ IDE์์ ํด๋์ค ํ์ผ์ ์์ฑํ ๋ ๋ ๋ฆฝ๋ ์ด๊ฑฐํ ํ์ผ๋ ์์ฑํ ์ ์๋ค. (๋ ๋ฆฝ๋ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์)

Enum์ ์ฅ์
- ์ฝ๋๊ฐ ๋จ์ํด์ง๋ฉฐ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค
- ํ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ค์ ์ ํํ์ฌ ์ ํ ์์ (type safe)์ ์ ๊ณตํ๋ค.
- ํค์๋ enum์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ์๋๊ฐ ์ด๊ฑฐ์์ ๋ถ๋ช ํ๊ฒ ๋ํ๋ผ ์ ์๋ค.
- ์์ฒด ํด๋์ค ์์์ ๋ฌ๋ฆฌ switch๋ฌธ์์๋ ์ฌ์ฉํ ์ ์๋ค
- ๋จ์ ์์์ ๋น๊ตํด IDE์ ์ ๊ทน์ ์ธ ์ง์์ ๋ฐ์ ์ ์๋ค (์๋์์ฑ, ์คํ๊ฒ์ฆ, ํ ์คํธ ๋ฆฌํฉํ ๋ง ๋ฑ๋ฑ)
- ๋ฆฌํฉํ ๋ง์ ๋ณ๊ฒฝ ๋ฒ์๊ฐ ์ต์ํ ๋๋ค (enum์์ ํ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ด์ฉ์ ์ถ๊ฐ๊ฐ ํ์ํ๋๋ผ๋, Enum ์ฝ๋์ธ์ ์์ ํ ํ์๊ฐ ์๋ค)
- enum์ ๋ณธ์ง์ ์ผ๋ก Thread safe์ธ ์ฑ๊ธํค ๊ฐ์ฒด ์ด๋ฏ๋ก ์ฑ๊ธํค ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ์๋ ์ฌ์ฉ๋๋ค
์ถ๊ฐ์ ์ผ๋ก enum ์ฑ๋ฅ์ ์ด๋จ๊ฐ ์ถ์ง๋ง, ์ ์ ์์์ ๋ค๋ฅด์ง ์์ผ๋ฉฐ ์ด๊ฑฐ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๊ณต๊ฐ๊ณผ ์ด๊ธฐํ ์๊ฐ์ด ์์ง๋ง ์ฒด๊ฐ๋ ์ ๋๋ ์๋๋ค.
Enum ๊ธฐ๋ณธ ๋ฌธ๋ฒ
Enum ์ ์ธ
์ด๊ฑฐ ํ์ ์ ์์ ๋ฐ์ดํฐ๋ค์ ์งํฉ์ด๋ผ๊ณ ํ์๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ๋ง์น ๋ฐฐ์ด ์ฒ๋ผ ๋์ดํ์ฌ ํํํ๋ฉด ๋๋ค.
- enum ๋ช ์ ํด๋์ค์ ๊ฐ์ด ์ฒซ ๋ฌธ์๋ฅผ ๋๋ฌธ์๋กํ๊ณ ๋๋จธ์ง๋ ์๋ฌธ์๋ก ๊ตฌ์ฑํ๋ค
- ๊ด๋ก์ ์ผ๋ก, ์ด๊ฑฐ ์์๋ ๋ชจ๋ ๋๋ฌธ์๋ก ์์ฑํ๋ค
- ์ด๊ฑฐ ์์๊ฐ ์ฌ๋ฌ ๋จ์ด๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ, ๋จ์ด ์ฌ์ด๋ฅผ ๋ฐ์ค (_)๋ก ์ฐ๊ฒฐํ๋ค
// ์์ผ ์ด๊ฑฐ ํ์
enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
// ๊ณ์ ์ด๊ฑฐ ํ์
enum Season {
Spring,
Summer,
Autumn,
Winter
}
enum LoginResult {
LOGIN_SUCCESS,
LOGIN_FAILED
}
Enum ์ฐธ์กฐ ๋ฐฉ์
Enum ํ์ ๊ฐ์ฒด๋ ํ๋์ ๋ฐ์ดํฐ ํ์ ์ด๋ฏ๋ก ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค.
// ์ด๊ฑฐํ์
๋ณ์ = ์ด๊ฑฐํ์
.์ด๊ฑฐ์์;
Week monday = Week.MONDAY;
Week sunday = Week.SUNDAY;
ํ๊ฐ์ง ์์๋ ์ ์ enum ํ์ ์ ํน์ํ ํด๋์ค ๋ผ๋ ์ ์ด๋ค.
์ฆ, primitive ํ์ ์ด ์๋ referece ํ์ ์ผ๋ก ๋ถ๋ฅ๋๋ฉฐ, ๊ทธ๋์ enum ์์๊ฐ์ ํ(heap) ์์ญ์ ์ ์ฅ๋๊ฒ ๋๋ค.

String ์ฒ๋ผ ์คํ ์์ญ์ ์๋ ๋ณ์๋ค์ด ํ ์์ญ์ ์๋ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ์ ์ ์ฅํจ์ผ๋ก์จ ์ฐธ์กฐ ํํ๋ฅผ ๋๊ฒ ๋๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ enum ํ์
๋ณ์ ๋ผ๋ฆฌ ๊ฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ผ๋ด์ผ๋ก์จ ๋์ด ์ฃผ์๋ฅผ ๋น๊ตํ๋ == ์ฐ์ฐ ๊ฒฐ๊ณผ๋ true๊ฐ ๋๊ฒ ๋๋ค.
Week today = null; // ์ฐธ์กฐ ํ์
์ด๊ธฐ ๋๋ฌธ์ null๋ ์ ์ฅ ๊ฐ๋ฅ
today = Week.SUNDAY;
// ์ฃผ์๊ฐ ๋น๊ต
System.out.println(today == Week.SUNDAY); // true

๋ง์ฐฌ๊ฐ์ง๋ก enum ์์๋ค์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ์ ์ฅํ ์์๋, ๊ฐ ๋ฐฐ์ด ์์๋ค ๋ง๋ค ์ฐธ์กฐ ์ฃผ์๊ฐ๋ค์ด ์ ์ฅ๋์ด ํ ์์ญ์ ์์ ๋ฐ์ดํฐ๋ค์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
// enum Week ์ ๋ชจ๋ ์์๊ฐ๋ค์ ๋ฐฐ์ด๋ก ๋ณํ
Week[] days = Week.values();

Enum ๋ฉ์๋ ์ข ๋ฅ
String ๊ฐ์ ์๋ฐ์ ์ฌ๋ฌ ํด๋์ค๊ฐ ์์ฒด ๋ด์ฅ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ฏ์ด, enum ์ญ์ ๋ด์ฅ ๋ฉ์๋๋ฅผ ์ง๋๊ณ ์๋ค.
๋ชจ๋ Enum ํ์ ์ ์ปดํ์ผ ์์ java.lang.Enum ํด๋์ค๋ฅผ ์์ํ๊ฒ ๋์ด์๊ธฐ ๋๋ฌธ์, java.lang.Enum ์ ์ ์ธ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์ ์๋ค.
Enum ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ๋ฉ์๋๋ ์๋์ ๊ฐ๋ค
๋ฉ์๋ | ์ค๋ช | ๋ฆฌํด ํ์ |
name() | ์ด๊ฑฐ ๊ฐ์ฒด์ ๋ฌธ์์ด์ ๋ฆฌํด | String |
ordinal() | ์ด๊ฑฐ ๊ฐ์ฒด์ ์๋ฒ(0๋ถํฐ ์์)์ ๋ฆฌํด | int |
compareTo() | ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ ์๋ฒ ์ฐจ์ด๋ฅผ ๋ฆฌํด | int |
valueOf(String name) | ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ์์ ์ผ์นํ๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด | enum |
values() | ๋ชจ๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด๋ก ๋ฆฌํด | enum[] |
enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
name() ๋ฉ์๋
- ์ด๊ฑฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์์ด์ ๋ฆฌํด
- ๋ฐํ๋๋ ๋ฌธ์์ด์ ์ด๊ฑฐ ํ์ ์ ์ ์ํ ๋ ์ฌ์ฉํ ์์ ์ด๋ฆ๊ณผ ๋์ผ
Week w = Week.FRIDAY;
// ์ด๊ฑฐ ๊ฐ์ฒด์ ๋ฌธ์์ด์ ๋ฆฌํด
String weekName = w.name();
System.out.println(weekName); // Spring
ordinal() ๋ฉ์๋
- ์ด๊ฑฐ ํ์ ์ ์ ์ ํ ๋ ์ฃผ์ด์ง ์๋ฒ์ ๋ฆฌํด
- ์ ์ฒด ์ด๊ฑฐ ๊ฐ์ฒด ์ค ๋ช ๋ฒ์งธ ์ด๊ฑฐ ๊ฐ์ฒด์ธ์ง ์๋ ค์ค๋ค
Week w = Week.FRIDAY;
// ์ด๊ฑฐ ๊ฐ์ฒด์ ์๋ฒ(0๋ถํฐ ์์)์ ๋ฆฌํด
// ์ ์ฒด ์ด๊ฑฐ ๊ฐ์ฒด ์ค ๋ช ๋ฒ์งธ ์ด๊ฑฐ ๊ฐ์ฒด์ธ์ง ์๋ ค์ค๋ค
int weekNum = w.ordinal();
System.out.println(weekNum); // 4
compareTo() ๋ฉ์๋
- ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ์ด์ง ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ ์๋ฒ ์ฐจ์ด๋ฅผ ๋ฆฌํด
- ์ด๊ฑฐ ๊ฐ์ฒด๊ฐ ๋งค๊ฐ๊ฐ์ ์ด๊ฑฐ ๊ฐ์ฒด๋ณด๋ค ์๋ฒ์ด ๋น ๋ฅด๋ค โ ์์๋ฅผ ๋ฆฌํด
- ์ด๊ฑฐ ๊ฐ์ฒด๊ฐ ๋งค๊ฐ๊ฐ์ ์ด๊ฑฐ ๊ฐ์ฒด๋ณด๋ค ์๋ฒ์ด ๋ฆ๋ค โ ์์๋ฅผ ๋ฆฌํด
// ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ ์๋ฒ ์ฐจ์ด๋ฅผ ๋ฆฌํด (์์์ ์ ์ด๋ ์ด๊ฑฐ ๊ฐ์ฒด์ ๊ธฐ์ค์ผ๋ก ๋ช๋ฒ์งธ ์์นํ๋์ง)
Week w1 = Week.TUESDAY; // 2
Week w2 = Week.SATURDAY; // 6
// ์ด๊ฑฐ ๊ฐ์ฒด๊ฐ ๋งค๊ฐ๊ฐ์ ์ด๊ฑฐ ๊ฐ์ฒด๋ณด๋ค ์๋ฒ์ด ๋น ๋ฅด๋ค โ ์์๋ฅผ ๋ฆฌํด
int compare1 = w1.compareTo(w2); // SATURDAY ๊ธฐ์ค์ผ๋ก TUESDAY ์์น (6์์ 2๊ฐ ๋๊ธฐ ์ํ ๊ฐ)
System.out.println(compare1); // -4
// ์ด๊ฑฐ ๊ฐ์ฒด๊ฐ ๋งค๊ฐ๊ฐ์ ์ด๊ฑฐ ๊ฐ์ฒด๋ณด๋ค ์๋ฒ์ด ๋ฆ๋ค โ ์์๋ฅผ ๋ฆฌํด
int compare2 = w2.compareTo(w1); // TUESDAY ๊ธฐ์ค์ผ๋ก SATURDAY ์์น (2์์ 6๊ฐ ๋๊ธฐ ์ํ ๊ฐ)
System.out.println(compare2); // 4
valueOf() ๋ฉ์๋
- ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ ๋ฌธ์์ด๊ณผ ๋์ผํ ๋ฌธ์์ด์ ๊ฐ์ง๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
// ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ์์ ์ผ์นํ๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
Week w3 = Week.valueOf("SUNDAY"); // w3 ๋ณ์๋ Week.SUNDAY ์ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋จ
System.out.println(w3); // SUNDAY
values() ๋ฉ์๋
- ์ด๊ฑฐ ํ์ ์ ๋ชจ๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ๋ฆฌํด
// ๋ชจ๋ ์ด๊ฑฐ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด๋ก ๋ฆฌํด
Week[] w4 = Week.values();
System.out.println(Arrays.toString(w4)); // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
for (Week type : Week.values()) { // ์ด๊ฑฐ ์ํ
System.out.println(type); // ์์๋๋ก ์ด๊ฑฐ ๊ฐ์ฒด ์ถ๋ ฅ
}
java.lang.Enum ํด๋์ค
๋ชจ๋ ํด๋์ค๊ฐ Object ํด๋์ค๋ฅผ ์๋ ์์ํ๋ ๊ฒ ์ฒ๋ผ, Enum ํด๋์ค๋ ๋ฌด์กฐ๊ฑด java.lang.Enum ์ด๋ผ๋ ํด๋์ค์ ์์์ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ java.lang.Enum ํด๋์ค์ ์ ์๋์ด ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.

- String name : Enum (์ด๊ฑฐ)์์์ ์ด๋ฆ
- int ordinal : Enum์ ์์, ์์๊ฐ ์ ์ธ๋ ์์๋๋ก 0๋ถํฐ ์ฆ๊ฐํ๋ค
- protected Enum ์์ฑ์ : ์ปดํ์ผ๋ฌ์์ ์๋์ผ๋ก ํธ์ถ๋๋๋ก ํด๋์ ์์ฑ์๋ค. ํ์ง๋ง, ๊ฐ๋ฐ์๊ฐ ์ด ์์ฑ์๋ฅผ ํธ์ถํ ์๋ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก java.lang.Enum ํด๋์ค๋ Object ํด๋์ค๋ฅผ ์๋ ์์ํด์, enum์์๋ Object ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง Enum ํด๋์ค๋ ๊ฐ๋ฐ์๋ค์ด Object ํด๋์ค ์ค ๋ค์ 4๊ฐ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ง ๋ชปํ๋๋ก ๋ฉ์๋๋ฅผ final ํ ํ์ฌ ๋ง์๋์๋ค. ์๋ํ๋ฉด enum์ ๊ณ ์ ํ ์์์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์๊ธฐ ๋ง์๋๋ก ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด ๊ณ ์ ์ฑ์ด ๊นจ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฉ์๋ | ๋ด์ฉ |
clone() | ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ๊ธฐ ์ํ ๋ฉ์๋ ํ์ง๋ง, ์ด ๋ฉ์๋๋ enum ํด๋์ค์์ ์ฌ์ฉํ๋ฉด ์๋๋ค. ๋ง์ฝ ํธ์ถ๋ ๊ฒฝ์ฐ์ CloneNotSupportedException ์ด๋ผ๋ ์์ธ๋ฅผ ๋ฐ์์ํค๋๋ก ๋์ด์๋ค |
finalize() | GC๊ฐ ๋ฐ์ํ ๋ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์๋ |
hashCode() | int ํ์ ์ ํด์ ์ฝ๋ ๊ฐ์ ๋ฆฌํดํ๋ ๋ฉ์๋ |
equals() | ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋์ผํ์ง๋ฅผ ํ์ธํ๋ ๋ฉ์๋ |

Enum ๊ณ ๊ธ ๋ฌธ๋ฒ
Enum ๋งคํ
Season ์ด๋ผ๋ 4๊ณ์ ์์๋ฅผ ์ ์ฅํ enum์ด ์๋๋ฐ, ๋ง์ผ SPRING ์์๋ฅผ ๊ฐ์ ธ์ค๋ฉด "๋ด"์ด๋ผ๋ ์์์ ๊ณ ์ ์ ๊ฐ(value)์ ๋ฌธ์์ด์ ์ถ๋ ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ์๋ enum์ ๋งคํํด์ ๊ตฌ์ฑํด์ค ์ ์๋ค.
// enum ๋งคํ ํด๋์ค
enum Season {
SPRING("๋ด"),
SUMMER("์ฌ๋ฆ"),
FALL("๊ฐ์"),
WINTER("๊ฒจ์ธ");
// ๋ฌธ์์ด์ ์ ์ฅํ ํ๋
private String season;
// ์์ฑ์ (์ฑ๊ธํค)
private Season(String season) {
this.season = season;
}
// Getter
public String getSeason() {
return season;
}
}
public static void main(String[] args) throws Exception {
Season s = Season.SUMMER;
System.out.println(s.name()); // ์ด๊ฑฐ ๊ฐ์ฒด๋ช
์ถ๋ ฅ : SUMMER
System.out.println(s.getSeason()); // ๋งคํ๋ ์ด๊ฑฐ ๋ฐ์ดํฐ ์ถ๋ ฅ : ๋ด
}
์ด๊ฑฐ ๊ฐ์ฒด์ SPRING("๋ด") ์์ "๋ด" ๋ฌธ์์ด์ด enum ํด๋์ค ์์ฑ์ ์
๋ ฅ๊ฐ์ผ๋ก ๋ค์ด๊ฐ private String season ํ๋์ ๋ด๊ธฐ๊ฒ ๋๋ค. ๊ทธ๋์ ์ด๊ฑฐ ๊ฐ์ฒด ๋ณ์์์ getter ๋ฉ์๋ getSeason() ๋ฅผ ํตํด ํด๋น ์ด๊ฑฐ ๊ฐ์ฒด์ ๋งตํ๋ ๋ฌธ์์ด์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค.
enum ์์ ๊ฐ์ฒด์ ๋งค๊ฐ๊ฐ์ผ๋ก ๋ฐ๋์ ํ๊ฐ๋ง ๋ค์ด๊ฐ ํ์๊ฐ ์๋ค. 3๊ฐ ์ ๋ณด ๋งคํ์ด ํ์ํ๋ค๋ฉด enum ํด๋์ค์ ์์ฑ์์ ์๊ท๋จผํธ๋ฅผ 3๊ฐ๋ก ์ง์ ํ๋ฉด ๋๋ ์ผ์ด๋ค.

enum ๋ด๋ถ ๊ตฌ์ฑ ์ดํดํ๊ธฐ
๋จ์ํ ์ด๊ฑฐ ์์ ์งํฉ์ธ์ค ์์๋๋ฐ enum์ ์ด๋ฐ์์ผ๋ก ์ด์ฉ์ด ๊ฐ๋ฅํ ์ด์ ๋, ์ฌ์ค enum ์์ ํ๋๋น ์์ ์ ์ธ์คํด์ค๋ฅผ ํ๋์ฉ ๋ง๋ค์ด public static final ํ๋๋ก ๊ณต๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, Season ์ด๋ผ๋ ์ด๊ฑฐํ ํ์ ์ ์ฐ๋ฆฌ๊ฐ ์๋ ํด๋์ค๋ก ํํํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
/* ํ์
์์ ์ด๊ฑฐ ํจํด(typesafe enum pattern) */
final class Season {
public static final Season SPRING = new Season("SPRING"); // ์๊ธฐ์์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์์ํ
public static final Season SUMMER = new Season("SUMMER");
public static final Season AUTUMN = new Season("AUTUMN");
public static final Season WINTER = new Season("WINTER");
private String season;
private Season(String season) {
this.season = season;
}
public String getSeason() {
return season;
}
}
์ค์ ๋ก enum์ด ๋์ค๊ธฐ์ jdk 1.5 ๋ฐ ๋ฒ์ ์์๋ ์ด๋ ๊ฒ ์ฌ์ฉ๋์๋ค.
์ด์ฒ๋ผ ๊ฐ enum ๊ฐ์ฒด๋ง๋ค ์์ ์ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ์ฌ ์ ์ฅํ๋ enum์ ๋งคํํ๋ค๊ฑฐ๋ ์ถ์๋ฉ์๋ ํ์ฅํ๋ค๊ฑฐ๋ ๋ฑ ์์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์ฑ์ ์์ฒด๊ฐ private ์ ๊ทผ์ ์ด์ ์ด๊ธฐ ๋๋ฌธ์, ๋ฐ์์ ์ ๊ทผํ ์ ์๋ ์์ฑ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ฌ์ค์ final์ด ๋๊ฒ ๋๋ค. ๊ทธ๋์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ๊ฑฐ๋ ํ์ฅํ ์ ์์ผ๋ ์ด๊ฑฐ ํ์ ์ ์ธ์ผ๋ก ๋ง๋ค์ด์ง ์ธ์คํด์ค๋ค์ ๋ฑ ํ๋์ฉ๋ง ์กด์ฌํจ์ด ๋ณด์ฅ๋๋ค.
enum์ ๋ฐ์ดํฐ์ ๊ทธ๋ฃนํ ๋ฐ ๊ด๋ฆฌ์ ์ฉ์ด
๋ฐ์ดํฐ๋ค์ด ์๋ก ๊ด๋ จ๋์ด ์์ง๋ง ๊ด๋ จ๋ ํํ๋ฅผ ๊ตฌํํ๋๋ฐ ์์ด ์ ๋ก์ฌํญ์ด ์๊ธด๋ค๋ฉด enum์ ํตํด ํ ํด๋์ค ๋ด์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
์๋ฅผ๋ค์ด ์ฒดํฌ ์นด๋๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ํ๋ค๋ฉด, ์นด๋์ฌ ๋ง๋ค ๋ค๋ฅด๋ฉฐ ์ ํ ์นด๋๋ฅผ ์ฐ๋๋ผ๋ ๋ ์ฌ๋ฌ๊ฐ์ง ์นด๋ ์ข ๋ฅ๊ฐ ์์ํ ๋ฐ, ๋ณธ๋๋ผ๋ฉด '์นด๋์ฌ' ํด๋์ค์ '์นด๋์ข ๋ฅ' ํด๋์ค ์ด๋ ๊ฒ ๋๊ฐ๋ก ๋๋์ด ์๋ก ์ฐ๊ด๋๊ฒ ์ฝ๋๋ฅผ ๊ตฌ์ฑํด์ผ ๋๋ค.
ํ์ง๋ง enum์ ์ด์ฉํ๋ฉด ํ๋์ ๋ณด๊ธฐ ์ฝ๊ฒ ์๋ ์ฒ๋ผ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ์ฌ ๊ด๊ณ๋ฅผ ๊ฐ์์ ์ผ๋ก ํํํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ ํ๊ฒ ๋ฉ์๋ ๋ก์ง์ enum ๊ฐ์ฒด ๋ด ์์ ๊ตฌํํด์ค๋ค๋ฉด ๊ฐ๋ ฅํ ์์ ํด๋์ค๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋๋ค.
enum CreditCard {
SHINHAN("์ ํ", Arrays.asList("Mr.Life ์นด๋", "Deep Dream ์นด๋", "Deep Oil ์นด๋")),
KB("๊ตญ๋ฏผ", Arrays.asList("ํกํกD ์นด๋", "ํฐํ๋ ์นด๋", "๋ค๋ด ์นด๋")),
NH("๋ํ", Arrays.asList("์ฌ๋ฐ๋ฅธ FLEX ์นด๋", "ํ
์ดํฌ 5 ์นด๋", "NH ์ฌ์ ํ์ด์นด๋"));
private final String Enterprise;
private final List<String> cards;
CreditCard(String name, List<String> cards) {
this.Enterprise = name;
this.cards = cards;
}
String getCard(String cardName) {
return Arrays.stream(CreditCard.values())
.filter(creditCard -> creditCard.equals(cardName))
.findFirst()
.orElseThrow(Exception::new);
}
}
Enum ํ์ฅ
enum ๋งคํ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ, enum์ ๋จ์ํ ์์ ๊ฐ์ ๋์ด์ ์์ ๋ฉ์๋๋ก์๋ ์ด์ฉ์ด ๊ฐ๋ฅํ๋ค.
์์์ enum ๋งคํ์ ํด๋์ค ํ๋์ ์์ฑ์๋ฅผ ์ ์ํด์ ์์์ ๋งค๊ฐ๋ณ์๊ฐ์ ํ๋์ ์ ์ฅํ๊ณ ์ธ์คํด์คํ ํจ์ผ๋ก์จ ๊ณ ์ ํ ์์ ๊ฐ์ฒด๋ก์ ํ์ฉํ์๋ค.
์ฌ๊ธฐ์ ๋ ๋์๊ฐ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ํด์ ๊ฐ ์์๋ง๋ค ์ต๋ช ํด๋์ค ์ฒ๋ผ ๋ฉ์๋ ์ฌ์ ์๋ฅผ ํ๊ฒ ํด์ ๊ฐ ์์๋ง๋ค ๋ค๋ฅธ ์ญํ ์ ํ๋ ๋ฉ์๋๋ฅผ ๊ฐ๊ฒ ๋๋ ์๋ฆฌ์ด๋ค.
enum Operation {
PLUS("+") {
public double apply(double x, double y) {
return x + y;
}
},
MINUS("-") {
public double apply(double x, double y) {
return x - y;
}
},
MULTI("*") {
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE("/") {
public double apply(double x, double y) {
return x / y;
}
};
// ํด๋์ค ์์ฑ์์ ๋ฉค๋ฒ
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
// toString์ ์ฌ์ ์ํ์ฌ ์ด๊ฑฐ ๊ฐ์ฒด์ ๋งคํ๋ ๋ฌธ์์ด์ ๋ฐํํ๋๋ก
@Override
public String toString() {
return symbol;
}
// ์ด๊ฑฐ ๊ฐ์ฒด์ ๋ฉ์๋์ ์ฌ์ฉ๋ ์ถ์ ๋ฉ์๋ ์ ์
public abstract double apply(double x, double y);
}

public static void main(String[] args) {
double x = 2.5;
double y = 5.0;
// Operation ์์์งํฉ์ PLUS ์์๋ฅผ ์ ์
Operation plus = Operation.PLUS;
// enum ๋งคํ๊ฐ ์ถ๋ ฅ
String name = plus.toString();
System.out.println(name); // +
// enum ํ์ฅ ๋ฉ์๋ ์คํ
double result = plus.apply(x, y); // ๋ง์
์ ์ํํ๋ ๋ฉ์๋ (Operation.PLUS.apply(x, y) ๋ก ํด๋๋จ)
System.out.println(result); // 7.5
// ------------------------------------------------------------------- //
// Operation ์์์งํฉ์ PLUS ์์๋ฅผ ์ ์
Operation multi = Operation.MULTI;
String name = plus.toString();
System.out.println(name); // *
// enum ํ์ฅ ๋ฉ์๋ ์คํ
double result2 = multi.apply(x, y); // ๊ณฑ์
์ ์ํํ๋ ๋ฉ์๋
System.out.println(result2); // 12.5
}
enum์ ์ํ์ ํ์๋ฅผ ํ๊ณณ์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅ
์ด์ฒ๋ผ enum์ ๋จ์ํ ์์ ํํ์์ ๋์ด์ ๋์, ํ์๋ฅผ ์ํํ๋ ์์๋ก์๋ ์์ฉ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค. ์์ ์ํ์ ํ์๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
์ฒ์ ๋ฐฐ์ธ๋๋ ๊ธ์ด์ด๋ ๊ณต๊ฐํ ์ ๋๋ก ๋งค์ฐ ํผ๋์ค๋ฝ๊ฒ ์ง๋ง, ์ด ๋ถ๋ถ์ ์ ์๋ฐ์ Enum์ด ๊ฐ๋ ฅํ์ง ๋ณด์ฌ์ฃผ๋ ๋๋ชฉ์ด๊ธฐ๋ ํ๋ค.
์๋ฅผ๋ค์ด ๊ฐ ์์๋ฅผ ํน์ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ์ง๊ฑฐ๋, ์์๋ง๋ค ๋ค๋ฅด๊ฒ ๋์ํ๊ฒ ํ๋ ๋ก์ง์ด ํ์ํ ๋, ๋ณดํต์ด๋ผ๋ฉด ๋จ์ํ if๋ฌธ, switch๋ฌธ์ผ๋ก ์์๋ฅผ ๋ถ๊ธฐํ์ฌ ํ์ฌ ๊ฐ ๋ฉ์๋๋ค์ ์คํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๋ก์ง์ด๊ธฐ ๋ง๋ จ์ด๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ(์ํ)๊ณผ ๋ฉ์๋(ํ์)๊ฐ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง์ ๋ํด ์ฝ๋ ์ ์๋ฌธ์ ์ฐพ์ ๊ธฐ์๊ฑฐ๋ฆฌ๋ฉฐ ํ์ ํด์ผ ํ๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
class Operation {
public void caclulate(String oper) {
if ("+".equals(oper)) {
plus();
} else if ("-".equals(oper)) {
minus();
} else if ("*".equals(oper)) {
multi();
} else if ("/".equals(oper)) {
divide();
}
}
void plus() { ... }
void minus() { ... }
void multi() { ... }
void divide() { ... }
}
ํ์ง๋ง enum์ ์ด์ฉํ๋ฉด ์ํ์ ํ์๋ฅผ ํ๋์ ํ์ ์ด ๊ฐ๋ฅํ๋ค.
๊ฐ์ฒด ์งํฅ' ์ ์ผ๋ก ์ฝ๋๋ฅผ ํจํดํํ์ฌ ์ ์ง ๋ณด์ํ๊ธฐ ์ฉ์ดํ๊ฒ ๋ง๋๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค.

๋๋ค์์ผ๋ก enum์ ๋ ๊น๋ํ๊ฒ
๊ฒฐ๊ตญ์ enum์ ์ต๋ช ํด๋์ค๋ฅผ ์ ์ฉํ ๊ผด๊ณผ ๊ฐ์ผ๋, ๋๋ค ํํ์์ ํตํด ์์ ๊ธฐ๋๊ธด ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ๋ง๋ค ์ ์๋ค.
// ํจ์ํ ์ธํฐํ์ด์ค ์ํฌํธ
import java.util.function.DoubleBinaryOperator;
enum Operation {
PLUS("+", (x, y) -> x + y),
MINUS("-", (x, y) -> x - y),
TIMES("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
private final DoubleBinaryOperator op; // ๋๋ค์์ ์ ์ฅํ ํ๋
private final String symbol;
Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
@Override
public String toString() { return symbol; }
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
}

Enum ๊ณผ ์ฑ๊ธํค ๊ด๊ณ
์๋ฐ์์์ enum ์ด๊ฑฐ ํ์
์ ์ผ์ข
์ ํด๋์ค์ด๋ฉฐ ์์ ํ๋๋น ์์ ์ ์ธ์คํด์ค๋ฅผ ํ๋์ฉ ๋ง๋ค์ด public static final ํ๋๋ก ๊ณต๊ฐํ๊ฒ ๋๋ค. ํ์ง๋ง enum์ ํด๋์ค์ฒ๋ผ ์ด์ฉํ ์๋ ์์ง๋ง ์ธ์คํด์คํ๋ ํ ์๋ ์๋๋ฐ, ์ค์ ๋ก new ํค์๋๋ก ์ธ์คํด์ค ์์ฑ์ ํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
์ด๋ฌํ ์ ์ฝ์ ์ธ ํน์ง์ ๊ฐ์ง๊ณ ์๋ ์ด์ ๋ enum ํ์ ์ ๊ณ ์ ๋ ์์๋ค์ ์งํฉ์ผ๋ก์จ, ๋ฐํ์(run-time)์ด ์๋ ์ปดํ์ผํ์(compile-time)์ ๋ชจ๋ ๊ฐ์ ์๊ณ ์์ด์ผ ํ๋ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋ค๋ฅธ ํจํค์ง๋ ํด๋์ค์์ enum ํ์ ์ ์ ๊ทผํด์ ๋ณ์ ์ฒ๋ผ ๋์ ์ผ๋ก ์ด๋ ํ ๊ฐ๋ค์ ํ ๋นํด ์ฃผ๋ ํ์๋ ๊ธ์ง๋ ๊ฒ์ด๋ค.
์ด ๋๋ฌธ์ enum ๊ฐ์ฒด์ ์์ฑ์์ ์ ๊ทผ์ ์ด์๋ฅผ private์ผ๋ก ์ค์ ํด์ผ ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก enumํ์ ์ ์ค์ ์ ์ผ๋ก final ํด๋์ค์ ๋ค๋ฆ์ด ์๊ฒ ๋๋ค.
์ด๋ฌํ ํน์ฑ ๋๋ฌธ์, enumํ์ ์ ์ฑ๊ธํค์ ๊ตฌํํ๋ ํ๋์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค.
[GOF] ๐ ์ฑ๊ธํค(Singleton) ํจํด - ๊ผผ๊ผผํ๊ฒ ์์๋ณด์
Singleton Pattern ์ฑ๊ธํค ํจํด์ ๋์์ธ ํจํด๋ค ์ค์์ ๊ฐ์ฅ ๊ฐ๋ ์ ์ผ๋ก ๊ฐ๋จํ ํจํด์ด๋ค. ํ์ง๋ง ๊ฐ๋จํ ๋งํผ ์ด ํจํด์ ๋ํด ์ฝ๋๋ง ๋์ ธ์ฃผ๊ณ ๋๋ด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์์ด, ์ด๋์ ์ฐ์ด๋์ง ์ด๋ ํ ๋ฌธ
inpa.tistory.com
enum SingletonEnum {
INSTANCE;
private final Client dbClient;
SingletonEnum() {
dbClient = Database.getClient();
}
public static SingletonEnum getInstance() {
return INSTANCE;
}
public Client getClient() {
return dbClient;
}
}
public class Main {
public static void main(String[] args) {
SingletonEnum singleton = SingletonEnum.getInstance();
singleton.getClient();
}
}
# ์ฐธ๊ณ ์๋ฃ
https://www.nextree.co.kr/p11686/
์ด๊ฒ์ด ์๋ฐ๋ค - ์ ์ฉ๊ถ์ Java ํ๋ก๊ทธ๋๋ฐ ์ ๋ณต
https://github.com/yeGenieee/java-live-study/blob/main/%5B11%5DJava%20Live%20Study.md
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.