여러 상수를 묶어 하나의 타입으로 정의한 것
즉, 상수들의 열거(enumeration)
요일, 상태 등 고정된 값들로 구성된 데이터 타입을 만들 때 사용됨
기존 인터페이스나 클래스 내에서 상수를 선언하여 상수를 관리했는데
클래스 내 선언하는 부분은 네이밍이 겹칠 가능성이 있으며 불필요하게 상수가 많아질 수 있음
인터페이스로 관리하는 경우엔 이러한 단점이 줄어들지만
IDE의 지원을 적극적으로 받을 수 없으며 타입 안정성이 떨어지는 단점이 존재
👉 이를 보완하기 위해 나온것이 Enum
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
상속 불가능
내장 메소드 제공
public enum Day {
MONDAY, TUESDAY, WEDNESDAY
}
public class EnumMethodsTest {
public static void main(String[] args) {
for (Day day : Day.values()) {
System.out.println("Name: " + day.name());
System.out.println("Ordinal: " + day.ordinal());
}
Day specificDay = Day.valueOf("MONDAY");
System.out.println("Specific Day: " + specificDay);
}
}
// 반환결과
Name: MONDAY
Ordinal: 0
Name: TUESDAY
Ordinal: 1
Name: WEDNESDAY
Ordinal: 2
Specific Day: MONDAY
ordinal() :
ordinal()는 상수의 순서가 변경될 시 값이 달라질 수 있어 코드의 동작이 변경될 위험이 있음
상수 이름 :
Enum 상수의 이름을 변경하면 참조하는 모든 코드가 영향을 받음
불필요한 상수 추가x :
Enum에 상수를 지나치게 많이 추가한다면 가독성과 유지보수가 떨어짐
데이터가 많을 경우엔 DB나 설정 파일로 관리하는 것을 추천
비교 :
Enum의 상수는 싱글톤이므로 값을 비교할 때 == 를 사용하는 것을 추천
name()이나 toString() 값으로 비교시 버그가 생길 우려가 있음
메모리 :
Enum 상수는 JVM에 의해 캐싱되므로 너무 많은 상수를 정의하거나 메모리 집약적인 필드를 추가하면 메모리 사용량이 증가할 수 있음