<참고강의>
함수형 프로그래밍이란?
성공적인 프로그래밍을 위해 부수효과를 미워하고 조합성을 강조하는 프로그래밍 패러다임
- 부수효과를 미워한다 -> 순수함수를 만든다 -> 오류를 줄이고 안정성을 높인다
※ 순수함수 : 부수효과가 없는 함수(동일한 인자를 넣으면 동일한 결과를 냄), 평가시점이 중요하지 않다
※ 부수효과 : 외부의 상태를 변경하는 것 - 조합성을 강조한다 -> 모듈화를 높인다 -> 생산성을 높인다
"함수형 사고방식은 문제의 해결방법을 동사(함수)들로 구성(조합)하는 것"
// 순수함수의 예시
function add(a, b) {
return a + b;
}
console.log(add(1,2)); // 3
console.log(add(1,2)); // 3
console.log(add(1,2)); // 3
// 얼핏 보면 비슷해 보이지만 밑의 코드는 c라는 인자를 통해 부수효과를 일으키기 때문에 순수함수가 아니다
function add2(a, b) {
return a + b + c;
}
var c = 10;
console.log(add2(1,2)); // 13
console.log(add2(1,2)); // 13
console.log(add2(1,2)); // 13
var c = 20;
console.log(add2(1,2)); // 23
console.log(add2(1,2)); // 23
console.log(add2(1,2)); // 23
일급함수
JavaScript의 특징 중 하나는 함수가 객체이고 일급함수이다
※ 일급함수 : 함수를 언어에서 값으로 다룰 수 있다는 뜻.
(함수를 변수에 담을 수 있고, 변수에 담은 함수가 값으로 다뤄질 수 있기 때문에, 인자로 넘겨진다거나,
다른 함수에게 인자로 넘겨져서 그 인자로 넘겨진 함수를 다른 함수가 실행할 수 있다거나 하는 것들)
// 일급함수
var f1 = function(a) { return a * a; }
console.log(f1(2)); // 4
var f2 = f1;
console.log(f2); // f(a) { return a * a; }
function f3(f) {
return f();
}
console.log( f3(function() { return 10; }));
// 10
예시로 add_maker라는 함수가 있다
※ add_maker는 함수를 리턴하는 함수라는 뜻
function add_maker(a) {
return function(b) { // 클로저(closure)
return a + b;
}
}
var add10 = add_maker(10);
console.log(add10); // f(b) { return a + b; } << 이곳에서 이미 a는 10이 채워진 상태이다
console.log(add10(20)); // 30 << 남은 b 인자가 20으로 채워지면서 결과값 30이 출력이 된다
일급함수와 클로저(Closure)가 동시에 사용되었다. 또한 익명함수의 a가 전혀 변경이 되지 않으므로(참조만 함)
return 되는 익명함수는 순수함수라는 것에 신경을 써야한다
※ 클로저(Closure) : 자신이 생성될 때의 환경(렉시컬 스코프(환경))을 기억하는 함수
※ 자유변수 (Free variable) : 클로저를 포함하고 있는 외부함수의 인자, 지역 변수를 말함
외부함수가 종료된 이후에도 사용할 수 있음
(단, 외부에서 직접 접근할 수 없고, 항상 클로저를 통해서만 사용할 수 있다)
※ 스코프 (Scope) : 변수에 접근할 수 있는 범위 (전역(global), 지역(local))
※ 렉시컬 스코프 (Lexical Scope) : 함수를 어디서 호출하는지가 아니라, 어디에 선언하였는지에 따라 결정되는 것
(함수를 어디서 선언하였는지에 따라 상위 스코프를 결정한다는 뜻)
(다른 말로 정적 스코프(Static Scope)라고도 함)
add10은 언제 어디서 불러도 동일한 동작을 기대할 수 있게 되었다.
함수의 평가 시점이 의미가 없다는 사실을 다시 한번 강조
function f4(f1, f2, f3) { // f4 함수는 인자로 f1, f2, f3 함수를 받게 된다
return f3( f1() + f2()); // f3 함수는 f1, f2의 인자값을 받아 결과값을 return 한다
}
f4(
function() {return 2;}, //f1
function() {return 1;}, //f2
function(a) {return a * a;} //f3
)
/*
function f4(f1, f2, f3) {
return f3( f1() + f2()); >> return f3( 2 + 1 ); >> return f3(3); >> 결과값 9
}
*/
이와 같은 방식으로 진행하는 것이 함수형 프로그래밍이다
어떠한 원자적 순수함수( 로직에 이상이 없는)들을 조함해 나가는 방식이다
이상 없는 함수들을 조합해 큰 로직을 만들어 가는 과정이기 때문에 믿고 재사용 할 수 있다는 큰 강점이 있다
함수형 프로그래밍은 애플리케이션, 함수의 구성요소, 더 나아가서 언어 자체를 함수처럼 여기도록 만들고,
이러한 함수 개념을 가장 우선순위에 놓는다
참고 블로그
'JavaScript' 카테고리의 다른 글
[JavaScript] 함수형으로 전환하기 filter, map, each (0) | 2021.09.22 |
---|
댓글