Function Programming

함수를 이용해서(Function) 사이드 이펙트 없도록(No Side Effect) 선언형 프로그래밍을 이용하는 것(Declarative Promgramming)

프로그래밍 패러다임

프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게하고 결정하는 역할을 합니다.

  • 명령형 프로그래밍: 프로그래밍의 상태와 상태를 변경시키는 구ㅂ문의 관점에서 연산을 설명하는 방식
  • 절차지향 프로그래밍: 수행되어야 할 연속적인 계산 과정을 초함하는 방식 (C, C++)
  • 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현 (C+6, Java, C#)
  • 선언형 프로그래밍: 어떤 방법으로 해야 하는지(How)를 나타내기 보다 무엇을 하는지(What)를 설명하는 방식
  • 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식 (클러저, 히스켈, 리스프)

명령형과 선언형의 프로그래밍 비교

  • 명령형: 알고리즘을 명시하고 목표는 명시 안함
  • 선언형: 알고리즘 명시하지 않고 목표만 명시

No Side Effect

OOP

Object들로 프로젝트가 구성되고 이들의 연관관계로 만들어집니다. OOP에서 기능의 최소 단위는 모듈로 연관된 오브젝트로 구성되어있고, 오브젝트는 맴버 변수와 메서드로 이루어져있습니다. 메서드 수행 될 때는 맴버 변수를 사용하게 됩니다. 그래서 매서드의 수행결과는 맴버변수가 어떤 상태를 가지고있는가에 따라 결과가 달라지게 됩니다.

FP

함수형 프로그래밍은 순수 함수를 조합하고 공유 상태, 변경 가능한 데이터 및 부작용을 피하여 소프트웨어를 만드는 원칙을 기반으로 소프트웨어를 구성하는 프로그래밍 패러다임 입니다. 함수형 프로그래밍은 명령형이 아닌 선언형이며 애플리케이션의 상태는 순수 함수를 통해 전달됩니다. 애플리케이션의 상태가 일번적으로 귱유되고 객체의 매서드와 함께 배치되는 객체 지향 프로그래밍과는 대조됩니다.

함수형 프로그래밍에 필요한 개념

1급 객체 (First Object, 1급 시민)

1급 객체란 다음과 같은 조건을 만족하는 객체입니다.

  1. 변수나 데이터 구조안에 담을 수 있습니다.
  2. 파라미터로 전달 할 수 있습니다.
  3. 반환값으로 사용할 수 있습니다.
  4. 할당에 사용된 이름과 관계없이 고유한 구별이 가능합니다.
  5. 동적으로 프로퍼티 할당이 가능합니다.

자바스크립트에서 함수(Function)은 객체(Object)이므로 1급 함수로 불립니다.

고차 함수 (High-Order Function)

람다 계산법에서 만들어진 용어로 아래 조건을 만족하는 함수입니다.

  1. 함수에 함수를 파라미터로 전달할 수 있습니다.
  2. 함수의 반환값으로 함수를 사용할 수 있습니다.

고차 함수는 1급 함수의 부분 집합입니다. 리액트의 고차 컴포넌트(HOC)는 컴포넌트를 사용하여 위의 조건을 만족하는 컴포넌트를 말합니다.

불변성

  • 함수형 프로그래밍에서는 데이터가 변할 수 없는데, 이를 불변성 데이터라고 합니다. (자바스크립트는 가능하지만 불가능한 언어들이 있습니다.)
  • 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터로 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행합니다.

순수 함수

순수 함수란 함수형 프로그래밍에 필요한 개념으로 아래 조건을 만족하는 함수를 뜻합니다.

  • 동일한 입력에는 항상 같은 값을 반환해야 합니다.
  • 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 합니다. (Side Effect가 없어야 합니다.)

데이터 변환방법

  • 함수형 프로그래밍은 데이터 변경이 불가능하기 때문에 기존 데이터의 복사본을 만들어 주는 도구들이 필요합니다.
  • 자바스크립트에는 이미 Array.map, Array.reduce 등 데이터 복사본을 만들기 위한 함수들을 제공하고 있습니다.

합성 함수

  • 합성 함수란 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하는 과정을 맗합니다. 함수형 프로그램은 여러 작은 순수 함수들로 이루어져있기 때문에 이 함수들을 연쇄적으로 또는 병렬로 호출해서 더 큰 함수를 만드는 과정으로 전체 프로그램을 구축해야 합니다.

함수형 프로그래밍의 컨셉

변경 가능한 상태를 불변상태(immutable)로 만들어 SideEffect를 없애자

함수 안에서 상태를 관리하고 상태에 따라서 결과값이 달라지면 안됩니다. 상태를 사용하지 않음으로 SideEffect를 사전에 차단할 수 있습니다. 또 변수 보다는 상수를 사용해 SideEffect를 차단합니다.

모든 것은 객체이다

함수형 언어에서는 모든거싱 객체입니다. 클래스 외에 함수 또한 객체이기 때문에 함수를 값으로 할당 할 수 있고, 파라미터로 전달 및 결과 값으로 바환이 가능합니다.

코드를 간결하게 하고 가독성을 높여 로직에 집중 시키자

API를 통해 보일러 플레이트를 제거하고, 내부에 직접적인 함수 호출을 통해 가독성을 높일수 있습니다.

동시성 작업을 보다 쉽고 안전하게 구현하자

위에 설명한 immutable 값을 사용해, 여러 쓰레드에서 접근을 하더라도 SideEffect를 발생시키지 않습니다.

출처