[TS] 이넘이란?

chaevivi·2023년 10월 2일
0
post-thumbnail

타입스크립트 이넘이란?



1. 이넘이란?

이넘(enum)은 특정 값의 집합을 의미하는 데이터 타입입니다.

이넘으로 이름이 있는 상수들의 집합을 정의할 수 있습니다.
여기서 상수란 변하지 않는 고정된 값을 말합니다. 이넘으로 변하지 않는 값들의 집합을 정의할 수 있습니다.


  • 문법
    enum Animation {
      Titans,
      Haikyuu,
      Gintama
    }
    • 여러 개의 상수를 하나의 단위로 묶으면 이넘이 됩니다.
    • enum 키워드와 함께 여러 개의 상수(Titans, Haikyuu, Gintama)를 하나의 단위(Animation)으로 묶었습니다.
  • 이넘 값 속성에 접근
    const titan = Animation.Titans;
    • 이넘의 이름을 쓰고 . 접근자를 사용하여 속성 이름을 붙여 접근할 수 있습니다.


2. 이넘의 종류

이넘은 속성이 어떤 값을 가지고 있느냐에 따라 구분할 수 있습니다.


2.1. 숫자 이넘 (Numeric enums)

이넘의 속성은 기본적으로 숫자 값을 가집니다.


  • 이넘의 속성에 값을 지정하지 않으면 기본적으로 숫자 0부터 시작하여 순서대로 1씩 증가된 값을 갖습니다.

    enum Animation {
      Titans,    // 0
      Haikyuu,    // 1
      Gintama    // 2
    }
    
    console.log(Animation.Haikyuu);    // 1
  • 이넘 속성의 초기값을 변경할 수 있습니다.

    • 첫 번째 속성에 초기값을 할당하면 그 다음 속성들에는 순서대로 1씩 증가된 값을 갖습니다.
    enum Animation {
      Titans = 10,    // 10
      Haikyuu,    // 11
      Gintama    // 12
    }
    
    console.log(Animation.Haikyuu);    // 11

1씩 자동으로 증가하는 기능은 왜 필요할까?
자동으로 증가하는 기능은 각 속성의 값 자체에는 큰 의미가 없고, 각 값이 해당 이넘의 다른 속성의 값들과 구별돼야 하는 경우에 유용합니다.


2.1. 문자형 이넘 (String enums)

이넘 속성의 값으로 문자열을 할당할 수 있습니다.


  • 문자형 이넘은 모든 속성 값을 다 문자열로 지정해야 합니다. 또한, 순서대로 1씩 증가하는 규칙이 없습니다.
    enum Direction {
      Up = "UP",
      Down = "DOWN",
      Left = "LEFT",
      Right = "RIGHT"
    }
  • 문자형 이넘은 "직렬화"를 잘할 수 있는 장점을 가집니다.
    • 숫자형 이넘을 사용하여 값을 읽어야 할 때, 가끔 해당 숫자 값은 이것이 어떤 의미인지 유의미한 정보를 제공해 주지 않습니다.
    • 문자형 이넘을 사용하면 이넘의 속성에 지정된 이름과는 무관하게 유의미하고 읽기 좋은 값을 이용하여 실행할 수 있습니다.
    • 실제로 이러한 이점 때문에 숫자로 관리하기 보다는 문자열로 관리하는 사례가 많습니다.


3. 이넘의 특징


3.1. 혼합 이넘 (Heterogeneous enums)

이넘에 숫자와 문자열을 섞어서 선언할 수 있습니다.

enum Answer {
  Yes = 'Yes',
  No = 1

이넘 값은 일관되게 숫자나 문자열 둘 중 하나의 데이터 타입으로 관리하는 것이 좋기 때문에, 이렇게 사용하지 않는 것을 권장합니다.


3.2. 다양한 이넘 속성 값 정의 방식

이넘의 속성 값으로 상수뿐만 아니라 다양한 형태로 값을 할당할 수 있습니다.

enum FileAccess {
  None,
  Read = 1 << 1,
  Write = 1 << 2,
  ReadWrite = Read | Write,
  G = "123".length,
}

  • 이넘의 속성 값에서 사용할 수 있는 표현식은 다음과 같습니다.
    1. 리터럴 이넘 표현식 (기본적으로 문자 리터럴 또는 숫자 리터럴)
    1. 이전에 정의된 다른 상수 이넘 속성에 대한 참조 (다른 이넘에서 시작될 수 있습니다.)
    2. 괄호로 묶인 상수 이넘 표현식
    3. 상수 이넘 표현식에 단항 연산자 +, -, ~를 사용한 경우
    4. 상수 열거형 표현식을 이항 연산자 +, -, *, /, %, <<, >>, >>>, &, |, ^의 피연산자로 사용할 경우
  • 상수 이넘 표현식의 값이 NaN이거나 Infinity이면 컴파일 시점에 오류가 발생합니다.

3.3. const 이넘

const 이넘이란 이넘을 선언할 때 앞에 const를 붙인 이넘을 의미합니다.


  • const 이넘은 컴파일 시점의 코드 양을 줄여줍니다.
  • const 이넘을 사용하면 이넘의 값에 접근할 때, 추가적으로 생성된 코드나 추가적인 간접 참조에 대한 비용을 피할 수 있습니다.
  • const 이넘의 속성에는 상수 값만 넣어주어야 합니다.
  • 일반 이넘 컴파일 결과
    const enum Direction {
      Up,
      Down,
      Left,
      Right
    }
    // 컴파일 결과
    "use strict";
    var Direction;
    (function (Direction) {
      Direction["Up"] = "Up";
      Direction["Down"] = "Down";
      Direction["Left"] = "Left";
      Direction["Right"] = "Right";
      {)(Direction || (Direction = {}));
  • const 이넘 컴파일 결과
    const enum Direction {
      Up,
      Down,
      Left,
      Right
    }
    "use strict";


3. 언제 사용하는 것이 좋을까?

이넘은 비슷한 성격이나 같은 범주에 있는 상수를 하나로 묶어 더 큰 단위의 상수로 만들 때 사용합니다.




참고
📖 쉽게 시작하는 타입스크립트
🔗https://www.typescriptlang.org/ko/docs/handbook/enums.html#%EC%88%AB%EC%9E%90-%EC%97%B4%EA%B1%B0%ED%98%95-numeric-enums

profile
직접 만드는 게 좋은 프론트엔드 개발자

0개의 댓글