728x90
반응형
함수형 프로그래밍은 애플리케이션, 함수의 구성요소, 더 나아가서 언어 자체를 함수처럼 여기도록 만들고, 이러한 함수 개념을 가장 우선순위에 놓는다.
함수형 사고방식은 문제의 해결 방법을 동사(함수)들로 구성(조합)하는 것
/* 데이터(객체) 기준*/
duck.moveLeft();
duck.moveRight();
dog.moveLeft();
dog.moveRight();
/*함수 기준*/
moveLeft(dog);
moveRight(duck);
moveLeft({ x:5, y:2 });
moveRight(dog);
// 객체 지향 프로그래밍은 데이터를 디자인하고,데이터에 맞는 method를 디자인 하는 식으로 프로그래밍.
// 함수형 프로그래밍은 함수를 먼저 만들고 데이터를 넣는다.
성공적인 프로그래밍
모든 프로그래밍 패러다임은 성공적인 프로그래밍을 위해 존재한다.
성공적인 프로그래밍은 좋은 프로그램을 만드는 일이다.
좋은 프로그램은 -> 사용성, 성넝, 확장성, 기획 변경에 대한 대응력 등이 좋다.
이것들을 효율적이고 생산적으로 이루는 일이 성공적인 프로그래밍이다.
함수형 프로그래밍
함수형 프로그래밍은 성공적인 프로그래밍을 위해 부수효과를 미워하고 조합성을 강조하는 프로그래밍 패러다임이다.
- 부수 효과를 미워한다. => 순수 함수를 만든다.
- 조합성을 강조한다. -> 모듈화 수준을 높인다.
- 순수함수 => 오류를 줄이고 안정성을 높인다.
- 모듈화 수준이 높다. => 생산성을 높인다.
순수 함수 : 부수효과가 없는 들어온 인자가 같다면 항상 동일한 결과를 return 하는 함수이다. 함수가 받은 인자 외의 다른 외부의 상태에 영향을 끼치지 않는 함수. return 외에는 외부 소통 x
순수 함수의 조합으로 프로그래밍을 해나가면 오류는 적고 안정성은 적으면서 모듈화 수준이 높은 프로그램(성공적인 프로그래밍)을 만들었다고 할 수 있다.
순수함수
//순수 함수1
function add(a, b){
return a+b;
}
//순수 함수 2
let obj1 = { val : 10 };
function add5(obj, b){
return { val: obj.val + b};
}
//참조만 할 뿐 값이 변경되는 부분은 없다.
- 동일한 인자를 주면, 동일한 return 을준다.
- 부수효과가 없다.
순수 함수가 아닌경우 - 동일한 return 이 아닌경우
아래 경우 c가 변화가 있을 수 있다고 가정한다면 순수함수가 아니다.
하지만 const의 경우 순수함수라고도 할 수 있을 것이다.
let c = 10;
function add2(a, b){
return a + b + c;
}
순수함수가 아닌경우 - 부수효과가 있는 함수
let c = 20;
function add3(a, b){
c = b;
return a + b ;
}
외부의 상태에 영향을 끼치는 다른 상태가 있다면 순수 함수가 아니게 된다.
일급함수 - 함수를 값으로 다룰 수 있다.
인자나 값으로 들고다닐 수 있다!
let f1 = function(a) {return a*a;};
function f3(f){
return f();
}
console.log( f3(function() {return 10});) //10;
//함수 내부에서 함수를 평가 한 후 결과를 return 함
함수형 프로그래밍 예제 - add_maker
function add_maker(a){
return function(b){//클로저 함수 이기도함.
return a + b;
}
}
let add10 = add_maker(10);
console.log(add10(20));
일급함수와 순수함수를 사용한 케이스이다.
function f4(f1, f2, f3){
return f3(f1() + f2());
}
f4(
function() {return 2;},
function() {return 1;},
function(a) {return a * a;}
);//9
// 실무적으로 쓰일만한 코드는아니지만 형태를 위하여 구현함
// 함수적 로직을 볼것
// 각각의 함수들은 순수한 함수이며 이들을 조함하는 것이 함수형 프로그래밍이다.
재미 / 실시간성 | 라이브 방송, 실시간 댓글, 협업, 매신저 |
독창성 / 완성도 | 애니메이션, 무한 스크롤, 벽돌() |
더 많아져야 하는 동시성 | 비동기 I/O, CSP, Actor, STM |
더 빨라야하는 반응성 / 고가용성 | ELB, Auto Scaling, OTP Supervisor |
대용량 / 정확성 / 병렬성 | MapReduce, Clojure Reducers... |
복잡도 / MSA / ...(생산성) | 많아지고 세밀해지는 도구들 |
- 좋아지는 하드웨어 성능, 좋아지는 컴파일러
- 함수형 프로그래밍 기술
- 좋아지는 분산 / 리액티브 환경
- 동시성 + 병렬성 관련 기술
- 성공적인 적용 사례와 영향
반응형
'창고(2021년 이전)' 카테고리의 다른 글
JS시계 API - flip clock을 이용한 출퇴근 관리 (0) | 2019.10.29 |
---|---|
[CSS Rendering] Box Model & Absolute Position (0) | 2019.10.29 |
[CSS Rendering] 고전 레이아웃 (0) | 2019.10.27 |
[CSS Rendering] 배경설명, 고전레이아웃 (0) | 2019.10.27 |
[JS] Console (0) | 2019.10.25 |