λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μ—΄κ±° νƒ€μž…(Enum) μ‚¬μš©λ²• & 예제

by 5566 2023. 8. 16.

1. Enumμ΄λž€?

Enum(μ—΄κ±° νƒ€μž…)은 λͺ‡ 가지 κ³ μ •λœ 값을 κ°€μ§€λŠ” 데이터 νƒ€μž…μœΌλ‘œ, 일반적으둜 μƒμˆ˜λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. Javaμ—μ„œ Enum은 μ—΄κ±°ν˜•μ΄λΌκ³ λ„ 뢈리며, Cμ–Έμ–΄μ˜ μ—΄κ±°ν˜•κ³Ό λΉ„μŠ·ν•œ κ°œλ…μž…λ‹ˆλ‹€. μ—΄κ±° νƒ€μž…μ€ μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” μƒμˆ˜λ“€μ„ κ·Έλ£Ήν™”ν•˜μ—¬ ν‘œν˜„ν•  수 있으며, μ½”λ“œμ˜ 가독성을 높이고 였λ₯˜λ₯Ό μ€„μ΄λŠ”λ° 도움을 μ€λ‹ˆλ‹€.

Enum은 μ—¬λŸ¬ μƒμˆ˜λ“€ μ€‘μ—μ„œ ν•˜λ‚˜μ˜ 값을 선택해야 ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μš”μΌμ„ ν‘œν˜„ν•˜λŠ” 경우 {μ›”, ν™”, 수, λͺ©, 금, ν† , 일}κ³Ό 같은 μƒμˆ˜λ“€μ„ Enum으둜 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Enum은 κ³ μ •λœ 값듀을 가지고 있기 λ•Œλ¬Έμ— μ‹€μˆ˜λ‘œ 잘λͺ»λœ 값이 λ“€μ–΄μ˜€λŠ” 상황을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

Enum은 μžλ°” 1.5λΆ€ν„° λ„μž…λ˜μ—ˆμœΌλ©°, C#, Python, Kotlin λ“±μ˜ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλ„ λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ μ§€μ›λ©λ‹ˆλ‹€. μ—΄κ±° νƒ€μž…μ€ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ½”λ“œλ₯Ό λ”μš± 효율적이고 가독성 있게 μž‘μ„±ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.

2. Enum의 μ •μ˜μ™€ μ„ μ–Έ 방법

Enum은 일련의 μƒμˆ˜λ“€μ„ κ·Έλ£Ήν™”ν•˜μ—¬ ν‘œν˜„ν•˜λŠ” 데이터 νƒ€μž…μž…λ‹ˆλ‹€. Javaμ—μ„œ Enum은 enum ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜λ©λ‹ˆλ‹€. Enum은 클래슀둜 μ •μ˜λ˜κ³ , μ—΄κ±°ν˜•μ˜ 각각의 μƒμˆ˜λŠ” ν•΄λ‹Ή Enum 클래슀의 κ°μ²΄μž…λ‹ˆλ‹€.

Enum을 μ •μ˜ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

enum EnumName {
    CONSTANT1,
    CONSTANT2,
    CONSTANT3,
    ...
}

각각의 μƒμˆ˜λŠ” 콀마둜 κ΅¬λΆ„λœ ν˜•νƒœλ‘œ μ—΄κ±°λ©λ‹ˆλ‹€. μƒμˆ˜λŠ” λŒ€λ¬Έμžλ‘œ μž‘μ„±λ˜κ³ , μ„Έλ―Έμ½œλ‘ μœΌλ‘œ μ’…λ£Œλ©λ‹ˆλ‹€. Enum은 ν΄λž˜μŠ€λ‘œμ„œ λ‚΄λΆ€μ μœΌλ‘œ μƒμ„±μž, λ©”μ„œλ“œ 및 ν•„λ“œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μš”μΌμ„ ν‘œν˜„ν•˜λŠ” Enum을 μ •μ˜ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

μœ„μ˜ μ½”λ“œμ—μ„œ DayλŠ” Enum의 이름이고, 각각의 μƒμˆ˜λŠ” ν•΄λ‹Ή 객체의 μ΄λ¦„μž…λ‹ˆλ‹€. Day Enum은 κ·Έ 자체둜 ν•˜λ‚˜μ˜ νƒ€μž…μ΄ 되며, Day.MONDAY와 같은 ν˜•νƒœλ‘œ μƒμˆ˜μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ Enum을 μ‚¬μš©ν•˜λ©΄ λ³€μˆ˜μ— 잘λͺ»λœ 값이 λ“€μ–΄μ˜€λŠ” 것을 λ°©μ§€ν•˜κ³ , 가독성이 쒋은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. Enum의 ν™œμš© 예제

Enum은 λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 Enum의 ν™œμš© 예제λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

예제 1: μš”μΌ ν‘œν˜„

이전에 μ–ΈκΈ‰ν•œ μš”μΌμ„ ν‘œν˜„ν•˜λŠ” Enum을 예둜 λ“€κ² μŠ΅λ‹ˆλ‹€. Day Enum은 μš”μΌμ„ λ‚˜νƒ€λ‚΄λŠ” μƒμˆ˜λ“€μ„ κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println("μ˜€λŠ˜μ€ " + today + "μž…λ‹ˆλ‹€.");

        if (today == Day.SATURDAY || today == Day.SUNDAY) {
            System.out.println("μ£Όλ§μž…λ‹ˆλ‹€.");
        } else {
            System.out.println("ν‰μΌμž…λ‹ˆλ‹€.");
        }
    }
}

μœ„μ˜ μ½”λ“œλŠ” ν˜„μž¬ μš”μΌμ„ λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ todayλ₯Ό μ„ μ–Έν•˜κ³ , κ·Έ 값을 좜λ ₯ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. λ˜ν•œ, 주말인지 평일인지λ₯Ό νŒλ³„ν•˜μ—¬ 좜λ ₯ν•©λ‹ˆλ‹€.

예제 2: κ³„μ ˆ ν‘œν˜„

Enum은 κ³„μ ˆμ„ λ‚˜νƒ€λ‚΄λŠ”λ°μ—λ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ κ³„μ ˆμ„ λ‚˜νƒ€λ‚΄λŠ” Enum의 μ˜ˆμ œμž…λ‹ˆλ‹€.

enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}

μœ„μ˜ Season Enum을 μ‚¬μš©ν•˜μ—¬ κ³„μ ˆμ— 따라 νŠΉμ •ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” 예제λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        Season currentSeason = Season.SPRING;

        switch (currentSeason) {
            case SPRING:
                System.out.println("λ΄„μž…λ‹ˆλ‹€.");
                break;
            case SUMMER:
                System.out.println("μ—¬λ¦„μž…λ‹ˆλ‹€.");
                break;
            case AUTUMN:
                System.out.println("κ°€μ„μž…λ‹ˆλ‹€.");
                break;
            case WINTER:
                System.out.println("κ²¨μšΈμž…λ‹ˆλ‹€.");
                break;
        }
    }
}

μœ„μ˜ μ½”λ“œλŠ” ν˜„μž¬ κ³„μ ˆμ„ λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ currentSeason을 μ„ μ–Έν•˜κ³ , ν•΄λ‹Ή κ³„μ ˆμ— λ§žλŠ” 문ꡬλ₯Ό 좜λ ₯ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜λ©΄ switchλ¬Έμ΄λ‚˜ if문을 μ‚¬μš©ν•˜μ—¬ κ°„κ²°ν•˜κ²Œ κ³„μ ˆμ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enum은 μœ„μ˜ μ˜ˆμ‹œ 외에도 λ‹€μ–‘ν•œ μƒν™©μ—μ„œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ£Όμ†Œμ§€λ₯Ό ν‘œν˜„ν•˜λŠ” Enum, μƒνƒœ μ½”λ“œλ₯Ό ν‘œν˜„ν•˜λŠ” Enum λ“±μœΌλ‘œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜κ³  가독성을 높일 수 있으며, 잘λͺ»λœ 값이 λ“€μ–΄μ˜€λŠ” 상황을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

4. Enum의 μž₯점과 ν™œμš© κ°€μΉ˜

Enum은 λ‹€μŒκ³Ό 같은 λͺ‡ 가지 μž₯점과 ν™œμš© κ°€μΉ˜λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

4.1 νƒ€μž… μ•ˆμ •μ„±(Type Safety)

Enum은 컴파일 μ‹œμ μ—μ„œ νƒ€μž… μ•ˆμ •μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή λ³€μˆ˜λŠ” Enum의 μƒμˆ˜ 쀑 ν•˜λ‚˜μ˜ 값을 κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” 잘λͺ»λœ κ°’μ΄λ‚˜ λ‹€λ₯Έ νƒ€μž…μ˜ 값이 λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ νƒ€μž… μ•ˆμ •μ„±μ€ μ½”λ“œμ˜ 였λ₯˜λ₯Ό 쀄이고 디버깅을 μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€.

4.2 읽기 μ‰¬μš΄ μ½”λ“œ

Enum을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ 가독성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€. Enum은 의미 μžˆλŠ” 이름을 가진 μƒμˆ˜λ“€μ˜ 집합을 ν‘œν˜„ν•˜λ―€λ‘œ, μ½”λ“œλ₯Ό μ½λŠ” λ…μžκ°€ ν•΄λ‹Ή 값을 μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. μƒμˆ˜μ˜ μ˜λ―Έκ°€ λͺ…ν™•ν•˜κ²Œ ν‘œν˜„λ˜κΈ° λ•Œλ¬Έμ—, μ½”λ“œμ˜ λͺ©μ μ„ νŒŒμ•…ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

4.3 μ½”λ“œμ˜ ꡬ쑰화

Enum을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜μ—¬ λ”μš± κ°„κ²°ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. Enum은 κ΄€λ ¨λœ μƒμˆ˜λ“€μ˜ κ·Έλ£Ήν™”λ₯Ό 톡해 의미 μžˆλŠ” μ½”λ“œ 블둝을 ν˜•μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μš”μΌμ„ λ‚˜νƒ€λ‚΄λŠ” Enum을 μ‚¬μš©ν•˜λ©΄, μš”μΌμ— κ΄€λ ¨λœ λ‘œμ§λ“€μ„ ν†΅ν•©ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 쀑볡 μ½”λ“œλ₯Ό 쀄이고 일관성 μžˆλŠ” μ½”λ“œ μž‘μ„±μ„ 도λͺ¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4.4 잘λͺ»λœ κ°’μ˜ 방지

Enum을 μ‚¬μš©ν•˜λ©΄ 잘λͺ»λœ 값이 λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€. Enum μƒμˆ˜ μ΄μ™Έμ˜ 값을 λ³€μˆ˜μ— ν• λ‹Ήν•˜λ €κ³  μ‹œλ„ν•  경우, 컴파일 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŠ” κ°œλ°œμžκ°€ μ˜¬λ°”λ₯Έ κ°’λ§Œ ν• λ‹Ήν•˜λ„λ‘ μœ λ„ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ λ†’μž…λ‹ˆλ‹€.

4.5 μ½”λ“œμ˜ μœ μ—°μ„±

Enum은 λ‚΄λΆ€μ μœΌλ‘œ μƒμ„±μž, λ©”μ„œλ“œ 및 ν•„λ“œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜μ—¬ 각각의 μƒμˆ˜κ°€ νŠΉμ •ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λ„λ‘ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Enum은 싱글톀 νŒ¨ν„΄μ„ μ μš©ν•˜κΈ°μ—λ„ μš©μ΄ν•˜λ©°, ν•„μš”μ— 따라 Enum의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ λ‹€μ–‘ν•œ λ™μž‘μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enum은 μœ„μ˜ μž₯점과 ν™œμš© κ°€μΉ˜λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±, 가독성, ꡬ쑰화, μœ μ—°μ„± 등을 ν–₯μƒμ‹œν‚€λŠ”λ° 도움을 μ€λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 Enum은 Javaμ—μ„œ 널리 μ‚¬μš©λ˜λŠ” 데이터 νƒ€μž… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

5. Enumκ³Ό κ΄€λ ¨λœ μ£Όμ˜μ‚¬ν•­κ³Ό ν•œκ³„

Enum을 μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•΄μ•Ό ν•  λͺ‡ 가지 사항과 ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€.

5.1 κ΄€λ ¨ μ—†λŠ” κ°’μ˜ μ œν•œ

Enum은 κ΄€λ ¨ μžˆλŠ” μƒμˆ˜λ“€μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, λΉ„μŠ·ν•œ νŠΉμ„±μ„ κ°€μ§€μ§€λ§Œ μ‹€μ œλ‘œ μ„œλ‘œ λ‹€λ₯Έ 것을 λ‚˜νƒ€λ‚΄λŠ” 값듀은 Enum으둜 μ •μ˜ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 성별을 λ‚˜νƒ€λ‚΄λŠ” 경우 "λ‚¨μž"와 "μ—¬μž"λŠ” Enum으둜 μ •μ˜ν•  수 μžˆμ§€λ§Œ, "기타"와 같은 값을 Enum에 ν¬ν•¨μ‹œν‚€λ©΄ λΆ€μ μ ˆν•œ μ‚¬μš©μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ ν•©ν•©λ‹ˆλ‹€.

5.2 μ—΄κ±°ν˜• μƒμˆ˜μ˜ λ³€κ²½ λΆˆκ°€

Enum의 μƒμˆ˜λŠ” ν•œ 번 μ •μ˜λ˜λ©΄ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉, Enum의 값을 λ™μ μœΌλ‘œ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. Enum이 μƒμˆ˜ 값을 λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우 μ–Έμ–΄ μˆ˜μ€€μ—μ„œλŠ” μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, λ‹€λ₯Έ 섀계 방식을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

5.3 μˆœμ„œμ˜ ν•œκ³„

Enum은 μƒμˆ˜μ˜ μˆœμ„œλ₯Ό κ°€μ§ˆ 수 μžˆμ§€λ§Œ, μˆœμ„œλ₯Ό κΈ°μ€€μœΌλ‘œ Enum을 λΉ„κ΅ν•˜λŠ” 것은 ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Enum μƒμˆ˜λ₯Ό 비ꡐ할 λ•ŒλŠ” == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ˜ν•œ, Enum μƒμˆ˜μ˜ μˆœμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Enum ν΄λž˜μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” ordinal() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

5.4 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰

Enum은 ν΄λž˜μŠ€μ΄λ―€λ‘œ, Enum μƒμˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ ν•΄λ‹Ή Enum 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€. λ”°λΌμ„œ, Enum 내에 λ§Žμ€ μƒμˆ˜κ°€ μžˆλŠ” 경우 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 특히 Enum의 μƒμˆ˜κ°€ μ‚¬μš©λ˜λŠ” κ³³μ—μ„œ μ€‘μš”ν•œ κ²½μš°μž…λ‹ˆλ‹€.

5.5 Serialization과의 ν˜Έν™˜μ„±

Enum을 Serializationν•˜κ³  Deserializationν•˜λŠ” 경우 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. Java의 κΈ°λ³Έ Serialization은 Enum의 μƒμˆ˜ 이름을 기반으둜 μ§λ ¬ν™”ν•˜λ―€λ‘œ, Enum 클래슀의 μƒμˆ˜ μ •μ˜μ— μˆœμ„œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μƒμˆ˜λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λŠ” λ“±μ˜ 변경을 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Enum은 κ°•λ ₯ν•œ κΈ°λŠ₯κ³Ό μž₯점을 가지고 μžˆμ§€λ§Œ, μœ„μ˜ μ£Όμ˜μ‚¬ν•­κ³Ό ν•œκ³„λ₯Ό μ•Œκ³  μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 Enum을 μ˜¬λ°”λ₯΄κ²Œ ν™œμš©ν•  수 있으며, Enum의 μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enumκ³Ό κ΄€λ ¨λœ μ£Όμ˜μ‚¬ν•­κ³Ό ν•œκ³„

κ΄€λ ¨ μ—†λŠ” κ°’μ˜ μ œν•œ

Enum은 κ΄€λ ¨ μžˆλŠ” μƒμˆ˜λ“€μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, λΉ„μŠ·ν•œ νŠΉμ„±μ„ κ°€μ§€μ§€λ§Œ μ‹€μ œλ‘œ μ„œλ‘œ λ‹€λ₯Έ 것을 λ‚˜νƒ€λ‚΄λŠ” 값듀은 Enum으둜 μ •μ˜ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 성별을 λ‚˜νƒ€λ‚΄λŠ” 경우 "λ‚¨μž"와 "μ—¬μž"λŠ” Enum으둜 μ •μ˜ν•  수 μžˆμ§€λ§Œ, "기타"와 같은 값을 Enum에 ν¬ν•¨μ‹œν‚€λŠ” 것은 λΆ€μ μ ˆν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 ν‘œν˜„ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

μ—΄κ±°ν˜• μƒμˆ˜μ˜ λ³€κ²½ λΆˆκ°€

Enum의 μƒμˆ˜λŠ” ν•œ 번 μ •μ˜λ˜λ©΄ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉, Enum의 값을 λ™μ μœΌλ‘œ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ§Œμ•½ Enum의 μƒμˆ˜ 값을 λ³€κ²½ν•΄μ•Ό ν•œλ‹€λ©΄, λ‹€λ₯Έ 섀계 방식을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Enum μ™ΈλΆ€μ—μ„œ 값을 μ €μž₯ν•˜κ³  ν•„μš”μ— 따라 값에 μ ‘κ·Όν•˜μ—¬ λΉ„μŠ·ν•œ 효과λ₯Ό λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μˆœμ„œμ˜ ν•œκ³„

Enum은 μƒμˆ˜μ˜ μˆœμ„œλ₯Ό κ°€μ§ˆ 수 μžˆμ§€λ§Œ, μˆœμ„œλ₯Ό κΈ°μ€€μœΌλ‘œ Enum을 λΉ„κ΅ν•˜λŠ” 것은 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€. Enum μƒμˆ˜λ₯Ό 비ꡐ할 λ•ŒλŠ” == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ˜ν•œ, Enum μƒμˆ˜μ˜ μˆœμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Enum ν΄λž˜μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” ordinal() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. ordinal() λ©”μ„œλ“œλŠ” ν•΄λ‹Ή Enum μƒμˆ˜μ˜ μˆœμ„œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰

Enum은 ν΄λž˜μŠ€μ΄λ―€λ‘œ, Enum μƒμˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ ν•΄λ‹Ή Enum 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€. λ”°λΌμ„œ, Enum 내에 λ§Žμ€ μƒμˆ˜κ°€ μžˆλŠ” 경우 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” Enum μƒμˆ˜ 자체 λŒ€μ‹ , Enum μƒμˆ˜μ˜ κ°’λ§Œ ν•„μš”ν•œ κ²½μš°λ‚˜ Enum 클래슀의 ν•„μš”μ„±μ΄ μ—†λŠ” 경우 일반 μƒμˆ˜ 값을 μ‚¬μš©ν•˜λŠ” 것이 더 νš¨μœ¨μ μž…λ‹ˆλ‹€.

Serialization과의 ν˜Έν™˜μ„±

Enum을 Serializationν•˜κ³  Deserializationν•˜λŠ” 경우 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. Java의 κΈ°λ³Έ Serialization은 Enum의 μƒμˆ˜ 이름을 기반으둜 μ§λ ¬ν™”ν•˜λ―€λ‘œ, Enum 클래슀의 μƒμˆ˜ μ •μ˜μ— μˆœμ„œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ μƒμˆ˜λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λŠ” λ“±μ˜ 변경을 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ³€κ²½λœ Enum 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ 이전에 μ§λ ¬ν™”λœ 데이터λ₯Ό μ—­μ§λ ¬ν™”ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 κ²½μš°μ—λŠ” 직렬화와 κ΄€λ ¨λœ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©μž μ •μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Enum은 λ§Žμ€ μž₯점과 κΈ°λŠ₯을 가지고 μžˆμ§€λ§Œ, μ£Όμ˜μ‚¬ν•­κ³Ό ν•œκ³„λ₯Ό μΈμ§€ν•˜κ³  μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 Enum을 μ˜¬λ°”λ₯΄κ²Œ ν™œμš©ν•˜μ—¬ μ½”λ“œλ₯Ό 효율적이고 μ•ˆμ •μ μœΌλ‘œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enumμ΄λž€?

Enum은 "μ—΄κ±°ν˜•"μ΄λΌλŠ” 의미둜, 미리 μ •μ˜λœ μƒμˆ˜ κ°’λ“€μ˜ 집합을 λ‚˜νƒ€λ‚΄λŠ” μžλ£Œν˜•μž…λ‹ˆλ‹€. Javaμ—μ„œ Enum은 Java 5λΆ€ν„° λ„μž…λ˜μ—ˆμœΌλ©°, μ—΄κ±°ν˜• μƒμˆ˜μ˜ 값듀을 μ •μ˜ν•œ ν›„μ—λŠ” 이 값듀을 ν”„λ‘œκ·Έλž¨μ˜ μ—¬λŸ¬ λΆ€λΆ„μ—μ„œ μ°Έμ‘°ν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enum은 일련의 μƒμˆ˜λ“€μ„ μ„ μ–Έν•˜κ³  이λ₯Ό μ΄λ¦„μœΌλ‘œ μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, 이λ₯Ό 톡해 가독성이 λ†’κ³  μœ μ§€ λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Javaμ—μ„œλŠ” Enum을 μ •μ˜ν•˜κΈ° μœ„ν•΄ enum ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©°, Enum 클래슀λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μƒμ†λ°›κ²Œ λ©λ‹ˆλ‹€.

Enum은 μƒμˆ˜ κ°’λ“€μ˜ μ§‘ν•©μ΄λ―€λ‘œ, 일반적으둜 μœ ν•œν•œ 개수의 κ°’μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μš”μΌμ„ ν‘œν˜„ν•˜λŠ” κ²½μš°μ—λŠ” "μ›”μš”μΌ", "ν™”μš”μΌ"κ³Ό 같은 값을 Enum으둜 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 값듀을 λͺ…μ‹œμ μœΌλ‘œ μ •μ˜ν•˜κ³ , 잘λͺ»λœ 값을 μž…λ ₯ν•˜κ±°λ‚˜ λΉ„κ΅ν•˜λŠ” 였λ₯˜λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

Enum은 μƒμˆ˜μ˜ 이름과 값을 쌍으둜 가지며, 이 값을 μ‚¬μš©ν•˜μ—¬ Enum μƒμˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Enum μƒμˆ˜λŠ” 각각 κ³ μœ ν•œ κ°’κ³Ό μˆœμ„œλ₯Ό 가지며, 이λ₯Ό 톡해 Enum μƒμˆ˜μ˜ 비ꡐ와 순회λ₯Ό νŽΈλ¦¬ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, Enum은 switch λ¬Έκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ κ°•λ ₯ν•œ μ œμ–΄ 흐름을 μž‘μ„±ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

Java의 Enum은 νƒ€μž… μ•ˆμ „μ„±μ„ μ œκ³΅ν•˜λ―€λ‘œ, 컴파일 μ‹œκ°„μ— 잘λͺ»λœ Enum κ°’μ˜ μ‚¬μš©μ„ 방지할 수 μžˆμŠ΅λ‹ˆλ‹€. Enum은 μƒμˆ˜ κ°’λ“€μ˜ 집합을 λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜κ³  관리할 수 μžˆμœΌλ―€λ‘œ, μ½”λ“œμ˜ 가독성과 μ•ˆμ •μ„±μ„ λ†’μ—¬μ£ΌλŠ” 효과적인 λ„κ΅¬μž…λ‹ˆλ‹€.

이처럼 Enum은 Javaμ—μ„œ μƒμˆ˜ κ°’λ“€μ˜ 집합을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ κ°•λ ₯ν•˜κ³  νŽΈλ¦¬ν•œ μžλ£Œν˜•μ΄λ©°, μ½”λ“œμ˜ 가독성과 μœ μ§€ λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œμΌœμ£ΌλŠ” μ€‘μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€.

Enum의 μ„ μ–Έ 방법

Javaμ—μ„œ Enum을 μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” enum ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. Enum은 ν΄λž˜μŠ€μ΄λ―€λ‘œ, 일반적인 클래슀 ν˜•νƒœλ‘œ μ •μ˜λ©λ‹ˆλ‹€. Enum ν΄λž˜μŠ€λŠ” μ—΄κ±°ν˜• μƒμˆ˜μ˜ 집합을 λ‚˜νƒ€λ‚΄λ©°, 각 μƒμˆ˜λŠ” Enum 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.

Enum을 μ„ μ–Έν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

enum EnumName {
    CONSTANT1,
    CONSTANT2,
    CONSTANT3,
    // ...
}
  • enumν‚€μ›Œλ“œ λ‹€μŒμ—λŠ” Enum의 이름을 μ§€μ •ν•©λ‹ˆλ‹€. 이름은 κ΄€λ‘€μ μœΌλ‘œ 첫 κΈ€μžκ°€ λŒ€λ¬Έμžμ΄λ©°, λ‹¨μˆ˜ν˜•μœΌλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.
  • μ€‘κ΄„ν˜Έ {} λ‚΄λΆ€μ—λŠ” Enum μƒμˆ˜λ“€μ„ μ„ μ–Έν•©λ‹ˆλ‹€. 각 μƒμˆ˜λŠ” 콀마둜 κ΅¬λΆ„λ˜λ©°, λͺ…μ‹œμ μœΌλ‘œ λŒ€λ¬Έμžλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.

Enum μƒμˆ˜μ˜ 이름은 일반적으둜 λŒ€λ¬Έμžλ‘œ μž‘μ„±λ˜λ©°, μ—¬λŸ¬ λ‹¨μ–΄λ‘œ 이루어진 κ²½μš°μ—λŠ” 밑쀄(_)둜 단어λ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€. μ΄λŠ” μƒμˆ˜μ˜ 가독성을 λ†’μ—¬μ£ΌλŠ” κ΄€λ‘€μž…λ‹ˆλ‹€.

Enum ν΄λž˜μŠ€μ—λŠ” 기본적으둜 λͺ‡ 가지 λ©”μ„œλ“œκ°€ 이미 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 각 Enum μƒμˆ˜λŠ” Enum 클래슀의 μΈμŠ€ν„΄μŠ€μ΄λ―€λ‘œ, Enum ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, name() λ©”μ„œλ“œλŠ” Enum μƒμˆ˜μ˜ 이름을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•˜κ³ , ordinal() λ©”μ„œλ“œλŠ” Enum μƒμˆ˜μ˜ μˆœμ„œ(0λΆ€ν„° μ‹œμž‘)λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Enum을 μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

public class Main {
    public static void main(String[] args) {
        Day today = Day.SUNDAY;
        System.out.println("Today is " + today); // 좜λ ₯: Today is SUNDAY
    }
}

μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” Day Enum을 μ •μ˜ν•˜κ³ , today λ³€μˆ˜μ— Day.SUNDAY 값을 ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€. Enum μƒμˆ˜λŠ” EnumName.CONSTANT ν˜•μ‹μœΌλ‘œ 참쑰되며, λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ  λ•Œ μƒμˆ˜μ˜ 이름이 좜λ ₯λ©λ‹ˆλ‹€.

이처럼 Enum을 μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λ©΄, μ½”λ“œμ˜ 가독성을 높이고 였λ₯˜λ₯Ό 방지할 수 있으며, μœ μ§€ λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

Enum의 ν™œμš© 예제

Enum은 μƒμˆ˜ κ°’λ“€μ˜ 집합을 λ‚˜νƒ€λ‚΄λŠ” μžλ£Œν˜•μœΌλ‘œ, λ‹€μ–‘ν•œ μƒν™©μ—μ„œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. Enum의 ν™œμš© 예제λ₯Ό μ‚΄νŽ΄λ³΄λ©΄μ„œ, Enum이 μ–΄λ–»κ²Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. μš”μΌ 예제

κ°€μž₯ 일반적인 Enum의 ν™œμš© μ˜ˆμ œλ‘œλŠ” μš”μΌμ„ ν‘œν˜„ν•˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ μš”μΌμ„ λ‚˜νƒ€λ‚΄λŠ” Enum인 Day의 μ˜ˆμ œμž…λ‹ˆλ‹€:

enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

public class Main {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        if (today == Day.SATURDAY || today == Day.SUNDAY) {
            System.out.println("It's weekend!");
        } else {
            System.out.println("It's weekday!");
        }
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” Day Enum을 μ‚¬μš©ν•˜μ—¬ 였늘이 주말인지 μ•„λ‹Œμ§€λ₯Ό ν™•μΈν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜λ©΄ ifλ¬Έμ—μ„œ μš”μΌμ„ 비ꡐ할 λ•Œ 일일히 λ¬Έμžμ—΄ 값을 λΉ„κ΅ν•˜λŠ” 것 λŒ€μ‹ , Enum μƒμˆ˜μ˜ 값을 λΉ„κ΅ν•˜μ—¬ 가독성이 λ†’μ•„μ§‘λ‹ˆλ‹€.

2. κ³„μ ˆ 예제

Enum은 μƒνƒœμ™€ κΈ°λŠ₯을 ν•¨κ»˜ μ •μ˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ³„μ ˆμ„ ν‘œν˜„ν•˜λŠ” Enum인 Season의 예제λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

enum Season {
    SPRING("March", "April", "May"),
    SUMMER("June", "July", "August"),
    AUTUMN("September", "October", "November"),
    WINTER("December", "January", "February");

    private final String[] months;

    Season(String... months) {
        this.months = months;
    }

    public String[] getMonths() {
        return months;
    }
}

public class Main {
    public static void main(String[] args) {
        Season currentSeason = Season.SUMMER;
        System.out.println("The current season is " + currentSeason);
        System.out.println("The months in this season are: " + Arrays.toString(currentSeason.getMonths()));
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” Season Enum을 μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ κ³„μ ˆκ³Ό 그에 ν•΄λ‹Ήν•˜λŠ” 월을 좜λ ₯ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. 각 κ³„μ ˆμ€ ν•΄λ‹Ήν•˜λŠ” 월듀을 가지고 있고, getMonths() λ©”μ„œλ“œλ₯Ό 톡해 월듀을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. Enum은 μƒμˆ˜ κ°’λ“€κ³Ό ν•¨κ»˜ 데이터λ₯Ό κ°€μ§ˆ 수 있으며, 이λ₯Ό ν™œμš©ν•˜μ—¬ λ³΅μž‘ν•œ 데이터와 κΈ°λŠ₯을 μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. μ£Όλ¬Έ μƒνƒœ 예제

μƒνƒœλ₯Ό ν‘œν˜„ν•˜λŠ” Enum은 μ£Όλ¬Έ μƒνƒœμ™€ 같은 κ³³μ—μ„œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€. λ‹€μŒμ€ 주문의 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” Enum인 OrderStatus의 μ˜ˆμ œμž…λ‹ˆλ‹€:

enum OrderStatus {
    PENDING("Pending"),
    CONFIRMED("Confirmed"),
    SHIPPED("Shipped"),
    DELIVERED("Delivered"),
    CANCELLED("Cancelled");

    private final String displayText;

    OrderStatus(String displayText) {
        this.displayText = displayText;
    }

    public String getDisplayText() {
        return displayText;
    }
}

public class Main {
    public static void main(String[] args) {
        OrderStatus orderStatus = OrderStatus.CONFIRMED;
        System.out.println("The order status is " + orderStatus.getDisplayText());
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” OrderStatus Enum을 μ‚¬μš©ν•˜μ—¬ 주문의 μƒνƒœλ₯Ό ν‘œν˜„ν•˜κ³ , getDisplayText() λ©”μ„œλ“œλ₯Ό 톡해 μƒνƒœμ˜ ν‘œμ‹œ λ¬Έμžμ—΄μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜λ©΄ 주문의 μƒνƒœλ₯Ό 일일히 λ¬Έμžμ—΄λ‘œ λΉ„κ΅ν•˜λŠ” 것 λŒ€μ‹  가독성이 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이처럼 Enum은 λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ ν™œμš©λ  수 있으며, μ½”λ“œμ˜ 가독성과 μœ μ§€ λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚€λŠ”λ° 도움을 μ€λ‹ˆλ‹€. Enum을 μ μ ˆν•˜κ²Œ ν™œμš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, 였λ₯˜λ₯Ό λ°©μ§€ν•˜κ³  직관적이고 μ•ˆμ •μ μΈ ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enum의 μž₯점과 ν™œμš© κ°€μΉ˜

Enum은 μƒμˆ˜ κ°’λ“€μ˜ 집합을 λ‚˜νƒ€λ‚΄λŠ” μžλ£Œν˜•μœΌλ‘œ, λ‹€μ–‘ν•œ μƒν™©μ—μ„œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. Enum의 μž₯점과 ν™œμš© κ°€μΉ˜μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄λ©΄μ„œ, Enum이 μ–΄λ–»κ²Œ μœ μš©ν•˜κ³  κ°€μΉ˜μžˆκ²Œ μ‚¬μš©λ  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. μ½”λ“œ 가독성 ν–₯상

Enum은 가독성을 ν–₯μƒμ‹œν‚€λŠ” 데 큰 도움을 μ€λ‹ˆλ‹€. Enum은 μƒμˆ˜ 집합을 μ •μ˜ν•˜μ—¬ μ½”λ“œμ—μ„œ μ‚¬μš©ν•  λ•Œ, ν•΄λ‹Ή μƒμˆ˜λ“€μ„ 가독성 μžˆλŠ” μ΄λ¦„μœΌλ‘œ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œλ₯Ό μ½κ±°λ‚˜ μœ μ§€λ³΄μˆ˜ν•  λ•Œ ν˜Όλž€μ„ 쀄여주고, μ½”λ“œμ˜ μ˜λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, enum Day { MONDAY, TUESDAY, ... }와 같이 μš”μΌμ„ ν‘œν˜„ν•˜λŠ” Enum을 μ‚¬μš©ν•˜λŠ” 것은 String ν˜Ήμ€ int λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 쒋은 가독성을 μ œκ³΅ν•©λ‹ˆλ‹€.

2. νƒ€μž… μ•ˆμ •μ„± 보μž₯

Enum은 μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž… μ•ˆμ •μ„±μ„ 검사할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. Enum은 사전에 μ •μ˜λœ μƒμˆ˜ κ°’λ“€μ˜ μ§‘ν•©μœΌλ‘œ 이루어져 μžˆμ–΄, 잘λͺ»λœ κ°’μ΄λ‚˜ μ˜€νƒ€λ‘œ μΈν•œ 였λ₯˜λ₯Ό λ°©μ§€ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€. 컴파일 μ‹œμ μ— 잘λͺ»λœ 값을 μ‚¬μš©ν•˜λŠ” 였λ₯˜λ₯Ό μž‘μ•„λ‚΄λ―€λ‘œ, λŸ°νƒ€μž„μ— λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό 사전에 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

3. μ½”λ“œ κ²°ν•©μ„± ν–₯상

Enum은 κ΄€λ ¨λœ μƒμˆ˜ 값듀을 λ…Όλ¦¬μ μœΌλ‘œ κ·Έλ£Ήν™”ν•  수 μžˆμ–΄, μ½”λ“œμ˜ 결합성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. Enum은 각 μƒμˆ˜ 값에 κ³ μœ ν•œ κΈ°λŠ₯μ΄λ‚˜ 속성을 μΆ”κ°€ν•  수 μžˆμ–΄, κ΄€λ ¨λœ λ™μž‘μ„ ν•˜λ‚˜μ˜ 객체둜 묢을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ³  λͺ¨λ“ˆν™”λœ ꡬ쑰둜 λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ£Όλ¬Έ μƒνƒœ(Enum)와 ν•΄λ‹Ή μƒνƒœμ— λ”°λ₯Έ λ™μž‘λ“€μ„ μ—°κ²°ν•˜μ—¬ μ½”λ“œμ˜ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. ν™•μž₯μ„±κ³Ό μœ μ—°μ„± 제곡

Enum은 ν•„μš”μ— 따라 ν™•μž₯이 κ°€λŠ₯ν•˜κ³  변경이 μš©μ΄ν•©λ‹ˆλ‹€. μƒˆλ‘œμš΄ 값을 μΆ”κ°€ν•˜κ±°λ‚˜ κΈ°μ‘΄ 값을 μˆ˜μ •ν•  λ•Œ, Enum을 μˆ˜μ •ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€. μ΄λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ—μ„œ Enum을 μ‚¬μš©ν•˜κ³  μžˆλŠ” κ²½μš°μ—λ„ μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ„ μ€„μ—¬μ€λ‹ˆλ‹€. λ˜ν•œ Enum은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆμœΌλ―€λ‘œ, λ‹€ν˜•μ„±κ³Ό ν•¨κ»˜ ν™•μž₯μ„±κ³Ό μœ μ—°μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

5. μ •ν™•ν•œ κ°’μ˜ 보μž₯

Enum은 미리 μ •μ˜λœ μƒμˆ˜ 값을 μ‚¬μš©ν•˜λ―€λ‘œ, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ‹€μˆ˜λ‘œ 잘λͺ»λœ 값을 ν• λ‹Ήν•˜λŠ” 였λ₯˜λ₯Ό μ€„μ—¬μ€λ‹ˆλ‹€. Enum을 μ‚¬μš©ν•˜λ©΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ κ°’μ΄λ‚˜ λΆ€μž‘μš©μ΄ λ°œμƒν•  κ°€λŠ₯성을 λŒ€ν­ 쀄일 수 있으며, μ½”λ“œμ˜ 둜직과 μΌκ΄€λœ 값을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이처럼 Enum은 μ½”λ“œμ˜ 가독성을 ν–₯μƒμ‹œν‚€κ³ , νƒ€μž… μ•ˆμ •μ„±μ„ 보μž₯ν•˜λ©°, 결합성을 ν–₯μƒμ‹œν‚€κ³ , ν™•μž₯μ„±κ³Ό μœ μ—°μ„±μ„ μ œκ³΅ν•˜λ©°, μ •ν™•ν•œ 값을 보μž₯ν•˜λŠ” λ“± λ‹€μ–‘ν•œ μž₯점과 ν™œμš© κ°€μΉ˜λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. Enum은 μ½”λ“œ μž‘μ„± 및 μœ μ§€λ³΄μˆ˜μ˜ νš¨μœ¨μ„±μ„ λ†’μ΄λŠ”λ° μœ μš©ν•˜λ©°, λ³΅μž‘ν•œ μƒμˆ˜ κ°’κ³Ό κ΄€λ ¨λœ λ‘œμ§μ„ 보닀 κ°„κ²°ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

Enum의 ν•œκ³„μ™€ μ£Όμ˜μ‚¬ν•­

Enum은 λ§Žμ€ μž₯점과 ν™œμš© κ°€μΉ˜λ₯Ό 가지고 μžˆμ§€λ§Œ, λͺ‡ 가지 ν•œκ³„μ™€ μ£Όμ˜μ‚¬ν•­λ„ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이에 λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. ν™•μž₯이 μ œν•œμ 

Enum은 사전에 μ •μ˜λœ μƒμˆ˜ κ°’λ“€μ˜ μ§‘ν•©μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ ν™•μž₯이 μ œν•œμ μž…λ‹ˆλ‹€. Enum은 μƒμˆ˜ 집합을 μ •μ˜ν•œ ν›„, 컴파일 μ‹œμ μ—μ„œ μ‚¬μš©ν•  값듀을 λͺ¨λ‘ μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ Enum에 μƒˆλ‘œμš΄ μƒμˆ˜ 값을 λ™μ μœΌλ‘œ μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” Enum 자체λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

2. μ™ΈλΆ€ λ°μ΄ν„°μ˜ μ²˜λ¦¬κ°€ μ œν•œμ 

Enum은 보톡 μƒμˆ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ—, μ™ΈλΆ€ λ°μ΄ν„°μ™€μ˜ μƒν˜Έμž‘μš©μ΄ μ œν•œμ μž…λ‹ˆλ‹€. Enum은 μƒμˆ˜ 값듀이 컴파일 μ‹œμ μ— κ²°μ •λ˜κΈ° λ•Œλ¬Έμ—, λŸ°νƒ€μž„μ—μ„œ 값을 λ™μ μœΌλ‘œ μ½μ–΄μ˜€κ±°λ‚˜ κ³„μ‚°ν•˜λŠ” μž‘μ—…μ„ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ 데이터λ₯Ό Enum에 직접 μ €μž₯ν•  μˆ˜λŠ” μ—†μœΌλ‚˜, Enum의 μƒμˆ˜ κ°’κ³Ό μ™ΈλΆ€ 데이터 κ°„μ˜ 맀핑을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. 곡간 μ μœ κ°€ 크닀

Enum은 μ—¬λŸ¬ 개의 μƒμˆ˜ 값을 κ°€μ§ˆ 수 있으며, μƒμˆ˜ κ°’λ‹Ή λ©”λͺ¨λ¦¬λ₯Ό μ°¨μ§€ν•˜κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ μƒμˆ˜ κ°’μ˜ κ°œμˆ˜κ°€ λ§Žμ€ 경우 Enum은 λ§Žμ€ 곡간을 μ μœ ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ¦κ°€μ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ, Enum을 μ‚¬μš©ν•˜κΈ° 전에 μƒμˆ˜ κ°’μ˜ 개수λ₯Ό κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4. μƒμˆ˜ κ°’ μˆ˜μ •μ˜ 어렀움

Enum은 λ‹€λ₯Έ ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 버전 관리 μ‹œμŠ€ν…œμ—μ„œ λ³€κ²½ 내역을 μΆ”μ ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Enum에 μƒˆλ‘œμš΄ μƒμˆ˜ 값을 μΆ”κ°€ν•˜κ±°λ‚˜, κΈ°μ‘΄ μƒμˆ˜ 값을 μˆ˜μ •ν•˜λŠ” 것은 비ꡐ적 μ–΄λ €μš΄ μž‘μ—…μΌ 수 μžˆμŠ΅λ‹ˆλ‹€. Enum 값을 μˆ˜μ •ν•˜λ©΄ ν•΄λ‹Ή Enum 값을 μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ—μ„œ 일뢀 μˆ˜μ •μ΄ ν•„μš”ν•  수 μžˆμœΌλ―€λ‘œ, Enum 값을 μˆ˜μ •ν•  λ•ŒλŠ” μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

5. 직렬화에 주의

Enum은 μ§λ ¬ν™”λ˜λ©΄, Enum μƒμˆ˜ κ°’μ˜ 이름 자체λ₯Ό μ €μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ Enum이 μˆ˜μ •λ˜μ–΄ μƒμˆ˜ κ°’μ˜ 이름이 λ³€κ²½λœ 경우, μ§λ ¬ν™”λœ 객체λ₯Ό 역직렬화할 λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 κ²½μš°μ—λŠ” 역직렬화 μ‹œ 값을 μ •ν™•ν•˜κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ μž‘μ—…μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Enum의 ν•œκ³„μ™€ μ£Όμ˜μ‚¬ν•­μ„ κ³ λ €ν•˜λ©° ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λ©΄, Enum의 μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•˜λ©΄μ„œ 문제λ₯Ό μ˜ˆλ°©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ Enum을 μ‚¬μš©ν•  λ•ŒλŠ”, μƒμˆ˜ κ°’μ˜ 개수, λ³€κ²½ κ°€λŠ₯μ„±, μ™ΈλΆ€ 데이터 연동 등을 κ³ λ €ν•˜μ—¬ μ μ ˆν•œ 섀계λ₯Ό 진행해야 ν•©λ‹ˆλ‹€.

λŒ“κΈ€