열거형이란 무엇인가요?
열거형은 모든 인스턴스가 컴파일러에 알려진 클래스입니다. 열거형은 가능한 값이 몇 개밖에 없는 타입을 만드는 데 사용됩니다.
열거형은 클래스와 비슷하게 만들 수 있지만 class 대신 enum 키워드를 사용합니다. 본문에는 열거형 상수라고 불리는 열거형의 인스턴스 목록이 ,로 구분되어 있습니다. 열거형 상수 외부에는 열거형 인스턴스를 생성할 수 없습니다.
public enum DayOfWeek {
// enum constant are listed here:
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}모든 열거형은 암시적으로 java.lang.Enum을 확장하며 하위 클래스를 가질 수 없습니다.
열거형 액세스, 평가 및 비교하기
열거형 값은 상수로 사용할 수 있습니다. 열거형의 두 인스턴스가 동일한지 확인하기 위해 == 연산자를 사용할 수 있습니다.
DayOfWeek weekStart = DayOfWeek.MONDAY;
if (weekStart == DayOfWeek.MONDAY) {
System.out.println("The week starts on Monday.");
}열거형 값에 따라 작업을 수행하기 위해 switch를 사용할 수도 있습니다.
DayOfWeek someDay = DayOfWeek.FRIDAY;
switch (someDay) {
case MONDAY ->
System.out.println("The week just started.");
case TUESDAY, WEDNESDAY, THURSDAY ->
System.out.println("We are somewhere in the middle of the week.");
case FRIDAY ->
System.out.println("The weekend is near.");
case SATURDAY, SUNDAY ->
System.out.println("Weekend");
default ->
throw new AssertionError("Should not happen");
}스위치 표현식을 사용하면 컴파일러가 열거형의 모든 값이 처리되는지 확인할 수 있습니다. 스위치 표현식에서 가능한 값이 하나라도 누락되면 컴파일러 오류가 발생합니다. 이를 완전성(Exhaustiveness)이라고 하며, Sealed Classes를 통해 일반적인 클래스로도 구현할 수 있습니다.
DayOfWeek someDay = DayOfWeek.FRIDAY;
String text = switch (someDay) {
case MONDAY -> "The week just started.";
case TUESDAY, WEDNESDAY, THURSDAY -> "We are somewhere in the middle of the week.";
case FRIDAY -> "The weekend is near.";
case SATURDAY, SUNDAY -> "Weekend";
};
System.out.println(text);
열거형에 멤버 추가하기
열거형도 클래스와 마찬가지로 생성자, 메서드, 필드를 가질 수 있습니다. 이를 추가하려면 열거형 상수 목록 뒤에 ;를 추가해야 합니다. 생성자에 대한 인수는 열거형 상수 선언 뒤에 괄호 안에 전달됩니다.
public enum DayOfWeek {
MONDAY("MON"), TUESDAY("TUE"), WEDNESDAY("WED"), THURSDAY("THU"), FRIDAY("FRI"), SATURDAY("SAT"), SUNDAY("SUN");
private final String abbreviation;
DayOfWeek(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
}
특수 메서드
모든 열거형에는 암시적으로 추가되는 몇 가지 메서드가 있습니다.
예를 들어, name() 메서드는 모든 열거형 인스턴스에 존재하며 열거형 상수의 이름을 가져오는 데 사용할 수 있습니다. 마찬가지로 ordinal()이라는 메서드는 선언에서 열거형 상수의 위치를 반환합니다.
System.out.println(DayOfWeek.MONDAY.name()); // prints "MONDAY"
System.out.println(DayOfWeek.MONDAY.ordinal()); // prints "0" because MONDAY is the first constant in the DayOfWeek enum인스턴스 메서드 외에도 모든 열거형에 추가된 정적 메서드도 있습니다. values() 메서드는 열거형의 모든 인스턴스가 포함된 배열을 반환하며, valueOf(String) 메서드는 특정 인스턴스를 이름으로 가져오는 데 사용할 수 있습니다.
DayOfWeek[] days = DayOfWeek.values(); // all days of the week
DayOfWeek monday = DayOfWeek.valueOf("MONDAY");또한 열거형은 Comparable 인터페이스를 구현합니다. 기본적으로 열거형은 열거형 상수의 발생 순서, 즉 서수에 따라 정렬됩니다. 이를 통해 열거형 인스턴스를 비교할 수 있을 뿐만 아니라 정렬 또는 검색도 가능합니다.
public void compareDayOfWeek(DayOfWeek dayOfWeek){
int comparison = dayOfWeek.compareTo(DayOfWeek.WEDNESDAY);
if ( comparison < 0) {
System.out.println("It's before the middle of the work week.");
} else if(comparison > 0){
System.out.println("It's after the middle of the work week.");
} else {
System.out.println("It's the middle of the work week.");
}
}List<DayOfWeek> days = new ArrayList<>(List.of(DayOfWeek.FRIDAY, DayOfWeek.TUESDAY, DayOfWeek.SATURDAY));
Collections.sort(days);
열거형을 싱글톤으로 사용하기
열거형은 특정 수의 인스턴스만 가질 수 있으므로 하나의 열거형 상수만 있는 열거형을 생성하여 싱글톤을 만들 수 있습니다.
public enum SomeSingleton {
INSTANCE;
//fields, methods, etc.
}
열거형의 추상 메서드
열거형은 확장할 수 없지만 여전히 abstract 메서드를 가질 수 있습니다. 이 경우 각 열거형 상수에는 구현이 있어야 합니다.
enum MyEnum {
A() {
@Override
void doSomething() {
System.out.println("a");
}
},
B() {
@Override
void doSomething() {
System.out.println("b");
}
};
abstract void doSomething();
}
주의 사항
인스턴스 수(또는 이름)가 변경될 수 있는 열거형을 사용할 때는 주의를 기울여야 합니다. 열거형 상수가 변경될 때마다 이전 버전의 열거형을 기대하는 다른 코드가 예상대로 작동하지 않을 수 있습니다. 이는 컴파일 오류(예: 제거된 열거형 상수를 참조할 때), 런타임 오류(예: 새 열거형 상수를 별도로 처리해야 함에도 불구하고 ‘기본값’이 있는 경우) 또는 기타 불일치(예: 열거형 값을 파일에 저장한 다음 해당 값이 여전히 존재할 것으로 예상하고 읽는 경우)로 나타날 수 있습니다.
열거형 상수를 변경할 때는 해당 열거형을 사용하는 모든 코드를 검토하는 것이 좋습니다. 이는 다른 사람의 코드에서도 열거형 상수를 사용하는 경우 특히 중요합니다.
또한 코드의 한 위치에 많은 인스턴스를 나열하는 것은 유연성이 떨어질 수 있으므로 인스턴스가 많은 경우 다른 옵션을 사용하는 것도 고려해 볼 수 있습니다. 예를 들어 이런 경우에는 모든 인스턴스를 나열하고 프로그램에서 이러한 구성 파일을 읽는 구성 파일을 사용하는 것이 더 나을 수 있습니다.
결론
열거형은 클래스의 유연성을 대부분 유지하면서 고정된 상수 집합을 표현하는 간단하고 안전한 방법을 제공합니다. 열거형은 우아하고 읽기 쉬우며 유지 관리가 쉬운 코드를 작성하는 데 사용할 수 있는 특별한 타입의 클래스로, 스위치 표현식과 같은 다른 최신 기능과도 잘 작동합니다. 또 다른 특별한 클래스는 Java 19에 도입된 Record 클래스입니다. 자세한 내용은 |레코드 튜토리얼을 참조하세요.
열거형에 대해 자세히 알아보려면 java.lang.Enum 자바독을 참조하세요.