TypeScript

[TypeScript] Enums

Dongi 2022. 1. 17. 08:42

안녕하세요 동기 여러분! 오늘은 커스텀 타입(Custom)의 첫 번째 시간! 에넘스(Enums)에 대해 알아봅시다.

 

Enums (열거형 데이터)

Enumerate를 영어 사전에 찾아보면 '열거하다'라는 뜻을 가지고 있습니다. → 음 그럼 Enums는 '무언가 열거를 하는 기능을 가지고 있겠구나'라고 생각하며 알아봅시다.

 


 

Numeric enums 숫자 에넘스

enum EnglandForces {
  HeavyBillMilitia = 1,
  SherwoodArchers,
  YeomanArchers,
  KnightsHospitaller
}
  • eum을 선언할 때 앞글자는 대문자를 써줍니다.
  • 위에 코드를 보면 잉글랜드 중세 시대 군대(EnlandForces)에 관한 enums입니다.
  • 현재 HeavyBillmilitia가 1로 정해져 있기 때문에 차례대로 SherwoodArchers는 2, YeomanArchers는 3, KnightHospitaller는 4라는 값을 가지게 됩니다. 

 

값에 숫자를 안 넣을 경우

enum EnglandForces {
  HeavyBillMilitia,
  SherwoodArchers,
  YeomanArchers,
  KnightsHospitaller
}
  • 값에 숫자가 없는 경우에는 0부터 시작하게 됩니다.
  • HeavyBillmilitia는 0, 차례대로 SherwoodArchers는 1, YeomanArchers는 2, KnightHospitaller는 3이라는 값을 가지게 됩니다. 

 

물론 값에 개발자가 원하는 숫자를 다 넣을 수도 있습니다.

enum EnglandForces {
  HeavyBillMilitia = 40,
  SherwoodArchers = 120,
  YeomanArchers = 20,
  KnightsHospitaller = 40
}

 


 

String enums 문자 에넘스

enum DenmarkForces {
  VikingRaiders = "바이킹 약탈자",
  DismountedHuscarls = "허스칼 보병대",
  Obudshaer = "오버샤이어",
  Huscarls = "허스칼"
}
  • 문자는 " " 큰따옴표(quotation marks)를 사용해서 값을 넣어주면 됩니다.

 


 

enums로 타입 선언(enums type annotation)

자 기본적인 enums에 대해서 알아보았으니 이를 이용해서 타입을 선언해보도록 하겠습니다.

enum DenmarkForces {
  VikingRaiders = "바이킹 약탈자",
  DismountedHuscarls = "허스칼 보병대",
  Obudshaer = "오버샤이어",
  Huscarls = "허스칼"
}

let myForces: DenmarkForces;
  • 다른 타입 선언 때와 마찬가지로 : (colon)을 써주고 그 옆에 타입 DenmarkForces 적어주면 끝입니다. 

 

타입이 선언이 된 변수에 값을 넣고 컴파일링 시 에러가 발생하는지 안 하는지 알아봅시다.

enum DenmarkForces {
  VikingRaiders = "바이킹 약탈자",
  DismountedHuscarls = "허스칼 보병대",
  Obudshaer = "오버샤이어",
  Huscarls = "허스칼"
}

let myForces: DenmarkForces;
myForces = DenmarkForces.Obudshaer;

오류 없이 잘들어갑니다.

 

없는 프로퍼티를 넣는 경우

enum DenmarkForces {
  VikingRaiders = "바이킹 약탈자",
  DismountedHuscarls = "허스칼 보병대",
  Obudshaer = "오버샤이어",
  Huscarls = "허스칼"
}

let myForces: DenmarkForces;
myForces = DenmarkForces.ObudshaerHuscarls;

프로퍼티 ObudshaerHuscarls는 타입 DenmarkForces에 존재하지 않는다고 에러를 띄워줍니다.

 

Direction 없이 프로퍼티만 넣는 경우

enum DenmarkForces {
  VikingRaiders = "바이킹 약탈자",
  DismountedHuscarls = "허스칼 보병대",
  Obudshaer = "오버샤이어",
  Huscarls = "허스칼"
}

let myForces: DenmarkForces;
myForces = Obudshaer;

Obudshaer를 찾을 수 없다고 에러가 뜹니다.

 


전쟁 준비

프랑스군이 수도 오르후스를 침략하러 오고 있습니다!!! 빨리 군대를 편성하여 전쟁을 준비해야 합니다!!!

enum DenmarkForces {
  CrossbowMen,
  DismountedHuscarls,
  Obudshaer,
  Huscarls
}

 

conscriptedForces라는 배열을 만들어 DenmarkForces라는 타입과 숫자 타입을 선언하여 병력의 수를 배열로 표현해보겠습니다.

 

enum DenmarkForces {
  CrossbowMen,
  DismountedHuscarls,
  Obudshaer,
  Huscarls
}

const conscriptedForces: [DenmarkForces, number][] = [
  [DenmarkForces.CrossbowMen, 400],
  [DenmarkForces.DismountedHuscarls, 600],
  [DenmarkForces.Obudshaer, 100],
  [DenmarkForces.Huscarls, 80]
];

 

이제 출정 준비를 모두 마쳤는데 다른 지방에 살고 있는 영주가 Ballista(발리스타) 열 문을 지원해와서 한 번 추가해보겠습니다.

 

enum DenmarkForces {
  CrossbowMen,
  DismountedHuscarls,
  Obudshaer,
  Huscarls
}

const conscriptedForces: [DenmarkForces, number][] = [
  [DenmarkForces.CrossbowMen, 400],
  [DenmarkForces.DismountedHuscarls, 600],
  [DenmarkForces.Obudshaer, 100],
  [DenmarkForces.Huscarls, 80]
];

conscriptedForces.push([DenmarkForces.Ballista, 10]);

 

.push를 사용하여 발리스타 열 문을 추가했는데 어떻게 될까요?

 

아.. 역시 프로퍼티 'Ballista'는 타입 DenmarkForces에 존재하지 않는다고 하는군요...

 

공성전은 불가할 거 같습니다 ㅠ  ㅠ 

 


 

오늘의 느낌

토탈워 시리즈를 정말 좋아하는데 미디블 토탈 워2, 로마 토탈 워2, 워해머 토탈 워, 삼국 토탈 워를 해봤는데 미디블 토탈 워2가 제일 재밌었던거 같다. 그다음은 삼국

워해머 토탈 워는 세계관도 잘 모르고 장군의 스킬 빨(?)을 너무 많이 받아 헷갈려서 못하겠...(너무 어려움)