Java/Class

Enum Class?

Geisha 2025. 1. 8. 18:33
Test Code 와 관련된 Inflearn 강의를 듣던 와중
다음과 같은 Enum Class를 마주했습니다.
@RequiredArgsConstructor
public enum ProductType {

    HANDMADE("제조 음료"),
    BOTTLE("병 음료"),
    BAKERY("베이커리");

    private final String text;
}
이를 통해 Enum에 대해 잘 모르고 있다고 판단되어
Enum에 대해 공부해보자는 생각에 쓰게 되었습니다.

 

Enum이란?

Enum은 Java에서 열거형 데이터 타입을 정의하기 위해 사용되는 특별한 클래스입니다.

이는 미리 정의된 상수들의 집합을 의미하며, 특정 값 집합을 타입으로 제한하고 싶을 때 사용됩니다.

예를 들어, 요일, 계절, 상태 코드와 같은 값들이 이에 해당합니다.

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

위 코드는 Day라는 Enum을 정의한 예입니다. 이제 Day 타입의 변수에는 위의 상수들만 담을 수 있습니다.


Enum이 없었다면?

Enum이 없던 시절, 상수를 관리하기 위해 static final 변수를 사용했습니다. 아래의 코드를 보았을때 위에 비해 상당히 복잡하다는것을 알 수 있고 이는 가독성을 저하시킬 뿐만아니라

public class Day {
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;
    public static final int WEDNESDAY = 7;
}

 

잘못된 값이 입력될 가능성이 높아졌고

int today = 8; // 잘못된 값인데도 컴파일 오류 없음

 

타입이 혼동될 가능성이 있는 문제가 발생했습니다.

public class Status {
    public static final int SUCCESS = 1;
    public static final int FAILURE = 2;
}
int day = Status.SUCCESS; // 논리적으로 잘못된 대입인데 컴파일 오류 없음

 

또한 실수로 벗어난 값을 사용하는 문제를 막기위한 유효성 검사도 필요해지게 됩니다.

public boolean isValidDay(int day) {
    return day >= 1 && day <= 7;
}

Enum을 사용하는 방법

이제 Enum 클래스가 왜 필요한지 없으면 어떤 불편함이 생기는지 알았으니 적극적으로

활용할 차례입니다. 이 단락에서는 Enum 사용법에 대해 포스팅 하겠습니다.

1. 기본사용

Enum은 미리 정의된 상수 집합을 코드에서 안전하게 사용할 수 있도록 도와줍니다.

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

public class Main {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println(today); // 출력: MONDAY
    }
}

 

2. 추가 정보와 메서드 포함

Enum 상수에 추가 데이터를 부여하거나, 상수별로 메서드를 정의할 수 있습니다.

엄청 놀라웠습니다. 만약 Monday("월요일") 이아니라

Monday(1,"월요일") 이라면

private final int num;

을 추가해주면 됩니다.

public enum Day {
    MONDAY("월요일"), 
    FRIDAY("금요일"), 
    SUNDAY("일요일");

    private final String koreanName;

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

    public String getKoreanName() {
        return koreanName;
    }
}

public class Main {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println(today.getKoreanName()); // 출력: 월요일
    }
}

3. Switch문과 함께 사용

Enum은 switch문과 자연스럽게 통합됩니다

이런식으로 사용하면 switch 문이 상당히 편해집니다.

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

        switch (today) {
            case MONDAY -> System.out.println("Start working!");
            case FRIDAY -> System.out.println("Prepare for the weekend!");
            case SUNDAY -> System.out.println("Take a rest!");
        }
    }
}

 


Enum의 장점

 

 
  1. 타입 안전성
    • Enum은 미리 정의된 값만 사용할 수 있으므로 잘못된 값이 들어가는 것을 방지합니다.
    • 컴파일 시점에 오류를 잡아낼 수 있습니다.
  2. 가독성
    • 코드에 숫자가 아닌 이름으로 상수를 사용하므로 더 직관적입니다.
    • 예: Day.MONDAY는 숫자 1보다 훨씬 의미가 명확합니다.
  3. 유지보수성
    • 관련 값과 동작을 한곳에서 관리할 수 있어 코드 유지보수가 쉬워집니다.
    • 추가 정보를 필요로 할 때 데이터를 쉽게 확장할 수 있습니다.
  4. Switch와의 통합
    • Enum은 switch문에서 유용하게 사용할 수 있습니다.
  5. 추상 메서드 구현 가능
    • 상수별로 서로 다른 동작을 정의할 수 있습니다.
 

 


Enum을 사용하기 좋은 때

Enum을 언제 사용하면 좋을까에 대해 생각해보면다음의 상황에서 사용하기 좋다고 생각됩니다.

  1. 고정된 값의 집합을 정의할 때
    • 예: 요일, 계절, 상태 코드, 사용자 권한 등.
  2. 값과 관련된 동작을 캡슐화할 때
    • 예: 상태 코드별 메시지 출력, 각 요일에 따른 작업 정의.
  3. 타입 안정성과 가독성이 중요한 경우
    • 예: 상태 관리, API 응답 코드 정의. ex) 공통응답객체
  4. 데이터와 로직이 함께 필요한 경우
    • 예: 계산기에서 연산자와 동작을 결합.

고정된 값들의 도서관 Enum

Enum 클래스는 단순히 상수를 관리하는 것을 넘어, 데이터와 동작을 결합하여 코드를 더욱 구조화하고 안전하게 만드는 강력한 도구라는 생각이 들었습니다. Enum 을 통해 가독성, 유지보수성, 타입 안정성을 모두 향상시키는 개발자가 되어야 겠습니다.😁