** ๐Ÿ“Œ1๏ธโƒฃ ํ•จ์ˆ˜ 4์ข… ์™„๋ฒฝ ๋น„๊ต**

ํ•จ์ˆ˜ ์œ ํ˜• ์„ ์–ธ ๋ฐฉ์‹ ํ˜ธ์ด์ŠคํŒ… this ๋ฐ”์ธ๋”ฉ ํŠน์ง• & ์ฃผ์˜
ํ•จ์ˆ˜ ์„ ์–ธ์‹ function func() {} O (์œ„๋กœ ๋Œ์–ด์˜ฌ๋ฆผ) ํ˜ธ์ถœ ์ปจํ…์ŠคํŠธ ๊ธฐ์ค€ ๊ธฐ๋ณธ ํ•จ์ˆ˜
ํ•จ์ˆ˜ ํ‘œํ˜„์‹ const func = function() {} X ์‹คํ–‰ ์‹œ ๊ฒฐ์ • ๋ณ€์ˆ˜ ๊ธฐ์ค€
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ const func = () => {} X ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this ๊ฐ€๋ณ๊ณ , arguments ์—†์Œ
IIFE (function(){})() X ์ฆ‰์‹œ ์‹คํ–‰ ์Šค์ฝ”ํ”„ ๋ณดํ˜ธ (์ „์—ญ ์˜ค์—ผ ๋ฐฉ์ง€)

๐Ÿ“š ์˜ˆ์ œ ๋น„๊ต

// ํ•จ์ˆ˜ ์„ ์–ธ์‹
hoisted();
function hoisted() { console.log('์„ ์–ธ์‹ ํ˜ธ์ถœ๋จ!'); }

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹
// notHoisted(); // Error
const notHoisted = function() { console.log('ํ‘œํ˜„์‹ ํ˜ธ์ถœ'); };

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (this โ†’ ์ƒ์œ„ ์Šค์ฝ”ํ”„)
const arrow = () => console.log(this);

// IIFE
(function() { console.log('์ฆ‰์‹œ ์‹คํ–‰!'); })();


๐Ÿง  2๏ธโƒฃ this ๋ฐ”์ธ๋”ฉ ์‹ฌํ™” ๋น„๊ต

ํ•จ์ˆ˜ ์ข…๋ฅ˜ this ๊ฒฐ์ • ๋ฐฉ์‹
์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ปจํ…์ŠคํŠธ (์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ–ˆ๋Š”๊ฐ€)
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this ์‚ฌ์šฉ (๋ ‰์‹œ์ปฌ ๋ฐ”์ธ๋”ฉ)

๐Ÿ“Œ ์˜ˆ์ œ

const obj = {
  name: 'JS',
  regularFunc: function() {
    console.log(this.name); // 'JS'
  },
  arrowFunc: () => {
    console.log(this.name); // undefined (์ƒ์œ„ ์Šค์ฝ”ํ”„)
  }
};

obj.regularFunc();
obj.arrowFunc();


๐Ÿ”ฅ 3๏ธโƒฃ ํด๋กœ์ € (Closure) ์™„๋ฒฝ ํ•ด๋ถ€


๐Ÿงฉ ์ •์˜:

โ€œํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ(์Šค์ฝ”ํ”„)์„ ๊ธฐ์–ตํ•˜๋Š” ํ•จ์ˆ˜โ€


๐Ÿ“Œ ํ•ต์‹ฌ ํŠน์ง•:


๐Ÿ“š ๊ธฐ๋ณธ ์˜ˆ์ œ

function outer() {
  let count = 0;
  return function inner() {
    count++;
    console.log(count);
  };
}

const counter = outer();
counter(); // 1
counter(); // 2

โš ๏ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ฃผ์˜ ํฌ์ธํŠธ

function createHeavy() {
  let largeData = new Array(1000000).fill('data');
  return function() {
    console.log(largeData[0]);
  };
}

const heavy = createHeavy();
// heavy ์‚ฌ์šฉ ํ›„ ์ฐธ์กฐ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด largeData ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ ์ ์œ 

โœ… ์‹ค๋ฌด ํŒ:

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํƒ€์ด๋จธ ๋‚ด ํด๋กœ์ € โ†’ ๋ฐ˜๋“œ์‹œ ํ•ด์ œ ํ•„์š”


๐Ÿš€ 4๏ธโƒฃ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ (Callback)


๐Ÿ“Œ ์ •์˜:

๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜


๐Ÿ“š ์˜ˆ์ œ

function greet(callback) {
  console.log('Hello');
  callback();
}

greet(function() { console.log('Callback ์‹คํ–‰!'); });

๐Ÿ“ข ๋น„์œ :

โ€œ์ผ ๋๋‚˜๋ฉด ์•Œ๋ ค์ค˜!โ€ โ†’ ์ฝœ๋ฐฑ ๋“ฑ๋ก ํ›„ ํ˜ธ์ถœ


๐Ÿš€ 5๏ธโƒฃ ๊ณ ์ฐจ ํ•จ์ˆ˜ (Higher-Order Function)


๐Ÿ“Œ ์ •์˜:

ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜, ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜


๐Ÿ“š ๋Œ€ํ‘œ ์˜ˆ์‹œ

function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

const double = multiplier(2);
console.log(double(5)); // 10

โœ… ์‹ค๋ฌด์—์„œ ๋Œ€ํ‘œ ๊ณ ์ฐจ ํ•จ์ˆ˜:


๐Ÿง  6๏ธโƒฃ ์‹ค๋ฌด & ๊ธฐ์ˆ  ๋ฉด์ ‘ ํฌ์ธํŠธ

์งˆ๋ฌธ ํ•ต์‹ฌ ํฌ์ธํŠธ
ํ•จ์ˆ˜ ์„ ์–ธ์‹ vs ํ‘œํ˜„์‹ ์ฐจ์ด? ํ˜ธ์ด์ŠคํŒ… ์—ฌ๋ถ€, ์„ ์–ธ ์œ„์น˜
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this๋Š”? ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this ๋ฐ”์ธ๋”ฉ
ํด๋กœ์ €๋ž€? ์™ธ๋ถ€ ์Šค์ฝ”ํ”„ ๊ธฐ์–ต, ์ƒํƒœ ์œ ์ง€
ํด๋กœ์ € ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์–ธ์ œ? ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ์ฐธ์กฐ ๋‚จ์„ ๋•Œ
๊ณ ์ฐจ ํ•จ์ˆ˜ ์˜ˆ์‹œ? map, filter, reduce, ์ปค์Šคํ…€ ๊ณ ์ฐจ
IIFE ๋ชฉ์ ? ์ „์—ญ ์Šค์ฝ”ํ”„ ์˜ค์—ผ ๋ฐฉ์ง€, ๋ชจ๋“ˆํ™”


๐Ÿ“‘ 7๏ธโƒฃ ๋…ธ์…˜์šฉ ์ •๋ฆฌ ํ‘œ


๐Ÿ“‹ ํ•จ์ˆ˜ ์œ ํ˜• ๋น„๊ต

ํ•จ์ˆ˜ ์œ ํ˜• ์„ ์–ธ ๋ฐฉ์‹ ํ˜ธ์ด์ŠคํŒ… this ๋ฐ”์ธ๋”ฉ ํŠน์ง•
ํ•จ์ˆ˜ ์„ ์–ธ์‹ function func(){} O ํ˜ธ์ถœ ์ปจํ…์ŠคํŠธ ๊ธฐ๋ณธ ํ•จ์ˆ˜
ํ•จ์ˆ˜ ํ‘œํ˜„์‹ const func = function(){} X ์‹คํ–‰ ์‹œ ๊ฒฐ์ • ๋ณ€์ˆ˜ ๊ธฐ์ค€
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ const func = () => {} X ์ƒ์œ„ ์Šค์ฝ”ํ”„ arguments ์—†์Œ
IIFE (function(){})() X ์ฆ‰์‹œ ์‹คํ–‰ ์Šค์ฝ”ํ”„ ๋ณดํ˜ธ

๐Ÿ“‹ ํ•ต์‹ฌ ๊ฐœ๋… ์š”์•ฝ

๊ฐœ๋… ์ •์˜ ์‹ค๋ฌด ํ™œ์šฉ
ํด๋กœ์ € ์™ธ๋ถ€ ์Šค์ฝ”ํ”„ ๊ธฐ์–ต ์ƒํƒœ ์œ ์ง€, ๋ชจ๋“ˆ ํŒจํ„ด
์ฝœ๋ฐฑ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
๊ณ ์ฐจ ํ•จ์ˆ˜ ํ•จ์ˆ˜ ์ธ์ˆ˜/๋ฐ˜ํ™˜ map, filter ๋“ฑ
this ํ˜ธ์ถœ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด ๋ฉ”์„œ๋“œ, ์ด๋ฒคํŠธ

๐Ÿš€ 8๏ธโƒฃ ์ถ”๊ฐ€ ์‹ฌํ™” ํ™•์žฅ ๊ฐ€๋Šฅ

  1. call, apply, bind๋กœ this ๋ฐ”์ธ๋”ฉ ๊ฐ•์ œ ์ œ์–ด
  2. ํด๋กœ์ € ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ ํŒจํ„ด ์‹ค๋ฌด ์˜ˆ์ œ
  3. ๊ณ ์ฐจ ํ•จ์ˆ˜ ์‹ฌํ™” (์ปค์Šคํ…€ filter, reduce ์ง์ ‘ ๊ตฌํ˜„)
  4. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ Best Practice

๐Ÿ“š ํ•จ์ˆ˜ 1

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>JavaScript Function Masterclass ๐Ÿš€</title>
  <style>
    div {
      border: 1px solid black;
      padding: 10px;
      margin: 10px 0;
    }
    button {
      margin: 5px;
    }
  </style>
</head>

<body>

  <h1>โœจ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ โœจ</h1>

  <!-- ==================== 1. ์„ ์–ธ์  ํ•จ์ˆ˜ ==================== -->
  <h2>๐Ÿ“Œ 1. ์„ ์–ธ์  ํ•จ์ˆ˜ (Declarative Function)</h2>
  <p>โœ… ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐฉ๋ฒ• (ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ)</p>
  <button onclick="basicFunction()">์„ ์–ธ์  ํ•จ์ˆ˜ ์‹คํ–‰</button>
  <div id="area1"></div>

  <script>
    // ๐ŸŸข ์„ ์–ธ์  ํ•จ์ˆ˜ (ํ˜ธ์ถœ ๊ฐ€๋Šฅ: ํ˜ธ์ด์ŠคํŒ… ๋จ)
    function basicFunction() {
      document.getElementById("area1").innerHTML += "โœ… ์„ ์–ธ์  ํ•จ์ˆ˜ ํ˜ธ์ถœ๋จ!<br>";
    }
  </script>

  <!-- ==================== 2. ํ•จ์ˆ˜ ํ‘œํ˜„์‹ (์ต๋ช… ํ•จ์ˆ˜ ํฌํ•จ) ==================== -->
  <h2>๐Ÿ“Œ 2. ํ•จ์ˆ˜ ํ‘œํ˜„์‹ & ์ต๋ช… ํ•จ์ˆ˜ (Function Expression)</h2>
  <p>ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น! ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ด๋ฆ„ ์—†์ด ๋Œ€์ž…๋จ</p>
  <button onclick="anonFunc()">์ต๋ช… ํ•จ์ˆ˜ ์‹คํ–‰</button>
  <div id="area2"></div>

  <script>
    // ๐ŸŸข ํ•จ์ˆ˜ ํ‘œํ˜„์‹ (ํ˜ธ์ด์ŠคํŒ… ์•ˆ๋จ)
    const anonFunc = function () {
      document.getElementById("area2").innerHTML += "โœ… ์ต๋ช… ํ•จ์ˆ˜ ์‹คํ–‰๋จ (๋ณ€์ˆ˜์— ๋Œ€์ž…)<br>";
    };
  </script>

  <!-- ==================== 3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ==================== -->
  <h2>๐Ÿ“Œ 3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (Arrow Function) ๐Ÿ”ฅ</h2>
  <p>๋” ์งง๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ, this ๋ฐ”์ธ๋”ฉ ์—†์Œ!</p>
  <button onclick="arrowFunc()">ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‹คํ–‰</button>
  <div id="area3"></div>

  <script>
    // ๐ŸŸข ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
    const arrowFunc = () => {
      document.getElementById("area3").innerHTML += "โœ… ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‹คํ–‰๋จ!<br>";
    };
  </script>

  <!-- ==================== 4. ๋งค๊ฐœ๋ณ€์ˆ˜ & ๊ธฐ๋ณธ๊ฐ’ ==================== -->
  <h2>๐Ÿ“Œ 4. ๋งค๊ฐœ๋ณ€์ˆ˜ & ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •</h2>
  <button onclick="paramFunc('Hi ๐Ÿ™‹โ€โ™‚๏ธ')">๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ</button>
  <button onclick="paramFunc()">๊ธฐ๋ณธ๊ฐ’ ํ™•์ธ</button>
  <div id="area4"></div>

  <script>
    // ๐ŸŸข ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ธฐ๋ณธ๊ฐ’
    function paramFunc(msg = "๐Ÿ‘‹ ๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€!") {
      document.getElementById("area4").innerHTML += `โžก๏ธ ${msg}<br>`;
    }
  </script>

  <!-- ==================== 5. ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ & arguments ==================== -->
  <h2>๐Ÿ“Œ 5. ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ (...rest) & arguments</h2>
  <button onclick="restExample(1, 2, 3, 4, 5)">๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜</button>
  <button onclick="argExample('A', 'B', 'C')">arguments ์‚ฌ์šฉ</button>
  <div id="area5"></div>

  <script>
    // ๐ŸŸข ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜
    function restExample(...nums) {
      document.getElementById("area5").innerHTML += `๋ฐ›์€ ๊ฐ’๋“ค: ${nums.join(", ")}<br>`;
    }

    // ๐ŸŸข arguments (์˜›๋‚  ๋ฐฉ์‹)
    function argExample() {
      let result = "";
      for (let i = 0; i < arguments.length; i++) {
        result += arguments[i] + " ";
      }
      document.getElementById("area5").innerHTML += `arguments๋กœ ๋ฐ›์€ ๊ฐ’: ${result}<br>`;
    }
  </script>

  <!-- ==================== 6. ๋ฐ˜ํ™˜๊ฐ’ ==================== -->
  <h2>๐Ÿ“Œ 6. ๋ฐ˜ํ™˜๊ฐ’ (return)</h2>
  <button onclick="showSum()">๋ฐ˜ํ™˜๊ฐ’ ํ™•์ธ</button>
  <div id="area6"></div>

  <script>
    function sum(a, b) {
      return a + b; // ๐Ÿ’ก ๋‹จ์ˆœ ๋”ํ•˜๊ธฐ
    }
    function showSum() {
      const result = sum(7, 8);
      document.getElementById("area6").innerHTML += `7 + 8 = ${result}<br>`;
    }
  </script>

  <!-- ==================== 7. ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ==================== -->
  <h2>๐Ÿ“Œ 7. ํ•จ์ˆ˜๊ฐ€ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ (๊ณ ์ฐจ ํ•จ์ˆ˜ ๊ฐœ๋…)</h2>
  <button onclick="returnFunc()">ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹คํ–‰</button>
  <div id="area7"></div>

  <script>
    function outer() {
      return function inner() {
        document.getElementById("area7").innerHTML += "โœ… ๋‚ด๋ถ€ ํ•จ์ˆ˜ ์‹คํ–‰๋จ!<br>";
      };
    }
    function returnFunc() {
      const inner = outer();
      inner();
    }
  </script>

  <!-- ==================== 8. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ==================== -->
  <h2>๐Ÿ“Œ 8. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ (Callback Function)</h2>
  <button onclick="useCallback()">์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰</button>
  <div id="area8"></div>

  <script>
    function greet(name, callback) {
      const msg = `๐Ÿ‘‹ Hello, ${name}!`;
      callback(msg); // ์ฝœ๋ฐฑ ํ˜ธ์ถœ
    }
    function display(msg) {
      document.getElementById("area8").innerHTML += `${msg}<br>`;
    }
    function useCallback() {
      greet("Bob", display);
    }
  </script>

  <!-- ==================== 9. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ (IIFE) ==================== -->
  <h2>๐Ÿ“Œ 9. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ (IIFE)</h2>
  <div id="area9"></div>

  <script>
    (function () {
      document.getElementById("area9").innerHTML += "โœ… ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ์‹คํ–‰๋จ!<br>";
    })();
  </script>

  <!-- ==================== 10. ํด๋กœ์ € (Closure) ์ถ”๊ฐ€ ==================== -->
  <h2>๐Ÿ“Œ 10. ํด๋กœ์ € (Closure) - ์‹ฌํ™”</h2>
  <button onclick="closureExample()">ํด๋กœ์ € ์‹คํ–‰</button>
  <div id="area10"></div>

  <script>
    function makeCounter() {
      let count = 0; // ๐Ÿšฉ ์™ธ๋ถ€ ๋ณ€์ˆ˜
      return function () {
        count++;
        document.getElementById("area10").innerHTML += `ํ˜„์žฌ ์นด์šดํŠธ: ${count}<br>`;
      };
    }
    const closureExample = makeCounter(); // ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๊ฐ€ count ๊ธฐ์–ต
  </script>

  <!-- ==================== 11. ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursion) ์ถ”๊ฐ€ ==================== -->
  <h2>๐Ÿ“Œ 11. ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursion) - ์‹ฌํ™”</h2>
  <button onclick="factorialResult()">ํŒฉํ† ๋ฆฌ์–ผ ๊ณ„์‚ฐ</button>
  <div id="area11"></div>

  <script>
    function factorial(n) {
      if (n === 1) return 1;
      return n * factorial(n - 1); // ์ž๊ธฐ ์ž์‹  ํ˜ธ์ถœ
    }
    function factorialResult() {
      const result = factorial(5);
      document.getElementById("area11").innerHTML += `5! = ${result}<br>`;
    }
  </script>

      <!-- ๐ŸŽฏ [์‹ฌํ™”] this ์ปจํ…์ŠคํŠธ + ํ•จ์ˆ˜ ํ‘œํ˜„์‹ vs ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋น„๊ต -->
      <h3>๐Ÿงญ this ์ปจํ…์ŠคํŠธ ์ดํ•ดํ•˜๊ธฐ: ํ•จ์ˆ˜ ํ‘œํ˜„์‹ vs ํ™”์‚ดํ‘œ ํ•จ์ˆ˜</h3>
      <button onclick="testThis()">this ํ…Œ์ŠคํŠธ ์‹คํ–‰</button>
      <div id="quiz4"></div>
  
      <script>
          const obj = {
              name: "MyObject",
              // ํ•จ์ˆ˜ ํ‘œํ˜„์‹: this๋Š” obj๋ฅผ ๊ฐ€๋ฆฌํ‚ด
              showNameFunc: function () {
                  return `ํ•จ์ˆ˜ ํ‘œํ˜„์‹: ${this.name}`;
              },
              // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜: this๋Š” window (์ „์—ญ)
              showNameArrow: () => {
                  return `ํ™”์‚ดํ‘œ ํ•จ์ˆ˜: ${this.name}`; // ์ „์—ญ์— name ์—†์Œ(undefined)
              }
          };
  
          function testThis() {
              let text = obj.showNameFunc() + "<br>" + obj.showNameArrow();
              document.getElementById("quiz4").innerHTML = text;
          }
      </script>

</body>
</html>

๐Ÿ“š ๋ฐฐ์—ด

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ ์™„๋ฒฝ ์ •๋ฆฌ ๐Ÿ€</title>
  <style>
    .area {
      border: 1px solid #ccc;
      padding: 10px;
      margin: 10px 0;
      background-color: #f9f9f9;
    }
  </style>
</head>

<body>
  <h2>๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ ์™„๋ฒฝ ์ •๋ฆฌ</h2>

  <!-- โœ… concat -->
  <h3>1๏ธโƒฃ ๋ฐฐ์—ด.concat()</h3>
  <div id="area1" class="area"></div>
  <button onclick="concatTest()">concat ํ™•์ธํ•˜๊ธฐ</button>

  <!-- โœ… reverse -->
  <h3>2๏ธโƒฃ ๋ฐฐ์—ด.reverse()</h3>
  <div id="area2" class="area"></div>
  <button onclick="reverseTest()">reverse ํ™•์ธํ•˜๊ธฐ</button>

  <!-- โœ… sort -->
  <h3>3๏ธโƒฃ ๋ฐฐ์—ด.sort()</h3>
  <div id="area3" class="area"></div>
  <button onclick="sortTest()">sort ํ™•์ธํ•˜๊ธฐ</button>

  <!-- โœ… push & pop -->
  <h3>4๏ธโƒฃ ๋ฐฐ์—ด.push() & pop()</h3>
  <div id="area4" class="area"></div>
  <button onclick="pushPopTest()">push/pop ํ™•์ธํ•˜๊ธฐ</button>

  <!-- โœ… unshift & shift -->
  <h3>5๏ธโƒฃ ๋ฐฐ์—ด.unshift() & shift()</h3>
  <div id="area5" class="area"></div>
  <button onclick="shiftUnshiftTest()">unshift/shift ํ™•์ธํ•˜๊ธฐ</button>

  <script>
    // ============================
    // 1๏ธโƒฃ concat() ๊ธฐ์ดˆ ~ ์‹ฌํ™”
    // ============================
    function concatTest() {
      const area1 = document.querySelector("#area1");
      const arr1 = ["๐ŸŽ์‚ฌ๊ณผ", "๐ŸŒ๋ฐ”๋‚˜๋‚˜"];
      const arr2 = ["๐Ÿง€์น˜์ฆˆ", "๐Ÿฅ“๋ฒ ์ด์ปจ", "๐Ÿ๏ธ์˜คํ† ๋ฐ”์ด"];

      area1.innerHTML = "โœ… arr1 : " + JSON.stringify(arr1) + "<br>";
      area1.innerHTML += "โœ… arr2 : " + JSON.stringify(arr2) + "<br><br>";

      const combined = arr1.concat(arr2);
      area1.innerHTML += "๐Ÿ‘‰ arr1.concat(arr2) : " + JSON.stringify(combined) + "<br>";

      area1.innerHTML += "๐Ÿ”Ž arr1 (์›๋ณธ ์œ ์ง€) : " + JSON.stringify(arr1) + "<br><br>";

      const reverseCombined = arr2.concat(arr1);
      area1.innerHTML += "๐Ÿ‘‰ arr2.concat(arr1) : " + JSON.stringify(reverseCombined) + "<br><br>";

      const multiCombined = arr2.concat(arr1, ["๐ŸŽฎ๊ฒŒ์ž„๊ธฐ", "๐Ÿ“ฑ์Šค๋งˆํŠธํฐ"]);
      area1.innerHTML += "๐Ÿ‘‰ arr2.concat(arr1, ์ถ”๊ฐ€๋ฐฐ์—ด) : " + JSON.stringify(multiCombined) + "<br><br>";

      const nestedArr = [[1, 2], [3, 4]];
      const flat = arr1.concat(nestedArr);
      area1.innerHTML += "โš ๏ธ ์ค‘์ฒฉ ๋ฐฐ์—ด : " + JSON.stringify(flat) + "<br>";
      area1.innerHTML += "โ— ์ค‘์ฒฉ๋œ ๋ฐฐ์—ด์€ ํ‰ํƒ„ํ™” ์•ˆ๋จ (flat ์•„๋‹˜!)<br>";
    }

    // ============================
    // 2๏ธโƒฃ reverse() ๊ธฐ์ดˆ ~ ์‹ฌํ™”
    // ============================
    function reverseTest() {
      const area2 = document.querySelector("#area2");
      const arr = [1, 2, 3, 4, 5];
      area2.innerHTML = "โœ… ์›๋ณธ arr : " + JSON.stringify(arr) + "<br>";

      const reversed = arr.reverse();
      area2.innerHTML += "๐Ÿ‘‰ reverse() ํ›„ arr : " + JSON.stringify(reversed) + "<br><br>";

      area2.innerHTML += "โš ๏ธ ๋‹ค์‹œ arr ์ถœ๋ ฅ : " + JSON.stringify(arr) + "<br>";

      const str = "Hello World!";
      const reversedStr = str.split("").reverse().join("");
      area2.innerHTML += "๐ŸŽฏ ๋ฌธ์ž์—ด ๋’ค์ง‘๊ธฐ : " + reversedStr + "<br>";
    }

    // ============================
    // 3๏ธโƒฃ sort() ๊ธฐ์ดˆ ~ ์‹ฌํ™”
    // ============================
    function sortTest() {
      const area3 = document.querySelector("#area3");
      const names = ["๋ฌธ๊ทผ์˜", "๊น€์‚ฟ๊ฐ“", "์ด๋ชฝ๋ฃก", "ํ™๊ธธ๋™", "๊น€์‚ฟ๊ฐ“"];
      area3.innerHTML = "โœ… ์›๋ณธ names : " + JSON.stringify(names) + "<br>";

      names.reverse();
      area3.innerHTML += "๐Ÿ‘‰ reverse ํ›„ : " + JSON.stringify(names) + "<br>";

      names.sort();
      area3.innerHTML += "๐Ÿ”ค sort() ์˜ค๋ฆ„์ฐจ์ˆœ : " + JSON.stringify(names) + "<br>";

      names.sort().reverse();
      area3.innerHTML += "๐Ÿ”ฝ sort() + reverse() ๋‚ด๋ฆผ์ฐจ์ˆœ : " + JSON.stringify(names) + "<br><br>";

      const numbers = [100, 25, 3, 56, 789, 12];
      area3.innerHTML += "โœ… ์ˆซ์ž ๋ฐฐ์—ด : " + JSON.stringify(numbers) + "<br>";
      numbers.sort();
      area3.innerHTML += "โš ๏ธ ์ž˜๋ชป๋œ sort ๊ฒฐ๊ณผ : " + JSON.stringify(numbers) + "<br>";

      numbers.sort((a, b) => a - b);
      area3.innerHTML += "โœ”๏ธ ์ˆซ์ž ์˜ค๋ฆ„์ฐจ์ˆœ : " + JSON.stringify(numbers) + "<br>";

      numbers.sort((a, b) => b - a);
      area3.innerHTML += "โœ”๏ธ ์ˆซ์ž ๋‚ด๋ฆผ์ฐจ์ˆœ : " + JSON.stringify(numbers) + "<br><br>";

      const students = [
        { name: "ํ™๊ธธ๋™", score: 85 },
        { name: "์ด๋ชฝ๋ฃก", score: 95 },
        { name: "์„ฑ์ถ˜ํ–ฅ", score: 75 },
      ];
      area3.innerHTML += "โœ… ํ•™์ƒ ์ ์ˆ˜ ๋ฐฐ์—ด : " + JSON.stringify(students) + "<br>";

      students.sort((a, b) => a.score - b.score);
      area3.innerHTML += "๐Ÿ“Š ์ ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ : " + JSON.stringify(students) + "<br>";

      students.sort((a, b) => b.score - a.score);
      area3.innerHTML += "๐Ÿ“Š ์ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ : " + JSON.stringify(students) + "<br>";
    }

    // ============================
    // 4๏ธโƒฃ push() & pop() ๊ธฐ์ดˆ ~ ์‹ฌํ™”
    // ============================
    function pushPopTest() {
      const area4 = document.querySelector("#area4");
      const arr = ["์„œ์ดˆ๋™", "์šฐ์‚ฐ์‚ฐ๋™", "์—ฐ์‹ ๋™", "๊ฐ€์‚ฐ๋™", "๋น…๋ฒ ๋†ˆ"];

      area4.innerHTML = "โœ… ์ดˆ๊ธฐ arr : " + JSON.stringify(arr) + "<br>";

      // push ์‚ฌ์šฉ (๋งจ ๋์— ์ถ”๊ฐ€)
      const pushResult = arr.push("์‹ ๋„๋ฆผ๋™");
      area4.innerHTML += `๐Ÿ‘‰ arr.push("์‹ ๋„๋ฆผ๋™") ํ›„ : ${JSON.stringify(arr)} (์ƒˆ ๊ธธ์ด: ${pushResult})<br>`;

      arr.push("๋ฏธ์•„๋™");
      area4.innerHTML += `๐Ÿ‘‰ arr.push("๋ฏธ์•„๋™") ํ›„ : ${JSON.stringify(arr)}<br>`;

      // pop ์‚ฌ์šฉ (๋งจ ๋ ์‚ญ์ œ)
      const popped1 = arr.pop();
      area4.innerHTML += `โŒ arr.pop() ํ›„ (์‚ญ์ œ๋œ ๊ฐ’: ${popped1}) : ${JSON.stringify(arr)}<br>`;

      const popped2 = arr.pop();
      area4.innerHTML += `โŒ arr.pop() ํ›„ (์‚ญ์ œ๋œ ๊ฐ’: ${popped2}) : ${JSON.stringify(arr)}<br>`;

      // ์ตœ์ข… ๊ฒฐ๊ณผ
      area4.innerHTML += "โœ… ์ตœ์ข… arr : " + JSON.stringify(arr) + "<br>";
    }

    // ============================
    // 5๏ธโƒฃ unshift() & shift() ๊ธฐ์ดˆ ~ ์‹ฌํ™”
    // ============================
    function shiftUnshiftTest() {
      const area5 = document.querySelector("#area5");
      const arr = ["๋†๊ตฌ", "์•ผ๊ตฌ", "๊ณจํ”„", "ํ…Œ๋‹ˆ์Šค"];

      area5.innerHTML = "โœ… ์ดˆ๊ธฐ arr : " + JSON.stringify(arr) + "<br><br>";

      // unshift() - ๋งจ ์•ž์— ์ถ”๊ฐ€
      const unshiftLength = arr.unshift("ํƒ๊ตฌ");
      area5.innerHTML += `๐Ÿ‘‰ arr.unshift("ํƒ๊ตฌ") ํ›„ : ${JSON.stringify(arr)} (์ƒˆ ๊ธธ์ด: ${unshiftLength})<br>`;

      arr.unshift("๋ฐฐ๋“œ๋ฏผํ„ด");
      area5.innerHTML += `๐Ÿ‘‰ arr.unshift("๋ฐฐ๋“œ๋ฏผํ„ด") ํ›„ : ${JSON.stringify(arr)}<br><br>`;

      // shift() - ๋งจ ์•ž ์‚ญ์ œ
      const shifted1 = arr.shift();
      area5.innerHTML += `โŒ arr.shift() ํ›„ (์‚ญ์ œ๋œ ๊ฐ’: ${shifted1}) : ${JSON.stringify(arr)}<br>`;

      const shifted2 = arr.shift();
      area5.innerHTML += `โŒ arr.shift() ํ›„ (์‚ญ์ œ๋œ ๊ฐ’: ${shifted2}) : ${JSON.stringify(arr)}<br><br>`;

      area5.innerHTML += "โœ… ์ตœ์ข… arr : " + JSON.stringify(arr) + "<br>";
    }
  </script>

<h3>6๏ธโƒฃ ๋ฐฐ์—ด.slice() & splice()</h3>
<div id="area6" class="area"></div>
<button onclick="sliceSpliceTest()">slice/splice ํ™•์ธํ•˜๊ธฐ</button>

<script>
  // ============================
  // 6๏ธโƒฃ slice() & splice() ๊ธฐ์ดˆ ~ ์‹ฌํ™”
  // ============================
  function sliceSpliceTest() {
    const area6 = document.querySelector("#area6");
    const arr = ["Java", "Oracle", "HTML", "CSS", "JavaScript"];

    area6.innerHTML = "โœ… ์ดˆ๊ธฐ arr : " + JSON.stringify(arr) + "<br><br>";

    // -----------------------------
    // ๐Ÿ“Œ slice()
    // -----------------------------
    const sliced = arr.slice(1, 4); // index 1๋ถ€ํ„ฐ index 4 ์ง์ „๊นŒ์ง€
    area6.innerHTML += "๐Ÿ”น arr.slice(1, 4) ๊ฒฐ๊ณผ : " + JSON.stringify(sliced) + "<br>";
    area6.innerHTML += "โš ๏ธ slice ํ›„ ์›๋ณธ arr : " + JSON.stringify(arr) + "<br><br>";

    // ์Œ์ˆ˜ ์ธ๋ฑ์Šค๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    const slicedNegative = arr.slice(-3);
    area6.innerHTML += "๐Ÿ”น arr.slice(-3) ๊ฒฐ๊ณผ : " + JSON.stringify(slicedNegative) + "<br>";
    area6.innerHTML += "โš ๏ธ slice๋Š” ์›๋ณธ ์œ ์ง€๋จ<br><br>";

    // -----------------------------
    // ๐Ÿ“Œ splice()
    // -----------------------------
    const arrCopy = [...arr]; // ์›๋ณธ ๋ณด์กด ์œ„ํ•ด ๋ณต์‚ฌ
    const spliced = arrCopy.splice(2, 2, "Spring", "MyBatis"); // index 2๋ถ€ํ„ฐ 2๊ฐœ ์‚ญ์ œ ํ›„ ์ƒˆ ์š”์†Œ ์ถ”๊ฐ€
    area6.innerHTML += "๐Ÿ”ธ arr.splice(2, 2, 'Spring', 'MyBatis') ๊ฒฐ๊ณผ : " + JSON.stringify(spliced) + "<br>";
    area6.innerHTML += "โœ… splice ํ›„ ๋ณ€๊ฒฝ๋œ arr : " + JSON.stringify(arrCopy) + "<br><br>";

    // ์š”์†Œ ์‚ญ์ œ๋งŒ
    const arrCopy2 = [...arr];
    const removed = arrCopy2.splice(1, 3);
    area6.innerHTML += "๐Ÿ”ธ arr.splice(1, 3) ์‚ญ์ œ๋œ ์š”์†Œ : " + JSON.stringify(removed) + "<br>";
    area6.innerHTML += "โœ… ์‚ญ์ œ ํ›„ arr : " + JSON.stringify(arrCopy2) + "<br><br>";

    // ์š”์†Œ ์‚ฝ์ž…๋งŒ
    const arrCopy3 = [...arr];
    arrCopy3.splice(2, 0, "Python", "Django");
    area6.innerHTML += "๐Ÿ”ธ arr.splice(2, 0, 'Python', 'Django') ์‚ฝ์ž… ํ›„ arr : " + JSON.stringify(arrCopy3) + "<br>";
    area6.innerHTML += "โš ๏ธ splice๋Š” ์›๋ณธ ๋ฐฐ์—ด ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•จ<br>";
  }
</script>

</body>

</html>