enum이란?
- enumeration(열거형)의 줄임말로, 고정된 상수 집합을 표현하기 위한 특수한 클래스이다.
- 내부적으로 각각의 상수가 public static final 객체로 생성된다.
예제
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
// Day.MONDAY로 사용
심화 예제
- 속성 지정
- 상수에 할당할 값은 private final 로 선언
- 사용자 정의 생성자 선언
- 생성자 호출로 enum 상수 정의
enum Day {
// 생성자 호출
MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);
private final int value; // 각 상수에 할당할 값
// 생성자
Day(int value) {
this.value = value;
}
// 값을 반환하는 메서드
public int getValue() {
return value;
}
}
public class Main {
public static void main(String[] args) {
Day today = Day.FRIDAY;
System.out.println(today.getValue()); // 출력: 5
}
}
enum ResponseStatus {
// 생성자 호출
SUCCESS(200, "Request successful"),
BAD_REQUEST(400, "Bad request"),
UNAUTHORIZED(401, "Unauthorized access"),
FORBIDDEN(403, "Forbidden access"),
NOT_FOUND(404, "Resource not found"),
INTERNAL_SERVER_ERROR(500, "Internal server error");
private final int code; // HTTP 상태 코드
private final String message; // 메시지
// 생성자
ResponseStatus(int code, String message) {
this.code = code;
this.message = message;
}
// Getter 메서드들
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
// 응답 정보 출력
public void displayResponseInfo() {
System.out.println("Code: " + code + ", Message: " + message);
}
}
public class Main {
public static void main(String[] args) {
ResponseStatus success = ResponseStatus.SUCCESS;
success.displayResponseInfo();
// 출력:
// Code: 200, Message: Request successful
}
}
enum의 필요성
enum은 Java 5 (2004년) 부터 도입되었다.
타입 안정성이 부족했던 기존 방식
- 정수값이라 의미 파악이 어려움 (3이 무슨 요일이지?)
- 잘못된 값도 허용됨 (day = 99; 컴파일러가 못 잡아냄)
- switch-case나 조건문에서 실수하기 쉬움
public class Day {
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
}
객체처럼 활용하고 싶을 때
- 기존 상수는 값만 표현할 수 있었지만, enum은 객체처럼 필드, 생성자, 메서드를 가질 수 있다.
enum Status {
READY(1), RUNNING(2), COMPLETED(3);
private final int code;
Status(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
enum의 주요 메서드
values(): enum[]
- 해당 enum의 모든 상수들을 배열로 반환
enum Color {
RED, GREEN, BLUE
}
public class Main {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c);
}
}
}
// 출력 결과
RED
GREEN
BLUE
valueOf(String): enum
- 문자열을 enum 상수로 변환 (! 정확히 일치해야 하며, 대소문자를 구분한다)
Color color = Color.valueOf("RED");
System.out.println(color); // 출력: RED
// 예외 상황 (존재하지 않는 값)
Color color = Color.valueOf("Yellow"); // 예외 발생: IllegalArgumentException
ordinal(): int
- enum 상수가 선언된 순서(index) 를 반환 (0부터 시작)
Color color = Color.BLUE;
System.out.println(color.ordinal()); // 출력: 2
name(): String
- 선언된 이름을 문자열로 반환
- toString()과 비슷하지만, name()은 항상 정확히 선언된 이름을 반환한다.
- toString()은 오버라이드 가능하지만 name()은 고정
enum Direction {
NORTH, EAST, SOUTH, WEST
}
public class Main {
public static void main(String[] args) {
Direction d = Direction.SOUTH;
System.out.println(d.name()); // 출력: SOUTH
}
}
compareTo(): int
- 열거 객체를 비교해서 순번 차이를 리턴
- 내부적으로는 ordinal() 값끼리 뺀 결과
- 정렬 또는 순서 비교에 유용하다.
for (Direction d : Direction.values()) {
System.out.printf("%s (ordinal=%d)\n", d.name(), d.ordinal());
}
// 출력 결과
NORTH (ordinal=0)
EAST (ordinal=1)
SOUTH (ordinal=2)
WEST (ordinal=3)
사용자 정의 메서드도 구현 가능하다.
언제 enum을 쓰면 좋을까?
- 고정된 옵션들이 필요한 경우 (요일, 상태, 권한 등)
- switch-case나 비교가 자주 일어나는 값들
- 문자열이나 숫자 대신 의미 있는 이름을 부여하고 싶을 때
- 타입 안정성과 가독성을 높이고 싶을 때
enum 을 switch-case 에 사용하는 예제
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Main {
public static void main(String[] args) {
Day today = Day.SUNDAY;
switch (today) {
case MONDAY:
System.out.println("월요일: 새로운 한 주의 시작!");
break;
case FRIDAY:
System.out.println("금요일: 불금입니다 🎉");
break;
case SATURDAY:
case SUNDAY:
System.out.println("주말: 푹 쉬세요 😴");
break;
default:
System.out.println("평일입니다. 파이팅!");
}
}
}
// switch 표현식 사용
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Main {
public static void main(String[] args) {
Day today = Day.SUNDAY;
String message = switch (today) {
case MONDAY -> "월요일: 새로운 한 주의 시작!";
case FRIDAY -> "금요일: 불금입니다 🎉";
case SATURDAY, SUNDAY -> "주말: 푹 쉬세요 😴";
default -> "평일입니다. 파이팅!";
};
System.out.println(message);
}
}
'Java > 문법' 카테고리의 다른 글
가변 인자 (...) (0) | 2025.04.29 |
---|---|
String.split() 문자열 자르기, 나누기 (0) | 2025.04.22 |
어노테이션(Annotation) (0) | 2025.04.21 |
유틸리티 클래스 (Utility Class) (1) | 2025.04.18 |
switch 표현식 (Switch Expression) (0) | 2025.04.18 |