오늘은 항상 사용하면서 당연하게만 여겼던 함수형 프로그래밍에 대해 알아보고자 한다.
함수형 프로그래밍
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 예제는 순수함수라고 볼 수 있는것이다.
정리
함수형 프로그래밍에서는 값을 변형해나가거나 값을 다룰 때 원래 초기화되어있는 값을 변화시키지 않고
외부의 상태를 변화시키지 않고, 인자로 받은 값을 직접 변경시키지 않으며 값을 다뤄나가는 프로그래밍이다.
즉, 순수함수의 조합으로 프로그래밍을 전개해나가는 것이 좋은 함수형 프로그래밍이라는 것이다.
'그날의 배움' 카테고리의 다른 글
.gitignore가 적용되지 않는다면 (0) | 2023.02.14 |
---|---|
일급함수 (0) | 2023.01.27 |
Web Socket (0) | 2023.01.26 |
Module & Bundler (0) | 2023.01.25 |
defer (0) | 2023.01.17 |