[item34] int μμ λμ μ΄κ±° νμ
μ μ¬μ©νλ€
μ μ μ΄κ±° ν¨ν΄
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;
μ΄κ±° νμ
μ νΉμ§
- μμ ν ννμ ν΄λμ€(C, C++, C#μ enumκ³Όλ λ€λ₯΄λ€)
- μμ νλλΉ μμ μ μΈμ€ν΄μ€λ₯Ό νλμ© λ§λ€μ΄ public static final νλλ‘ κ³΅κ°νλ€
- λ°μμ μ κ·Όν μ μλ μμ±μλ₯Ό μ 곡νμ§ μμ μ¬μ€μ final
- ν΄λΌμ΄μΈνΈκ° μΈμ€ν΄μ€λ₯Ό μ§μ μμ±νκ±°λ νμ₯ν μ μλ€
- μ΄κ±° νμ
μ μΈμΌλ‘ λ§λ€μ΄μ§ μΈμ€ν΄μ€λ€μ λ± νλμ©λ§ μ‘΄μ¬
- μ»΄νμΌνμ νμ
μμ μ± μ 곡
- 맀κ°λ³μλ‘ κ±΄λ€λ°μ μ°Έμ‘°λ null λλ ν΄λΉ enum μ€ νλ(λ€λ₯Έ νμ
μΌ κ²½μ° μ»΄νμΌ μλ¬)
- namespace μ‘΄μ¬νμ¬ μ΄λ¦μ΄ κ°μ μμλ 곡쑴 κ°λ₯
- νλμ μ΄λ¦λ§ 곡κ°λκΈ° λλ¬Έμ enumμ μμ μΆκ°λ μμ λ³κ²½μ΄ μλλΌλ λ€μ μ»΄νμΌνμ§ μμλ λλ€.
- enumμ toString()μ μΆλ ₯μ μ ν©ν λ¬Έμμ΄μ λ΄μ€λ€.
- μμμ λ©μλλ νλλ₯Ό μΆκ°ν μ μκ³ , μμμ μΈν°νμ΄μ€λ₯Ό ꡬννκ² ν μλ μλ€.
λ°μ΄ν°μ λ©μλλ₯Ό κ°λ μ΄κ±° νμ
public enum Planet {
MERCURY(3.302e+23, 2.439e6),
VENUS(4.869e+24, 6.052e6),
EARTH(5.975e+24, 6.378e6),
MARS(6.419e+23, 3.393e6),
JUPITER(1.899e+27, 7.149e7),
SATURN(5.685e+26, 6.027e7),
URANUS(8.683e+25, 2.556e7),
NEPTUNE(1.024e+26, 2.447e7);
// λͺ¨λ field final
private final double mass; // μ§λ(λ¨μ: ν¬λ‘κ·Έλ¨)
private final double radius; // λ°μ§λ¦(λ¨μ: λ―Έν°)
private final double surfaceGravity; // νλ©΄μ€λ ₯(λ¨μ: m / s^2)
// μ€λ ₯μμ (λ¨μ: m^3 / kg s^2)
private static final double G = 6.67300E-11;
// μμ±μ
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
this.surfaceGravity = G * mass / (radius * radius);
}
public double surfaceWeight(double mass) {
return mass * surfaceGravity;
}
}
- μ΄κ±° νμ
μμ κ°κ°μ νΉμ λ°μ΄ν°μ μ°κ²°μ§μΌλ €λ©΄ μμ±μμμ λ°μ΄ν°λ₯Ό λ°μ μΈμ€ν΄μ€ νλμ μ μ₯νλ©΄ λλ€.
- λͺ¨λ fieldλ finalμ΄μ΄μΌ νλ€. (μ°Έκ³ λ‘, fieldλ₯Ό privateμΌλ‘ λκ³ public μ κ·Όμ λ©μλλ₯Ό λλ κ² λ«λ€)
- μμ μμ μ μλ μμλ€μ κ°μ λ°°μ΄μ λ΄μ(μΈμ€ν΄μ€ λ°°μ΄) λ°ννλ μ μ λ©μλ values()λ₯Ό μ 곡νλ€. (μ μΈλ μμ)
- μμ μ΄λ¦μ μ
λ ₯λ°μ κ·Έ μ΄λ¦μ ν΄λΉνλ μμ(μΈμ€ν΄μ€)λ₯Ό λ³νν΄μ£Όλ valueOf(String)μ΄ μλ μμ±λλ€.
- κ° μ΄κ±° νμ
κ°μ toString()μ μμ μ΄λ¦μ λ¬Έμμ΄λ‘ λ°ννλ€
- μμκ° μ κ±°λλ©΄ ν΄λΉ μμλ₯Ό μ°Έμ‘°νκ³ μλ ν΄λΌμ΄μΈνΈλ μ»΄νμΌν λ μ€λ₯κ° λ°μν κ²μ΄λ€.(μ μ μ΄κ±° ν¨ν΄μμλ μ΄λ° κ±Έ κΈ°λν μ μλ€)
μμλ³ λ©μλ ꡬν
// μ’μ§ μμ νν
public enum Operation {
PLUS, MINUS, TIMES, DIVIDE;
// μμκ° λ»νλ μ°μ° μν
public double apply(double x, double y) {
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x / y;
}
throw new AssertionError("μ μ μλ μ°μ°: " + this);
}
}
- throwλ¬Έμ λλ¬ν μΌμ΄ μμ§λ§ μλ΅νλ©΄ μ»΄νμΌλμ§ μλλ€.
- μμκ° μλ‘ μΆκ°λμμ λ caseλ¬Έμ΄ μΆκ°λμ§ μμΌλ©΄ λ°νμμ μ€λ₯κ° λ°μνλ€.
public enum Operation {
PLUS("+") { public double apply(double x, double y) { return x + y; } },
MINUS("-") { public double apply(double x, double y) { return x - y; } },
TIMES("*") { 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; }
public abstract double apply(double x, double y);
@override public String toString() { return symbol; }
}
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Operation op : Operation.values())
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
- apply()κ° μΆμ λ©μλλΌμ μ¬μ μνμ§ μμΌλ©΄ μ»΄νμΌ μλ¬κ° λ°μνλ€.
- μ΄κ±° νμ
μμλΌλ¦¬ μ½λλ₯Ό 곡μ νκΈ° μ΄λ ΅λ€λ λ¨μ μ΄ μλ€.
μ λ΅(strategy) μ΄κ±° νμ
ν¨ν΄
// μ’μ§ μμ νν
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μ μΆκ°νλ €λ©΄ caseλ¬Έμ μμ§ λ§κ³ μμΌλ‘ λ£μ΄μ€μΌ νλ κ²
- μμλ³ λ©μλ ꡬνμ μ½λκ° μ₯ν©ν΄μ Έ κ°λ
μ±μ΄ ν¬κ² λ¨μ΄μ§κ³ μ€λ₯ λ°μ κ°λ₯μ±μ΄ λλ€
// μ λ΅(strategy) μ΄κ±° νμ
ν¨ν΄ μ μ©
enum PayrollDay {
MONDAY(WEEKDAY), TUESDAY(WEEKDAY), WEDNESDAY(WEEKDAY),
THURSDAY(WEEKDAY), FRIDAY(WEEKDAY),
SATURDAY(WEEKEND), SUNDAY(WEEKEND);
private final PayType payType;
PayrollDay(PayType payType) {
this.payType = payType;
}
int pay(int minutesWorked, int payRate) {
return payType.pay(minutesWorked, payRate);
}
// nested class
enum PayType {
WEEKDAY {
int overtimePay(int minutesWorked, int payRate) {
return minutesWorked <= MINS_PER_SHIFT ? 0 : (minutesWorked - MINS_PER_SHIFT) * payRate / 2;
}
},
WEEKEND {
int overtimePay(int minutesWorked, int payRate) {
return minutesWorked * payRate / 2;
}
};
abstract int overtimePay(int minutesWorked, int payRate);
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minutesWorked, int payRate) {
int basePay = minutesWorked & payRate;
return basePay + overtimePay(minutesWorked, payRate);
}
}
}
- μμ
μλΉ κ³μ°μ private μ€μ²© enum νμ
μΈ PayTypeμ μμνλ€.
- switch문보λ€λ 볡μ‘νμ§λ§ λ μμ νκ³ μ μ°νλ€
switchλ¬Έμ μ΄μ©ν κΈ°λ₯ μν
// Thirdpartyμμ κ°μ Έμ¨ Operation μ΄κ±° νμ
μ μ΄μ©ν΄μΌ ν λ
public static Operation inverse(Operation op) {
switch(op) {
case PLUS: return Operation.MINUS;
case MINUS: return Operation.PLUS;
case TIMES: return Operation.DIVIDE;
case DIVIDE: return Operation.TIMES;
default: throw new AssertionError("μ μ μλ μ°μ°: " + op);
}
}
- switchλ¬Έμ΄ μ΄κ±° νμ
μ μμλ³ λμμ ꡬννλ λ° μ ν©νμ§ μμΌλ, μμλ³ λμμ νΌν©μ λ£μ λλ μ’μ μ νμ΄ λ μ μλ€.
ν΅μ¬ μ 리
- μ΄κ±° νμ
μ΄ μ μ μμλ³΄λ€ λ μ½κΈ° μ½κ³ μμ νκ³ κ°λ ₯νλ€
- κ° μμλ₯Ό νΉμ λ°μ΄ν°μ μ°κ²°μ§κ±°λ μμλ§λ€ λ€λ₯΄κ² λμνκ² ν μ μλ€.
- νλμ λ©μλκ° μμλ³λ‘ λ€λ₯΄κ² λμν΄μΌ ν λλ switchλ¬Έ λμ μμλ³ λ©μλ ꡬνμ μ¬μ©νμ
- μμ μΌλΆκ° κ°μ λμμ 곡μ νλ€λ©΄ μ λ΅ μ΄κ±° νμ
ν¨ν΄μ μ¬μ©νμ
- νμν μμλ₯Ό μ»΄νμΌνμμ λ€ μ μ μλ μμ μ§ν©μ΄λΌλ©΄ νμ μ΄κ±° νμ
μ μ¬μ©νμ
- E.g. νμκ³ νμ±, μ²΄μ€ λ§, λ©λ΄ μμ΄ν
, μ°μ° μ½λ, λͺ
λ Ήμ€ νλκ·Έ λ±
- μ μλ μμ κ°μκ° μμν λΆλ³μΌ νμλ μλ€. (μμ μΆκ°λΌλ λ°μ΄λ리 νΈν κ°λ₯)
μ°Έκ³