카테고리 없음

Enum 필드, 메서드, Switch, 실무 팁

승주우에요 2026. 1. 7. 20:45

1. Enum에 필드와 생성자 추가하기 

Enum도 클래스이다. 따라서 필드, 메서드, 생성자를 가질 수 있다

public enum OrderStatus {
    READY("결제 대기"),
    PAID("결제 완료"),
    SHIPPED("배송 중"),
    DONE("배송 완료");

    private final String description;

    OrderStatus(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}
  • Enum 생성자는 항상 private
  • 각 Enum 상수는 생성자를 통해 고유한 상태를 갖는다
  • 관련 데이터와 의미를 Enum 내부로 응집

2. Enum에 로직 넣기

public enum OrderStatus {
    READY, PAID, SHIPPED, DONE;

    public boolean isFinished() {
        return this == DONE;
    }
}

...

if(status.isFinished()){
	System.out.println("배송이 완료됨");
}
  • 조건 의미가 명확
  • 로직 중복 제거
  • 상태 변경 시 수정 범위 최소화

3. Switch 문과 Enum 활용

switch(status){
    case READY:
        System.out.println("결제를 진행해주세요.");
        break;
    case PAID:
        System.out.println("상품을 준비 중입니다.");
        break;
    case SHIPPED:
        System.out.println("배송 중입니다.");
        break;
    case DONE:
        System.out.println("주문이 완료되었습니다.");
        break;
}

Enum + Switch의 장점

  • 모든 케이스가 컴파일 타임에 체크됨
  • 누락된 case를 IDE가 경고
  • 조건문보다 가독성이 뛰어남

4. Enum + switch 리팩토링

public enum OrderStatus {
    READY {
        @Override
        public String message() {
            return "결제를 진행해주세요.";
        }
    },
    PAID {
        @Override
        public String message() {
            return "상품을 준비 중입니다.";
        }
    },
    SHIPPED {
        @Override
        public String message() {
            return "배송 중입니다.";
        }
    },
    DONE {
        @Override
        public String message() {
            return "주문이 완료되었습니다.";
        }
    };

    public abstract String message();
}

...

System.out.println(status.message());

 

5. 외부 값(DB, API)과 Enum 매핑

실무에서는 문자열이나 코드값을 Enum으로 변환해야 하는 경우가 많다

 

public enum UserRole {
	ADMIN("A"),
    USER("U"),
    GUEST("G")
    
    private final String code;
    
    UserRole(String code) {
    	this.code = code;
    }
    
    public static UserRole fromCode(String code) {
    	for (UserRole role : values()){
        	if (role.code.equals(code)) {
            	return role;
            }
        }
        throw new IllegalArgumentException("Invalid Role Code");
    }
}

 

6. 실무 관련

  • Enum은 도메인 개념을 표현한다
  • 관련 로직은 Enum 내부에 둔다
  • 외부 값 변환 책임도 Enum이 갖는다
  • switch 문이 길어진다면 Enum으로 흡수한다