본문 바로가기
Java

Java 에서 Enum

by fygoo-826 2025. 2. 2.
728x90
반응형

 자바에서 Enum(열거형)은 특정 값의 집합을 정의할 수 있는 강력한 기능이다. Enum을 이해하기 위해서는 타입 안정성에 대한 개념이 필수적이다. 이번 포스팅을 통해 Enum 의 특징과 활용하는 방법에 대해서 이해해볼 수 있기를 기대한다.


타입 안정성을 위한 Enum

 아래와 같은 DiscuntService 클래스에서 할인율이 다르게 적용되는 여러 등급을 문자열로 정의하고 있다. 하지만 문자열을 비교하는 방식은 대소문자 오류 혹은 오타로 인해 예기치 않은 문제가 발생할 수 있다.

package ex0;

public class DiscountService {
    public int discount(String grade, int price) {
        int discountPercent = 0;

        if (grade.equals("BASIC")) {
            discountPercent = 10;
        } else if (grade.equals("GOLD")) {
            discountPercent = 20;
        } else if (grade.equals("DIAMOND")) {
            discountPercent = 30;
        } else {
            System.out.println(grade + ": 할인 불가");
        }

        return price * discountPercent / 100;
    }
}

  이 경우 "BASIC" 대신 "basic" 또는 "BASCI" 같은 잘못된 입력이 들어올 경우, "할인 불가"로 처리되는 문제가 발생한다. 그리고 `String grade` 에 변화에 따라서 OCP 도 준수하고 있지 않은 코드임을 확인할 수 있다. 실제로 이런 코드들 상당히 많다.

 

 문제점을 다시 정의해보면 아래와 같다.

  • 문자열을 사용하여 비교할 때 대소문자나 철자 오류에 취약하다
  • 실수로 유효한 값을 잘못 처리하는 오류가 발생할 수 있다
  • OCP 를 준수하고 있지 않다

개선한 코드는 아래와 같다.

// static final 변수를 통해 컴파일 시점에 값을 미리 정의내려놓는다.
public class StringGrade {
    public static final String BASIC = "BASIC";
    public static final String GOLD = "GOLD";
    public static final String DIAMOND = "DIAMOND";
}

// Enum 을 사용한다
public enum Grade {
    BASIC(10), GOLD(20), DIAMOND(30);

    private final int discountPercent;

    Grade(int discountPercent) {
        this.discountPercent = discountPercent;
    }

    public int getDiscountPercent() {
        return discountPercent;
    }

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

  static 변수를 활용해볼 수도 있지만 응집력이 약간 아쉽다고 생각이 들 수 있다. 이를 위해 Java 에서는 Enum 이라는 타입의 클래스 형태를 제공해준다. 위 코드를 보면 이제 Enum을 사용하여 할인 금액을 계산할 수 있는 DiscuntService 클래스를 만들 필요 없이, Enum 내에서 직접 책임을 갖도록 할 수 있다. 할인 금액을 계산하는 메서드는 Enum 클래스 내에 포함된다.

 

public class ClassGradeEx3_1 {
    public static void main(String[] args) {
        int price = 10000;

        Grade[] grades = Grade.values();
        for (Grade grade : grades) {
            printDiscount(grade, price);
        }
    }

    private static void printDiscount(Grade grade, int price) {
        System.out.println(grade.name() + " 등급의 할인 금액 :" + grade.discount(price));
    }
}

 위 코드는 각 등급에 해당하는 할인 금액을 출력한다. 이처럼 Enum을 활용하면 코드가 간결해지고, 타입 안정성을 확보할 수 있다. Enum은 생성 시점부터 상수들이 클래스 영역에 생성되며, 이를 통해 원치 않는 객체 생성을 막고 안전하게 관리할 수 있다.

 

 

728x90
반응형

'Java' 카테고리의 다른 글

Java 에서 중첩 클래스  (1) 2025.02.03
Java 에서 Time 정리  (0) 2025.02.03
Wrapper 클래스  (0) 2025.02.02
Java 에서 final keyword 란!?  (0) 2025.01.29
Java 에서 다형성과 객체지향 프로그래밍  (1) 2025.01.29