---
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] 프로젝트를 진행할 때 모든 함수를 순수 함수로 만들 수는 없지만(결국 화면 출력이나 데이터 저장이 필요하니까요), 가능한 많은 로직을 순수 함수로 분리하면 전체적인 코드의 안정성이 크게 올라갑니다.

