반응형

함수형 프로그래밍이란?

함수형 프로그래밍(Functional Programming)은 컴퓨터 프로그래밍 패러다임 중 하나로, 함수 수학(lambda calculus)에 기반하여 개발된 프로그래밍 패러다임입니다. 함수형 프로그래밍은 부작용(side effect)이 없는 함수와 데이터 구조의 조합으로 프로그램을 구성하는 것을 특징으로 합니다.


부작용(side effect)

부작용(side effect)은 함수가 외부에 영향을 주는 행위를 말합니다. 예를 들어, 데이터베이스에 데이터를 저장하거나 파일에 문자열을 쓰는 것과 같은 행위를 말합니다. 함수형 프로그래밍에서는 부작용을 최소화하고, 함수를 순수하게 유지하는 것이 중요합니다.


순수 함수(pure function)

순수 함수(pure function)는 외부에 영향을 미치지 않고, 언제든지 같은 입력에 대해 같은 결과를 출력하는 함수를 말합니다. 순수 함수는 다음과 같은 성질을 가지고 있습니다.

  • 동일한 입력에 대해 동일한 결과를 출력합니다.
  • 외부의 상태에 영향을 끼치지 않습니다.
  • 어떤 상태도 조작하지 않습니다.

 다음과 같은 함수는 순수 함수입니다.

function add(a, b) {
  return a + b;
}

하지만, 다음과 같은 함수는 순수 함수가 아닙니다.

let count = 0;

function increment() {
  count += 1;
}

increment 함수는 count 변수를 외부에서 조작하기 때문에 순수 함수가 아닙니다.


함수 조합(composition)

함수형 프로그래밍에서는 함수를 조합하여 복잡한 프로그램을 구성합니다. 순수 함수는 부작용이 없어서 결과가 예측 가능하고, 함수의 결과를 다른 함수의 입력으로 사용할 수 있기 때문에 함수 조합이 가능합니다.

 

다음과 같은 함수를 가지고 있다고 가정합니다.

function double(x) {
  return x * 2;
}

function add(a, b) {
  return a + b;
}

이 함수들을 조합하여 다음과 같은 함수를 만들 수 있습니다.

function doubleAndAdd(a, b) {
  return add(double(a), double(b));
}

doubleAndAdd 함수는 double 함수를 호출하여 결과를 두 번 사용하여 add 함수를 호출하게 됩니다. 이렇게 함수를 조합하면 복잡한 프로그램을 구성할 수 있습니다.


불변성

함수형 프로그램에서 불변성은 중요한 개념 입니다. 불변성을 간단히 말하며 값이 변경되지 않는 것이 보장되어야 합다는 것 입니다.

let numbers = [1, 2, 3, 4, 5];
numbers[0] = 10;
console.log(numbers);
// [10, 2, 3, 4, 5]

위 코드에서 numbers 배열의 첫 번째 값이 변경되었습니다. 함수형 프로그램에서는 값이 변경되지 않는 것을 보장하는 것이 중요합니다. 따라서, 다음과 같이 코드를 작성할 수 있습니다.

let numbers = [1, 2, 3, 4, 5];
const newNumbers = [10, ...numbers.slice(1)];
console.log(numbers);
// [1, 2, 3, 4, 5]
console.log(newNumbers);
// [10, 2, 3, 4, 5]

위 코드에서 newNumbers 배열은 numbers 배열의 첫 번째 값이 10인 새로운 배열입니다. numbers 배열의 값은 변경되지 않았습니다.


고차 함수

함수형 프로그램에서는 함수를 파라미터로 받거나 함수를 반환하는 함수, 즉 고차 함수를 사용합니다. 다음과 같은 코드가 있습니다.

function add(x, y) {
  return x + y;
}

function multiply(x, y) {
  return x * y;
}

function calculate(x, y, operation) {
  return operation(x, y);
}

console.log(calculate(2, 3, add));
// 5
console.log(calculate(2, 3, multiply));
// 6
 

위 코드에서 calculate 함수는 고차 함수입니다. calculate 함수는 파라미터로 x, y 그리고 operation 함수를 받습니다. operation 함수는 add 함수와 multiply 함수중 하나를 받습니다.


커링 (Currying)

커링은 함수형 프로그래밍에서 자주 사용되는 기법입니다. 커링은 함수가 여러 개의 인자를 받는 것을 여러 개의 함수로 나누어 처리하는 것을 의미합니다. 이를 통해 함수의 재사용성을 높이고, 코드의 가독성을 높일 수 있습니다.

// 커링이 적용되지 않은 함수
const add = (a, b, c) => a + b + c;

console.log(add(1, 2, 3));
// 6

// 커링이 적용된 함수
const curryAdd = a => b => c => a + b + c;

console.log(curryAdd(1)(2)(3));
// 6

위 코드에서, add 함수는 3개의 인자를 받아서 더한 결과를 반환합니다. 그러나, curryAdd 함수는 커링이 적용되어 여러 개의 함수로 나눠져 있습니다. 이를 통해 curryAdd(1) 함수와 curryAdd(1)(2) 함수를 재사용할 수 있습니다.


명령형 프로그래밍과의 차이점

함수형 프로그래밍과 명령형 프로그래밍의 가장 큰 차이점은 변수를 어떻게 사용하는지입니다. 명령형 프로그래밍에서는 변수를 수정하여 프로그램의 상태를 변경합니다. 하지만, 함수형 프로그래밍에서는 변수를 수정하지 않고 함수의 조합으로 프로그램을 구성합니다.

 

예를 들어, 다음과 같은 코드가 있습니다.

let total = 0;
for (let i = 0; i < 10; i++) {
  total += i;
}

이 프로그램에서 total 변수는 반복문을 실행할 때마다 값이 변경됩니다.

 

함수형 프로그램에서는 변수를 수정하지 않고, 함수를 조합하여 동일한 결과를 얻을 수 있습니다.

function sum(total, current) {
  return total + current;
}

const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const result = numbers.reduce(sum, 0);

numbers 배열을 reduce 함수를 사용하여 순차적으로 sum 함수를 적용하여 결과를 구합니다. reduce 함수를 사용하면서 total 변수를 수정하지 않고, sum 함수와 numbers 배열의 값만을 사용하여 결과를 구할 수 있습니다.

 

함수형 프로그램에서는 값을 수정하지 않고, 함수의 조합으로 프로그램을 구성하는 것이 중요합니다. 이를 통해서 코드의 안정성과 유지보수성이 높아집니다.

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기