chap.5 ENUM

유원근·2020년 12월 23일
0
post-thumbnail

열거형인 ENUM에 대하여 알아보아요!

보통 Java에서 자주 접해본 경험이 있을 수 있을것 같은데, 타입스크립트에서는 문자형 이넘과 숫자형 이넘을 지원하고 있습니다.

사용

열거형은 상수들의 집합에 이름을 부여할 수 있습니다.

숫자형 ENUM

스타벅스 등급을 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 값을 모두 초기에 특정 문자 또는 다른 이넘 값으로 초기화 해줘야 합니다.

enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}

또한, 문자형 이넘에는 숫자형 이넘과는 다르게 auto-incrementing이 없습니다. 대신 디버깅을 할 때 숫자형 이넘의 값은 가끔 불명확하게 나올 때가 있지만 문자형 이넘은 항상 명확한 값이 나와 읽기 편합니다.

0개의 댓글