μλ°λ₯Ό μ΄μ©νμ¬ μ½λ©μ νλ€ λ³΄λ©΄ μ μ μ΄κ±° ν¨ν΄(int enum pattern)κ³Ό μ΄κ±° νμ (enum type)μ μ¬μ©ν΄ λ³Έ μ μ΄ μμ κ²μ΄λ€.
μ΄λ² κΈμμλ μ μ μ΄κ±° ν¨ν΄μ λ¨μ λ€μ μ΄ν΄λ³΄κ³ , μ μ΄κ±° νμ μ μ¬μ©ν΄μΌ νλμ§ μμλ³΄κ³ μ νλ€. κ·Έλ¦¬κ³ κΈ°λ³Έμ μΈ μ΄κ±° νμ μ μ¬μ©λ²λ μμλ³Ό κ²μ΄λ€.
π 1. μ μ μ΄κ±° ν¨ν΄ (int enum pattern)
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;
μλ°μμ μ΄κ±° νμ μ μ§μνκΈ° μ μλ μμ μ½λμ²λΌ μ μ μμλ₯Ό ν λ¬Άμ μ μΈν΄μ μ¬μ©νκ³€ νμλ€. νμ§λ§, μ΄ λ°©λ²μλ λ¨μ μ΄ λ§€μ° λ§λ€.
β 1. νμ μμ μ 보μ₯ν λ°©λ²μ΄ μλ€.
μ¬κ³Όλ₯Ό νλΌλ―Έν°λ‘ λ°μμΌ νλ λ©μλκ° μλ€κ³ νμ. κ·Έλ¬λ μ¬κ³Όλ₯Ό λ°μμΌ νλ λ©μλμμλ λΆκ΅¬νκ³ μ€λ μ§λ₯Ό λ°λλ€κ³ ν΄μ μ»΄νμΌλ¬κ° κ²½κ³ λ₯Ό μΆλ ₯ν΄μ£Όμ§λ μλλ€.
β 2. ννλ ₯μ΄ μ’μ§ μλ€.
μ¬κ³Όμ© μμμ μ΄λ¦μ λͺ¨λ APPLE_λ‘ μμνκ³ , μ€λ μ§μ© μμλ ORANGE_λ‘ μμνλ€.
μλ°κ° μ μ μ΄κ±° ν¨ν΄μ μν λ³λ μ΄λ¦κ³΅κ°(namespace)μ μ§μνμ§ μκΈ° λλ¬Έμ μ΄μ© μ μμ΄ μ λμ΄λ₯Ό μ¨μ μ΄λ¦ μΆ©λμ λ°©μ§ν κ²μ΄λ€.
μλ₯Ό λ€μ΄, μμ΄λ‘λ λ λ€ mercuryμΈ μμ(μμ)κ³Ό μμ±(νμ±)μ μ΄λ¦μ κ°κ° ELEMENT_MERCYRμ PLANT_MERCURYλ‘ μ§μ΄ ꡬλΆνλ κ²μ΄λ€.
β 3. μ μ μ΄κ±° ν¨ν΄μ μ¬μ©ν νλ‘κ·Έλ¨μ κΉ¨μ§κΈ° μ½λ€.
μ μ μ΄κ±° ν¨ν΄μ νλ²ν μμλ₯Ό λμ΄ν κ²λΏμ΄λΌ μ»΄νμΌνλ©΄ κ·Έ κ°μ΄ ν΄λΌμ΄μΈνΈ νμΌμ κ·Έλλ‘ μ겨μ§λ€.
λ°λΌμ μμμ κ°μ΄ λ°λλ©΄ ν΄λΌμ΄μΈνΈλ λ°λμ λ€μ μ»΄νμΌν΄μΌ νλ€. λ€μ μ»΄νμΌνμ§ μλλΌλ μ€νμ΄ λκ² μ§λ§ μλ±ν λμμ ν κ²μ΄λ€.
β 4. μ μ μμλ λ¬Έμμ΄λ‘ μΆλ ₯νκΈ°κ° λ€μ κΉλ€λ‘λ€.
public static void main(String[] args) {
System.out.println(APPLE_FUJI); // 0
System.out.println(APPLE_PIPPIN); // 1
System.out.println(APPLE_GRANNY_SMITH); // 2
}
μ μ μμλ₯Ό μΆλ ₯νλ©΄ κ·Έ κ°μ μΆλ ₯νλ€. λν, λλ²κ±°λ‘ μ΄ν΄λ³΄λ©΄ λ¨μ§ μ«μλ‘λ§ λ³΄μ¬μ μ© λμμ΄ λμ§ μλλ€.
β 5. κ°μ μ μ μ΄κ±° κ·Έλ£Ήμ μν λͺ¨λ μμλ₯Ό ν λ°ν΄ μννλ λ°©λ²λ λ§λ μΉ μλ€.
κ°μ μ μ μ΄κ±° κ·Έλ£Ήμ μν λͺ¨λ μμλ₯Ό μ»μ μ μμλΏλλ¬ κ·Έ μμ μμκ° λͺ κ°μΈμ§λ μ μ μλ€.
π 2. μ΄κ±° νμ (enum type)
μλ°μμλ μ΄κ±° ν¨ν΄μ λ¨μ μ λ§λν μ»μ΄μ£Όλ λμμ μ¬λ¬ μ₯μ μ μ겨주λ λμμ μ μνμλ€. λ°λ‘ μ΄κ±° νμ μ΄λ€.
public enum Apple {
FUJI, PIPPIN, GRANNY_SMITH
}
public enum Orange {
NAVEL, TEMPLE, BLOOD
}
μ΄κ±° νμ μ체λ ν΄λμ€μ΄λ©°, μμ νλλΉ μμ μ μΈμ€ν΄μ€λ₯Ό νλμ© λ§λ€μ΄ public static final νλλ‘ κ³΅κ°νλ€.
μ΄κ±° νμ μ λ°μμ μ κ·Όν μ μλ μμ±μλ₯Ό μ 곡νμ§ μμΌλ―λ‘ μ¬μ€μ finalμ΄λ€.
λ°λΌμ ν΄λΌμ΄μΈνΈκ° μΈμ€ν΄μ€λ₯Ό μ§μ μμ±νκ±°λ νμ₯ν μ μμΌλ μ΄κ±° νμ μ μΈμΌλ‘ λ§λ€μ΄μ§ μΈμ€ν΄μ€λ€μ λ± νλμ©λ§ μ‘΄μ¬ν¨μ΄ 보μ₯λλ€.
μμμ μ΄ν΄λ³Έ μ΄κ±° ν¨ν΄μ 5κ°μ§ λ¨μ μ μ΄κ±° νμ μ΄ μ΄λ»κ² ν΄μνλμ§ μ΄ν΄λ³΄μ.
β 1. μ΄κ±° νμ μ μ»΄νμΌνμ νμ μμ μ±μ μ 곡νλ€.
public static void main(String[] args) {
appleMethod(Apple.FUJI); // μ±κ³΅
appleMethod(Orange.NAVEL); // μ»΄νμΌ μ€λ₯
}
public static void appleMethod(Apple apple) {
...
}
Apple μ΄κ±° νμ μ 맀κ°λ³μλ‘ λ°λ appleMethodλ₯Ό μ μΈνμλ€. λ§μ½ Appleμ΄ μλ λ€λ₯Έ νμ μ κ°μ λκΈ°κ² λλ©΄ μ»΄νμΌ μ€λ₯κ° λλ€.
β 2. μ΄κ±° νμ μλ κ°μμ μ΄λ¦κ³΅κ°μ΄ μμ΄μ μ΄λ¦μ΄ κ°μ μμλ ννλ‘κ² κ³΅μ‘΄νλ€.
μ΄λ¦μ΄ κ°μ μμ(MERCURY)κ³Ό μμ±(MERCURY)μ κ°μμ μ΄λ¦ 곡κ°μμ κ°μ μ΄λ¦(MERCURY)μΌλ‘ μ¬μ©ν μ μλ€.
public enum Element {
MERCURY // μμ
}
public enum Planet {
MERCURY // μμ±
}
β 3. μ΄κ±° νμ μ μλ‘μ΄ μμλ₯Ό μΆκ°νκ±°λ μμλ₯Ό λ°κΏλ λ€μ μ»΄νμΌνμ§ μμλ λλ€.
곡κ°λλ κ²μ΄ μ€μ§ νλμ μ΄λ¦λΏμ΄λΌ, μ μ μ΄κ±° ν¨ν΄κ³Ό λ¬λ¦¬ μμ κ°μ΄ ν΄λΌμ΄μΈνΈλ‘ μ»΄νμΌλμ΄ κ°μΈλμ§ μκΈ° λλ¬Έμ΄λ€.
β 4. μ΄κ±° νμ μ toString λ©μλλ μΆλ ₯νκΈ°μ μ ν©ν λ¬Έμμ΄μ λ΄μ΄μ€λ€.
μ΄κ±° νμ μ toString λ©μλλ₯Ό μ΄μ©νμ¬ μΆλ ₯νλ©΄ λ€μκ³Ό κ°λ€.
public static void main(String[] args) {
System.out.println(Apple.FUJI); // FUJI
System.out.println(Apple.PIPPIN); // PIPPIN
System.out.println(Apple.GRANNY_SMITH); // GRANNY_SMITH
}
λν, toStringμ μ¬μ μνμ¬ λ μ ν©ν λ¬Έμμ΄μ λ΄μ΄μ€ μλ μλ€.
β 5. μ΄κ±° νμ μ μμ μμ μ μλ μμλ€μ κ°μ λ°°μ΄μ λ΄μ λ°ννλ μ μ λ©μλμΈ valuesλ₯Ό μ 곡νλ€.
μ΄κ±° νμ μ values λ©μλλ₯Ό μ΄μ©νμ¬ μμ μ κ·Έλ£Ήμ μνλ μμλ€μ ν λ°ν΄ μνν μ μλ€.
public static void main(String[] args) {
for(Apple apple : Apple.values()) {
System.out.println(apple);
}
}
π 3. μ΄κ±° νμ κΈ°λ³Έ μ¬μ©λ²
μ΄κ±° νμ μ μ μ μ΄κ±° ν¨ν΄μ λ¨μ μ ν΄μν΄ μ€ λΏλ§ μλλΌ λ λ€μν κΈ°λ₯μ μ 곡νλ€.
μ΄κ±° νμ μ μλμ κ°μ΄ μμμ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ€.
public enum Apple implements Comparable<Apple> {
FUJI,
PIPPIN,
GRANNY_SMITH
}
λν, μ΄κ±° νμ μλ μμμ λ©μλλ νλλ₯Ό μΆκ°ν μ μλ€. μμλ‘ νμκ³μ μ¬λ νμ±μ κ°μ§λ μ΄κ±° νμ μ΄ μλ€κ³ νμ.
public enum Planet {
MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE
}
κ° νμ±μλ μ§λκ³Ό λ°μ§λ¦μ΄ μκ³ , μ΄ λ μμ±μ μ΄μ©ν΄ νλ©΄μ€λ ₯μ κ³μ°ν μ μλ€. λ°λΌμ μ΄λ€ κ°μ²΄μ μ§λμ΄ μ£Όμ΄μ§λ©΄ κ·Έ κ°μ²΄κ° ν΄μ± νλ©΄μ μμ λμ 무κ²λ κ³μ°ν μ μλ€.
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.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.67300E-11;
// μμ±μ
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
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
}
}
κ° μ΄κ±° νμ μμ μ€λ₯Έμͺ½ κ΄νΈ μ μ«μλ μμ±μμ λ겨μ§λ 맀κ°λ³μλ‘, μ΄ μμμλ νμ±μ μ§λκ³Ό λ°μ§λ¦μ λ»νλ€.
μ΄κ±° νμ μμ κ°κ°μ νΉμ λ°μ΄ν°μ μ°κ²° μ§μΌλ €λ©΄ μμ±μμμ λ°μ΄ν°λ₯Ό λ°μ μΈμ€ν΄μ€ νλμ μ μ₯νλ©΄ λλ€.
surfaceWeight λ©μλλ λμ κ°μ²΄μ μ§λμ μ λ ₯λ°μ, κ·Έ κ°μ²΄κ° νμ± νλ©΄μ μμ λμ 무κ²λ₯Ό λ°ννλ€.
μ΄λ€ κ°μ²΄μ μ§κ΅¬μμμ 무κ²λ₯Ό μ λ ₯λ°μ μ¬λ νμ±μμμ 무κ²λ₯Ό μΆλ ₯νλ μΌμ λ€μκ³Ό κ°μ΄ μμ±ν μ μλ€.
public static void main(String[] args) {
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("%sμμμ 무κ²λ %fμ΄λ€.\n",
p, p.surfaceWeight(mass));
}
μ΄μμΌλ‘ 'μ μ μ΄κ±° ν¨ν΄ λμ μ μ΄κ±° νμ μ μ¬μ©ν΄μΌ νλμ§'μ 'μ΄κ±° νμ μ κΈ°λ³Έ μ¬μ©λ²'μ λν΄μ μμ보μλ€.
λ€μ κΈμ ν΅ν΄μ μ΄κ±° νμ μμ μ 곡νλ λ λ€μν κΈ°λ₯λ€μ λν΄μ μμ보μ.
ν΄λΉ κΈμ Joshua Bloch λμ Effective Java 3/Eλ₯Ό μ°Έκ³ νμμ΅λλ€.