[8장] 이넘

Sheryl Yun·2023년 11월 8일
0
post-thumbnail

개념

이넘(enum)이란, 상수 값들의 집합을 말한다.

용도

상수를 활용하여 특정 값에 의미를 부여한다.

예시

function getDinnerPrice() {
	return 10000 + 2000;
}

위 코드에서 10000과 2000이 어떤 걸 가리키는지 알 수 없다.

function getDinnerPrice() {
	const RICE = 10000;
    const COKE = 2000;
    
    return RICE + COKE;
}

상수를 사용하여 값에 의미를 부여하면 코드의 가독성이 높아진다.

상수란?

  • 변하지 않는 고정 값
  • 특정 값이 어떤 의미를 갖는지 알려주는 역할

요약

이넘(enum)이란?

  • 같은 범주에 있는 상수를 여러 개 모아 하나의 단위로 묶은 것
    • 정해진 옵션을 파악하기 쉬워짐 (아래 예시)
  • 보통 대문자로 작성해서 일반 변수와 구분

예시

// 이넘 선언
enum ShoesBrand {
	Nike, // 0
    Adidas, // 1
    NewBalance // 2
}
// 사용하기
var myShoes = ShoesBrand.Nike;
var yourShoes = ShoesBrand.NewBalance;
  • 이넘은 여러 개 속성이지만 배열이 아니라 '객체'
    * 객체.속성 식으로 조회 가능

🙋‍♀️ 중요

  • 이넘은 각 속성 순서대로 자체 숫자 값을 갖는다. (기본 타입이 숫자 타입)
  • 예: 위의 myShoes에는 0, yourShoes에는 1 대입

이넘의 기본 타입: 숫자

  • 이넘의 속성은 기본적으로 숫자 값을 가짐 (typescript 내부 규칙 때문에)
enum Direction {
	Up, // 0
    Down, // 1
    Left, // 2
    Right // 3
}

양방향으로 사용 가능

  • 숫자 값을 객체.속성명으로 가져오기
  • 또는 객체[숫자] 형태로 해당 값 가져오기
  • 예시
Direction.Up = 0;
Direction[0] = 'Up';

문자 타입 이넘도 가능

  • 이넘의 속성 값은 기본적으로 숫자
    • 하지만 숫자 대신 문자열 이넘도 가능
  • 숫자는 기본 타입이므로 따로 지정 없이 위 Direction처럼 써도 됨
    • 하지만 문자형은 기본 값 타입이 아니므로 모든 속성명에 명시적으로 써 줘야

예시

enum Direction {
	Up = 'Up',
    Down = 'Down',
    Left = 'Left',
    Right = 'Right'
}
  • 방향 값(Direction)의 경우 숫자보다 문자형으로 할당되는 것이 의미상으로 더 적절
  • 실무에서는 사실 숫자형보다 문자형 이넘을 더 많이 사용
    • 또한 속성명과 오른쪽 값을 똑같이 맞추는 것도 practice
    • 양쪽 다 대문자 사용, 두 단어 이상일 경우 언더스코어(_)

3가지 특징

1. 혼합 이넘 가능

  • 숫자형과 문자형을 섞은 혼합 이넘 가능
    • But 권장 x (하나의 데이터 타입으로 일관되게 관리하는 게 유지 보수상 더 좋음)
  • 예시
enum Answer {
	Yes = 'Yes',
    No = 1
}

2. 다양한 속성 값 부여하기 (혼합 이넘)

  • 숫자형/문자형 외에 (덧셈) 연산 값 또는 ~.length와 같은 문자열 길이도 속성으로 가능
  • 연산 시 기존에 선언된 이넘 상수 활용 가능
  • 실제로는 각 속성명만 보고도 값을 바로 추측할 수 있는 문자형 이넘을 더 많이 사용
    • 이 이넘도 활용도 높지 않음
enum Authorization {
	User, // 0
    Admin,  // 1
    SuperAdmin = User + Admin, // 0 + 1 = 1
    God = "abc".length // 3
}

3. const(상수) 이넘

  • 앞에 const를 붙인 상수 형태의 이넘
const enum logLevel {
	Debug = 'Debug',
    Info = 'Info',
    Error = 'Error'
}

일반 enum과의 차이

  • 일반 enum
    • 컴파일 시 해당 이넘을 사용하지 않아도 기본적으로 (객체로) 컴파일됨
  • const 이넘
    • 사용하지 않았다면 컴파일되지 않음
    • 변수에 할당되었다 하더라도 객체로 컴파일되지 않고 바로 해당 변수에 이넘 속성 값 할당

=> 즉, 컴파일되는 양의 차이

일반 enum이 컴파일된 경우

enum logLevel {
	Debug = 'Debug',
    Info = 'Info',
    Error = 'Error'
}

// 컴파일
"use strict";
var logLevel;
(function (logLevel) {
	logLevel["Debug"] = "Debug";
    logLevel["Info"] = "Info";
    logLevel["Error"] = "Error";
})(logLevel || (logLvel = {}));

const 이넘이 컴파일된 경우

const enum logLevel {
	Debug = 'Debug',
    Info = 'Info',
    Error = 'Error'
}

var appLevel = logLevel.Error // 변수에 할당

// 컴파일 결과
// 객체 생성 없이 변수에 이넘 값 바로 할당
"use strict";
var appLevel = "Error"

const 이넘의 단점

다양한 속성 값(연산 값, length 값 등)은 부여할 수 없음
=> 항상 일정한 타입으로 속성 값 지정해야
(하지만 혼합 형태의 이넘은 잘 쓰이지 않으니 단점이라 하기엔(?))

profile
데이터 분석가 준비 중입니다 (티스토리에 기록: https://cherylog.tistory.com/)

0개의 댓글