Higher Order Function

  • JavaScript์—์„œ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๊ธฐ์— ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ

  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ• ๋‹น ์ „์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

  • square(7); -> Reference Error

    const square = function(num) { // ๋ณ€์ˆ˜ square์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹
      return num * num;
    }; // ๋ณ€์ˆ˜ square์—๋Š” ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ผ๊ธ‰๊ฐ์ฒด, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž () ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    
    output = square(7);
  • ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ธฐ์— ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ์ฒด ์†์„ฑ์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Œ

    const cat = {
      name: 'nabi',
      age: 3,
      cry: fuction(){
        console.log('miaow..')
      }
    }

2. ๊ณ ์ฐจํ•จ์ˆ˜์˜ ์ดํ•ด

  • ์ •์˜: ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž(argument)๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜๋ฅผ returnํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜

  • ๋‹ค๋ฅธ ํ•จ์ˆ˜(caller)์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ (callback function)๋ผ๊ณ  ํ•จ

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๊ณ ์ฐจํ•จ์ˆ˜(caller)๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ(invoke)ํ•  ์ˆ˜ ์žˆ๊ณ , ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Œ

  • ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ปค๋งํ•จ์ˆ˜ ๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” 'ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜'์—๋งŒ ํ•œ์ •ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•จ. ์ฆ‰, ๊ณ ์ฐจํ•จ์ˆ˜๊ฐ€ ์ปค๋งํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฉ.

  • ์ •๋ฆฌํ•˜์ž๋ฉด, 'ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜'์™€ 'ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜' ๋ชจ๋‘ ๊ณ ์ฐจํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ

    a. ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ

    function double(num) {
      return num * 2;
    }
    
    function doubleNum(func, num) {
      return func(num);
    }
    
    // ํ•จ์ˆ˜ doubleNum์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ณ ์ฐจํ•จ์ˆ˜
    // ํ•จ์ˆ˜ doubleNum์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž func์— ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, ํ•จ์ˆ˜ func์€ ํ•จ์ˆ˜ doubleNum์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜
    // ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ, ํ•จ์ˆ˜ double์€ ํ•จ์ˆ˜ doubleNum์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜
    
    let output = doubleNum(double, 4);
    console.log(output); // 8

    b. ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ

    function adder(added) { // ํ•จ์ˆ˜ adder๋Š” 
      return fuction (num) { // ์ธ์ž ํ•œ ๊ฐœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ค๋ฅธ ํ•จ์ˆ˜(์ต๋ช…ํ•จ์ˆ˜)๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ณ ์ฐจํ•จ์ˆ˜
        return num + added; // ๋ฆฌํ„ด๋˜๋Š” ์ต๋ช…ํ•จ์ˆ˜๋Š” ์ธ์ž ํ•œ ๊ฐœ๋ฅผ ๋ฐ›์•„ added์™€ ๋”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ด
      };
    }
    
    // adder(5)๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž () ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    let output = adder(5)(3); // 8
    console.log(output); // 8
    
    // adder๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ ๊ฐ€๋Šฅ
    // javascript์—์„œ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ
    const add3 = adder(3);
    output = add3(2);
    console.log(output); // 5

    c. ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ

    function double(num) { 
      return num * 2
    }
    // ํ•จ์ˆ˜ doubleAdder๋Š” ๊ณ ์ฐจํ•จ์ˆ˜
    // ํ•จ์ˆ˜ doubleAdder์˜ ์ธ์ž func๋Š” ํ•จ์ˆ˜ doubleAdder์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜
    // ํ•จ์ˆ˜ double์€ ํ•จ์ˆ˜ doubleAdder์˜ ์ฝœ๋ฐฑ์œผ๋กœ ์ „๋‹ฌ๋จ
    function doubleAdder(added, func) { 
      const doubled = func(added);
      return function(num) {
        return num + doubled;
      };
    }
    // doubleAdder(5, double)๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ธฐํ˜ธ () ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    doubleAdder(5, double)(3); // 13
    
    // doubleAdder๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ ๊ฐ€๋Šฅ (์ผ๊ธ‰ ๊ฐ์ฒด)
    const addTwice3 = doubleAdder(3, double);
    addTwice(2); // 8

3. ๋‚ด์žฅ ๊ณ ์ฐจ ํ•จ์ˆ˜

  • JavaScript์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋œ ๊ณ ์ฐจํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋“ค ์ค‘ ์ผ๋ถ€๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ๊ณ ์ฐจํ•จ์ˆ˜์— ํ•ด๋‹น๋จ.

  • ๋ฐฐ์—ด์˜ filter ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋“  ๋ฐฐ์—ด์˜ ์š”์†Œ ์ค‘ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ '๊ฑธ๋Ÿฌ๋‚ด๋Š”' ๋ฉ”์†Œ๋“œ

    let arr = [1, 2, 3, 4];
    let output = arr.filter(์ง์ˆ˜);
    console.log(output); // [2, 4]
    
    arr = ['hello', 'front', 'end', 'happy', 'coding'];
    output = arr.filter(๊ธธ์ด 5 ์ดํ•˜) // *syntax error : ์ด ์ฝ”๋“œ๋Š” ์˜๋ฏธ๋งŒ ์ดํ•ดํ•˜๊ธฐ
    console.log(output); // 'hello', 'front', 'end' 'happy'
  • ์—ฌ๊ธฐ์„œ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ํŠน์ • ์กฐ๊ฑด์€ filter ๋ฉ”์†Œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ํ˜•ํƒœ๋Š” ํ•จ์ˆ˜ ํ˜•ํƒœ์ž„.

  • ๋”ฐ๋ผ์„œ filter ๋ฉ”์†Œ๋“œ๋Š” ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋ช…์‹œํ•œ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๊ธฐ์— ๊ณ ์ฐจํ•จ์ˆ˜.

    // ํ•จ์ˆ˜ ํ‘œํ˜„์‹
    const isEven = function (num) {
      return num % 2 === 0;
    };
    
    let arr = [1, 2, 3, 4];
    // let output = arr.filter(์ง์ˆ˜);
    // ์ง์ˆ˜๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์กฐ๊ฑด์œผ๋กœ์„œ filter ๋ฉ”์†Œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋จ
    let output = arr.filter(isEven);
    console.log(output); // [2, 4]
    
    const isLteFive = function (str) {
      // Lte = less than equal
      return str.length <= 5;
    };
    
    arr = ['hello', 'front', 'end', 'happy', 'coding'];
    // output = arr.filter(๊ธธ์ด 5 ์ดํ•˜)
    // ๊ธธ์ด 5 ์ดํ•˜๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์กฐ๊ฑด์œผ๋กœ์„œ filter ๋ฉ”์†Œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋จ
    let output = arr.filter(isLteFive);
    console.log(output); // 'hello', 'front', 'end' 'happy'
  • filter ํ™œ์šฉ ์‹œ ์•„๋ž˜ ๊ณผ์ •์„ ๊ธฐ์–ตํ•  ๊ฒƒ

    • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€

    • ํŠน์ • ๋…ผ๋ฆฌ (ํ•จ์ˆ˜)์— ๋”ฐ๋ฅด๋ฉด, ์‚ฌ์‹ค(true)์ผ ๋•Œ

    • ๋”ฐ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค (filter)

Last updated