인프런에서 <함수형 프로그래밍과 JavaScript ES6+> 강의를 듣기 시작했다.
앞으로의 글은 강의를 듣고 + 구글링 하고 + 직접 쳐 본 코드를 토대로 이해한 내용을 종합해 쓰려고 한다.
일급 함수란?
First-Class Function
함수가 '값(variables)'으로 다뤄지는 것
JS에서 함수는 일급 (First Class)이다. 이는 함수를 값으로 다룰 수 있다는건데, 즉 함수를 변수에 담을 수도, 함수의 인자나 결과로도 사용될 수 있다는 뜻이다.
고차 함수란?
Higher-Order Function
다른 함수를 인자(arguments(callbacks))로 사용하거나 결과로 return하는 함수
고차 함수에는 map(), sort(), filter() 등이 있다.
먼저 다른 함수를 인자로 사용하는 경우를 살펴보자.
다음 코드에서 apply1함수는 add2라는 함수를 받아서 실행하고 있다.
<!DOCTYPE html>
<html>
<body>
<script>
const apply1 = (f) => f(1);
const add2 = (a) => a + 2;
console.log(apply1(add2));
console.log(apply1((a) => a - 1));
</script>
</body>
</html>
이 코드를 실행시켜보면 7번 라인의 결과는 3, 8번 라인의 결과는 0이 되는 것을 확인할 수 있다.
다음은 함수를 결과로 return하는 경우(클로저를 만들어 리턴하는 경우)이다.
addMaker 함수는 b=>a+b;라는 함수를 return하고 있다.
(참고로 클로저란 5번라인에서 함수가 a의 값을 계속 기억하고 있다는 뜻이다.)
<!DOCTYPE html>
<html>
<body>
<script>
const addMaker = (a) => (b) => a + b;
const add10 = addMaker(10);
console.log(add10(5));
console.log(add10(10));
</script>
</body>
</html>
이 코드를 실행시켜보면 7번 라인의 결과는 15, 8번 라인의 결과는 20이 되는 것을 확인할 수 있다.
부수 효과란?
Side Effect
함수가 외부에게 영향을 받거나 영향을 주는 것
함수형 프로그래밍에서는 부수 효과를 최소화하려고 노력한다
말이 어려운데, 코드를 통해 확인하면 간단하다.
아래 코드의 함수 f는 a의 값을 바꾸고 있다. 부수 효과가 발생한다.
var a = 10;
function f(b) {
a = b;
순수 함수란?
Pure Function
부수 효과가 없고, 언제 어느 시점에 평가해도 항상 동일한 결과를 만드는 함수
그럼, 순수 함수의 예시를 먼저 확인해보자.
<!DOCTYPE html>
<html>
<body>
<script>
function add1(a) {
return a + 1;
}
console.log(add1(1));
setTimeout(function () {
//1초 기다렸다 실행
console.log(add1(1));
}, 1000);
</script>
</body>
</html>
위 코드를 실행하면 알 수 있듯이 add1함수는 언제 어느 시점에 평가해도 항상 동일한 결과 2를 만드는 순수 함수이다.
그렇다면 순수 함수가 아닌 함수는 어떻게 예를 들 수 있을까?
<!DOCTYPE html>
<html>
<body>
<script>
var a = 1;
function addA(b) {
return a + b;
}
console.log(addA(1));
a = 10;
console.log(addA(1));
</script>
</body>
</html>
위 코드를 실행하면 9라인의 결과로 2, 11라인의 결과로 11이 출력되므로 순수 함수가 아니다.
이후로 덧붙이고 싶은 이야기가 있었는데, 여기에 쓰기엔 길어져 따로 글 하나를 작성했다.
[JavaScript] 프로그래밍 패러다임(Programming Paradigms)과 함수형 프로그래밍(Functional Programming)
강의의 중반부를 들으며 궁금증이 생겨 이리저리 찾아보다가 이제서야 이 강의의 주제인 이 뭔지에 대한 개념이 적립되어 반성하며 이제서야 글을 써본다. "함수형 프로그래밍"이 뭐지? 라는 근
r-ing.tistory.com