Enum 은 열거형이라고 불리며, '열거하다', '나열하다' 등을 의미한다.
Enum 은 서로 관련된 상수들을 모아 표현하는 타입이다. 예를 들어 요일이나, 계절과 같은 것이 Enum 으로 표현될 수 있다. 모든 요일은 '일주일'이라는 한 범주 안에서 명확한 의미를 가지며, 각각 다른 날을 나타낸다.
Java 에서 Enum 은 클래스와 유사하게 동작한다. 그렇지만 일반 클래스와는 달리, Enum 은 enum 키워드를 사용해 정의되고, 고정된 상수들의 집합으로 이루어진다. 그래서 Enum 을 사용하면 코드의 가독성이 좋아지고, 실수로 잘못된 값을 할당하는 오류를 줄일 수 있다.
Enum 은 각 상수가 객체로 취급되며, Java 의 모든 객체와 마찬가지로 필드와 메서드를 가질 수 있다. 따라서 상태와 행동을 모두 캡슐화할 수 있다.
enum Season {
SPRING, SUMMER, FALL, WINTER
}
이렇게 선언된 Season 이라는 Enum은 Season.SPRING, Season.SUMMER 등을 통해 접근할 수 있다.
각 상수는 Season 타입의 인스턴스로, 순서대로 0, 1, 2, 3 이라는 값을 부여받는다.
Java 의 Enum 은 사용자가 직접 값을 할당할 수도 있다. 각 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 라는 제어자를 가지므로, 외부에서 객체를 생성할 수 없다.
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 상수의 값을 구한다.
Enum을 잘 활용한다면 코드의 가독성과 유지보수성이 향상되고 타입 안정성도 개선될 수 있기 때문에
충분히 숙지하는 것이 도움이 될 것이라 생각한다.