Enum Class?
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의 장점
- 타입 안전성
- Enum은 미리 정의된 값만 사용할 수 있으므로 잘못된 값이 들어가는 것을 방지합니다.
- 컴파일 시점에 오류를 잡아낼 수 있습니다.
- 가독성
- 코드에 숫자가 아닌 이름으로 상수를 사용하므로 더 직관적입니다.
- 예: Day.MONDAY는 숫자 1보다 훨씬 의미가 명확합니다.
- 유지보수성
- 관련 값과 동작을 한곳에서 관리할 수 있어 코드 유지보수가 쉬워집니다.
- 추가 정보를 필요로 할 때 데이터를 쉽게 확장할 수 있습니다.
- Switch와의 통합
- Enum은 switch문에서 유용하게 사용할 수 있습니다.
- 추상 메서드 구현 가능
- 상수별로 서로 다른 동작을 정의할 수 있습니다.
Enum을 사용하기 좋은 때
Enum을 언제 사용하면 좋을까에 대해 생각해보면다음의 상황에서 사용하기 좋다고 생각됩니다.
- 고정된 값의 집합을 정의할 때
- 예: 요일, 계절, 상태 코드, 사용자 권한 등.
- 값과 관련된 동작을 캡슐화할 때
- 예: 상태 코드별 메시지 출력, 각 요일에 따른 작업 정의.
- 타입 안정성과 가독성이 중요한 경우
- 예: 상태 관리, API 응답 코드 정의. ex) 공통응답객체
- 데이터와 로직이 함께 필요한 경우
- 예: 계산기에서 연산자와 동작을 결합.
고정된 값들의 도서관 Enum
Enum 클래스는 단순히 상수를 관리하는 것을 넘어, 데이터와 동작을 결합하여 코드를 더욱 구조화하고 안전하게 만드는 강력한 도구라는 생각이 들었습니다. Enum 을 통해 가독성, 유지보수성, 타입 안정성을 모두 향상시키는 개발자가 되어야 겠습니다.😁