9osari.log
← 목록으로

[JAVA] ENUM - 열거형

2025년 5월 13일 · #java#김영한-java-중급

열거형 - ENUM

열거형(Enum Type)을 이해하기 위한 예제를 만들어보자

고객을 3개의 등급으로 나누고, 상품 구매 시 등급별로 할인을 적용한다. (소수점 버림)

할인등급을 String 으로 표현했을 때의 문제점

discount("GOLD", 10000);       // 정상
discount("gold", 10000);       // 오타
discount("VIP", 10000);        // 존재하지 않는 등급

public int discount(int price) {
    return price * discountPercent / 100;
}

문자열 상수(public static final) 사용

public class StringGrade {
    public static final String BASIC = "BASIC";
    public static final String GOLD = "GOLD";
    public static final String DIAMOND = "DIAMOND";
}

장점

문제

타입 안전 열거형 패턴 (Type-Safe Enum Pattern)

문자열을 대신해 타입으로 상태를 표현

열거 가능한 상태를 직접 표현해 정해진 값만 사용하게 제한

public class ClassGrade {
    public static final ClassGrade BASIC = new ClassGrade();
    public static final ClassGrade GOLD = new ClassGrade();
    public static final ClassGrade DIAMOND = new ClassGrade();

    private ClassGrade() {} // 외부에서 인스턴스 생성 금지
}

private 생성자의 필요성

사용

discount(ClassGrade.GOLD, 10000); // 타입이 ClassGrade이므로 안전

장점

직접 구현한 타입-안전 열거형의 한계)


ENUM

이런 문제를 해결하고, 타입 안정성과 편의성을 모두 갖춘 기능이 자바 열거형(enum) 이다. enum 은 위에서 설명한 타입 안전 열거형 패턴을 자바 언어 차원에서 공식 지원하는 문법

클래스지만 제한이 많은 상수 전용 클래스라 생각

public enum Grade {
    BASIC(10),GOLD(20),DIAMOND(20);
}

열거형 내부 상태와 메서드 활용

grade 안에 할인율 필드를 넣고, 계산 책임 이관

public enum Grade {
    BASIC(10),GOLD(20),DIAMOND(20);

    private final int discountPercent;

    //생성자를 통해서 필드에 값을 저장
    Grade(int discountPercent) {
        this.discountPercent = discountPercent;
    }

    //값을 조회하기 위한 메서드 열거형도 클래스라 메서드 추가 가능
    public int getDiscountPercent() {
        return discountPercent;
    }
}

리팩토링 효과

기존

int discount = DiscountService.discount(Grade.GOLD, price)

변경 후

int discount = Grade.GOLD.discount(price);

→ DiscountService 클래스 자체가 불필요해짐

반복 출력 및 동적 사용 가능

for (Grade grade : Grade.values()) {
    System.out.println(grade.name() + " 등급 할인: " + grade.discount(10000));
}

ordinal()의 위험성

열거형 요약

새로운 등급 추가 쉽다

PLATINUM(25)
Grade.PLATINUM.discount(10000) // → 2500

Grade enum에 PLATINUM만 추가하면 기존 코드는 수정 없이 확장 가능

→ OCP (개방-폐쇄 원칙) 잘 지켜짐!


출처: [김영한의 실전 자바 - 중급 1편](https://www.inflearn.com/course/김영한의-실전-자바-중급-1)
···
← PREV [JAVA] 래퍼, Class 클래스 NEXT → [JAVA] 중첩 클래스와 내부 클래스