λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🌌 | WEB DEV/Vanilla JS

JS_κΈ°λ³Έ 문법 (21)_ 일급 객체

by KASSID 2023. 3. 11.

λͺ©μ°¨

    728x90

    JS의 일급 객체에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž!

     

    일급 객체 (First Class Object)

    ν•¨μˆ˜λ₯Ό λ³€μˆ˜λ‚˜ μƒμˆ˜μ˜ κ°’μ²˜λŸΌ λ‹€λ£° 수 μžˆλŠ” 언어에 μ‘΄μž¬ν•˜λŠ” κ°œλ…μ΄λ‹€.

    JS의 ν•¨μˆ˜λ„ 이에 μ†ν•œλ‹€. (JS의 ν•¨μˆ˜λŠ” 객체의 ν•œ μ’…λ₯˜μ΄λ‹€.)

     

    νŠΉμ§•

    1. μƒμˆ˜/λ³€μˆ˜μ— 할당될 수 μžˆλ‹€.

    2. λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 전달될 수 μžˆλ‹€.

    3. λ‹€λ₯Έ ν•¨μˆ˜μ˜ κ²°κ³Όκ°’μœΌλ‘œμ„œ λ°˜ν™˜λ  수 μžˆλ‹€.

     

     


    1. ν• λ‹Ή

    λ³€μˆ˜/μƒμˆ˜μ— ν•¨μˆ˜λͺ…을 μ‹λ³„μžλ‘œ λ„£μ–΄μ„œ ν• λ‹Ήμ‹œν‚¨λ‹€.

    μ΄λ•Œ μ£Όμ˜ν•  점은 κ΄„ν˜Έλ₯Ό 뢙이지 μ•ŠλŠ” 것이닀. (κ΄„ν˜Έλ₯Ό 뢙이면 ν•¨μˆ˜ μ‹€ν–‰ ν›„ λ°˜ν™˜ κ²°κ³Όλ₯Ό ν• λ‹Ήν•˜λŠ” 것)

     

    μ˜ˆμ‹œ 1)

    function isOdd (num) {
      console.log(
        (num % 2 ? '홀' : '짝')
        + '수'
      );
      return num % 2 ? true : false;
    };
    
    const checkOdd = isOdd; //ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•  λ•Œμ—λŠ” κ΄„ν˜Έλ₯Ό 뢙이지 μ•ŠλŠ”λ‹€!

     

    console.log(checkOdd(5));
    
    >>> ν™€μˆ˜
    >>> true

     

    μ˜ˆμ‹œ 2)

    ν™”μ‚΄ν‘œ ν•¨μˆ˜λ„ λ³€μˆ˜/μƒμˆ˜ ν• λ‹Ήμ˜ μ˜ˆμ‹œ 쀑 ν•˜λ‚˜μ΄λ‹€.

    let f1 = (a, b) => a + b;
    let f2 = (a, b) => a - b;
    
    console.log(f1(2, 1), f2(2, 1));
    
    >>> 3 1

     

    객체와 λ°°μ—΄μ˜ κ°’μœΌλ‘œλ„ ν• λ‹Ή κ°€λŠ₯

    (1) 객체의 ν”„λ‘œνΌν‹°μ— ν• λ‹Ή

    let npc1 = {
      name: '',
      job: '상점주인',
      msg: function(job){
          job ? 'μ–΄μ„œμ˜€μ‹œκ²Œ λͺ¨ν—˜μž! 무엇을 사싀텐가?' : 'μ–΄μ„œμ˜€μ‹œκ²Œ μ΄ˆμ‹¬μžμ—¬ 무엇을 사싀텐가?'
      }
    }

     

    console.log(npc1.msg(true));
    
    >>> μ–΄μ„œμ˜€μ‹œκ²Œ λͺ¨ν—˜μž! 무엇을 사싀텐가?
    console.log(npc1.msg(false));
    
    >>> μ–΄μ„œμ˜€μ‹œκ²Œ μ΄ˆμ‹¬μžμ—¬ 무엇을 사싀텐가?

     

    (2) λ°°μ—΄μ˜ μ›μ†Œλ‘œ ν• λ‹Ή

    let funcArr = [
      (a, b) => a + b,
      (a, b) => a - b,
      (a, b) => a * b,
      (a, b) => a / b,
    ];

     

    for (el of funcArr){
      console.log(el(4,2));
    }
    
    >>> 6
    >>> 2
    >>> 8
    >>> 2

     

    β€» 객체에 ν•¨μˆ˜ ν”„λ‘œνΌν‹°λ₯Ό ν¬ν•¨μ‹œν‚¬ λ•Œ μ£Όμ˜ν•  점!

    객체에 ν•¨μˆ˜ ν”„λ‘œνΌν‹°λ₯Ό ν¬ν•¨μ‹œν‚¬ λ•Œ, 객체 λ‚΄μ˜  λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ‘œμ˜ 접근이 ν•„μš”ν•œ κ²½μš°κ°€ μžˆλ‹€.

    이 λ•Œ this ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€.

    this ν‚€μ›Œλ“œ μ‚¬μš© μ‹œ ν˜„μž¬ μ†ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ 되고

    this.ν”„λ‘œνΌν‹°λͺ… 으둜 ν™œμš©ν•  수 μžˆλ‹€.

     

    μ΄λ•Œ 객체 λ¦¬ν„°λŸ΄μ˜ ν”„λ‘œνΌν‹°λ‘œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό ν¬ν•¨μ‹œν‚€λŠ” 경우 this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.

    μ΄λŠ” function으둜 μ •μ˜λœ ν•¨μˆ˜μ™€ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ 차이점이닀!

    μžμ„Έν•œ 것은 좔후에 닀루어 보자.

     

     

    2. 인자둜 전달

    ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 인자둜 받을 수 μžˆλ‹€.

     

    μ΄λ•Œ, μ „λ‹¬λ°›λŠ” ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜, μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λŠ” 콜백 ν•¨μˆ˜λΌκ³  ν•œλ‹€.

     

    μ˜ˆμ‹œ 1)

    let list = [1, 2, 3, 4];
    
    //κ³ μ°¨ν•¨μˆ˜(arrayFunc), μ½œλ°±ν•¨μˆ˜(func)
    function arrayFunc(arr, func){
      for (item of arr){
        func(item);
      }
    }
    
    arrayFunc(list, console.log); //console객체의 logλΌλŠ” 킀에 ν• λ‹Ήλœ ν•¨μˆ˜
    
    >>> 1
    >>> 2
    >>> 3
    >>> 4

    μœ„μ²˜λŸΌ ν•¨μˆ˜λ₯Ό 인자둜 전달 받을 수 μžˆλ‹€.

    λ˜ν•œ ν•¨μˆ˜λ₯Ό 인자둜 λ°›μ•˜μ„ λ•Œμ—λŠ” ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜ λͺ…μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

     

     

    μ˜ˆμ‹œ 2)

    //계산
    const add = (a, b) => a + b;
    const subtract = (a, b) => a - b;
    const multiply = (a, b) => a * b;
    const divide = (a, b) => a / b;
    
    //νŒλ³„
    const isOdd = (num) => !!(num % 2); //!!으둜 ν˜„μž¬ boolκ°’ λ°˜ν™˜
    const isPositive = (num) => num > 0;
    
    function calcAndEval (calc, eval, a, b){
      return eval(calc(a, b)); //calc의 λ°˜ν™˜ 값을 λ‹€μ‹œ 인자둜 λ°›μŒ
    }
    
    console.log(
      calcAndEval(add, isOdd, 3, 2),
      calcAndEval(subtract, isPositive, 2, 3),
      calcAndEval(multiply, isOdd, 3, 4),
      calcAndEval(divide, isPositive, 3, 2),
    );
    
    >>> true false false true

     

    ν•¨μˆ˜λ₯Ό 전달할 λ•Œ 읡λͺ…ν•¨μˆ˜λ„ μ΄μš©ν•  수 μžˆλ‹€.

     

     

    3. κ²°κ³Όκ°’μœΌλ‘œ λ°˜ν™˜

    λ§ˆμ§€λ§‰μœΌλ‘œ ν•¨μˆ˜μ˜ κ²°κ³Όκ°’μœΌλ‘œ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

     

    μ˜ˆμ‹œ 1)

    function say(name, job){
      //ν•¨μˆ˜λ₯Ό λ°˜ν™˜
      return job
      ? function() {
        console.log(`μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” ${name}μ΄κ΅¬μš”, ν˜„μž¬ 직μž₯μΈμž…λ‹ˆλ‹€.`);
      } : function() {
        console.log(`μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” ${name}μ΄κ΅¬μš”, 아직 λ°±μˆ˜μž…λ‹ˆλ‹€.`);
      }
    }
    
    // ν•¨μˆ˜λ₯Ό ν• λ‹Ή
    const TomSay = say('Tom', true);
    const DavidSay = say('David', false);
    
    //λ°˜ν™˜λ°›μ€ ν•¨μˆ˜ μ‹€ν–‰
    TomSay();
    DavidSay();
    
    >>> μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” Tomμ΄κ΅¬μš”, ν˜„μž¬ 직μž₯μΈμž…λ‹ˆλ‹€.
    >>> μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” Davidμ΄κ΅¬μš”, 아직 λ°±μˆ˜μž…λ‹ˆλ‹€.

     

     

     

     

     

     

     

     

     

    λŒ“κΈ€