ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java Enum
    LANGUAGE/Java, Spring 2024. 12. 3. 19:32

     

    1. Enum이란 무엇인가?

    정의

    • Enum(열거형)은 관련된 상수들의 집합을 의미합니다.
    • Java에서 Enum은 클래스처럼 보이지만, 특정 값들을 제한된 범위 내에서 정의할 때 사용됩니다.
    • Enum은 public, static, final의 특성을 가지며, 상수들은 대문자로 표기하는 것이 일반적입니다.

    특징

    • Enum은 각 상수가 고유의 인스턴스를 가지는 특별한 클래스입니다.
    • Enum은 타입 안전성을 보장하며, 코드의 가독성과 유지 보수성을 높입니다.

    2. Enum의 기본 사용법

    선언

    public enum Weekday {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }
    • Enum은 enum 키워드를 사용하여 선언합니다.
    • 각 상수들은 콤마(,)로 구분되며, 마지막 상수 뒤에는 세미콜론(;)이 필요 없습니다.

    사용

    public class EnumExample {
        public static void main(String[] args) {
            Weekday today = Weekday.MONDAY;
            System.out.println("Today is: " + today);
        }
    }
    • Enum 타입의 변수를 선언하고, 해당 변수를 Enum 상수로 초기화할 수 있습니다.
    • System.out.println으로 Enum 상수를 출력하면 해당 상수의 이름이 출력됩니다.

    3. Enum의 메서드와 속성

    주요 메서드

    • values(): Enum의 모든 상수를 배열로 반환합니다.
    • valueOf(String name): 지정된 이름과 일치하는 Enum 상수를 반환합니다. 대소문자를 구분합니다.
    • ordinal(): Enum 상수가 선언된 순서를 반환합니다(0부터 시작).

    예제

    public class EnumMethodsExample {
        public static void main(String[] args) {
            // values() 메서드 사용
            Weekday[] days = Weekday.values();
            for (Weekday day : days) {
                System.out.println(day);
            }
    
            // valueOf() 메서드 사용
            Weekday day = Weekday.valueOf("FRIDAY");
            System.out.println("Day: " + day);
    
            // ordinal() 메서드 사용
            int order = Weekday.MONDAY.ordinal();
            System.out.println("Monday's order: " + order);
        }
    }
    • values() 메서드를 통해 Enum의 모든 상수를 반복할 수 있습니다.
    • valueOf() 메서드를 통해 문자열을 Enum 상수로 변환할 수 있습니다.
    • ordinal() 메서드를 통해 Enum 상수의 순서를 확인할 수 있습니다.

    4. Enum과 switch 문

    switch 문에서 Enum 사용

    • Enum을 switch 문의 case 레이블로 사용할 수 있습니다.
    • 각 case는 Enum 상수를 사용합니다.

    예제

    public class EnumSwitchExample {
        public static void main(String[] args) {
            Weekday today = Weekday.WEDNESDAY;
    
            switch (today) {
                case MONDAY:
                    System.out.println("Start of the work week");
                    break;
                case WEDNESDAY:
                    System.out.println("Midweek");
                    break;
                case FRIDAY:
                    System.out.println("End of the work week");
                    break;
                default:
                    System.out.println("Weekend");
                    break;
            }
        }
    }
    • switch 문을 사용하여 각 상수에 대한 로직을 분리할 수 있습니다.
    • Enum과 switch 문을 함께 사용하면 코드의 가독성을 높일 수 있습니다.

    5. Enum의 고급 기능

    필드와 생성자 추가

    • Enum에 필드, 생성자, 메서드를 추가하여 더 많은 기능을 구현할 수 있습니다.

    예제

    public enum Weekday {
        MONDAY("월요일"), 
        TUESDAY("화요일"), 
        WEDNESDAY("수요일"), 
        THURSDAY("목요일"), 
        FRIDAY("금요일"), 
        SATURDAY("토요일"), 
        SUNDAY("일요일");
    
        private String korean;
    
        // 생성자
        Weekday(String korean) {
            this.korean = korean;
        }
    
        public String getKorean() {
            return korean;
        }
    }
    
    public class AdvancedEnumExample {
        public static void main(String[] args) {
            Weekday today = Weekday.MONDAY;
            System.out.println("Today is: " + today.getKorean());
        }
    }
    • 각 Enum 상수는 생성자를 통해 특정 값을 가질 수 있습니다.
    • 생성자는 자동으로 private으로 선언되며, Enum 상수에 대한 추가 정보를 저장할 수 있습니다.
    • 추가된 필드와 메서드를 통해 Enum 상수에 대한 더 많은 기능을 제공합니다.

    6. Enum의 활용 사례

    상태 관리

    • Enum은 상태를 관리하는 데 유용합니다. 예를 들어, 주문 상태, 트래픽 신호 상태 등을 Enum으로 정의할 수 있습니다.

    예제

    public enum OrderStatus {
        PENDING, PROCESSING, SHIPPED, DELIVERED
    }
    
    public class Order {
        private int id;
        private OrderStatus status;
    
        public Order(int id) {
            this.id = id;
            this.status = OrderStatus.PENDING;
        }
    
        public void nextStatus() {
            switch (status) {
                case PENDING:
                    status = OrderStatus.PROCESSING;
                    break;
                case PROCESSING:
                    status = OrderStatus.SHIPPED;
                    break;
                case SHIPPED:
                    status = OrderStatus.DELIVERED;
                    break;
                default:
                    System.out.println("Order is already delivered.");
            }
        }
    
        public OrderStatus getStatus() {
            return status;
        }
    }
    
    public class OrderExample {
        public static void main(String[] args) {
            Order order = new Order(1);
            System.out.println("Order status: " + order.getStatus());
            order.nextStatus();
            System.out.println("Order status: " + order.getStatus());
            order.nextStatus();
            System.out.println("Order status: " + order.getStatus());
        }
    }
    • 이 예제에서는 OrderStatus라는 Enum을 사용하여 주문의 상태를 관리합니다.
    • 각 상태 전환을 nextStatus() 메서드를 통해 쉽게 구현할 수 있습니다.

    교통 신호 예제

    public enum TrafficSignal {
        RED("멈추세요"), 
        YELLOW("주의하세요"), 
        GREEN("가세요");
    
        private String message;
    
        TrafficSignal(String message) {
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    }
    
    public class TrafficSignalExample {
        public static void main(String[] args) {
            TrafficSignal signal = TrafficSignal.RED;
            System.out.println("Signal: " + signal + " - " + signal.getMessage());
    
            signal = TrafficSignal.GREEN;
            System.out.println("Signal: " + signal + " - " + signal.getMessage());
        }
    }
    • TrafficSignal Enum을 통해 교통 신호의 상태를 관리하고, 각 상태에 대한 메시지를 제공할 수 있습니다.

    7. Enum의 내부 구현

    Enum 클래스의 내부

    • Enum 클래스는 java.lang.Enum 클래스를 상속받습니다.
    • 모든 Enum은 java.lang.Enum 클래스를 상속하므로 여러 가지 유용한 메서드를 제공합니다.

    Enum의 상속과 인터페이스 구현

    • Enum은 다른 클래스나 Enum을 상속할 수 없습니다.
    • 하지만 인터페이스를 구현할 수 있습니다.

    예제

    public interface Displayable {
        void display();
    }
    
    public enum Planet implements Displayable {
        MERCURY, VENUS, EARTH, MARS;
    
        @Override
        public void display() {
            System.out.println(this.name() + " is displayed.");
        }
    }
    
    public class PlanetExample {
        public static void main(String[] args) {
            Planet planet = Planet.EARTH;
            planet.display();
        }
    }
    • 이 예제에서는 Displayable 인터페이스를 구현하여 각 행성 Enum 상수에 display() 메서드를 추가합니다.

    8. Enum의 기타 기능

    열거형 상수의 메서드 오버라이드

    • 각 Enum 상수에 대해 고유한 메서드를 정의할 수 있습니다.

    예제

    ```java
    public enum Operation {
    ADD {
    @Override
    public int apply(int x, int y) {
    return x + y;
    }
    },
    SUBTRACT {
    @Override
    public int apply(int x, int y) {
    return x - y;
    }
    },
    MULTIPLY {
    @Override
    public int apply(int x, int y) {
    return x * y;
    }
    },
    DIVIDE {
    @Override
    public int apply(int x, int y) {
    return x / y;
    }
    };

    public abstract int apply(int x, int y);

    }

    public class OperationExample {
    public static void main(String[] args) {
    int a = 6, b = 2;
    System.out.println("Add: " + Operation.ADD.apply(a, b));
    System

     

    'LANGUAGE > Java, Spring' 카테고리의 다른 글

    JSTL, EL 문법 정리  (1) 2024.12.03
    mvc2( java, jsp, mybatis)  (0) 2024.12.02
    Java의 정석 정리 (06장)  (0) 2024.12.02
    Java의 정석 정리 (05장)  (0) 2024.12.02
    Java의 정석 정리 (04장)  (1) 2024.12.02
Designed by Tistory.