[TIL] Java Enum

YJin·2025년 3월 13일

1. Enum 란?

✔️ 미리 정의되어 있고, 서로 관련이 있는 상수들의 집합


예시

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 코드만 수정하면 된다.)


2. 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



3. 객체?

✔️ 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 StatuscodestatusMsg 두 가지 속성을 가지므로 각 상수는 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은 클래스이므로 인터페이스 상속 또한 가능하다.

  • 유지보수가 쉬워짐
  • 인터페이스 타입으로 다루어 코드의 유연성이 높아짐



4. 정리

상수로 사용

✅ 미리 정의된 서로 관련이 있는 상수들의 집합

✅ 집합이 가지는 상수 값 범위를 제한할 수 있음 ➡️ 타입 안정성

✅ 상수 하나가 여러 의미를 동시에 가질 수 있음

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

profile
백엔드 개발도 락이다

0개의 댓글