아 그거 뭐였지

[JavaScript] 자바스크립트 순수함수 본문

JavaScript

[JavaScript] 자바스크립트 순수함수

승발자 2022. 12. 25. 20:01
728x90
반응형

서론

자바스크립트를 끄적인지 어언 2년정도 흐른것같다. 기능을 구현하는데 처음 마주했을때처럼 막연한 두려움은 많이사라졌고 대부분의 기능들을 구현하고 페이지를 제작할수있게되었다. 기능구현에 시간을 쫓기고나니 내가 정말 자바스크립트를 제대로 이해하고있는게 맞나? 라는 생각이 문득문득들었다. 그래서 자바스크립트 기본기를 다지고자 회사에서 동료와함께 자바스크립트 인강을 보며 학습하기로했다. 그중의 첫걸음인 순수함수에 대해서 알아보고자한다.

 

순수함수란?

들어온 인자가 같을때 항상 동일한 결과를 리턴하는 함수이다.
함수가 받은 인자외에 다른 외부에 상태에 영향을 끼치지않고 리턴값 외에는 외부와 소통하지 않는 함수이다.
어느 시점에 평가하던 동일한 결과를 리턴하는 함수이다.

 

말로만 들으면 감이 잘 안잡히니 순수함수와 순수함수가 아닌 함수를 코드도 같이 보도록 하자.

////// 순수함수 
function add(a,b){
	return a+b
}

console.log(add(1,2));
console.log(add(1,2));
console.log(add(1,2));
// 3 3 3 

////// 비순수함수
let c = 10;
function notPure(a,b){
	return a+b+c
}

console.log(notPure(1,2));
console.log(notPure(1,2));
c=5;
console.log(notPure(1,2));
// 13 13 8


////// 비순수함수
let d = 10;
function changeStatus(a,b){
	d = b;
	return a+b
}

console.log(d);
console.log(changeStatus(1,2));
console.log(d);
console.log(changeStatus(1,2));
console.log(changeStatus(1,2));
// d출력값
// 10 2

 add함수는 인자가같을때 언제나 동일한 값을 리턴하므로 add는 순수함수라고 할수있다.

 

notPure함수는 함수자체에서는 외부의 값이 (변수 c) 변하지 않는 상수값이라면 항상 동일한 결과값을 리턴할테니 순수함수 였을테지만 해당 예시와 같이 외부의 상태에의해서 결과값이 바뀌면, 동일한 결과값을 리턴하지 않으므로 순수함수가아니다.

 

changeStatus함수는 함수의 결과값은 항상 동일하지만 외부의 값 (변수 d)를 변경 시키므로 이것은 순수함수가 아니다.

 

왜 순수함수가 중요하며 함수는 항상 동일한 결과값을 보장해야만 하는것인가? 에 대한 의문이 생긴다.

 

결론

프로젝트를 하다보면 귀찮거나, 시간이없어서 함수 내부에서 외부값을 바꾸거나 외부의 값에의해서 함수 내부를 변경하는 경우가 있어도 그냥 넘어가고는 한다. 이런식의 함수들이 쌓이면 유지보수 하기에도 굉장히 힘들고 해당 함수를 재사용하기에도 제약이걸린다. 비슷한 기능을 하는 함수를 재사용하고 싶은데 재사용했다가는 해당 함수와 엮여있는 변수들과 상태들이 가져야할값들이 변경되버리기때문이다. 함수의 종속성이 강해지는 것이다.

함수형 프로그래밍의 장점인 조합성과 안전성을 잃어버리게 되는 셈이다.

 

추가로 비순수함수인 notPure함수를 조금더 살펴보면

////// 비순수함수
let c = 10;
function notPure(a,b){
	return a+b+c
}

console.log(notPure(1,2));
console.log(notPure(1,2));
c=5;
console.log(notPure(1,2));
// 13 13 8

변수 c가 언제 변경되냐에 따라서 결과가 달라진다. c의 값이 변경되기전에는 동일한 값을 반환하다가 c의값이 변경된 후에 함수가 호출되면 동일한 값을 반환하지 못하는것이다. 함수 평가 시점에도 영향을 받는 함수가 되버린다.

순수함수는 어느 시점에 평가하던 결과값이 같아야한다.

 

내 프로젝트의 코드들을 돌이켜보면 함수형 프로그래밍을 한답시고 이런 순수함수를 지키지 않은 함수들이 많아 반성하게된다. 어쩌면 순수함수라는 의미조차 모르고 코딩을 한것같다. 리팩토링을 할때나 앞으로 코드작성을 할때는 순수함수에 유의하면서 코딩을 해야겠다.

 

마지막 정리로 순수함수의 조건에대해 세줄 요약 하자면 아래와같다.

  1. 함수는 동일한 인자값에 대해서 항상 동일한 결과값을 반환해야한다.
  2. 함수가 받은 인자값 외에는 외부의 상태에 영향을 끼쳐서는 안된다.
  3. 평가시점에 구애받지 않아야한다.
  4. 메리크리스마스
728x90
반응형
Comments