함수형 프로그래밍

rada·2022년 3월 22일
0

개발

목록 보기
5/14

먼저 함수형 프로그래밍의 특징을 알아보자.

1. 순수함수(pure function)

  • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
let num = 1;
function add(x){
	return a + num;
}

위와 같은 예제에서는 add라는 함수 안에서 전역으로 선언된 변수인 num을 참조하기 때문에 순수함수라고 볼 수 없다.

function add(a,b){
	return a + b;
}

const result = add(2,3);

위와 같이 add의 함수가 프로그램 실행에 영향을 미치지 않고 입력 값에 대해서만 값의 변환이 있으므로 순수함수이다.

순수 함수는 프로그램의 변화 없이 입력 값에 대한 결과를 예상 할 수 있어 테스트가 용이하다.

2. 비상태, 불변성 (Stateless, Immutability)

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
let person = {name: 'sarah', age:'40'};
function increaseAge(person){
	person.age = person.age + 1;
    return person;
}

위 예제에서는 increaseAge함수에서 전역으로 선언된 person의 age속성을 변경하므로 불변성 유지를 만족하지 못한다.

const person = {name: 'sarah', age:'40'};
function increaseAge(person){
	return {...person, age: person.age + 1};
}

위처럼 객체의 값을 바꾸기 위해서는 데이터의 복사본을 만들어, 그 복사본을 사용해 작업을 진행하고 반환한다.

3. 선언형 함수(Exoressions)

명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언형 프로그래밍을 무엇을 할 것인가에 주목한다.

let numbers = [1,2,3];
function multiply(numbers,multiplier){
	for(let i = 0; i < numbers.length; i++){
    	numbers[i] = numbers[i] * multiplier;
    }
}

위 예시는 for문을 사용해서 배열의 각 요소에 multiplier를 곱해주는 명령형 프로그래밍이다.

함수형 프로그래밍에서는 마찬가지로 if, switch, for 등 명령문을 사용하지 않고 함수형 코드로 사용해야 한다.

function multiply(number,multiplier){
	return number.map((num) => num * multiplier);
}

위 예시는 for문을 map으로 대치했고, javascript에서는 filter, map, take, reduce들의 함수형 코드를 사용한다.

4 . 1급 객체와 고차함수(first-class, Higher-oder functions)

함수형 프로그래밍에서는 함수가 1급객체가 된다.

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

아래 예시는 함수를 변수에 할당하거나 반환하는 1급 객체로서의 특징을 보여준다.

const add = (num) => num + 2;
const multiply = (num) => num * 2;
const transform = (num) => num.map(add).map(multiply);
console.log(trasform([1,2,3,4])); //[6,8,10,12]

고차함수의 특징은 아래와 같다.

  • 함수를 인자로써 전달 할 수 있어야 한다.
  • 함수의 반환 값으로 또 다른 함수를 사용할 수 있다.
const addString = (name) => (age) => age + name;
const name = addString('sarah');
console.log(name('40'))//40sarah
profile
Surround yourself with people who inspire you to do the impossible

0개의 댓글