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으로 흡수한다