함수형 자바스크립트를 위한 기초 용어 및 지식을 정리한 글 입니다.

함수형 프로그래밍과 자바스크립트

“Functional Programming + Javascript = Functional javascript”

함수형 프로그래밍이란?

비지니스 관점에서, 프로젝트 진행 관점에서 바라본 프로그래밍의 정의는 각각 틀려질 수 있겠다. 하지만 순수하게 프로그래머로서의 관점에서 기본적으로 프로그래밍의 본질은 “한 번에 해결하기 어려운 큰 문제를 작은 단위로 분할하여 해결하고, 그렇게 나온 결과물을 다시 조합하여 새로운 문제를 해결 하는 것” 이라고 생각한다.

즉, 위 의견에 근거하여 프로그래밍의 본질에서 중요한 것을 정의해 보자면 다음과 같다.

1
2
3
4
5
6
1. 문제를 작은 단위로 분할하는 것. (Divide and conquer)
2. 작은 결과들을 조합하는 것. (composability)
3. 새로운 문제를 해결하기 위해 재사용성을 높이는 것. (Reusability)

우리는 계속해서 크고 복잡한 문제를 풀어야 하고, 또한 비슷하지만 조금은 다른 문제들을 풀어야 한다.
앞서 만들어 놓은 산출물을 쉽게 조합하여 새로운 문제를 해결할 수 있다면 프로그래머의 생산성은 비약적으로 늘 수 있을 것이다.

모든 프로그래밍 패러다임은 성공적인 프로그래밍을 위해 존재한다. 성공적인 프로그래밍의 척도에는 사용성, 성능, 확장성, 기획 변경에 대한 대응력 등이 있으며, 이것들을 효율적이고 생산적으로 이루는 일이 성공적인 프로그래밍이다.

함수형 프로그래밍은 성공적인 프로그래밍을 위해 부수 효과(Side effect)를 최대한 멀리하고 조합성을 강조하는 프로그래밍 패러다임이다. 함수형 프로그래밍이 부수 효과를 최대한 멀리하는 이유는 다음 두 가지를 위해서다. 하나는 오류를 줄이기 위해서고, 또 하나는 조합성 혹은 모듈화 수준을 높이기 위해서다. 오류가 없는 것은 좋은 프로그램의 가장 중요한 척도이고, 높은 모듈화 수준은 성공적인 프로그래밍의 핵심 요소다. 높은 모듈화 수준은 생산성을 높이고, 오류 없는 함수들의 조합은 프로그램 전체의 안정성을 높여 준다.

즉, 함수형 프로그래밍은 위 논리에 의거하여 함수형 프로그래밍의 기본 패러다임을 기준점으로 삼아 프로그래밍하는 것을 말한다.

함수형 자바스크립트 기초

평가

  • 코드가 계산(Evaluation) 되어 값을 만드는 것

순수 함수

  • 순수 함수는 외부의 상태를 변경하지 않으면서 동일한 인자에 대해 항상 똑같은 값을 리턴하는 함수다. (부수효과가 없는 함수)
    • 조건 1. 동일한 인자에 대해 항상 같은 값을 리턴하는 함수
    • 조건 2. 부수효과가 없는 함수

순수 함수가 아닌 함수 / 조건1 불충족

example_2
  • js
1
2
3
4
5
6
7
let c = 10;
const add = (a, b) => a + b + c;
console.log(add(1, 2)); // 13
console.log(add(1, 2)); // 13
c = 100;
console.log(add(1, 2)); // 103
// 함수내에서 외부의 c라는 변수 값이 변하면 결과값도 달라지기 때문. 만약 c가 상수(const)라면 add2도 순수함수.

순수 함수가 아닌 함수 / 조건2 불충족

example_2
  • js
1
2
3
4
5
6
7
8
9
10
let c = 10;
const add = (a, b) => {
c = b + 10;
return a + b;
}
console.log(add(1, 2)); // 13
console.log(add(1, 2)); // 13
c = 100;
console.log(add(1, 2)); // 103
// 동일한 인자에 대해 항상 리턴하는 값이 같더라고, 외부의 상태를 변경, 즉 부수효과가 있는 함수이기에 순수 함수가 아니다.

순수 함수

example_3
  • js
1
2
3
4
const add = (a, b) => a + b;
console.log( add(1, 2) ); // 3

// 어디서 실행해도 add(1, 2)는 항상 3을 리턴하고 외부 상태를 변경하지 않았기 때문에 순수 함수이다.

궁극적으로 평가 시점이 무관하다는 특성으로 효율적인 로직을 구성하는 것이 함수형 프로그래밍 패러다임. (순수 함수의 특성을 활용)

일급

  • 값으로 다룰 수 있다.
  • 변수에 담을 수 있다.
  • 함수의 인자로 사용될 수 있다.
  • 함수의 결과롤 사용될 수 있다.

일급 함수

  • 함수를 값으로 다룰 수 있다.
  • 조합성과 추상화의 도구로 활용할 수 있다.

자바스크립트에서 함수는 일급이다. 함수가 일급이라는 것은, 함수를 값으로 다룰 수 있다는 이야기다.
함수를 값으로 다룰 수 있다는 이야기는 함수를 다음과 같이 활용 할 수 있다는 것이다.

example_4
  • js
1
2
3
4
5
6
7
8
9
10
// 함수를 변수에 담을 수 있다.
const add3 = a => a + 3;
console.log(add3); // a => a + 3
console.log(add3(1)); // 4

const f = () => () => 1;
console.log(f()); // () => 1

const f2 = f();
console.log(f2()); // 1

즉, 함수가 일급이라는 것은 함수의 결과값으로 함수를 활용 할 수 있음을 의미한다.

고차 함수

  • 일급 함수의 성질을 활용하여 함수를 값으로 다루는 함수

고차 함수는 크게 두 가지로 나뉘어 진다.

1. 함수를 인자로 받아서 실행하는 함수.

example_5
  • js
1
2
3
4
5
const execute = f => f(1);
const add3 = a => a + 3;

console.log(execute(add3)); // 4
console.log(execute(a => a - 1)); // 0

위와 같은 프로그래밍 방식을 ‘Applicative programming’ 이라고도 한다.

2. 함수를 만들어 리턴하는 함수 (클로저를 만들어 리턴하는 함수)

example_6
  • js
1
2
3
4
5
const addMaker = a => b => a + b;
const add10 = addMaker(10);

console.log(add10(5)); // 15
console.log(add10(10)); // 20

위 예제(example_6)에서 addMaker가 함수를 만들어 리턴하는 함수 이다.

이때 리턴되는 함수인 ‘b => a + b’ 는 클로저 이다. ‘b => a + b’ 가 만들어질 때의 환경인 a를 기억하고 있기 때문이다.

앞서 기술한 ‘자바스크립트와 함수형 프로그래밍 용어’의 개념과 원리를 통해 함수형 자바스크립의 기초와 기반에 대해 알아보았다.