πŸ’» FE/πŸ“ JS

"ν•¨μˆ˜λŠ” 객체닀"

Roy Miller 2025. 5. 13. 22:09

  1. ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ„€λͺ…: 일반 객체처럼 ν•¨μˆ˜μ—λ„ ν‚€-κ°’ 쌍의 ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ λ‚΄μž₯된 ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: ν•¨μˆ˜.ν”„λ‘œνΌν‹°λͺ… = κ°’; λ˜λŠ” ν•¨μˆ˜.λ©”μ„œλ“œλͺ…();
    • μ˜ˆμ‹œ:
      function sayHello() {
        console.log("Hello!");
      }
      sayHello.description = "인사λ₯Ό ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€."; // μ»€μŠ€ν…€ ν”„λ‘œνΌν‹° μΆ”κ°€
      console.log(sayHello.description); // "인사λ₯Ό ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€."
      console.log(sayHello.name); // "sayHello" (λ‚΄μž₯ ν”„λ‘œνΌν‹°: ν•¨μˆ˜ 이름)
      console.log(sayHello.length); // 0 (λ‚΄μž₯ ν”„λ‘œνΌν‹°: κΈ°λŒ€ν•˜λŠ” 인자의 수)
      
      const numbers = [1, 2, 3];
      // forEachλŠ” Array.prototype의 λ©”μ„œλ“œμ§€λ§Œ, ν•¨μˆ˜ ν˜•νƒœλ‘œ 쑴재
      numbers.forEach(function printNum(num) { // 읡λͺ… ν•¨μˆ˜μ§€λ§Œ, 엔진은 이름을 뢙일 수 있음
        console.log(num, printNum.name); // num, "printNum" (콜백 ν•¨μˆ˜μ˜ 이름)
      });
      
  2. λ³€μˆ˜μ— 할당될 수 μžˆμŠ΅λ‹ˆλ‹€ (일급 객체, First-class citizen).
    • μ„€λͺ…: ν•¨μˆ˜λŠ” κ°’(value)으둜 μ·¨κΈ‰λ˜μ–΄ λ³€μˆ˜μ— μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ 곳으둜 μ‰½κ²Œ μ „λ‹¬ν•˜κ±°λ‚˜ μž¬μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: const λ³€μˆ˜λͺ… = ν•¨μˆ˜;
    • μ˜ˆμ‹œ:
      const greet = function(name) {
        return `Hello, ${name}!`;
      };
      console.log(greet("World")); // "Hello, World!"
      
      const anotherGreet = greet; // λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ή
      console.log(anotherGreet("JavaScript")); // "Hello, JavaScript!"
      
  3. λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 전달될 수 μžˆμŠ΅λ‹ˆλ‹€ (콜백 ν•¨μˆ˜).
    • μ„€λͺ…: ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨, νŠΉμ • μž‘μ—…μ΄ μ™„λ£Œλœ ν›„ λ˜λŠ” νŠΉμ • μ‘°κ±΄μ—μ„œ ν˜ΈμΆœλ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이게 λ°”λ‘œ 콜백 ν•¨μˆ˜μ˜ μ›λ¦¬μž…λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: λ‹€λ₯Έν•¨μˆ˜(function() { /* 콜백 둜직 */ });
    • μ˜ˆμ‹œ:
      function processUserInput(callback) {
        const name = "Lando Norris"; // μ‚¬μš©μž μž…λ ₯이라고 κ°€μ •
        callback(name);
      }
      
      processUserInput(function(name) { // ν•¨μˆ˜λ₯Ό 인자둜 전달
        console.log(`μ•ˆλ…•ν•˜μ„Έμš”, ${name}λ‹˜!`); // "μ•ˆλ…•ν•˜μ„Έμš”, Lando Norrisλ‹˜!"
      });
      
      const numbers = [1, 2, 3, 4];
      const evenNumbers = numbers.filter(function(num) { // filter λ©”μ„œλ“œμ— ν•¨μˆ˜ 전달
        return num % 2 === 0;
      });
      console.log(evenNumbers); // [2, 4]
      
  4. λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€ (κ³ μ°¨ ν•¨μˆ˜, ν΄λ‘œμ €).
    • μ„€λͺ…: ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜κ³  κ·Έ ν•¨μˆ˜λ₯Ό κ²°κ³Όκ°’μœΌλ‘œ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν΄λ‘œμ €(closure)와 같은 κ°•λ ₯ν•œ νŒ¨ν„΄μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: function μ™ΈλΆ€ν•¨μˆ˜() { return function λ‚΄λΆ€ν•¨μˆ˜() { /* 둜직 */ }; }
    • μ˜ˆμ‹œ:
      function createGreeter(greeting) {
        return function(name) { // ν•¨μˆ˜λ₯Ό λ°˜ν™˜
          return `${greeting}, ${name}!`;
        };
      }
      
      const sayHelloTo = createGreeter("Hello");
      const sayHiTo = createGreeter("Hi");
      
      console.log(sayHelloTo("Max")); // "Hello, Max!"
      console.log(sayHiTo("Charles")); // "Hi, Charles!"
      
  5. λ°°μ—΄μ΄λ‚˜ 객체와 같은 μžλ£Œκ΅¬μ‘°μ— μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ„€λͺ…: ν•¨μˆ˜λ„ 값이기 λ•Œλ¬Έμ—, λ°°μ—΄μ˜ μš”μ†Œλ‚˜ 객체의 속성 κ°’μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: const arr = [ν•¨μˆ˜1, ν•¨μˆ˜2]; λ˜λŠ” const obj = { doSomething: ν•¨μˆ˜ };
    • μ˜ˆμ‹œ:
      function add(a, b) { return a + b; }
      function subtract(a, b) { return a - b; }
      
      const operations = [add, subtract];
      console.log(operations[0](10, 5)); // 15 (add ν•¨μˆ˜ 호좜)
      console.log(operations[1](10, 5)); // 5  (subtract ν•¨μˆ˜ 호좜)
      
      const calculator = {
        plus: add,
        minus: subtract
      };
      console.log(calculator.plus(20, 7)); // 27
      
  6. prototype ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
    • μ„€λͺ…: ν•¨μˆ˜κ°€ μ •μ˜λ  λ•Œ, ν•΄λ‹Ή ν•¨μˆ˜λŠ” prototypeμ΄λΌλŠ” νŠΉλ³„ν•œ 객체 ν”„λ‘œνΌν‹°λ₯Ό κ°–κ²Œ λ©λ‹ˆλ‹€ (ν™”μ‚΄ν‘œ ν•¨μˆ˜ μ œμ™Έ). 이 prototype κ°μ²΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μƒμ„±μž(constructor)둜 μ‚¬μš©ν–ˆμ„ λ•Œ μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€ κ°μ²΄λ“€μ˜ λΆ€λͺ¨ 역할을 ν•˜λ©°, ν”„λ‘œν† νƒ€μž… 기반 μƒμ†μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: ν•¨μˆ˜λͺ….prototype.λ©”μ„œλ“œλͺ… = function() { /* 둜직 */ };
    • μ˜ˆμ‹œ:
      function Car(brand) {
        this.brand = brand;
      }
      
      // Car ν•¨μˆ˜μ˜ prototype 객체에 λ©”μ„œλ“œ μΆ”κ°€
      Car.prototype.getBrand = function() {
        return this.brand;
      };
      
      const myCar = new Car("McLaren"); // Carλ₯Ό μƒμ„±μžλ‘œ μ‚¬μš©
      console.log(myCar.getBrand()); // "McLaren"
      // myCarλŠ” Car.prototype에 μ •μ˜λœ λ©”μ„œλ“œλ₯Ό 상속받아 μ‚¬μš© κ°€λŠ₯
      
  7. μƒμ„±μž ν•¨μˆ˜(Constructor Function)둜 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€ (new ν‚€μ›Œλ“œμ™€ ν•¨κ»˜).
    • μ„€λͺ…: new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, κ·Έ ν•¨μˆ˜λŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” μƒμ„±μž 역할을 ν•©λ‹ˆλ‹€. μ΄λ•Œ ν•¨μˆ˜ λ‚΄λΆ€μ˜ thisλŠ” μƒˆλ‘œ μƒμ„±λœ 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: const μΈμŠ€ν„΄μŠ€ = new ν•¨μˆ˜λͺ…(인자);
    • μ˜ˆμ‹œ: (μœ„ 6번 Car μ˜ˆμ‹œ μ°Έκ³ )
  8. call(), apply(), bind() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ„€λͺ…: λͺ¨λ“  ν•¨μˆ˜λŠ” Function.prototypeμœΌλ‘œλΆ€ν„° 이 λ©”μ„œλ“œλ“€μ„ μƒμ†λ°›μŠ΅λ‹ˆλ‹€. 이 λ©”μ„œλ“œλ“€μ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ this 값을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•˜κ±°λ‚˜, 인자λ₯Ό νŠΉμ • λ°©μ‹μœΌλ‘œ 전달할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄:
      • ν•¨μˆ˜.call(thisArg, arg1, arg2, ...)
      • ν•¨μˆ˜.apply(thisArg, [arg1, arg2, ...])
      • const λ°”μΈλ”©λœν•¨μˆ˜ = ν•¨μˆ˜.bind(thisArg, arg1, ...);
    • μ˜ˆμ‹œ:
      function introduce(greeting, punctuation) {
        console.log(`${greeting}, my name is <span class="math-inline">\{this\.name\}</span>{punctuation}`);
      }
      
      const person1 = { name: "Lando" };
      const person2 = { name: "Oscar" };
      
      introduce.call(person1, "Hello", "!"); // Hello, my name is Lando!
      introduce.apply(person2, ["Hi", "."]);   // Hi, my name is Oscar.
      
      const introduceLando = introduce.bind(person1, "Hey there");
      introduceLando("!!"); // Hey there, my name is Lando!!
      
  9. Function μƒμ„±μžλ₯Ό 톡해 λ™μ μœΌλ‘œ ν•¨μˆ˜λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€ (ꢌμž₯λ˜μ§„ μ•ŠμŒ).
    • μ„€λͺ…: new Function(...) 문법을 μ‚¬μš©ν•˜λ©΄ λ¬Έμžμ—΄λ‘œλΆ€ν„° ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•¨μˆ˜κ°€ 객체처럼 '생성'될 수 μžˆμŒμ„ λ³΄μ—¬μ£Όμ§€λ§Œ, λ³΄μ•ˆ 및 μ„±λŠ₯ 문제둜 잘 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: const ν•¨μˆ˜λͺ… = new Function('인자1', '인자2', 'ν•¨μˆ˜ λ³Έλ¬Έ');
    • μ˜ˆμ‹œ:
      const sum = new Function('a', 'b', 'return a + b;');
      console.log(sum(5, 10)); // 15
      
  10. 호좜 κ°€λŠ₯ν•˜λ‹€(Callable)!
    • μ„€λͺ…: 객체이긴 ν•˜μ§€λ§Œ, νŠΉλ³„νžˆ () μ—°μ‚°μžλ₯Ό 톡해 싀행될 수 μžˆλŠ” κ³ μœ ν•œ νŠΉμ§•μ„ κ°€μ§‘λ‹ˆλ‹€. 이것이 ν•¨μˆ˜ 객체λ₯Ό λ‹€λ₯Έ 일반 객체와 ꡬ뢄 μ§“λŠ” κ°€μž₯ 큰 μ°¨μ΄μ μž…λ‹ˆλ‹€.
    • 핡심 νŒ¨ν„΄: ν•¨μˆ˜λͺ…();
    • μ˜ˆμ‹œ:
      function uniqueAction() {
        console.log("I am callable!");
      }
      uniqueAction.isObject = true;
      
      console.log(typeof uniqueAction); // "function" (νŠΉλ³„ν•œ μ’…λ₯˜μ˜ 객체)
      console.log(uniqueAction.isObject); // true
      uniqueAction(); // "I am callable!"