record logo record

함수형 프로그래밍

왜 함수형 프로그래밍 언어 인가??

자바스크립트는 함수형 프로그래밍 언어가 아니다

함수형 언어는 여러분이 부작용을 제거할 수 있는 곳에서는 제거를 돕고, 그럴수 없는 곳에서는 통제할 수 있게 도와준다. 자바스크립트는 이 기준을 만족하지 않는다. 사실 자바스크립트가 적극적으로 부작용을 장려하는 것은 쉽게 찾을 수 있다. 가장 쉽게 찾을 수 있는 것이 바로 this이다. this는 모든 함수의 숨겨진 입력이다. 특히 this가 마법처럼 보이는 까닭은 의미 변화가 자유롭기 때문이다. 심지어 전문가라고 할만한 자바스크립트 프로그래머들조차 this의 참조 대상을 추적하는데 어려움을 겪는다. 함수형 관점에서 보자면 어디서나 마법처럼 접근 가능하다는 사실이 설계 결함의 징후(design smell)이다. 여러분은 분명 FP 라이브러리(예를 들어 Immutable.js)를 로드할 수 있고 또 이를 통해 함수형 스타일로 프로그래밍 하기가 더 쉬워지기는 하겠지만 언어 자체의 본질은 바뀌지 않는다.

함수형 프로그래밍 요소

일급 함수

함수를 다른 변수와 동일하게 다루는 언어는 일급 함수를 가졌다고 표현합니다. 예를 들어, 일급 함수를 가진 언어에서는 함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있습니다.

일급 함수 예시
//==ex1 | 변수에 함수 할당==//
const foo = function() {
   console.log("foobar");
}
// 변수를 사용해 호출
foo();

//==ex2 | 함수를 인자로 전달==//
function sayHello() {
   return "Hello, ";
}
function greeting(helloMessage, name) {
  console.log(helloMessage() + name);
}
// `sayHello`를 `greeting` 함수에 인자로 전달
greeting(sayHello, "JavaScript!");

//==ex3 | 함수 반환==//
function sayHello() {
   return function() {
      console.log("Hello!");
   }
}
//==ex3 | 함수 반환 - 변수 사용==//
const sayHello = function() {
   return function() {
      console.log("Hello!");
   }
}
const myFunc = sayHello();
myFunc(); //Hello! 출력
//==ex3 | 함수 반환 - 이중 괄호 사용==//
function sayHello() {
   return function() {
      console.log("Hello!");
   }
}
sayHello()();

References