동일한 입력값에 대해 항상 같은 결과를 반환하며 외부 상태를 변경하지 않는 함수이다.
즉, 외부 변수를 참조하지 않고, 또 외부 변수를 참조해서 직접 변경하지도 않아야 한다.
만약 외부의 값을 참조하고자 한다면, 그 값은 상수여야 한다.
결국 상수 혹은 매개변수만을 이용한 계산을 해야한다.
외부에 영향을 줄 수 있는 것은 리턴값 뿐이다.
순수 함수의 장점은 예측이 쉽고, 부작용이 적어, 병렬 처리가 용이하다는 것이다.
동일한 입력값에 대해 항상 같은 결과를 반환하는 특성이 참조 투명성이다.
정확히는 표현식을 그 값으로 치환해도 프로그램의 의미가 바뀌지 않는 성질이다.
fucnA(3) == 5라면
코드 내 모든 5 대신 fucnA(3)를 넣어도 동일하게 동작해야 한다는 것이다.
참고: https://ko.wikipedia.org/wiki/참조_투명성
함수의 부작용은 일반적으로 함수가 함수 외부의 상태를 변경하는 것을 의미한다.
즉, 함수 내부에서 외부의 변수를 call by reference로 접근한 다음에 그 안의 값을 변경하는 것이다.
부작용이라고 하는 이유는 함수를 호출했을 때, 함수가 영향을 미치는 부분에 대한 예측이 어려워지기 때문이다.
반면 순수 함수의 경우 리턴값으로만 외부와 소통하기 때문에, 호출부에서 리턴값을 받는 변수만 주시하면 된다.
결과적으로 예상치 못한 변화가 일어나지 않고, 결과 예측이 간단해진다.
순수함수는 외부 변수에 직접 접근하지 않는다. 오로지 call by value만을 지향한다. 물론 JS나 Java 같이 포인터를 사용하지 않는 언어의 경우, 어쩔 수 없이 call by reference로 매개변수를 전달한다.
이러한 경우, 함수 내부에서 해당 변수의 값만 복사해서 사용해야 한다.
function(obj) {
let objCopy = JSON.parse(JSON.stringify(obj))
...
return objCopy
}
위의 경우 원본인 obj에는 아무런 영향을 끼치지 않는다.
순수 함수는 부작용이 없고, 전달인자의 데이터 불변성을 보장하는 특성상 병렬처리에 유지한다. 외부의 변수 의존성이 없기 때문에, 동기화로 인한, “읽기 중 쓰기, “쓰기 중 읽기, ”쓰기 중 쓰기” 같은 문제들이 발생하지 않는다.