일급 함수
일급 함수 : 프로그래밍 언어에서 함수를 값으로 다룰 수 있는 것 (함수 스스로 객체취급)
즉, 함수를 변수에 담아 원할 때 평가(함수 호출)하는 것
따라서 변수의 특성인 함수 인자로 전달 가능하며, 리턴 값으로 사용 가능
( 나중에 상세한 정의 찾아보기 )
1 2 3 4 | var f1 = function(a){return a*a;}; console.log(f1); // 함수의 내용이 나옴, 즉 변수f1에 함수가 담겼다 var f2 = add; //add라는 메서드가 있을 때 console.log(f2); |
자바스크립트에서 f1이라는 변수에 함수를 대입할 수 있다. (여기서 보이진 않지만 add라는 함수를 만들었다.)
1 2 3 4 5 | function f3(f){ return f(); } //단순히 함수를 실행시키는 함수 f3(function(){return 10;}); |
f3는 함수를 인자로 받아 그 함수를 실행시키는 단순한 함수.
이렇게 구성이 가능하다는 것만 이해하고 넘어감.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* add_maker */ function add_maker(a){ return function(b){ return a+b; } } var add10 = add_maker(10); console.log(add10(20)); // add_maker 실행하면서 10을 주니까 a에 10이 들어오고 끝난 함수를 // add10 이라는 변수에 받았고 그 변수에 20을 주면서 b는 20 //클로저 function(b){ return a+b;} //클로저 특징으로 a의 참조를 기억하고 있을 수 있다. var add5 = add_maker(5); var add15 = add_maker(15); console.log(add5(10)); console.log(add15(10)); //a 라는 값이 변경되지 않으니 b는 순수 함수 //즉 add10 을 언제 어느시점에 평가하든 같은 값을 리턴한다. |
이상하다 생각할 수 있는 함수 add_maker는 인자로 a를 받고 결과값으로 함수를 리턴하는데 그 함수는 b라는 인자를 받아 기존의 a와 b를 더해서 리턴하는 함수다.
add_maker가 리턴하는 함수에서 어떻게 a를 쓸 수 있어? 라고 한다면 클로저에 대해 약간의 지식이 있어야한다.
클로저 : 외부함수의 변수에 접근할 수 있는 내부 함수 (+파라미터도 참조 가능) 자세한건 클로저 공부..
여기서 중요한건 add10에 다가 add_maker(10);을 넣고 가지고 다니다가 내가 필요할 때 add10(20); 이런식으로
사용이 가능하다는 것이다. ( 클로저의 기능으로 외부함수의 파라미터의 참조를 기억하고 있기 때문에 )
sample
1 2 3 4 5 6 7 8 9 | function f4(f1,f2,f3){ return f3(f1() + f2()); } f4( function(){return 2;}, function(){return 1;}, function(a){return a*a;} ); |
f4는 함수 3개를 인자로 받는 함수이고 결과는 그 안의 f3가 f1와 f2의 결과값을 더하는 값을 인자로 받아서 실행한 값을 리턴한다.
밑에서 f4의 인자를 익명함수로 호출하는 예제가 있는데 2+1 = 3을 제곱해서 9를 리턴하는 소스
*** 이런 형태를 실무에서 쓰일 수 있다는 것만 알아두자. f4자체는 실무와 전혀 무관..
결론 : 함수형 프로그래밍은 일급 함수의 기능과 순수 함수의 특징을 가지고 조합하는 프로그래밍 패러다임
객체지향프로그래밍 vs 함수형프로그래밍
1 2 3 4 5 6 7 8 9 | duck.moveLeft(); duck.moveRight(); dog.moveLeft(); dog.moveRight(); moveLeft(dog); moveRight(duck); moveLeft({x:5,y:2}); moveRight(dog); |
duck객체야 왼쪽으로 움직여! => 객체지향 프로그래밍
왼쪽으로 움직여! duck아 = > 함수형 프로그래밍
'Javascript > 함수형 프로그래밍' 카테고리의 다른 글
커링 (curry, curryr, get) (4) | 2017.09.21 |
---|---|
함수형 프로그래밍의 장점, 다형성!(어떤 객체에만 적용가능한 메서드가 아닌 함수를 생성한다) (0) | 2017.09.20 |
each 메서드 만들어보기 (0) | 2017.08.29 |
함수형 프로그래밍으로 map, filter를 만들어보자(함수를 인자로 쓰기) (0) | 2017.08.26 |
순수 함수란? (함수형 프로그래밍의 뿌리, 함수의 부수효과를 없앤다) (4) | 2017.08.23 |