Java Enum (열거형) 클래스
Enum
클래스는 Java에서 열거형 타입을 정의할 때 사용되는 특별한 클래스입니다.
- 열거형 타입은 특정한 상수들의 집합을 정의하며, 이를 통해 코드의 가독성과 안정성을 높일 수 있습니다.
- 참고로
Enum
은 Java 5부터 도입된 기능으로, 특정 값만 가질 수 있는 변수를 정의할 때 유용합니다.
1. Enum 클래스의 개요
Enum
은 열거형 타입을 정의하기 위한 클래스로, 상수의 집합을 의미합니다.
- 'Enumerate'의 약자이고, 한글로는 '열거형'으로 표현합니다. 열거형은 쉽게 말해 나열한다는 뜻으로 해석하시면 됩니다.
- 예를 들어, 요일, 방향, 상태 등을 나타낼 때 유용하게 사용할 수 있습니다.
Enum
은 기본적으로 java.lang.Enum
클래스를 상속하며, 암묵적으로 final
클래스로 정의되기 때문에 다른 클래스로 확장할 수 없습니다.
Enum 선언 예시
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
- 위 예제에서
Day
는 열거형 타입으로, 이 열거형 타입은 SUNDAY
, MONDAY
등 7개의 상수 값을 가질 수 있습니다.
- 이외의 값을 쓰려는 경우,
IllegalArgumentException
이라는 오류가 발생하게 됩니다.
2. Enum 클래스의 주요 특징
Enum 클래스의 장점
- 타입 안전성: 열거형 상수 외의 값이 들어갈 가능성을 원천적으로 차단할 수 있습니다.
- 가독성: 코드에서 상수를 명확하게 표현할 수 있어, 코드 가독성이 향상됩니다.
- 유지보수성: 값의 추가나 변경이 필요할 때
Enum
클래스 내에서만 변경하면 되므로 유지보수가 용이합니다.
열거형 상수
- 열거형 상수는 모두
public static final
로 정의되며, 하나의 Enum
타입 내에서 유일한 값입니다.
- 상수들은 상속된
Enum
클래스에서 제공하는 여러 유틸리티 메서드를 사용할 수 있습니다.
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
- 위 예시는 아래 예시와 거의 같다고 보시면 됩니다.
public class DayEnum extends Enum {
public static final DayEnum SUNDAY = new DayEnum();
public static final DayEnum MONDAY = new DayEnum();
public static final DayEnum TUESDAY = new DayEnum();
public static final DayEnum WEDNESDAY = new DayEnum();
public static final DayEnum THURSDAY = new DayEnum();
public static final DayEnum FRIDAY = new DayEnum();
public static final DayEnum SATURDAY = new DayEnum();
private DayEnum() {
super();
}
}
Enum의 확장 기능
- Enum 클래스는 메서드를 추가하거나 필드를 가질 수 있습니다.
- 이를 통해 열거형 타입을 더욱 유연하게 사용할 수 있습니다.
필드와 메서드를 가지는 Enum 예시
public enum Day {
SUNDAY("휴일"),
MONDAY("평일"),
TUESDAY("평일"),
WEDNESDAY("평일"),
THURSDAY("평일"),
FRIDAY("평일"),
SATURDAY("휴일");
private final String description;
Day(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
Day day = Day.MONDAY;
System.out.println(day.getDescription());
3. Enum 클래스의 열거형 메서드
- 열거형 상수를 다루기 위해서 Enum 클래스에서 정의되어 상속으로 제공되는 메서드들입니다.
toString()
: 열거형 상수의 이름을 문자열로 반환합니다. (Object 클래스에서 오버라이딩 된 형태로, println()내부에서 변수 이름만 입력하면 상수 이름이 반환됩니다)
values()
: 모든 열거형 상수를 배열로 반환합니다.
valueOf(String name)
: 주어진 이름과 일치하는 열거형 상수를 반환합니다.
name()
: 열거형 상수의 이름을 반환합니다. (toString()
을 추가적으로 오버라이딩 한 경우에 종종 쓰일 수 있습니다.)
ordinal()
: 열거형 상수의 선언된 순서를 반환합니다. (0부터 시작)
for (Day day : Day.values()) {
System.out.println(day);
}
Day day = Day.valueOf("MONDAY");
System.out.println(day);
System.out.println(Day.SUNDAY.name());
System.out.println(Day.MONDAY.ordinal());
- 참고로
ordinal()
의 경우엔 실무에선 거의 쓰일 일이 없습니다.
- 유지보수시 데이터를 추가하면 인덱스값이 모두 바뀌게 되어서, 객체지향 프로그래밍의 의미가 거의 없어지기 때문입니다.
- 다만 고정된 순서가 중요한 경우(방향 enum의 회전, 등)에는 종종 쓰입니다.
4. Enum의 활용 예시
- Enum은 특정 값의 집합을 표현할 때뿐만 아니라, 상태나 설정 등을 명확하게 표현할 때도 유용합니다.
4.1. 상태를 표현하는 Enum 예시
public enum Status {
NEW, IN_PROGRESS, COMPLETED, CLOSED
}
Status currentStatus = Status.NEW;
switch (currentStatus) {
case NEW:
System.out.println("작업이 새로 생성되었습니다.");
break;
case IN_PROGRESS:
System.out.println("작업이 진행 중입니다.");
break;
case COMPLETED:
System.out.println("작업이 완료되었습니다.");
break;
case CLOSED:
System.out.println("작업이 종료되었습니다.");
break;
}
4.2. Enum을 활용한 설정 예시
public enum Configuration {
DEBUG(true),
LOG_LEVEL(1),
MAX_CONNECTIONS(10);
private final int value;
private final boolean flag;
Configuration(int value) {
this.value = value;
this.flag = false;
}
Configuration(boolean flag) {
this.flag = flag;
this.value = 0;
}
public int getValue() {
return value;
}
public boolean isEnabled() {
return flag;
}
}
System.out.println(Configuration.DEBUG.isEnabled());
System.out.println(Configuration.MAX_CONNECTIONS.getValue());
마무리
- Enum 클래스는 Java에서 상수의 집합을 표현할 때 강력한 도구입니다.
- 명확한 코드 작성과 안전성을 제공하며, 다양한 기능을 통해 더 유연한 설계가 가능합니다.
- 이러한 특징들 덕분에 Enum은 상태 관리, 설정 관리, 값 집합 표현 등 다양한 상황에서 널리 사용되고 있습니다.
- 다음 포스팅에서는 자바에서 날짜와 시간을 다루는 라이브러리들을 살펴보도록 하겠습니다.