1. enum이란?
enum은 열거형 타입으로, 이름이 있는 상수들의 집합을 정의합니다. 이는 문자열이나 숫자 값을 명확하게 관리하고, 코드에서 의미를 부여하는 데 사용됩니다.
2. enum의 기본 사용법
enum은 숫자 기반 열거형과 문자열 기반 열거형으로 나뉩니다.
1 숫자 열거형 (Numeric Enum)
숫자 열거형은 자동으로 0부터 시작하여 값이 1씩 증가합니다.
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right, // 3
}
console.log(Direction.Up); // 출력: 0
console.log(Direction.Down); // 출력: 1
console.log(Direction[2]); // 출력: "Left" (역방향 매핑)
2. 문자열 열거형 (String Enum)
문자열 열거형은 값으로 고정된 문자열을 가지며, 숫자 기반 열거형처럼 자동 증가하지 않습니다.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
console.log(Direction.Up); // 출력: "UP"
console.log(Direction["Down"]); // 출력: "DOWN"
3. enum 활용 예제
1. 상태 관리
enum은 애플리케이션 상태를 관리하거나 HTTP 상태 코드, 로딩 상태 등을 표현할 때 유용합니다.
enum Status {
Pending = "PENDING",
InProgress = "IN_PROGRESS",
Completed = "COMPLETED",
Failed = "FAILED",
}
function checkStatus(status: Status) {
switch (status) {
case Status.Pending:
console.log("작업이 대기 중입니다.");
break;
case Status.InProgress:
console.log("작업이 진행 중입니다.");
break;
case Status.Completed:
console.log("작업이 완료되었습니다!");
break;
case Status.Failed:
console.log("작업이 실패했습니다.");
break;
}
}
checkStatus(Status.InProgress); // 출력: "작업이 진행 중입니다."
2. 사용자 권한 관리
enum은 특정 권한 레벨을 나타낼 때 유용합니다.
enum UserRole {
Admin = "ADMIN",
Editor = "EDITOR",
Viewer = "VIEWER",
}
function getPermissions(role: UserRole): string[] {
switch (role) {
case UserRole.Admin:
return ["read", "write", "delete"];
case UserRole.Editor:
return ["read", "write"];
case UserRole.Viewer:
return ["read"];
default:
return [];
}
}
console.log(getPermissions(UserRole.Editor)); // 출력: ["read", "write"]
3. 폼 데이터 처리
enum은 폼 데이터의 옵션을 타입 안정성 있게 관리하는 데 유용합니다.
enum Gender {
Male = "male",
Female = "female",
Other = "other",
}
interface UserForm {
name: string;
age: number;
gender: Gender;
}
const user: UserForm = {
name: "홍길동",
age: 30,
gender: Gender.Male,
};
console.log(user); // 출력: { name: '홍길동', age: 30, gender: 'male' }
문자열 리터럴 vs Enum
특징 | 문자열 리터럴 | 열거형 |
가독성 | 단순하지만 문맥 부족 | 명확하고 의도 전달 가능 |
타입 안정성 | 제공됨, 하지만 문자열 입력 시 실수 가능 | 강력한 타입 안정성, 허용된 값만 사용 가능 |
확장성 | 어렵고 관리가 힘듦 | 새로운 값 추가 및 관리가 용이 |
런타임 오버헤드 | 없음 | 객체로 변환되어 약간의 오버헤드 발생 |
IDE 자동 완성 | 제한적 | 강력한 자동 완성과 탐색 기능 지원 |
Enum의 장점
1. 타입 안정성
- enum은 정의된 값만 허용하므로, 잘못된 값(오타, 부적절한 문자열 등)이 입력될 위험을 방지합니다.
- 컴파일러가 허용되지 않은 값을 즉시 감지하여 오류를 발생시키므로, 런타임 오류를 줄일 수 있습니다.
2. 의미 전달이 명확
- enum은 값에 이름을 부여하기 때문에 코드의 가독성과 의미 전달이 명확합니다.
- 특정 값을 표현하는 데 있어, 단순 문자열이나 숫자보다 더 많은 문맥 정보를 제공합니다.
3. 코드의 응집력
- 관련된 값들을 한 곳에 묶어 관리할 수 있어, 값이 분산되는 것을 방지합니다.
- 프로젝트에서 특정 도메인에만 관련된 상수를 체계적으로 관리할 수 있습니다.
4. IDE 지원
- enum을 사용하면 코드 작성 시 자동 완성 기능과 타입 추론을 통해 생산성을 높일 수 있습니다.
- enum 값 이름을 기억하지 못해도 IDE가 제안해 주기 때문에 실수를 줄일 수 있습니다.
Enum의 단점
1. 런타임 오버헤드
- enum은 컴파일 시 자바스크립트로 변환되며, 일반적으로 즉시 실행 함수(IIFE) 형태로 출력됩니다.
- 이는 런타임에서 추가적인 메모리와 성능 비용을 발생시킬 수 있으며, 불필요한 코드 크기를 증가시킬 수 있습니다.
2. 트리쉐이킹(Dead Code Elimination)에 대한 문제
- 일반적인 enum은 객체로 변환되므로, 일부 번들러(예: Webpack, Rollup)에서 사용되지 않는 enum 값이 제거되지 않을 수 있습니다.
- 트리쉐이킹(Dead Code Elimination)을 제대로 활용하려면 const enum 또는 as const를 사용하여 불필요한 코드 제거를 유도해야 합니다.
'TypeScript' 카테고리의 다른 글
[TypeScript] TypeScript 제네릭 타입, 기본 개념부터 예제까지 (0) | 2024.11.21 |
---|---|
[TypeScript] TypeScript 타입 조합에 대해 알아보자 (0) | 2024.11.20 |
TypeScript의 Array타입에 대해 알아보자 (+ Tuple타입) (0) | 2024.11.11 |
TypeScript의 any 와 unknown을 제대로 사용하는 법 (1) | 2024.11.08 |
객체 타입을 선언할 때 type ? interface ? 어떤 것을 사용해야하나 (3) | 2024.11.07 |