Java/문법

Enum 열거형 타입

가지코딩 2025. 4. 21. 08:42

enum이란?

  • enumeration(열거형)의 줄임말로, 고정된 상수 집합을 표현하기 위한 특수한 클래스이다.
  • 내부적으로 각각의 상수가 public static final 객체로 생성된다.

예제

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

// Day.MONDAY로 사용

 

 

심화 예제

  • 속성 지정
    • 상수에 할당할 값은 private final 로 선언
    • 사용자 정의 생성자 선언
    • 생성자 호출로 enum 상수 정의
enum Day {
    // 생성자 호출
    MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);

    private final int value;  // 각 상수에 할당할 값

    // 생성자
    Day(int value) {
        this.value = value;
    }

    // 값을 반환하는 메서드
    public int getValue() {
        return value;
    }
}

public class Main {
    public static void main(String[] args) {
        Day today = Day.FRIDAY;
        System.out.println(today.getValue());  // 출력: 5
    }
}
enum ResponseStatus {
    // 생성자 호출
    SUCCESS(200, "Request successful"),
    BAD_REQUEST(400, "Bad request"),
    UNAUTHORIZED(401, "Unauthorized access"),
    FORBIDDEN(403, "Forbidden access"),
    NOT_FOUND(404, "Resource not found"),
    INTERNAL_SERVER_ERROR(500, "Internal server error");

    private final int code;  // HTTP 상태 코드
    private final String message;  // 메시지

    // 생성자
    ResponseStatus(int code, String message) {
        this.code = code;
        this.message = message;
    }

    // Getter 메서드들
    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    // 응답 정보 출력
    public void displayResponseInfo() {
        System.out.println("Code: " + code + ", Message: " + message);
    }
}

public class Main {
    public static void main(String[] args) {
        ResponseStatus success = ResponseStatus.SUCCESS;
        success.displayResponseInfo();
        // 출력:
        // Code: 200, Message: Request successful
    }
}

enum의 필요성

enum은 Java 5 (2004년) 부터 도입되었다.

 

타입 안정성이 부족했던 기존 방식

  • 정수값이라 의미 파악이 어려움 (3이 무슨 요일이지?)
  • 잘못된 값도 허용됨 (day = 99; 컴파일러가 못 잡아냄)
  • switch-case나 조건문에서 실수하기 쉬움
public class Day {
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
}

 

객체처럼 활용하고 싶을 때

  • 기존 상수는 값만 표현할 수 있었지만, enum은 객체처럼 필드, 생성자, 메서드를 가질 수 있다.
enum Status {
    READY(1), RUNNING(2), COMPLETED(3);

    private final int code;

    Status(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

enum의 주요 메서드

 

values(): enum[]

  • 해당 enum의 모든 상수들을 배열로 반환
enum Color {
    RED, GREEN, BLUE
}

public class Main {
    public static void main(String[] args) {
        for (Color c : Color.values()) {
            System.out.println(c);
        }
    }
}
// 출력 결과
RED
GREEN
BLUE

 

 

valueOf(String): enum

  • 문자열을 enum 상수로 변환 (! 정확히 일치해야 하며, 대소문자를 구분한다)
Color color = Color.valueOf("RED");
System.out.println(color); // 출력: RED
// 예외 상황 (존재하지 않는 값)
Color color = Color.valueOf("Yellow"); // 예외 발생: IllegalArgumentException

 

 

ordinal(): int

  • enum 상수가 선언된 순서(index) 를 반환 (0부터 시작)
Color color = Color.BLUE;
System.out.println(color.ordinal()); // 출력: 2

 

 

name(): String

  • 선언된 이름을 문자열로 반환
    • toString()과 비슷하지만, name()은 항상 정확히 선언된 이름을 반환한다.
    • toString()은 오버라이드 가능하지만 name()은 고정
enum Direction {
    NORTH, EAST, SOUTH, WEST
}

public class Main {
    public static void main(String[] args) {
        Direction d = Direction.SOUTH;
        System.out.println(d.name()); // 출력: SOUTH
    }
}

 

 

compareTo(): int

  • 열거 객체를 비교해서 순번 차이를 리턴
    • 내부적으로는 ordinal() 값끼리 뺀 결과
    • 정렬 또는 순서 비교에 유용하다.
for (Direction d : Direction.values()) {
    System.out.printf("%s (ordinal=%d)\n", d.name(), d.ordinal());
}

// 출력 결과
NORTH (ordinal=0)
EAST (ordinal=1)
SOUTH (ordinal=2)
WEST (ordinal=3)

 

 

사용자 정의 메서드도 구현 가능하다.


언제 enum을 쓰면 좋을까?

  • 고정된 옵션들이 필요한 경우 (요일, 상태, 권한 등)
  • switch-case나 비교가 자주 일어나는 값들
  • 문자열이나 숫자 대신 의미 있는 이름을 부여하고 싶을 때
  • 타입 안정성과 가독성을 높이고 싶을 때

 

enum 을 switch-case 에 사용하는 예제

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

public class Main {
    public static void main(String[] args) {
        Day today = Day.SUNDAY;

        switch (today) {
            case MONDAY:
                System.out.println("월요일: 새로운 한 주의 시작!");
                break;
            case FRIDAY:
                System.out.println("금요일: 불금입니다 🎉");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("주말: 푹 쉬세요 😴");
                break;
            default:
                System.out.println("평일입니다. 파이팅!");
        }
    }
}
// switch 표현식 사용
enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class Main {
    public static void main(String[] args) {
        Day today = Day.SUNDAY;

        String message = switch (today) {
            case MONDAY -> "월요일: 새로운 한 주의 시작!";
            case FRIDAY -> "금요일: 불금입니다 🎉";
            case SATURDAY, SUNDAY -> "주말: 푹 쉬세요 😴";
            default -> "평일입니다. 파이팅!";
        };

        System.out.println(message);
    }
}

'Java > 문법' 카테고리의 다른 글

가변 인자 (...)  (0) 2025.04.29
String.split() 문자열 자르기, 나누기  (0) 2025.04.22
어노테이션(Annotation)  (0) 2025.04.21
유틸리티 클래스 (Utility Class)  (1) 2025.04.18
switch 표현식 (Switch Expression)  (0) 2025.04.18