코딩 하는 가든

함수형 프로그래밍 - 순수함수 본문

함수형프로그래밍

함수형 프로그래밍 - 순수함수

가든리 2020. 3. 11. 23:50

순수함수

순수함수란?

 순수함수란 부수 효과가 없는 수학적 함수를 말한다. 조금 쉽게 풀어서 말해 보자면 동일한 인자에 대해서는 항상 동일한 값을 리턴 하고, 함수 외부에 어떠한 영향도 미치지 않는 함수를 말한다.

 

 함수형 프로그래밍에서는 조합성을 강조하는데, 이는 모듈화(Modularity) 수준을 높이자는 것이다. 소프트 웨어 공학 시간에 모듈화에 따른 응집도(Cohesion)와 결합도(Coupling)의 개념을 잘 생각해보며 이 함수형 프로그래밍이 어떤 생각을 갖고 시작되었는지 한번 생각해 보는 것도 좋을 것 같다.

 

 요점은 모듈화 수준을 높임으로써 생산성, 안정성을 높이며 프로그래밍을 하자는 것이다.

 

순수함수의 예

function add(a, b) {
	return a + b;
}

add(10, 5) // 결과 : 15
add(10, 5) // 결과 : 15
add(10, 5) // 결과 : 15

 위의 add 함수의 경우 외부의 어떤 영향도 미치지 않으며 동일한 인자에 대해 항상 동일한 값을 돌려주니 순수함수라 할 수 있다.

 

 그럼 순수함수가 아닌 함수는 어떤 함수일까

var c = 10;
function add2(a, b) {
	return a + b + c;
}

add2(10, 5) // 결과 : 25
add2(10, 5) // 결과 : 25
add2(10, 5) // 결과 : 25
c=20;
add2(10, 5) // 결과 : 35
add2(10, 5) // 결과 : 35
add2(10, 5) // 결과 : 35

 위의 add2함수의 경우 같은 인자를 주어도 c의 값에 따라 결과가 달라지므로 순수함수가 아니라고 할 수 있다.

 

순수함수가 아닌 다른 예를 보자.

var obj1 = {val: 10};
function add3(obj, b) {
	obj.val += b;
}

// obj1.val = 10
add3(obj1, 10)
// obj1.val = 20

 위의 add3 함수의 경우 함수 외부에 있는 obj1 이라는 객체의 값을 직접 변경 한다. 이 경우 외부에 미치는 영향이 있기 때문에 순수함수가 아니라고 할 수 있다. 그럼 이러한 함수형 프로그래밍에서는 객체를 어떻게 다룰까?

 

 

 함수형 프로그래밍에서 객체를 다루고 싶으면 다음과 같이 원본 객체의 값을 참조하여 같은 형태의 객체를 만들어 리턴 해주면 된다. 결과적으로 obj1의 val 값은 유지 되며 함수 외부에 미치는 영향이 없으므로 아래와 같은 함수는 순수함수라 할 수 있다.

var obj1 = {val: 10};
function add4(obj, b) {
    return {val: obj.val += b }
}

// obj1.val = 10
add3(obj1, 10)
// obj1.val = 10

 

순수함수를 쓰는 이유?

 위에서 보았듯 순수함수가 아닌 함수를 사용하면 외부의 값이 달라지거나 외부에 값에 의해 함수의 결과가 영향을 받는다. 이럴 경우 함수의 평가 시점이 중요해 지게 되는데 개발자의 실수로 인해 예상치 못한 일이 일어나거나 혹은 알아치라지 못하는 새에 그런 일들이 벌어질 수 있다.

 

 하지만 순수함수는 평가시점에 관계없이 동일한 인자에 결과를 돌려주며 함수 와 관계 없는 것들은 영향을 받지 않기 때문에, 함수 자체를 인자로 넘기거나 다른 쓰레드에서 실행 되는 등의 여러가지 상황에서 안전성을 보장받게 된다. 이렇기 때문에 순수함수를 작성하면 개발자가 함수를 다루기 쉬워지고 개발 효율 (생산성, 안정성 등)을 높일 수 있게 된다.