๋ฐ˜์‘ํ˜•

์ปค๋ง


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

// ์ผ๋ฐ˜ ํ•จ์ˆ˜
const adder = (x, y) => x + y;
adder(100, 50); // 150
// ์ปค๋ง ํ•จ์ˆ˜
const adder = (x) => (y) => x + y;
const add100 = adder(100);
add100(50); // 150

 

๊ฐ์ฒด ์ง€ํ–ฅ / ์ผ๋ฐ˜ ํ•จ์ˆ˜ / ํ•จ์ˆ˜ํ˜• ๋น„๊ต


๐Ÿ’ก ๊ฐ์ฒด ์ง€ํ–ฅ / ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์•”์‹œ์ ์ธ ์ปจํ…์ŠคํŠธ ๊ฐ–๋Š”๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ์—์„  ๊ฐ์ฒด ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ•จ์ˆ˜ํ˜•์—์„  ์ปค๋ง ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•œ ์ฝ”๋“œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ (์ง€์—ฐ ํ‰๊ฐ€), ์ค‘๋ณต๋„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ ์˜ˆ์‹œ. ์ปจํ…์ŠคํŠธ(์ดˆ๊ธฐ๊ฐ’ 5)๋ฅผ ๊ฐ€์ง€๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ(์บก์Šํ™”)ํ•ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹๋‹ค.

// ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
class NumberScaler {
  constructor(value) {
    this.field = value;
  }

  scaledBy = (factor) => this.field * factor;
}

const five = new NumberScaler(5); // ์ดˆ๊ธฐ๊ฐ’ 5๋ฅผ ๊ฐ€์ง€๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const fiveScaledBy2 = five.scaledBy(2); // 10
const fiveScaledBy14 = five.scaledBy(14); // 70

 

์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ. ๋งค๋ฒˆ ์ปจํ…์ŠคํŠธ(์ดˆ๊ธฐ๊ฐ’ 5)๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ์ค‘๋ณต์„ ๋งŒ๋“ค๊ณ  ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ์‰ฌ์›Œ์„œ ์ข‹์ง€ ์•Š๋‹ค.

// ์ผ๋ฐ˜ ํ•จ์ˆ˜
const numberScaler = (value, factor) => value * factor;

const fiveScaledBy2 = numberScaler(5, 2); // 10
const fiveScaledBy14 = numberScaler(5, 14); // 70

 

์ปค๋ง์„ ์ด์šฉํ•œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ ์˜ˆ์‹œ. ์ปจํ…์ŠคํŠธ(์ดˆ๊ธฐ๊ฐ’ 5)๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ถ€๋ถ„์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ → ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐ ์ƒํƒœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ํก์‚ฌํ•˜๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋„ ์บก์Šํ™” ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ๋ฅผ ์–ด๋Š ์ •๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ณด์—ฌ์ค€๋‹ค.

// ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
const numberScaler = (value) => (factor) => value * factor;

const fiveScaler = numberScaler(5); // ์ดˆ๊ธฐ๊ฐ’ 5๋ฅผ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ
const fiveScaledBy2 = fiveScaler(2); // 10
const fiveScaledBy14 = fiveScaler(14); // 70

 

์ฝ”๋“œ / ๋‚ด์šฉ ์ฐธ๊ณ 


 

FP and OOP are close siblings | The Upside-Down Trees

OOP and FP are closer than what you think

blog.mhashim6.me

 

๋ฐ˜์‘ํ˜•