Skip to content

๐Ÿ’Ÿ [2์žฅ] enum์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

hyeyoonS edited this page Mar 26, 2024 · 3 revisions
const metaData: MetadataProps = {
	author: "์ข…๋ฏผ",
	createdAt: 2024-03-18,
	studiedAt: 2024-03-14,
	chapter: 2,
	description: "enum์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?"
	}

๋“ค์–ด๊ฐ€๋ฉฐ

TypeScript์˜ย enum์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽธ์ด ์ข‹์€ ์ด์œ  : Tree-shaking ์˜ ๊ด€์ ์„ ์ค‘์‹ฌ์œผ๋กœ

๐Ÿค”Tree-shaking์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ
    • ๋‚˜๋ฌด๋ฅผ ํ”๋“ค๋ฉด ์ฃฝ์€ ์žŽ์‚ฌ๊ท€๋“ค์ด ๋–จ์–ด์ง€๋Š” ๋ชจ์Šต์— ์ฐฉ์•ˆํ•ด Tree-shaking์ด๋ผ๊ณ  ๋ถ€๋ฆ„
  • Tree-shaking์˜ ๋ฐฉ๋ฒ•: exportํ–ˆ์ง€๋งŒ ์•„๋ฌด๋ฐ์„œ๋„ importํ•˜์ง€ ์•Š์€ ๋ชจ๋“ˆ์ด๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”ย ์ฝ”๋“œ๋ฅผย ์‚ญ์ œํ•ด์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌย ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”enum์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜
  • ์ •์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœย ํ•ฉ์น  ๋•Œย ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ
  • ์ž„์˜์˜ ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐย ํ•˜๋‚˜์˜ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
// ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” 0๋ถ€ํ„ฐ ์ˆซ์ž๋ฅผ ๋งค๊น๋‹ˆ๋‹ค.
enum MOBILE_OS {
  IOS, // 0
  ANDROID // 1
}

// ์ž„์˜์˜ ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
enum MOBILE_OS {
  IOS = 'iOS',
  ANDROID = 'Android'
}

// ์•„๋ž˜์™€ ๊ฐ™์ด ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
const os: MOBILE_OS = MOBILE_OS.IOS
function detectOSType(userAgent: string): MOBILE_OS {
    // ์ƒ๋žต
}

enum์€ TypeScript๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.ย JavaScript์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—ย ์•„๋ž˜์™€ ๊ฐ™์ดย ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž์ฃผ ์ž‘์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const MOBILE_OS = {
    IOS: 'iOS',
    ANDROID: 'Android'
}
console.log(MOBILE_OS.IOS) // iOS

โ—โ—โ— TypeScript์—์„œ enum์„ ์‚ฌ์šฉํ•˜๋ฉด Tree-shaking์ด ๋˜์ง€ ์•Š๋Š”๋‹ค

enum์€ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ TypeScript๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด TypeScript ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ๋ฅผ ์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณด์ž.

export enum MOBILE_OS {
  IOS,
  ANDROID
}

// ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œ ๊ฒฝ์šฐ
export enum MOBILE_OS {
  IOS = 'iOS',
  ANDROID = 'Android'
}

์œ„ ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ JavaScript ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

export var MOBILE_OS;
(function (MOBILE_OS) {
    MOBILE_OS[MOBILE_OS["IOS"] = 0] = "IOS";
    MOBILE_OS[MOBILE_OS["ANDROID"] = 1] = "ANDROID";
})(MOBILE_OS || (MOBILE_OS = {}));

// ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œ ๊ฒฝ์šฐ
export var MOBILE_OS;
(function (MOBILE_OS) {
    MOBILE_OS["IOS"] = "iOS";
    MOBILE_OS["ANDROID"] = "Android";
})(MOBILE_OS || (MOBILE_OS = {}));

JavaScript์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด TypeScriptย ์ปดํŒŒ์ผ๋Ÿฌ๋Š” IIFE(์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜)๋ฅผย ํฌํ•จํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐย [Rollup](https://rollupjs.org/guide/en/)๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋Š” IIFE๋ฅผ '์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ'๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์—†์–ด์„œย Tree-shaking์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๊ตญย MOBILE_OS๋ฅผ importํ•˜๊ณ  ์‹ค์ œ๋กœ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ตœ์ข… ๋ฒˆ๋“ค์—๋Š” ํฌํ•จ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

!https://engineering.linecorp.com/wp-content/uploads/2020/07/9fba7580-ba18-11ea-9c22-9344d1208a74-1024x512.png

๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด enum ๋ง๊ณ  ๋ญ˜ ์‚ฌ์šฉํ•˜์ง€?

  • Union Types๋ฅผ ์‚ฌ์šฉํ•˜์ž. ์•„๋ž˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.(์ดํ›„๋กœย ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œย enum๋งŒ ์†Œ๊ฐœ).
const MOBILE_OS = {
  IOS: 'iOS',
  Android: 'Android'
} as const;
type MOBILE_OS = typeof MOBILE_OS[keyof typeof MOBILE_OS]; // 'iOS' | 'Android'

์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ JavaScript ์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ๋‹ค.

const MOBILE_OS = {
    IOS: 'iOS',
    Android: 'Android'
};

TypeScript ์ฝ”๋“œ์—์„œ๋Š”ย MOBILE_OSย ํƒ€์ž…์„ ์ •์˜ํ•œ ์ด์ ์„ ๊ทธ๋Œ€๋กœ ๋ˆ„๋ฆฌ๋ฉด์„œ, JavaScript๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผํ•ด๋„ IIFE๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ Tree-shaking์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ JavaScript ๊ฐ์ฒด๋กœย enumย ๊ฐ™์€ ๊ฒƒ์„ ํ‘œํ˜„ํ•œ ๊ฒฝ์šฐ, ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ JavaScript์—์„œ๋„ ๋ณ„๋‹ค๋ฅธ ์ฐจ์ด ์—†์ด ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์žฅ์ ์ด๋‹ค.

๐Ÿ™ƒconst enum์€ ์–ด๋–ค๊ฐ€์š”?

  • TypeScript์—์„œย const enum์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฉดย enum๊ณผ ๊ฑฐ์˜ ๊ฐ™๋‹ค๊ณ  ๋Š๊ปด์ง„๋‹ค.
  • enum์˜ ๋‚ด์šฉ์ด ํŠธ๋žœ์ŠคํŒŒ์ผํ•  ๋•Œ ์ธ๋ผ์ธ์œผ๋กœ ํ™•์žฅ๋œ๋‹ค๋Š” ์ ์ด ์ฐจ์ด์ ์ด๋‹ค.
const enum MOBILE_OS {
    IOS = 'iOS',
    ANDROID = 'Android',
}
const ios = MOBILE_OS.IOS

์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ JavaScript ์ฝ”๋“œ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ๋‹ค.

const ios = "iOS" /* IOS */;
  • Tree-shaking์ด๋ผ๋Š” ๊ด€์ ์—์„œ๋Š” Union Types์™€ ๋™์ผํ•˜๋‹ค.
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ธด ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Union types์™€ ๋น„๊ตํ•ด ๋‹ค์†Œ ๋ถˆ๋ฆฌํ•œ ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.
// TypeScript
const enum NAME {
  JUGEM = 'ๅฏฟ้™็„กๅฏฟ้™็„กไบ”ๅŠซใฎๆ“ฆใ‚Šๅˆ‡ใ‚Œๆตท็ ‚ๅˆฉๆฐด้ญšใฎโ€ฆ', // ์ผ๋ณธ์—์„œ '๊น€์ˆ˜ํ•œ๋ฌด ๊ฑฐ๋ถ์ด์™€ ๋‘๋ฃจ๋ฏธ ์‚ผ์ฒœ๊ฐ‘์ž ๋™๋ฐฉ์‚ญ...'๊ณผ ๋น„์Šทํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
TARO = '๋‹ค๋กœ',
JIRO = '์ง€๋กœ',
}
const isJugem = name === NAME.JUGEM

// JavaScript ํŠธ๋žœ์ŠคํŒŒ์ผ ํ›„
const isJugem = name === "u5BFFu9650u7121u5BFFu9650u7121u4E94u52ABu306Eu64E6u308Au5207u308Cu6D77u7802u5229u6C34u9B5Au306Eu2026" /* JUGEM */;

๋งˆ์น˜๋ฉฐ

Tree-shaking ๊ด€์ ์—์„œ ๋ณด์•˜์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ถ”์ฒœ

Union Types > const enum > enum


๊ธ€ ์›๋ฌธ

์ฐธ๊ณ  ๋ฌธํ—Œ

Clone this wiki locally