TIL #13 Enum

HYEON JIN CHOI·2024년 5월 8일

1. 기본 개념

Enum 은 열거형이라고 불리며, '열거하다', '나열하다' 등을 의미한다.
Enum 은 서로 관련된 상수들을 모아 표현하는 타입이다. 예를 들어 요일이나, 계절과 같은 것이 Enum 으로 표현될 수 있다. 모든 요일은 '일주일'이라는 한 범주 안에서 명확한 의미를 가지며, 각각 다른 날을 나타낸다.

Java 에서 Enum 은 클래스와 유사하게 동작한다. 그렇지만 일반 클래스와는 달리, Enumenum 키워드를 사용해 정의되고, 고정된 상수들의 집합으로 이루어진다. 그래서 Enum 을 사용하면 코드의 가독성이 좋아지고, 실수로 잘못된 값을 할당하는 오류를 줄일 수 있다.

Enum 은 각 상수가 객체로 취급되며, Java 의 모든 객체와 마찬가지로 필드와 메서드를 가질 수 있다. 따라서 상태와 행동을 모두 캡슐화할 수 있다.

2. 사용 방법

2.1. 기본 Enum 선언 및 사용

enum Season {
    SPRING, SUMMER, FALL, WINTER
}

이렇게 선언된 Season 이라는 EnumSeason.SPRING, Season.SUMMER 등을 통해 접근할 수 있다.
각 상수는 Season 타입의 인스턴스로, 순서대로 0, 1, 2, 3 이라는 값을 부여받는다.

2.2. 사용자 정의 값 부여

JavaEnum 은 사용자가 직접 값을 할당할 수도 있다. 각 Enum 상수에 특정한 값을 저장하는 것이다. 예를 들어, 각 계절에 특정 온도를 할당하고 싶다면 다음과 같이 할 수 있다.

enum Season {
    SPRING(15),
    SUMMER(30),
    FALL(10),
    WINTER(-5);

	// 정수를 저장할 필드
    private final int value;

    // Enum 생성자
    Season(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

괄호 내 값을 사용하려면, 인스턴스 변수와 생성자를 작성해야 한다.
생성자는 묵시적으로 private 라는 제어자를 가지므로, 외부에서 객체를 생성할 수 없다.

2.3. values() 메서드

Enum 내에는 여러 메서드가 내장되어있다. 그 중에서 values() 라는 메서드는 컴파일 타임에 자동으로 생성되며 Enum 클래스의 모든 상수를 포함하는 배열을 반환한다.

이를 다음과 같은 상황에서 사용해볼 수 있다.

public class Main {

    public static void guessSeasonByTemperature(Season season) {
        int avgTemp = season.getValue();

        if (avgTemp >= 25) {
            System.out.println("여름");
        } else if (avgTemp >= 15 && avgTemp < 25) {
            System.out.println("봄");
        } else if (avgTemp >= 5 && avgTemp < 15) {
            System.out.println("가을");
        } else {
            System.out.println("겨울");
        }
    }

    public static void main(String[] args) {
        for (Season season : Season.values()) {
            guessSeasonByTemperature(season);
        }
    }
}

위 예제에서는 main 메서드에서 Season 의 모든 상수를 돌며,
guessSeasonByTemperature() 메서드를 호출하고 있다.
guessSeasonByTemperature() 메서드에서는 Season의 메서드인 getValue() 를 사용하여
매개변수로 받은 Enum 상수의 값을 구한다.

3. 회고

Enum을 잘 활용한다면 코드의 가독성과 유지보수성이 향상되고 타입 안정성도 개선될 수 있기 때문에
충분히 숙지하는 것이 도움이 될 것이라 생각한다.

0개의 댓글