🌱 μΈν”„λŸ°/β˜•οΈ κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편

μžλ°” μ—΄κ±°ν˜• ENUM 총정리

mallin 2025. 7. 10. 17:51

β˜•οΈ  κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편 μ„ λ“£κ³  μž‘μ„±ν•˜λŠ” λ³΅μŠ΅ λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

 

0. λ°°κ²½

μƒνƒœλ‚˜ μ •ν•΄μ§„ 값을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄μ„œ μžλ°”μ—μ„œ enum 을 많이 μ‚¬μš©ν•œλ‹€

μ΄λ²ˆμ—” enum 이 μƒκ²¨λ‚˜κ²Œ 된 μ΄μœ λΆ€ν„° μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ©΄ λ˜λŠ”μ§€ μ•Œμ•„λ³΄μž !!


1. 고객 λ“±κΈ‰ κ΅¬ν˜„ν•˜κΈ°

고객을 3개의 λ“±κΈ‰μœΌλ‘œ λ‚˜λˆ„κ³ , μƒν’ˆμ„ ꡬ맀할 λ•Œ λ“±κΈ‰λ³„λ‘œ 할인을 μ μš©ν•˜λ €κ³  ν•œλ‹€

 

🌱 BASIC λ“±κΈ‰ → 10% 할인

⚜️ GOLD → 20% 할인

πŸ’Ž DIAMOND → 30% 할인

 

κ°€μž₯ λ¨Όμ € λ– μ˜¬λ¦΄ 수 μžˆλŠ” κ΅¬ν˜„ 방법은 String 을 μ‚¬μš©ν•˜λŠ” 것이닀. 

 

1-1. String μ‚¬μš©

public int discount(String grade, int price) {
    int discountPercent = 0;
    if (grade.equals("BASIC")) {
        discountPercent = 10;
    } else if (grade.equals("GOLD")) {
        discountPercent = 20;
    } else if (grade.equals("DIAMOND")) {
        discountPercent = 30;
    } else {
        System.out.println(grade + ": 할인 X");
    }
    return price * discountPercent / 100;
}

 

String νƒ€μž…μ„ μ‚¬μš©ν•΄μ„œ λ§€κ°œλ³€μˆ˜λ‘œ grade λ₯Ό 받은 ν›„ equals 둜 λΉ„κ΅ν•΄μ„œ 할인 νΌμ„ΌνŠΈλ₯Ό 리턴할 수 μžˆλ„λ‘ ν–ˆλ‹€

ν•˜μ§€λ§Œ, 이 방식은 μ—¬λŸ¬ κ°€μ§€ 문제λ₯Ό κ°€μ§„λ‹€.

  1. μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 등급을 μž…λ ₯ν•œ 경우 (VIP)
  2. μ˜€νƒ€λ₯Ό μž…λ ₯ν•œ 경우 (basiic)
  3. μ†Œλ¬Έμžλ₯Ό μž…λ ₯ν•œ 경우 (basic)

λ‚΄κ°€ μ›ν•˜λŠ” λ°©μ‹λŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

 

μ •λ¦¬ν•˜μžλ©΄ 등급에 λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€

  1. νƒ€μž… μ•ˆμ •μ„± λΆ€μ‘± : λ¬Έμžμ—΄μ€ μ˜€νƒ€κ°€ λ°œμƒν•˜κΈ° 쉽닀
  2. 데이터 일관성 떨어짐 : GOLD, gold, Gold κ°€ λͺ¨λ‘ 같은 의미λ₯Ό κ°€μ§€μ§€λ§Œ, String 은 μ •ν™•νžˆ μΌμΉ˜ν•΄μ•Όμ§€λ§Œ ν•œλ‹€
  3. κ°’μ˜ μ œν•œ λΆ€μ‘± : 잘λͺ»λœ λ¬Έμžμ—΄μ„ μ‹€μˆ˜λ‘œ μž…λ ₯ν•  수 μžˆμ§€λ§Œ μ œν•œλ˜μ§€ μ•ŠλŠ”λ‹€.
  4. 였λ₯˜ λ°œμƒ μ‹œ 컴파일 였λ₯˜ 감지 λΆˆκ°€ : λŸ°νƒ€μž„μ—μ„œ κ°μ§€λ˜κΈ° λ•Œλ¬Έμ— 였λ₯˜ 감지가 μ–΄λ ΅λ‹€

 

1-2. μƒμˆ˜ μ‚¬μš©

public class StringGrade {
    public static final String BASIC = "BASIC";
    public static final String GOLD = "GOLD";
    public static final String DIAMOND = "DIAMOND";
}

μœ„μ²˜λŸΌ λ³„λ„μ˜ 클래슀λ₯Ό λ§Œλ“  λ‹€μŒ μƒμˆ˜λ“€μ„ λͺ¨μ•„μ„œ μ‚¬μš©ν•˜λ©΄ μœ„μ˜ 문제λ₯Ό μ‘°κΈˆμ΄λ‚˜λ§ˆ ν•΄κ²°ν•  수 μžˆλŠ”κ²ƒμ²˜λŸΌ 보인닀.

ν•˜μ§€λ§Œ, νŒŒλΌλ―Έν„°λ‘œ String grade λ₯Ό λ°›κΈ° λ•Œλ¬Έμ— String 을 μ‚¬μš©ν–ˆμ„ λ•Œλž‘ 같은 였λ₯˜κ°€ λ°œμƒν•œλ‹€


2.  νƒ€μž… μ•ˆμ „ μ—΄κ±°ν˜• νŒ¨ν„΄

1λ²ˆμ—μ„œ λ°œμƒν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” νƒ€μž… μ•ˆμ „ μ—΄κ±°ν˜• νŒ¨ν„΄μ„ μ‚¬μš©ν•  수 μžˆλ‹€

public class ClassGrade {
    public static final ClassGrade BASIC = new ClassGrade();
    public static final ClassGrade GOLD = new ClassGrade();
    public static final ClassGrade DIAMOND = new ClassGrade();
}

 

κ΅¬ν˜„ 방법

  1. νšŒμ› 등급을 λ‹€λ£¨λŠ” ClassGrade 클래슀λ₯Ό λ§Œλ“ λ‹€
  2. νšŒμ› λ“±κΈ‰λ³„λ‘œ ClassGrade λ₯Ό λ°˜ν™˜ν•˜λŠ” 클래슀 μƒμˆ˜ λ³€μˆ˜λ₯Ό λ§Œλ“ λ‹€ (static final)
  3. 각각의 μƒμˆ˜λ§ˆλ‹€ λ³„λ„μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ³€μˆ˜μ— λŒ€μž…ν•œλ‹€

그러면 νšŒμ› 등급을 λ‚˜νƒ€λ‚΄λŠ” νƒ€μž… μ•ˆμ „ μ—΄κ±°ν˜• νŒ¨ν„΄μ΄ κ΅¬ν˜„λœλ‹€.

 

static final 을 μ‚¬μš©ν•΄μ„œ 클래슀 μƒμˆ˜ λ³€μˆ˜λ‘œ λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ— 클래슀.λ³€μˆ˜λͺ… μœΌλ‘œ μ‚¬μš©ν•  수 있고,

λ§€κ°œλ³€μˆ˜λ‘œ ClassGrade λ₯Ό λ„˜κΈ°κ³  μΈμˆ˜λ‘œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

μ—¬κΈ°μ„œ ν•˜λ‚˜μ˜ λ¬Έμ œκ°€ μžˆλ‹€.

λ°”λ‘œ 객체λ₯Ό 직접 μƒμ„±ν•΄μ„œ μ™ΈλΆ€μ—μ„œ μ—†λŠ” 등급을 직접 λ§Œλ“€ 수 μžˆλ‹€λŠ” 점이닀.

ν•˜μ§€λ§Œ, 이런 κ²½μš°μ—λŠ” ClassGrade μƒμ„±μžλ₯Ό private 둜 λ§Œλ“€μ–΄μ£Όλ©΄ λ¬Έμ œκ°€ ν•΄κ²°λœλ‹€

private ClassGrade() { }

 

μž₯점

  1. νƒ€μž… μ•ˆμ •μ„± ν–₯상 : 잘λͺ»λœ 값을 μž…λ ₯ν•˜λŠ” 문제λ₯Ό 근본적으둜 λ°©μ§€ν•œλ‹€
  2. 데이터 일관성 : μ •ν•΄μ§„ 객체만 μ‚¬μš©ν•  수 μžˆλ‹€
  3. μ œν•œλœ μΈμŠ€ν„΄μŠ€ 생성 : 사전에 μ •μ˜λœ λͺ‡ 개의 μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±ν•œλ‹€
  4. νƒ€μž… μ•ˆμ •μ„± : 잘λͺ»λœ 값이 ν• λ‹Ήλ˜κ±°λ‚˜ μ‚¬μš©λ˜λŠ” 것을 컴파일 μ‹œμ μ— λ°©μ§€ν•œλ‹€

→ String κ³Ό μƒμˆ˜λ₯Ό 썼을 λ•Œ λ°œμƒν–ˆλ˜ 단점듀을 λͺ¨λ‘ 컀버할 수 μžˆλ‹€ !

 

단점

ν•˜μ§€λ§Œ, 이 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λ €λ©΄ λ§Žμ€ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•˜κ³ 

λ§Œμ•½ κΉœλ°•ν•˜κ³  private μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ©΄ νƒ€μž… μ•ˆμ „ μ—΄κ±°ν˜• νŒ¨ν„΄μ΄ κ°€μ§€κ³  μžˆλŠ” μž₯점듀이 λͺ¨λ‘ κΉ¨μ§„λ‹€

 

κ·Έλ ‡κΈ° 떄문에 μžλ°”λŠ” νƒ€μž… μ•ˆμ „ μ—΄κ±°ν˜•μ„ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ Enum Type 을 μ œκ³΅ν•œλ‹€


3. μ—΄κ±°ν˜• Enum Type

public enum Grade {
    BASIC, GOLD, DIAMOND;
}
  • 클래슀 λŒ€μ‹  enum 을 μ‚¬μš©
  • μ›ν•˜λŠ” μƒμˆ˜μ˜ 이름을 λ‚˜μ—΄

ν•΄μ£Όλ©΄ Enum 을 μ‚¬μš©ν•  수 μžˆλ‹€. 

 

public class Grade extends Enum {
    public static final ClassGrade BASIC = new ClassGrade();
    public static final ClassGrade GOLD = new ClassGrade();
    public static final ClassGrade DIAMOND = new ClassGrade();

    // private μƒμ„±μž μΆ”κ°€
    private ClassGrade() {}
}
  • enum μ½”λ“œλŠ” 2λ²ˆμ—μ„œ μ‚΄νŽ΄λ΄€λ˜ νƒ€μž… μ•ˆμ „ μ—΄κ±°ν˜• νŒ¨ν„΄ μ½”λ“œμ™€ λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€.
  • μ—΄κ±°ν˜•λ„ 클래슀둜, μžλ™μœΌλ‘œ java.lang.Enum 을 μƒμ†λ°›λŠ”λ‹€

 

μž₯점

  1. νƒ€μž… μ•ˆμ •μ„± ν–₯상 : μœ νš¨ν•˜μ§€ μ•Šμ€ 값이 μž…λ ₯될 κ°€λŠ₯성이 μ—†λ‹€
  2. κ°„κ²°μ„± 및 일관성 : μ½”λ“œκ°€ 더 κ°„κ²°ν•˜κ³  λͺ…ν™•ν•΄μ§„λ‹€
  3. ν™•μž₯μ„± : μƒˆλ‘œμš΄ νšŒμ› 등급을 μΆ”κ°€ν•˜κ³  μ‹ΆμœΌλ©΄, Enum 에 μƒˆλ‘œμš΄ μƒμˆ˜λ§Œ μΆ”κ°€ν•˜λ©΄ λœλ‹€

 

μ£Όμš” λ©”μ„œλ“œ

λ©”μ„œλ“œλͺ…  μ„€λͺ…
values() λͺ¨λ“  enum μƒμˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” 배열을 λ°˜ν™˜
valueOf(String name) μ£Όμ–΄μ§„ 이름과 μΌμΉ˜ν•˜λŠ” enum μƒμˆ˜λ₯Ό λ°˜ν™˜
name() enum μƒμˆ˜μ˜ 이름을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜
ordinal() enum μƒμˆ˜μ˜ μ„ μ–Έ μˆœμ„œλ₯Ό λ°˜ν™˜ (0λΆ€ν„° μ‹œμž‘)
toString() enum μƒμˆ˜μ˜ 이름을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜, μ˜€λ²„λΌμ΄λ“œ κ°€λŠ₯

 

🚨 ordinal() μ£Όμ˜μ‚¬ν•­
ordinal() 은 μƒμˆ˜μ˜ μ„ μ–Έ μˆœμ„œλ₯Ό λ°˜ν™˜ν•œλ‹€.
ν•˜μ§€λ§Œ 가급적 !! μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”κ²Œ μ’‹λ‹€
μœ„μΉ˜κ°€ κ³ μ •λ˜μ–΄ μžˆλŠ”κ²Œ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 쀑간에 μƒμˆ˜κ°€ μΆ”κ°€λ˜κ±°λ‚˜ μœ„μΉ˜κ°€ λ°”λ€Œλ©΄ λͺ¨λ“  μœ„μΉ˜κ°€ 변경될 수 μžˆλ‹€