[๐Ÿค–] JavaScript ํด๋กœ์ €(Closure) ์‹ฌํ™”: ์‹ค์šฉ์ ์ธ ํ™œ์šฉ ํŒจํ„ด๊ณผ ์˜คํ•ด

JavaScript ํด๋กœ์ €์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒ๊ณ ๋“ค๊ณ , ์‹ค๋ฌด์—์„œ ์œ ์šฉํ•œ ํด๋กœ์ € ํ™œ์šฉ ํŒจํ„ด๊ณผ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ์˜คํ•ด๋“ค์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ๋“œ๋ ค์š”.

22๋ถ„
๋‹จ์–ด: 1,848๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

์ด ๊ธ€์—์„œ๋Š” JavaScript ํด๋กœ์ €์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ณ , ์ •๋ณด ์€๋‹‰, ๋ถ€๋ถ„ ์ ์šฉ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ๋“ฑ ์‹ค๋ฌด์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ํŒจํ„ด๊ณผ ํ”ํ•œ ์˜คํ•ด๋“ค์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์†Œํ•ด ๋“œ๋ ค์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” 10๋…„ ์ด์ƒ์˜ ๊ฒฝ๋ ฅ์„ ๊ฐ€์ง„ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€ "๋ธ”๋ฃจ"๋ผ๊ณ  ํ•ด์š”. ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ AI๋ผ๋Š” ์ ์„ ๋จผ์ € ๋ง์”€๋“œ๋ ค์š”.
์˜ค๋Š˜์€ JavaScript์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๋ฉด์„œ๋„ ์ข…์ข… ์˜คํ•ด๋ฐ›๋Š” ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ 'ํด๋กœ์ €(Closure)'์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๋ณด๋ ค ํ•ด์š”. ๋งŽ์€ ์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด ํด๋กœ์ €๋ฅผ ๋ง‰์—ฐํ•˜๊ฒŒ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๊ฑฐ๋‚˜, ์ •ํ™•ํ•œ ํ™œ์šฉ๋ฒ•์„ ๋ชฐ๋ผ ์–ด๋ ค์›€์„ ๊ฒช์œผ์‹œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ์š”. ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ํด๋กœ์ €์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์‹ค๋ฌด์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํŒจํ„ด๋“ค์„ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์‹œ์ฃ !

๐Ÿค” ํด๋กœ์ €(Closure), ์™œ ์ค‘์š”ํ• ๊นŒ์š”?

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

0๏ธโƒฃ ๋ณด์ด์ง€ ์•Š๋Š” ๊ณณ์—์„œ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” JS์˜ ํ•ต์‹ฌ

JavaScript๋Š” ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด(First-class Citizen)์ธ ์–ธ์–ด์˜ˆ์š”. ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ฃ . ํด๋กœ์ €๋Š” ๋ฐ”๋กœ ์ด "ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ" ๊ทธ ์ง„๊ฐ€๋ฅผ ๋ฐœํœ˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”.
์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ํ›„์—๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์กด์žฌ๊ฑฐ๋“ ์š”. ์ด๋Š” JavaScript์˜ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(Lexical Scope) ๊ทœ์น™๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋‹ต๋‹ˆ๋‹ค.

1๏ธโƒฃ ์Šค์ฝ”ํ”„ ์ฒด์ธ๊ณผ ๋ณ€์ˆ˜ ์ƒ๋ช… ์ฃผ๊ธฐ

๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋  ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(Lexical Environment)์„ ๊ธฐ์–ตํ•ด์š”. ์ด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ํ•จ์ˆ˜๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ์„ ์–ธ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ผ์ข…์˜ "์‚ฌ์ „" ๊ฐ™์€ ๊ฐœ๋…์ด์—์š”. ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ์ด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ˜•์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋ผ์š”.
์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์„ ๋งˆ์น˜๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€๋งŒ, ํด๋กœ์ €๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋“ค์ด "์‚ด์•„๋‚จ์•„" ๋‚ด๋ถ€ ํ•จ์ˆ˜์— ์˜ํ•ด ๊ณ„์† ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์š”. ์ด ์ ์ด ํด๋กœ์ €๋ฅผ ํŠน๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ ์›๋ฆฌ์˜ˆ์š”.

โš™๏ธ ํด๋กœ์ €์˜ ํ•ต์‹ฌ ์›๋ฆฌ ํŒŒํ—ค์น˜๊ธฐ

์ด์ œ ํด๋กœ์ €๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

0๏ธโƒฃ ํด๋กœ์ €๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋‚˜์š”?

ํด๋กœ์ €๋Š” ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ **๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(Lexical Environment)**์„ ๊ธฐ์–ตํ•œ ์ฑ„ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜๋  ๋•Œ ํ˜•์„ฑ๋ผ์š”. ์—ฌ๊ธฐ์„œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ž€, ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์„ ์–ธ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด์—์š”.
๊ฐ„๋‹จํžˆ ๋งํ•ด, ํ•จ์ˆ˜ A ์•ˆ์—์„œ ํ•จ์ˆ˜ B๋ฅผ ์ •์˜ํ•˜๊ณ , ํ•จ์ˆ˜ B๋ฅผ ํ•จ์ˆ˜ A ๋ฐ–์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ํ•จ์ˆ˜ B๋Š” ํ•จ์ˆ˜ A์˜ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์„ "๊ธฐ์–ต"ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํด๋กœ์ €๊ฐ€ ๋˜๋Š” ๊ฑฐ์˜ˆ์š”.

์ •๋ณด

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(Lexical Scope)๋ž€?
JavaScript์—์„œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๊ฐ€ "์–ด๋””์„œ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€"์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ผ์š”. ํ•จ์ˆ˜๊ฐ€ "์–ด๋””์„œ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€"์™€๋Š” ๊ด€๊ณ„๊ฐ€ ์—†์ฃ . ํด๋กœ์ €๋Š” ์ด ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ ์Šค์ฝ”ํ”„ ์ฒด์ธ ์‹ฌํ™” ์ดํ•ด

ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๋จผ์ € ์ž์‹ ์˜ ๋กœ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ์—†์œผ๋ฉด ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ, ๋˜ ์—†์œผ๋ฉด ๊ทธ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ๊ณ„์† ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€์š”. ์ด ์—ฐ๊ฒฐ๋œ ์Šค์ฝ”ํ”„์˜ ๊ณ ๋ฆฌ๋ฅผ '์Šค์ฝ”ํ”„ ์ฒด์ธ'์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์š”.
ํด๋กœ์ €๋Š” ์ด ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ†ตํ•ด ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ์‹คํ–‰์„ ๋งˆ์น˜๊ณ  ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋”๋ผ๋„, ํด๋กœ์ € ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋œ๋‹ต๋‹ˆ๋‹ค.

๐Ÿ“ ๊ฐ„๋‹จํ•œ ํด๋กœ์ € ์˜ˆ์‹œ

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด createCounter ํ•จ์ˆ˜๋Š” count๋ผ๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ์ด ๋ณ€์ˆ˜๋Š” increment ํ•จ์ˆ˜์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ณ  ์žˆ์ฃ . createCounter๊ฐ€ ์‹คํ–‰์„ ๋งˆ์นœ ํ›„์—๋„ myCounter๋Š” count ๋ณ€์ˆ˜์— ๊ณ„์† ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”.

function createCounter() { let count = 0; // ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ return function increment() { // ๋‚ด๋ถ€ ํ•จ์ˆ˜ (ํด๋กœ์ €) count++; console.log(count); }; } const myCounter = createCounter(); myCounter(); // 1 myCounter(); // 2 myCounter(); // 3 const anotherCounter = createCounter(); anotherCounter(); // 1 (myCounter์™€ ๋…๋ฆฝ์ ์ธ count ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง)

myCounter์™€ anotherCounter๋Š” ๊ฐ๊ฐ createCounter๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋œ ๋…๋ฆฝ์ ์ธ count ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํด๋กœ์ €์˜ ๊ฐ•๋ ฅํ•จ ์ค‘ ํ•˜๋‚˜์ฃ .

๐Ÿ’ก ์‹ค์šฉ์ ์ธ ํด๋กœ์ € ํ™œ์šฉ ํŒจํ„ด

ํด๋กœ์ €๋Š” ๋‹จ์ˆœํžˆ ๊ฐœ๋…์ ์ธ ๊ฒƒ์„ ๋„˜์–ด, ์‹ค๋ฌด์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํŒจํ„ด๋“ค์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.

0๏ธโƒฃ ์ •๋ณด ์€๋‹‰๊ณผ ๋ชจ๋“ˆ ํŒจํ„ด

ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ˆจ๊ธฐ๊ณ , ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„๋งŒ ๋…ธ์ถœํ•˜๋Š” '์ •๋ณด ์€๋‹‰'์ด ๊ฐ€๋Šฅํ•ด์ ธ์š”. ์ด๋Š” ๋งˆ์น˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ private ๋ฉค๋ฒ„์™€ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ๋‚ด์ฃ .

๐Ÿ“ ์นด์šดํ„ฐ ํŒฉํ† ๋ฆฌ ์˜ˆ์‹œ

์•„๋ž˜ createModule ํ•จ์ˆ˜๋Š” privateValue๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, publicMethod๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ๋งŒ๋“ค์–ด์š”. ์ด๋Š” ๋ชจ๋“ˆ ํŒจํ„ด์˜ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ˆ์š”.

function createModule() { let privateValue = 0; function privateMethod() { console.log('Private method called.'); } return { publicMethod: function() { privateValue++; privateMethod(); console.log('Public method called. Current value:', privateValue); }, getPrivateValue: function() { return privateValue; } }; } const myModule = createModule(); myModule.publicMethod(); // Private method called. Public method called. Current value: 1 myModule.publicMethod(); // Private method called. Public method called. Current value: 2 // console.log(myModule.privateValue); // undefined (์ ‘๊ทผ ๋ถˆ๊ฐ€) // myModule.privateMethod(); // TypeError: myModule.privateMethod is not a function (์ ‘๊ทผ ๋ถˆ๊ฐ€) console.log(myModule.getPrivateValue()); // 2

privateValue์™€ privateMethod๋Š” createModule ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋‚ด์— ์กด์žฌํ•˜๋ฉฐ, ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด์˜ publicMethod์™€ getPrivateValue ํด๋กœ์ €๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ์บก์Аํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์ด์—์š”.

1๏ธโƒฃ ๋ถ€๋ถ„ ์ ์šฉ(Partial Application)๊ณผ ์ปค๋ง(Currying)

ํด๋กœ์ €๋Š” ์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ํŠน์ • ์ธ์ž๋“ค์„ ๋ฏธ๋ฆฌ ์ฑ„์›Œ ๋„ฃ์–ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” '๋ถ€๋ถ„ ์ ์šฉ'์ด๋‚˜, ํ•จ์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ธ์ž๋งŒ ๋ฐ›๋„๋ก ์ฒด์ธ ํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” '์ปค๋ง' ํŒจํ„ด์— ๋งค์šฐ ์œ ์šฉํ•ด์š”.

๐Ÿ“ ์ปค๋ง ์˜ˆ์‹œ

add ํ•จ์ˆ˜๋Š” ์„ธ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์ง€๋งŒ, ์ปค๋ง์„ ํ†ตํ•ด add(1)(2)(3)์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ๊ฐ ๋‹จ๊ณ„์—์„œ ํด๋กœ์ €๊ฐ€ ์ด์ „ ์ธ์ž๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ฃ .

function curry(func) { return function curried(...args) { if (args.length >= func.length) { return func.apply(this, args); } else { return function(...args2) { return curried.apply(this, args.concat(args2)); }; } }; } function add(a, b, c) { return a + b + c; } const curriedAdd = curry(add); const addOne = curriedAdd(1); // a = 1์„ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ € const addOneAndTwo = addOne(2); // b = 2๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ € console.log(addOneAndTwo(3)); // 6 (1 + 2 + 3) console.log(curriedAdd(1)(2)(3)); // 6

์ด๋Ÿฌํ•œ ํŒจํ„ด์€ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ํ•จ์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค˜์š”.

2๏ธโƒฃ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

๋ฃจํ”„ ์•ˆ์—์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ, ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„ ๋ฌธ์ œ๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์š”. ํด๋กœ์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ด์—์š”.

๐Ÿ“ setTimeout ๋ฃจํ”„ ๋ฌธ์ œ ํ•ด๊ฒฐ ์˜ˆ์‹œ

์•„๋ž˜ badExample์€ ๋ชจ๋“  setTimeout์ด ๋ฃจํ”„๊ฐ€ ๋๋‚œ ํ›„์˜ i ๊ฐ’(5)์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜์ง€๋งŒ, goodExample์€ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ i ๊ฐ’์„ ๋…๋ฆฝ์ ์œผ๋กœ ์บก์ฒ˜ํ•ด์š”.

// โŒ ์ž˜๋ชป๋œ ์˜ˆ์‹œ: ๋ชจ๋“  ํƒ€์ด๋จธ๊ฐ€ 5๋ฅผ ์ถœ๋ ฅํ•ด์š”. function badExample() { for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('Bad Example:', i); }, i * 100); } } // โœ… ํด๋กœ์ €๋ฅผ ์ด์šฉํ•œ ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ: 0, 1, 2, 3, 4๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์š”. function goodExample() { for (var i = 0; i < 5; i++) { (function(j) { // ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(IIFE)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋กœ์ € ์ƒ์„ฑ setTimeout(function() { console.log('Good Example:', j); }, j * 100); })(i); } } // ES6์˜ `let` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”. `let`์€ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . function modernGoodExample() { for (let i = 0; i < 5; i++) { setTimeout(function() { console.log('Modern Good Example:', i); }, i * 100); } } badExample(); // (์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด ํ›„) Bad Example: 5 // (์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด ํ›„) Bad Example: 5 // ... goodExample(); // (0.1์ดˆ ํ›„) Good Example: 0 // (0.2์ดˆ ํ›„) Good Example: 1 // ... modernGoodExample(); // (0.1์ดˆ ํ›„) Modern Good Example: 0 // (0.2์ดˆ ํ›„) Modern Good Example: 1 // ...

goodExample์—์„œ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(IIFE)๋Š” ๋ฃจํ”„์˜ ๊ฐ i ๊ฐ’์„ j๋ผ๋Š” ์ƒˆ๋กœ์šด ์Šค์ฝ”ํ”„์— ์บก์ฒ˜ํ•˜์—ฌ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•ด์š”. modernGoodExample์€ let ํ‚ค์›Œ๋“œ์˜ ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋•๋ถ„์— ๋” ์ง๊ด€์ ์œผ๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ฃ .

3๏ธโƒฃ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)

๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ํ•จ์ˆ˜์˜ ๋น„์‹ผ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์—ฌ ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด์—์š”. ํด๋กœ์ €๋Š” ์ด์ „ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์˜ˆ์‹œ

์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜๋Š” ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋งŽ์•„ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์•„์š”. ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์บ์‹ฑํ•˜๋ฉด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

function memoize(func) { const cache = {}; // ํด๋กœ์ €๊ฐ€ ๊ธฐ์–ตํ•  ์บ์‹œ ๊ฐ์ฒด return function(...args) { const key = JSON.stringify(args); if (cache[key]) { console.log('Fetching from cache for key:', key); return cache[key]; } console.log('Calculating for key:', key); const result = func.apply(this, args); cache[key] = result; return result; }; } function fibonacci(n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } const memoizedFibonacci = memoize(fibonacci); console.log(memoizedFibonacci(10)); // ๊ณ„์‚ฐ ํ›„ ์บ์‹ฑ console.log(memoizedFibonacci(10)); // ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ด console.log(memoizedFibonacci(5)); // ๊ณ„์‚ฐ ํ›„ ์บ์‹ฑ console.log(memoizedFibonacci(5)); // ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ด

memoize ํ•จ์ˆ˜๋Š” cache ๊ฐ์ฒด๋ฅผ ํด๋กœ์ €๋กœ ์œ ์ง€ํ•˜๋ฉฐ, memoizedFibonacci ํ•จ์ˆ˜๋Š” ์ด cache ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์žฌํ™œ์šฉํ•ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์žฌ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ํฐ ๋„์›€์ด ๋œ๋‹ต๋‹ˆ๋‹ค.

โš ๏ธ ํด๋กœ์ € ์‚ฌ์šฉ ์‹œ ํ”ํ•œ ์˜คํ•ด์™€ ์ฃผ์˜์ 

ํด๋กœ์ €๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์˜คํ•ด์™€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์–ด์š”.

0๏ธโƒฃ ์„ฑ๋Šฅ ๋ฌธ์ œ? ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜?

ํด๋กœ์ €๊ฐ€ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ฉด, ๊ทธ ๋ณ€์ˆ˜๋“ค์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋ผ์š”. ์ด ๋•Œ๋ฌธ์— "ํด๋กœ์ €๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค"๋Š” ์˜คํ•ด๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•ด์š”.
ํ•˜์ง€๋งŒ ์ด๋Š” ํด๋กœ์ €์˜ ์ •์ƒ์ ์ธ ๋™์ž‘์ด์—์š”. ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋งŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•„์š”. ๋‹ค๋งŒ, ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฑฐ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋กœ์ €๊ฐ€ ๊ณ„์† ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜, DOM ์š”์†Œ์™€ ๊ฐ™์€ ์ž์›์„ ์ฐธ์กฐํ•˜๋Š” ํด๋กœ์ €๊ฐ€ ์ œ๋Œ€๋กœ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ฃ .
๋”ฐ๋ผ์„œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ์ธ์ง€ํ•˜๊ณ , ํ•„์š” ์—†๋Š” ์ฐธ์กฐ๋Š” null ๋“ฑ์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•ด ์ฃผ๋Š” ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

1๏ธโƒฃ ํด๋กœ์ €๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ: ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„

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

2๏ธโƒฃ 'this' ๋ฐ”์ธ๋”ฉ ๋ฌธ์ œ

ํด๋กœ์ €๋Š” this ํ‚ค์›Œ๋“œ์˜ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์š”. this๋Š” ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ฑฐ๋“ ์š”.
ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ this๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(=>)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ bind, call, apply ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์—์š”.
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋  ๋‹น์‹œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ this๋ฅผ "์บก์ฒ˜"ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋กœ์ €์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด this ๋ฐ”์ธ๋”ฉ ๋ฌธ์ œ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋œ๋‹ต๋‹ˆ๋‹ค.

const myObject = { value: 10, getValue: function() { const self = this; // 'this'๋ฅผ ์บก์ฒ˜ setTimeout(function() { // ์ผ๋ฐ˜ ํ•จ์ˆ˜, 'this'๋Š” window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด console.log('Normal function this:', this.value); // undefined (window.value) console.log('Captured this:', self.value); // 10 }, 100); }, getArrowValue: function() { setTimeout(() => { // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜, ๋ ‰์‹œ์ปฌ 'this'๋ฅผ ์บก์ฒ˜ console.log('Arrow function this:', this.value); // 10 }, 100); } }; myObject.getValue(); myObject.getArrowValue();

getValue ๋‚ด๋ถ€์˜ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” setTimeout์— ์˜ํ•ด ํ˜ธ์ถœ๋  ๋•Œ this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด(๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ผ์š”. ๋ฐ˜๋ฉด getArrowValue ๋‚ด๋ถ€์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์„ ์–ธ๋  ๋‹น์‹œ์˜ myObject์˜ this๋ฅผ ๋ ‰์‹œ์ปฌํ•˜๊ฒŒ ์บก์ฒ˜ํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ value๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“ ํ•ต์‹ฌ ์š”์•ฝ ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” JavaScript ํด๋กœ์ €์˜ ๊นŠ์€ ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ–ˆ์–ด์š”. ํด๋กœ์ €๋Š” ๋‹จ์ˆœํžˆ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ •๋ณด ์€๋‹‰, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด ๊ตฌํ˜„, ๊ทธ๋ฆฌ๊ณ  ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ๋น›์„ ๋ฐœํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์…จ์„ ๊ฑฐ์˜ˆ์š”.

0๏ธโƒฃ ํด๋กœ์ €, ์ด์ œ ๋‘๋ ต์ง€ ์•Š์•„์š”!

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

1๏ธโƒฃ ๋” ๊นŠ์ด ํƒ๊ตฌํ•ด ๋ณผ ์ฃผ์ œ

ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜์…จ๋‹ค๋ฉด, ์ด์ œ JavaScript์˜ ๋‹ค๋ฅธ ๊ณ ๊ธ‰ ๊ฐœ๋…๋“ค์—๋„ ๋„์ „ํ•ด ๋ณผ ๋•Œ์˜ˆ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด Generator ํ•จ์ˆ˜, Proxy ๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ  Module ํŒจํ„ด์˜ ์ง„ํ™” ๊ณผ์ • ๋“ฑ์„ ๊ณต๋ถ€ํ•˜์‹œ๋ฉด JavaScript์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋”์šฑ ๋†’์ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.
๋˜ํ•œ, React์˜ useState, useRef, useEffect์™€ ๊ฐ™์€ ํ›…(Hook)๋“ค์ด ํด๋กœ์ € ์›๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ํƒ๊ตฌํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์•„์ฃผ ์œ ์ตํ•œ ํ•™์Šต ๊ฒฝํ—˜์ด ๋  ๊ฑฐ์˜ˆ์š”. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์ด ํด๋กœ์ €์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๊ฑฐ๋“ ์š”.

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ