Enum

μ—΄κ±°ν˜• μžλ£Œν˜•
const ADMIN = 0; const READ_ONLY = 1; const AUTHOR = 2; const person = { name: 'Maximilian', age: 30, hobbies: ['Sports', 'Cooking'], role: ADMIN // 0 };
enum이 없이 μ‚¬λžŒμ΄ 읽기 μ‰½κ²Œ μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” μˆ«μžν˜•νƒœλ‘œ μž‘μ„±ν•΄μ£ΌλŠ”κ²Œ μ’‹λ‹€. μ™œλƒν•˜λ©΄ μ‚¬λžŒλ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— ν—·κ°ˆλ¦΄ μˆ˜κ°€ μžˆλ‹€.
κ·Έλž˜μ„œ λ³€μˆ˜λ₯Ό 톡해 μˆ«μžν˜•νƒœλ‘œ ν• λ‹Ήν• μˆ˜ μžˆμ§€λ§Œ, μ½”λ“œκ°€ κΈΈμ–΄μ§€λ©΄ μ΄κ²ƒλ§ˆμ € ν—·κ°ˆλ¦΄μˆ˜κ°€μžˆλ‹€.
κ·Έλž˜μ„œ λ“±μž₯ν•œκ²Œ enum μ—΄κ±°ν˜• 이닀.
enum Role { ADMIN = 'ADMIN', READ_ONLY = 100, AUTHOR = 'AUTHOR' }; // Custom ν˜•νƒœμ΄κΈ° λ•Œλ¬Έμ— μ²«κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ μž‘μ„±ν•œλ‹€. const person = { name: 'Maximilian', age: 30, hobbies: ['Sports', 'Cooking'], role: Role.ADMIN };
enum의 μž₯점 :
  • Customν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜κΈ°λ•Œλ¬Έμ—, ν•΄λ‹Ή 객체에 μ§„μž…ν•˜κ²Œλ˜λ©΄ listλ₯Ό λ³Όμˆ˜κ°€ μžˆλ‹€.
μ½”λ“œλ₯Ό 예λ₯Ό λ“€λ©΄, Role.ADMIN , Role.READ_ONLY, Role.AUTHOR 리슀트λ₯Ό IDEμ—μ„œ 확인 ν•  수 μžˆλ‹€.
  • μˆ«μžλΏλ§Œμ•„λ‹ˆλΌ 문자둜 기본값을 μ§€μ •ν•  μˆ˜κ°€ μžˆλ‹€. (μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 0λΆ€ν„° μ°¨λ‘€λ‘œ ν• λ‹Ήλœλ‹€.)

Enum

μ΄λ„˜μ€ C, Java와 같은 λ‹€λ₯Έ μ–Έμ–΄μ—μ„œ ν”ν•˜κ²Œ μ“°μ΄λŠ” νƒ€μž…μœΌλ‘œ νŠΉμ • κ°’(μƒμˆ˜)λ“€μ˜ 집합을 μ˜λ―Έν•œλ‹€.
enum Avengers {Capt, IronMan, Thor} let hero: Avengers = Avengers.capt let hero: Avengers = Avengers[0] //μ΄λ„˜μ€ 인덱슀 번호둜 μ ‘κ·Ό ν•  수 μžˆλ‹€.
λ§Œμ•½μ—, μ›ν•œλ‹€λ©΄ μ΄λ„˜μ˜ 인덱슀λ₯Ό μ‚¬μš©μž 편의둜 λ³€κ²½ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
enum Avengers = { Capt = 2 , IronMan, Thor} let hero: Avengers = Avengers[2]; // Capt let hero: Avengers = Avengers[4]; // Thor
const Direction - { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT" } // μƒμˆ˜μ§‘ν•© const Direction2 - { Up : "UP", Down : "DOWN", Left : "LEFT", Right : "RIGHT" } //μƒμˆ˜κ°μ²΄ const Direction3 = { Up, Down, Left, Right } // Enum은 멀버에 값을 ν• λ‹Ήν•˜μ§€ μ•ŠμœΌλ©΄, νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μžλ™μœΌλ‘œ 값을 ν• λ‹Ή ν•œλ‹€. let myEnumVar = Direction3.Downl myEnumVar = "hello"; // "hello" ν˜•μ‹μ€ 'Directioin3'ν˜•μ‹μ— λŒ€μž…ν•  수 μ—†μŒ.(였λ₯˜)

Enum을 μ‚¬μš©ν•˜λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μ˜λ¦¬ν•˜κ²Œ λ‹€μŒμ„ κ²€μ‚¬ν•œλ‹€.

enum E { Foo, Bar } function f(x: E){ if( x!==E.Foo || x !== E.Bar){ // 였λ₯˜ ! 'E.Foo'와 'E.Bar'λŠ” μ„œλ‘œ κ²ΉμΉ˜μ§€ μ•ŠμœΌλ―€λ‘œ 이 쑰건은 항상 'μ°Έ'이닀. } }
μœ ν•œν•œ 경우의 수λ₯Ό κ°–λŠ” κ°’μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ—΄κ±°ν˜•(enum) νƒ€μž…μ— λŒ€ν•΄ λ°°μš΄λ‹€.

숫자 μ—΄κ±°ν˜•(Numeric Enum)

숫자 μ—΄κ±°ν˜•μ€ number νƒ€μž… 값에 κΈ°λ°˜ν•œ μ—΄κ±°ν˜•μ΄λ‹€.
λ§Œμ•½ μ—΄κ±°ν˜•μ„ μ •μ˜ν•˜λ©° λ©€λ²„μ˜ 값을 μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šμ„ 경우, ν•΄λ‹Ή λ©€λ²„μ˜ 값은 0λΆ€ν„° 순차적으둜 μ¦κ°€ν•˜λŠ” 숫자 값을 κ°–λŠ”λ‹€.
예λ₯Ό λ“€μ–΄ μ•„λž˜ 예제 두 μ˜ˆμ œλŠ” λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€.
enum Direction { East, West, South, North } enum ExplicitDirection { East = 0, West = 1, South = 2, North = 3 }
μ΄λ ‡κ²Œ μ •μ˜ν•œ μ—΄κ±°ν˜•μ˜ λ©€λ²„μ—λŠ” 객체의 속성에 μ ‘κ·Όν•˜λŠ” 것과 λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.
μ–΄λ–€ μ—΄κ±°ν˜• Enum의 λͺ¨λ“  λ©€λ²„λŠ” Enum νƒ€μž…μ„ κ°–λŠ”λ‹€.
const south: Direction = Direction.South; console.log(south); // 2

멀버 κ°’ μ΄ˆκΈ°ν™”

0λΆ€ν„° μ‹œμž‘λ˜λŠ” μžλ™ μ΄ˆκΈ°ν™”μ— μ˜μ‘΄ν•˜λŠ” λŒ€μ‹ , 각 λ©€λ²„μ˜ 값을 직접 μ΄ˆκΈ°ν™” ν•  수 μžˆλ‹€.
enum InitializedDirection { East = 2, West = 4, South = 8, North = 16 }
λ§Œμ•½ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ€ 멀버가 μ„žμ—¬μžˆλ‹€λ©΄, κ·Έ λ©€λ²„μ˜ 값은 이전에 μ΄ˆκΈ°ν™”λœ λ©€λ²„μ˜ κ°’μœΌλ‘œλΆ€ν„° 순차적으둜 μ¦κ°€ν•΄μ„œ κ²°μ •λœλ‹€.
enum InitializedDirection2 { East = 3, West /* 4 */, South = 7, North /* 8 */ }

λ¬Έμžμ—΄ μ—΄κ±°ν˜•(String Enum)

number νƒ€μž… κ°’ λŒ€μ‹  string νƒ€μž… 값을 μ‚¬μš©ν•΄μ„œ 멀버 값을 μ΄ˆκΈ°ν™”ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.
enum Direction { East = 'EAST', West = 'WEST', South = 'SOUTH', North = 'NORTH' }
λ¬Έμžμ—΄ μ—΄κ±°ν˜•μ€ 숫자 μ—΄κ±°ν˜•κ³Ό λ‹€μŒ 뢀뢄을 μ œμ™Έν•˜κ³ λŠ” λ§Žμ€ λΆ€λΆ„ λ™μΌν•˜λ‹€.
  • λ¬Έμžμ—΄μ„ β€˜μžλ™ 증가’ μ‹œν‚¨λ‹€λŠ” κ°œλ…μ€ μ„±λ¦½ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ λ¬Έμžμ—΄ 멀버 μ΄ν›„λ‘œ μ •μ˜λœ λͺ¨λ“  λ©€λ²„λŠ” λͺ…μ‹œμ μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜μ–΄μ•Ό ν•œλ‹€.
  • 숫자 μ—΄κ±°ν˜•κ³Ό 달리, λ¬Έμžμ—΄ μ—΄κ±°ν˜•μ΄ 컴파일된 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—λŠ” κ°’ β†’ ν‚€ 의 μ—­λ°©ν–₯ λ§€ν•‘(reverse mapping)이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
ν•œ μ—΄κ±°ν˜•μ—μ„œ 숫자 멀버와 λ¬Έμžμ—΄ 멀버λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜λŠ” μ‹μ˜ μ΄ν˜• μ—΄κ±°ν˜•(Heterogeneous Enum)도 문법 상 ν—ˆμš©μ€ λœλ‹€. ν•˜μ§€λ§Œ μ΄ν˜• μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•΄ 큰 이득을 얻을 수 μžˆλŠ” κ²½μš°λŠ” λ“œλ¬Όκ³ , λŒ€λΆ€λΆ„μ˜ 경우 ν˜Όλž€μ„ 뢈러 올 수 μžˆμ–΄ ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

μƒμˆ˜ 멀버와 κ³„μ‚°λœ 멀버

μ§€κΈˆκΉŒμ§€ 닀룬 μ—΄κ±°ν˜•μ˜ λ©€λ²„λŠ” λͺ¨λ‘ λͺ…μ‹œμ μ΄λ“ , μ•”μ‹œμ λ“  컴파일 νƒ€μž„μ— μ•Œ 수 μžˆλŠ” μƒμˆ˜κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” λ˜μ—ˆλ‹€.
이런 μ—΄κ±°ν˜• 멀버λ₯Ό μƒμˆ˜ 멀버(constant member)라 λΆ€λ₯Έλ‹€.
function getAnswer() { return 42; } enum SpecialNumbers { Answer = getAnswer(), Mystery // error TS1061: Enum member must have initializer. }

λŸ°νƒ€μž„μ—μ„œμ˜ μ—΄κ±°ν˜•

기본적으둜 μ•„λž˜μ™€ 같은 νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—μ„œμ˜ μ—΄κ±°ν˜• μ •μ˜ 및 접근은
enum Direction { East, West, South, North } const east: Direction = Direction.East;
μ•„λž˜μ™€ 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ 컴파일 λœλ‹€.
var Direction; (function (Direction) { Direction[Direction["East"] = 0] = "East"; Direction[Direction["West"] = 1] = "West"; Direction[Direction["South"] = 2] = "South"; Direction[Direction["North"] = 3] = "North"; })(Direction || (Direction = {})); var east = Direction.East;
이 μ½”λ“œλ₯Ό 보면 두 κ°€μ§€ 일이 μΌμ–΄λ‚˜κ³  μžˆμŒμ„ 확인할 수 μžˆλ‹€.
  • μ‹λ³„μžμ— ν‚€ β†’ κ°’μœΌλ‘œμ˜ 맀핑이 μ •μ˜λœλ‹€. (Direction["EAST"] = 0)
  • μ‹λ³„μžμ— κ°’ β†’ ν‚€λ‘œμ˜ μ—­λ°©ν–₯ 맀핑이 μ •μ˜λœλ‹€. (Direction[Direction["East"] = 0] = "East")
λ¬Έμžμ—΄ μ—΄κ±°ν˜•μ˜ 경우 μ•žμ„œ μ–ΈκΈ‰ν•œλŒ€λ‘œ μ—­λ°©ν–₯ 맀핑이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. μ•„λž˜μ˜ λ¬Έμžμ—΄ μ—΄κ±°ν˜•μ€
enum Direction { East = 'EAST', West = 'WEST', South = 'SOUTH', North = 'NORTH' } ---------------Javascript Code----------------- var Direction; (function (Direction) { Direction["East"] = "EAST"; Direction["West"] = "WEST"; Direction["South"] = "SOUTH"; Direction["North"] = "NORTH"; })(Direction || (Direction = {}));
컴파일된 μ½”λ“œλ‘œλΆ€ν„° μ—΄κ±°ν˜• 멀버에 μ ‘κ·Ό ν•  λ•Œ μ‹€μ œλ‘œ μ½”λ“œκ°€ 싀행될 λ•Œμ—λ„ 객체 속성 접근이 λ°œμƒν•¨μ„ μ•Œ 수 μžˆλ‹€.
이 μ˜€λ²„ν—€λ“œλŠ” λŒ€λΆ€λΆ„μ˜ 경우 λ¬΄μ‹œ κ°€λŠ₯ν•  μˆ˜μ€€μ΄λ‹€.
κ·ΈλŸΌμ—λ„ μ„±λŠ₯ ν–₯상을 κΎ€ν•˜κ³  μ‹Άλ‹€λ©΄ const μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
λͺ¨λ“  멀버가 컴파일 μ‹œκ°„μ— μ•Œλ €μ§„ μƒμˆ˜κ°’μΈ μ—΄κ±°ν˜•μ˜ 경우 enum ν‚€μ›Œλ“œ λŒ€μ‹  const enum ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ μ •μ˜ν•  수 μžˆλ‹€.
μ΄λ ‡κ²Œ μ •μ˜ν•œ μ—΄κ±°ν˜•μ˜ κ΅¬μ‘°λŠ” 컴파일 κ³Όμ •μ—μ„œ μ™„μ „νžˆ 사라지고, λ©€λ²„μ˜ 값은 μƒμˆ˜κ°’μœΌλ‘œ λŒ€μ²΄λœλ‹€. μ•„λž˜μ˜ 예제λ₯Ό 보자.
const enum ConstEnum { A, B = 2, C = B * 2, D = -C, } console.log(ConstEnum.A);
μœ„ μ½”λ“œλŠ” μ•„λž˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ μ»΄νŒŒμΌλœλ‹€.
console.log(0 /* A */);
주석을 μ œμ™Έν•˜κ³ λŠ” μ—΄κ±°ν˜•μ˜ μ›λž˜ ꡬ쑰에 λŒ€ν•œ μ–΄λ– ν•œ 정보도 λ‚¨μ•„μžˆμ§€ μ•Šκ³ , μƒμˆ˜κ°’μœΌλ‘œ λŒ€μ²΄λ˜μ–΄ μžˆμŒμ„ 확인할 수 μžˆλ‹€.

μœ λ‹ˆμ˜¨ μ—΄κ±°ν˜•

μ—΄κ±°ν˜•μ˜ λͺ¨λ“  멀버가 μ•„λž˜ 경우 쀑 ν•˜λ‚˜μ— ν•΄λ‹Ήν•˜λŠ” μ—΄κ±°ν˜•μ„ μœ λ‹ˆμ˜¨ μ—΄κ±°ν˜•(union enum)이라 λΆ€λ₯Έλ‹€.
  • μ•”μ‹œμ μœΌλ‘œ μ΄ˆκΈ°ν™” 된 κ°’ (값이 ν‘œκΈ°λ˜μ§€ μ•ŠμŒ)
  • λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄
  • 숫자 λ¦¬ν„°λŸ΄
예λ₯Ό λ“€μ–΄ μ•„λž˜ ShapeKind μ—΄κ±°ν˜•μ€ μœ λ‹ˆμ˜¨ μ—΄κ±°ν˜•μ΄λ‹€.
enum ShapeKind { Circle, Triangle = 3, Square }
μœ λ‹ˆμ˜¨ μ—΄κ±°ν˜•μ˜ λ©€λ²„λŠ” 값인 λ™μ‹œμ— νƒ€μž…μ΄ λœλ‹€. λ”°λΌμ„œ 예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
type Circle = { kind: ShapeKind.Circle; radius: number; } type Triangle = { kind: ShapeKind.Triangle; maxAngle: number; } type Square = { kind: ShapeKind.Square; maxLength: number; } type Shape = Circle | Triangle | Square;
λ˜ν•œ μ»΄νŒŒμΌλŸ¬λŠ” μœ λ‹ˆμ˜¨ μ—΄κ±°ν˜•μ˜ νŠΉμ§•μœΌλ‘œλΆ€ν„° 컴파일 νƒ€μž„μ— 좔가적인 검사λ₯Ό μ‹œν–‰ν•  수 μžˆλ‹€.
이에 λŒ€ν•΄μ„œλŠ” μΆ”ν›„ νƒ€μž… 쒁히기(type narrowing)에 λŒ€ν•΄ λ‹€λ£° λ•Œ ν•¨κ»˜ 닀룬닀.

μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ΄μš©ν•œ μ—΄κ±°ν˜• ν‘œν˜„

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 숫자, λ¬Έμžμ—΄ 그리고 λΆˆλ¦¬μ–Έ 값을 νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ¦¬ν„°λŸ΄ νƒ€μž…(literal type)을 μ§€μ›ν•œλ‹€.
λ¦¬ν„°λŸ΄ νƒ€μž…μ„ μ΄μš©ν•΄ 단 ν•˜λ‚˜μ˜ κ°’λ§Œμ„ κ°–λŠ” νƒ€μž…μ„ μ •μ˜ν•  수 μžˆλ‹€.
const answer: 42 = 42; const wrongAnswer: 42 = 24; // error TS2322: Type '24' is not assignable to type '42'.
이 λ•Œ λ¦¬ν„°λŸ΄ νƒ€μž…κ³Ό μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ‘°ν•©ν•΄ μ—΄κ±°ν˜•κ³Ό μœ μ‚¬ν•œ νƒ€μž…μ„ λ§Œλ“€ 수 μžˆλ‹€.
type Direction = 'EAST' | 'WEST' | 'SOUTH' | 'NORTH'; const east: Direction = 'EAST'; const center: Direction = 'CENTER'; // error TS2322: Type '"CENTER"' is not assignable to type 'Direction'.