함수형프로그래밍의 핵심 중 하나는 순수 함수이다.
순수 함수란 상위 혹은 외부의 상태에 영향을 받지 않도록 부수 효과가 없고 동일한 인자가 주어졌을 때 항상 같은 값을 반환하는 함수이다.
이러한 특징은 평가 시점을 따질 필요가 없다. 이유는 동일한 인자를 함수에게 주었을 때 다른 값이 나온다면 함수를 평가할 시점이 애매해지지만 동일한 인자가 주어졌을 때 항상 같은 값을 반환한다면 어디서든 평가가 가능하기 때문이다.
부수 효과는 상위 혹은 외부의 상태를 변경하는 것을 말한다.
순수 함수와 비 순수 함수
순수 함수
function add(a, b) {
return a + b;
}
console.log(add(10, 5)); // 15
console.log(add(10, 5)); // 15
console.log(add(10, 5)); // 15
위의 예시를 보면 외부의 영향을 주지 않고 동일한 인자에 대해 항상 동일한 반환 값을 보여준다.
객체를 이용한 다른 예시를 보자
var obj = { val: 10 }
function add(obj, b){
return { val: obj.val + b }
}
console.log(obj.val) //10
var obj2 = add(obj, 20)
console.log(obj.val) //10
console.log(obj2.val) //30
위 예시의 add함수는 외부 객체인 obj의 상태를 변형하지 않고 인자로 받은 값 또한 변형시키지 않으면서 반환 값을 다룬 것으로 보아 이 또한 순수 함수라 할 수 있다.
비 순수 함수
비 순수 함수는 부수 효과를 일으킨다.
var c = 20
function add(a, b){
c = b
return a + b
}
console.log('c: ', c) // c: 20
console.log(add(20, 30)) // 50
console.log('c: ', c) // c: 30
위 예시를 보면 비 순수 함수 add는 외부의 상태인 c를 변형시킨다. 이는 순수 함수 조건에 위배된다.
var obj = { val: 10 }
function add(obj, b){
obj.val += b
}
console.log(obj.val) //10
add(obj, 20)
console.log(obj.val) //30
이전 예시와 동일하게 위 함수도 외부 객체의 값을 직접 변경한다. 이 또한 순수 함수가 될 수 없다.
'ETC > 알고리즘 & 문법' 카테고리의 다른 글
[JavaScript] ES6 Map() (0) | 2022.11.16 |
---|---|
[JavaScript] Convert ES6 Iterable to Array (0) | 2022.11.16 |
[TypeScript] Generics (0) | 2022.07.13 |
[JavaScript] Computed Property Name (0) | 2022.07.12 |
[TypeScript] interface (0) | 2022.07.11 |