자바스크립트로 알아보는 함수형 프로그래밍 (ES5) 강의를 듣고 정리한 내용입니다.
성공적인 프로그래밍을 위해
부수 효과를 미워하고 -> 순수 함수를 만든다 -> 오류를 줄이고 안정성을 높인다.
조합성을 강조하는 -> 모듈화 수준을 높인다 -> 생산성을 높인다.
프로그래밍 패러다임
function add(a, b) {
return a+ b;
}
console.log( add(10, 5) ); // 15
console.log( add(10, 5) ); // 15
console.log( add(10, 5) ); // 15
var c = 10; // 이 변수가 변화가 있다면 순수함수가 아니지만
// 상수로서 존재하면 순수 함수이다.
function add2(a, b) {
return a + b + c;
}
console.log( add(10, 2) ); // 22
console.log( add(10, 3) ); // 23
console.log( add(10, 4) ); // 24
c = 20; // 순수 함수라면
// 이 변수의 변화 전과 후의 평가 시점은 중요하지 않다.
console.log( add(10, 2) ); // 32
console.log( add(10, 3) ); // 33
console.log( add(10, 4) ); // 34
var c = 20;
function add3(a, b) {
c = b; // 리턴값으로 소통하는 것 외에
// 어떠한 외부의 상태에 미치는 출력
return a+ b;
}
console.log(c); // 20
console.log( add3(20, 30) ); // 50
console.log(c); // 30
var obj1 = { val: 10 };
function add4(obj, b) {
obj.val += b;
}
consoel.log( obj1.val ); // 10
add4(obj1, 20);
consoel.log( obj1.val ); // 30
원래의 값을 두고 새로운 값을 만들어 복사해서 리턴
var obj1 = { val: 10 };
function add5(obj, b) {
return { val: obj.val + b } // 리턴 값으로 소통
}
consoel.log( obj1.val ); // 10
var obj2 = add5(obj1, 20);
consoel.log( obj1.val ); // 10
consoel.log( obj2.val ); // 30
var f1 = function(a) { return a * a; };
console.log(f1); // function (a) { return a * a; }
var f2 = add;
console.log(f2); // function add(a, b) { return a + b;}
function f3(f) {
return f();
}
console.log( f3(function() { return 10; }) ); // 10
console.log( f3(function() { return 20; }) ); // 20
함수를 값으로 다루며 순수함수를 정의하면서
함수의 평가시점이 언제든 상관이 없다.
일급함수 + 클로저
function add_maker(a) {
return function(b) { // 이 함수는 클로저이기도 하다.
return a + b;
}
}
var add10 = add_maker(10);
console.log( add10(20) ); // 30
var add5 = add_maker(5);
var add15 = add_maker(15);
console.log( add5(10) ); // 15
console.log( add15(10) ); // 25
add_maker의 인자로 10을 넘기게 되면 a에 10이 들어가며
add10 은 아래와 같이 된다.
var add10 = function(b) { // 순수 함수
return a + b; // a의 상태를 변경하고 있지 않으므로 동일한 결과
}
add10의 인자로 20을 넘기면 b에 20이 들어가며
콘솔에 add10(20)의 값 30이 찍힌다.
function f4(f1, f2, f3) {
return f3(f1() + f2());
}
f4(
function() { return 2; },
function() { return 1; },
function(a) { return a * a; }));
function f4(f1, f2, f3) {
return f3(2 + 1);
}
f4( // 순수 함수들을 조합해서 결과를 만든다.
function() { return 2; },
function() { return 1; },
function(a) { return a * a; })); // a = 3 , a * a = 9
재미 / 실시간성 : 라이브 방송, 실시간 댓글, 협업, 메신저
독창성 / 완성도 : 애니메이션, 무한 스크롤, 벽돌(핀터레스트)
더 많아져야하는 동시성 : 비동기 I/O, CSP, Actor, STM...
더 빨라야하는 반응성 / 고가용성 : ELB, Auto Scaling, OTP supervisor ...
대용량 / 정확성 / 병렬성 : MapReduce, Clojure Reducers ...
복잡도 / MSA ... : 많아지고 세밀해지는 도구들
함수형 프로그래밍은 애플리케이션, 함수의 구성요소,
더 나아가서 언어 자체를 함수처럼 여기도록 만들고,
이러한 함수 개념을 가장 우선순위에 놓는다.
함수형 사고방식은 문제의 해결하는 방법을
동사(함수)들로 구성(조합)하는 것
// 데이터(객체) 기준
duck.moveLeft();
duck.moveRight();
dog.moveLeft();
dog.moveRight();
// 함수 기준
moveLeft(dog);
moveRight(duck);
moveLeft({ x: 5, y: 2 };
moveRight(dog);