enum
은 TypeScript
에서 제공하는 기능으로 열거형 enumeration
을 정의하는 데 사용된다. 열거형은 서로 관련된 상수들의 집합을 의미한다.
enum UserRole {
Admin = 'ADMIN',
Editor = 'EDITOR',
Viewer = 'VIEWER'
}
enum
UserRole
을 만들고 열거형을 사용하여 사용자의 역할을 설정하고 확인할 수 있다
let userRole: UserRole;
// 사용자의 역할을 설정
userRole = UserRole.Admin;
// 사용자의 역할을 확인
if (userRole === UserRole.Admin) {
console.log('User is an admin');
} else if (userRole === UserRole.Editor) {
console.log('User is an editor');
} else if (userRole === UserRole.Viewer) {
console.log('User is a viewer');
}
코드의 가독성 향상 : enum
을 사용하면, 코드 내에서 의미 있는 이름을 사용하여 특정 값을 참조할 수 있다. 이는 코드의 가독성을 향상시키고, 코드를 이해하는 데 도움이 된다.
오류 방지 : enum
을 사용하면, 특정 값의 집합을 명확하게 정의할 수 있다. 이는 잘못된 값이 사용되는 것을 방지하고, 코드의 안전성을 높인다.
런타임 오버헤드 : TypeScript
enum
은 런타임에 객체로 존재하므로, 이는 추가적인 메모리와 런타임 오버헤드를 초래할 수 있다. 이는 특히 성능이 중요한 상황에서 문제가 될 수 있다.
문자열 enum
의 불변성 : TypeScript
enum
은 불변하지 않는다. 즉, enum
의 값을 런타임에 변경할 수 있다. 이는 예기치 않은 버그를 초래할 수 있다.
타입 안전성 : TypeScript
enum
은 숫자와 문자열 값 모두를 허용한다. 이는 enum
의 값이 예상치 못한 타입으로 변경될 수 있음을 의미한다. 이는 타입 안전성을 저해하고, 버그를 초래할 수 있다.
리팩토링의 어려움 : enum
의 멤버를 변경하거나 제거하면, 해당 enum
을 사용하는 모든 코드를 찾아서 업데이트해야 한다. 이는 리팩토링을 어렵게 만든다.
Tree shaking
은 모듈에서 실제로 사용되지 않는 코드를 제거하는 프로세스를 말한다. 이는 불필요한 코드를 번들에서 제거하여 최종 출력 파일의 크기를 줄이는 데 도움이 된다.
TypeScript
의 enum
은 tree shaking
에 잘 동작하지 않는다. 이는 enum
이 런타임에 실제 JavaScript
객체로 존재하기 때문이다. 따라서 enum
의 특정 멤버가 사용되지 않더라도, 전체 enum
객체는 번들에 포함된다. 이는 불필요한 코드가 번들에 포함되어 번들의 크기가 커지는 결과를 초래할 수 있다.
이러한 이유로, 성능이 중요한 애플리케이션에서는 enum
대신 다른 방법을 사용하는 것이 좋다. 예를 들어, const assertion
을 사용하여 enum
과 유사한 구조를 만들 수 있다.
const UserRole = { Admin: 'ADMIN', Editor: 'EDITOR', Viewer: 'VIEWER' } as const;