๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Language/Javascript

[Javascript]์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋กœ์ € ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์ดํ•ด๋ถ€ํ„ฐ ์‹ค์ „ ์˜ˆ์ œ๊นŒ์ง€

by YJ Dev 2024. 7. 8.
728x90
๋ฐ˜์‘ํ˜•
SMALL

์˜ค๋Š˜์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ ํด๋กœ์ €์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ „ ์˜ˆ์ œ๊นŒ์ง€ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ˆ, ๋๊นŒ์ง€ ํ•จ๊ป˜ ํ•ด์ฃผ์„ธ์š”!

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋กœ์ €


01. ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ๐Ÿง 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šค์ฝ”ํ”„์™€ ํด๋กœ์ €์˜ ๊ด€๊ณ„

ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šค์ฝ”ํ”„(scope) ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šค์ฝ”ํ”„๋Š” ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์™€ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค์ฝ”ํ”„์— ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”๐Ÿ˜

""

[Javascript]์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค์ฝ”ํ”„ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๊ธฐ์ดˆ๋ถ€ํ„ฐ ๊ณ ๊ธ‰๊นŒ์ง€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์žˆ์–ด์„œ '์Šค์ฝ”ํ”„'๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์Šค์ฝ”ํ”„๋ฅผ ์ดํ•ดํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค์ฝ”ํ”„์—

creativevista.tistory.com

ํด๋กœ์ €์˜ ๋™์ž‘ ์›๋ฆฌ

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋•Œ์˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ์ดํ›„์—๋„ ํด๋กœ์ €๋Š” ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  
function outerFunction() {
let outerVariable = 'I am outside!';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
const innerFunc = outerFunction();
innerFunc(); // 'I am outside!' ์ถœ๋ ฅ

์œ„ ์ฝ”๋“œ์—์„œ innerFunction์€ outerVariable์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


02. ํด๋กœ์ €์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ์žฅ์ ๐ŸŒŸ

๋ฐ์ดํ„ฐ ์€๋‹‰ (Data Encapsulation)

ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์€๋‹‰์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๋ณด์•ˆ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.


  
function createCounter() {
let count = 0;
return function() {
count++;
return count;
}
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

๋ชจ๋“ˆํ™”์™€ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ

ํด๋กœ์ €๋Š” ๋ชจ๋“ˆํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ๋‚˜ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(IIFE) ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์บ์‹ฑ (Data Caching)

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ €์žฅํ•ด ๋‘๊ณ , ๊ฐ™์€ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  
function createCachedFunction() {
const cache = {};
return function(key, computeFunc) {
if (!cache[key]) {
cache[key] = computeFunc();
}
return cache[key];
}
}
const cachedCompute = createCachedFunction();
const result1 = cachedCompute('result', () => {
console.log('Computing result...');
return 42;
});
const result2 = cachedCompute('result', () => {
console.log('Computing result...');
return 42;
});
console.log(result1); // 42, 'Computing result...' ์ถœ๋ ฅ
console.log(result2); // 42, 'Computing result...' ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ

๋ฐ˜๋ณต์ ์ธ ๋ฐ์ดํ„ฐ ์บ์‹ฑ ํ™œ์šฉ

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


  
function createFibonacci() {
const cache = {};
function fibonacci(n) {
if (n in cache) {
return cache[n];
}
if (n <= 1) {
return n;
} else {
const result = fibonacci(n - 1) + fibonacci(n - 2);
cache[n] = result;
return result;
}
}
return fibonacci;
}
const fib = createFibonacci();
console.log(fib(10)); // 55
console.log(fib(20)); // 6765

์œ„ ์˜ˆ์ œ์—์„œ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ณ„์‚ฐํ•  ๋•Œ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์บ์‹ฑํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


03. ์‹ค์ „ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ํด๋กœ์ € ํ™œ์šฉ๋ฒ• ๐Ÿ’ป

ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ (Function Factory)

ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ๋Š” ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.


  
function multiplier(factor) {
return function(number) {
return number * factor;
}
}
const double = multiplier(2);
console.log(double(5)); // 10

์ฝœ๋ฐฑ ํ•จ์ˆ˜ (Callback Function)

์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ๋„ ํด๋กœ์ €๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.


  
function fetchData(url) {
fetch(url)
.then(response => response.json())
.then(data => {
console.log(data);
});
}

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ (Event Handler)

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ๋„ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  
function setupEventHandlers() {
let count = 0;
document.getElementById('myButton').addEventListener('click', function() {
count++;
console.log(`Button clicked ${count} times`);
});
}

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

1. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

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

์ฃผ์˜์‚ฌํ•ญ:

  • ํ•„์š” ์—†๋Š” ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋กœ์ €๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜์—ฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

2. ์„ฑ๋Šฅ ์ €ํ•˜

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ:

  • ํด๋กœ์ €๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ณ€์ˆ˜์˜ ์ž˜๋ชป๋œ ์ฐธ์กฐ

ํด๋กœ์ €๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ’์ด ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ˜๋ณต๋ฌธ์—์„œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:


  
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // ๋ชจ๋“  ํด๋กœ์ €๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ฐ’์ธ 5๋ฅผ ์ถœ๋ ฅํ•จ
}, 1000);
}

ํ•ด๊ฒฐ์ฑ…:

  • let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜(IIFE)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i); // ๊ฐ ํด๋กœ์ €๊ฐ€ ๊ณ ์œ ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•จ
}, 1000);
}

4. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ์ €ํ•˜

ํด๋กœ์ €๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์œ ์ง€๋ณด์ˆ˜์— ์–ด๋ ค์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ:

  • ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ์ฃผ์„์„ ํ†ตํ•ด ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋กœ์ €๋ฅผ ์ ์ ˆํžˆ ์บก์Šํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

5. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€์˜ ์‚ฌ์šฉ

๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ํด๋กœ์ €๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋กœ์ €๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๋•Œ, ์˜๋„ํ•œ ์‹œ์ ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:


  
function fetchData(url) {
var data = "old data";
setTimeout(function() {
console.log(data); // "old data"๊ฐ€ ์ถœ๋ ฅ๋จ
}, 1000);
// ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋จ
data = "new data";
}
fetchData('example.com');

ํ•ด๊ฒฐ์ฑ…:

  • ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  
function fetchData(url) {
var data = "old data";
setTimeout((function(dataCopy) {
return function() {
console.log(dataCopy); // "old data"๊ฐ€ ์ถœ๋ ฅ๋จ
};
})(data), 1000);
data = "new data";
}
fetchData('example.com');

์ด์™€ ๊ฐ™์€ ์ฃผ์˜์‚ฌํ•ญ์„ ๋ช…์‹ฌํ•˜๋ฉด ํด๋กœ์ €๋ฅผ ๋”์šฑ ์•ˆ์ „ํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•