일단 찾아본다고 찾아봤는데, 틀린 정보가 있을 수 있습니다. 그렇다면 꼭 알려주시면 감사하겠습니다.
함수형 프로그래밍이란 도대체 무엇일까?
말 그대로 함수를 이용해서 문제를 해결하는 프로그래밍 기법이다. 패러다임이라고 해도 되려나?
함수를 이용해서 차례차례 원하는 값을 얻어내거나 데이터를 가공하는 것을 의미한다. 선언된 함수 pipeline을 통해 데이터 변형 흐름을 예상하는 관점으로 프로그램을 짠다.
(이 글의 썸네일을 유심히 살펴보자.)
함수형 프로그래밍이라고 하면 조건이 있다. 바로 순수함수이다.
순수함수란 input과 output이 일정해야한다는 것이다. 똑같은 input인데 어쩔때는 A였다가 어쩔때는 B가 리턴되면 순수함수가 아니다.
아래 예시를 보자.
// pure function(순수함수)
function pureGreeting(name) {
return "I'm" + name;
}
pureGreeting('suzuki'); //I'm suzuki;
pureGreeting('suzuki'); //I'm suzuki;
let sirName = 'Ryo';
// non-pure function
function nonPureGreeting(name) {
return "I'm" + name + sirName;
}
nonPureGreeting('kiko'); // I'm kiko Ryo
let sirName = 'Yamada';
nonPureGreeting('kiko'); // I'm kiko Yamada
순수함수여야 하는 이유는, 함수만을 가지고도 어디서든 일정한 값으로 프로그래밍을 해야하기 위함이다. 재사용가능해야하고 모듈처럼 부품자체로서 어떤 기능을 해야한다.
이 함수라는 재사용가능한 부품을 가지고 조합하여 내가 원하는 값을 뽑아내는 과정이 함수형 프로그래밍이 아닐까 싶다.
(참고로, 예전에 객체지향형과 대척점에 있는게 함수형이라고 생각했었다. 그러나 객체지향형과 대척점에 있는게 아니라 그냥 다른 개념이다. 객체지향형은 쉽게 말하면 객체안에 복잡성이 숨겨져있고, 각 객체는 서로 소통
한다는 것)
그리고 함수형 프로그래밍은 higher-order function(고차함수) 인 경우이다. 고차함수란 쉽게 말해 함수를 리턴하는 함수이거나 함수를 인자로 받는 함수이다.
함수안에 또다시 nested 함수가 있다. 함수 실행 순서, 질서(?)가 있다는 관점에서 보면 왜 higer-order로 명명되었는지 약간 짐작이 간다.
더 쉬운이해를 위해, 또 다시 예시를 가지고 와봤다.
고차함수는 아래 코드와 같은 함수를 의미한다.
function makeAdjectifier(adjective) {
return function (string) {
return adjective + “ ” + string;
};
}
var coolifier = makeAdjectifier(“cool”);
coolifier(“conference”); // “cool conference”
그래서 함수를 도구로 삼아서 객체나 데이터를 정제해 나가는 프로그래밍이다.
함수형 프로그래밍하면 떠오르는 함수가 있다.
대표적으로 array의 prototype에 이미 포함되어있는 고차함수 3대장, map,reduce,filter
가 있다.
재밌는 비유를 해보자.
샌드위치를 만든다고 했을 때, 각각의 재료를 잘게 썰기위해서는 map을 사용하고 썰은 재료를 조합하여 샌드위치를 완성하기 위해서는 reduce를 사용하면 된다.
그래서 통에 담겨 있는 재료로 샌드위치를 만든다고 하면 아래와 같이 표현 가능하다.
['tomamoto', 'lettuce', 'bread', 'cucumber']
.map(ingred => 'chopped' + ' ' + ingred)
.reduce((prevIngred, currentIngred) => prevIngred + ' + ' + currentIngred);
// 'chopped tomamoto + chopped lettuce + chopped bread + chopped cucumber'
또한, 위의 코드는 함수형 프로그래밍의 전형이다.
함수형 프로그래밍에 대해서 더 알고 싶다면 아래 아티클을 참고하자.
출처: https://www.youtube.com/watch?v=e-5obm1G_FY&list=WL&index=16