Skip to content

Latest commit

Β 

History

History
118 lines (95 loc) Β· 5.31 KB

functionalProgramming.md

File metadata and controls

118 lines (95 loc) Β· 5.31 KB

πŸ’» ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(Functional Programming)

πŸ‘¨πŸ»β€πŸ’» ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 순수 ν•¨μˆ˜(Pure Function)λ₯Ό μ‘°ν•©ν•˜κ³  μƒνƒœ 곡유(Shared State), λ³€κ²½ κ°€λŠ₯ν•œ 데이터(Mutable Data) 및 λΆ€μˆ˜ 효과(Side Effects)을 ν”Όν•˜μ—¬ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ΄λ‹€.
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ λͺ…λ Ήν˜•(imperative)κ°€ μ•„λ‹Œ μ„ μ–Έν˜•(declarative)이며 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλŠ” 순수 ν•¨μˆ˜λ₯Ό 톡해 μ „λ‹¬λœλ‹€.
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μœ„μ—μ„œ μ •μ˜λœ κΈ°λ³Έ 원칙듀을 기반으둜 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ΅¬μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€.

πŸ‘¨πŸ»β€πŸ’» ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•

πŸƒ λΆ€μˆ˜ 효과(Side Effect)κ°€ μ—†λ‹€.

  • λΆ€μˆ˜ νš¨κ³Όλž€ λ‹€μŒκ³Ό 같은 λ³€ν™” λ˜λŠ” λ³€ν™”κ°€ λ°œμƒν•˜λŠ” μž‘μ—…μ„ λ§ν•œλ‹€.
  1. λ³€μˆ˜μ˜ 값이 λ³€κ²½ 됨
  2. 자료 ꡬ쑰λ₯Ό μ œμžλ¦¬μ—μ„œ μˆ˜μ •ν•¨
  3. 객체의 ν•„λ“œκ°’μ„ 섀정함
  4. μ˜ˆμ™Έλ‚˜ 였λ₯˜κ°€ λ°œμƒν•˜λ©° 싀행이 쀑단됨
  5. μ½˜μ†” λ˜λŠ” 파일I/Oκ°€ λ°œμƒν•¨
  • μ΄λŸ¬ν•œ λΆ€μˆ˜ νš¨κ³Όλ“€μ„ μ œκ±°ν•œ ν•¨μˆ˜λ“€μ„ 순수 ν•¨μˆ˜(Pure Function)이라고 ν•œλ‹€.

πŸƒ 순수 ν•¨μˆ˜(Pure Function)

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λŠ” μ΄λŸ¬ν•œ 순수 ν•¨μˆ˜λ“€μ΄λ‹€.
  1. Memory or I/O의 κ΄€μ μ—μ„œ λΆ€μˆ˜ 효과(Side Effect)κ°€ μ—†λŠ” ν•¨μˆ˜
  2. ν•¨μˆ˜μ˜ 싀행이 외뢀에 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜
  • 순수 ν•¨μˆ˜(Pure Function)을 μ΄μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 효과λ₯Ό 얻을 수 μžˆλ‹€.
  1. ν•¨μˆ˜ μžμ²΄κ°€ 독립적이며 λΆ€μˆ˜ 효과(Side Effect)κ°€ μ—†κΈ° λ•Œλ¬Έμ— Thread에 μ•ˆμ •μ„±μ„ 보μž₯받을 수 μžˆλ‹€.
  2. Thread에 μ•ˆμ •μ„±μ„ 보μž₯λ°›μ•„ 병렬 처리λ₯Ό 동기화 없이 진행할 수 μžˆλ‹€.

πŸƒ 일급 ν•¨μˆ˜(First Class Function)

  • 일급 ν•¨μˆ˜λΌλŠ” 말은 ν•¨μˆ˜λ₯Ό 객체둜 μ·¨κΈ‰ν•˜λŠ” 것을 두고 λ§ν•œλ‹€. 더 μ‰½κ²Œ λ§ν•˜λ©΄ 일반 λ³€μˆ˜μ™€ 같이 μ·¨κΈ‰ν•  수 μžˆλ‹€λŠ” λœ»μ΄λ‹€. μ–΄λ–€ 값을 λ³€μˆ˜μ— μ €μž₯ν•˜κ³ , ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈ°κ³ , ν•¨μˆ˜μ˜ 결과둜 μ–΄λ–€ 값을 리턴할 수 μžˆλ‹€.
  • 일급 ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°–κ³ μžˆλ‹€.
  1. λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰 μ•ˆμ— 담을 수 μžˆλ‹€.
  2. νŒŒλΌλ―Έν„°λ‘œ 전달할 수 μžˆλ‹€.
  3. λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
  4. 할당에 μ‚¬μš©λœ 이름과 λ¬΄κ΄€ν•˜κ²Œ κ³ μœ ν•œ ꡬ별이 κ°€λŠ₯ν•˜λ‹€.

  const startCase = function(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
  };

  startCase('hello'); // Hello
  • μœ„ 예제처럼 ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” ν˜•νƒœλ‘œ μ„ μ–Έν•  수 μžˆλ‹€. 그리고 ν• λ‹Ήν•œ λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

  document.querySelector('.my-button').addEventListener('click', (event) => {
    console.log('λ²„νŠΌ 클릭!');
  });
  • ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œλ„ 전달 ν•  수 μžˆλ‹€. λŒ€ν‘œμ μΈ 예둜 이벀트 λ¦¬μŠ€ν„°μ˜ μ½œλ°±ν•¨μˆ˜μ΄λ‹€.

πŸƒ μ°Έμ‘° 투λͺ…μ„±(Referential Transparency)

  • μ°Έμ‘° 투λͺ…성은 μ–΄λ–€ ν•¨μˆ˜κ°€ 같은 νŒŒλΌλ―Έν„°μ— λŒ€ν•΄μ„œ 같은 리턴값을 μ–Έμ œλ‚˜ 보μž₯ν•˜λŠ” 것을 μ°Έμ‘° 투λͺ…성이라고 ν•©λ‹ˆλ‹€.
  1. λ™μΌν•œ μΈμžμ— λŒ€ν•΄ 항상 λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
  2. μ°Έμ‘° 투λͺ…성을 톡해 기쑴의 값은 λ³€κ²½λ˜μ§€ μ•Šκ³  μœ μ§€λœλ‹€.(Immutable Data)

  const negate = (num) => {
    return num * -1;
  }
  • negate ν•¨μˆ˜λŠ” 숫자λ₯Ό λ°›μ•„μ„œ μŒμˆ˜λŠ” μ–‘μˆ˜λ‘œ μ–‘μˆ˜λ‘œ 음수둜 μ „ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. μœ„ ν•¨μˆ˜λŠ” 같은 μž…λ ₯에 λŒ€ν•΄μ„œ 항상 같은 좜λ ₯을 λ°›ν™˜ν•œλ‹€.

πŸƒ λΆˆλ³€μ„±(Immutability)

  • μž…λ ₯받은 νŒŒλΌλ―Έν„°λ‚˜ μ™ΈλΆ€ λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ” 것을 λΆˆλ³€μ΄λΌκ³  ν•œλ‹€.
  const replaceSpace = (str) => {
    return str.replace(/(_|-)/, ' ');
  }

  const startCase = (str) => {
    return str.charAt(0).toUpperCase() + str.slice(1);
  }

  const changePartStartCase = (str) => {
    return str.split(' ').map(startCase).join(' ')
  }
  • μœ„ μ˜ˆμ œμ—μ„œ replace(), toUpperCase(), slice() λͺ¨λ‘ μƒˆλ‘œμš΄ 값을 λ°˜ν™˜ν•œλ‹€.
  • μƒˆλ‘œμš΄ 값을 λ°˜ν™˜ν•˜λ©΄ μž…λ ₯ 받은 값을 μ˜€μ—Όμ‹œν‚€μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό λΆˆλ³€μ΄λΌκ³  말할 수 μžˆλ‹€.
  • 즉, λΆ€μˆ˜ 효과(Side Effect)κ°€ μ—†λ‹€κ³  생각할 수 μžˆλ‹€.

πŸ‘¨πŸ»β€πŸ’» μˆœμˆ˜ν•¨μˆ˜ μž₯점

  • μΊμ‹œκ°€ κ°€λŠ₯ν•˜λ‹€. 항상 같은 μž…λ ₯에 λŒ€ν•΄μ„œ 같은 값을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜μ˜ 둜직이 λ³΅μž‘ν•˜κ³  큰 계산이 λ“œλŠ” ν•¨μˆ˜λΌλ©΄ memoizeλ₯Ό μ΄μš©ν•΄μ„œ μΊμ‹œλ₯Ό ν•  수 μžˆλ‹€.
  • ν…ŒμŠ€νŠΈκ°€ μ•„μ£Ό 쉽닀. 같은 μž…λ ₯에 λŒ€ν•΄μ„œ 같은 좜λ ₯을 λ‚΄κΈ° λ•Œλ¬Έμ— κΈ°λŒ€ν•˜λŠ” 값이 λͺ…ν™•ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • 병렬 μ²˜λ¦¬μ— μœ λ¦¬ν•˜λ‹€. 순수 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ— λŒ€ν•œ μ°Έμ‘°κ°€ μ—†κ³ , μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό λ§Œλ“€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ³‘λ ¬μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

μ°Έκ³ 

https://velog.io/@nakta/FP-in-JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%EC%A0%91%ED%95%B4%EB%B3%B4%EB%8A%94-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%ED%8A%B9%EC%A7%95
https://sungjk.github.io/2017/07/17/fp.html
https://mangkyu.tistory.com/111