순수함수는 아래와 같은 특징을 가지고 있다.
1. 입력값에만 의존한다.
순수 함수는 오직 입력값에만 의존하므로, 입력값이 동일하다면 항상 동일한 출력값을 반환한다. 이는 함수가 어떤 시점에 호출되는지와 상관없이 동일한 결과를 보장한다.
2. 부수효과(side effect)가 없다.
순수 함수는 외부의 상태를 변경하지 않는다. 따라서 함수 호출로 인해 프로그램의 다른 부분에 영향을 주는 부수 효과가 없어 평가 시점에 관계없이 항상 일관된 결과를 얻을 수 있다.
3. 테스트 하기에 용이하다.
순수 함수는 동일한 입력값을 주면 항상 동일한 결과를 반환하므로, 테스트하기가 매우 용이하다. 이는 함수의 동작을 검증하는데 도움이 된다.
4. 병렬 처리와 캐싱
순수함수는 동일한 입력에 대해 항상 동일한 출력을 보장하므로, 여러 스레드나 프로세스에 안전하게 병렬 처리할 수 있습니다. 또한 결과를 캐싱하여 동일한 입력에 대한 계산을 다시 수행하지 않고 저장할 수 있다.
또한 이러한 순수함수란 개념이 만들어지게 된 이유는 뭘까?
바로 비순수 함수를 사용함으로써 오는 아래와 같은 문제들 때문이다.
1. 부수효과(side effect)
외부 상태를 변경하거나 외부 자원에 접근할 수 있는것을 말한다. 이는 함수의 동작을 예측하기 어렵게 만들며, 함수 호출로 인해 다른 부분에 예상치 못한 영향을 줄 수 있다.
2. 복잡성 증가
외부 상태에 의존하는 함수는 해당 상태의 변화를 추적하고 이해해야 한다. 이는 코드의 복잡성을 증가시킬 수 있으며 디버깅 및 유지 보수를 어렵게 만든다.
3. 테스트 어려움
외부 상태의 변화에 따라 결과가 달라져 동일한 입력값에 대해 항상 동일한 결과를 보장하지 않는다. 이와 같은 이유로 테스트 하기가 어려워진다.
4. 병렬 처리 문제
여러 스레드 또는 프로세스 간에 안전하게 병렬 처리하기 어렵다.
5. 캐싱의 어려움
입력값만으로 결과를 결정하지 않기 때문에 캐싱이 어렵다. 외부 상태의 변화에 따라 결과가 달라질 수 있으므로 캐시된 결과가 업데이트 되어야 하는 경우가 생길 수 있다.
6. 프로그램의 예측 불가능성
외부 상태의 변화에 따라 함수의 결과가 달라져 코드가 원래의 의도대로 동작하지 않을 수 있어 프로그램의 동작을 예측하기 어렵게 만든다.
위와 같은 이유로 비순수함수를 사용 할 시에 비효율적인 작업이 이루어지고 이는 개발비용 증가로 이어지기 때문이다. 그래서 최근 이러한 순수함수를 만들어 모듈화 수준을 높이는 프로그래밍 방법인 함수형 프로그래밍이라는 개념이 생겨났다.