TIL (Today I Learned)

[Java] Enum 사용법과 활용 예시

기만나🐸 2025. 1. 6. 11:59

enum 클래스

enum은 enumeration의 약자로 열거형이라고 한다. 서로 관련 있는 상수들의 집합을 정의할 때 사용된다.

 

기본 개념

  • enum은 여러 상수를 그룹화하여 사용할 수 있는 데이터 타입.
  • 상수를 정의할 때 타입 안정성을 보장하며, 코드를 더 읽기 쉽고 유지보수 가능하게 만들어준다.
✏️ 타입 안정성 (type safety)
.프로그래밍 언어에서 데이터 타입이 잘못 사용되는 것을 방지하는 능력.
코드에서 데이터 타입에 맞는 값만 사용되도록 보장하여 프로그램의 안정성을 높이는 것.
  • enum 상수는 enum 클래스의 public static final 인스턴스이므로 변경이 불가능하다.

 

enum은 다음과 같은 메서드를 기본 제공한다:

  • values(): 모든 상수를 배열로 반환
  • valueOf(String name): 이름으로 상수를 찾음
  • ordinal(): 상수의 순서를 반환 (0부터 시작)

 

[ 요일에 대한 enum 클래스 활용 예시 ]

enum을 활용하여 선언할 경우

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

 

enum을 활용하지 않고 선언할 경우

public class Day {
    public static final int MONDAY = 0;
    public static final int TUESDAY = 1;
    public static final int WEDNESDAY = 2;
    public static final int THURSDAY = 3;
    public static final int FRIDAY = 4;
    public static final int SATURDAY = 5;
    public static final int SUNDAY = 6;
}
  • class Day의 상수는 단순히 int 타입이므로, 잘못된 값을 전달해도 컴파일러가 잡아내지 못한다.
    • ex) int today = 8;

주요 특징

1. 타입 안정성

enum을 사용하면 잘못된 값이 전달되는 것을 방지할 수 있다.

public void printDay(Day day) {
    System.out.println(day);
}

printDay(Day.MONDAY); // OK
printDay("MONDAY");   // 컴파일 오류

pringDay 메서드에서 매개변수를 Day 타입으로 받으면,

Day는 enum 타입이기 때문에 String이 매개변수로 입력되면 컴파일 오류가 발생한다.

즉, 매개변수에 대한 타입 불일치 오류가 발생하므로 이런 방식으로 잘못된 값이 전달되지 않도록 보호할 수 있다.

 

 

2. 클래스로 동작

enum은 클래스이며, 각 상수는 enum 클래스의 인스턴스이다.

따라서 enum 클래스에 메서드와 필드를 추가할 수 있다.

  • 메서드로 추상 메서드를 선언하여, 각 상수마다 Override하여 다른 동작을 정의할 수도 있다.
✏️ enum 상수의 내부 구조

이름 (name):
- 상수의 이름으로, enum 정의 시 사용한 식별자
- name() 메서드를 통해 이름을 얻을 수 있다.

순서 (ordinal):
- 상수가 선언된 순서에 따라 0부터 시작하는 정수 값
- ordinal() 메서드를 통해 순서를 얻을 수 있다.

필드 (fields):
- enum 클래스에서 정의된 인스턴스 변수
- 각 상수마다 고유한 필드 값을 가질 수 있다.

메서드 (methods):
- enum 클래스에서 정의된 인스턴스 메서드를 사용할 수 있다.
- 상수별로 메서드를 오버라이딩하여 개별 동작을 정의할 수 있다.

 

[ enum Day 클래스에 필드와 메서드 추가 예시 ] 

public enum Day {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private final String koreanName; // 각 상수의 필드

    // 생성자
    Day(String koreanName) {
        this.koreanName = koreanName;
    }

    // 필드에 접근하기 위한 메서드
    public String getKoreanName() {
        return koreanName;
    }
}

 

사용

public class EnumExample {
    public static void main(String[] args) {
        // 각 enum 상수는 Day 클래스의 인스턴스
        Day today = Day.MONDAY;

        // enum 상수의 필드와 메서드 사용
        System.out.println("오늘은 " + today.getKoreanName() + "입니다.");

        // 모든 enum 상수 출력
        for (Day day : Day.values()) {
            System.out.println(day + " - " + day.getKoreanName());
        }
    }
}

 

실행결과

 

 

3. Switch문에서 활용

Java에서 switch 문은 byte, short, char, int, String, enum 타입을 지원한다.

enum 상수는 고유한 이름과 컴파일 시 확인 가능한 값을 가지고있기 때문에, 가독성과 안정성에 좋다.

 

[ enum Day 클래스 Switch문 활용 예시 ]

public class SwitchExample {
    public static void main(String[] args) {
        Day day = Day.MONDAY; // Day 타입 변수 선언
        switch (day) {
            case MONDAY:
                System.out.println("Start of the work week!");
                break;
            case FRIDAY:
                System.out.println("End of the work week!");
                break;
            case SUNDAY:
                System.out.println("Relax!");
                break;
        }
    }
}

장점

  • 타입 안정성
    • 잘못된 값 전달을 방지하고, 컴파일 단계에서 오류를 발견할 수 있다.
  • 가독성
    • 상수의 의미를 명확히 전달하여 코드의 이해도를 높인다.
  • 유지보수성
    • 새로운 상수를 추가하거나 수정할 때 기존 코드와 충돌을 최소화한다.
  • 객체 지향적 설계
    • 필드와 메서드를 통해 상수마다 고유한 데이터를 가지거나 동작을 정의할 수 있어, 더 강력하고 유연한 설계가 가능하다.