Logo
Hyunsu Blog
functional_programming_book

๐Ÿ“†Published :Dec 5, 2021 โ€ข

๐Ÿ“†Updated :Dec 5, 2021 โ€ข

โ˜•๏ธ2min

FP ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠน์ง•

๋ฆฌ์•กํŠธ ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ถ€์ˆ˜ํšจ๊ณผ์— ๋Œ€ํ•ด ์ƒ๊ฐ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‚ฌ๊ณ ์™€ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ํ˜• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฑ…์„ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„์‹œ ์ž๋ฌธํ•ด๋ด์•ผํ•  ์š”์†Œ๋“ค

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

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์ด ์š”์†Œ๋“ค์„ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์‚ฌ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ์ง€, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์–ด๋–ค ๋„์›€์„ ์ฃผ๋Š”์ง€ ์ดํ•ดํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ 
  • ์ƒํƒœ๋ณ€์ด๋ฅผ ๊ฐ์†Œํ•˜๊ธฐ์œ„ํ•ด
  • ๋ฐ์ดํ„ฐ์˜ ์ œ์–ดํ๋ฆ„๊ณผ ์—ฐ์‚ฐ์„ ์ถ”์ƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์˜จ์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ์œ„ํ•ด ์ˆ™์ง€ํ•ด์•ผํ•  ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค

  • ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ˆœ์ˆ˜ํ•จ์ˆ˜
  • ์ฐธ์กฐํˆฌ๋ช…์„ฑ
  • ๋ถˆ๋ณ€์„ฑ

์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Procedural, imperative (๋ช…๋ นํ˜•, ์ ˆ์ฐจ์ ) ๋ชจ๋ธ

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for (let i = 0; i < arr.length; i++) { arr[i] = Math.pow(arr[i], 2) } arr // [0,1,4,5,16,25,36,49,64,81]

Declarative ํŒจ๋Ÿฌ๋‹ค์ž„

์„œ์ˆ ๋ถ€์™€ ํ‰๊ฐ€๋ถ€๋ฅผ ๋ถ„๋ฆฌ ํ•˜์—ฌ ์ œ์–ดํ๋ฆ„์ด๋‚˜ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ํŠน์ •ํ•˜์ง€๊ณ ๋„ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ํ‘œํ˜„์‹์œผ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

;[0, 1, 2, 3, 4].map(function (num) { return Math.pow(num, 2) })

๋ช…๋ นํ˜•๊ณผ ๋น„๊ต์‹œ,

  1. ๋ฃจํ”„์นด์šดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐฐ์—ด์ธ๋ฑ์Šค์— ์ •ํ™•ํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ์ผ์— ๊ฐœ๋ฐœ์ž์˜ ๋ถ€๋‹ด์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  2. ๋ช…๋ นํ˜•์˜ for loop์€ ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•จ์ˆ˜๋กœ ์ถ”์ƒํ•˜๋Š” ์ž‘์—…์œผ๋กœ ์ธํ•ด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค. (์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

์ˆœ์ˆ˜ํ•จ์ˆ˜์™€ ๋ถ€์ˆ˜ํšจ๊ณผ

์ˆœ์ˆ˜ํ•จ์ˆ˜์˜ ํŠน์„ฑ

  • ์ฃผ์–ด์ง„ ์ž…๋ ฅ์—๋งŒ ์˜์กดํ•  ๋ฟ, ํ‰๊ฐ€ ๋„์ค‘ ๋˜๋Š” ํ˜ธ์ถœ ๊ฐ„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ˆจ๊ฒจ์ง„ ๊ฐ’์ด๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์—ญ๊ฐ์ฒด๋‚˜ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์–ด๋– ํ•œ ๋ณ€๊ฒฝ๋„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์˜ˆ์‹œ.

ex1.

var counter = 0 function increment() { return ++counter }

์ด ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ด์œ  :

ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ณ€์ˆ˜ counter๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.

ex2. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Date.now() //๋งค๋ฒˆ ๋‹ค๋ฅธ ์˜ˆ์ธก ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ์‚ฐ์ถœ

ex3. this ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜.

this ํ‚ค์›Œ๋“œ๋ฅผ ๊ฑฐ์ณ ์ธ์Šคํ„ด์Šค ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ ์—ญ์‹œ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” this๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ ํˆฌ๋ช…์„ฑ๊ณผ ์น˜ํ™˜์„ฑ

์ฐธ์กฐํˆฌ๋ช…์„ฑ์€ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์ข€ ๋” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์ˆœ์ˆ˜์„ฑ์ด๋ž€ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜์™€ ๊ฒฐ๊ณผ๊ฐ’ ์‚ฌ์ด์˜ ์ˆœ์ˆ˜ํ•œ ๋งคํ•‘ ๊ด€๊ณ„๋ฅผ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋™์ผํ•œ ์ž…๋ ฅ์„ ๋ฐ›์•˜์„ ๋•Œ, ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ฉด ์ฐธ์กฐํˆฌ๋ช…์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ ํˆฌ๋ช…ํ•˜์ง€ ์•Š๋‹ค๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ?

var counter = 0 function increment() { return ++counter }

incrementํ•จ์ˆ˜์—์„œ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ ๋ณ€์ˆ˜(counter)์— ์™„์ „ํžˆ ์ข…์†๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ฐธ์กฐํˆฌ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐํˆฌ๋ช…ํ•œ ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?

const increment = (counter) => counter + 1

๊ฐ™์€ ์ž…๋ ฅ์— ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•ˆ์ „ํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๊ณ  ์ „์ฒด๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

increment() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋‹ค๋ฅธ ์ฝ”๋“œ์˜ ์˜ˆ์‹œ๋กœ ๋ช…๋ นํ˜•๊ณผ ํ•จ์ˆ˜ํ˜•์˜ ์ฐจ์ด๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ช…๋ นํ˜•

increment() increment() print(counter) // ?

ํ•จ์ˆ˜ํ˜•

var plus2 = run(increment, increment) print(plus2(0))

์œ„์˜ ์ฝ”๋“œ์—์„œ ํ•จ์ˆ˜ํ˜•์ด ์ฐธ์กฐํˆฌ๋ช…์„ฑ์— ์ ํ•ฉํ•œ ์ด์œ ๋Š”

  1. ์™ธ๋ถ€๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์ฃผ์–ด์ง„ ์ž…๋ ฅ (0) ์ด๋ผ๋Š” ๊ฐ’์— ์˜์กดํ•˜์—ฌ, ํ•ญ์ƒ ๊ทธ ๊ฐ’์— 2๋งŒํผ ์ฆ๊ฐ€๋ฅผ ์‹œํ‚ต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ๋ช…๋ นํ˜•์€

0 ์—์„œ 2๋ฅผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ, counter๊ฐ€ ์ „์—ญ์œผ๋กœ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐ๊ฐ’์ด 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ์‚ฐ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

var input = [80, 90, 100] var average = (arr) => divide(sum(arr), size(arr))

sum๊ณผ size ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐ ํˆฌ๋ช…ํ•œ ํ•จ์ˆ˜๋ผ๋ฉด,

divide( 270,3) ์ด ๋œ๋‹ค. ์ฆ‰, ์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ ์ด ๋ง์€ [80,90,100 ]์ด๋ผ๋Š” ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๊ฐ’์ด ์™ธ๋ถ€์— ์˜์กด์„ฑ์„ ๊ฐ–๋Š” ๊ฐ’๋“ค์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋กœ์ง ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ธกํ•œ ๊ฒฐ๊ณผ๊ฐ’(80+90+100)์„ ๋„์ถœ ํ•ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ 100% ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‚ฌ๊ณ ๋ฐฉ์‹์ด ๋‚ด์žฌ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

const sum = (total, current) => total + current const total = (arr) => arr.reduce(sum) const divide = (a, b) => a / b const average = (arr) => divide(total(arr), size(arr)) average(input) //90

๋ถˆ๋ณ€์„ฑ

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

const sortDesc = arr= >{ arr.sort((a,b)=>b-a) } const stdeuntIds = [1,2,3,4,5] const sortedStudentIds =sortDesc(studentIds); console.log(sortedStudetnIds) // [5,4,3,2,1] console.log(studentIds) //[5,4,3,2,1]

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ž€ ์›๋ณธ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•  ๊ฒฝ์šฐ๋Š”, Object.freeze() ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜,

๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ• ๊ฒฝ์šฐ๋Š” lodash ๋˜๋Š” ๋žŒ๋‹คJS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ

Hi, I'm Hyunsu ๐Ÿ‘‹

Profile Image

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ฃผํ˜„์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ’๋ถ€ํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์ผ์— ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค.

์˜ต์‹œ๋””์–ธ(Obsidian)์—์„œ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ๋กœ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์— ์žˆ์–ด์š”. โ˜•๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป โ›ท

Github on ViewReach Me Out