본문 바로가기
카테고리 없음

14. 클로저(Closure)와 캡처

by swifttt 2025. 4. 3.

 

클로저(Closure)는 코드에서 독립적인 기능 블록을 변수처럼 저장하거나 전달할 수 있게 해주는 구조입니다.
Swift의 클로저는 익명 함수로 생각할 수 있으며, 함수와 동일하게 매개변수와 반환값을 가질 수 있습니다.

Swift에서는 클로저가 매우 강력하며, 특히 비동기 처리, 이벤트 핸들링, 컬렉션 고차 함수 등에 널리 사용됩니다.
또한, 클로저는 주변 변수나 상수를 캡처(Capture) 하여 사용할 수 있습니다.

1. 기본 클로저 문법

클로저는 중괄호 {}를 사용하며, 아래 형식으로 작성합니다.

{ (매개변수 목록) -> 반환타입 in
    실행 코드
}

가장 단순한 형태의 클로저는 다음과 같습니다.

let greeting = {
    print("안녕하세요!")
}

greeting() // 안녕하세요!

2. 매개변수와 반환값이 있는 클로저

let add = { (a: Int, b: Int) -> Int in
    return a + b
}

let result = add(3, 5)
print(result) // 8

클로저도 함수처럼 입력과 출력을 가질 수 있으며, 변수처럼 다룰 수 있습니다.

3. 클로저 축약 문법

let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8]
  • 매개변수 타입과 반환 타입 생략 가능
  • in 키워드 이후 단일 표현식이면 return 생략 가능
  • 매개변수 이름은 $0, $1, … 로 대체 가능

4. 함수의 인자로 클로저 전달

func operate(_ a: Int, _ b: Int, with operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let result = operate(4, 2, with: { $0 * $1 })
print(result) // 8

이러한 방식은 연산, 정렬, 필터링, 비동기 처리 등에 활용됩니다.

5. 후행 클로저(Trailing Closure)

let result = operate(5, 3) { $0 - $1 }
print(result) // 2

후행 클로저는 특히 콜백 형태의 함수에서 가독성을 높이는 데 유리합니다.

6. 클로저의 캡처(Capture)

클로저는 외부 변수나 상수를 캡처하여 클로저 내부에서 사용할 수 있습니다.
이러한 변수는 클로저가 생성될 당시의 상태를 유지합니다.

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let counter = makeCounter()
print(counter()) // 1
print(counter()) // 2

위 예제에서 countmakeCounter() 함수가 종료되었음에도 클로저 내부에 의해 유지됩니다.

마무리

Swift에서 클로저는 함수형 프로그래밍 스타일을 구현하고, 비동기 작업이나 데이터 변환을 간결하게 처리하는 데 필수적인 도구입니다.
클로저 문법과 축약 형태를 잘 이해하고, 클로저의 캡처 특성을 적절히 활용하면 더욱 강력하고 효율적인 Swift 코드를 작성할 수 있습니다.