2025. 1. 24. 16:34ㆍProgramming Language/Typescript
TypeScript의 열거형(enum)은 코드의 가독성과 유지보수성을 높이기 위해 자주 사용됩니다.
이번 글에서는 열거형의 역할과 대안 패턴들을 살펴보겠습니다.
열거형의 역할
TypeScript의 열거형은 크게 두 가지 역할을 수행합니다:
- 객체 정의: 열거형은 멤버 키를 멤버 값에 매핑하는 객체를 정의합니다.
- 타입 정의: 열거형은 멤버 값만을 포함하는 타입을 정의합니다.
예를 들어, 다음과 같은 열거형이 있다고 가정해봅시다:
enum Color {
Red = 0,
Green = 'GREEN',
}
위 코드는 Color.Red와 Color.Green이라는 두 가지 멤버를 정의하며, 각각 0과 'GREEN' 값에 매핑됩니다.
열거형의 활용 사례
열거형은 다음과 같은 상황에서 유용합니다:
1. 관련된 상수들의 네임스페이스로 사용
열거형을 사용하면 원시 값(숫자 또는 문자열)을 가지는 상수들을 그룹화할 수 있습니다. 이는 코드의 가독성과 유지보수성을 크게 향상시킵니다.
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
function move(direction: Direction) {
switch (direction) {
case Direction.Up:
console.log('Moving up');
break;
case Direction.Down:
console.log('Moving down');
break;
case Direction.Left:
console.log('Moving left');
break;
case Direction.Right:
console.log('Moving right');
break;
}
}
move(Direction.Up); // Moving up
2. 특정 값들만을 허용하는 커스텀 타입 정의
열거형은 특정 값들만 허용되는 타입을 정의할 때 유용합니다.
enum UserRole {
Admin = 'ADMIN',
User = 'USER',
Guest = 'GUEST',
}
function getPermissions(role: UserRole): string[] {
switch (role) {
case UserRole.Admin:
return ['read', 'write', 'delete'];
case UserRole.User:
return ['read', 'write'];
case UserRole.Guest:
return ['read'];
}
}
console.log(getPermissions(UserRole.Admin)); // ['read', 'write', 'delete']
열거형의 대안 패턴
TypeScript에서는 열거형을 사용하지 않고도 유사한 기능을 구현할 수 있습니다. 아래는 대표적인 대안들입니다.
1. 객체 리터럴 사용
객체 리터럴을 활용해 상수들의 네임스페이스를 정의할 수 있습니다. 이 방법은 열거형보다 간단하고 효율적일 수 있습니다.
const Direction = {
Up: 'UP',
Down: 'DOWN',
Left: 'LEFT',
Right: 'RIGHT',
} as const;
type Direction = typeof Direction[keyof typeof Direction];
function move(direction: Direction) {
switch (direction) {
case Direction.Up:
console.log('Moving up');
break;
case Direction.Down:
console.log('Moving down');
break;
case Direction.Left:
console.log('Moving left');
break;
case Direction.Right:
console.log('Moving right');
break;
}
}
move(Direction.Up); // Moving up
2. 문자열 리터럴 타입의 유니온 사용
문자열 리터럴 타입의 유니온을 사용하여 커스텀 타입을 정의할 수도 있습니다.
type UserRole = 'ADMIN' | 'USER' | 'GUEST';
function getPermissions(role: UserRole): string[] {
switch (role) {
case 'ADMIN':
return ['read', 'write', 'delete'];
case 'USER':
return ['read', 'write'];
case 'GUEST':
return ['read'];
}
}
console.log(getPermissions('ADMIN')); // ['read', 'write', 'delete']
대안 패턴의 장점
- 트리쉐이킹(tree-shaking): 열거형은 JavaScript 코드로 컴파일되기 때문에 사용하지 않는 경우에도 코드 크기를 증가시킬 수 있습니다. 반면, 객체 리터럴과 유니온 타입은 불필요한 코드가 포함되지 않도록 최적화됩니다.
- 간결한 표현: 대안 패턴은 열거형보다 코드가 단순하여 이해하기 쉽습니다.
결론
TypeScript의 열거형은 강력한 도구이지만, 모든 상황에서 최선의 선택은 아닐 수 있습니다. 열거형의 대안인 객체 리터럴과 문자열 리터럴 타입 유니온은 간결성과 최적화 측면에서 많은 이점을 제공합니다. 프로젝트의 요구사항에 따라 적절한 방법을 선택하여 사용하는 것이 중요합니다.
열거형과 대안 패턴에 대한 의견이나 질문이 있다면 댓글로 남겨주세요!
'Programming Language > Typescript' 카테고리의 다른 글
이펙티브 타입스크립트: 3장 요약 및 핵심 정리 (0) | 2025.01.24 |
---|---|
이펙티브 타입스크립트: 2장 요약 및 핵심 정리 (0) | 2025.01.24 |
이펙티브 타입스크립트: 1장 요약 및 핵심 정리 (0) | 2023.11.02 |
Typescript 에서 동적 변환 타입 처리하기: Bithumb API 활용 (0) | 2021.10.03 |