- ν¨μν νλ‘κ·Έλλ°μ μμ ν¨μ(Pure Function)λ₯Ό μ‘°ν©νκ³ μν 곡μ (Shared State), λ³κ²½ κ°λ₯ν λ°μ΄ν°(Mutable Data) λ° λΆμ ν¨κ³Ό(Side Effects)μ νΌνμ¬ μννΈμ¨μ΄λ₯Ό λ§λλ νλ‘μΈμ€μ΄λ€.
- ν¨μν νλ‘κ·Έλλ°μ λͺ λ Ήν(imperative)κ° μλ μ μΈν(declarative)μ΄λ©° μ ν리μΌμ΄μ μ μνλ μμ ν¨μλ₯Ό ν΅ν΄ μ λ¬λλ€.
- ν¨μν νλ‘κ·Έλλ°μ μμμ μ μλ κΈ°λ³Έ μμΉλ€μ κΈ°λ°μΌλ‘ μννΈμ¨μ΄λ₯Ό ꡬμ±νλ νλ‘κ·Έλλ° ν¨λ¬λ€μμ΄λ€.
- λΆμ ν¨κ³Όλ λ€μκ³Ό κ°μ λ³ν λλ λ³νκ° λ°μνλ μμ μ λ§νλ€.
1. λ³μμ κ°μ΄ λ³κ²½ λ¨
2. μλ£ κ΅¬μ‘°λ₯Ό μ μ리μμ μμ ν¨
3. κ°μ²΄μ νλκ°μ μ€μ ν¨
4. μμΈλ μ€λ₯κ° λ°μνλ©° μ€νμ΄ μ€λ¨λ¨
5. μ½μ λλ νμΌI/Oκ° λ°μν¨
- μ΄λ¬ν λΆμ ν¨κ³Όλ€μ μ κ±°ν ν¨μλ€μ μμ ν¨μ(Pure Function)μ΄λΌκ³ νλ€.
- ν¨μν νλ‘κ·Έλλ°μμ μ¬μ©νλ ν¨μλ μ΄λ¬ν μμ ν¨μλ€μ΄λ€.
1. Memory or I/Oμ κ΄μ μμ λΆμ ν¨κ³Ό(Side Effect)κ° μλ ν¨μ
2. ν¨μμ μ€νμ΄ μΈλΆμ μν₯μ λΌμΉμ§ μλ ν¨μ
- μμ ν¨μ(Pure Function)μ μ΄μ©νλ©΄ λ€μκ³Ό κ°μ ν¨κ³Όλ₯Ό μ»μ μ μλ€.
1. ν¨μ μμ²΄κ° λ
립μ μ΄λ©° λΆμ ν¨κ³Ό(Side Effect)κ° μκΈ° λλ¬Έμ Threadμ μμ μ±μ 보μ₯λ°μ μ μλ€.
2. Threadμ μμ μ±μ 보μ₯λ°μ λ³λ ¬ μ²λ¦¬λ₯Ό λκΈ°ν μμ΄ μ§νν μ μλ€.
- μΌκΈ ν¨μλΌλ λ§μ ν¨μλ₯Ό κ°μ²΄λ‘ μ·¨κΈνλ κ²μ λκ³ λ§νλ€. λ μ½κ² λ§νλ©΄ μΌλ° λ³μμ κ°μ΄ μ·¨κΈν μ μλ€λ λ»μ΄λ€. μ΄λ€ κ°μ λ³μμ μ μ₯νκ³ , ν¨μλ₯Ό νΈμΆν λ νλΌλ―Έν°λ‘ λκΈ°κ³ , ν¨μμ κ²°κ³Όλ‘ μ΄λ€ κ°μ 리ν΄ν μ μλ€.
- μΌκΈ ν¨μλ λ€μκ³Ό κ°μ νΉμ§μ κ°κ³ μλ€.
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('λ²νΌ ν΄λ¦!');
});
- ν¨μλ₯Ό νλΌλ―Έν°λ‘λ μ λ¬ ν μ μλ€. λνμ μΈ μλ‘ μ΄λ²€νΈ 리μ€ν°μ μ½λ°±ν¨μμ΄λ€.
- μ°Έμ‘° ν¬λͺ μ±μ μ΄λ€ ν¨μκ° κ°μ νλΌλ―Έν°μ λν΄μ κ°μ 리ν΄κ°μ μΈμ λ 보μ₯νλ κ²μ μ°Έμ‘° ν¬λͺ μ±μ΄λΌκ³ ν©λλ€.
1. λμΌν μΈμμ λν΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ€.
2. μ°Έμ‘° ν¬λͺ
μ±μ ν΅ν΄ κΈ°μ‘΄μ κ°μ λ³κ²½λμ§ μκ³ μ μ§λλ€.(Immutable Data)
const negate = (num) => {
return num * -1;
}
- negate ν¨μλ μ«μλ₯Ό λ°μμ μμλ μμλ‘ μμλ‘ μμλ‘ μ ννλ ν¨μμ΄λ€. μ ν¨μλ κ°μ μ λ ₯μ λν΄μ νμ κ°μ μΆλ ₯μ λ°ννλ€.
- μ λ ₯λ°μ νλΌλ―Έν°λ μΈλΆ λ³μλ₯Ό λ³κ²½νμ§ μλ κ²μ λΆλ³μ΄λΌκ³ νλ€.
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