IMCAT.DEV
로그인 가입
Dart 중급 함수형

Dart 함수형 프로그래밍 패턴

Dart 함수형 프로그래밍 패턴 — 중급

함수형 프로그래밍 패턴

1. 도입 (왜 배워야 하는가)

함수형 프로그래밍 패턴은 현대 소프트웨어 개발에서 점점 더 중요해지고 있습니다. 특히 Dart와 같은 언어에서 함수형 프로그래밍을 활용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다. 함수형 프로그래밍은 상태를 변경하지 않고, 순수 함수를 사용하여 데이터를 다루는 방식을 강조합니다.

이러한 패턴을 이해하지 못하면 다음과 같은 문제가 발생할 수 있습니다:

  • 코드의 복잡성이 증가하여 디버깅이 어려워진다.
  • 사이드 이펙트로 인해 함수의 동작이 예측 불가능해질 수 있다.
  • 재사용 가능한 코드 작성이 어려워져, 중복 코드가 많이 발생하게 된다.
  • 2. 핵심 개념 설명

    함수형 프로그래밍 패턴의 핵심 개념들은 다음과 같습니다:

  • 순수 함수: 동일한 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않는 함수입니다.
  • - 비유: 레시피를 따라 만든 요리는 항상 같은 재료로 만들면 같은 맛이 나야 합니다.

  • 고阶 함수: 다른 함수를 인자로 받거나, 함수를 반환하는 함수입니다.
  • - 비유: 요리사가 다른 요리사에게 레시피를 가르치는 것과 같습니다.

  • 불변성: 데이터가 한 번 생성된 이후에는 변경할 수 없는 특성을 의미합니다.
  • - 비유: 한 번 만든 조각상을 다시 바꾸는 것이 아니라, 새로운 조각상을 만드는 것과 같습니다.

    용어설명
    순수 함수외부 상태에 영향을 주지 않고, 동일한 입력에 대해 동일한 출력을 반환하는 함수
    고阶 함수함수를 인자로 받거나 함수를 반환하는 함수
    불변성데이터가 생성된 이후에 변경되지 않는 성질

    3. 기본 코드 예제

    다음은 순수 함수의 간단한 예제입니다.

    int add(int a, int b) {
      return a + b; // 두 숫자를 더한 값을 반환합니다.
    }
    
    void main() {
      print(add(2, 3)); // 5
    }
  • add: 두 개의 정수를 받아 합계를 계산하는 순수 함수입니다.
  • main: add 함수를 호출하여 결과를 출력합니다.
  • 실행 결과

    5
  • add(2, 3) 호출 시 5를 반환합니다. 항상 같은 입력에 대해 같은 출력을 보장합니다.
  • 4. 실전 활용 예제

    예제 1: 필터링 기능

    쇼핑몰에서 장바구니에 추가된 상품 중 10000원 이상의 상품만 필터링하는 예제입니다.

    List<double> filterExpensiveItems(List<double> items) {
      return items.where((item) => item >= 10000).toList(); // 10000원 이상의 상품만 필터링합니다.
    }
    
    void main() {
      List<double> cartItems = [5000, 15000, 3000, 20000];
      print(filterExpensiveItems(cartItems)); // [15000.0, 20000.0]
    }

    예제 2: 맵핑 기능

    장바구니에 있는 상품의 가격에 10% 할인을 적용하는 예제입니다.

    List<double> applyDiscount(List<double> items) {
      return items.map((item) => item * 0.9).toList(); // 10% 할인 적용
    }
    
    void main() {
      List<double> cartItems = [10000, 20000, 30000];
      print(applyDiscount(cartItems)); // [9000.0, 18000.0, 27000.0]
    }

    5. 흔한 실수와 주의사항

    실수 1: 상태 변경

    List<int> numbers = [1, 2, 3];
    
    void addNumber(int number) {
      numbers.add(number); // 상태를 변경합니다.
    }

    올바른 코드:

    List<int> addNumber(List<int> numbers, int number) {
      return [...numbers, number]; // 새로운 리스트를 반환합니다.
    }

    실수 2: 비순수 함수 사용

    int counter = 0;
    
    int increment() {
      counter++; // 외부 상태를 변경합니다.
      return counter;
    }

    올바른 코드:

    int increment(int count) {
      return count + 1; // 외부 상태를 변경하지 않습니다.
    }

    6. 정리

  • 함수형 프로그래밍은 코드의 가독성과 유지보수성을 높여준다.
  • 순수 함수, 고阶 함수, 불변성을 이해하고 활용하는 것이 중요하다.
  • 실무에서 자주 사용하는 패턴을 익혀야 실제 프로젝트에 효과적으로 적용할 수 있다.
  • 다음에 학습하면 좋은 주제:

  • Dart의 비동기 프로그래밍
  • 객체지향 프로그래밍과 함수형 프로그래밍의 결합
  • 고급 함수형 프로그래밍 패턴 (예: 커링, 파이프라인)