프로그래밍 공부하기

함수형 프로그래밍 본문

Web/[JS] Common

함수형 프로그래밍

ihl 2021. 6. 3. 16:22

1. 함수형 프로그래밍

  함수형 프로그래밍은 순수함수의 조합으로 프로그램을 작성하는 방식이다. 함수형 프로그래밍을 이해하기 위해서는 불변데이터, 순수함수, 1급객체라는 개념에 대한 이해가 필요하다.

 

1-1. 불변성(Immutable)

  한 번 정해진 값은 바뀌지 않는다는 의미로, 객체 데이터를 다룰 경우 원본 데이터를 변경하지 않고 데이터의 복사본을 만들어 데이터를 처리하는 방식이다. 

 

1-2. 순수함수

let cnt = 0;
const pureFn = (a, b) => { //순수함수
  return a + b;
}

const notPureFn = (a, b) => { //순수함수가 아님
  return a + b + cnt;
}

  동일한 인자를 주면 동일한 결과를 리턴하며, 외부의 상태에 영향을 미치지 않는 함수이다. 위 코드에서 pureFn()은 순수함수다. 그러나 notPureFn()은 순수함수가 아니다. 외부의 cnt라는 변수의 상태가 변하면 리턴 결과가 달라지기 때문이다. 이와 같이 외부 상태에 영향을 받거나 주는(Side Effect) 함수는 순수함수가 아니다.

 

const changeFirst = (arr) => {
  const resultArr = [...arr];
  resultArr[0] = 1;
  return resultArr;
}

const arr = [3, 1, 2];
console.log(changeFirst(arr), arr); //[0, 1, 2] [3, 1, 2]

  순수함수를 이용하면 객체의 불변성을 유지하면서 객체를 변경할 수 있다. 예를 들어 배열의 첫 번째 요소를 변경하는 순수함수 changeFirst를 만들어보자. changeFirst는 원본 배열을 복사하여 첫 번째 요소를 변경한 후 복사본을 리턴할 것이다. 이렇게 하면 원본배열을 유지한채 원하는 데이터 조작 결과를 얻을 수 있다.

 

1-3. 1급 객체

[1급 객체의 조건]
  1. 변수나 데이터 구조 안에 담을 수 있다.
  2. 파라미터로 전달할 수 있다.
  3. 반환 값으로 사용할 수 있다.

  위와 같은 조건을 만족하는 객체가 1급 객체이다. 객체라면 일반적으로 적용가능한 연산들을 모두 지원하는 객체이다. 정수와 실수같은 간단한 스칼라 자료형은 대부분 일급객체이며, 배열, 문자열, 함수의 경우 언어마다 1급 객체일 수도, 아닐 수도 있다. 예를 들어 C와 같은 언어에서 배열은 파라미터로 사용할 수 없다. 배열의 첫요소의 포인터만 전달할 뿐, 배열의 크기는 분실되기 때문이다.

 

  JavaScript에서는 배열, 문자열 뿐만 아니라 함수도 1급 객체로 취급한다. C언어와 달리 JS의 함수는 위 조건을 모두 충족시키기 때문이다. 어떤 사람들은 함수가 1급 객체가 되기 위해서는 런타임에서 함수 생성가능 여부가 포함되어야 한다고 주장하기도 한다.

 

  JS에서 함수가 1급함수이기 때문에 함수 간의 여러 조합이 가능해진다. 즉, 함수형 프로그래밍은 순수함수를 조합해야하므로 함수가 1급객체어야 함수형 프로그래밍이 가능한 것이다.

 

2. 객체지향과의 비교

[함수형 프로그래밍 장점]
  1. 외부 환경과 독립되어 사이드 이펙트가 방지된다.
     -유지보수에 유리: 에러 발생 시 쉽게 원인을 찾을 수 있다.
     -함수 단위로 모듈화 가능 및 코드의 재사용성 증가
  2. 함수 동작부분의 코드가 간결하다.

[함수형 프로그래밍 단점]
  1. 상태를 조작하기 어렵다.

  객체지향은 상태와 행위를 가진 객체를 만들어 객체간의 상호작용을 통해 로직을 작성한다. 따라서 객체 안에 상태를 저장하고, 이를 다루는 메서드를 작성하므로 상태와 메서드가 긴밀한 관계를 갖는다. 그러나 함수형 프로그래밍의 경우 순수 함수를 이용하여 상태를 변화시키지 않고 데이터를 처리한다. 객체지향과 비교하여 함수형 프로그래밍의 장단점은 위와 같다.

 

  객체지향과 함수형 프로그램밍 간의 우열성은 없다. 각자의 장단점이 있기 때문에 상황에 맞게 선택해서 사용하거나 이 둘을 적절히 조합하여 사용하는 것이 좋다.

'Web > [JS] Common' 카테고리의 다른 글

변수 선언 키워드 - let, const 그리고 var  (0) 2021.06.08
Block vs Non-Block & Sync vs Async  (0) 2021.06.07
Dependency Injection(의존성 주입)  (0) 2021.05.31
socket.io  (0) 2021.04.30
cheerio를 이용한 javascript 스크래핑  (0) 2021.03.27
Comments