1. Enum이란
Enum(열거형)은 서로 관련 있는 상수 값들의 집합을 하나의 타입으로 정의하기 위한 문법이다.
enum Direction {
Up,
Down,
Left,
Right
}
- 의미 있는 이름으로 상수 집합을 표현할 수 있음
- 숫자 또는 문자열 기반으로 동작함
2. Numeric Enum (숫자 열거형)
2.1 기본 동작
enum Direction {
Up,
Down,
Left,
Right
}
컴파일 시 내부 값은 다음과 같이 할당된다.
Direction.Up === 0
Direction.Down === 1
Direction.Left === 2
Direction.Right === 3
2.2 시작 값 지정
enum Status {
Ready = 1,
Running,
Done
}
- Ready = 1
- 이후 값은 자동 증가됨 (2, 3)
2.3 역방향 매핑
Numeric Enum은 양방향 매핑이 가능하다.
enum Status {
Ready,
Running
}
Status.Ready // 0
Status[0] // "Ready"
- 런타임 객체가 생성됨
- 이는 장점이자 단점이 될 수 있음
3. String Enum (문자열 열거형)
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
- 값이 명확하고 직관적
- 역방향 매핑 불가
- 디버깅 및 로그에 유리
Direction.Up // "UP"
4. Const Enum
const enum Role {
Admin,
User
}
- 컴파일 시 완전히 인라인됨
- 런타임 객체 생성 없음
- 성능 및 번들 크기 측면에서 유리
let r = Role.Admin;
// 컴파일 결과: let r = 0;
※ isolatedModules 옵션 사용 시 제한 있음
5. Enum 사용 예시
5.1 상태 값 표현
enum OrderStatus {
Pending,
Paid,
Shipped,
Completed
}
5.2 역할(Role) 구분
enum UserRole {
Admin = "ADMIN",
User = "USER"
}
5.3 switch 문과 함께 사용
function handle(status: OrderStatus) {
switch (status) {
case OrderStatus.Pending:
// 처리
break;
}
}
6. Enum의 단점과 주의사항
1) 런타임 코드가 생성됨
enum A { X }
→ JavaScript로 컴파일 시 객체가 생성됨
→ 트리 쉐이킹에 불리
2) 타입 안정성이 완벽하지 않음
enum Status {
Ready,
Done
}
let s: Status = 100; // ❌ 컴파일 에러 아님
- 숫자 Enum은 임의의 숫자 할당 가능
- 논리적 안정성 저하 가능
7. Enum 대신 사용하는 패턴
7.1 Union Literal 타입 (권장)
type Direction = "UP" | "DOWN" | "LEFT" | "RIGHT";
- 런타임 코드 없음
- 타입 안정성 매우 높음
- 트리 쉐이킹 친화적
7.2 as const 객체 패턴
const Direction = {
Up: "UP",
Down: "DOWN"
} as const;
type Direction = typeof Direction[keyof typeof Direction];
- Enum과 유사한 사용성
- 더 안전하고 유연함
8. 언제 Enum을 써야 하는가
상황권장
| 단순 상수 집합 | Union 타입 |
| 런타임 객체 필요 | Enum |
| 외부 라이브러리 호환 | Enum |
| 프론트엔드 상태 값 | Union / as const |
| 백엔드(Spring 등) 연동 | String Enum |
반응형