Java

μžλ°” enum

devJK93 2024. 12. 9.

πŸ“ μžλ°” Enum 상세 μ„€λͺ… 및 ν™œμš© 예제

enum은 μžλ°”μ—μ„œ μ—΄κ±°ν˜• 데이터 νƒ€μž…μœΌλ‘œ, μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” μƒμˆ˜λ“€μ˜ 집합을 ν‘œν˜„ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. νƒ€μž… μ•ˆμ „μ„±μ„ 보μž₯ν•˜λ©°, μΆ”κ°€ ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆμ–΄ 맀우 μœ μš©ν•©λ‹ˆλ‹€.

1. 기본 ꡬ쑰


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

2. νŠΉμ§•

  • νƒ€μž… μ•ˆμ „μ„± 보μž₯: νŠΉμ • enum κ°’λ§Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ œν•œ.
  • 가독성 ν–₯상: μ½”λ“œμ˜ 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ 전달.
  • Switch λ¬Έμ—μ„œ μ‚¬μš© κ°€λŠ₯: 가독성과 μœ μ§€ λ³΄μˆ˜μ„±μ„ λ†’μž„.
  • λ©”μ„œλ“œμ™€ ν•„λ“œ μ •μ˜ κ°€λŠ₯: 좔가적인 데이터와 λ™μž‘μ„ 포함 κ°€λŠ₯.
  • Singleton νŒ¨ν„΄ μœ μ‚¬μ„±: enum 값은 JVMμ—μ„œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ‘œλ§Œ 쑴재.

3. enum ν™œμš© 예제

(1) κΈ°λ³Έ μ‚¬μš©


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

    public static void main(String[] args) {
        Day today = Day.FRIDAY;

        // Switch λ¬Έ μ‚¬μš©
        switch (today) {
            case MONDAY -> System.out.println("It's Monday!");
            case FRIDAY -> System.out.println("TGIF!");
            case SUNDAY -> System.out.println("Enjoy your Sunday!");
            default -> System.out.println("It's just another day.");
        }
    }
}
    

(2) λ©”μ„œλ“œ 및 ν•„λ“œ μΆ”κ°€


public enum Season {
    SPRING("Warm and Blossomy"),
    SUMMER("Hot and Sunny"),
    FALL("Cool and Breezy"),
    WINTER("Cold and Snowy");

    private final String description;

    // μƒμ„±μž
    Season(String description) {
        this.description = description;
    }

    // Getter λ©”μ„œλ“œ
    public String getDescription() {
        return description;
    }
}

public class EnumWithMethods {
    public static void main(String[] args) {
        for (Season season : Season.values()) {
            System.out.println(season + ": " + season.getDescription());
        }
    }
}
    

(3) 좔상 λ©”μ„œλ“œ κ΅¬ν˜„


public enum Operation {
    ADD {
        @Override
        public double apply(double x, double y) {
            return x + y;
        }
    },
    SUBTRACT {
        @Override
        public double apply(double x, double y) {
            return x - y;
        }
    },
    MULTIPLY {
        @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);
}

public class EnumAbstractExample {
    public static void main(String[] args) {
        double x = 10;
        double y = 2;

        for (Operation op : Operation.values()) {
            System.out.printf("%s: %.2f%n", op, op.apply(x, y));
        }
    }
}
    

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

  • values(): enum의 λͺ¨λ“  값을 λ°°μ—΄λ‘œ λ°˜ν™˜.
  • valueOf(String name): 이름에 ν•΄λ‹Ήν•˜λŠ” enum 값을 λ°˜ν™˜.
  • ordinal(): enum의 μˆœμ„œλ₯Ό λ°˜ν™˜ (0λΆ€ν„° μ‹œμž‘).
  • name(): μ—΄κ±°ν˜• 이름을 λ°˜ν™˜.

public class EnumMethods {
    public enum Color {
        RED, GREEN, BLUE
    }

    public static void main(String[] args) {
        // λͺ¨λ“  enum κ°’ 좜λ ₯
        for (Color color : Color.values()) {
            System.out.println(color + " ordinal: " + color.ordinal());
        }

        // String을 Enum으둜 λ³€ν™˜
        Color red = Color.valueOf("RED");
        System.out.println("Color: " + red.name());
    }
}
    

5. μ‹€μ œ ν™œμš© 예

μƒνƒœ 관리


public enum OrderStatus {
    PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED;
}

public class Order {
    private int orderId;
    private OrderStatus status;

    public Order(int orderId) {
        this.orderId = orderId;
        this.status = OrderStatus.PENDING; // 초기 μƒνƒœ
    }

    public void updateStatus(OrderStatus status) {
        this.status = status;
    }

    public OrderStatus getStatus() {
        return status;
    }

    public static void main(String[] args) {
        Order order = new Order(101);
        System.out.println("Initial Status: " + order.getStatus());

        order.updateStatus(OrderStatus.SHIPPED);
        System.out.println("Updated Status: " + order.getStatus());
    }
}
    

6. κ²°λ‘ 

enum은 λ‹¨μˆœνžˆ μƒμˆ˜ 집합 μ΄μƒμ˜ κΈ°λŠ₯을 μ œκ³΅ν•˜λ©°, 객체 지ν–₯적인 λ°©μ‹μœΌλ‘œ 데이터와 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ λ³΅μž‘ν•œ λ‘œμ§μ—λ„ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히, μƒνƒœ 관리, 계산 둜직, λ˜λŠ” νƒ€μž… μ•ˆμ „μ„±μ΄ μ€‘μš”ν•œ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

 


πŸ“ μžλ°” Enum은 객체처럼 λ™μž‘ν•œλ‹€!

μžλ°”μ˜ enum은 λ‹¨μˆœνžˆ μƒμˆ˜μ˜ 집합이 μ•„λ‹ˆλΌ, λ‚΄λΆ€μ μœΌλ‘œ 객체처럼 λ™μž‘ν•©λ‹ˆλ‹€. μ—΄κ±°ν˜• μƒμˆ˜(SPRING, SUMMER λ“±)λŠ” 각각 ν•΄λ‹Ή enum 클래슀의 μ‹±κΈ€ν„΄ 객체둜 κ΄€λ¦¬λ©λ‹ˆλ‹€.

1. λ‚΄λΆ€ λ™μž‘ κ°œλ…

μ•„λž˜λŠ” μžλ°” enum이 λ‚΄λΆ€μ μœΌλ‘œ λ™μž‘ν•˜λŠ” λ°©μ‹μ˜ μ˜ˆμ œμž…λ‹ˆλ‹€:


public final class Season {
    public static final Season SPRING = new Season("Warm and Blossomy");
    public static final Season SUMMER = new Season("Hot and Sunny");
    public static final Season FALL = new Season("Cool and Breezy");
    public static final Season WINTER = new Season("Cold and Snowy");

    private final String description;

    private Season(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}
    

2. enum ꡬ쑰의 μž₯점

  • νƒ€μž… μ•ˆμ „μ„±: μ—΄κ±°ν˜• μƒμˆ˜ μ™Έμ˜ 값이 μ‚¬μš©λ  κ°€λŠ₯성을 λ°°μ œν•©λ‹ˆλ‹€.
  • 객체 지ν–₯적 ν™•μž₯μ„±: ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ μΆ”κ°€ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‹±κΈ€ν„΄ νŒ¨ν„΄: μ—΄κ±°ν˜• μƒμˆ˜λŠ” JVM λ‚΄μ—μ„œ 단 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ‘œ κ΄€λ¦¬λ©λ‹ˆλ‹€.

νƒ€μž… μ•ˆμ „μ„± 예제


// 잘λͺ»λœ λ¬Έμžμ—΄ 기반 μ½”λ“œ
String season = "Sping"; // μ˜€νƒ€λ‘œ 인해 λ¬Έμ œκ°€ λ°œμƒν•  수 있음

// enum μ‚¬μš©
Season season = Season.SPRING; // 컴파일 μ‹œμ μ— 잘λͺ»λœ κ°’ 방지
    

3. 객체처럼 λ™μž‘ν•˜λŠ” μ—΄κ±°ν˜• 예제

(1) ν•„λ“œμ™€ λ©”μ„œλ“œ ν™œμš©


public enum Season {
    SPRING("Warm and Blossomy") {
        @Override
        public String getSeasonActivity() {
            return "Planting flowers";
        }
    },
    SUMMER("Hot and Sunny") {
        @Override
        public String getSeasonActivity() {
            return "Going to the beach";
        }
    },
    FALL("Cool and Breezy") {
        @Override
        public String getSeasonActivity() {
            return "Picking apples";
        }
    },
    WINTER("Cold and Snowy") {
        @Override
        public String getSeasonActivity() {
            return "Building a snowman";
        }
    };

    private final String description;

    private Season(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public abstract String getSeasonActivity();
}
    

(2) μ‚¬μš© 예제


public class EnumExample {
    public static void main(String[] args) {
        for (Season season : Season.values()) {
            System.out.println(season + ": " + season.getDescription());
            System.out.println("Activity: " + season.getSeasonActivity());
            System.out.println();
        }
    }
}
    

좜λ ₯ κ²°κ³Ό:


SPRING: Warm and Blossomy
Activity: Planting flowers

SUMMER: Hot and Sunny
Activity: Going to the beach

FALL: Cool and Breezy
Activity: Picking apples

WINTER: Cold and Snowy
Activity: Building a snowman
    

4. κ²°λ‘ 

μžλ°” enum은 λ‹¨μˆœνžˆ μƒμˆ˜λ₯Ό λ‚˜μ—΄ν•˜λŠ” 것을 λ„˜μ–΄, **객체 지ν–₯적인 방식**으둜 데이터λ₯Ό λ‹€λ£° 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 νƒ€μž… μ•ˆμ „μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λ©΄μ„œ λ³΅μž‘ν•œ λ‘œμ§λ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜λ©΄ 더 읽기 μ‰¬μš΄ μ½”λ“œμ™€ ν™•μž₯μ„± μžˆλŠ” 섀계λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

πŸ“š 좜처 : ChatGPT

λŒ“κΈ€