[TypeScript] Enum 이해와 활용

Enum이란

enum은 특정 값의 집합을 이름 붙여 정의하는 방법입니다. 기본적으로 숫자 값을 사용하여 각 항목에 순차적인 숫자를 할당합니다. 이러한 기본 숫자 enum 외에도 문자열, 혼합형으로 사용할 수 있으며, 컴파일시 JavaScript 객체로 변환되어 실행됩니다.

숫자형 Enum

숫자형 enum은 기본적으로 첫 번째 항목이 0부터 시작하여 순차적으로 값을 증가시킵니다. 또한, 시작 값을 사용자가 직접 지정할 수도 있으며, 이후 항목은 자동으로 증가합니다.

enum OrderStatus {
  Pending = 1,
  Processing,
  Shipped,
  Delivered,
}

console.log(OrderStatus.Shipped);
// 출력: 3
console.log(OrderStatus[3]);
// 출력: Shipped

Pending을 1로 지정했기 때문에, 이후 값은 2,3,4로 자동 증가합니다. 숫자형 enum은 양방향 매핑을 지원해 값으로 이름(OrderStatus[3]처럼)을 찾을 수도 있습니다.

문자열형 Enum

문자열형 enum은 각 항목에 고유한 문자열 값을 부여합니다.

enum UserRole {
  Admin = "ADMIN",
  Editor = "EDITOR",
  Viewer = "VIEWER",
}

const user = { name: "민수", role: UserRole.Editor };
console.log(`${user.name}의 역할: ${user.role}`);
// 출력: 민수의 역할: EDITOR

숫자형과 달리 양방향 매핑을 지원하지 않습니다. 하지만 직관적인 값 표현을 할 수 있습니다.

혼합형 Enum

숫자와 문자열 값을 혼합하여 사용할 수 있습니다. 그러나 코드의 일관성을 위해 가능한 한 피하는 것이 좋으며, 특별한 경우에만 사용됩니다.

enum Signal {
  Off = 0,
  On = "ACTIVE",
}

console.log(Signal.Off);
// 출력: 0
console.log(Signal.On);
// 출력: ACTIVE

계산된 enum

값을 동적으로 계산할 수 있도록 합니다. 이를 통해 보다 복잡한 로직에 따른 값을 enum으로 표현할 수 있습니다.

const getPriority = () => 10;

enum TaskPriority {
  Low = 1,
  Medium = getPriority(),
  High = Medium * 2,
}

console.log(TaskPriority.Medium);
// 출력: 10
console.log(TaskPriority.High);
// 출력: 20

Enum 사용 시 주의점

  • 숫자형은 간단하지만 암묵적 증가에 주의하고, 문자열형은 명확하지만 매핑이 제한됩니다.
  • 단순히 상수 객체로 충분한 경우 `{ readonly key: value }`를 사용합니다.