본문으로 바로가기

보통 선언형 프로그래밍은 함수형 프로그래밍(FP)에 포함되는 프로그래밍의 사조(?)로 여겨집니다. 어쨌거나 함수형 프로그래밍을 한다면 선언형 프로그래밍을 이용해야한다는 것이죠.

 

선언형 프로그래밍과 FP이 구별되는 지점은 FP에는 사이드 이펙트를 제거한 순수 함수라는 조건이 붙는다는 것입니다. 그런데 Array 클래스가 제공하는 메서드에는 순수 함수 조건에 부합하지 않는 메서드가 많습니다.

(순수 함수에 대해서는 https://darrengwon.tistory.com/595?category=905593)

 

선언형 프로그래밍(declaative)의 비교 대상으로 명령형 프로그래밍(imperative)이 주로 거론됩니다. 명령형 프로그래밍은 좀 더 CPU 친화적인 저수준의 구현이고, 선언형은 인간에게 가까운 고수준의 구현이라고 거칠게 요약할 수 있다고 합니다. 

 

 

저는 코더니 구체적인 코드를 보며 선언형 프로그래밍과 명령형 프로그래밍을 느껴봅시다.

 

 

* 1부터 100까지 더하는 문제

 

명령형 프로그래밍 방식

let sum = 0;
for (let i = 1; i <= 100; i++) {
  sum += i;
}

console.log(sum);

 

선언형 프로그래밍 방식

 

선언형 프로그래밍은 재사용이 가능한 함수를 만들어 문제를 해결합니다. 이로써 1에서 100까지를 더하는 단순한 하나의 문제 뿐만 아니라 배열의 원소를 전부 더하는 일반 문제를 해결할 수 있게 됩니다. 범용적이고 재사용 가능하다는 점에서 함수형 프로그래밍과 맥이 닿아 있습니다.

import { range } from "./range"; // 배열을 만드는 코드(생략)

const fold = (arr, callback: (result, value) => number, initialValue) => {
  let result = initialValue;
  for (let i = 0; i < arr.length; i++) {
    const value = arr[i];
    result = callback(result, value);
  }

  return result;
};

let numbers = range(0, 100 + 1); // 0부터 100까지의 배열
const output = fold(numbers, (result, value) => result + value, 0);

console.log(output);

 

 

주로 위와 같은 함수를 만들때는 map/filter/reduce를 주로 사용하죠.

import { range } from "./range";

const numbers = range(0, 15);
const reducer = (acc, cur) => acc + cur;

let addAllOdds: number = numbers.filter((el) => el % 2 != 0).reduce(reducer);

console.log(addAllOdds);

 

 

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체