μ΄κ±° νμ μ μΌμ κ°μμ μμ κ°μ μ μν λ€μ, κ·Έ μΈμ κ°μ νμ©νμ§ μλ νμ μ΄λ€.
μλμ μ½λλ κ²½μ°μ μκ° νμ λ λ κ° κ²½μ°λ₯Ό μμ κ°μΌλ‘ μΉννμ¬ νννλ κ²μ΄λ€.
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;- νμ μμ μ 보μ₯ν λ°©λ²μ΄ μμΌλ©° ννλ ₯λ μ’μ§ μλ€.
μ€λ μ§λ₯Ό 건λ€μΌ ν λ©μλμ μ¬κ³Όλ₯Ό λ³΄λ΄ κ³ λλ± μ°μ°μ(=)λ‘ λΉκ΅νλλΌλ μ»΄νμΌλ¬λ μλ¬΄λ° κ²½κ³ λ©μμ§λ₯Ό μΆλ ₯νμ§ μλλ€.
// ν₯κΈν μ€λ μ§ ν₯μ μ¬κ³Ό μμ€!
int i = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN;- μ μ μ΄κ±° ν¨ν΄μ μν
λ³λ μ΄λ¦κ³΅κ°(namespace)μ μ§μ νμ§ μλλ€.
μ¬κ³Όμ© μμμ μ΄λ¦μ λͺ¨λ APPLE_λ‘ μμνκ³ , μ€λ μ§μ© μμλ ORANGE_λ‘ μμνλ€. μ μ μ΄κ±° ν¨ν΄μ μν λ³λ μ΄λ¦κ³΅κ°μ μ§μνμ§ μκΈ° λλ¬Έμ μ΄μ© μ μμ΄ μ λμ΄λ₯Ό μ¨μ μ΄λ¦ μΆ©λμ νλ κ²μ΄λ€.
- μ μ μ΄κ±° ν¨ν΄μ μ¬μ©ν νλ‘κ·Έλ¨μ κΉ¨μ§κΈ° μ½λ€.
νλ²ν μμλ₯Ό λμ΄νκ² λΏμ΄λΌ μ»΄νμΌνλ©΄ κ·Έ κ°μ΄ ν΄λΌμ΄μΈνΈ νμΌμ κ·Έλλ‘ μ겨μ§λ€.
λ°λΌμ μμμ κ°μ΄ λ°λλ©΄ ν΄λΌμ΄μΈνΈλ λ°λμ λ€μ μ»΄νμΌν΄μΌ νλ€.
- μ μ μμλ λ¬Έμμ΄λ‘ μΆλ ₯νκΈ° κΉλ€λ‘λ€.
κ°μ μΆλ ₯νκ±°λ λλ²κ±°λ‘ μ΄ν΄λ³΄λ©΄ (μλ―Έκ° μλ) λ¨μ§ μ«μλ‘λ§ λ³΄μ¬μ μ© λμμ΄ λμ§ μλλ€. κ°μ μ μ μ΄κ±° κ·Έλ£Ήμ μν λͺ¨λ μμλ₯Ό ν λ°ν΄ μννλ λ°©λ²λ λ§λ μΉ μλ€. μ¬μ§μ΄ κ·Έ μμ μμκ° λͺ κ°μΈμ§λ μ μ μλ€.
μ μ λμ λ¬Έμμ΄ μμλ₯Ό μ¬μ©νλ λ³ν ν¨ν΄λ μλλ° λ μμ’λ€. μμ μλ―Έλ₯Ό μΆλ ₯ν μ μλ€λ μ μ μ’μ§λ§, κ²½νμ΄ λΆμ‘±ν νλ‘κ·Έλλ¨Έκ° λ¬Έμμ΄ μμμ μ΄λ¦ λμ λ¬Έμμ΄ κ°μ κ·Έλλ‘ νλμ½λ©νκ² λ§λ€κΈ° λλ¬Έμ΄λ€.
μ΄λ κ² νλμ½λ©ν λ¬Έμμ΄ μ μ€νκ° μμ΄λ μ»΄νμΌλ¬λ νμΈν κΈΈμ΄ μμΌλ μμ°μ€λ½κ² λ°νμ λ²κ·Έκ° μκΈ΄λ€. λ¬Έμμ΄ λΉκ΅μ λ°λ₯Έ μ±λ₯ μ ν μμ λΉμ°ν κ²°κ³Όλ€.
μ΄κ±° ν¨ν΄λ€μ λ¨μ μ λ§λν μ»μ΄μ£Όλ λμμ μ¬λ¬ μ₯μ μ μ겨주λ λμ
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { NAVEL, TEMPLE, BLOOD }{% hint style="success" %} μλ°μ μ΄κ±° νμ μ μμ ν ννμ ν΄λμ€λΌμ (λ¨μν μ μ« κ°μΌ λΏμΈ) λ€λ₯Έ μΈμ΄μ μ΄κ±° νμ λ³΄λ€ ν¨μ¬ κ°λ ₯νλ€. {% endhint %}
μ΄κ±° νμ μ체λ ν΄λμ€μ΄λ©°, μμ νλλΉ μμ μ μΈμ€ν΄μ€λ₯Ό νλμ© λ§λ€μ΄ public static final νλλ‘ κ³΅κ°νλ€.
- μ΄κ±° νμ μ λ°μμ μ κ·Όν μ μλ μμ±μλ₯Ό μ 곡νμ§ μμΌλ―λ‘ μ¬μ€μ finalμ΄λ€.
- μΈμ€ν΄μ€κ° ν΅μ λλ€. μΈμ€ν΄μ€λ€μ μ€μ§ νλλ§ μ‘΄μ¬νλ€.
- μμκ° νλμ΄λ©΄ μ±κΈν΄μΌλ‘ λ³Ό μ μλ€. μ±κΈν΄μ μμκ° νλλΏμΈ μ΄κ±° νμ μ΄λΌκ³ ν μ μκ³ , κ±°κΎΈλ‘ μ΄κ±° νμ μ μ±κΈν΄μ μΌλ°νν ννλΌκ³ ν μ μλ€.
μ΄κ±° νμ μ μ»΄νμΌνμ νμ μμ μ±μ μ 곡νλ€.
- μ΄μ μ
int μμ ν¨ν΄μ²λΌORANGEκ° κ° κ³³μAPPLEμ΄ κ°λ€λ©΄, λͺ νν νμ μλ¬κ° λ°μνλ€. - νμ μ΄ λ€λ₯Έ μ΄κ±° νμ λ³μμ ν λΉνλ € νκ±°λ λ€λ₯Έ μ΄κ±° νμ μ κ°λΌλ¦¬ == μ°μ°μλ‘ λΉκ΅νλ €λ κΌ΄μ΄κΈ° λλ¬Έμ΄λ€.
λ€μμ€νμ΄μ€λ₯Ό μ 곡νμ¬, μ΄λ¦μ΄ κ°μ μμλ ννλ‘κ² κ³΅μ‘΄ν μ μλ€.
APPLE.REDμORANGE.REDλ ꡬλΆλλ€.
toString()μ΄ μΆλ ₯νκΈ°μ μ ν©ν λ¬Έμμ΄μ λ΄μ΄μ€λ€.
μ΄κ±° νμ μλ λ€μν λ©μλλ νλλ μΆκ° κ°λ₯νλ€.
- μΆκ°λ‘ μμμ μΈν°νμ΄μ€λ ꡬννκ² ν μ μλ€.
- 곡κ°λλ κ²μ΄ μ€μ§ νλμ μ΄λ¦λΏμ΄λΌ, μ μ μ΄κ±° ν¨ν΄κ³Ό λ¬λ¦¬ μμ κ°μ΄ ν΄λΌμ΄μΈνΈλ‘ μ»΄νμΌλμ΄ κ°μΈλμ§ μκΈ° λλ¬Έμ΄λ€
- νμκ³μ μ¬λ νμ±μ λν μ΄κ±° νμ μ λ§λλ κ²λ 그리 μ΄λ ΅μ§ μλ€.
- κ° νμ±μ λ μ§λκ³Ό λ°μ§λ¦μ΄ μκ³ , μ΄ λ μμ±μ μ΄μ©ν΄ νλ©΄μ€λ ₯μ κ³μ°ν μ μλ€. λ° λΌμ μ΄λ€ κ°μ²΄μ μ§λμ΄ μ£Όμ΄μ§λ©΄ κ·Έ κ°μ²΄κ° νμ± νλ©΄μ μμ λμ 무κ²λ κ³μ°ν μ μλ€.
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.477e7);
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.677300E-11;
// μμ±μ
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
this.surfaceGravity = G * mass / (radius * radius);
}
public double mass() { return mass; }
public double radius() { return radius; }
public double surfaceGravity() { return surfaceGravity; }
public double surfaceWeight(double mass) {
return mass * surfaceGravity; // F = ma
}
}μ΄κ±° νμ μμ κ°κ°μ νΉμ λ°μ΄ν°μ μ°κ²°μ§μΌλ €λ©΄ μμ±μμμ λ°μ΄ν°λ₯Ό λ°μ μΈμ€ν΄μ€ νλ μ μ μ₯νλ©΄ λλ€.
- μ΄κ±° νμ
μ κ·Όλ³Έμ μΌλ‘
λΆλ³μ΄λΌ λͺ¨λ νλλfinalμ΄μ΄μΌ νλ€. - νλλ₯Ό publicμΌλ‘ μ μΈν΄λ λμ§λ§, privateμΌλ‘ λκ³ λ³λμ public μ κ·Όμ λ©μλλ₯Ό λλ κ² λ«λ€.
- Planetμ μμ±μμμ νλ©΄μ€λ ₯μ κ³μ°ν΄ μ μ₯ν μ΄μ λ λ¨μν
μ΅μ νλ₯Ό μν΄μλ€.
{% hint style="info" %} μ΄κ±° νμ (enum)μ μ μν λ κ° μ΄κ±° μμμ νΉμ ν λ°μ΄ν°λ₯Ό μ°κ²°νλ λ°©μκ³Ό λΆλ³μ±μ μ μ§νλ λ°©λ² μ’ λ μμΈν {% endhint %}
1. μ΄κ±° νμ μμμ λ°μ΄ν° μ°κ²°
μ΄κ±° νμ
μμ κ° μμ(νμ±)μ λ°μ΄ν°λ₯Ό μ°κ²°νλ €λ©΄, ν΄λΉ λ°μ΄ν°λ₯Ό μμ±μλ₯Ό ν΅ν΄ λ°μ νλμ μ μ₯νλ€. Planet μμ μμ mass(μ§λ)μ radius(λ°μ§λ¦) λ°μ΄ν°λ₯Ό κ° νμ±μ μ°κ²°νλ λ°©μμ΄ μ΄μ ν΄λΉνλ€.
// κ° νμ±λ§λ€ μ§λ(mass)κ³Ό λ°μ§λ¦(radius)μ μ λ¬λ°μ μ°κ²°ν©λλ€.
MERCURY(3.302e+23, 2.439e6),
VENUS(4.869e+24, 6.052e6),
EARTH(5.975e+24, 6.378e6),μμ²λΌ κ° νμ± μμμ massμ radius κ°μ μ λ¬νλ©΄, μ΄ κ°λ€μ΄ μμ±μμ μν΄ μΈμ€ν΄μ€ νλμ μ μ₯λλ€. μ΄λ₯Ό ν΅ν΄ κ° μμλ μμ λ§μ κ³ μ ν λ°μ΄ν°λ₯Ό κ°μ§κ² λλ€.
μ΄κ±° νμ
μ λΆλ³μ±μ μ μ§νλ κ²μ΄ μ€μνλ€. μ¦, ν λ² μμ±λ μ΄κ±° νμ
μμμ λ°μ΄ν°λ μμ ν μ μμ΄μΌ νλ€. μ΄λ₯Ό μν΄ λͺ¨λ νλλ finalλ‘ μ μΈλλ€.
private final double mass; // μ§λ
private final double radius; // λ°μ§λ¦
private final double surfaceGravity; // νλ©΄ μ€λ ₯μ΄λ κ² νλλ₯Ό
finalλ‘ μ μΈνλ©΄ μ΄κΈ°νλ ν λ³κ²½μ΄ λΆκ°λ₯νλ€.
μ΄κ±° νμ
μΈ Planetμ κ° νμ±μ mass, radius, surfaceGravity κ°μ μμ± μμ μλ§ μ€μ νκ³ μ΄νμλ λ³κ²½ν μ μλ€.
λΉλ‘ final νλλΌ νλλΌλ μ§μ κ°μ μ½κΈ° μν΄μλ μ§μ νλλ₯Ό 곡κ°(publicμΌλ‘ μ μΈ)ν기보λ€λ privateμΌλ‘ μ μΈνκ³ public μ κ·Όμ λ©μλλ₯Ό μΆκ°νλ κ²μ΄ μ’λ€.
public double mass() { return mass; }
public double radius() { return radius; }
public double surfaceGravity() { return surfaceGravity; }μμ²λΌ mass, radius, surfaceGravityλ₯Ό λ°ννλ public λ©μλλ₯Ό μ 곡νμ¬ κ°μ μ½λλ‘ νλλ°, μ΄ λ°©μμ΄ μ νΈλλ μ΄μ λ λ€μκ³Ό κ°λ€:
- μΊ‘μν: λ΄λΆ ꡬνμ λν μΈλΆ μ 보λ₯Ό μ¨κΈ°κ³ νμν μ λ³΄λ§ μΈλΆμ 곡κ°ν μ μλ€.
- μΆν λ³κ²½ μ©μ΄μ±: νλλ λ©μλλ₯Ό μμ νκ±°λ μΆκ°ν λλ, μΈλΆ μ¬μ© λ°©μμ μν₯μ μ£Όμ§ μκ³ μ μ°νκ² λμν μ μλ€.
μ΄λ κ² Planet μμ μμ κ° νμ±μ final νλλ‘ μ μΈλ λΆλ³ λ°μ΄ν°λ₯Ό κ°μ§λ€. λ°μ΄ν°μ μ κ·Όν λλ mass(), radius(), surfaceGravity()μ κ°μ μ κ·Όμ λ©μλλ₯Ό ν΅ν΄μλ§ κ°μ μ»μ μ μλλ‘ νμ¬ μμ νκ³ μΌκ΄λ λ°©μμΌλ‘ νλμ μ κ·Όνκ² λλ€.
value()λ©μλ λ μ μ λ©μλλ‘ μμ μμ μ μλ μμλ€μ κ°μ λ°°μ΄μ λ΄μ λ°νν΄μ€λ€. κ°λ€μ μ μΈλ μμλ‘ μ μ₯λλ€.
public class WeightTable{
public static void main(String []args) {
double earthWeight = Double.parseDouble("180");
double mass = earthWeight / Planet.EARTH.surfaceGravity();
// λͺ¨λ enum μμλ₯Ό νμν μ μλ€.
for(Planet p : Planet.values()) {
System.out.printf("%sμμμ 무κ²λ %fμ΄λ€.%n", p, p.surfaceWeight(mass));
}
}
}- toString λ©μλ : μμ μ΄λ¦μ λ¬Έμμ΄λ‘ λ°ννλ―λ‘ printlnκ³Ό printfλ‘ μΆλ ₯νκΈ° μ’μ
{% hint style="danger" %} μ΄κ±° νμ μμ μμλ₯Ό νλ μ κ±°νλ©΄ μ΄λ»κ² λμ§? {% endhint %}
μ κ±°ν μμλ₯Ό μ°Έμ‘°ν μ§ μλ ν΄λΌμ΄μΈνΈμλ μ무 μν₯μ΄ μλ€. WeightTable νλ‘κ·Έλ¨μμλΌλ©΄ λ¨μ§ μΆλ ₯νλ μ€ μκ° νλ μ€μ΄λ€ λΏμ΄λ€.
κ·Έλ λ€λ©΄ μ κ±°λ μμλ₯Ό μ°Έμ‘°νλ ν΄λΌμ΄μΈνΈλ μ΄λ»κ² λ κΉ?
ν΄λΌμ΄μΈνΈ νλ‘κ·Έλ¨μ λ€μ μ»΄νμΌνλ©΄ μ κ±°λ μμλ₯Ό μ°Έμ‘°νλ μ€μμ λλ²κΉ μ μ μ©ν λ©μμ§λ₯Ό λ΄μ μ»΄νμΌ μ€λ₯κ° λ°μν κ²μ΄λ€.
μ μ μ΄κ±° ν¨ν΄μμλ κΈ°λν μ μλ κ°μ₯ λ°λμ§ν λμ
ν΄λΌμ΄μΈνΈ μ½λ
public class OperationTest {
public static void main(String[] args) {
double x = 2.0;
double y = 4.0;
// κ° Operation μμμ apply λ©μλλ₯Ό νΈμΆνμ¬ κ²°κ³Ό μΆλ ₯
for (Operation op : Operation.values()) {
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
}
}
applyλ©μλκ°switchλ¬Έμ μ¬μ©νμ¬thisμ λ°λ₯Έ μ°μ°μ μννλ€.
// μ¬μΉ μ°μ°μ λνλ΄λ Operation μ΄κ±° νμ
(λΉκΆμ₯ λ°©μ)
public enum Operation {
PLUS, MINUS, TIMES, DIVIDE;
// κ° μμμ λ°λΌ λ€λ₯Έ λμμ μννκΈ° μν΄ switch λ¬Έμ μ¬μ©
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;
default:
throw new AssertionError("μ μ μλ μ°μ°: " + this);
}
}
}- λμμ νμ§λ§ λ§μ§λ§μ throw λ¬Έμ μ€μ λ‘λ λλ¬ν μΌ μ΄ μμ§λ§ κΈ°μ μ μΌλ‘λ λλ¬ν μ μκΈ° λλ¬Έμ μλ΅νλ©΄ μ»΄νμΌμ‘°μ°¨ λμ§ μλλ€.
- λ λμ μ μ κΉ¨μ§κΈ° μ¬μ΄ μ½λλΌλ μ¬μ€μ΄λ€.
- μλ‘μ΄ μμλ₯Ό μΆκ°νλ©΄ ν΄λΉ case λ¬Έλ μΆκ°ν΄μΌ νλ€. νΉμλΌλ κΉλΉ‘νλ€λ©΄, μ»΄νμΌ μ λμ§λ§ μλ‘ μΆκ°ν μ°μ°μ μννλ € ν λ
μ μ μλ μ°μ°μ΄λΌλ λ°νμ μ€λ₯λ₯Ό λ΄λ©° νλ‘κ·Έλ¨μ΄ μ’ λ£λλ€.
μ΄κ±° νμ μμ μμλ³λ‘ μλ‘ λ€λ₯Έ λμμ μ μνκ³ μΆμ λ, κ° μμλ§λ€ λ©μλλ₯Ό κ°λ³μ μΌλ‘ μ μν μ μλ€. μ΄λ₯Ό ν΅ν΄ κ° μμκ° μλ‘ λ€λ₯Έ κ³μ° λ°©μμ΄λ λ‘μ§μ κ°μ§ μ μλ€.
// μμλ³ λ©μλ ꡬνμ μ¬μ©ν μ¬μΉ μ°μ° Operation μ΄κ±° νμ
(κΆμ₯ λ°©μ)
public 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; }
};
// μΆμ λ©μλλ₯Ό μ μΈνμ¬ κ° μμλ³λ‘ κ°λ³μ μΌλ‘ ꡬν
public abstract double apply(double x, double y);
}- μμλ³ ν΄λμ€ λͺΈμ²΄: κ° μ΄κ±° μμ(
PLUS,MINUS,TIMES,DIVIDE)λapplyλ©μλλ₯Ό κ°λ³μ μΌλ‘ ꡬννλ€. - μ₯μ :
- μΆκ° μ μμ μ±: μ μ°μ°μ μΆκ°ν λ κ° μμλ³λ‘
applyμΆμλ©μλλ₯Ό μ¬μ μνμ§ μμΌλ©΄ μ»΄νμΌλ¬κ° κ²½κ³ λ₯Ό λμ, ꡬν λλ½μ λ°©μ§νλ€. - κ°κ²°νκ³ μ μ§λ³΄μκ° μ©μ΄: κ° μ°μ°μ λμμ΄ ν΄λΉ μμμ μ§μ μ μλμ΄ μμ΄ μ½λκ° λ μ§κ΄μ μ΄λ©° μ μ§λ³΄μμ μ©μ΄νλ€.
- μΆκ° μ μμ μ±: μ μ°μ°μ μΆκ°ν λ κ° μμλ³λ‘
- μ΄κ±° νμ
μμ μ μ: κ° μ°μ°(
PLUS,MINUS,TIMES,DIVIDE) μμλ κ°λ³applyλ©μλλ₯Ό ꡬννμ¬ μμλ³λ‘ λ€λ₯Έ μ°μ°μ μννλ€. symbolνλ: κ° μμμ λμλλ κΈ°νΈ(+,-,*,/)λ₯Ό μ μ₯νλsymbolνλλ₯Ό μ¬μ©νμ¬toStringλ©μλκ° ν΄λΉ κΈ°νΈλ₯Ό λ°ννλλ‘ μ€μ νλ€.fromStringλ©μλ: μ°μ° κΈ°νΈ(+,-,*,/)λ₯Ό μ΄μ©ν΄ μ μ νOperationμμλ₯Ό μ°Ύμ μ μλλ‘fromStringλ©μλλ₯Ό ꡬννλ€.operationλ©μλ: λ¬Έμμ΄ ννμ μ°μ°("3 * 5")μ λ°μ κΈ°νΈλ₯Ό κΈ°μ€μΌλ‘Operationμ μ°Ύμ μ°μ° κ²°κ³Όλ₯Ό λ°ννλ λ©μλμ΄λ€.
public enum Operation {
PLUS ("+") { // PLUS μμλ λ§μ
μ°μ°μ μν
@Override
public double apply(double x, double y) { return x + y; }
},
MINUS ("-") { // MINUS μμλ λΊμ
μ°μ°μ μν
@Override
public double apply(double x, double y) { return x - y; }
},
TIMES ("*") { // TIMES μμλ κ³±μ
μ°μ°μ μν
@Override
public double apply(double x, double y) { return x * y; }
},
DIVIDE ("/") { // 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); // μμλ³λ‘ ꡬννλ μΆμ λ©μλ
@Override
public String toString() {
return symbol;
}
// κΈ°νΈλ₯Ό ν΅ν΄ Operation μμλ₯Ό μ°ΎκΈ° μν΄ String -> Operation λ§€νμ μν Map μμ±
public static final Map<String, Operation> stringToEnum = Stream.of(values())
.collect(Collectors.toMap(Object::toString, e -> e));
// κΈ°νΈλ‘λΆν° Operationμ κ°μ Έμ€λ λ©μλ
public static Optional<Operation> fromString(String symbol) {
return Optional.ofNullable(stringToEnum.get(symbol));
}
@Test
public void operationApplyTest() {
double x = 10;
double y = 15;
for (Operation value : Operation.values()) {
System.out.printf("%f %s %f = %f%n", x, value, y, value.apply(x, y));
}
}
- μ΄κ±° μμλ³
applyλ©μλ ꡬν: κ° μμκ° κ³ μ ν λμμ κ°λλ‘applyλ₯Ό μ¬μ μνλ€. μλ₯Ό λ€μ΄PLUSλx + yλ₯Ό μννκ³ ,TIMESλx * yλ₯Ό μννλ€. symbolνλμtoStringμ¬μ μ: κΈ°νΈλ₯Ό λ΄λsymbolνλλ₯Ό ν΅ν΄toStringλ©μλλ₯Ό μ¬μ μνμ¬ κΈ°νΈκ° μΆλ ₯λλλ‘ νλ€.fromStringλ©μλ: λ¬Έμμ΄λ‘ λ°μ κΈ°νΈλ₯Ό ν΅ν΄ ν΄λΉνλOperationμμλ₯Ό μ°Ύμμ£Όλ λ©μλλ‘,Mapμ ν΅ν΄ κΈ°νΈμ μμλ₯Ό λΉ λ₯΄κ² λ§€ννμ¬ λ°ννλ€.
10.000000 + 15.000000 = 25.000000
10.000000 - 15.000000 = -5.000000
10.000000 * 15.000000 = 150.000000
10.000000 / 15.000000 = 0.666667
toString λ©μλ μ¬μ μ μ κ³ λ €ν΄μ€μΌ ν μ : fromString λ©μλλ ν¨κ» μ 곡
private static final Map<String, Operation> stringToEnum =
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
public static Optional<Operation> fromString(String symbol) {
return Optional.ofNullable(stringToEnum.get(symbol));
}- λ¬Έμμ΄λ‘λΆν° μ΄κ±° νμ
μμλ₯Ό μμ νκ² μ°ΎκΈ° μν΄
fromStringλ©μλλ₯Ό μΆκ°νμ¬ κΈ°νΈμ λ°λΌ μ΄κ±° νμ μμλ₯Ό λ§€ννλ€. Mapμ μ¬μ©νμ¬ λ¬Έμμ΄κ³Ό μ΄κ±° νμ μμλ₯Ό λ§€ννκ³ , μ£Όμ΄μ§ λ¬Έμμ΄μ ν΅ν΄ μ΄κ±° μμλ₯Ό μ°Ύλλ€.- fromString()μ λ§λ€μ΄λλ©΄ νΈλ¦¬νκ² λ€μ λ¬Έμμ΄μ enumμΌλ‘ λ³κ²½ν μ μλ€.
κ°κ° switchλ¬Έμ μ¬μ©ν λ°©λ²κ³Ό μ λ΅ ν¨ν΄μ νμ©ν λ°©λ²μΌλ‘, μ΄κ±° νμ
μμλ§λ€ λ€λ₯Έ λ‘μ§μ μ 곡νλ©΄μλ 곡ν΅λ μ½λλ₯Ό ν¨κ³Όμ μΌλ‘ 곡μ ν μ μλ€. κ° μ κ·Ό λ°©μμ μ₯λ¨μ μ λΉκ΅νμ¬ μ΄λ€ μν©μμ λ μ ν©νμ§ μμ보μ
첫 λ²μ§Έ λ°©μμ switch λ¬Έμ μ¬μ©νμ¬ μ£Όμ€κ³Ό μ£Όλ§μ ꡬλΆνλ PayrollDay μ΄κ±° νμ
μ΄λ€. switch λ¬Έμ ν΅ν΄ μμλ§λ€ λ€λ₯Έ λ‘μ§μ μ μ©νλ©΄μλ κΈ°λ³Έμ μΈ μ½λ νλ¦μ 곡μ ν μ μλ€.
μμ μ½λ
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;
}
}μΆλ ₯ κ²°κ³Ό
pay1 = 96000 // μ£Όμ€ κΈ°λ³Έ μκ°μ μκΈ
pay2 = 114000 // μ£Όμ€ μ΄κ³Ό 근무 μκΈ ν¬ν¨
pay3 = 144000 // μ£Όλ§ μκΈμ₯μ κ³Ό λ¨μ
- μ₯μ :
switchλ¬Έμ ν΅ν΄ μ½λλ₯Ό κ°κ²°νκ² μ μ§νλ©°, μ£Όμ€κ³Ό μ£Όλ§μ λ°λΌ λ€λ₯Έ μκΈμ κ³μ°νλ μ½λλ₯Ό μ½κ² ꡬνν μ μλ€. - λ¨μ : μλ‘μ΄ μμλ₯Ό μΆκ°ν λ
switchλ¬Έμμ μλ‘μ΄caseμ μ μΆκ°νλ κ²μ μμ μνμ΄ μλ€. μ΄λ¬ν μ½λ μ μ§λ³΄μμ 리μ€ν¬κ° μμΌλ©°, μ€μλ‘ λλ½λ κ²½μ°μλ λ°νμ μ€λ₯κ° λ°μν μ μλ€.
λ λ²μ§Έ λ°©μμ μ λ΅ ν¨ν΄μ νμ©νμ¬ PayrollDay μ΄κ±° νμ
μ μ£Όμ€κ³Ό μ£Όλ§μ μκΈ κ³μ° λ‘μ§μ λ³λλ‘ μ μνλ λ°©λ²μ΄λ€. PayTypeμ΄λΌλ μ€μ²© μ΄κ±° νμ
μ ν΅ν΄ WEEKDAYμ WEEKENDλ₯Ό μ μνκ³ , κ°κ° λ€λ₯Έ μ΄κ³Ό 근무 μκΈ κ³μ° λ°©μμ μ 곡νλ€.
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;
}
public int pay(int minutesWorked, int payRate) {
return payType.pay(minutesWorked, payRate);
}
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;
}
};
abstract int overtimePay(int minsWorked, int payRate);
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minsWorked, int payRate) {
int basePay = minsWorked * payRate;
return basePay + overtimePay(minsWorked, payRate);
}
}
}λμ λ°©μ
- μ£Όμ€κ³Ό μ£Όλ§μ μκΈ κ³μ° λ‘μ§μ λΆλ¦¬: μ£Όμ€ κ·Όλ¬΄(
WEEKDAY)μ μ£Όλ§ κ·Όλ¬΄(WEEKEND)μ μ΄κ³Ό 근무 κ³μ° λ°©μμ΄ μλ‘ λ€λ₯΄λ©°, κ° μμμ λ§λPayTypeμ ν λΉνμ¬ κ°κ° λ€λ₯Έ λμμ μννλ€. - μ½λ μ€ν:
PayrollDayμ κ° μμλ μ£Όμ΄μ§PayTypeμ ν΅ν΄ μ μ ν μ΄κ³Ό 근무 μκΈμ κ³μ°νλ€.
μ₯μ κ³Ό λ¨μ
- μ₯μ : μλ‘μ΄ μμκ° μΆκ°λ λ κ° μμκ°
PayTypeμ νμλ‘ μ§μ ν΄μΌ νλ―λ‘ μ€μλ‘ λΉ λ¨λ¦΄ μνμ΄ μ λ€. λλΆμ΄ κ° μμμ λ°λ₯Έ λ‘μ§μ μ λ΅ ν¨ν΄μΌλ‘ λΆλ¦¬ν¨μΌλ‘μ¨ μ½λλ₯Ό μ’ λ μ μ°νκ² κ΄λ¦¬ν μ μλ€. - λ¨μ :
switchλ¬Έμ λΉν΄ λ€μ 볡μ‘νμ§λ§, μ½λμ μμ μ±κ³Ό νμ₯μ±μ λμ΄λ λ° μ 리
| νλͺ© | switchλ¬Έμ μ΄μ©ν λ°©λ² |
μ λ΅ ν¨ν΄μ μ¬μ©ν λ°©λ² |
|---|---|---|
| μ½λ κ°κ²°μ± | μλμ μΌλ‘ κ°κ²°ν¨ | μ½λκ° λ€μ 볡μ‘ν΄μ§ |
| μμ μ± | μλ‘μ΄ μμ μΆκ° μ λλ½ν κ°λ₯μ±μ΄ μμ | μλ‘μ΄ μμ μΆκ° μ νμ μ λ ₯κ°μ΄ μμ΄ μμ ν¨ |
| νμ₯μ± | μ νμ μ΄λ©°, λ³κ²½μ μ·¨μ½ν¨ | μ λ΅ ν¨ν΄μ νμ©νμ¬ μ μ°νκ² νμ₯ κ°λ₯ |
| μ μ§λ³΄μ | λ‘μ§ μ€λ³΅μ΄ λ°μν κ°λ₯μ±μ΄ μμ | κ° μμμ λ‘μ§μ ν κ³³μμ κ΄λ¦¬ν μ μμ |
switchλ¬Έ: κ°λ¨νκ² μμ±ν μ μμ§λ§, μ΄κ±° νμ μμλ³ λμμ μΌκ΄μ μΌλ‘ μμ ν λ λΆνΈνλ©°, μ μ§λ³΄μκ° μ΄λ ΅κ³ μ€μκ° λ°μν μ¬μ§κ° μλ€.- μ λ΅ μμ ν¨ν΄: μ΄κ±° νμ λ΄λΆμμ μ λ΅ ν¨ν΄μ νμ©νμ¬ μμλ³λ‘ λ€λ₯Έ λ‘μ§μ μμ νκ² κ΄λ¦¬ν μ μλ€. μ΄ λ°©λ²μ νΉν μ½λμ νμ₯μ±κ³Ό μμ μ±μ μ€μν λ μ μ©νλ€.
νμν μμλ₯Ό μ»΄νμΌνμμ λ€ μ μ μλ μμ μ§ν©μ΄λΌλ©΄ μ΄κ±° νμ μ μ¬μ©νμ.
- ex) νμκ³ νμ±, ν μ£Όμ μμΌ, μ²΄μ€ λ§
- ex) λ©λ΄ μμ΄ν , μ°μ° μ½λ, λͺ λ Ήμ€ νλκ·Έ
μ΄κ±° νμ μ νμ€ν μ μ μμλ³΄λ€ ν¨μ¨μ΄λ€. μ½κΈ°λ μ½κ³ κ°λ ₯νλ€. λ¬Όλ‘ λ©μλλ μΈ μ μλ€. νμν μμλ₯Ό μ»΄νμΌ νμμ λͺ¨λ λ€ μ μ μλ μμμ μ§ν©μ΄λΌλ©΄ μ΄κ±° νμ μ κ°λ ₯ν μΆμ²νλ€. λ°μ΄λ리 μμ€μμ νΈνλλλ‘ μ€κ³λμκΈ° λλ¬Έμ μ΄κ±° νμ μ μ μλ μμ κ°μκ° μμν κ³ μ λΆλ³μΌ νμλ μλ€.
- λλ€μ μ΄κ±° νμ
μ λͺ
μμ μμ±μλ λ©μλ μμ΄ μ°μ΄μ§λ§, κ° μμλ₯Ό νΉμ λ°μ΄ν°μ μ°κ²°μ§κ±°λ μμλ§λ€ λ€λ₯΄κ² λμν λλ νμνλ€.
- μ΄ κ²½μ°, 보ν΅μ μΆμ λ©μλλ₯Ό μ μΈν λ€,
switchλ¬Έ λμ μμλ³ λ©μλ ꡬνμ΄ λ«λ€. - μ΄κ±° νμ μμκ° κ°μ μ½λλ₯Ό 곡μ νλ€λ©΄, μ λ΅ μ΄κ±° νμ ν¨ν΄μ μ¬μ©νμ.
- μ΄ κ²½μ°, 보ν΅μ μΆμ λ©μλλ₯Ό μ μΈν λ€,
μΆμ²
.png)