Functional Programming
[TOC]
프로그램 패러다임
명령형 프로그래밍
- 프로그램의 상태(데이터, 변수, 값)를 변경시키는 명령의 관점에서 프로그래밍
- 프로그램은 데이터를 어떻게(How) 변경시킬지를 나타낸다.
- 구체적인 알고리즘을 명시한다.
- 종류
- 절차 지향 프로그래밍
- 객체 지향 프로그래밍
선언형 프로그래밍
- 프로그램의 상태가 어떠해야하는지(What) 목표의 관점에서 프로그래밍
- 프로그램은 데이터가 어떠해야하는지를 나타낸다.
- 구체적인 알고리즘을 명시하지 않는다.
- 구현 알고리즘은 실행환경 등에서 결정된다.
- 구체적인 알고리즘을 명시하지 않는다.
- 종류
- 함수형 프로그래밍
함수형 프로그래밍
함수형 프로그래밍의 배경
- 1930년대 알론소 처치의 람다 계산법
명령형 프로그래밍과 비교
| 명령형 프로그래밍 | 함수형 프로그래밍 | |
|---|---|---|
| 프로그램이란? | 프로그램은 명령의 수행이다. | 프로그램은 함수의 계산이다. |
| 중점적 시각 | 어떻게(How to)에 초점 | 무엇(What)에 초점 |
| 이론적 배경 | 튜링 머신 | 람다 계산식 |
| 주요 프로그래밍 언어 | C, Java, … | Scheme, Haskell, ML, Erlang, Elm, … |
1급 객체(First Object, 1급 시민)란?
현실의 1급 시민
- 시민권 및 사회 경제적 기회의 제한이 없는 시민을 뜻함
- 2급 시민은 합법적 거주자이지만 제한된 기회를 갖는다.
프로그램의 1급 객체
다른 객체들에게 적용가능한 연산을 모두 지원하는 객체로 다음과 같은 특징이 있다.
- 변수나 데이터 구조안에 담을 수 있다.(할당)
- 파라미터로 전달 가능(전달)
- 반환값으로 사용 가능(반환)
- 할당된 이름과 관계없이 고유한 구별이 가능
- 동적으로 프로퍼티 할당이 가능
자바스크립트의 함수가 1급 함수인 이유
- 자바스크립트의 함수는 변수에 할당, 파라미터로 전달, 함수의 반환값으로 쓰일 수 있기 때문에 1급 함수(객체)라 할 수 있다.
1급 함수로 할 수 있는 것들
- 함수를 변수에 저장했다가 실행할 수 있다.
- 콜백 함수로 전달할 수 있다.
- 상태값을 갖는 함수를 반환하여 사용할 수 있다.
- 부분 적용(partial application) 함수를 만들 수 있다.
- 클로저에 의해 함수가 문맥상 변수를 저장할 수 있기 때문에 중간까지만 계산된 결과를 저장한 함수를 저장했다가 최정 결과를 위해 실행할 수 있다.
- 함수 호출이 여러번 일어날 때 파라미터의 일부는 같고 일부가 다를 경우 같은 파라미터까지만 계산한 함수로 나머지 파라미터를 전달하여 계산 할 수 있다.
//부분 적용 함수 예
function add(a){
return function(b){
return a+b;
}
}
var addFunc = add(1);
var result = addFunc(2); // result : 3;
1급 함수
- 1급 객체의 특징을 갖는 함수 객체
고차 함수(High-Order Function)
- 1급 함수의 부분 집합(Subset)으로써 다음과 같은 특징을 갖는다.
- 함수에 함수를 파라미터로 전달 가능
- 함수의 반환값으로 함수 사용 가능
불변성(Immutablility)
- 함수형 프로그래밍에서는 데이터가 변할 수 없다.
- 데이터 변경이 필요한 경우 원본은 그대로 두고 복사본을 만들어 변경한다.
순수 함수(Pure function)
- 다음을 만족하는 함수를 말한다.
- 동일한 입력에는 항상 동일한 값을 반환한다.
- 함수의 실행에 부작용(Side effect)가 없어야한다.
- 함수 내부에서 외부의 데이터(파라미터값, 전역변수 등)를 변경해서는 안된다.
합성 함수
- 여러 함수들을 조합한 하나의 함수를 만들어 사용할 수 있다.
- 부분 적용(partial application) 함수와는 다른 개념이다.
var add = (a, b) => a + b;
var square = (x) => x * x;
// ? reduce 확인
var compose = (...fns) =>
fns.reduce(
(prevFn, nextFn) =>
(...args) => nextFn(prevFn(...args)),
value => value
)
var compute = compose(add, square);
compute(1, 2); // 9가 나와야하는데 실제 실행시 NaN이 나온다. 추후 확인
함수형 프로그래밍을 배워야하는 이유
- 기존의 명령형 프로그래밍과 다르게 생각하는 방법을 알려준다.