enum(열거형)은 관련된 상수들의 집합을 나타내는 JAVA의 데이터 타입이다.
기존에 여기저기 직접 값을 적어놓았던(하드코딩 된) 고정값(final static)들을 하나의 테마 아래 모은 것이다.
enum의 선언은 클래스를 선언하는 것과 비슷한데, class 대신 enum을 사용하고 클래스명 대신 테마명을 이름으로 사용한다는 점이 다르다. 대표적인 예시가 계절이다.
public enum Season {
SPRING,
SUMMER,
FALL,
WINTER
}
Season이라는 enum 안에 네 가지 계절을 상수로 정의할 수 있다. 다시말해 각 값은 특정한 계절을 나타내는 미리 정의된 상수라고 보면 된다.
뿐만 아니라 객체를 활용하듯이, 상수 각각에 관련된 정보를 함께 저장해 그 값을 활용할 수도 있다.
public enum Season {
SPRING(15, "꽃이 피어납니다"),
SUMMER(25, "덥고 습해요"),
FALL(10, "낙엽이 떨어집니다"),
WINTER(-5, "눈이 오고 추워요");
private final int averageTemp; // 평균 기온
private final String description; // 날씨 설명
// 생성자
Season(int averageTemp, String description) {
this.averageTemp = averageTemp;
this.description = description;
}
// getter 메서드들
public int getAverageTemp() {
return averageTemp;
}
public String getDescription() {
return description;
}
}
위의 코드를 보면 상수 각각에 대해 다양한 필드의 값('평균 기온', '날씨 설명')들을 저장할 수 있다. 이 때 필드를 정의하고 생성자를 만들어 주어야 한다.
그렇기 때문에 아래를 보면 값이 저장된 순서에 맞게 필드들이 선언되어 있고, 그 필드들을 인수로 받는 생성자가 있는 것을 볼 수 있다.
enum은 상수의 집합이기 때문에 중간에 값을 생성하거나 변경할 수는 없지만, getter 메서드를 통해 다른 곳에서 그 값을 가져와 활용할 수 있다.
public class Main {
public static void main(String[] args) {
Season season = Season.SUMMER;
System.out.println("여름 평균 기온 : " + season.getAverageTemp() + "°C");
System.out.println("여름 소개 : " + season.getDescription());
}
}
위의 코드는 Main 단에서 Season enum을 활용하는 예시이다. Season.SUMMER 가 하나의 객체가 된다. 따라서 getAverageTemp와 getDescription을 통해 각각 SUMMER의 '평균 기온'과 '날씨 설명'을 가져와 쓸 수 있다.
이 때 주의할 점은, new를 통해 enum 객체를 생성하지 않는다는 것이다. enum의 각 상수는 컴파일 단계에서 자동으로 인스턴스의 형태로 만들어지기 때문에, 프로그램 실행 중에 new 키워드를 통해 새 인스턴스를 만들 필요가 없다.