3.1 KiB
id, created, tags, aliases
| id | created | tags | aliases |
|---|---|---|---|
| 순수 함수(Pure Function) 20260407 | 2026-04-07 15:50 |
💡 생각
유닉스의 철학과 필터 에서의 필터의 개념 중 한가지만 잘하게 + 함께 동작하게 를 지키기 위해서 지켜져야 할 최소한의 조건. 왜냐하면 순수하지 않은 필터는 함께 동작하기가 굉장히 어려워질 수 있고 동작중에 외부의 값을 바꿔버리면서 동작이 제대로 되지 않거나 멈춰버릴수도 있기 때문임.
📑 개념
외부 상태에 의존하지 않고 오직 입력값에만 반응하며, 외부에 아무런 영향을 주지 않는 '깨끗한' 함수를 의미합니다.
순수 함수가 되기 위해서는 다음 두 가지 조건을 반드시 만족해야 합니다.
1. 동일한 입력에는 항상 동일한 출력 (Deterministic)
함수가 실행되는 시점이나 환경에 상관없이, **매개변수(Input)**가 같다면 결과값은 늘 똑같아야 합니다.
-
순수 함수 예시:
function add(a, b) { return a + b; }이 함수는 언제 어디서 실행하든
add(2, 3)을 호출하면 무조건 5를 반환합니다. -
비순수 함수 예시:
let tax = 0.1; function calculatePrice(price) { return price + (price * tax); // 외부 변수 tax에 의존 }외부의
tax값이 바뀌면 결과가 달라지므로 순수 함수가 아닙니다.Math.random()이나 현재 시간을 가져오는 함수도 실행할 때마다 결과가 달라지기 때문에 비순수 함수에 해당합니다.
2. 부수 효과가 없음 (No Side Effects)
함수 내부에서 함수 밖의 상태를 변경하거나, 외부와 상호작용(입출력 등)을 하지 않아야 합니다.
-
피해야 할 부수 효과들:
-
외부 변수 수정
-
객체나 배열 등 참조형 데이터의 원본 수정
-
콘솔 출력(
console.log)이나 파일 쓰기 -
네트워크 요청(API 호출)
-
순수 함수의 장점
왜 굳이 이렇게 엄격하게 함수를 만들까요? 그 이유는 다음과 같은 이점 때문입니다.
-
예측 가능성: 코드가 어떻게 동작할지 머릿속으로 그리기가 훨씬 쉬워집니다.
-
테스트 용이성: 외부 환경을 설정(Mocking)할 필요 없이 입력값만 넣으면 되므로 단위 테스트가 매우 간편합니다.
-
디버깅 효율: 함수 내부에서 외부를 건드리지 않으니, 버그가 생겼을 때 추적 범위가 확 좁아집니다.
-
캐싱(Memoization): 동일 입력에 동일 출력이 보장되므로, 계산이 복잡한 경우 결과를 저장해두고 재사용할 수 있어 성능 최적화에 유리합니다.
[!note] 프로젝트를 진행할 때 모든 함수를 순수 함수로 만들 수는 없지만(결국 화면 출력이나 데이터 저장이 필요하니까요), 가능한 많은 로직을 순수 함수로 분리하면 전체적인 코드의 안정성이 크게 올라갑니다.