Item 34. Enum
int μμ λμ μ΄κ±° νμ μ μ¬μ©νλΌ.
μ΄κ±° νμ μ μΌμ κ°μμ μμ κ°μ μ μνμ¬ κ·Έ μΈμ κ°μ νμ©νμ§ μλ νμ μΌλ‘, μ ν΄μ§ κ°λ§μ μ¬μ©νκ³ μΆμ λ μ¬μ©νλ€. μ΄κ±° νμ μ§μ μ΄μ μλ μ μ μμλ₯Ό μ¬μ©νμ¬ κ΅¬ννμμ§λ§ νμ μμ μ 보μ₯νμ§ μκ³ κ°λ μ±λ μ’μ§ μμλ€.
μ΄κ±° νμ
μ΄κ±° νμ μ λ€μκ³Ό κ°μ΄ μ μν μ μλ€.
public enum Apple {
FUJI, PIPPIN, GRANNY_SMITH
}
C/C++μ enum
κ³Ό λ¬λ¦¬ μ΄κ±° νμ
μ μμ ν ννμ ν΄λμ€κΈ° λλ¬Έμ λ€λ₯Έ μΈμ΄μ μ΄κ±° νμ
λ³΄λ€ ν μ μλ μΌμ΄ λ§λ€.
μ΄κ±° νμ
μμ²΄κ° ν΄λμ€μ΄κΈ° λλ¬Έμ, μμ νλλΉ μμ μ μΈμ€ν΄μ€λ₯Ό νλμ© λ§λ€μ΄ public static final νλλ‘ κ³΅κ°λλ κ²μ΄λ€.
κ·Έμ λ°λΌ μκΈ°λ νΉμ§μ λ€μκ³Ό κ°λ€.
λ°μμ μ κ·Όν μ μλ μμ±μλ₯Ό μ 곡νμ§ μμΌλ―λ‘ μΈμ€ν΄μ€λ₯Ό μ§μ μμ±ν μ μμ
μ§μ μμ±νκ±°λ νμ₯ λΆκ°λ₯νλ―λ‘ μΈμ€ν΄μ€λ€μ 미리 μ μλ μμ νλ μ©λ§ μ‘΄μ¬ν¨(μ±κΈν΄μ μΌλ°νν νν)
미리 μ μλ μμλ§ μ¬μ©ν μ μκΈ° λλ¬Έμ μ»΄νμΌνμμ λ€ μ μ μλ μμ μ§ν©μ΄λΌλ©΄ μ΄κ±° νμ μ μ¬μ©νλ κ²μ΄ μ’λ€.
λ©μλμ νλ μΆκ°
κ²°κ΅ μμ ν ννμ ν΄λμ€κΈ° λλ¬Έμ μ΄κ±° νμ μ λ€μκ³Ό κ°μ΄ λ©μλμ νλλ₯Ό μΆκ°ν μ μλ€.
enum Operation {
PLUS("+") {
@Override
public double apply(double x, double y) {
return x + y;
}
},
MINUS("-") {
@Override
public double apply(double x, double y) {
return x - y;
}
},
TIMES("*") {
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE("/") {
@Override
public double apply(double x, double y) {
return x / y;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
// μΆμ λ©μλλ‘ κ° μμμμ λ€λ₯Έ λμμ μννλλ‘ ν¨
public abstract double apply(double x, double y);
// μΌλ° λ©μλλ‘ ν΄λΉ μμμ νλλ₯Ό λ°ννλλ‘ ν¨
public String getSymbol() {
return symbol;
}
// static λ©μλλ‘ λ¬Έμμ΄μ λ°μ ν΄λΉ λ¬Έμμ΄μ κ°μ§λ μμλ₯Ό λ°ννλλ‘ ν¨
public static Operation fromString(String symbol) {
return Arrays.stream(values())
.filter(op -> op.symbol.equals(symbol))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
// toString λ©μλλ₯Ό μ¬μ μνμ¬ ν΄λΉ μμμ νλλ₯Ό λ°ννλλ‘ ν¨
@Override
public String toString() {
return getSymbol();
}
}
class Main {
public static void main(String[] args) {
double x = 10;
double y = 5;
for (Operation op : Operation.values()) {
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
}
}
μ λ΅ μ΄κ±° νμ
ν¨ν΄(Strategy Enum Pattern)
μ΄κ±° νμ μ μ¬μ©νλ©΄ μμλΌλ¦¬ μ½λλ₯Ό 곡μ νκΈ° μ΄λ ΅λ€λ λ¨μ μ΄ μλ€. μλ μ½λλ μ£Όμ€/μ£Όλ§μ λ°λΌ μμ μλΉμ κ³μ°νλ μ½λμΈλ°, switch λ¬Έμ ν΅ν΄ μμ μλΉμ κ³μ°νκ³ μλ€. μ°μ μ κ°κ²°νκ² ννλλ μ½λμ§λ§, κ΄λ¦¬ κ΄μ μμλ μνν μ½λλ‘, ν΄κ°μ κ°μ μλ‘μ΄ κ°μ΄ μΆκ°λλ©΄ switch λ¬Έμ μ°Ύμ ν΄λΉ case λ¬Έμ μΆκ°ν΄μΌ νλ€.
enum PayrollDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minutesWorked, int payRate) {
int basePay = minutesWorked * payRate;
int overtimePay;
switch (this) {
case SATURDAY:
case SUNDAY:
overtimePay = basePay / 2;
break;
default:
overtimePay = minutesWorked <= MINS_PER_SHIFT ?
0 : (minutesWorked - MINS_PER_SHIFT) * payRate / 2;
}
return basePay + overtimePay;
}
}
μ΄λ₯Ό λ³΄λ€ μ ννκ³ μμ μ μΌλ‘ ꡬννκΈ° μν΄μ λ κ°μ§ λ°©λ²μ΄ μ‘΄μ¬νλλ°, λ λ°©μ λͺ¨λ κ°λ μ±μ΄ λ¨μ΄μ§κ³ μ½λκ° μ₯ν©ν΄μ§λ λ¨μ μ΄ μλ€.
μμ μλΉμ κ³μ°νλ μ½λλ₯Ό λͺ¨λ μμμ μ€λ³΅νμ¬ μμ±
κ³μ° μ½λλ₯Ό νμΌ/μ£Όλ§μ©μΌλ‘ λλ κ°κ° λμ°λ―Έ λ©μλλ‘ μμ±ν λ€ κ° μμκ° μλ§λ λ©μλ νΈμΆ
μ΄λ¬ν λ°©λ²μ΄ μλ μμλ₯Ό μΆκ°ν λ μμ±μμμ μ λ΅μ μ ννλλ‘ νμ¬ ν΄κ²°ν μ μλ€.
enum PayrollDay {
MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY), WEDNESDAY(PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY),
SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);
private final PayType payType;
PayrollDay(PayType payType) {
this.payType = payType;
}
int pay(int minutesWorked, int payRate) {
return payType.pay(minutesWorked, payRate);
}
// μ λ΅ μ΄κ±° νμ
private enum PayType {
WEEKDAY {
@Override
int overtimePay(int minsWorked, int payRate) {
return minsWorked <= MINS_PER_SHIFT ? 0 : (minsWorked - MINS_PER_SHIFT) * payRate / 2;
}
},
WEEKEND {
@Override
int overtimePay(int minsWorked, int payRate) {
return minsWorked * payRate / 2;
}
};
private static final int MINS_PER_SHIFT = 8 * 60;
abstract int overtimePay(int mins, int payRate);
int pay(int minsWorked, int payRate) {
int basePay = minsWorked * payRate;
return basePay + overtimePay(minsWorked, payRate);
}
}
}
μ΄λ κ² νλ©΄ κΈ°μ‘΄ switchλ¬Έλ³΄λ€ μ½λ μμ λ§μμ§μ§λ§, μλ‘μ΄ μμλ₯Ό μΆκ°ν λλ§λ€ switchλ¬Έμ μ°Ύμ caseλ¬Έμ μΆκ°νλ κ²λ³΄λ€ ν¨μ¬ μμ νκ³ μ μ°νλ€. μ΄λ¬ν λ°©λ²μ μ λ΅ μ΄κ±° νμ ν¨ν΄μ΄λΌ νλ©°, μ΄κ° νμ μμ μΌλΆκ° κ°μ λμμ 곡μ νλ€λ©΄ μ΄ λ°©μμ μ¬μ©νλ κ²μ΄ μ’λ€.
Last updated
Was this helpful?