TIL

함수형 프로그래밍

KANG_G1 2023. 1. 27. 18:09

오늘은 항상 사용하면서 당연하게만 여겼던 함수형 프로그래밍에 대해 알아보고자 한다.


 함수형 프로그래밍

1. 순수함수

동일한 인자를 투입하면 동일한 결과를 return하기 때문이다

함수가 return값으로 결과를 만드는 것 외에

외부 상태에 영향을 미치는 것을 부수효과라고 하는데,

순수함수는 부수효과가 없는 함수를 말한다

 

 1-1) 예시

function plus(a, b) {

return a + b;

}

위의 함수는 외부 상태에 영향을 미치지도 않고,

인자를 투입하면 그에 따른 결과만 return한다.

그러므로 순수함수라고 볼 수 있다.

 

 1-2) 예시

let c = 30;

function plus(a,b) {

return a+b+c;

}

plus(1, 2); // 33

c = 40;

plus(1,2); // 44

 

변수에 따라 함수의 결과값이 달라진다. 이는 순수함수라 볼 수 없다.

 

 1-3) 예시

let testObj = {num: 10};

function plus(testobj, b) {

testObj += b;

}

// console.log('외부상태 영향을 받기 전 testObj: ',testObj) = 10

plus(testObj, 21);

// console.log('외부상태 영향을 받은 후 testObj: ',testObj) = 31

 

위의 함수는 외부 상태인 testObj의 value값을 변경함으로서 외부 상태에 영향을 미친다.

이러한 함수는 순수함수라고 볼 수 없다.

그렇다면 비슷한 코드로 순수함수를 유지할 수 있을까?

 

 1-4) 예시

let testObj = {num: 10};

function plus(testObj, b) {

return {num: testObj.num + b};

}

// console.log('외부상태 영향을 받기 전 testObj: ',testObj) = 10

plus(testObj, 21);

// console.log('외부상태 영향을 받은 후 testObj: ',testObj) = 10

const testObj2 = plus(testObj, 21);

// console.log('testObj2: ',testObj) = 31;

 

testObj 원본 객체를 변경하는 것이 아닌 새로운 객체를 생성함으로서

순수함수를 유지하였다.

새로운 객체를 생성한 것을 변수에 할당해 체크해봤을 땐

31이라는 value값이 나오는 것을 보고 솔직히 신기했다.

사실 당연한 결과임에도 이 결과를 보고 신기한 반응을 보였다는 것이 부끄럽지만.

 

여기서 순수함수의 중요한 점을 찾을 수 있었는데, 순수함수는 평가 시점이 중요하지 않다는 것이다.

1-2 예제에서 변수의 선언에 따라 함수의 return값이 변화하는 것을 볼 수 있는데,

평가 시점이 중요하게 작용했기에 서로 다른 결과가 나오게 된 것이다.

 

반대로 1-1 예제에서는 언제 실행을 시키던 동일한 결과가 나오게 된다.

평가 시점에 상관없이 함수가 동일한 결과를 return하는 것으로 1-1 예제는 순수함수라고 볼 수 있는것이다.

 

 

 정리

함수형 프로그래밍에서는 값을 변형해나가거나 값을 다룰 때 원래 초기화되어있는 값을 변화시키지 않고

외부의 상태를 변화시키지 않고, 인자로 받은 값을 직접 변경시키지 않으며 값을 다뤄나가는 프로그래밍이다.

즉, 순수함수의 조합으로 프로그래밍을 전개해나가는 것이 좋은 함수형 프로그래밍이라는 것이다.