ํจ์, ๊ฐ์ฒด/๋ฐฐ์ด, DOM, this, ์คํ ์ปจํ ์คํธ ์์ ์ ๋ณต
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ ํํํ๊ฒ ๋ง๋ค๊ธฐ ์ํด, ์ด๋ฒ ๊ธ์์๋ ์ค๋ฌด์์ ์์ฃผ ๋ง์ฃผ์น๋ ํต์ฌ ์ฃผ์ ๋ค์ ๋ค๋ค๋ณผ๊ฒ์.
ํจ์์ ์ ์ธ ๋ฐฉ์๋ถํฐ, ๊ฐ์ฒด์ ๋ฐฐ์ด์ ํ์ฉ, DOM ์กฐ์, ๊ทธ๋ฆฌ๊ณ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ฒ์์ ํท๊ฐ๋ คํ๋ this, ์คํ ์ปจํ ์คํธ๊น์ง ํจ๊ป ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
โ ํจ์์ ๋ค์ํ ์ ์ธ ๋ฐฉ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์ ํฌ๊ฒ ์ธ ๊ฐ์ง๊ฐ ์์ด์.
๐น ํจ์ ์ ์ธ์ (Function Declaration)
function sayHello() {
console.log("์๋
ํ์ธ์!");
}
sayHello(); // โ
์ ์ธ ์ ์๋ ํธ์ถ ๊ฐ๋ฅ
- ์ ์ธ ์ ์ ํธ์ถํด๋ ์๋ํด์.
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์คํ ์ ์ ํจ์ ์ ์ธ์ ํธ์ด์คํ (๋์ด์ฌ๋ฆผ) ํ๊ธฐ ๋๋ฌธ์ด์์.
๐น ํจ์ ํํ์ (Function Expression)
const sayHi = function() {
console.log("์๋
!");
};
sayHi(); // โ
ํธ์ถ ๊ฐ๋ฅ (๋จ, ์ ์ธ ์ดํ๋ถํฐ)
- ๋ณ์์ ํจ์๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๊ณ , ์ ์ธ ์ด์ ์๋ ํธ์ถํ ์ ์์ด์.
๐น ํ์ดํ ํจ์ (Arrow Function, ES6+)
const greet = (name) => {
console.log(`์๋
, ${name}!`);
};
// ๋ ๊ฐ๊ฒฐํ๊ฒ (ํ ์ค์ผ ๊ฒฝ์ฐ return ์๋ต ๊ฐ๋ฅ)
const add = (a, b) => a + b;
ํจ์ ์ ํ | ํธ์ด์คํ | this ๋ฐ์ธ๋ฉ | ํน์ง |
ํจ์ ์ ์ธ์ | O | ์์ฒด this | ์ ์ธ ์ ์๋ ํธ์ถ ๊ฐ๋ฅ |
ํจ์ ํํ์ | X | ์์ฒด this | ๋ณ์์ ํ ๋น๋ ํํ, ์ ์ธ ํ ํธ์ถ |
ํ์ดํ ํจ์ | X | ์์ ์ค์ฝํ this | ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ, ์์ ์ค์ฝํ์ this ์ฌ์ฉ |
โ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ํ์ฉ
๊ฐ์ฒด(Object)๋ key-value ์์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ ๊ตฌ์กฐ์์.
const user = {
name: "ํ๋น",
age: 26,
sayHello: function() {
console.log(`์๋
ํ์ธ์, ${this.name}์
๋๋ค.`);
},
};
user.sayHello(); // ์๋
ํ์ธ์, ํ๋น์
๋๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด ์์๋ ๋ฐ์ดํฐ๋ฟ ์๋๋ผ ํจ์๋ ๋ด์ ์ ์์ด์. ์ด ํจ์๋ ๋ณดํต ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฌ์.
// ๊ฐ์ฒด ์์ฑ ์ ๊ทผ
console.log(user.name); // ํ๋น
console.log(user['age']); // 26
// ๊ฐ์ฒด ์์ฑ ์ถ๊ฐ/์์
user.job = '๊ฐ๋ฐ์';
user.age = 27;
// ๊ฐ์ฒด ์์ฑ ์ญ์
delete user.age;
// ๊ฐ์ฒด ๋ฉ์๋ ๊ฐํธ ํ๊ธฐ๋ฒ (ES6+)
const enhancedUser = {
name: "๋ฏผ์ง",
greet() { // function ํค์๋ ์๋ต ๊ฐ๋ฅ
console.log(`Hello, I'm ${this.name}`);
}
};
๐น ๋ฐฐ์ด (Array)
๋ฐฐ์ด(Array)์ ์์๊ฐ ์๋ ๊ฐ๋ค์ ์งํฉ์ด์์.
const fruits = ["์ฌ๊ณผ", "๋ฐ๋๋", "ํฌ๋"];
console.log(fruits[1]); // ๋ฐ๋๋
fruits.push("๋ธ๊ธฐ"); // ๋ฐฐ์ด ๋์ ์ถ๊ฐ
// ๋ฐฐ์ด ์์ ์ํ
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// for...of ๊ตฌ๋ฌธ (ES6+)
for (const fruit of fruits) {
console.log(fruit);
}
์์ฃผ ์ฌ์ฉํ๋ ๋ฐฐ์ด ๋ฉ์๋
- map: ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๋ณํํด ์ ๋ฐฐ์ด ์์ฑ
- filter: ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ง ๋จ๊ธด ์ ๋ฐฐ์ด ์์ฑ
- reduce: ๋ฐฐ์ด์ ๊ฐ์ ํ๋๋ก ์ค์ (๋์ ๊ณ์ฐ)
- forEach: ๊ฐ ์์์ ๋ํด ํจ์ ์คํ (๋ฐํ ๊ฐ์์)
- find: ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์์ ๋ฐํ
const nums = [1, 2, 3, 4, 5];
const doubled = nums.map(n => n * 2); // [2, 4, 6, 8, 10]
const odd = nums.filter(n => n % 2 === 1); // [1, 3, 5]
const sum = nums.reduce((acc, curr) => acc + curr, 0); // 15
nums.forEach(n => console.log(n));
const found = nums.find(n => n > 3); // 4
๊ธฐํ ๋ฐฐ์ด ๋ฉ์๋
๋ฉ์๋ | ์ฉ๋ | ๋ฐํ๊ฐ | ์๋ณธ ๋ฐฐ์ด ๋ณ๊ฒฝ |
push/pop | ๋์ ์ถ๊ฐ/์ ๊ฑฐ | ์ ๊ธธ์ด/์ ๊ฑฐ๋ ์์ | O |
shift/unshift | ์์ ์ ๊ฑฐ/์ถ๊ฐ | ์ ๊ฑฐ๋ ์์/์ ๊ธธ์ด | O |
map | ๊ฐ ์์ ๋ณํ | ์ ๋ฐฐ์ด | X |
filter | ์กฐ๊ฑด ํํฐ๋ง | ์ ๋ฐฐ์ด | X |
reduce | ๊ฐ ๋์ ๊ณ์ฐ | ๊ณ์ฐ ๊ฒฐ๊ณผ | X |
forEach | ๊ฐ ์์ ์ํ | undefined | X |
slice | ์ผ๋ถ ์ถ์ถ | ์ ๋ฐฐ์ด | X |
splice | ์์ ๊ต์ฒด | ์ ๊ฑฐ๋ ์์ ๋ฐฐ์ด | O |
โ DOM ์กฐ์ (Document Object Model)
์๋ฐ์คํฌ๋ฆฝํธ๋ HTML ๋ฌธ์(=DOM)๋ฅผ ์กฐ์ํ ์ ์์ด์.
ํ๋ฉด์ ํ ์คํธ๋ฅผ ๋ฐ๊พธ๊ฑฐ๋, ์์๋ฅผ ํด๋ฆญํ์ ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ฃ .
๐น ์์ ์ ํ
const title = document.getElementById("main-title");
const buttons = document.querySelectorAll(".btn");
๐น ํ ์คํธ, ์์ฑ ๋ณ๊ฒฝ
title.textContent = "์๋ก์ด ์ ๋ชฉ";
title.setAttribute("data-role", "hero");
๐น ํด๋์ค ์ ์ด
title.classList.add("active");
title.classList.remove("hidden");
๐น ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ถ๊ฐ
const btn = document.querySelector(".btn");
btn.addEventListener("click", () => {
alert("๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค!");
});
์ด๋ ๊ฒ ํ๋ฉด HTML๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฐ๊ฒฐ๋์ด ์ง์ง๋ก ๋์ํ๋ ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋ผ์.
โ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ๋ฐฉ์ ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ ๊ณผ์ ์ ๊ฑฐ์ณ์.
๊ทธ ๊ณผ์ ์ ์๋ฉด ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ , ์ฝ๋๋ฅผ ๋ ์ ํํ๊ฒ ์์ธกํ ์ ์์ด์.
1. ํธ์ด์คํ (Hoisting)
์๋ฐ์คํฌ๋ฆฝํธ๋ ์คํ ์ ์ ๋ณ์์ ํจ์ ์ ์ธ์ ๋จผ์ ๋์ด์ฌ๋ฆฌ๋ ์์ ์ ํด์.
์ด๊ฑธ ํธ์ด์คํ ์ด๋ผ๊ณ ํด์.
console.log(x); // undefined
var x = 10;
์ด๋ ๊ฒ var๋ก ์ ์ธํ ๋ณ์๋ ์ ์ธ๋ง ์๋ก ์ฌ๋ผ๊ฐ๊ณ , ๊ฐ์ ํ ๋น๋์ง ์๊ธฐ ๋๋ฌธ์ undefined๊ฐ ์ถ๋ ฅ๋ผ์.
๋ฐ๋ฉด let, const๋ ์ด๊ธฐํ ์ ์ ์ ๊ทผํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํด์.
2. this ํค์๋
this๋ ํ์ฌ ์คํ ์ค์ธ ๋ฌธ๋งฅ(context)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ํค์๋์์.
const person = {
name: "ํ๋น",
sayHello() {
console.log(this.name);
}
};
person.sayHello(); // 'ํ๋น'
์ฌ๊ธฐ์๋ this๊ฐ person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์.
ํ์ง๋ง ์๋์ฒ๋ผ ํจ์๋ง ๋ฐ๋ก ๊บผ๋ด์ ์ฐ๋ฉด ๋ฌ๋ผ์ ธ์.
const greet = person.sayHello;
greet(); // undefined (๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ window.name)
๋ํ ํ์ดํ ํจ์๋ this๋ฅผ ๋ฐ์ธ๋ฉํ์ง ์๊ณ , ์์ ์ด ์ ์ธ๋ ์์น์ this๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํด์.
3. ์คํ ์ปจํ ์คํธ(Execution Context)
์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ํ๊ฒฝ์ ๊ตฌ์ฑํด์. ์ด๊ฑธ ์คํ ์ปจํ ์คํธ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ฝ๊ฒ ๋งํ๋ฉด, ๋๊ฐ ์คํ ์ค์ธ์ง, ์ด๋ค ๋ณ์๋ค์ด ์๋์ง, ์ด๋ค ํจ์๊ฐ ์ด๋์ ์๋์ง๋ฅผ ๊ธฐ์ตํ๋ ๊ณต๊ฐ์ด์์.
function outer() {
const outerVar = '๋ฐ';
function inner() {
console.log(outerVar); // ์คํ ์ปจํ
์คํธ ์ฒด์ธ์ ๋ฐ๋ผ ์ ๊ทผ ๊ฐ๋ฅ
}
inner();
}
outer();
์๋ฐ์คํฌ๋ฆฝํธ๋ ์คํ ์์ ๋ง๋ค ์คํ์ฒ๋ผ ์ปจํ ์คํธ๋ฅผ ์์๊ฐ๋ฉฐ ์คํํ๊ณ ,
์ด ์ปจํ ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ์๋ ํจ์์ ์ ๊ทผํด์. ์ด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ํด๋ก์ ๋ this, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํจ์ฌ ์ดํดํ๊ธฐ ์ฌ์์ ธ์.
๐ฏ ๋ง๋ฌด๋ฆฌ ์์ฝ
- ํจ์๋ ์ ์ธ์๊ณผ ํํ์์ด ์๊ณ , ํธ์ด์คํ ์ฌ๋ถ๊ฐ ๋ค๋ฆ ๋๋ค.
- ๊ฐ์ฒด์ ๋ฐฐ์ด์ JS์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฉ์๋์ ๊ณ ์ฐจ ํจ์์ ์ต์ํด์ง ํ์๊ฐ ์์ด์.
- DOM์ ์กฐ์ํ๋ฉด HTML ์์๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ณ , ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํฉ๋๋ค.
- this, ์คํ ์ปจํ ์คํธ, ํธ์ด์คํ ๋ฑ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ํ๋ฆ์ ์ดํดํ๋ ๊ฒ์ ์ค๋ ฅ์ ํ ๋จ๊ณ ๋์ด์ฌ๋ ค์ค์.
'๐จ Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ ์๋ฐ์คํฌ๋ฆฝํธ(JavaScript) ๊ธฐ๋ณธ ๋ค์ง๊ธฐ - Part 1 (0) | 2025.04.24 |
---|---|
์น ํ์ด์ง ๋ ์ด์์ ์ ๋๋ก ์ก๊ธฐ (0) | 2025.04.23 |
CSS๋ก ์คํ์ผ๋ง ์์ํ๊ธฐ (0) | 2025.04.10 |
HTML ๊ธฐ๋ณธ๊ธฐ ๋ค์ง๊ธฐ (0) | 2025.04.09 |
์น์ ์ด๋ป๊ฒ ์๋ํ ๊น? (0) | 2025.04.08 |