일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @BeforeAll
- @BeforeEach
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- api gateway 설계
- api gateway 필터
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- aws autoscaling
- aws eks
- AWS KMS
- aws 연동
- AWS 프리티어
- Today
- Total
기록
Java Enum과 switch문의 관계: ordinal(), 참조 방식 정리 본문
Java에서 enum은 단순한 상수 집합이 아니라, 내부적으로 클래스로 구현된 객체이다. 따라서 enum을 사용하는 문맥에 따라 그 처리 방식과 제약 사항이 달라질 수 있다. 본 글에서는 특히 switch문과 함께 사용할 때의 제약, 내부 동작 방식, 그리고 실무에서 enum을 안전하게 다루는 방법을 중심으로 설명한다.
1. switch 문에서 enum 사용할 때의 문법적 제약
Java에서는 switch문의 분기 대상이 enum 타입인 경우, case 절에서는 열거형 이름을 생략하고 상수명만 사용할 것을 요구한다.
예를 들어 아래와 같이 enum이 정의되어 있다면,
enum ActionType {
INSTALL, UPDATE, DELETE, GET
}
다음과 같은 방식으로 switch문을 구성해야 한다.
switch (actionType) {
case INSTALL -> ...
case UPDATE -> ...
default -> ...
}
case OtaActionType.INSTALL과 같은 형식은 컴파일 오류가 발생하며, Java의 switch 문법 규칙에 위배된다.
2. 컴파일러는 enum을 어떻게 처리하는가?
Java 컴파일러는 enum을 기반으로 한 switch문을 처리할 때, 내부적으로 각 상수의 ordinal 값(정수 인덱스)을 기준으로 int switch-case 문으로 변환한다. ordinal()은 enum 상수가 정의된 순서를 나타내는 메서드로, 0부터 시작하는 값을 반환한다.
예시:
actionType.INSTALL.ordinal(); // 0
actionType.UPDATE.ordinal(); // 1
컴파일 시 아래 코드:
switch (actionType) {
case INSTALL -> System.out.println("설치");
}
은 내부적으로 다음과 유사한 int 분기문으로 변환된다.
switch (actionType.ordinal()) {
case 0 -> System.out.println("설치");
}
이러한 구조 때문에, case 절에는 enum 이름이 아닌 상수명만 명시해야 하며, enum 이름까지 포함할 경우 컴파일러가 ordinal 값을 매핑할 수 없어 오류가 발생한다.
3. ordinal()의 실무적 한계와 주의사항
ordinal()은 열거형 정의 순서에 따라 자동 생성되기 때문에, 실무에서는 다음과 같은 한계가 존재한다.
- enum 상수의 순서가 바뀌거나 중간에 추가되면, ordinal 값도 변경된다.
- 이를 DB에 저장하거나 외부 시스템과 매핑할 경우, 데이터 불일치가 발생할 수 있다.
- 결과적으로 ordinal()은 직렬화, 저장, 외부 연동 등에 사용해서는 안 된다.
4. 안전한 방식: 필드 정의 및 명시적 코드 관리
실무에서는 enum에 code 값을 별도로 정의하여 사용하는 것이 일반적이다. 아래는 대표적인 구조이다.
@Getter
@RequiredArgsConstructor
public enum ActionType {
INSTALL(1, "설치"),
UPDATE(2, "업데이트"),
DELETE(3, "삭제"),
GET(4, "조회");
private final int code;
private final String description;
}
이와 같은 구조는 다음과 같은 이점을 제공한다.
- 코드 값 변경에 따른 영향도를 명확히 통제할 수 있다.
- JSON 직렬화, DB 저장 시 명시적인 값 사용 가능
- enum 내부에 도메인 의미를 부여할 수 있어 가독성과 유지보수성이 향상됨
5. 결론
- Java의 switch 문에서는 enum 타입의 case 절에 열거형 이름을 생략해야 한다.
- 내부적으로 ordinal() 값을 기반으로 동작하기 때문에 enum 이름을 명시하면 컴파일 오류가 발생한다.
- 실무에서는 ordinal()을 직접 사용하는 방식은 피해야 하며, enum 필드에 명시적인 code 값을 선언하여 안정적으로 관리하는 것이 바람직하다.
enum은 단순한 상수 모음이 아닌 객체이며, 타입 안전성과 표현력을 갖춘 강력한 도구이다. 이를 적절히 활용하면 코드의 안정성과 확장성을 동시에 확보할 수 있다.
'제대로 이해하기' 카테고리의 다른 글
Git - 원격 브랜치가 있는데 로컬에는 없을 때, 브랜치 생성 및 연결 방법 (0) | 2025.04.08 |
---|---|
Java/Labeled Loop (0) | 2024.04.26 |
[이해하기] java/initialize block (0) | 2022.09.10 |
[이해하기] Android/API와 SDK (0) | 2022.05.24 |