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

Scala 고차 함수 (Higher-Order Functions) 심화

Scala 고차 함수 (Higher-Order Functions) 심화 — 중급

고차 함수 (Higher-Order Functions) 심화

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

고차 함수는 다른 함수를 인자로 받거나, 함수를 결과로 반환하는 함수입니다. 이는 함수형 프로그래밍의 핵심 개념 중 하나로, 코드의 재사용성과 가독성을 높여줍니다. 실무에서는 데이터 처리, 비동기 프로그래밍, 그리고 이벤트 핸들링 등 다양한 상황에서 고차 함수를 사용하게 됩니다.

고차 함수를 이해하지 못하면, 복잡한 로직을 처리할 때 코드가 길어지고 비효율적이 될 수 있으며, 함수형 프로그래밍의 장점을 누리지 못하게 됩니다. 예를 들어, 리스트를 다룰 때 고차 함수를 사용하면 간단하게 데이터를 필터링하거나 변환할 수 있지만, 고차 함수를 모른다면 복잡한 반복문을 작성해야 할 것입니다.

2. 핵심 개념 설명

  • 고차 함수 (Higher-Order Function): 함수를 인자로 받거나, 함수를 반환하는 함수입니다.
  • 익명 함수 (Anonymous Function): 이름이 없는 함수를 의미하며, 주로 고차 함수의 인자로 사용됩니다.
  • 순수 함수 (Pure Function): 같은 입력에 대해 항상 같은 출력을 반환하고, 외부 상태를 변경하지 않는 함수입니다.
  • 관련 용어 정리

    용어설명
    고차 함수함수를 인자로 받거나 반환하는 함수
    익명 함수이름이 없는 함수
    순수 함수동일한 입력에 대해 항상 동일한 출력을 반환

    3. 기본 코드 예제

    가장 간단한 고차 함수의 예를 살펴보겠습니다. 아래 코드는 두 개의 숫자를 더하는 함수를 인자로 받아서 계산하는 고차 함수입니다.

    // 두 숫자를 계산하는 고차 함수
    def calculate(a: Int, b: Int, operation: (Int, Int) => Int): Int = {
      operation(a, b)
    }
    
    // 덧셈 함수
    val add: (Int, Int) => Int = (x, y) => x + y
    
    // 고차 함수 호출
    val result = calculate(5, 3, add)
    
    // 결과 출력
    println(result) // 8

    실행 결과

    8

    코드 한 줄씩 동작 설명

    1. calculate 함수는 두 개의 정수와 함수를 인자로 받습니다.
    2. add는 두 정수를 더하는 익명 함수입니다.
    3. calculate 함수가 호출되면서 5와 3 그리고 add 함수를 넘깁니다.
    4. calculate 내부에서 operation이 add로 호출되어 5 + 3이 계산됩니다.
    5. 최종적으로 8이 출력됩니다.
    6. 4. 실전 활용 예제

      예제 1: 리스트 필터링

      쇼핑몰에서 상품 리스트에서 특정 조건에 맞는 상품만 필터링할 때 사용할 수 있습니다.

      val products = List("Apple", "Banana", "Cherry", "Date")
      
      // 특정 조건에 맞는 상품을 필터링하는 고차 함수
      def filterProducts(products: List[String], condition: String => Boolean): List[String] = {
        products.filter(condition)
      }
      
      // 상품 이름의 길이가 6 이상인 상품을 찾는 조건
      val longNameCondition: String => Boolean = name => name.length >= 6
      
      // 필터링된 결과
      val filteredProducts = filterProducts(products, longNameCondition)
      println(filteredProducts) // List(Banana, Cherry)

      예제 2: 데이터 변환

      사용자 등록 시, 입력된 데이터를 처리하고 변환할 때 유용합니다.

      val userNames = List("alice", "bob", "charlie")
      
      // 사용자 이름을 대문자로 변환하는 함수
      def transformNames(names: List[String], transform: String => String): List[String] = {
        names.map(transform)
      }
      
      // 대문자로 변환하는 익명 함수
      val toUpperCase: String => String = name => name.toUpperCase
      
      // 변환된 결과
      val upperCasedNames = transformNames(userNames, toUpperCase)
      println(upperCasedNames) // List(ALICE, BOB, CHARLIE)

      5. 흔한 실수와 주의사항

      실수 1: 고차 함수에 잘못된 인자 전달

      // 잘못된 코드
      val wrongResult = calculate(5, "3", add) // Type mismatch error
    7. 올바른 코드: 인자의 타입이 맞는지 확인해야 합니다.
    8. 실수 2: 익명 함수의 범위

      // 잘못된 코드
      def scopeExample(): Unit = {
        val x = 10
        val anonymousFunction = (y: Int) => x + y
      }
    9. 올바른 코드: 익명 함수가 참조하는 변수는 적절한 스코프 내에 있어야 합니다.
    10. 6. 정리

    11. 고차 함수는 함수형 프로그래밍에서 코드의 재사용성과 가독성을 높이는 중요한 개념입니다.
    12. 익명 함수와 순수 함수의 개념은 고차 함수와 함께 이해해야 합니다.
    13. 실무에서 리스트 필터링, 데이터 변환 같은 다양한 상황에서 활용할 수 있습니다.

다음에 학습하면 좋은 주제는 함수형 프로그래밍의 다른 개념인 모나드 또는 컬렉션 처리입니다. 이를 통해 더 복잡한 데이터 처리 방법을 익힐 수 있습니다.