๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

TypeScript

enum ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

enum์€ JavaScript๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜๋ ๊นŒ?

TypeScript์˜ enum์€ JavaScript์— ์—†๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ JavaScript๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ IIFE๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

// TypeScript ์ฝ”๋“œ

enum WeekDays {
  MON = "Mon",
  TUES = "Tues",
  WEDNES = "Wednes",
  THURS = "Thurs",
  FRI = "Fri",
}
// JavaScript๋กœ ์ปดํŒŒ์ผ๋œ ๊ฒฐ๊ณผ

var WeekDays;
(function (WeekDays) {
    WeekDays["MON"] = "Mon";
    WeekDays["TUES"] = "Tues";
    WeekDays["WEDNES"] = "Wednes";
    WeekDays["THURS"] = "Thurs";
    WeekDays["FRI"] = "Fri";
})(WeekDays || (WeekDays = {}));

 

function (WeekDays) { ... } ์ด๋ผ๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ( . . . ) ๋กœ ๊ฐ์‹ผ ๋’ค ๋ฐ”๋กœ (WeekDays || (WeekDays = {})) ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด ์‹คํ–‰ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ IIFE์ด๋‹ค. 

 

 

enum ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

 

1. ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€

enum ํ•œ ์ค„์ด ์—ฌ๋Ÿฌ ์ค„์˜ IIFE ์ฝ”๋“œ๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์— enum์ด ๋งŽ์•„์งˆ์ˆ˜๋ก JavaScript ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์ „์ฒด ํฌ๊ธฐ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค์ง„๋‹ค.

 

2. ํŠธ๋ฆฌ์‰์ดํ‚น ๋ฌธ์ œ

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋กœ, enum์€ IIFE๋กœ ๋ณ€ํ™˜๋˜๋ฉด์„œ WeekDays ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ด ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•ด enum์˜ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ enum ์ „์ฒด๋ฅผ ๋ฒˆ๋“ค์—์„œ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 

 

3. const enum์˜ ํ•œ๊ณ„

const enum์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์‹ค์ œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋˜์–ด JavaScript ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

const enum WeekDays {
  MON = "Mon",
  TUES = "Tues",
  WEDNES = "Wednes",
  THURS = "Thurs",
  FRI = "Fri",
}

const today = WeekDays.FRI;
var today = "Fri" /* WeekDays.FRI */;

 

์ด ๋ฐฉ๋ฒ•์€ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ ํŠธ๋ฆฌ์‰์ดํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์ง€๋งŒ, --isolatedModules ์˜ต์…˜๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋•Œ๋ฌธ์— ํ˜„๋Œ€์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์ตœ์‹  ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋Š” ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. const enum์€ ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๊ฑธ์นœ ํƒ€์ž… ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ์‹๊ณผ ์ถฉ๋Œํ•˜์—ฌ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋Œ€์•ˆ์€ ๋ฌด์—‡์ผ๊นŒ?

 

์œ ๋‹ˆ์˜จ ํƒ€์ž… + as const

as const๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค๊ณ , ๊ทธ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

const WEEKDAYS = {
  MON: "Mon",
  TUES: "Tues",
  WEDNES: "Wednes",
  THURS: "Thurs",
  FRI: "Fri",
} as const;

type Weekdays = typeof WEEKDAYS[keyof typeof WEEKDAYS];

function printDay(day: Weekdays) {
  console.log(`It's ${day}`);
}

printDay('Mon');

 

enum๊ณผ ๊ฐ™์€ IIFE๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ƒฅ ์ผ๋ฐ˜ JavaScript ๊ฐ์ฒด์ด๋‹ค. ๋‹จ์ˆœํ•œ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐฐ์šด ๋‚ด์šฉ]

IIFE(Immediately Invoked Function Expression): ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„

์ •์˜๋˜์ž๋งˆ์ž ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ 

 

1. ์ „์—ญ ์Šค์ฝ”ํ”„ ์˜ค์—ผ ๋ฐฉ์ง€

IIFE๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•จ๊ณผ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์ง€ ์•Š์•„ ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

let count = 10;

(function() {
	let count = 20;
    console.log('๋‚ด๋ถ€ count:', count); // ๋‚ด๋ถ€ count: 20
})();

console.log('์ „์—ญ count:', count); // ์ „์—ญ count: 10

 

2. ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜ ์ƒ์„ฑ

IIFE๋Š” ํด๋กœ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. IIFE๊ฐ€ ์‹คํ–‰๋œ ํ›„์—๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” IIFE์˜ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” private state๋ฅผ ํ‰๋‚ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

const counter = (function() {
	let privateCount = 0; // ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜๋กœ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
    
    return {
    	increment: function() {
        	privateCount++;
            console.log(privateCount);
        },
        getCount: function() {
        	return: privateCount;
        }
      };
})();

counter.increment();
counter.increment();
console.log(counter.getCount());
// console.log(counter.privateCount); error

 

3. ์ตœ์ƒ์œ„ async/await ์‹คํ–‰

์ตœ์‹  JavaScript ๊ธฐ๋Šฅ์ธ async/await๋Š” ES ๋ชจ๋“ˆ ํ™˜๊ฒฝ์ด ์•„๋‹Œ ์ผ๋ฐ˜ <script> ํƒœ๊ทธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋Š” ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋•Œ, async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ IIFE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋Š” ์ฆ‰์‹œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

(async () => {
	try {
    	const response = await fetch('https://api.example.com/data');
        const data = await response.json();
        console.log('๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์„ฑ๊ณต:', data);
    } catch (err) {
        console.error('์—๋Ÿฌ ๋ฐœ์ƒ:', err);
    }
})():

 

ํŠธ๋ฆฌ์‰์ดํ‚น

: ์›นํŒฉ๊ณผ ๊ฐ™์€ ๋ชจ๋˜ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์—์„œ ์ œ๊ฑฐํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.