β μλ° Enum μ΄κ±°ν νμ λ¬Έλ² & μμ© π― μ 리
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νμ μ μ±κΈν€μ ꡬννλ νλμ λ°©λ²μΌλ‘ μ¬μ©λκΈ°λ νλ€.
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