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