Skip to content

Latest commit

Β 

History

History
533 lines (386 loc) Β· 25.2 KB

File metadata and controls

533 lines (386 loc) Β· 25.2 KB

item 34 : int μƒμˆ˜ λŒ€μ‹  μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ

1. int μƒμˆ˜ νŒ¨ν„΄, λ¬Έμžμ—΄ μƒμˆ˜ νŒ¨ν„΄ κ°œλ…κ³Ό 문제점(int enum pattern)

μ—΄κ±° νƒ€μž…μ€ 일정 개수의 μƒμˆ˜ 값을 μ •μ˜ν•œ λ‹€μŒ, κ·Έ μ™Έμ˜ 값은 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” νƒ€μž…μ΄λ‹€.

1) 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;
  1. νƒ€μž… μ•ˆμ „μ„ 보μž₯ν•  방법이 μ—†μœΌλ©° ν‘œν˜„λ ₯도 μ’‹μ§€ μ•Šλ‹€.

μ˜€λ Œμ§€λ₯Ό 건넀야 ν•  λ©”μ„œλ“œμ— 사과λ₯Ό 보내 κ³  동등 μ—°μ‚°μž(=)둜 λΉ„κ΅ν•˜λ”λΌλ„ μ»΄νŒŒμΌλŸ¬λŠ” μ•„λ¬΄λŸ° κ²½κ³  λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

// ν–₯κΈ‹ν•œ μ˜€λ Œμ§€ ν–₯의 사과 μ†ŒμŠ€!
int i = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN;
  1. μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ„ μœ„ν•œ 별도 이름곡간(namespace)을 지원 ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ‚¬κ³Όμš© μƒμˆ˜μ˜ 이름은 λͺ¨λ‘ APPLE_둜 μ‹œμž‘ν•˜κ³ , μ˜€λ Œμ§€μš© μƒμˆ˜λŠ” ORANGE_둜 μ‹œμž‘ν•œλ‹€. μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ„ μœ„ν•œ 별도 이름곡간을 μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ–΄μ©” 수 없이 접두어λ₯Ό μ¨μ„œ 이름 μΆ©λŒμ„ ν•˜λŠ” 것이닀.

  1. μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ„ μ‚¬μš©ν•œ ν”„λ‘œκ·Έλž¨μ€ κΉ¨μ§€κΈ° 쉽닀.

ν‰λ²”ν•œ μƒμˆ˜λ₯Ό λ‚˜μ—΄ν•œκ²ƒ 뿐이라 μ»΄νŒŒμΌν•˜λ©΄ κ·Έ 값이 ν΄λΌμ΄μ–ΈνŠΈ νŒŒμΌμ— κ·ΈλŒ€λ‘œ μƒˆκ²¨μ§„λ‹€.

λ”°λΌμ„œ μƒμˆ˜μ˜ 값이 λ°”λ€Œλ©΄ ν΄λΌμ΄μ–ΈνŠΈλ„ λ°˜λ“œμ‹œ λ‹€μ‹œ μ»΄νŒŒμΌν•΄μ•Ό ν•œλ‹€.

  1. μ •μˆ˜ μƒμˆ˜λŠ” λ¬Έμžμ—΄λ‘œ 좜λ ₯ν•˜κΈ° κΉŒλ‹€λ‘­λ‹€.

값을 좜λ ₯ν•˜κ±°λ‚˜ λ””λ²„κ±°λ‘œ μ‚΄νŽ΄λ³΄λ©΄ (μ˜λ―Έκ°€ μ•„λ‹Œ) 단지 숫자둜만 λ³΄μ—¬μ„œ 썩 도움이 λ˜μ§€ μ•ŠλŠ”λ‹€. 같은 μ •μˆ˜ μ—΄κ±° 그룹에 μ†ν•œ λͺ¨λ“  μƒμˆ˜λ₯Ό ν•œ 바퀴 μˆœνšŒν•˜λŠ” 방법도 λ§ˆλ•…μΉ˜ μ•Šλ‹€. 심지어 κ·Έ μ•ˆμ— μƒμˆ˜κ°€ λͺ‡ κ°œμΈμ§€λ„ μ•Œ 수 μ—†λ‹€.

2) λ¬Έμžμ—΄ μ—΄κ±° νŒ¨ν„΄ (string enum pattern)

μ •μˆ˜ λŒ€μ‹  λ¬Έμžμ—΄ μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ³€ν˜• νŒ¨ν„΄λ„ μžˆλŠ”λ° 더 μ•ˆμ’‹λ‹€. 수의 의미λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€λŠ” 점은 μ’‹μ§€λ§Œ, κ²½ν—˜μ΄ λΆ€μ‘±ν•œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ¬Έμžμ—΄ μƒμˆ˜μ˜ 이름 λŒ€μ‹  λ¬Έμžμ—΄ 값을 κ·ΈλŒ€λ‘œ ν•˜λ“œμ½”λ”©ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ΄λ‹€.

μ΄λ ‡κ²Œ ν•˜λ“œμ½”λ”©ν•œ λ¬Έμžμ—΄ 에 μ˜€νƒ€κ°€ μžˆμ–΄λ„ μ»΄νŒŒμΌλŸ¬λŠ” 확인할 길이 μ—†μœΌλ‹ˆ μžμ—°μŠ€λŸ½κ²Œ λŸ°νƒ€μž„ 버그가 생긴닀. λ¬Έμžμ—΄ 비ꡐ에 λ”°λ₯Έ μ„±λŠ₯ μ €ν•˜ μ—­μ‹œ λ‹Ήμ—°ν•œ κ²°κ³Όλ‹€.

2. μžλ°” μ—΄κ±° νƒ€μž…(enum type)

μ—΄κ±° νŒ¨ν„΄λ“€μ˜ 단점을 λ§λ”νžˆ μ”»μ–΄μ£ΌλŠ” λ™μ‹œμ— μ—¬λŸ¬ μž₯점을 μ•ˆκ²¨μ£ΌλŠ” λŒ€μ•ˆ

1) μžλ°” μ—΄κ±° νƒ€μž…(enum type)

public enum Apple { FUJI, PIPPIN, GRANNY_SMITH } 
public enum Orange { NAVEL, TEMPLE, BLOOD }

{% hint style="success" %} μžλ°”μ˜ μ—΄κ±° νƒ€μž…μ€ μ™„μ „ν•œ ν˜•νƒœμ˜ ν΄λž˜μŠ€λΌμ„œ (λ‹¨μˆœν•œ μ •μˆ« 값일 뿐인) λ‹€λ₯Έ μ–Έμ–΄μ˜ μ—΄κ±° νƒ€μž…λ³΄λ‹€ 훨씬 κ°•λ ₯ν•˜λ‹€. {% endhint %}

2) μ—΄κ±° νƒ€μž…μ˜ 아이디어

μ—΄κ±° νƒ€μž… μžμ²΄λŠ” 클래슀이며, μƒμˆ˜ ν•˜λ‚˜λ‹Ή μžμ‹ μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜μ”© λ§Œλ“€μ–΄ public static final ν•„λ“œλ‘œ κ³΅κ°œν•œλ‹€.

  • μ—΄κ±° νƒ€μž…μ€ λ°–μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” μƒμ„±μžλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 사싀상 final이닀.
  • μΈμŠ€ν„΄μŠ€κ°€ ν†΅μ œλœλ‹€. μΈμŠ€ν„΄μŠ€λ“€μ€ 였직 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•œλ‹€.
  • μ›μ†Œκ°€ ν•˜λ‚˜μ΄λ©΄ μ‹±κΈ€ν„΄μœΌλ‘œ λ³Ό 수 μžˆλ‹€. 싱글턴은 μ›μ„œκ°€ ν•˜λ‚˜λΏμΈ μ—΄κ±° νƒ€μž…μ΄λΌκ³  ν•  수 있고, 거꾸둜 μ—΄κ±° νƒ€μž…μ€ 싱글턴을 μΌλ°˜ν™”ν•œ ν˜•νƒœλΌκ³  ν•  수 μžˆλ‹€.

μ—΄κ±° νƒ€μž…μ€ μ»΄νŒŒμΌνƒ€μž„ νƒ€μž… μ•ˆμ „μ„±μ„ μ œκ³΅ν•œλ‹€.

  • μ΄μ „μ˜ int μƒμˆ˜ νŒ¨ν„΄μ²˜λŸΌ ORANGEκ°€ 갈 곳에 APPLE이 κ°„λ‹€λ©΄, λͺ…ν™•νžˆ νƒ€μž… μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
  • νƒ€μž…μ΄ λ‹€λ₯Έ μ—΄κ±° νƒ€μž… λ³€μˆ˜μ— ν• λ‹Ήν•˜λ € ν•˜κ±°λ‚˜ λ‹€λ₯Έ μ—΄κ±° νƒ€μž…μ˜ 값끼리 == μ—°μ‚°μžλ‘œ λΉ„κ΅ν•˜λ €λŠ” 꼴이기 λ•Œλ¬Έμ΄λ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜μ—¬, 이름이 같은 μƒμˆ˜λ„ ν‰ν™”λ‘­κ²Œ 곡쑴할 수 μžˆλ‹€.

  • APPLE.RED와 ORANGE.REDλŠ” κ΅¬λΆ„λœλ‹€.

toString()이 좜λ ₯ν•˜κΈ°μ— μ ν•©ν•œ λ¬Έμžμ—΄μ„ λ‚΄μ–΄μ€€λ‹€.

μ—΄κ±° νƒ€μž…μ—λŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ„ μΆ”κ°€ κ°€λŠ₯ν•˜λ‹€.

  • μΆ”κ°€λ‘œ μž„μ˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ„ κ΅¬ν˜„ν•˜κ²Œ ν•  수 μžˆλ‹€.
  • κ³΅κ°œλ˜λŠ” 것이 였직 ν•„λ“œμ˜ 이름뿐이라, μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄κ³Ό 달리 μƒμˆ˜ 값이 ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ»΄νŒŒμΌλ˜μ–΄ κ°μΈλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€

3) μ˜ˆμ‹œ

  • νƒœμ–‘κ³„μ˜ μ—¬λž 행성에 λŒ€ν•œ μ—΄κ±° νƒ€μž…μ„ λ§Œλ“œλŠ” 것도 그리 μ–΄λ ΅μ§€ μ•Šλ‹€.
  • 각 행성에 λŠ” μ§ˆλŸ‰κ³Ό λ°˜μ§€λ¦„μ΄ 있고, 이 두 속성을 μ΄μš©ν•΄ ν‘œλ©΄μ€‘λ ₯을 계산할 수 μžˆλ‹€. λ”° λΌμ„œ μ–΄λ–€ 객체의 μ§ˆλŸ‰μ΄ μ£Όμ–΄μ§€λ©΄ κ·Έ 객체가 ν–‰μ„± ν‘œλ©΄μ— μžˆμ„ λ•Œμ˜ λ¬΄κ²Œλ„ 계산할 수 μžˆλ‹€.
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 값을 μ „λ‹¬ν•˜λ©΄, 이 값듀이 μƒμ„±μžμ— μ˜ν•΄ μΈμŠ€ν„΄μŠ€ ν•„λ“œμ— μ €μž₯λœλ‹€. 이λ₯Ό 톡해 각 μƒμˆ˜λŠ” μžμ‹ λ§Œμ˜ κ³ μœ ν•œ 데이터λ₯Ό κ°€μ§€κ²Œ λœλ‹€.

2. λΆˆλ³€μ„±κ³Ό ν•„λ“œ μ„ μ–Έ

μ—΄κ±° νƒ€μž…μ€ λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. 즉, ν•œ 번 μƒμ„±λœ μ—΄κ±° νƒ€μž… μƒμˆ˜μ˜ λ°μ΄ν„°λŠ” μˆ˜μ •ν•  수 μ—†μ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ λͺ¨λ“  ν•„λ“œλŠ” final둜 μ„ μ–Έλœλ‹€.

private final double mass; // μ§ˆλŸ‰
private final double radius; // λ°˜μ§€λ¦„
private final double surfaceGravity; // ν‘œλ©΄ 쀑λ ₯

μ΄λ ‡κ²Œ ν•„λ“œλ₯Ό final둜 μ„ μ–Έν•˜λ©΄ μ΄ˆκΈ°ν™”λœ ν›„ 변경이 λΆˆκ°€λŠ₯ν•˜λ‹€.

μ—΄κ±° νƒ€μž…μΈ Planet은 각 ν–‰μ„±μ˜ mass, radius, surfaceGravity 값을 생성 μ‹œμ μ—λ§Œ μ„€μ •ν•˜κ³  μ΄ν›„μ—λŠ” λ³€κ²½ν•  수 μ—†λ‹€.

3. μ ‘κ·Όμž λ©”μ„œλ“œμ˜ μ‚¬μš©

비둝 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()와 같은 μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ 값을 얻을 수 μžˆλ„λ‘ ν•˜μ—¬ μ•ˆμ „ν•˜κ³  μΌκ΄€λœ λ°©μ‹μœΌλ‘œ ν•„λ“œμ— μ ‘κ·Όν•˜κ²Œ λœλ‹€.

4) enum.value()

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 ν”„λ‘œκ·Έλž¨μ—μ„œλΌλ©΄ 단지 좜λ ₯ν•˜λŠ” 쀄 μˆ˜κ°€ ν•˜λ‚˜ 쀄어듀 뿐이닀.

κ·Έλ ‡λ‹€λ©΄ 제거된 μƒμˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” μ–΄λ–»κ²Œ 될까?

ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨μ„ λ‹€μ‹œ μ»΄νŒŒμΌν•˜λ©΄ 제 거된 μƒμˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ€„μ—μ„œ 디버깅에 μœ μš©ν•œ λ©”μ‹œμ§€λ₯Ό 담은 컴파일 였λ₯˜κ°€ λ°œμƒν•  것이닀.

μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ—μ„œλŠ” κΈ°λŒ€ν•  수 μ—†λŠ” κ°€μž₯ λ°”λžŒμ§ν•œ λŒ€μ‘

3. μ—΄κ±°νƒ€μž… μƒμˆ˜λ§ˆλ‹€ λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” λ©”μ„œλ“œ ꡬ성

ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ

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));
        }
    }
}

1) switch 문을 μ‚¬μš©ν•˜μ—¬ μ—΄κ±° μƒμˆ˜λ³„ λ™μž‘ κ΅¬ν˜„(bad)

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 문도 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. ν˜Ήμ‹œλΌλ„ κΉœλΉ‘ν•œλ‹€λ©΄, 컴파일 은 λ˜μ§€λ§Œ μƒˆλ‘œ μΆ”κ°€ν•œ 연산을 μˆ˜ν–‰ν•˜λ € ν•  λ•Œ μ•Œ 수 μ—†λŠ” μ—°μ‚°μ΄λΌλŠ” λŸ°νƒ€μž„ 였λ₯˜λ₯Ό λ‚΄λ©° ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœλ‹€.

2) switch 단점 κ°œμ„ : μƒμˆ˜λ³„ λ©”μ„œλ“œ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜μ—¬ λ™μž‘ μ •μ˜

μ—΄κ±° νƒ€μž…μ—μ„œ μƒμˆ˜λ³„λ‘œ μ„œλ‘œ λ‹€λ₯Έ λ™μž‘μ„ μ •μ˜ν•˜κ³  싢을 λ•Œ, 각 μƒμˆ˜λ§ˆλ‹€ λ©”μ„œλ“œλ₯Ό κ°œλ³„μ μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 각 μƒμˆ˜κ°€ μ„œλ‘œ λ‹€λ₯Έ 계산 λ°©μ‹μ΄λ‚˜ λ‘œμ§μ„ κ°€μ§ˆ 수 μžˆλ‹€.

// μƒμˆ˜λ³„ λ©”μ„œλ“œ κ΅¬ν˜„μ„ μ‚¬μš©ν•œ 사칙 μ—°μ‚° 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);
}
  1. μƒμˆ˜λ³„ 클래슀 λͺΈμ²΄: 각 μ—΄κ±° μƒμˆ˜(PLUS, MINUS, TIMES, DIVIDE)λŠ” apply λ©”μ„œλ“œλ₯Ό κ°œλ³„μ μœΌλ‘œ κ΅¬ν˜„ν•œλ‹€.
  2. μž₯점:
    • μΆ”κ°€ μ‹œ μ•ˆμ „μ„±: μƒˆ 연산을 μΆ”κ°€ν•  λ•Œ 각 μƒμˆ˜λ³„λ‘œ apply μΆ”μƒλ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ κ²½κ³ λ₯Ό λ„μ›Œ, κ΅¬ν˜„ λˆ„λ½μ„ λ°©μ§€ν•œλ‹€.
    • κ°„κ²°ν•˜κ³  μœ μ§€λ³΄μˆ˜κ°€ 용이: 각 μ—°μ‚°μ˜ λ™μž‘μ΄ ν•΄λ‹Ή μƒμˆ˜μ— 직접 μ •μ˜λ˜μ–΄ μžˆμ–΄ μ½”λ“œκ°€ 더 직관적이며 μœ μ§€λ³΄μˆ˜μ— μš©μ΄ν•˜λ‹€.

3) μƒμ„±μž 이용 및 곡톡 λ©”μ„œλ“œ μž¬μ •μ˜

  1. μ—΄κ±° νƒ€μž… μƒμˆ˜ μ •μ˜: 각 μ—°μ‚°(PLUS, MINUS, TIMES, DIVIDE) μƒμˆ˜λŠ” κ°œλ³„ apply λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ μƒμˆ˜λ³„λ‘œ λ‹€λ₯Έ 연산을 μˆ˜ν–‰ν•œλ‹€.
  2. symbol ν•„λ“œ: 각 μƒμˆ˜μ— λŒ€μ‘λ˜λŠ” 기호(+, -, *, /)λ₯Ό μ €μž₯ν•˜λŠ” symbol ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ toString λ©”μ„œλ“œκ°€ ν•΄λ‹Ή 기호λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ„€μ •ν•œλ‹€.
  3. fromString λ©”μ„œλ“œ: μ—°μ‚° 기호(+, -, *, /)λ₯Ό μ΄μš©ν•΄ μ μ ˆν•œ Operation μƒμˆ˜λ₯Ό 찾을 수 μžˆλ„λ‘ fromString λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€.
  4. 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으둜 λ³€κ²½ν•  수 μžˆλ‹€.

4. μ—΄κ±°νƒ€μž… μƒμˆ˜λΌλ¦¬ μ½”λ“œ κ³΅μœ ν•΄λ³΄κΈ°

각각 switch문을 μ‚¬μš©ν•œ 방법과 μ „λž΅ νŒ¨ν„΄μ„ ν™œμš©ν•œ λ°©λ²•μœΌλ‘œ, μ—΄κ±° νƒ€μž… μƒμˆ˜λ§ˆλ‹€ λ‹€λ₯Έ λ‘œμ§μ„ μ œκ³΅ν•˜λ©΄μ„œλ„ κ³΅ν†΅λœ μ½”λ“œλ₯Ό 효과적으둜 κ³΅μœ ν•  수 μžˆλ‹€. 각 μ ‘κ·Ό λ°©μ‹μ˜ μž₯단점을 λΉ„κ΅ν•˜μ—¬ μ–΄λ–€ μƒν™©μ—μ„œ 더 μ ν•©ν•œμ§€ μ•Œμ•„λ³΄μž

1) 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 μ ˆμ„ μΆ”κ°€ν•˜λŠ” 것을 μžŠμ„ μœ„ν—˜μ΄ μžˆλ‹€. μ΄λŸ¬ν•œ μ½”λ“œ μœ μ§€λ³΄μˆ˜μ˜ λ¦¬μŠ€ν¬κ°€ 있으며, μ‹€μˆ˜λ‘œ λˆ„λ½λœ κ²½μš°μ—λŠ” λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

2) μ „λž΅ μƒμˆ˜ νŒ¨ν„΄μ„ μ‚¬μš©ν•œ μ—΄κ±° νƒ€μž… μƒμˆ˜ μ½”λ“œ 곡유

두 번째 방식은 μ „λž΅ νŒ¨ν„΄μ„ ν™œμš©ν•˜μ—¬ 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 문에 λΉ„ν•΄ λ‹€μ†Œ λ³΅μž‘ν•˜μ§€λ§Œ, μ½”λ“œμ˜ μ•ˆμ „μ„±κ³Ό ν™•μž₯성을 λ†’μ΄λŠ” 데 유리

3) μ „λž΅ νŒ¨ν„΄κ³Ό switch λ¬Έ 비ꡐ

ν•­λͺ© switch문을 μ΄μš©ν•œ 방법 μ „λž΅ νŒ¨ν„΄μ„ μ‚¬μš©ν•œ 방법
μ½”λ“œ κ°„κ²°μ„± μƒλŒ€μ μœΌλ‘œ 간결함 μ½”λ“œκ°€ λ‹€μ†Œ λ³΅μž‘ν•΄μ§
μ•ˆμ „μ„± μƒˆλ‘œμš΄ μƒμˆ˜ μΆ”κ°€ μ‹œ λˆ„λ½ν•  κ°€λŠ₯성이 있음 μƒˆλ‘œμš΄ μƒμˆ˜ μΆ”κ°€ μ‹œ ν•„μˆ˜ μž…λ ₯값이 μžˆμ–΄ μ•ˆμ „ν•¨
ν™•μž₯μ„± μ œν•œμ μ΄λ©°, 변경에 취약함 μ „λž΅ νŒ¨ν„΄μ„ ν™œμš©ν•˜μ—¬ μœ μ—°ν•˜κ²Œ ν™•μž₯ κ°€λŠ₯
μœ μ§€λ³΄μˆ˜ 둜직 쀑볡이 λ°œμƒν•  κ°€λŠ₯성이 있음 각 μƒμˆ˜μ˜ λ‘œμ§μ„ ν•œ κ³³μ—μ„œ 관리할 수 있음
  • switch λ¬Έ: κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμ§€λ§Œ, μ—΄κ±° νƒ€μž… μƒμˆ˜λ³„ λ™μž‘μ„ μΌκ΄„μ μœΌλ‘œ μˆ˜μ •ν•  λ•Œ λΆˆνŽΈν•˜λ©°, μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ ΅κ³  μ‹€μˆ˜κ°€ λ°œμƒν•  μ—¬μ§€κ°€ μžˆλ‹€.
  • μ „λž΅ μƒμˆ˜ νŒ¨ν„΄: μ—΄κ±° νƒ€μž… λ‚΄λΆ€μ—μ„œ μ „λž΅ νŒ¨ν„΄μ„ ν™œμš©ν•˜μ—¬ μƒμˆ˜λ³„λ‘œ λ‹€λ₯Έ λ‘œμ§μ„ μ•ˆμ „ν•˜κ²Œ 관리할 수 μžˆλ‹€. 이 방법은 특히 μ½”λ“œμ˜ ν™•μž₯μ„±κ³Ό μ•ˆμ „μ„±μ„ μ€‘μ‹œν•  λ•Œ μœ μš©ν•˜λ‹€.

5. μ—΄κ±° νƒ€μž…μ„ μ–Έμ œ μ“°λŠ”λ°?

ν•„μš”ν•œ μ›μ†Œλ₯Ό μ»΄νŒŒμΌνƒ€μž„μ— λ‹€ μ•Œ 수 μžˆλŠ” μƒμˆ˜ 집합이라면 μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜μž.

  • ex) νƒœμ–‘κ³„ ν–‰μ„±, ν•œ 주의 μš”μΌ, 체슀 말
  • ex) 메뉴 μ•„μ΄ν…œ, μ—°μ‚° μ½”λ“œ, λͺ…령쀄 ν”Œλž˜κ·Έ

μ •λ¦¬ν•˜μžλ©΄ ,

μ—΄κ±° νƒ€μž…μ€ ν™•μ‹€νžˆ μ •μˆ˜ μƒμˆ˜λ³΄λ‹€ νš¨μœ¨μ΄λ‹€. 읽기도 쉽고 κ°•λ ₯ν•˜λ‹€. λ¬Όλ‘  λ©”μ„œλ“œλ„ μ“Έ 수 μžˆλ‹€. ν•„μš”ν•œ μ›μ†Œλ₯Ό 컴파일 νƒ€μž„μ— λͺ¨λ‘ λ‹€ μ•Œ 수 μžˆλŠ” μƒμˆ˜μ˜ 집합이라면 μ—΄κ±° νƒ€μž…μ„ κ°•λ ₯히 μΆ”μ²œν•œλ‹€. λ°”μ΄λ„ˆλ¦¬ μˆ˜μ€€μ—μ„œ ν˜Έν™˜λ˜λ„λ‘ μ„€κ³„λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ—΄κ±° νƒ€μž…μ— μ •μ˜λœ μƒμˆ˜ κ°œμˆ˜κ°€ μ˜μ›νžˆ κ³ μ • λΆˆλ³€μΌ ν•„μš”λ„ μ—†λ‹€.

  • λŒ€λ‹€μˆ˜ μ—΄κ±° νƒ€μž…μ€ λͺ…μ‹œμ  μƒμ„±μžλ‚˜ λ©”μ„œλ“œ 없이 μ“°μ΄μ§€λ§Œ, 각 μƒμˆ˜λ₯Ό νŠΉμ • 데이터와 μ—°κ²°μ§“κ±°λ‚˜ μƒμˆ˜λ§ˆλ‹€ λ‹€λ₯΄κ²Œ λ™μž‘ν•  λ•ŒλŠ” ν•„μš”ν•˜λ‹€.
    • 이 경우, 보톡은 좔상 λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•œ λ’€, switchλ¬Έ λŒ€μ‹  μƒμˆ˜λ³„ λ©”μ„œλ“œ κ΅¬ν˜„μ΄ λ‚«λ‹€.
    • μ—΄κ±° νƒ€μž… μƒμˆ˜κ°€ 같은 μ½”λ“œλ₯Ό κ³΅μœ ν•œλ‹€λ©΄, μ „λž΅ μ—΄κ±° νƒ€μž… νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μž.

좜처

Footnotes

  1. https://velog.io/@red-sprout/Java-enum%EC%9D%80-%EC%99%9C-%EC%93%B0%EB%8A%94%EA%B1%B8%EA%B9%8C-feat.-%EC%9A%B0%EC%95%84%ED%95%9C%ED%98%95%EC%A0%9C%EB%93%A4-%EA%B8%B0%EC%88%A0%EB%B8%94%EB%A1%9C%EA%B7%B8 ↩