1. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λž€??

  • lambda calculus λΌλŠ” μˆ˜ν•™ μ΄λ‘ μ—μ„œ λΉ„λ‘―λœ μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
  • ν•˜μ§€λ§Œ 이미 λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ—‰μ—μ„œ ν•¨μˆ˜ν˜•μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„± ν•  수 μžˆλŠ” APIκ°€ 이미 있음
  • JSλŠ” ES6λΆ€ν„° 지원함, λ§Œμ•½ Reactλ₯Ό 써봀닀면, 이미 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ κ²½ν˜ν•΄λ΄€λ‹€κ³  ν•  수 있음

λ¨Έ κ·ΈλŸ°κ²ƒλ“€μ΄ μžˆλ‹€κ³  ν•©λ‹ˆλ‹€,,,

2. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŠΉμ§• 4κ°€μ§€

01. Pure Functions(μˆœμˆ˜ν•¨μˆ˜)

  • λ™μΌν•œ 인자λ₯Ό λ„£μ—ˆμ„ λ•Œ, 항상 λ™μΌν•œ 결과값을 λ°˜ν™˜ν•΄μ•„ν•¨
  • μ–Έμ œ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ 외뢀에 μ „ν˜€ 영ν–₯을 λ°›μ§€ μ•Šλ„λ‘ μž‘μ„± 해야함
  • ν•¨μˆ˜ μ•ˆμ—μ„œ μ™ΈλΆ€μ˜ μƒνƒœκ°’μ„ λ³€κ²½ν•œλ‹€λ©΄, 그건 ν•¨μˆ˜ν˜•μ΄ μ•„λ‹Œ μ ˆμ°¨μ§€ν–₯ν˜•μΌ κ°€λŠ₯성이 맀우 λ†’μŒ
// Bad
let num = 1;

function add(a) {
  return a + num;
}
// Good
function add(a, b) {
  return a + b;
}

const result = add(2, 3);

02. Stateless, Immutability

  • λΉ„μƒνƒœ, λΆˆλ³€μ…©μ„ μœ μ§€ν•΄μ•Όν•¨
  • ν•¨μˆ˜μ— 인자둜 μ „λ‹¬λœ 데이터λ₯Ό λ³€κ²½ν•˜λŠ” 것은 μ ˆλŒ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ μ•„λ‹˜
  • 데이터λ₯Ό 직접 λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹Œ, μƒˆλ‘œμš΄ λ²„μ „μ˜ μƒˆλ‘œμš΄ 였브젝트λ₯Ό λ§Œλ“€μ–΄μ„œ κ²°κ³Όκ°’μœΌλ‘œ 전달
  • μ™ΈλΆ€μ˜ μƒνƒœλ‚˜ ν•¨μˆ˜μ— μΈμžμ— μ „λ‹¬λœ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ―€λ‘œμ„œ side effectλ₯Ό λ§Œλ“€μ§€ μ•ŠμŒ
  • λ”°λΌμ„œ λΆˆλ³€μ„± μœ μ§€ν•˜λ©° μ—¬λŸ¬ λ©€ν‹° μŠ€λž˜λ”© ν™˜κ²½μ—μ„œλ„ μ•ˆμ •μ μœΌλ‘œ λ™μž‘ κ°€λŠ₯

    jsμ—μ„œλŠ” 특히 λΆˆλ³€μ„±μ˜ 데이터 νƒ€μž…μ΄λΌλŠ” 것이 λ”°λ‘œ μ—†κΈ° λ•Œλ¬Έμ— Object.freezeλΌλŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ, λ³€μˆ˜λ₯Ό λΆˆλ³€μ„±μœΌλ‘œ λ§Œλ“€μ–΄ 쀄 수 있음

// Bad
let person = { name: "kim", age: 25 };

function increaseAge(person) {
  person.age = person.age + 1;
  return person;
}
// Good - Stateless, Immuablility
const person = { name: "kim", age: 20 };
function increaseAge(person) {
  return { ...person, age: person.age + 1 };
}

// or... Object freeze
const person = Object.freeze({ name: "kim", age: 20 });
function increaseAge(person) {
  return Object.freeze({ ...person, age: person.age + 1 });
}

03. Expressions Only!

  • if, for, switch λ“± μ—¬λŸ¬κ°€μ§€ λ¬Έμž₯을 μ‚¬μš©ν•˜λŠ” 것은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ μ•„λ‹˜
// Bad
let numbers = [1, 2, 3];

function multiply(numbers, multiplier) {
  for (let i = 0; i < numbers.length; i++) {
    numbers[i] = numbers[i] * nultiplier;
  }
}
// Good
function multiply(numbers, multiplier) {
  return numbers.map((num) => num * multiplier);
}

04. First-class and higher-order functions

  • λ‹€λ₯Έ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜
  • ν•¨μˆ˜μ— 인자둜 μ „λ‹¬ν•˜κ±°λ‚˜ λ¦¬ν„΄ν•˜λŠ” λ“±μ˜ 일듀을 ν•  μˆ˜μžˆλŠ” First Class(일급 ν•¨μˆ˜) νŠΉμ§•
  • 그리고 ν•¨μˆ˜ 자체λ₯Ό 인자둜 μ „λ‹¬ν•˜κ±°λ‚˜, ν•¨μˆ˜μ—μ„œ 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” κ³ μ°¨ν•¨μˆ˜
  • 이 두가지 νŠΉμ§•μ„ κ°€μ§€κ³  μžˆμ–΄μ•Ό 함
// first-class
const addTwo = (a) => a + 2;
const multiplyTwo = (a) => a * 2;
const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1, 2, 3, 4]));

// higher-order functions
const addToppings = (topping) => (food) => food + topping;
const egg = addToppings("egg");
const bacon = addToppings("bacon");

console.log(egg("eggtoast"));
console.log(bacon("toast"));

λ‹¨μˆœνžˆ λΉ„μŠ·ν•œ λ‘œμ§μ„ 클래슀둜 λ¬Άμ–΄ λ‚˜κ°€λŠ” 것이 μ§„μ •ν•œ 객체지ν–₯이 μ•„λ‹Œκ²ƒ 처럼, μΊ μŠν™”, 좔상화, λ‹€ν–₯성을 그리고 μ—¬λŸ¬ λ””μžμΈ νŒ¨ν„΄μ— λŒ€ν•΄μ„œ 곡뢀해 λ‚˜κ°€λ“―μ΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ œλŒ€λ‘œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” Monad, Semigroup, Applicative, Monaid, Functor, Disjunction 이런 λ‹€μ–‘ν•œ μ»¨μ…ˆλ“€μ— λŒ€ν•΄μ„œ 잘 μ΄ν•΄ν•΄μ•Όλ§Œ 함

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°