| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- 정처기
- 코딩테스트
- 리액트
- JS
- 백준5086
- Vue
- JavaScript
- reactrouter
- 백준10798
- 이벤트버블링
- NextJs
- 정처기필기
- styled-components
- 백준
- 파이썬
- Vue3
- 백준10815
- zustand
- 정보처리기사
- 정처기실기
- react
- 자바스크립트
- 타입스크립트
- 백준2501
- 코딩테스크
- TypeScript
- 바닐라js
- 투두리스트
- 코테
- 10815
Archives
- Today
- Total
윤시의 블로그
[TypeScript] 열거형(enum) 본문
열거형(Enum)
열거형(enum)은 타입스크립트에서 특정 값들의 집합에 이름을 부여해 가독성과 유지보수성을 높이는 데 사용한다. 일반적으로 상수들의 묶음을 정의할 때 유용하다.
왜 열거형을 사용할까?
- 숫자나 문자열 값들에 의미있는 이름을 붙여 가독성을 높임
- 상수값들을 일관되게 관리하기 위해서
1. 숫자 열거형
숫자 열거형은 기본적으로 값이 0부터 시작하며, 값이 자동으로 1씩 증가한다.
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
console.log(Direction.Up); // 출력: 0
console.log(Direction.Right); // 출력: 3
→ 값을 명시하지 않으면, 0부터 시작해 1씩 자동 증가한다.
enum Direction {
Up = 1,
Down,
Left = 5,
Right
}
console.log(Direction.Down); // 출력: 2
console.log(Direction.Right); // 출력: 6
→ 물론 명시적으로 값을 지정하는 것도 가능하다.
2. 문자열 열거형
문자열 열거형은 각 열거형 멤버에 명시적으로 문자열 값을 지정한다. 숫자와 달리, 자동 증가 기능이 없으므로 값은 항상 명시적으로 설정해야 한다.
enum Status {
Success = "SUCCESS",
Failure = "FAILURE",
Pending = "PENDING"
}
console.log(Status.Success); // 출력: "SUCCESS"
console.log(Status.Failure); // 출력: "FAILURE"
3. 혼합 열거형
숫자형과 문자열을 혼합하여 사용할 수도 있지만, 자주 사용되는 문법은 아니다.
enum MixedEnum {
No = 0,
Yes = "YES",
}
console.log(MixedEnum.No); // 출력: 0
console.log(MixedEnum.Yes); // 출력: "YES"
4. 열거형의 특징
4.1 역방향 매핑(숫자 열거형만 가능)
숫자 열거형은 값에서 이름으로도 접근이 가능하다.
enum Color {
Red = 1, // 명시적으로 1로 시작
Green, // 이전 값(1) + 1 → 2
Blue // 이전 값(2) + 1 → 3
}
console.log(Color.Green); // 출력: 2
console.log(Color[2]); // 출력: "Green"
4.2 객체처럼 사용 가능
열거형은 내부적으로는 객체로 변환되므로, 반복문 등에서 사용할 수 있다.
enum Days {
Monday,
Tuesday,
Wednesday
}
for (const day in Days) {
console.log(day); //출력: Monday, Tuesday, Wednesday, 0, 1, 2
}
숫자 열거형은 양방향 매핑을 생성한다. 즉, 열거형은 이름 → 값 매핑뿐만 아니라 값 → 이름 매핑도 포함한다.
enum Days {
Monday, // 0
Tuesday, // 1
Wednesday // 2
}
위 코드를 컴파일 하면, 아래와 같은 객체로 변환된다.
{
0: "Monday",
1: "Tuesday",
2: "Wednesday",
Monday: 0,
Tuesday: 1,
Wednesday: 2
}
이렇게 양방향 매핑이 생성되기 때문에, 열거형은 키로도, 값으로도 접근이 가능하다.
for...in은 이 객체의 **모든 키(문자열과 숫자)**를 순회한다.
즉, 출력 순서는
- "Monday", "Tuesday", "Wednesday" (이름 → 값 매핑의 키들)
- "0", "1", "2" (값 → 이름 매핑의 키들)
만약, 열거형의 이름만 출력하려면 (숫자키를 제외한)
for (const day of Object.keys(Days)) {
if(isNaN(Number(day))) {
console.log(day);
}
}
→ Object.keys()를 활용하고 isNaN으로 숫자를 필터링!
5. const enum
** 참고 **
- 컴파일 : TS 코드를 작성한 후, JS로 변환하는 과정 ⇒ 프로그램 실행 전
- 런타임 : 컴파일된 프로그램이 실제로 실행되는 단계
1. 일반 enum
enum Colors {
RED = "#ff0000",
GREEN = "#00ff00",
BLUE = "#0000ff",
}
console.log(Colors.BLUE); // "#0000ff"
컴파일 결과 (JavaScript)
"use strict";
var Colors; // 객체 생성
(function (Colors) {
Colors["RED"] = "#ff0000";
Colors["GREEN"] = "#00ff00";
Colors["BLUE"] = "#0000ff";
})(Colors || (Colors = {}));
console.log(Colors.BLUE); // "#0000ff"
- 타입스크립트는 일반 enum을 런타임에 사용할 수 있도록 Colors 객체를 생성한다.
- Colors는 다음과 같은 객체로 정의된다.
- { RED: "#ff0000", GREEN: "#00ff00", BLUE: "#0000ff" }
- console.log(Colors.BLUE)는 객체에서 값을 읽어오는 방식으로 동작한다.
특징
- 런타임에 Colors라는 객체가 생성된다. ⇒ 런타임 시점에 객체가 생성되고 메모리에 올라간다.
- 역방향 매핑(숫자 열거형에서만 가능) 및 동적 처리가 가능하다.
- 약간의 런타임 오버헤드(객체 생성 및 참조)가 발생한다.
2. const enum
const enum ConstColors {
RED = "#ff0000",
GREEN = "#00ff00",
BLUE = "#0000ff",
}
console.log(ConstColors.BLUE); // "#0000ff"
컴파일 결과 (JavaScript)
"use strict";
console.log("#0000ff" /* ConstColors.BLUE */);
- const enum은 컴파일 시점에 최적화.
- 타입스크립트는 열거형 객체를 생성하지 않고, 열거형 값 자체를 인라인으로 삽입.
- 따라서 ConstColors.BLUE는 컴파일된 코드에서 직접 "#0000ff"로 대체된다.
특징
- 런타임 객체 생성 없음: ConstColors라는 객체는 런타임에 존재하지 않는다.
- 최적화된 성능: 코드 크기가 줄어들고, 참조를 제거해 성능이 향상된다.
- 제한사항:
- 동적 참조 불가: 예를 들어, const enum을 사용해 Object.keys(ConstColors) 같은 동적 접근은 불가능하다.
- 역방향 매핑은 지원하지 않는다.
일반 enum vs const enum
| 일반 enum | const enum | |
| 런타임 객체 생성 | 있음 (런타임에 열거형 객체 생성) | 없음 (컴파일 시 값이 인라인으로 삽입됨) |
| 컴파일 결과 크기 | 크다 (양방향 매핑 코드 포함) | 작다 (필요한 값만 삽입) |
| 역참조 가능 여부 | 가능 (숫자 → 이름 변환 등) | 불가능 (숫자 → 이름 변환 불가) |
| 동적 사용 가능 여부 | 가능 (런타임에 동적으로 열거형 조작 가능) | 불가능 (컴파일 시점에 값이 고정됨) |
| 사용 목적 | 런타임 동작이 필요한 경우 (역참조 등) | 성능 최적화와 간결한 코드가 필요한 경우 |
'TypeScript' 카테고리의 다른 글
| [TypeScript] 타입 추론, 타입 단언, 타입 가드, 타입 좁히기(Narrowing) (2) | 2025.03.23 |
|---|---|
| [TypeScript] interface 문법, &(intersection) (0) | 2025.03.03 |
| [TypeScript] 제네릭(Generics) < > (1) | 2025.01.06 |
| [TypeScript] union, any, unknown 타입 (0) | 2025.01.05 |