2 분 소요


함수형 프로그래밍

함수형 프로그래밍은 부수 효과가 없는 순수 함수를 이용하여 프로그램을 만드는 것으로, 상태 변화와 가변 데이터를 멀리하는 프로그래밍 패러다임이다.
거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지 보수를 용이하게 해준다.

특징

부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.

부수 효과(Side Effect)

함수 내의 동작으로 인해 함수 외부가 영향을 받는 것을 의미한다.
예를 들면 함수 내의 동작으로 함수 밖의 변수 값이 변경되거나, 예외나 오류가 발생하여 실행이 중단되는 것 등을 뜻한다.

순수 함수

부수 효과(Side Effect)를 제거한 함수를 순수 함수라고 부르며, 함수형 프로그래밍에서 사용하는 함수는 이런 순수 함수들이다.

  • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 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);

단점

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

1급 객체

1급 객체란 다음과 같은 것들이 가능한 객체를 의미한다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
process(10, print(num));

무상태, 불변성(Stateless, Immutability)

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고, 그 데이터의 복사본을 만들어서 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
let person = { name: "jongmin", age: "26" };

function increaseAge(person) {
    person.age = person.age + 1;
    return person;
}

increaseAge 함수에서 전역으로 선언된 personage 속성을 변경하므로 불변성 유지를 만족하지 못한다.

// 비상태, 불변성 만족
const person = { name: "jongmin", age: "26" };

function increaseAge(person) {
    return { ...person, age: person.age + 1 };
}

선언형 함수(Declarations)

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

let numbers = [1, 2, 3];

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

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

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

참조 투명성(Referential Transparency)

함수형 프로그래밍에서 함수는 항상 같은 동작을 진행한다.
따라서, 프로그래머는 함수의 실행으로 인해 어떤 결과를 반환할지 예측할 수 있다.
즉, 동일한 인자에 대해서는 항상 동일한 결과를 반환한다는 의미다.

불변성

  • 함수 외부에서 데이터를 수정하지 않음
  • 함수의 계산을 수행하는 동안 변수에 할당된 값들이 절대 변하지 않음

장점

  • 높은 수준의 추상화를 제공한다.
  • 더 나은 모듈화와 짧은 코드를 제공한다.
  • 개발 생산성을 높일 수 있다.
  • 가독성이 높은 코드를 작성하기 쉽다.
  • 부수효과를 제거할 수 있다.
  • 함수 단위의 코드 재사용이 쉽다.
  • 프로그램의 동작을 예측하기 쉽다.

단점

  • 수 많은 함수들을 파악하고, 유지 관리하기 힘들다.
  • 함수가 많아질 수록 함수를 조합하기 복잡해지며, 꾸준한 리팩토링이 필요할 수 있다.

댓글남기기