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

김지수·2023년 6월 16일
0

Computer Science

목록 보기
2/4

함수형 프로그래밍이라는 단어를 많이 접해 봤을 것이다.
요즘 유지보수 및 확장성 등의 장점으로 객체지향 프로그래밍을 따르고 있고, 나 또한 객체지향 프로그래밍에 대해 공부를 더 많이 했던 것 같다.
그러다보니 함수형 프로그래밍이 뭐에요? 라고 물으면 대답하기 어려웠다.
자바스크립트는 객체지향과 함수형 프로그래밍이 모두 가능한 언어인데 그렇다면 함수형 프로그래밍이란 무엇이고, 왜 자바스크립트는 함수형 프로그래밍이라고 할 수 있는지 특징에 대해 공부해 보려고 한다.

프로그램 패러다임

프로그램 패러다임(programming paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론이다.
프로그래밍 프러다임에는 크게 선언형과 명령형으로 나뉜다.

  • 선언형: 함수형
  • 명령형: 겍체지향형, 절차지향형
const array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// 명령형 프로그래밍
for(let i = 0; i < array.length; i++) {
  array[i] = array[i] * 2;
}

// 함수형 프로그래밍
array.map(function(value) {
  return value * 2;
});

명령형 프로그래밍에서는 로직이 상세히 적혀있지만 함수형 프로그래밍에서는 각 요소를 처리하는 방법만 함수로 기술했을 뿐 그 처리 방법에 대해서는 알 필요가 없다.

함수형 프로그래밍

먼저 함수형은 선언형 프로그래밍에 속하는데 선언형 프로그래밍이란 '무엇을' 풀어내는가에 집중하는 패러다임으로 '프로그램은 함수로 이루어진 것이다.'라는 명제가 담겨 있다.

const numArr = [1, 2, 3, 4, 5, 11, 12]
	.reduce(max, num => num > max ? num : max, 0)

console.log(numArr) // 12

위 예시에서 reduce()는 '배열'만 받아서 누적한 결과값을 반환하는 순수함수이다.
함수형 프로그래밍은 이와 같은 작은 '순수 함수'들을 블록처럼 쌓아 로직을 구현하고 '고차 함수'를 통해 재사용성을 높인 프로그래밍 패러다임이다.

순수 함수

출력이 입력에만 의존하는 함수

const pure = (a, b) => {
  return a + b
}

pure 함수는 들어오는 매개변수 a, b에만 영향을 받는다. 따라서 주어진 입력에만 의존할 뿐 다른 전역 변수에 영향을 받지 않는다.

순수 함수가 아닌것

let cnt = 0;
function countNum() {
  return cnt += 1
};

function getNow() {
  return Date.now()
}

데이터는 불변

함수형 프로그래밍에서 한 번 선언한 데이터는 불변(immutable) 해야 한다. 즉 원본 변수의 값을 수정하거나 내부 속성을 변경하는 것은 허용되지 않는다.

하지만 javascript는 타입이 없는 동적 언어이기 때문에 불변 데이터 관리에 대한 언어적 지원이 미흡하다.

const sortedNum = [3, 1, 5, 6, 2]

sortedNum.sort()

console.log(sortedNum) // [1, 2, 3, 5, 6]

JavaScript에서는 불변 데이터를 흉내내기 위해 상수 레퍼런스(const)를 쓰거나, 클로저 패턴, Object.writable이나 Object.freeze와 같은 메타 속성을 제어하는 방식을 사용하기도 한다.

고차 함수

함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 함수

array.map(it => it * 3)
array.filter(it => it > 0)
array.reduce((acc, cur) => acc + cur)

고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 한다.

  • 변수나 메서드에 함수를 할당할 수 있다.
  • 함수 안에 함수를 매개변수로 담을 수 있다.
  • 함수가 함수를 반환할 수 있다.

따라서 자바스크립트는 일급 객체이며 고차 함수를 구현할 수 있기 때문에 함수형 프로그램이다라고 말할 수 있다.
자바스크립트 외에도 일급 객체의 특징을 가지는 언어라면 함수형 프로그래밍이 가능하다.

참조

profile
백엔드 노드 개발자

0개의 댓글