순수 함수(Pure Function)란 무엇인가?
순수 함수(Pure Function)는 결정론적(deterministic) 함수를 의미합니다. 즉, 동일한 입력값을 넣을 때마다 항상 동일한 출력값을 반환하는 함수입니다. 수학적으로 표현하면 잘 정의된(well-defined) 함수와 같은 개념입니다.
순수 함수는 다음과 같은 특징을 가집니다.
- 오직 자신의 매개변수(인자)에만 의존합니다.
- 함수 외부 범위에 있는 변수를 변경하려고 하지 않습니다.
- 부작용(side effects)을 일으키지 않습니다.
순수 함수가 아닌 경우 1: 외부 변수에 의존하는 함수
아래 예제는 순수 함수가 아닙니다. 자신의 매개변수가 아닌, 함수 외부 범위에 있는 변수(val1과 val2)에 의존하고 있기 때문입니다.
<html>
<body>
<script>
let val1 = 6;
let val2 = 4;
function pure() {
return val1 * val2;
}
document.write(pure());
</script>
</body>
</html>실행 결과
24
순수 함수가 아닌 경우 2: 매개변수와 외부 변수를 함께 사용하는 함수
다음 예제의 함수는 비록 자신의 매개변수(arg)를 사용하지만, 동시에 외부 변수(val)에도 의존하고 있습니다. 따라서 이 역시 순수 함수가 아닙니다.
<html>
<body>
<script>
function pure(arg) {
let val = 100;
return val * arg;
}
document.write(pure(2));
</script>
</body>
</html>실행 결과
200
순수 함수의 올바른 예
다음 예제는 진정한 순수 함수를 보여줍니다. 함수가 작업을 수행하는 과정에서 외부 변수가 전혀 관여하지 않으며, 오직 전달받은 매개변수만으로 결과를 계산합니다. 따라서 동일한 인자를 전달하면 언제나 동일한 출력값을 반환합니다.
<html>
<body>
<script>
function pure(arg) {
return 4 * arg;
}
document.write(pure(2));
</script>
</body>
</html>실행 결과
8
왜 순수 함수를 사용해야 할까요?
순수 함수는 다음과 같은 실질적인 장점이 있습니다.
- 테스트 용이성: 입력과 출력이 명확하게 결정되므로 단위 테스트(Unit Test) 작성이 매우 쉽습니다.
- 예측 가능성: 외부 상태에 영향을 받지 않기 때문에 코드의 동작을 예측하기 쉽고 디버깅이 간편합니다.
- 캐싱(Memoization): 동일한 입력에 대해 항상 같은 결과를 반환하므로, 한 번 계산한 결과를 캐싱하여 성능을 최적화할 수 있습니다.
- 동시성 안전성: 공유 상태를 변경하지 않으므로 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
React, Redux 등 현대적인 자바스크립트 라이브러리와 프레임워크에서도 순수 함수 개념은 핵심 원칙으로 활용되고 있으므로, 반드시 익혀두는 것이 좋습니다.