IOS개발: SWIFT/3. 함수의 세계로

Swift 클로저: 클로저의 기본 개념, 인라인 클로저, 트레일링 클로저, 캡처 리스트

_Blue_Sky_ 2024. 9. 12. 15:14
728x90
728x90

Swift 클로저: 심층 탐구

클로저의 기본 개념

클로저는 함수처럼 동작하는 코드 블록입니다. 함수와 마찬가지로 인자를 받고 값을 반환할 수 있으며, 다른 함수에 전달하거나 변수에 할당할 수 있습니다. 클로저는 코드를 더욱 간결하고 표현력 있게 만들어주는 Swift의 강력한 기능 중 하나입니다.

클로저의 장점:

  • 함수형 프로그래밍: 고차 함수, 람다 표현식 등 함수형 프로그래밍 패러다임을 지원합니다.
  • 코드 간결화: 반복적인 코드를 줄이고, 코드 가독성을 높입니다.
  • 콜백: 비동기 작업이나 이벤트 처리 시 콜백 함수로 사용됩니다.

인라인 클로저

인라인 클로저는 함수의 인자로 직접 전달되는 클로저입니다. 함수 호출 시점에 클로저를 정의하여 사용합니다.

func greet(name: String, completionHandler: (String) -> Void) {
    print("Hello, \(name)!")
    completionHandler("Nice to meet you!")
}

greet(name: "Swift") { message in
    print(message)
}
 

위 예시에서 completionHandler는 클로저 타입의 매개변수입니다. greet 함수를 호출할 때 { message in ... } 부분이 인라인 클로저로 전달됩니다.

트레일링 클로저

함수의 마지막 매개변수가 클로저일 경우, 함수 괄호 바깥에 별도의 줄에 작성할 수 있습니다. 이를 트레일링 클로저라고 합니다.

numbers.map { number in 
    return number * 2
}
 

위 예시에서 map 함수의 마지막 매개변수가 클로저이므로 트레일링 클로저 형식으로 작성되었습니다.

캡처 리스트

클로저는 자신이 정의된 범위 밖의 변수나 상수를 참조할 수 있습니다. 이를 캡처라고 하며, 캡처하는 변수나 상수를 캡처 리스트에 명시적으로 지정할 수 있습니다.

var completionHandlers: [() -> Void] = []
for index in 1...3 {
    completionHandlers.append {
        print("Index: \(index)")
    }
}
 

위 예시에서 클로저는 index 변수를 캡처하여 각 클로저마다 다른 값을 출력합니다.

클로저의 축약 표현

Swift는 클로저를 더욱 간결하게 작성할 수 있는 다양한 축약 표현을 제공합니다.

  • 단축 인자 이름: 클로저의 매개변수 이름을 생략하고 $0, $1 등의 인덱스로 접근할 수 있습니다.
  • 암시적 반환 값: 클로저의 본문이 단일 표현식으로 구성된 경우, return 키워드를 생략할 수 있습니다.
  • 트레일링 클로저: 앞서 설명한 것처럼 함수의 마지막 매개변수가 클로저일 경우, 함수 괄호 바깥에 별도의 줄에 작성할 수 있습니다.

클로저 활용 예시

  • 고차 함수: map, filter, reduce 등의 고차 함수를 사용하여 데이터를 변형하거나 필터링할 수 있습니다.
  • 콜백: 비동기 작업의 완료 시 호출되는 콜백 함수로 사용됩니다.
  • 델리게이트: 객체 간의 통신을 위한 델리게이트 패턴에서 사용됩니다.
  • 클로저 기반의 API: 많은 Swift API들이 클로저를 인자로 받아 유연한 프로그래밍을 지원합니다.

결론

클로저는 Swift에서 매우 중요한 개념으로, 함수형 프로그래밍을 가능하게 하고 코드를 더욱 간결하고 표현력 있게 만들어줍니다. 인라인 클로저, 트레일링 클로저, 캡처 리스트 등 다양한 기능을 활용하여 코드를 효율적으로 작성할 수 있습니다.

728x90
728x90