✔️ 미리 정의되어 있고, 서로 관련이 있는 상수들의 집합
예시
enum Color {
RED, YELLOW, GREEN, BLUE; // 색깔
}
enum를 사용하여 Color로 특정 상수를 묶어둘 수 있으며, 또한 특정 상태를 나타낼 때 유용하다.
final static 으로도 상수를 정의할 수 있지만 enum을 사용 시 문자열과 값을 연관지어서 직관적인 표현이 가능하므로 코드의 가독성이 향상된다.
✅ 미리 정의한 상수로 값을 제한할 수 있다.
enum Color {
RED, YELLOW, GREEN, BLUE; // 색깔을 빨강, 노랑, 초록, 파랑으로 제한
}
✅ 특정 상태를 표현할 수 있다.
enum OrderStatus {
PENDING, SHIPPED, DELIVERED, CANCELED; // 배송 상태
}
✅ enum은 클래스이므로 필드와 메소드로 단순 상수 이상의 기능을 가질 수 있음
✅ 리팩토링 시 변경 범위 최소화 (enum 코드만 수정하면 된다.)
enum Color {
RED, YELLOW, GREEN, BLUE; // 색깔을 빨강, 노랑, 초록, 파랑으로 제한
}
✅ enum Color으로 색깔을 나타내는 상수를 정의하고 특정 색만 가질 수 있도록 제한할 수 있다.
enum OrderStatus {
PENDING, SHIPPED, DELIVERED, CANCELED; // 배송 상태
}
public class Main {
public static void main(String args[]) {
System.out.println(OrderStatus.PENDING.ordinal()); // 출력: 0
System.out.println(OrderStatus.SHIPPED.ordinal()); // 출력: 1
System.out.println(OrderStatus.DELIVERED.ordinal()); // 출력: 2
System.out.println(OrderStatus.CANCELED.ordinal()); // 출력: 3
OrderStatus os = OrderStatus.PENDING;
if(os.compareTo(OrderStatus.DELIVERED) < 0) // -1
System.out.println("상품이 배달 중입니다.");
}
✅ enum은 내부적으로 ordinal() 메소드가 제공되며 정의된 순서대로 인덱스를 가진다.
compareTo() 메소드를 사용하면 ordinal() 인덱스 값을 이용하여 비교가 가능하다.
-1 // PENDING(0) - SHIPPED(1) → -1
1 // SHIPPED(1) - PENDING(0) → 1
0 // DELIVERED(2) - DELIVERED(2) → 0
2 // CANCELED(3) - SHIPPED(1) → 2
✔️ enum은 흔히 상수로 정의되지만 객체처럼 동작하는 데이터 타입이기도 하다.
enum 값은 인스턴스enum Status {
SUCCESS(200, "Status: Success"), ERROR(500, "Status: Error");
private int code;
private String statusMsg;
Status(int code, String statusMsg) { // 생성자
this.code = code;
this.statusMsg = statusMsg;
}
}
enum 클래스 안에 여러 개의 필드를 선언하면, 상수 하나가 여러 의미를 동시에 가지도록 할 수 있다.
enum Status는 code와 statusMsg 두 가지 속성을 가지므로 각 상수는 HTTP 상태 코드와 상태 메세지를 동시에 표현할 수 있다.
✅ 의미 있는 이름과 연관된 값을 함께 제공하여 이해하기 더욱 쉬워짐
enum Status {
SUCCESS(200, "Status: Success") {
@Override
public void printLog() {
System.out.println("요청이 정상적으로 처리되었습니다.");
}
},
ERROR(500, "Status: Error") {
@Override
public void printLog() {
System.out.println("요청을 처리할 수 없습니다.");
}
};
private final int code;
private final String statusMsg;
// 생성자
Status(int code, String statusMsg) {
this.code = code;
this.statusMsg = statusMsg;
}
// Getter 메서드
public int getCode() {
return code;
}
public String getStatusMsg() {
return statusMsg;
}
// 추상 메서드: 각 enum 상수에서 강제 구현해야 함
public abstract void printLog();
}
enum은 클래스이기도 하므로 생성자와 메소드를 활용할 수 있다.
enum에서 abstract 로 추상메소드를 선언하면 각 상수마다 해당 메소드를 반드시 구현해야 한다.
✅ enum 정의부에서 추상 메소드를 구현
✅ 각 상수마다 서로 다른 동작을 정의할 수 있음
interface PrintLog {
void printLog();
}
enum Status implements PrintLog {
SUCCESS(200, "Status: Success") {
@Override
public void printLog() {
System.out.println("요청이 정상적으로 처리되었습니다.");
}
},
ERROR(500, "Status: Error") {
@Override
public void printLog() {
System.out.println("요청을 처리할 수 없습니다.");
}
};
private final int code;
private final String statusMsg;
// 생성자
Status(int code, String statusMsg) {
this.code = code;
this.statusMsg = statusMsg;
}
}
enum은 클래스이므로 인터페이스 상속 또한 가능하다.
✅ 미리 정의된 서로 관련이 있는 상수들의 집합
✅ 집합이 가지는 상수 값 범위를 제한할 수 있음 ➡️ 타입 안정성
✅ 상수 하나가 여러 의미를 동시에 가질 수 있음
✅ static final 상수보다 의미 있는 이름과 연관된 값을 함께 제공하여 코드의 가독성을 높일 수 있음
✅ 생성자, 메소드, 필드를 가지므로 상수에 의미와 동작을 한번에 정의할 수 있음
✅ 싱글톤 클래스로 프로그램 전역에서 동일한 enum 인스턴스에 접근 가능
✅ 추상클래스, 인터페이스를 활용하여 다형성과 높은 유연성의 코드를 작성할 수 있음
✔️ 단순 상수값 ➡️ enum을 상수값으로 사용
✔️ 상수에 동작(메소드)이 필요하다면 ➡️ enum을 객체처럼 사용
✔️ 다형성과 유연성이 필요하다면 ➡️ enum + 인터페이스 조합하여 사용
https://techblog.woowahan.com/2527/
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC