๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽจ Frontend

๐Ÿ“˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ๊ธฐ๋ณธ ๋‹ค์ง€๊ธฐ - Part 2

by hyebin (Helia) 2025. 4. 27.
๋ฐ˜์‘ํ˜•

ํ•จ์ˆ˜, ๊ฐ์ฒด/๋ฐฐ์—ด, 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, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ, ํ˜ธ์ด์ŠคํŒ… ๋“ฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์‹ค๋ ฅ์„ ํ•œ ๋‹จ๊ณ„ ๋Œ์–ด์˜ฌ๋ ค์ค˜์š”.
๋ฐ˜์‘ํ˜•