BackEnd

함수형 프로그래밍이란?

Raconer 2025. 1. 19. 19:21
728x90
함수형 프로그래밍(Functional Programming)은 프로그래밍 패러다임 중 하나로,
프로그램을 수학적 함수의 조합으로 표현하고 **상태 변화와 부수 효과(Side Effect)**를 최소화하는 것을 목표로 합니다.
이 패러다임은 순수 함수를 기반으로 하며, 데이터를 변형하거나 상태를 변경하지 않고 결과를 도출하는 데 초점을 둡니다.

핵심 개념

  1. 순수 함수(Pure Function)
    • 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수입니다.
    • 외부 상태를 변경하지 않고 부수 효과(Side Effect)가 없습니다.
    • 예:
      // 순수 함수의 예
      const add = (a, b) => a + b;
      console.log(add(2, 3)); // 항상 5 반환
      
  2. 불변성(Immutability)
    • 데이터는 변경되지 않고, 변경이 필요한 경우 기존 데이터를 복사하여 새로운 데이터를 생성합니다.
    • 예:
      const numbers = [1, 2, 3];
      const newNumbers = [...numbers, 4]; // 기존 배열은 변경되지 않음
      
  3. 고차 함수(Higher-Order Function)
    • 함수를 인자로 전달하거나 반환할 수 있는 함수입니다.
    • 예:
      const applyFunction = (fn, value) => fn(value);
      const double = x => x * 2;
      console.log(applyFunction(double, 5)); // 10
      
  4. 일급 객체(First-Class Citizen)
    • 함수가 변수처럼 사용되며, 다른 함수의 인자로 전달되거나 반환값으로 사용할 수 있습니다.
    • 함수는 값처럼 취급됩니다.
  5. 선언형 프로그래밍(Declarative Programming)
    • **어떻게(How)**가 아닌 무엇을(What) 수행할지에 집중합니다.
    • 예:
      // 명령형 (Imperative)
      let sum = 0;
      for (let i = 0; i < numbers.length; i++) {
        sum += numbers[i];
      }
      
      // 선언형 (Declarative)
      const sum = numbers.reduce((acc, curr) => acc + curr, 0);
      
  6. 지연 평가(Lazy Evaluation)
    • 필요할 때만 계산을 수행합니다. 이는 성능 최적화에 유리합니다.
    • 예: JavaScript의 map, filter 등은 체인을 형성한 후 최종 평가 시 수행됩니다.

장점

  1. 가독성: 코드가 간결하고 명확하며, 유지보수가 용이합니다.
  2. 병렬 처리에 유리: 상태 변화가 없으므로, 병렬 처리와 동시성 문제가 적습니다.
  3. 테스트 용이성: 순수 함수는 독립적이기 때문에 테스트하기 쉽습니다.
  4. 버그 감소: 부수 효과가 없기 때문에 코드 오류를 줄일 수 있습니다.

단점

  1. 학습 곡선: 기존 명령형 프로그래밍에 익숙한 개발자에게는 다소 어렵게 느껴질 수 있습니다.
  2. 성능 문제: 불변성 때문에 데이터를 복사해야 하므로 메모리 사용량이 증가할 수 있습니다.
  3. 디버깅: 함수 체인이 길어지면 디버깅이 복잡해질 수 있습니다.

대표 언어

  • 함수형 프로그래밍을 지원하는 언어:
    • JavaScript (ex: map, reduce, filter)
    • Python (ex: lambda, map, filter)
    • Scala
    • Haskell (순수 함수형 언어)
    • Clojure
    • Elixir

예제: JavaScript에서의 함수형 프로그래밍

const numbers = [1, 2, 3, 4, 5];

// 순수 함수 사용
const double = x => x * 2;

// 고차 함수 활용 (map, filter, reduce)
const result = numbers
  .map(double)        // [2, 4, 6, 8, 10]
  .filter(x => x > 5) // [6, 8, 10]
  .reduce((sum, x) => sum + x, 0); // 24

console.log(result); // 24

질문

  1. 그럼 성능적으로 장단점
  2. // 명령형 (Imperative)
    let sum = 0;
    for (let i = 0; i < numbers.length; i++) { sum += numbers[i]; }

    // 선언형 (Declarative)
    const sum = numbers.reduce((acc, curr) => acc + curr, 0);

    각각 명령형과 선언형인데 함수를 만들어서 명령형을 사용하는거랑 무슨차이야?
 

명령형과 선언형 차이[성능_예시]

1. 성능 차이의 주요 요인명령형 스타일직접적인 상태 변경과 제어를 통해 CPU와 메모리 사용을 최적화할 수 있음.루프를 명시적으로 작성하므로, 추가적인 함수 호출 및 클로저 생성이 없어 오

raconer.tistory.com

 

명령형과 선언형 차이[이론]

1. 명령형 스타일에서 함수를 사용하는 경우명령형 스타일은 **"어떻게 수행할지(how)"**를 세부적으로 명시합니다. 함수로 분리하여 코드를 더 읽기 쉽게 만들 수도 있지만, 여전히 실행 순서와

raconer.tistory.com

 

728x90