함수형 프로그래밍 이란?

  • 함수 사용을 강조 하는 개발 스타일 입니다.
  • 애플리케이션의 sideEffect를 방지하고 상태변이를 방지하기 위해서 데이터의 제어 흐름과 연산을 추상화 하는 것을 목적으로 합니다.

선행되는 개념

  • 선언적 프로그래밍
  • 순수함수
  • 참조 투명성
  • 불변성

선언적 프로그래밍

  • 내부적으로 코드를 어떻게 구현했는지 데이터는 어떻게 흘러가는지 밝히지 않은채 연산/작업을 표현하는 사상입니다.
  • map, filter, reduce등 일급 고계함수를 이용해서 재사용성 확장성이 용이한 선언적 코드를 구현 합니다.

    일급함수란 : 함수를 다른 변수와 동일하게 다룰 수 있을떄 일급함수라고 표현합니다.
    https://developer.mozilla.org/ko/docs/Glossary/First-class_Function
    고계함수란 : 함수가 다른 함수를 인수로 받는 것을 말합니다. Higher Order Function

	let a = [0, 1, 2, 3]
    a.map(item => item + 2)
	console.log(a) // [2, 3, 4, 5]

반면 절차적 또는 명령형 프로그래밍은 어떤 결과를 내기위해 시스템의 상태를 변경하는 구문을 위에서 아래로 늘어놓습니다.

	let a = [0, 1, 2, 3]
    for (let i = 0; i < a.length; i++) {
      a[i] = a + 2
    }
	console.log(a) // [2, 3, 4, 5]

함수형 프로그래밍은 무상태성과 불변성을 지향합니다. 즉, 상태를 두지 않으려면 순수함수여야 합니다.

순수함수

  • 주어진 같은 입력에 같은 결과를 도출하는 함수입니다.
    1.이를 위해서 주어진 값에만 의존할 뿐 평가도중 호출간 변경될 수 있는 숨겨진 값이나 외부상태와 무관하게 작동합니다.
    2.함수 스코프 밖에서 어떠한 변경도 일으키지 않습니다.

위 두개의 조건을 만족시키지 않으면 불순하다고 할 수 있습니다.

Date.now()는 같은 입력에 다른 결과가 나올수 있으므로 순수함수가 아닙니다.

참조 투명성

  • 어떤 함수가 동일한 입력에 동일한 결과를 내면 이를 참조 투명한 함수라고 합니다.
	let counter = 0
	const add1 = () => counter++

위 함수는 동일한 입력에 다른 결과를 냅니다. 순수함수가 아닙니다. 즉, 참조 투명하지 않은 함수 입니다.

	const add = counter => counter++

위 함수는 동일한 입력에 동일한 결과를 나타냅니다. 순수함수입니다.

이러한 순수함수는 치환성을 극대화 시켜줍니다. 이러한 치환성이 모듈성을 높여줍니다.

	let input = [1, 2, 3]
    // divide, size, sum 등의 함수는 순수함수라고 하자
    let average = arr => divide(sum(arr), size(arr)) 
    average(input) // 2
	let average = arr => divide(6, 3)
    average(input) // 2

불변데이터

  • 불변데이터는 한번 생성된 이후에는 절대 바뀌지 않습니다.

장점

  • 복잡한 작업들을 분해하도록 유도 : 하위 작업들로 분할하여 해당 작업들에게 단일성을 부여합니다.
  • 데이터를 매끄럽게 체이닝 : 아래 예시와 같이 고계함수들을 사용하여 알아보기 일반적인 절차적 프로그래밍을 사용하는 코드들보다 간결하고 알아보기 쉬운 데이터흐름으로 구현할 수 있습니다.
let a = [1, 2, 3]
let b = a.filter(item => item > 1)
		 .map(item => item + 1)
		 .reduce((a, b) => a + b, 0)
profile
일상을 기록하는 삶을 사는 개발자 ✒️ #front_end 💻

0개의 댓글