본문 바로가기

Javascript/함수형 프로그래밍

순수 함수란? (함수형 프로그래밍의 뿌리, 함수의 부수효과를 없앤다)

반응형

함수형 프로그래밍

함수형 프로그래밍 : 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임

* 부수 효과 = 외부의 상태를 변경하는 것 또는 함수로 들어온 인자의 상태를 직접 변경하는 것

* 순수 함수 = 부수효과가 없는 함수 즉, 어떤 함수에 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수

  + 외부의 상태를 변경하지 않는 함수

순수 함수와 순수함수가 아닌것

1
2
3
4
function add(a,b){
    return a + b;
}
console.log( add(10,5) );



add는 순수함수다.

언제, 어디서 실행해도 add(10,5)는 항상 15를 리턴하고 외부 상태를 변경하지 않았기 때문


1
2
3
4
5
6
7
8
9
var c = 10;
function add2(a,b){
  return a + b + c;
}
console.log(add2(10,3));
console.log(add2(10,3));
= 20;
console.log(add2(10,3));
// 순수함수 아님 c가 만약에 상수면 add2도 순수함수.



add2는 순수 함수가 아니다.

함수내에서 외부의 c라는 변수 값이 변하면 결과값도 달라지기 때문.

만약 c가 상수 즉, 변하지 않는 수라면 add2는 순수 함수다.

외부의 값을 참조해도 결과값이 동일한 인자에 대해서 같기 때문이다. (즉, 리턴 값을 보장해주기 때문)


1
2
3
4
5
6
7
8
var c = 20;
function add3(a,b){
  c = b; // 외부상태에 영향을 미치네? = 부수효과
    return a + b;
}
console.log('c : ',c);
console.log(add3(20,30));
console.log('c : ',c);



add3는 순수 함수가 아니다. 함수가 외부의 값을 변경하는 코드를 가지고 있기 때문.

리턴하는 값이 항상 일정하더라도 외부의 상태를 변경하는 코드가 있으면 순수 함수가 아니다.


1
2
3
4
var obj1 = {val : 10};
function add4(obj, b){
   obj.val += b;
}



add4는 순수 함수가 아니다. 객체를 인자로 받아서 그 상태를 변경 시키는 코드를 가지고 있기 때문.

그렇다면 객체는 어떻게 순수 함수로 나타낼까?


1
2
3
4
5
6
7
8
var obj1 = {val : 10};
function add5(obj, b){
    return { val: obj.val + b }// obj의 val만 참조만 할 뿐 변경없음.
}
console.log(obj1.val);//변경 전 10
var obj2 = add5(obj1,5);
console.log(obj1.val);//변경 후 10
console.log(obj2.val);//15



add5는 순수 함수다.

위 처럼 객체의 값을 참조만 하는 식으로 작성하면된다.

이렇게 순수 함수로 만들고, 객체 값(ex. obj1.val)의 변경이 필요하면 함수 외부에서 객체가 값을 적용하는 방식(ex. obj2)으로 사용 가능하다.


요약 및 정리

위의 add4 함수 처럼 코딩하는 것이 절대 나쁘다는 건 아니다. (분명 함수형프로그래밍에도 장단점이 있다.)

이런 스타일로 코딩하는 것이 함수형 프로그래밍이라는 패러다임일 뿐이다.

모듈화 수준이 높으면 재사용성이 높고 좋은 프로그래밍이라 할 수 있다.


=> 궁극적으로 평가 시점이 무관하다는 특성으로 효율적인 로직을 구성하는 것이 함수형 프로그래밍 패러다임.  


"순수 함수는 평가 시점이 중요하지 않다.(=언제, 어디서든 무관)"

"순수 함수는 외부의 상태를 변경하지 않으면서 동일한 인자에 대해 항상 똑같은 값을 리턴하는 함수다."

반응형