함수형 프로그래밍에서는
어떤 외부 상태에 의존하지도 않고 변경하지도 않는, 즉 부수 효과가 없는 함수를 순수 함수라고 한다.
순수 함수는 함수의 결과가 오직 인수에 의해서만 결정된다.
만약 외부 상태에는 의존하지 않고 함수 내부 상태에만 의존한다 해도 그 내부 상태가 호출될 때마다 변화하는 값(ex: 현재 시간) 이라면 순수 함수가 아니다.
외부 상태에는 전역 변수, 서버 데이터, 파일, console. DOM 등이 있다.
var count = 0; // 현재 카운트를 나타내는 상태
// 순수 함수 increase는 동일한 인수가 전달되면 언제나 동일한 값을 반환한다.
function increase(n){
return ++n;
}
// 순수 함수가 반환한 결과값을 변수에 재할당해서 상태를 변경
count = increase(count);
console.log(count); // 1
count = increase(count);
console.log(count); // 2
이 예시를 해석하면
변수에 count를 정의하고 increase 함수는 입력한 동일한 값을 반환하는데 ++n 이기 때문에
increase 함수를 호출할 때 마다 변수 count에 1씩 증가된 값을 할당한다.
하지만 increase 함수는 외부 상태를 변경하지 않으므로 순수 함수이다.
또한 count = increase(count); 를 여러번 호출해도 똑같은 결과가 나오긴 한다.
하지만 더 나은 유지보수를 위해 console.log(count); 를 사용하는 것이 나을 것 같다.
순수 함수의 반대로 외부 상태에 의존하거나 외부 상태를 변경하는, 즉 부수 효과가 있는 함수를 비순수 함수라고 한다.
비순수 함수는 동일한 입력에 대해서 항상 같은 결과를 반환하지 않을 수 있기 때문에, 예측이 어렵고 테스트하기 어려운 코드를 만들 수 있다.
비순수 함수는 동일한 입력에 대해 항상 같은 결과를 반환하지 않을 수 있다.
var count = 0; // 현재 카운트를 나타내는 상태: increase 함수에 의해 변화한다.
// 비순수 함수
function increase(){
return ++count; // 외부 상태에 의존하며 외부 상태를 변경한다.
}
// 비순수 함수는 외부 상태(count)를 변경하므로 상태 변화를 추적하기 어려워진다.
increase();
console.log(count); // 1
increase();
console.log(count); // 2
위 예시와 같이 인수를 전달받지 않고 함수 내부에서 외부 상태를 직접 참조하면 외부 상태에 의존하게 되어
변환값이 변할 수 있고, 외부 상태도 변경할 수 있으므로 비순수 함수가 된다.
함수 내부에서 외부 상태를 직접 참조하지 않더라도 매개변수를 통해 객체를 전달받으면 비순수 함수가 된다.
함수형 프로그래밍은 순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 부수 효과를 최소화해서 불변성을 지향하는 프로그래밍 패러다임이다.
또한 함수형 프로그래밍은 결국 순수 함수를 통해 부수 효과를 최대한 억제해 오류를 피하고 프로그램의 안정성을
높이려는 노력의 일환이라 할 수 있다.
'JavaScript' 카테고리의 다른 글
javaScript-스코프2 (지역 스코프, 전역 스코프) (0) | 2023.02.28 |
---|---|
javaScript-스코프 (0) | 2023.02.28 |
javaScript-함수10 (콜백 함수) (0) | 2023.02.22 |
javaScript-함수9 (중첩 함수) (0) | 2023.02.21 |
javaScript-함수8 (재귀 함수) (0) | 2023.02.21 |