본문 바로가기

Javascript/함수형 프로그래밍

일급 함수란? (함수를 객체처럼 다룬다, 일급 객체(first-class))

반응형

일급 함수

일급 함수 : 프로그래밍 언어에서 함수를 값으로 다룰 수 있는 것 (함수 스스로 객체취급)

즉, 함수를 변수에 담아 원할 때 평가(함수 호출)하는 것

따라서 변수의 특성인 함수 인자로 전달 가능하며, 리턴 값으로 사용 가능

( 나중에 상세한 정의 찾아보기 )

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아 = > 함수형 프로그래밍

반응형