함수형 프로그래밍

유재우·2022년 12월 13일
0

CS공부

목록 보기
19/26

함수형 프로그래밍

하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식

자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로드래밍 패러다임

함수형 프로그래밍의 특징

1. 순수함수

  • 동일한 입력엔 항상 같은 값을 반환해야하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것

let num = 1;
function add(a) {
	return a + num;
}

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

function add(a, b) {
	return a + b;
}
const result = add(2, 3);

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


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

2. 비상태, 불변성

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.

let person = {name: "jaewoo", age: "25"};
function increaseAge(person) {
	person.age = person.age + 1;
    return person;
}

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

// 비상태, 불변성 만족
const person = { name: "jaewoo", age: "25" };
function increaseAge(person) {
    return { ...person, age: person.age + 1 };
}

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


3. 선언형 함수

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

위의 예시에선 for문을 사용해 배열의 각 요소에 mutiplier 곱해주는 명령형 프로그래밍이다.
함수형 프로그래밍에서는 마찬가지로 if,switch,for 등 명령문을 사용하지 않고 함수형 코드로 사용해야한다.

// 선언형 프로그래밍
function multiply(number, multiplier) {
    return number.map((num) => num * multiplier);
}

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


4.1급 객체와 고차함수

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.
// 1급 객체
const addTwo = (num) => num + 2;
const multiplyTwo = (num) => num * 2;
const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1, 2, 3, 4])); // [6, 8, 10, 12]

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


그리고 고차 함수의 속성을 가져야 하는데, 고차 함수의 특징은 다음과 같다.

  • 함수를 인자로써 전달 할 수 있어야 한다.
  • 함수의 반환 값으로 또 다른 함수를 사용 할 수 있다
// 고차 함수
const addInform = (name) => (age) => age + name;
const jaewoo = addInform("재우");
console.log(jaewoo("98")); // 98재우

위의 예제처럼 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 한다.


함수형 프로그래밍의 장단점

장점

  • 높은 수준의 추상화를 제공한다.
  • 함수 단위의 코드 재사용이 수월하다.
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬어진다

단점

  • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다.
  • 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다.
  • 순수함수를 사용하는 것는 쉬울수 있지만 조합하는 것은 쉽지 않다.

참고한 블로그 링크

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글