Java Enum
java
백기선님의 스터디 11주차 과제
enum 정의하는 방법
Enum은 열거형(enumeration)을 나타내는 특별한 데이터 유형으로 상수의 집합으로 구성되며, 주로 연관된 상수 그룹을 정의하는 데 사용된다.
// 선언
enum Season {
SPRING, SUMMER, FALL, WINTER
}
// 사용
public class EnumEx {
public static void main(String[] args) {
printSeason(Season.SPRING);
}
public static void printSeason(Season season) {
switch (season) {
case SPRING -> System.out.println("봄");
case SUMMER -> System.out.println("여름");
case FALL -> System.out.println("가을");
case WINTER -> System.out.println("겨울");
default -> throw new IllegalArgumentException("계절의 이름이 아닙니다.");
}
}
}
// 실행 결과
봄
enum의 특징
- enum에 정의된 상수들은 해당 enum type의 객체이다.
- C와 같은 언어에서 enum이 존재하지만, Java의 enum은 단순 정수 값이 아닌 enum type의 객체이다.
- 생성자와 메서드를 가질 수 있다.
- enum은 엄연한 클래스로 생성자와 메서드를 가질 수 있다.
enum Currency { PENNY(1), NICKLE(5), DIME(10), QUARTER(25); private int value; Currency(int value) { this.value = value; } public int value() { return value; } }
enum 사용 이유
- enum의 상수 값 정의는 의미있는 이름을 사용하기 때문에 코드의 가독성이 향상된다.
- 상수 값을 직접 사용하는 대신 enum 상수를 사용하면 보다 이해하기 쉽다.
- 열거된 값만을 허용하도록 컴파일러가 상수 값의 유효성을 검사하여 잘못된 값이나 타입 오류를 방지할 수 있다.
- 연관된 상수 값을 묶어 하나의 유닛으로 정의할 수 있다.
- 이는 관련된 상수 값들을 그룹화하고, 함께 사용되어야 하는 값들이 함께 유지될 수 있다.
- 컴파일 타임에 모든 상수 값을 알고 있으므로 런타임 중에 예상치 못한 값이나 오류가 발생하는 것을 방지할 수 있다.
- API에서 고정된 상수 값을 나타내는 데 사용될 수 있다.
- 예를 들어 HTTP 상태 코드나 애플리케이션의 설정 상태 등을 enum으로 정의하여 사용하면 API 사용자가 상수 값의 의미를 이해하기 쉬워진다.
enum이 제공하는 메서드
- T[] values() : 해당 enum 타입에 정의된 상수 배열을 반환한다.
- T valueOf(Class enumType, String name) : 지정된 enum에서 name과 일치하는 열거형 상수를 반환한다.
- int ordinal() : enum 상수가 정의된 순서를 반환한다.
- String name() : enum 상수의 이름을 문자열로 반환한다.
- Class
getDeclaringClass() : enum의 객체를 반환한다.
enum Season {
SPRING, SUMMER, FALL, WINTER;
}
public class EnumEx {
public static void main(String[] args) {
for (var season : Season.values()) {
System.out.println(season.name());
}
}
}
// 실행 결과
SPRING
SUMMER
FALL
WINTER
java.lang.Enum
public abstract class Enum<E extends Enum<E>>
implements Constable, Comparable<E>, Serializable {
private final String name;
private final String name() {
return name;
}
...
}
- java.lang에 포함된 Enum 클래스는 모든 Java Enum의 조상이다.
- 모든 enum은 Enum 클래스를 상속받기 때문에 enum type은 별도의 상속을 받을 수 없다.
EnumSet
EnumSet 열거형을 위해 특별히 설계된 Set 인터페이스 구현체로 특징은 다음과 같다.
- EnumSet은 Abstract 클래스를 상속하고 Set 인터페이스를 구현한다.
- 오직 Enum 상수만을 값으로 가질 수 있으며, 모든 값은 같은 enum type이어야 한다.
- null value를 허용하지 않으며, NullPointerException throw도 허용하지 않는다.
- ordinal 값의 순서대로 요소가 저장된다.
- thread-safe하지 않아 동기화가 필요하다.
참고자료
- https://www.geeksforgeeks.org/enumset-class-java/ - EnumSet
- https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html - java docs