[JAVA] ENUM
by 핫도구Java에서 ENUM은 서로 관련 있는 상수들의 집합을 정의할 때 사용하는 특별한 데이터 타입이다. 단순히 정수 상수를 사용하는 것보다 훨씬 더 강력하고 안정적인 코드를 작성하게 해준다. enum은 단순한 값의 나열이 아닌, 특별한 형태의 클래스이다.
ENUM의 사용 이유
enum 등장 전, static final 상수를 사용해 관련 있는 값들을 표현했다. 이러한 방법에는 여러 단점이 존재한다.
1. 타입안정성이 없음
- 예를들어 setDat(int day) 라는 메소드가 있다고 하면 setDat(100) 처럼 유효하지 않은 값을 전달해도 컴파일 시점에서는 오류를 잡을 수 없다.
2. 가독성이 떨어짐
- if(day == 1) 보다 if(day == Day.MONDAY)가 훨씬 보기 쉽다.
3. 네임스페이스의 부재
- 상수의 이름이 중복될 수 있다. 예를들어, COMPANY_APPLE, FRUIT_APPLE
반면, Enum은 이러한 문제들을 모두 해결한다.
1. 타입 안정성 보장
- Enum 타입의 변수에는 해당 Enum에 정의된 상수만 할당할 수 있기 때문에 다른 타입의 값은 할당할 수 없어 컴파일 오류가 발생한다.
2. 높은 가독성
- 코드의 의도가 명확해진다.
3. 일관성
- 정해진 값만 사용하도록 강제하기 때문에 데이터 일관성을 유지한다.
4. 확장성
- Enum은 단순한 상수가 아니라 클래스이기 때문에 필드와 메소드를 추가하여 더 복잡한 데이터 구조를 표현할 수 있다.
Enum의 특징
1. enum으로 정의된 상수들은 해당 enum 타입의 유일한 인스턴스이다.
1. 모든 enum은 java.lagn.Enum 클래스를 상속받는다.
3. enum은 암시적으로 final이므로 상속될 수 없다.
4. enum 상수들은 public static final로 선언된다.
기본 사용법
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
위의 방법처럼 Enum을 정의할 수 있다.
Day today = Day.FRIDAY;
이런식으로 선언과 동시에 값을 할당할 수 있다.
또한 switch문을 활용해 사용한다면 가장 유용하며 case 문에서 Enum의 이름만 사용하면 된다.
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
System.out.println("월요일 입니다.");
break;
case FRIDAY:
System.out.println("금요일 입니다.");
break;
default:
System.out.println("월요일도 금요일도 아닙니다.");
break;
}
약간의 고급활용법(필드, 생성자, 메소드 추가)
Enum은 각 상수 값이 고유한 필드(데이터)와 메소드를 가지도록 만들 수 있다.
- 필드추가 : 각 열거형 상수가 가질 속성을 정의할 수 있다.
- 생성자 추가 : 필드를 초기화 해 Enum 생성자는 항상 private 이어야 하며, 외부에서 호출할 수 없다.
- 메소드 추가 : Enum이 가질 수 있는 기능을 정의한다.
아래의 예제는 각 사용자 역할에 따른 다른 권한을 갖는 Enum이다.
public enum UserRole {
ADMIN("모든 권한"),
USER("읽기/쓰기 권한"),
GUEST("읽기 전용 권한");
private final String permission;
UserRole(String permission) {
this.permission = permission;
}
public String getPermission() {
return permission;
}
public void checkPermission() {
System.out.println(this.name()+"의 권한 : "+this.permission);
}
}
public class enumExample {
public static void main(String[] args) {
UserRole userRole = UserRole.ADMIN;
System.out.println(userRole.getPermission()); // 모든 권한
userRole.checkPermission(); // ADMIN의 권한 : 모든 권한
UserRole guestRole = UserRole.GUEST;
guestRole.checkPermission(); // GUEST의 권한 : 읽기 전용 권한
}
}
이처럼 사용자에 따라 다른 권한을 부여할 수 있다.
Enum의 내장 메소드
java.lang.Enum 클래스를 암시적으로 상속받으며, 아래와 같은 유용한 내장 메소드를 제공한다.
| values() | 해당 Enum의 모든 상수를 배열로 반환한다. |
| valueOf(String name) | 주어진 문자열과 일치하는 Enum 상수를 반환하고 일치하는 상수가 존재하지 않으면 IllegalArgumentException이 발생한다. |
| name() | Enum 상수의 이름을 문자열로 반환한다.(toString()과 동일하다.) |
| ordinal() | Enum 상수가 정의된 순서를 정수 값으로 반환한다. |
public class enumExample {
public static void main(String[] args) {
for(UserRole role : UserRole.values()) {
System.out.println(role.name() + "(순서 : "+role.ordinal()+")");
}
//ADMIN(순서 : 0)
//USER(순서 : 1)
//GUEST(순서 : 2)
String rolName ="USER";
UserRole foundRole = UserRole.valueOf(rolName);
System.out.println("찾은 역할 : "+foundRole); // USER
System.out.println("권한 : "+foundRole.getPermission()); // 읽기/쓰기 권한
}
}
이처럼 각각에 맞는 역할에 맞게 내장메소드를 사용할 수 있다.
사용 시 주의사항
ordinal() 메소드에 의존하는 코드는 enum 상수의 순서가 바뀌면 문제가 발생할 수 있기 때문에 피해야 한다. 또한, enum은 상속이 불가능하므로 확장성이 필요한 경우 부적합할 수 있다. 그리고 enum 상수가 많아지면 메모리 사용량이 증가할 수 있기 때문에 고려해야 한다.
이처럼, enum은 단순해보이지만, 강력한 기능을 제공하는 enum을 적절히 활용하면 더 안전하고 읽기 쉬운 코드를 작성할 수 있다. 특히, 상수 집합을 다루는 상황에서 enum 사용을 고려해보는 것이 좋아보인다.
다음에는 날짜와 시간 API에 대해 알아볼 예정이다.
'JAVA > MID' 카테고리의 다른 글
| [JAVA] 날짜와 시간 조작하기 (0) | 2025.09.05 |
|---|---|
| [JAVA] 날짜와 시간 API (0) | 2025.09.03 |
| [JAVA] Wrapper 클래스 (1) | 2025.08.27 |
| [JAVA] 컬렉션 프레임워크_Map (1) | 2025.08.25 |
| [JAVA] 컬렉션 프레임워크_Set (1) | 2025.08.21 |
블로그의 정보
AquaMan
핫도구