πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

int μƒμˆ˜ λŒ€μ‹  μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ34)] - (1)

Amenable 2023. 7. 1. 11:19

  μžλ°”λ₯Ό μ΄μš©ν•˜μ—¬ 코딩을 ν•˜λ‹€ 보면 μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄(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λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.