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

Scala 콜백 함수 (Higher-Order Functions)

Scala 콜백 함수 (Higher-Order Functions) — 초급

콜백 함수 (Higher-Order Functions)

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

콜백 함수는 프로그래밍에서 매우 중요한 개념으로, 특히 Scala와 같은 함수형 프로그래밍 언어에서 그 활용도가 높습니다. 실무에서는 비동기 처리, 이벤트 핸들러, 데이터 변환 등 다양한 상황에서 콜백 함수를 사용합니다. 만약 이 개념을 이해하지 못한다면, 복잡한 로직을 구현하는 데 어려움을 겪거나, 코드의 재사용성을 떨어뜨릴 수 있습니다. 결과적으로 팀과의 협업에서 비효율성을 초래하고, 유지보수 또한 어렵게 만들 수 있습니다.

2. 핵심 개념 설명

콜백 함수는 다른 함수의 인자로 전달되어 실행되는 함수를 의미합니다. 쉽게 말해, 여러분이 친구에게 집에 있는 물건을 빌려달라고 요청했을 때, 친구가 나중에 그 물건을 가져다주는 상황을 떠올릴 수 있습니다. 여기서 친구가 여러분이 요청한 물건을 "가져다주는" 역할이 콜백 함수입니다.

관련 용어 정리

용어설명
고차 함수함수를 인자로 받거나 함수를 반환하는 함수
순수 함수부작용이 없는 함수
비동기 처리다른 작업을 기다리지 않고 동시에 실행하는 방식

3. 기본 코드 예제

아래는 콜백 함수를 사용하는 기본적인 코드 예제입니다.

def processNumbers(numbers: List[Int], callback: Int => Int): List[Int] = {
  numbers.map(callback) // numbers 리스트의 각 요소에 callback 함수를 적용
}

val numbers = List(1, 2, 3, 4, 5)
val doubled = processNumbers(numbers, (x: Int) => x * 2) // 각 숫자를 2배로 만드는 콜백 함수

// 실행 결과: List(2, 4, 6, 8, 10)
println(doubled)
  • processNumbers 함수는 두 개의 매개변수를 받습니다: 정수 리스트와 콜백 함수.
  • numbers.map(callback)은 리스트의 각 요소에 콜백 함수를 적용합니다.
  • doubled 변수는 processNumbers 호출 결과로, 각 숫자가 2배로 증가한 리스트입니다.
  • 마지막으로 println(doubled)을 통해 결과를 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니를 구현할 때

    장바구니에 담긴 상품의 가격을 할인하는 기능을 구현할 수 있습니다.

    def applyDiscount(prices: List[Double], discount: Double => Double): List[Double] = {
      prices.map(discount)
    }
    
    val prices = List(100.0, 200.0, 300.0)
    val discountedPrices = applyDiscount(prices, (price: Double) => price * 0.9) // 10% 할인
    
    // 실행 결과: List(90.0, 180.0, 270.0)
    println(discountedPrices)

    예제 2: 이벤트 처리

    버튼 클릭 이벤트를 처리하는 예제입니다.

    def onClick(eventHandler: () => Unit): Unit = {
      println("버튼이 클릭되었습니다.")
      eventHandler() // 클릭 시 실행할 함수를 호출
    }
    
    onClick(() => println("이벤트 핸들러가 실행되었습니다.")) // 이벤트 핸들러 전달
    
    // 실행 결과:
    // 버튼이 클릭되었습니다.
    // 이벤트 핸들러가 실행되었습니다.

    5. 흔한 실수와 주의사항

    실수 1: 콜백 함수에 잘못된 인자를 전달

    // 잘못된 예
    val wrongUsage = processNumbers(numbers, (x: String) => x.toInt) // String을 Int로 변환하는 예
  • 올바른 예: 적절한 타입의 인자를 전달해야 합니다.
  • 실수 2: 비동기 처리에서 콜백을 사용하지 않음

    비동기 작업에서 결과를 사용할 때 콜백을 잊어버리면 의도한 동작을 하지 않을 수 있습니다.

    6. 정리

  • 콜백 함수는 다른 함수의 인자로 전달되어 실행되는 함수입니다.
  • 고차 함수와 함께 사용되며, 비동기 처리와 이벤트 핸들링에 활용됩니다.
  • 실무에서 자주 사용되는 패턴으로는 데이터 처리 및 이벤트 처리 패턴이 있습니다.

다음에 학습하면 좋은 주제는 비동기 프로그래밍과 고차 함수의 다양한 활용법입니다.