최종수정 : 2024-05-30
이넘 타입(enum type)
여러가지 값에 이름을 부여해 열거해두고 사용하는 타입
자바스크립트에는 이넘이 없다. 이를 자바스크립트로 표현하자면, 객체와 비슷하다.
즉시실행함수 형식으로 값이 나온다.
특정 값의 집합을 의미하는 데이터 타입이며, 상수 집합이라고도 표현한다. 비슷한 성격이나 같은 범주에 있는 상수를 하나로 묶어 더 큰 단위의 상수로 만드는 역할을 한다.
또한, 이넘은 컴파일을 해도 사라지지 않는다.
const user1 = {
name : 'A',
role : 0 // <- 관리자
}
const user2 = {
name : 'B',
role : 1 // <- 일반 유저
}
const user3 = {
name: 'C',
role: 2 // <- 게스트
}
// enum 활용
enum Role {
ADMIN = 0,
USER = 1,
GUEST = 2,
}
==>
const user1 = {
name: 'A',
role: Role.ADMIN,
};
const user2 = {
name: 'B',
role: Role.USER,
};
const user3 = {
name: 'C',
role: Role.GUEST,
};
숫자형 이넘
이넘에 선언된 속성은 기본적으로 숫자 값을 갖는다. 첫 번째 속성부터 0, 1, 2, 3이 할당된다. 다만, 실제 코드를 작성할 때는 명시적으로 값을 설정하는 것이 컴파일 결과를 보지 않고도 값을 빠르게 파악할 수 있다.
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right, // 3
}
// 초기값 변경
enum Direction {
Up = 10,
Down, // 11
Left, // 12
Right, // 13
}
cf. 리버스 매핑(reverse mapping)
이넘의 속성과 값이 거꾸로 연결되어 할당되는 것
enum Direction {
Up,
Down,
Left,
Right,
}
Direction["Up"] = 0;
Direction[Direction["Up"] = 0] = "Up";
Direction[0] = "Up";
문자형 이넘
이넘의 속성 값에 문자열을 연결한 이넘을 뜻하며, 모든 속성 값을 다 문자열로 지정해 주어야 하고, 규칙도 없다. 또한 실무에서는 문자열로 관리하는 사례가 더 많다. 대체로 속성 이름과 값을 동일한 문자열로 관리하는 것이 일반적인 코딩 규칙이다.
enum Direction {
Up = 'Up',
Down = 'Down',
Left = 'Left',
Right = 'Right'
}
그외 특징
1) 혼합 이넘
숫자와 문자열을 섞어서 선언할 수 있으나 권장하지는 않는다.
enum Answer {
Yes = 'Yes',
No = 1
}
2) 다양한 이넘 속성 값 정의 방식
고정 값뿐만 아니라 다양한 형태로 값을 할당할 수 있다. 그러나 잘 사용하지는 않는다.
3) const 이넘
이넘을 선언할 때 앞에 const를 붙인 것이며, - 컴파일 결과물의 코드양을 줄이기 위해 사용한다. 다만, 다양한 이넘 속성 값 정의 방식을 사용할 수 없고 항상 고정 값만 넣어 주어야 한다.
const enum logLevel {
Debug = 'Debug',
Info = 'Info',
Error = 'Error'
}
줄어드는 이유는?
이넘을 사용하지 말라는 이유는?
특정 컴파일러에서는 추적이 되지 않아서 컴파일이 되지 않아서 성능상 문제가 발생할 수 있다. 이럴 때, const 이넘을 사용하면 되지 않을까?
참고 자료
쉽게 시작하는 타입스크립트(p.161-174)
'프론트엔드 > TS 공부' 카테고리의 다른 글
tsconfig.json (0) | 2024.05.21 |
---|---|
제네릭 / 제네릭 타입 / 제네릭 인터페이스와 제네릭 타입 별칭 (0) | 2023.08.22 |
타입 별칭(type alias) / 인덱스 시그니처(index signature) (0) | 2023.07.26 |
리터럴 타입(literal type) / 유니언 타입(union type) / 인터섹션 타입(intersection type) (0) | 2023.07.26 |
인터페이스(Interface) (0) | 2023.07.26 |
댓글