์ด๋ฒ ํฌ์คํ ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ธ ํจ์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ์น ๊ฐ๋ฐ์์ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ธ์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ์ฌ์ฉ๋ฒ๊น์ง ๋จ๊ณ๋ณ๋ก ๋ฐฐ์๋ณด์ธ์.
โฃ ๋ชฉ์ฐจ
01. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋?๐ค
์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ํน์ ์์ ์ ์ํํ๋ ์ฝ๋ ๋ธ๋ก์ ๋๋ค. ํจ์๋ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์์ผ๋ฉฐ, ๋งค๋ฒ ํธ์ถ๋ ๋๋ง๋ค ๋์ผํ ์์ ์ ์ํํฉ๋๋ค. ํจ์๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ์ฝ๋๋ฅผ ๋ ๊ตฌ์กฐํํ๋ฉฐ, ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํด ์ค๋๋ค.
02. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ๐
1. ํจ์ ์ ์ธ ๋ฐ ํํ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์ ์ ์ธ๊ณผ ํจ์ ํํ์์ ๋ ๊ฐ์ง ์ฃผ์ํ ํจ์ ์ ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ฌธ๋ฒ์ ์ผ๋ก๋ ๋์ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ ํจ์๊ฐ ์ฝ๋์์ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ์ดํดํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
ํจ์ ์ ์ธ
ํจ์ ์ ์ธ์ function ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ ์ด๋ฆ๊ณผ ํจ๊ป ์ ์ํฉ๋๋ค. ํจ์ ์ ์ธ์ ํธ์ด์คํ (hoisting)์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์, ํจ์ ์ ์ธ์ ์ฝ๋์ ์ด๋์๋ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ํจ์ ์ ์ธ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์ฝ๋ ์คํ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์
function greet() {
console.log("Hello, World!");
}
greet(); // "Hello, World!" ์ถ๋ ฅ
์ด ์์์์๋ greet ํจ์๊ฐ ์ ์ธ๋์ด ์๊ณ , ํจ์ ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ์๋์์ต๋๋ค. ์ด ํจ์๋ ์ฝ๋์ ์ด๋ ๋ถ๋ถ์์๋ ํธ์ถ๋ ์ ์์ต๋๋ค.
ํจ์ ํํ์
ํจ์ ํํ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ๋๋ค. ํจ์ ํํ์์ ํธ์ด์คํ ์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์, ํจ์๊ฐ ์ ์๋ ์ดํ์๋ง ํธ์ถํ ์ ์์ต๋๋ค. ํจ์ ํํ์์ ์ต๋ช ํจ์ ๋๋ ๊ธฐ๋ช ํจ์๋ก ์ ์ํ ์ ์์ต๋๋ค. ํจ์ ํํ์์ ํจ์๊ฐ ๋ณ์์ ํ ๋น๋ ํ์๋ง ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ํจ์ ํํ์์ด ์ ์๋ ๋ ์คํ ์ปจํ ์คํธ์ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์
const greet = function() {
console.log("Hello, World!");
};
greet(); // "Hello, World!" ์ถ๋ ฅ
ํจ์ ํํ์๊ณผ ์ ์ธ์ ์ฐจ์ด์ โญ
1. ํธ์ด์คํ (Hoisting)
- ํจ์ ์ ์ธ: ํจ์ ์ ์ธ์ ํธ์ด์คํ ๋ฉ๋๋ค. ์ด๋ ํจ์๊ฐ ์ฝ๋์ ์ด๋ ์์น์์๋ ํธ์ถ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
greet(); // "Hello, World!" ์ถ๋ ฅ
function greet() {
console.log("Hello, World!");
}
- ํจ์ ํํ์: ํจ์ ํํ์์ ํธ์ด์คํ ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํจ์๊ฐ ์ ์๋ ์ดํ์๋ง ํธ์ถํ ์ ์์ต๋๋ค.
greet(); // ReferenceError: greet is not defined
const greet = function() {
console.log("Hello, World!");
};
greet(); // "Hello, World!" ์ถ๋ ฅ
2. ๊ตฌ๋ฌธ
- ํจ์ ์ ์ธ: function ํค์๋์ ํจ๊ป ํจ์ ์ด๋ฆ์ ๋ช ์ํ์ฌ ์ ์ํฉ๋๋ค
function greet() {
console.log("Hello, World!");
}
- ํจ์ ํํ์: function ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ๋ณ์์ ํ ๋นํฉ๋๋ค.
const greet = function() {
console.log("Hello, World!");
};
3. ๋๋ฒ๊น
- ํจ์ ์ ์ธ: ํจ์ ์ด๋ฆ์ ํฌํจํ๋ฏ๋ก ๋๋ฒ๊น ์ ํธ์ถ ์คํ์์ ํจ์ ์ด๋ฆ์ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
- ์ต๋ช ํจ์ ํํ์: ํจ์ ์ด๋ฆ์ด ์์ผ๋ฏ๋ก ๋๋ฒ๊น ์ ํธ์ถ ์คํ์์ ํจ์ ์ด๋ฆ์ ํ์ธํ๊ธฐ ์ด๋ ต์ต๋๋ค. ํ์ง๋ง ์ด๋ฆ์ด ์๋ ํจ์ ํํ์์ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
const greet = function greeting() {
console.log("Hello, World!");
};
ํจ์ ์ ์ธ๊ณผ ํจ์ ํํ์์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ํจ์ ์ ์ธ์ ์ฃผ๋ก ์ ์ญ ๋ฒ์๋ ์ฝ๋์ ์ด๋ ๋ถ๋ถ์์๋ ํธ์ถ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๊ณ , ํจ์ ํํ์์ ํน์ ์ฝ๋ ๋ธ๋ก ๋ด์์ ์ฌ์ฉ๋๋ฉฐ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
4. ์ฌ์ฉ ์ฉ๋
- ํจ์ ์ ์ธ: ์ฃผ๋ก ๋ ๋ฆฝ์ ์ธ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ํจ์ ํํ์: ์ฝ๋ฐฑ ํจ์๋ ์ผํ์ฑ ํจ์๋ฅผ ์ ์ํ ๋ ์ ์ฉํฉ๋๋ค.
2. ํจ์ ํธ์ถ ๋ฐฉ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ํจ์ ์ด๋ฆ ๋ค์ ๊ดํธ๋ฅผ ๋ถ์ด๋ ๊ฒ์ ๋๋ค. ๊ดํธ ์์๋ ํด๋น ํจ์๊ฐ ํ์๋ก ํ๋ ์ธ์๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค.
function sayHello() {
console.log("Hello, world!");
}
// ํจ์ ํธ์ถ
sayHello(); // ์ฝ์์ "Hello, world!" ์ถ๋ ฅ
์ ์์ ์์ sayHello๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ ์ํ๊ณ , sayHello()๋ก ํธ์ถํ๊ณ ์์ต๋๋ค.
3. ๋งค๊ฐ๋ณ์์ ์ธ์
๋งค๊ฐ๋ณ์ (Parameters)
๋งค๊ฐ๋ณ์๋ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ ๋ณ์๋ค๋ก, ํจ์๊ฐ ํธ์ถ๋ ๋ ์ ๋ฌ๋ ๊ฐ์ ๋ฐ์๋ค์ด๋ ์ญํ ์ ํฉ๋๋ค. ๋งค๊ฐ๋ณ์๋ ํจ์ ์ ์ธ๋ถ์ ๊ดํธ ์์ ์์ฑ๋ฉ๋๋ค.
function greet(name) {
console.log("Hello, " + name + "!");
}
// name์ด ๋งค๊ฐ๋ณ์
์ธ์ (Arguments)
์ธ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์ ๋ฌํ๋ ์ค์ ๊ฐ์ ๋๋ค. ์ธ์๋ ํจ์ ํธ์ถ ์ ๊ดํธ ์์ ์์ฑ๋ฉ๋๋ค.
greet("Alice"); // ์ฝ์์ "Hello, Alice!" ์ถ๋ ฅ
์ ์์ ์์ Alice๋ greet ํจ์์ name ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ์ธ์์ ๋๋ค.
์์ : ๋งค๊ฐ๋ณ์์ ์ธ์
function add(a, b) {
return a + b;
}
let result = add(3, 4); // 3๊ณผ 4๊ฐ ์ธ์๋ก ์ ๋ฌ๋จ
console.log(result); // ์ฝ์์ 7 ์ถ๋ ฅ
์ฌ๊ธฐ์ a์ b๋ ๋งค๊ฐ๋ณ์์ด๊ณ , 3๊ณผ 4๋ ํจ์ ํธ์ถ ์ ์ ๋ฌ๋ ์ธ์์ ๋๋ค.
๊ธฐ๋ณธ๊ฐ ๋งค๊ฐ๋ณ์
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ํจ์๊ฐ ํธ์ถ๋ ๋ ์ธ์๊ฐ ์ ๋ฌ๋์ง ์์ผ๋ฉด ์ฌ์ฉ๋ฉ๋๋ค.
function greet(name = "Guest") {
console.log("Hello, " + name + "!");
}
greet(); // ์ฝ์์ "Hello, Guest!" ์ถ๋ ฅ
greet("Bob"); // ์ฝ์์ "Hello, Bob!" ์ถ๋ ฅ
๋๋จธ์ง ๋งค๊ฐ๋ณ์ (Rest Parameters)
๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์์ ์ ๋ฌ๋ ์ธ์์ ์๊ฐ ์ ํด์ ธ ์์ง ์์ ๋ ์ ์ฉํฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์ ์ ์์ต๋๋ค. ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋... ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํฉ๋๋ค.
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // ์ฝ์์ 6 ์ถ๋ ฅ
console.log(sum(4, 5, 6, 7)); // ์ฝ์์ 22 ์ถ๋ ฅ
์ฝ๋ฐฑ ํจ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
function processUserInput(callback) {
const name = prompt('Please enter your name.');
callback(name);
}
processUserInput((name) => {
console.log('Hello, ' + name + '!');
});
์ด ์์๋ processUserInput ํจ์๊ฐ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
03. ๋ค์ํ ํจ์ ์ ํ๐ ๏ธ
์ต๋ช ํจ์
์ต๋ช ํจ์๋ ์ด๋ฆ์ด ์๋ ํจ์์ ๋๋ค. ์ฃผ๋ก ํจ์ ํํ์ ๋๋ ์ฝ๋ฐฑ ํจ์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
(function() {
console.log("This is an anonymous function");
})();
ํ์ดํ ํจ์
ํ์ดํ ํจ์๋ ES6์์ ๋์ ๋ ๊ฐ๊ฒฐํ ํจ์ ํํ์์ ๋๋ค. function ํค์๋ ๋์ =>๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํฉ๋๋ค. ํ์ดํ ํจ์๋ ํนํ this ๋ฐ์ธ๋ฉ์ ๋์์ด ์ผ๋ฐ ํจ์์ ๋ค๋ฆ ๋๋ค.
const add = (a, b) => a + b;
console.log(add(2, 3)); // 5 ์ถ๋ ฅ
const greet = name => {
console.log(`Hello, ${name}!`);
};
greet('Alice'); // 'Hello, Alice!' ์ถ๋ ฅ
ํ์ดํ ํจ์๋ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ this๊ฐ ์์ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ๋ ํน์ง์ด ์์ต๋๋ค.
์ฆ์ ์คํ ํจ์
์ฆ์ ์คํ ํจ์๋ ์ ์๋์๋ง์ ์คํ๋๋ ํจ์์ ๋๋ค. ์ฃผ๋ก ๋ณ์๋ฅผ ๋ค๋ฅธ ์ค์ฝํ์ ๊ฐ๋์ด ๊ธ๋ก๋ฒ ๋ค์์คํ์ด์ค ์ค์ผ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
(function() {
console.log('This function runs immediately!');
})();
(function(name) {
console.log(`Hello, ${name}!`);
})('Bob');
์ฌ๊ท ํจ์
์ฌ๊ท ํจ์๋ ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ๋ฐฉ์์ ๋๋ค. ์ฃผ๋ก ๋ฐ๋ณต์ ์ธ ์์ ์ ์ํํ๊ฑฐ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
function factorial(n) {
if (n === 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
console.log(factorial(5)); // 120 ์ถ๋ ฅ
์ฝ๋ฐฑ ํจ์
์ฝ๋ฐฑ ํจ์๋ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋์ด ํน์ ์์ ์ด ์๋ฃ๋ ํ ํธ์ถ๋๋ ํจ์์ ๋๋ค. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ, ์ด๋ฒคํธ ํธ๋ค๋ง, ๋ฐฐ์ด ๋ฉ์๋ ๋ฑ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
function fetchData(callback) {
setTimeout(() => {
callback("Data fetched");
}, 1000);
}
fetchData((message) => {
console.log(message);
});
์ด ์์์์๋ fetchData ํจ์๊ฐ ๋น๋๊ธฐ ์์ ์ ์ํํ ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ฉฐ, ์ด๋ฒคํธ ๋ฆฌ์ค๋์์๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
04. ๊ณ ๊ธ ํจ์ ์ฌ์ฉ๋ฒ๐
ํด๋ก์
ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ๋น์์ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํด๋ก์ ๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
function outerFunction(outerVariable) {
return function innerFunction(innerVariable) {
console.log('Outer Variable: ' + outerVariable);
console.log('Inner Variable: ' + innerVariable);
};
}
const newFunction = outerFunction('outside');
newFunction('inside');
// Outer Variable: outside
// Inner Variable: inside
์ด ์์์์ innerFunction์ outerVariable์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ outerFunction์ด ์คํ๋ ์ดํ์๋ outerVariable์ด ๊ณ์ํด์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ณ ์ฐจ ํจ์
๊ณ ์ฐจ ํจ์๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋, ํจ์๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด ๋ฉ์๋ (map, filter, reduce ๋ฑ)์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
function higherOrderFunction(callback) {
const data = 'Hello, World!';
return callback(data);
}
function callbackFunction(text) {
return text.toUpperCase();
}
const result = higherOrderFunction(callbackFunction);
console.log(result); // 'HELLO, WORLD!'
ํจ์์ ์ ํจ ๋ฒ์(Scope)
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์ ์ค์ฝํ์ ๋ธ๋ก ์ค์ฝํ๊ฐ ์์ต๋๋ค. ํจ์ ์ค์ฝํ๋ ๋ณ์๊ฐ ํจ์ ๋ด์์ ์ ์๋ ๋, ๊ทธ ๋ณ์๋ ํจ์ ์ ์ฒด์์ ์ ํจํฉ๋๋ค. ๋ธ๋ก ์ค์ฝํ๋ let๊ณผ const ํค์๋๋ก ์ ์๋ ๋ณ์๊ฐ ํด๋น ๋ธ๋ก ๋ด์์๋ง ์ ํจํฉ๋๋ค.
function functionScope() {
var functionScoped = 'I am a function scoped variable';
if (true) {
let blockScoped = 'I am a block scoped variable';
console.log(blockScoped); // 'I am a block scoped variable'
}
console.log(functionScoped); // 'I am a function scoped variable'
// console.log(blockScoped); // ReferenceError: blockScoped is not defined
}
functionScope();
this ํค์๋
์๋ฐ์คํฌ๋ฆฝํธ this ํค์๋๋ ์คํ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๊ฐ๋ฆฌํต๋๋ค. ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋๋์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
- ์ ์ญ ์ปจํ ์คํธ: ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ window ๊ฐ์ฒด, Node.js์์๋ global ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- ๋ฉ์๋ ํธ์ถ: ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- ์์ฑ์ ํจ์: ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- ํ์ดํ ํจ์: ํ์ดํ ํจ์๋ this ๊ฐ์ ์์ ์ค์ฝํ์ this๋ก ๊ณ ์ ํฉ๋๋ค.
// ์ ์ญ ์ปจํ
์คํธ
console.log(this); // ๋ธ๋ผ์ฐ์ ์์๋ window, Node.js์์๋ global
// ๋ฉ์๋ ํธ์ถ
const person = {
name: 'Alice',
greet: function() {
console.log(this.name);
}
};
person.greet(); // 'Alice'
// ์์ฑ์ ํจ์
function Person(name) {
this.name = name;
}
const bob = new Person('Bob');
console.log(bob.name); // 'Bob'
// ํ์ดํ ํจ์
const arrowFunction = () => {
console.log(this);
};
arrowFunction(); // ์์ ์ค์ฝํ์ this ๊ฐ (์ ์ญ ๊ฐ์ฒด)
const obj = {
method: function() {
const arrowFunc = () => {
console.log(this);
};
arrowFunc();
}
};
obj.method(); // obj ๊ฐ์ฒด
05. ์ต์ ํ ๋ฐ ์ฑ๋ฅ ๊ฐ์ ๐ก
1. ํจ์์ ์ฑ๋ฅ ํฅ์ ๋ฐฉ๋ฒ
- ๋ถํ์ํ ํจ์ ํธ์ถ ์ต์ํ
- ๋ฃจํ ๋ด ํจ์ ํธ์ถ ํผํ๊ธฐ
2. ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)์ ๋์ผํ ๊ณ์ฐ ์์ ์ ๋ฐ๋ณตํ์ง ์๋๋ก, ํจ์์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ๋๋ค. ์ด ๊ธฐ๋ฒ์ ํนํ ์ฌ๊ท ํจ์๋ ๋ฐ๋ณต์ ์ธ ๊ณ์ฐ ์์ ์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์ํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์ ์ ๊ธฐ๋ณธ ๊ฐ๋
๋ฉ๋ชจ์ด์ ์ด์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์บ์(๋ณดํต ๊ฐ์ฒด ํํ)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋จผ์ ์บ์๋ฅผ ํ์ธํ๊ณ , ๋์ผํ ์ ๋ ฅ ๊ฐ์ด ์ด๋ฏธ ๊ณ์ฐ๋์๋ค๋ฉด ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณ์ฐ์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅํ ํ ๋ฐํํฉ๋๋ค.
- ์์: ํผ๋ณด๋์น์์ด
ํผ๋ณด๋์น์์ด์ ๊ฐ ์ซ์๊ฐ ์ ๋ ์ซ์์ ํฉ์ธ ์์ด์ ๋๋ค. ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณ์ฐ์ด ๊ฐ๋จํ์ง๋ง, ๋์ผํ ๊ฐ์ ๋ฐ๋ณตํด์ ๊ณ์ฐํ๋ ๋นํจ์จ์ ์ธ ๋ฐฉ์์ด ๋ฉ๋๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ฌ๊ท ํจ์ (๋นํจ์จ์ ์ธ ๋ฐฉ์)
function fibonacci(n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(10)); // 55
์ด ํจ์๋ fibonacci(10)์ ๊ณ์ฐํ๊ธฐ ์ํด ๋ง์ ์ค๋ณต ํธ์ถ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด fibonacci(9)์ fibonacci(8)์ ์ฌ๋ฌ ๋ฒ ๊ณ์ฐํ๊ฒ ๋ฉ๋๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ ํจ์ (ํจ์จ์ ์ธ ๋ฐฉ์)
function memoizedFibonacci() {
const cache = {};
return function fib(n) {
if (n in cache) {
return cache[n];
}
if (n <= 1) {
return n;
}
cache[n] = fib(n - 1) + fib(n - 2);
return cache[n];
};
}
const fibonacci = memoizedFibonacci();
console.log(fibonacci(10)); // 55
console.log(fibonacci(50)); // ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ณ์ฐ๋จ
์ด ์์์์ memoizedFibonacci ํจ์๋ ์บ์๋ฅผ ๋ด๋ถ์ ์ ์งํ๊ณ , ์ฌ๊ท์ ์ผ๋ก ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ ์บ์์ ์ ์ฅํ๊ณ , ๋ค์์ ๋์ผํ ๊ฐ์ด ํ์ํ ๋ ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฅ์
- ์ฑ๋ฅ ํฅ์: ์ค๋ณต๋ ๊ณ์ฐ์ ํผํ๊ณ ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์ํฉ๋๋ค.
- ๊ฐ๋จํ ๊ตฌํ: ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์ ์ ๋จ์
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ: ์บ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค. ํนํ, ์ ๋ ฅ ๊ฐ์ ๋ฒ์๊ฐ ๋์ ๊ฒฝ์ฐ ์บ์๊ฐ ๋งค์ฐ ์ปค์ง ์ ์์ต๋๋ค.
- ์ ์ฉ ๊ฐ๋ฅ์ฑ ์ ํ: ๋ชจ๋ ํจ์์ ์ ์ฉํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ํนํ, ์ ๋ ฅ ๊ฐ์ด ๋งค์ฐ ๋ค์ํ๊ฑฐ๋ ์บ์์ ํจ์จ์ด ๋ฎ์ ๊ฒฝ์ฐ์๋ ์คํ๋ ค ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
3. ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ํตํ ํจ์จ์ฑ ์ฆ๊ฐ
- ์ค๋ณต ์ฝ๋ ์ ๊ฑฐ
- ํจ์ ๋ถ๋ฆฌ ๋ฐ ๋ชจ๋ํ
06. ํต์ฌ ๋ด์ฉ๐