--- id: 순수 ν•¨μˆ˜(Pure Function) 20260407 created: 2026-04-07 15:50 tags: aliases: --- ## πŸ’‘ 생각 [[μœ λ‹‰μŠ€μ˜ μ² ν•™κ³Ό ν•„ν„°]] μ—μ„œμ˜ ν•„ν„°μ˜ κ°œλ… 쀑 ν•œκ°€μ§€λ§Œ μž˜ν•˜κ²Œ + ν•¨κ»˜ λ™μž‘ν•˜κ²Œ λ₯Ό μ§€ν‚€κΈ° μœ„ν•΄μ„œ μ§€μΌœμ Έμ•Ό ν•  μ΅œμ†Œν•œμ˜ 쑰건. μ™œλƒν•˜λ©΄ μˆœμˆ˜ν•˜μ§€ μ•Šμ€ ν•„ν„°λŠ” ν•¨κ»˜ λ™μž‘ν•˜κΈ°κ°€ ꡉμž₯히 μ–΄λ €μ›Œμ§ˆ 수 있고 λ™μž‘μ€‘μ— μ™ΈλΆ€μ˜ 값을 λ°”κΏ”λ²„λ¦¬λ©΄μ„œ λ™μž‘μ΄ μ œλŒ€λ‘œ λ˜μ§€ μ•Šκ±°λ‚˜ λ©ˆμΆ°λ²„λ¦΄μˆ˜λ„ 있기 λ•Œλ¬Έμž„. --- ## πŸ“‘ κ°œλ… μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  였직 μž…λ ₯κ°’μ—λ§Œ λ°˜μ‘ν•˜λ©°, 외뢀에 μ•„λ¬΄λŸ° 영ν–₯을 μ£Όμ§€ μ•ŠλŠ” 'κΉ¨λ—ν•œ' ν•¨μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 순수 ν•¨μˆ˜κ°€ 되기 μœ„ν•΄μ„œλŠ” λ‹€μŒ 두 κ°€μ§€ 쑰건을 λ°˜λ“œμ‹œ λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€. ## 1. λ™μΌν•œ μž…λ ₯μ—λŠ” 항상 λ™μΌν•œ 좜λ ₯ (Deterministic) ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” μ‹œμ μ΄λ‚˜ ν™˜κ²½μ— 상관없이, **λ§€κ°œλ³€μˆ˜(Input)**κ°€ κ°™λ‹€λ©΄ 결과값은 늘 λ˜‘κ°™μ•„μ•Ό ν•©λ‹ˆλ‹€. - **순수 ν•¨μˆ˜ μ˜ˆμ‹œ:** ``` javascript function add(a, b) { return a + b; } ``` 이 ν•¨μˆ˜λŠ” μ–Έμ œ μ–΄λ””μ„œ μ‹€ν–‰ν•˜λ“  `add(2, 3)`을 ν˜ΈμΆœν•˜λ©΄ 무쑰건 **5**λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. - **λΉ„μˆœμˆ˜ ν•¨μˆ˜ μ˜ˆμ‹œ:** ``` javascript let tax = 0.1; function calculatePrice(price) { return price + (price * tax); // μ™ΈλΆ€ λ³€μˆ˜ tax에 의쑴 } ``` μ™ΈλΆ€μ˜ `tax` 값이 λ°”λ€Œλ©΄ κ²°κ³Όκ°€ λ‹¬λΌμ§€λ―€λ‘œ 순수 ν•¨μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. `Math.random()`μ΄λ‚˜ ν˜„μž¬ μ‹œκ°„μ„ κ°€μ Έμ˜€λŠ” ν•¨μˆ˜λ„ μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ κ²°κ³Όκ°€ 달라지기 λ•Œλ¬Έμ— λΉ„μˆœμˆ˜ ν•¨μˆ˜μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€. ## 2. λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†μŒ (No Side Effects) ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜ λ°–μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜, 외뢀와 μƒν˜Έμž‘μš©(μž…μΆœλ ₯ λ“±)을 ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. - **ν”Όν•΄μ•Ό ν•  λΆ€μˆ˜ νš¨κ³Όλ“€:** - μ™ΈλΆ€ λ³€μˆ˜ μˆ˜μ • - κ°μ²΄λ‚˜ λ°°μ—΄ λ“± μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ 원본 μˆ˜μ • - μ½˜μ†” 좜λ ₯(`console.log`)μ΄λ‚˜ 파일 μ“°κΈ° - λ„€νŠΈμ›Œν¬ μš”μ²­(API 호좜) --- ## 순수 ν•¨μˆ˜μ˜ μž₯점 μ™œ ꡳ이 μ΄λ ‡κ²Œ μ—„κ²©ν•˜κ²Œ ν•¨μˆ˜λ₯Ό λ§Œλ“€κΉŒμš”? κ·Έ μ΄μœ λŠ” λ‹€μŒκ³Ό 같은 이점 λ•Œλ¬Έμž…λ‹ˆλ‹€. 1. **예츑 κ°€λŠ₯μ„±:** μ½”λ“œκ°€ μ–΄λ–»κ²Œ λ™μž‘ν• μ§€ λ¨Έλ¦Ώμ†μœΌλ‘œ 그리기가 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€. 2. **ν…ŒμŠ€νŠΈ μš©μ΄μ„±:** μ™ΈλΆ€ ν™˜κ²½μ„ μ„€μ •(Mocking)ν•  ν•„μš” 없이 μž…λ ₯κ°’λ§Œ λ„£μœΌλ©΄ λ˜λ―€λ‘œ λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ 맀우 κ°„νŽΈν•©λ‹ˆλ‹€. 3. **디버깅 효율:** ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€λ₯Ό κ±΄λ“œλ¦¬μ§€ μ•ŠμœΌλ‹ˆ, 버그가 생겼을 λ•Œ 좔적 λ²”μœ„κ°€ ν™• μ’μ•„μ§‘λ‹ˆλ‹€. 4. **캐싱(Memoization):** 동일 μž…λ ₯에 동일 좜λ ₯이 보μž₯λ˜λ―€λ‘œ, 계산이 λ³΅μž‘ν•œ 경우 κ²°κ³Όλ₯Ό μ €μž₯해두고 μž¬μ‚¬μš©ν•  수 μžˆμ–΄ μ„±λŠ₯ μ΅œμ ν™”μ— μœ λ¦¬ν•©λ‹ˆλ‹€. > [!note] ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•  λ•Œ λͺ¨λ“  ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜λ‘œ λ§Œλ“€ μˆ˜λŠ” μ—†μ§€λ§Œ(κ²°κ΅­ ν™”λ©΄ 좜λ ₯μ΄λ‚˜ 데이터 μ €μž₯이 ν•„μš”ν•˜λ‹ˆκΉŒμš”), κ°€λŠ₯ν•œ λ§Žμ€ λ‘œμ§μ„ 순수 ν•¨μˆ˜λ‘œ λΆ„λ¦¬ν•˜λ©΄ 전체적인 μ½”λ“œμ˜ μ•ˆμ •μ„±μ΄ 크게 μ˜¬λΌκ°‘λ‹ˆλ‹€.