열거형인 ENUM
에 대하여 알아보아요!
보통 Java에서 자주 접해본 경험이 있을 수 있을것 같은데, 타입스크립트에서는 문자형 이넘과 숫자형 이넘을 지원하고 있습니다.
열거형은 상수들의 집합에 이름을 부여할 수 있습니다.
스타벅스 등급을 enum
으로 표현해 볼까요
enum StarbucksGrade {
WELCOME,
GREEN,
GOLD,
}
이제 스타벅스 회원이 등급에 따라 할인을 해주는 함수를 만들어줄것이에요.
enum StarbucksGrade {
WELCOME,
GREEN,
GOLD,
}
function getDiscount(v: StarbucksGrade): number {
switch (v) {
case StarbucksGrade.WELCOME:
return 0;
case StarbucksGrade.GOLD:
return 10;
case StarbucksGrade.GREEN:
return 5;
}
}
enum도 타입이기 때문에 매개변수의 타입으로 지정해 줄 수 있습니다.
이렇게 함수를 만들어준뒤에 getDiscount를 호출하면 다음과 같이 호출을 해주어야만 합니다.
console.log(getDiscount(StarbucksGrade.GREEN));
왜 인자로 이넘타입을 바로 넣어줄 수 있었을까요?
이넘은 런타임시에 실제 객체 형태로 존재합니다.
아래와 같이 컴파일해서 본다면 실제 StarbucksGrade
에는 0,1,2
순서로 숫자값이 할당이 되어 있습니다. 뿐만 아니라 쌍방으로 데이터가 바인딩되어 있는데 다음과 같이 확인할 수 있어요.
이를 리버스 매핑(Reverse Mapping) 이라고 부릅니다.
{
0: "WELCOME",
1: "GREEN",
2: "GOLD",
WELCOME: 0,
GREEN: 1,
GOLD: 2,
}
이렇게 되면
0,1,2
와 같은 숫자로도 접근이 가능하고,WELCOME
과 같은 문자로도 접근이 가능하겠죠?
즉 ENUM은 인덱스 번호로도 접근할 수도 있습니다.
단, 숫자형 ENUM에 한정됩니다.
enum 사용시에는 주의해야 할 점이 있습니다.
만약 중간에 값이 다음과 같이 새로운 DDD
등급이 들어가게 된다면, 문제가 발생합니다.
enum StarbucksGrade {
WELCOME,
DDD,
GREEN,
GOLD,
}
숫자들이 하나씩 밀리기 때문에 지정된 번호또한 모두 변경이 되겠죠?
그렇다면 저 번호를 기억하고 작성한 코드들에서 이상한 결과가 출력될 것입니다.
그렇기 때문에 아예 초기에 ENUM에 들어갈 값들을 지정해주고 사용하는 것을 무조건 권장합니다.
아래와 같이 말이죠~!
enum StarbucksGrade {
WELCOME = 0,
DDD = 3,
GREEN = 1,
GOLD = 2,
}
문자형 ENUM은 숫자형 ENUM과 개념적으로는 거의 비슷합니다. 다만, 런타임에서의 미세한 차이가 있습니다.
일단 문자형 ENUM은 ENUM 값을 모두 초기에 특정 문자 또는 다른 이넘 값으로 초기화 해줘야 합니다.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
또한, 문자형 이넘에는 숫자형 이넘과는 다르게 auto-incrementing
이 없습니다. 대신 디버깅을 할 때 숫자형 이넘의 값은 가끔 불명확하게 나올 때가 있지만 문자형 이넘은 항상 명확한 값이 나와 읽기 편합니다.