Hengxi's 개발 블로그

[JS] 다시보는 자바스크립트 - 함수형 프로그래밍 1 본문

개발/JavaScript

[JS] 다시보는 자바스크립트 - 함수형 프로그래밍 1

HENGXI 2022. 10. 19. 14:57

함수형 프로그래밍 정의

함수형 프로그래밍은 성공적인 프로그래밍을 위해 부수효과를 미워하고 조합성을 강조하는 프로그래밍 패러다임이다.

  • 부수 효과를 미워한다 -> 순수 함수를 만든다.
  • 조합성을 강조한다 -> 모듈화 수준을 높인다.
  • 순수 함수 -> 오류를 줄이고 안정성을 높인다.
  • 모듈화 수준이 높다 -> 생산성을 높인다.

순수 함수

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

함수 add는 순수 함수이다. 

그 이유는?

1. 항상 동일한 인자를 주면 동일한 결과를 return 하기 때문

2. 부수효과가 없기 때문(함수가 return 값으로 결과를 만드는 것 외에 외부의 상태에 영향을 미치는 것을 부수효과라고 한다)

 

순수 함수가 아닌 함수

동일한 인자를 주었지만 결과 값이 달라지는 경우

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

console.log( add2(10, 2) );  // 22
console.log( add2(10, 3) );  // 23
console.log( add2(10, 4) );  // 24

c = 20;

console.log( add2(10, 2) );  // 32
console.log( add2(10, 3) );  // 33
console.log( add2(10, 4) );  // 34

부수효과를 일으키는 경우(외부의 상태를 변경, 들어온 인자의 상태를 직접 변경)

var c = 20;

function add3(a, b) {
	c = b;
    return a + b;
}

console.log(c); // 20
console.log(add3(20, 30)); // 50
console.log(c); //30

결과 값 외에 직접적으로 외부 상태에 관여하고 있고, 이러한 함수를 부수효과가 있는 함수라고 한다.

하나의 예를 더 보자

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

console.log(obj1.val); // 10
add4(obj, 20);
console.log(obj1.val); // 30

add4 함수를 실행하고 나면 obj의 val 의 값이 변경되게 된다. 넘어온 인자의 값을 직접적으로 바꾸고 있기 때문에 순수 함수가 아니다.

객체에서 순수 함수 사용하기

보통 데이터를 다룰 때 우리는 객체를 많이 다루게 된다. 그렇다면 순수 함수는 객체의 상태를 변경하려면 어떻게 해야 할까?

원래 있던 값을 두고 새로운 값을 복사해서 사용하면 된다.

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

console.log( obj1.val ); // 10
add5(obj1, 20);
console.log( obj1.val ); // 10
 
var obj2 = add5(obj1, 20);
console.log( obj2.val ); // 30

함수형 프로그래밍에서는 값을 다룰 때나 변형해 나갈 때, 위에서 언급했던 것처럼 원래 초기화되어 있는 값, 인자로 받은 , 외부의 상태를 변경하지 않으면서 값을 다뤄나가는 프로그래밍이다. 

 

함수형 프로그래밍의 또 하나의 특징

순수 함수는 평가 시점이 중요하지 않다! 이것이 함수형 프로그래밍이 중요한 이유이자, 함수형 프로그래밍에서 아주 중시하는 개념이기도 하다.

 

위에 add2 함수를 다시 보자, 외부 값을 참조하고 있기 때문에 동일한 인자를 준다고 항상 동일한 값을 return하지 않는다. 즉, add2() 는 어느 시점(위에서는 c가 20으로 바뀐 시점)에 인자를 넣어주었냐에 따라서 값이 달라진다는 것이다. 

 

반대로 순수 함수는 언제 실행해도 항상 동일한 값을 return하기 때문에 순수 함수가 아닌 함수보다 조합성을 훨씬 강조시킬 수 있다. 그렇기에 굉장히 안전하고 다루기 쉬운 함수가 된다!

 

또한, 순수 함수를 통해서 조합성을 강조하는 이유는 평가 시점을 다루는 것으로 다양한 로직들을 만들고 다양한 이점들을 만들고자 하는 것인데 이러한 설명을 위해서 일급 함수의 개념이 필요하다.

 

일급 함수란 함수를 값으로 다룰 수 있다는 것으로 뒤에 이어서 정리해보자. 

Comments