[Java 응용] Enum (열거형) 클래스

Kyung Jae, Cheong·2024년 8월 27일
0
post-thumbnail

Java Enum (열거형) 클래스

  • Enum 클래스는 Java에서 열거형 타입을 정의할 때 사용되는 특별한 클래스입니다.
  • 열거형 타입은 특정한 상수들의 집합을 정의하며, 이를 통해 코드의 가독성과 안정성을 높일 수 있습니다.
  • 참고로 Enum은 Java 5부터 도입된 기능으로, 특정 값만 가질 수 있는 변수를 정의할 때 유용합니다.

1. Enum 클래스의 개요

  • Enum은 열거형 타입을 정의하기 위한 클래스로, 상수의 집합을 의미합니다.
    • 'Enumerate'의 약자이고, 한글로는 '열거형'으로 표현합니다. 열거형은 쉽게 말해 나열한다는 뜻으로 해석하시면 됩니다.
    • 예를 들어, 요일, 방향, 상태 등을 나타낼 때 유용하게 사용할 수 있습니다.
  • Enum은 기본적으로 java.lang.Enum 클래스를 상속하며, 암묵적으로 final 클래스로 정의되기 때문에 다른 클래스로 확장할 수 없습니다.

Enum 선언 예시

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
  • 위 예제에서 Day는 열거형 타입으로, 이 열거형 타입은 SUNDAY, MONDAY 등 7개의 상수 값을 가질 수 있습니다.
    • 이외의 값을 쓰려는 경우, IllegalArgumentException이라는 오류가 발생하게 됩니다.

2. Enum 클래스의 주요 특징

Enum 클래스의 장점

  • 타입 안전성: 열거형 상수 외의 값이 들어갈 가능성을 원천적으로 차단할 수 있습니다.
  • 가독성: 코드에서 상수를 명확하게 표현할 수 있어, 코드 가독성이 향상됩니다.
  • 유지보수성: 값의 추가나 변경이 필요할 때 Enum 클래스 내에서만 변경하면 되므로 유지보수가 용이합니다.

열거형 상수

  • 열거형 상수는 모두 public static final로 정의되며, 하나의 Enum 타입 내에서 유일한 값입니다.
  • 상수들은 상속된 Enum 클래스에서 제공하는 여러 유틸리티 메서드를 사용할 수 있습니다.
public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
  • 위 예시는 아래 예시와 거의 같다고 보시면 됩니다.
public class DayEnum extends Enum {
    public static final DayEnum SUNDAY = new DayEnum();
    public static final DayEnum MONDAY = new DayEnum();
    public static final DayEnum TUESDAY = new DayEnum();
    public static final DayEnum WEDNESDAY = new DayEnum();
    public static final DayEnum THURSDAY = new DayEnum();
    public static final DayEnum FRIDAY = new DayEnum();
    public static final DayEnum SATURDAY = new DayEnum();
    
    private DayEnum() {
        super();
    }
}

Enum의 확장 기능

  • Enum 클래스는 메서드를 추가하거나 필드를 가질 수 있습니다.
    • 이를 통해 열거형 타입을 더욱 유연하게 사용할 수 있습니다.

필드와 메서드를 가지는 Enum 예시

public enum Day {
    SUNDAY("휴일"), 
    MONDAY("평일"), 
    TUESDAY("평일"), 
    WEDNESDAY("평일"), 
    THURSDAY("평일"), 
    FRIDAY("평일"), 
    SATURDAY("휴일");

    private final String description;

    Day(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

// 사용 예시
Day day = Day.MONDAY;
System.out.println(day.getDescription()); // 출력: 평일

3. Enum 클래스의 열거형 메서드

  • 열거형 상수를 다루기 위해서 Enum 클래스에서 정의되어 상속으로 제공되는 메서드들입니다.
    • toString(): 열거형 상수의 이름을 문자열로 반환합니다. (Object 클래스에서 오버라이딩 된 형태로, println()내부에서 변수 이름만 입력하면 상수 이름이 반환됩니다)
    • values(): 모든 열거형 상수를 배열로 반환합니다.
    • valueOf(String name): 주어진 이름과 일치하는 열거형 상수를 반환합니다.
    • name(): 열거형 상수의 이름을 반환합니다. (toString()을 추가적으로 오버라이딩 한 경우에 종종 쓰일 수 있습니다.)
    • ordinal(): 열거형 상수의 선언된 순서를 반환합니다. (0부터 시작)
for (Day day : Day.values()) {
    System.out.println(day);
}
// 출력: SUNDAY, MONDAY, ..., SATURDAY

Day day = Day.valueOf("MONDAY");
System.out.println(day); // 출력: MONDAY

System.out.println(Day.SUNDAY.name()); // 출력: SUNDAY

System.out.println(Day.MONDAY.ordinal()); // 출력: 1
  • 참고로 ordinal()의 경우엔 실무에선 거의 쓰일 일이 없습니다.
    • 유지보수시 데이터를 추가하면 인덱스값이 모두 바뀌게 되어서, 객체지향 프로그래밍의 의미가 거의 없어지기 때문입니다.
    • 다만 고정된 순서가 중요한 경우(방향 enum의 회전, 등)에는 종종 쓰입니다.

4. Enum의 활용 예시

  • Enum은 특정 값의 집합을 표현할 때뿐만 아니라, 상태나 설정 등을 명확하게 표현할 때도 유용합니다.

4.1. 상태를 표현하는 Enum 예시

public enum Status {
    NEW, IN_PROGRESS, COMPLETED, CLOSED
}

// 사용 예시
Status currentStatus = Status.NEW;

switch (currentStatus) {
    case NEW:
        System.out.println("작업이 새로 생성되었습니다.");
        break;
    case IN_PROGRESS:
        System.out.println("작업이 진행 중입니다.");
        break;
    case COMPLETED:
        System.out.println("작업이 완료되었습니다.");
        break;
    case CLOSED:
        System.out.println("작업이 종료되었습니다.");
        break;
}

4.2. Enum을 활용한 설정 예시

public enum Configuration {
    DEBUG(true), //Configuration(boolean flag)
    LOG_LEVEL(1), //Configuration(int value)
    MAX_CONNECTIONS(10); //Configuration(int value)

    private final int value;
    private final boolean flag;

    Configuration(int value) {
        this.value = value;
        this.flag = false;
    }

    Configuration(boolean flag) {
        this.flag = flag;
        this.value = 0;
    }

    public int getValue() {
        return value;
    }

    public boolean isEnabled() {
        return flag;
    }
}

// 사용 예시
System.out.println(Configuration.DEBUG.isEnabled()); // 출력: true
System.out.println(Configuration.MAX_CONNECTIONS.getValue()); // 출력: 10

마무리

  • Enum 클래스는 Java에서 상수의 집합을 표현할 때 강력한 도구입니다.
    • 명확한 코드 작성과 안전성을 제공하며, 다양한 기능을 통해 더 유연한 설계가 가능합니다.
    • 이러한 특징들 덕분에 Enum은 상태 관리, 설정 관리, 값 집합 표현 등 다양한 상황에서 널리 사용되고 있습니다.
  • 다음 포스팅에서는 자바에서 날짜와 시간을 다루는 라이브러리들을 살펴보도록 하겠습니다.
profile
일 때문에 포스팅은 잠시 쉬어요 ㅠ 바쁘다 바빠 모두들 화이팅! // Machine Learning (AI) Engineer & BackEnd Engineer (Entry)

0개의 댓글