ETC/알고리즘 & 문법

[FP] 순수 함수와 비 순수 함수

장바금 2022. 10. 11. 23:12

함수형프로그래밍의 핵심 중 하나는 순수 함수이다.

순수 함수란 상위 혹은 외부의 상태에 영향을 받지 않도록 부수 효과가 없고 동일한 인자가 주어졌을 때 항상 같은 값을 반환하는 함수이다.

이러한 특징은 평가 시점을 따질 필요가 없다. 이유는 동일한 인자를 함수에게 주었을 때 다른 값이 나온다면 함수를 평가할 시점이 애매해지지만 동일한 인자가 주어졌을 때 항상 같은 값을 반환한다면 어디서든 평가가 가능하기 때문이다.

 

부수 효과는 상위 혹은 외부의 상태를 변경하는 것을 말한다.

 

 순수 함수와 비 순수 함수 

순수 함수

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

이전 예시와 동일하게 위 함수도 외부 객체의 값을 직접 변경한다. 이 또한 순수 함수가 될 수 없다.