본문 바로가기
Java

[Java] Enum

by goblin- 2024. 9. 28.

**Enum(열거형)**은 자바에서 상수들의 집합을 정의하는 특별한 데이터 타입입니다. 고정된 상수 값들을 의미적으로 표현할 때 사용하며, 주로 상태나 옵션을 나타낼 때 유용합니다. enum여러 상수 값을 가질 수 있으며, 각각의 상수는 고유한 이름을 가지고 있습니다.

 

1. Enum의 기본 개념

 

**Enum**은 열거형 데이터 타입으로, 일정한 개수의 상수 값들을 정의할 수 있습니다.

일반적으로 상태, 옵션, 카테고리 등을 나타낼 때 많이 사용됩니다.

자바에서 enum클래스처럼 동작하며, 내부적으로 객체로 취급됩니다. 각 열거형 상수는 해당 Enum 타입의 인스턴스입니다.

 

예시: 기본 Enum 선언

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

여기서 DayEnum 타입이며, MONDAY, TUESDAY, WEDNESDAY 등은 상수 값입니다.

 

2. Enum의 특징

 

2.1 각 상수는 객체로 취급

 

자바에서 Enum의 각 상수는 해당 Enum 타입의 객체입니다. 즉, 상수들은 기본적으로 싱글턴 패턴을 따릅니다.

Day monday = Day.MONDAY;
Day friday = Day.FRIDAY;

System.out.println(monday);  // 출력: MONDAY
System.out.println(monday == Day.MONDAY);  // true

 

2.2 타입 안전성

 

Enum타입 안전성을 제공합니다. 즉, 열거형 상수 외에 다른 값은 할당할 수 없습니다. 이는 정의된 상수 값만 사용할 수 있도록 강제하는 기능입니다.

Day today = Day.MONDAY;
// today = "WEDNESDAY";  // 오류 발생: 열거형 타입 외의 값은 할당 불가

 

2.3 switch문과 함께 사용 가능

 

Enumswitch에서 사용할 수 있습니다. 이는 코드 가독성을 높이고, 조건에 따른 처리에 유용합니다.

public void printDayMessage(Day day) {
    switch(day) {
        case MONDAY:
            System.out.println("Start of the work week!");
            break;
        case FRIDAY:
            System.out.println("Almost the weekend!");
            break;
        case SUNDAY:
            System.out.println("Rest day!");
            break;
        default:
            System.out.println("Another regular day.");
    }
}

 

3. Enum의 메서드와 확장 기능

 

3.1 values() 메서드

 

Enum 타입은 모든 상수를 배열로 반환하는 values() 메서드를 제공합니다. 이를 통해 모든 상수를 순회할 수 있습니다.

for (Day day : Day.values()) {
    System.out.println(day);
}

 

3.2 ordinal() 메서드

 

ordinal() 메서드는 상수의 선언 순서를 나타내는 0부터 시작하는 인덱스를 반환합니다.

System.out.println(Day.MONDAY.ordinal());  // 출력: 0
System.out.println(Day.FRIDAY.ordinal());  // 출력: 4

 

3.3 name() 메서드

 

name() 메서드는 상수의 이름문자열로 반환합니다.

System.out.println(Day.MONDAY.name());  // 출력: "MONDAY"

 

3.4 valueOf() 메서드

 

valueOf() 메서드는 문자열로 상수 값을 가져올 때 사용됩니다. 이 문자열은 반드시 정확하게 상수 이름과 일치해야 합니다.

Day day = Day.valueOf("MONDAY");
System.out.println(day);  // 출력: MONDAY

 

4. Enum에 메서드 추가

 

Enum클래스처럼 동작할 수 있기 때문에, 필드메서드를 추가할 수 있습니다. 이를 통해 각 열거형 상수에 추가적인 속성을 부여할 수 있습니다.

 

예시: Enum에 필드와 메서드 추가

public enum Season {
    SPRING("Warm"), 
    SUMMER("Hot"), 
    FALL("Cool"), 
    WINTER("Cold");

    private String description;

    // 생성자
    Season(String description) {
        this.description = description;
    }

    // Getter 메서드
    public String getDescription() {
        return description;
    }
}

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

출력:

SPRING: Warm
SUMMER: Hot
FALL: Cool
WINTER: Cold

 

각 열거형 상수는 고유의 설명(description)을 가지고 있으며, 이를 메서드로 접근할 수 있습니다.

 

5. Enum의 사용 사례

 

5.1 상태 표현

 

Enum상태를 표현하는 데 유용합니다. 예를 들어, 서버의 상태, 사용자의 권한, 주문 상태 등을 Enum으로 표현할 수 있습니다.

public enum OrderStatus {
    NEW, PROCESSING, SHIPPED, DELIVERED
}

 

5.2 옵션 설정

 

Enum옵션을 제공하는 경우에도 유용합니다. 예를 들어, 정렬 방식이나 알림 설정 등을 정의할 수 있습니다.

public enum SortingOrder {
    ASCENDING, DESCENDING
}

 

6. Enum과 상속

 

자바의 Enum다른 클래스를 상속할 수 없으며(다른 클래스의 하위 클래스가 될 수 없음), 다른 클래스가 Enum상속할 수도 없습니다.

하지만, 인터페이스를 구현할 수는 있습니다.

public interface Displayable {
    void display();
}

public enum TrafficLight implements Displayable {
    RED, YELLOW, GREEN;

    @Override
    public void display() {
        System.out.println("Traffic light: " + this);
    }
}

 

7. 결론

 

Enum은 자바에서 고정된 상수 집합을 정의할 때 사용하는 특별한 데이터 타입입니다.

Enum을 사용하면 타입 안전성을 확보할 수 있고, 가독성과 유지보수성이 뛰어난 코드를 작성할 수 있습니다.

또한, 메서드필드를 추가하여 더 복잡한 기능도 제공할 수 있으며, 상수의 객체화를 통해 각 상수에 행동을 부여할 수 있습니다.

 

Enum은 특히 상태, 옵션, 설정 값 등을 표현할 때 매우 유용하게 사용됩니다.

 

 

 

+예시

 

아래는 **Enum**을 활용한 좋은 예시로, 커피 주문 시스템을 구현한 간단한 코드입니다. 이 예시에서는 커피의 종류사이즈Enum으로 정의하고, 주문 처리를 하는 구조를 보여줍니다. 이를 통해 Enum의 상수, 필드, 메서드 사용법을 이해할 수 있습니다.

 

커피 주문 시스템 예시

// 커피의 종류를 나타내는 Enum
public enum CoffeeType {
    ESPRESSO, AMERICANO, LATTE, CAPPUCCINO;
}

// 커피 사이즈를 나타내는 Enum
public enum CoffeeSize {
    SMALL(200), MEDIUM(300), LARGE(400);

    private final int milliliters;  // 각 사이즈에 대한 용량(ml)

    // 생성자
    CoffeeSize(int milliliters) {
        this.milliliters = milliliters;
    }

    // Getter 메서드
    public int getMilliliters() {
        return milliliters;
    }
}

// 커피 주문 클래스
public class CoffeeOrder {
    private CoffeeType type;
    private CoffeeSize size;

    // 생성자
    public CoffeeOrder(CoffeeType type, CoffeeSize size) {
        this.type = type;
        this.size = size;
    }

    // 주문 정보 출력 메서드
    public void printOrder() {
        System.out.println("Order: " + type + ", Size: " + size + " (" + size.getMilliliters() + "ml)");
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        // 커피 주문 생성
        CoffeeOrder order1 = new CoffeeOrder(CoffeeType.ESPRESSO, CoffeeSize.SMALL);
        CoffeeOrder order2 = new CoffeeOrder(CoffeeType.LATTE, CoffeeSize.LARGE);

        // 주문 정보 출력
        order1.printOrder();  // 출력: Order: ESPRESSO, Size: SMALL (200ml)
        order2.printOrder();  // 출력: Order: LATTE, Size: LARGE (400ml)
    }
}

설명:

 

1. CoffeeType:

커피의 종류Enum으로 정의했습니다. ESPRESSO, AMERICANO, LATTE, CAPPUCCINO와 같은 고정된 커피 종류를 제공합니다.

2. CoffeeSize:

커피의 사이즈를 나타내는 Enum으로, 각 사이즈가 고유한 **용량(milliliters)**을 가지고 있습니다.

생성자를 통해 각 상수에 밀리리터 값을 할당하고, getMilliliters() 메서드를 사용해 각 사이즈의 용량을 반환할 수 있습니다.

3. CoffeeOrder:

커피 주문을 나타내는 클래스입니다. 커피 종류사이즈를 주문에 포함하며, 이를 출력하는 메서드를 제공합니다.

4. 실행 흐름:

main 메서드에서 두 가지 커피 주문을 생성하고, 주문 정보를 출력합니다.

 

이 예시의 포인트:

 

**Enum**을 통해 고정된 상수를 의미 있게 정의하고, 관련된 속성메서드를 추가하여 더 복잡한 동작을 구현할 수 있습니다.

Enum 상수는 객체처럼 동작하며, 생성자를 통해 각 상수에 특정 값(여기서는 밀리리터)을 할당할 수 있습니다.

이 코드를 작성해보면 Enum의 기본적인 동작 방식뿐만 아니라, Enum클래스처럼 동작할 수 있는 점도 이해하게 됩니다.

'Java' 카테고리의 다른 글

[Java] 리스트(List) 와 배열(Array)의 차이점  (0) 2024.09.29
[Java] 람다 표현식(Lamda Expression)  (0) 2024.09.29
[Java] 상속 vs 합성  (0) 2024.09.28
[Java] final  (0) 2024.09.28
[Java] 추상 클래스(Abstract Class)  (0) 2024.09.28