DevLog

TIL(20210707) - ๊ณ ์ฐจํ•จ์ˆ˜ ๋ณธ๋ฌธ

๐Ÿค” TIL(Today I Learned)

TIL(20210707) - ๊ณ ์ฐจํ•จ์ˆ˜

Seungjae Lee 2021. 7. 7. 22:33

๐ŸŽ Today

  • ์ผ๊ธ‰ ๊ฐ์ฒด์˜ ํŠน์ง• ํ•™์Šต
  • ๊ณ ์ฐจํ•จ์ˆ˜ ๊ฐœ๋… ํ•™์Šต
  • ๋‚ด์žฅ ๊ณ ์ฐจํ•จ์ˆ˜(filter, map, reduce)ํ•™์Šต ๋ฐ
    ๋‚ด์žฅ ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด

๐Ÿค” Learned

First-class citizen : ์ผ๊ธ‰๊ฐ์ฒด - ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜

๋น„ํ–‰๊ธฐ์—๋Š” First class๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฝ”๋…ธ๋ฏธ ํด๋ž˜์Šค์™€๋Š” ํƒ‘์Šน์ˆ˜์†๋ถ€ํ„ฐ ๊ธฐ๋‚ด์‹, ์ˆ˜ํ•˜๋ฌผ์ด ๋‚˜์˜ค๋Š” ์ˆœ์„œ๊นŒ์ง€ ํ•ญ๊ณต์‚ฌ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ํ˜œํƒ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. First class ์ขŒ์„์„ ๊ตฌ๋งคํ•œ ์‚ฌ๋žŒ์€ ๋น„์‹ผ ๊ฐ€๊ฒฉ์„ ์น˜๋ฅด๊ณ , ํ•ญ๊ณต์‚ฌ๋กœ๋ถ€ํ„ฐ ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋„ ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๋ฅผ ๋ฐ›๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด(first-class citizen)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์ผ๊ธ‰ ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‚˜์˜จ ์‹œ์ ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ,) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํŠน๋ณ„ํ•˜๊ฒŒ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

  • ๋ณ€์ˆ˜์— ํ• ๋‹น(assignment) ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž(argument)๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋กœ์„œ ๋ฆฌํ„ด๋  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ์š”์†Œ๋‚˜ ๊ฐ์ฒด์˜ ์†์„ฑ๊ฐ’์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ์ดํ„ฐ(string, number, boolean, array, object)๋ฅผ ๋‹ค๋ฃจ๋“ฏ์ด ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ

    /*
     * ์•„๋ž˜๋Š” ๋ณ€์ˆ˜ square์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.
     * ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
     *
     * ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ• ๋‹น ์ „์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
     * square(7); // --> ReferenceError: Can't find variable: square
     */
    
    const square = function (num) {
      return num * num;
    };
    
    // square์—๋Š” ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ (์ผ๊ธ‰ ๊ฐ์ฒด), ํ•จ์ˆ˜ ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž '()'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    output = square(7);
    console.log(output); // --> 49

[์ฝ”๋“œ] ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋‹ค์Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•(ํ•จ์ˆ˜ ํ‘œํ˜„์‹)์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(function expression)์€ ํ•จ์ˆ˜ ์„ ์–ธ์‹(function declaration)๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํ˜ธ์ด์ŠคํŒ…์€ ์„ ์–ธ๋œ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์–ด๋””์„œ๋“  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์—์„œ ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋ฅผ ์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ์‹์˜ ํ˜ธ์ด์ŠคํŒ…์— ์ง€๋‚˜์น˜๊ฒŒ ์˜์กดํ•˜๋ฉด, ์ฝ”๋“œ์˜ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋‚˜ ๋””๋ฒ„๊น…์„ ํ•  ๋•Œ, ์ฝ”๋“œ๋ฅผ ์œ„์•„๋ž˜๋กœ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ์–ด๋А ์œ„์น˜์—๋‚˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์œ„์น˜๋„ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜์˜ ํ• ๋‹น๊ณผ ์‹คํ–‰์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ์˜ ์œ„์น˜๋ฅผ ์–ด๋А ์ •๋„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ด์ŠคํŒ…์„ ์ œ์™ธํ•˜๋ฉด, ํ•จ์ˆ˜ ์„ ์–ธ์‹๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ณด๋‹ค ๋ถ„๋ช…ํ•˜๊ฒŒ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋Š” ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜, ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋„ ๋ณ€์ˆ˜์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜, ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์–ด์ง€๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ณ ๊ธ‰ ์ฃผ์ œ, ๊ณ ์ฐจ ํ•จ์ˆ˜(higher order function)๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.


๊ณ ์ฐจ ํ•จ์ˆ˜๋ž€

๊ณ ์ฐจ ํ•จ์ˆ˜(higher order function)๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž(argument)๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด์ „ ์ฝ˜ํ…์ธ ์—์„œ ํ™•์ธํ–ˆ๋“ฏ์ด, ํ•จ์ˆ˜๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋Š”, ํ•จ์ˆ˜๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋Š” ์ด ๋ณ€์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ณ ์ฐจ ํ•จ์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ณ , ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ๋น ์กŒ์„ ๋ฟ, ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋‹ค๋ฅธ ํ•จ์ˆ˜(caller)์˜ ์ธ์ž(argument)๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜(callback function)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€, ์–ด๋–ค ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ, ๋‹ต์‹  ์ „ํ™”๋ฅผ ๋œปํ•˜๋Š” ์ฝœ๋ฐฑ์ด๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ฌ์กŒ์Šต๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š”, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ(invoke) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. caller๋Š” ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์˜ˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ž‘์—…์˜ ์™„๋ฃŒ ํ›„์— ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ดํ›„์— ์ถฉ๋ถ„ํžˆ ์ ‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜'๋Š” ๋ชจ์–‘์ƒˆ๊ฐ€ ํŠน์ดํ•œ ๋งŒํผ, ๋ถ€๋ฅด๋Š” ์šฉ์–ด๊ฐ€ ๋”ฐ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค. 'ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜'๋ฅผ ๊ณ ์•ˆํ•ด ๋‚ธ ๋…ผ๋ฆฌํ•™์ž ํ•˜์Šค์ผˆ ์ปค๋ฆฌ(Haskell Curry)์˜ ์ด๋ฆ„์„ ๋”ฐ, ์ปค๋ฆฌ ํ•จ์ˆ˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋กœ ์ปค๋ฆฌ ํ•จ์ˆ˜๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ๊ณ ์ฐจ ํ•จ์ˆ˜๋ž€ ์šฉ์–ด๋ฅผ 'ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜'์—๋งŒ ํ•œ์ •ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜์ž๋ฉด, ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ์ปค๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์œ ๋‹›๋ถ€ํ„ฐ๋Š” 'ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜'์™€ 'ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜' ๋ชจ๋‘, ์šฉ์–ด๋ฅผ ๊ณ ์ฐจ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

    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
  2. ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ

    function adder(added) {
      return function (num) {
        return num + added;
      };
    }
    
    /*
     * ํ•จ์ˆ˜ adder๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
     * adder๋Š” ์ธ์ž ํ•œ ๊ฐœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ํ•จ์ˆ˜(์ต๋ช… ํ•จ์ˆ˜)๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
     * ๋ฆฌํ„ด๋˜๋Š” ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ธ์ž ํ•œ ๊ฐœ๋ฅผ ๋ฐ›์•„์„œ 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
  3. ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ

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

๋‚ด์žฅ ๊ณ ์ฐจํ•จ์ˆ˜(filter, map, reduce)

๋ฉ”์†Œ๋“œ(filter, map, reduce)๋Š” this(์›๋ณธ ๋ฐฐ์—ด)๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๐Ÿ”’

1. Array.prototype.filter(callback: (element, index: number, array) => thisArg?: any) ;

  • filter ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด if ๋ฌธ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ true์ธ ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’๋งŒ์„ ์ถ”์ถœํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ฐฐ์—ด์—์„œ ํŠน์ • ์ผ€์ด์Šค๋งŒ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ ์›๋ณธ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’, ์š”์†Œ ์ธ๋ฑ์Šค, filter ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฐฐ์—ด, ์ฆ‰ this๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • IE 9 ์ด์ƒ์—์„œ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.
const result = [1, 2, 3, 4, 5].filter(function (item, index, self) {
  console.log(`[${index}] = ${item}`);
  return item % 2; // ํ™€์ˆ˜๋งŒ์„ ํ•„ํ„ฐ๋งํ•œ๋‹ค (1์€ true๋กœ ํ‰๊ฐ€๋œ๋‹ค)
});

// [0] = 1
// [1] = 2
// [2] = 3
// [3] = 4
// [4] = 5
console.log(result); // [ 1, 3, 5 ]

2. Array.prototype.map(callback: (element, index: number, array) => thisArg?: any);

  • ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’(๊ฒฐ๊ณผ๊ฐ’)์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ์›๋ณธ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • forEach ๋ฉ”์†Œ๋“œ๋Š” ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์š”์†Œ ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋ฉฐ map ๋ฉ”์†Œ๋“œ๋Š” ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์š”์†Œ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋งตํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ค.

map

Array.prototype.map

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’, ์š”์†Œ ์ธ๋ฑ์Šค, map ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฐฐ์—ด, ์ฆ‰ this๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • IE 9 ์ด์ƒ์—์„œ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.
const numbers = [1, 4, 9];

// ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰
const roots = numbers.map(function (item) {
  // ๋ฐ˜ํ™˜๊ฐ’์ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๋œ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์€ ๋น„์–ด ์žˆ๋‹ค.
  return Math.sqrt(item);
});

// ์œ„ ์ฝ”๋“œ์˜ ์ถ•์•ฝํ‘œํ˜„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
// const roots = numbers.map(Math.sqrt);

// map ๋ฉ”์†Œ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค
console.log(roots);   // [ 1, 2, 3 ]
// map ๋ฉ”์†Œ๋“œ๋Š” ์›๋ณธ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค
console.log(numbers); // [ 1, 4, 9 ]

3. Array.prototype.reduce(callback: (accumulator, currentValue, index: number, array) => accumulator + currentValue);

๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ์ด์ „์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์‹คํ–‰ ๋ฐ˜ํ™˜๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. IE 9 ์ด์ƒ์—์„œ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.

const arr = [1, 2, 3, 4, 5];

/*
previousValue: ์ด์ „ ์ฝœ๋ฐฑ์˜ ๋ฐ˜ํ™˜๊ฐ’
currentValue : ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’
currentIndex : ์ธ๋ฑ์Šค
array        : ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฐฐ์—ด, ์ฆ‰ this
*/
// ํ•ฉ์‚ฐ
const sum = arr.reduce(function (previousValue, currentValue, currentIndex, self) {
  console.log(previousValue + '+' + currentValue + '=' + (previousValue + currentValue));
  return previousValue + currentValue; // ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ ์ฝœ๋ฐฑ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค
});

console.log(sum); // 15: 1~5๊นŒ์ง€์˜ ํ•ฉ
/*
1: 1+2=3
2: 3+3=6
3: 6+4=10
4: 10+5=15
15
*/

// ์ตœ๋Œ€๊ฐ’ ์ทจ๋“
const max = arr.reduce(function (pre, cur) {
  return pre > cur ? pre : cur;
});

console.log(max); // 5: ์ตœ๋Œ€๊ฐ’

reduce

๐ŸŒˆ Tomorrow

  • ๊ณ ์ฐจํ•จ์ˆ˜ ๋ณต์Šต
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด

'๐Ÿค” TIL(Today I Learned)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIL(20210715) - HA1 ๋  (0) 2021.07.15
TIL(20210708) - JSX๊ทœ์น™  (0) 2021.07.08
TIL(20210706) - onclick / addEventListener  (0) 2021.07.06
TIL(20210705) - DOM  (0) 2021.07.06
TIL(20210703)  (0) 2021.07.03
Comments