본문 바로가기
IT/Java

[Java] Enum을 똑똑하게 사용하는 실무 패턴 정리

by eddie_factory 2025. 5. 25.
반응형

✅ 왜 Enum을 잘 써야 할까요?

Java의 enum은 단순히 상수를 나열하는 기능을 넘어서,
비즈니스 로직과 상태를 안전하게 표현할 수 있는 강력한 도구입니다.

하지만 많은 코드에서는 여전히 if (type == A)와 같은 방식으로만 사용되고 있습니다.
이번 글에서는 실무에서 Enum을 더 똑똑하게 사용하는 방법을 정리하였습니다.

✅ 1. 기본적인 Enum 선언

public enum OrderStatus {
    READY, PAID, SHIPPED, CANCELED
}

가장 기본적인 상태 표현 방법입니다.
실무에서는 코드, 설명, DB 값 등 추가 정보가 필요한 경우가 많습니다.

✅ 2. 필드와 생성자 추가하기 (코드 + 설명 포함)

public enum OrderStatus {
    READY("R", "결제대기"),
    PAID("P", "결제완료"),
    SHIPPED("S", "배송중"),
    CANCELED("C", "취소됨");

    private final String code;
    private final String description;

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

    public String getCode() { return code; }
    public String getDescription() { return description; }
}

OrderStatus.PAID.getCode()를 통해 "P"를,
getDescription()을 통해 "결제완료"를 가져올 수 있습니다.

✅ 3. 코드로 역변환하는 fromCode 메서드

public static OrderStatus fromCode(String code) {
    return Arrays.stream(OrderStatus.values())
        .filter(v -> v.getCode().equals(code))
        .findFirst()
        .orElseThrow(() -> new IllegalArgumentException("Unknown code: " + code));
}

데이터베이스에서 읽어온 코드 값을 Enum으로 변환할 때 유용합니다.

✅ 4. Enum과 전략 패턴을 결합한 예시

public enum DiscountPolicy {
    NONE {
        public int apply(int amount) { return amount; }
    },
    FIXED {
        public int apply(int amount) { return amount - 1000; }
    },
    RATE {
        public int apply(int amount) { return (int)(amount * 0.9); }
    };

    public abstract int apply(int amount);
}

Enum을 추상 메서드와 함께 사용하면 상태와 행동을 함께 정의할 수 있습니다.
전략 패턴을 간단하게 구현하는 좋은 방식입니다.

❌ 자주 보이는 안티패턴

if (status.equals(OrderStatus.READY)) {
    ...
} else if (status.equals(OrderStatus.PAID)) {
    ...
}

상태가 많아질수록 if-else 문이 늘어나고 유지보수가 어려워집니다.
Map<Enum, Function> 또는 Enum 내부에 로직을 위임하는 구조가 더 적절합니다.

 

✅ 정리: 언제 Enum을 사용해야 할까요?

상황 사용 권장 여부 설명
단순한 상태 표현 ✅ 사용 권장 상수를 명확히 표현 가능
코드와 설명이 필요한 경우 ✅ 사용 권장 필드와 생성자 확장 가능
상태별 로직 분기 ✅ 사용 권장 추상 메서드로 다형성 구현 가능
if/else 분기 처리 ❌ 지양 유지보수 어려움, 구조적 개선 필요

마무리

Enum은 단순한 값 나열이 아닌,
"상태 + 의미 + 로직"을 함께 담을 수 있는 타입 안전한 구조체입니다.

잘 설계된 Enum은 복잡한 조건문을 줄이고,
서비스의 유효 상태를 안전하고 명확하게 정의할 수 있도록 도와줍니다.
이번 글을 통해 실무에서 enum을 어떻게 더 효과적으로 사용할 수 있을지 감을 잡으셨기를 바랍니다.

반응형

댓글