프로그래밍공부(Programming Study)/IOS 개발

Swift 클로저와 콜백 함수의 모든 것 - 개념, 문법, 특징, 코드 예제 완벽 정리

Chann._.y 2024. 11. 9.
728x90

1. 클로저와 콜백 함수의 기본 개념

클로저(Closure)

클로저는 코드의 특정 동작을 캡슐화하여 전달할 수 있는 코드 블록입니다. Swift에서 클로저는 변수나 상수에 저장되거나, 함수의 매개변수로 전달될 수 있는 독립적인 코드 블록으로, 함수와 유사한 역할을 합니다.

Swift의 클로저는 주로 비동기 작업이나 일회성 작업을 처리하는 데 사용되며, 익명 함수처럼 이름 없이 사용할 수 있어 코드가 유연해집니다.

콜백 함수(Callback Function)

콜백 함수특정 작업이 완료된 후 실행되는 함수로, 주로 비동기 작업에서 사용됩니다. 비동기 작업이 끝난 후, 결과를 처리하거나 이후 동작을 수행할 때 콜백 함수를 호출하여 필요한 작업을 처리합니다. Swift에서는 클로저가 콜백 함수로 사용되어 비동기 작업의 완료 시점을 제어할 수 있습니다.


2. 클로저와 콜백 함수의 특징

  • 비동기 작업에 필수적: 클로저와 콜백 함수는 비동기 작업의 완료 후 동작을 정의하는 데 유용합니다. 네트워크 요청, 파일 읽기/쓰기 등에서 주로 사용됩니다.
  • 특정 시점에서 호출 가능: 클로저는 함수의 매개변수로 전달되며, 비동기 작업 완료 후, 특정 조건 충족 시 실행할 수 있습니다.
  • 환경 캡처: 클로저는 자신이 정의된 환경에 있는 변수를 캡처할 수 있어, 해당 변수의 값을 유지하거나 변경할 수 있습니다.
  • 간결한 문법 제공: Swift에서는 매개변수와 반환 타입을 생략하거나 $0, $1과 같은 축약 문법을 사용할 수 있어 코드가 간결해집니다.

3. 클로저의 기본 문법과 변형 문법

Swift에서 클로저는 함수와 매우 유사한 문법으로 정의됩니다. 기본 문법은 아래와 같습니다.

기본 문법

{ (parameters) -> ReturnType in
    // 클로저가 수행할 코드
}
  • parameters: 함수처럼 매개변수 목록을 정의합니다.
  • ReturnType: 클로저가 반환할 값의 타입을 정의합니다.
  • in: 매개변수와 반환 타입 정의를 마치고 클로저 본문을 시작하는 구분자입니다.

예제: 기본 문법을 사용한 클로저

let greetingClosure = { (name: String) -> String in
    return "Hello, \(name)!"
}

print(greetingClosure("Swift Learner")) // 출력: "Hello, Swift Learner!"

이 예제에서 greetingClosurename을 받아 인사 메시지를 반환하는 클로저입니다. 이와 같은 기본 문법에서, Swift는 문맥에 따라 다양한 축약 문법을 제공합니다.


클로저의 변형 문법

Swift에서는 클로저를 더욱 간결하게 작성할 수 있는 여러 가지 축약 문법을 제공합니다.

  1. 타입 추론을 이용한 매개변수와 반환 타입 생략
    let numbers = [5, 2, 7, 3, 1]
    let sortedNumbers = numbers.sorted(by: { a, b in a < b })
    위 코드에서 numbersInt 타입 배열로, 클로저의 타입 (Int, Int) -> Bool을 추론할 수 있어 타입 선언을 생략해도 됩니다.
  2. Swift는 클로저의 타입을 추론할 수 있으므로, 매개변수와 반환 타입을 생략할 수 있습니다.
  3. 단일 표현식에서 return 생략
    let sortedNumbers = numbers.sorted(by: { a, b in a < b })
    클로저가 단일 표현식일 때 Swift는 자동으로 return을 추가해 반환값을 처리합니다.
  4. 클로저가 단일 표현식인 경우에는 return을 생략할 수 있습니다.
  5. 후행 클로저(Trailing Closure) 문법
    let sortedNumbers = numbers.sorted { a, b in a < b }
    후행 클로저를 사용하면 sorted(by:) 메서드의 괄호를 생략해 코드가 간결해집니다.
  6. 클로저가 함수의 마지막 매개변수라면 후행 클로저 문법을 사용하여 함수 호출 괄호 () 뒤에 클로저를 작성할 수 있습니다.
  7. 매개변수 이름 축약 ($0, $1 사용)
    let sortedNumbers = numbers.sorted { $0 < $1 }
    이 최종 형태는 매우 간결하며, 첫 번째 매개변수와 두 번째 매개변수를 각각 $0, $1로 표현하여 코드가 깔끔하게 정리됩니다.
  8. Swift는 첫 번째 매개변수를 $0, 두 번째 매개변수를 $1 등의 단축 이름으로 자동 제공하여 더욱 간단히 표현할 수 있습니다.

4. 클로저와 콜백 함수 예제 (자세한 코드 설명 포함)

클로저와 콜백 함수가 비동기 작업에서 어떻게 동작하는지 자세한 코드 예제를 통해 설명하겠습니다.

예제: 이미지 다운로드 비동기 작업에 사용된 클로저와 콜백 함수

이 예제에서는 이미지 다운로드가 완료되었을 때 콜백 함수가 실행되어 다운로드 성공 여부를 출력합니다.

func downloadImage(url: String, completion: @escaping (Bool) -> Void) {
    print("이미지 다운로드 시작")

    // 비동기 작업을 시뮬레이션하기 위해 지연 처리
    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        let success = true // 다운로드 성공 여부를 시뮬레이션
        completion(success) // 작업 완료 후 콜백 함수 호출
    }
}

downloadImage(url: "https://example.com/image.png") { success in
    if success {
        print("이미지 다운로드 성공!")
    } else {
        print("이미지 다운로드 실패")
    }
}

라인별 설명

  1. func downloadImage(url: String, completion: @escaping (Bool) -> Void) {
    • downloadImage 함수는 이미지 URL다운로드 완료 후 실행할 클로저(completion)를 매개변수로 받습니다.
    • completionBool 타입 매개변수를 받고, 성공 여부를 나타내는 콜백 함수입니다.
    • @escaping 키워드를 사용해, 이 클로저가 비동기 작업 완료 후에도 실행될 수 있도록 설정합니다.
  2. print("이미지 다운로드 시작")
    • 이미지 다운로드 작업이 시작되었음을 알리기 위해 "이미지 다운로드 시작"을 출력합니다.
  3. DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { ... }
    • 2초 후에 비동기 작업을 시뮬레이션하며, 지연 처리를 통해 실제 네트워크 요청과 같은 효과를 냅니다.
  4. let success = true
    • 다운로드 성공 여부를 나타내는 Bool 타입의 success 변수를 선언합니다. 여기서는 다운로드 성공을 가정하여 true로 설정합니다.
  5. completion(success)
    • 작업이 완료되면 completion 클로저를 호출하고, success 값을 인수로 전달합니다.
    • 호출된 콜백 함수가 다운로드 성공 여부에 따라 처리 작업을 수행합니다.
  6. downloadImage(url: "https://example.com/image.png") { success in ... }
    • downloadImage 함수를 호출하면서, 작업이 끝났을 때 실행할 콜백 클로저를 함께 전달합니다.
    • 이 콜백 클로저는 작업 성공 여부를 인수로 받아 성공, 실패 메시지를 출력합니다.
  7. if success { ... }
    • 다운로드가 성공한 경우 "이미지 다운로드 성공!"을 출력하고, 실패 시 "이미지 다운로드 실패"를 출력합니다.

실행 결과

  • 함수가 호출되면 "이미지 다운로드 시작"이 출력됩니다.
  • 2초 후 completion(success)가 호출되며 성공 여부를 전달합니다.
  • success 값이 true이므로 "이미지 다운로드 성공!"이 출력됩니다.

이 예제에서 콜백 함수는 비동기 작업이 완료된 후 실행되어, 다운로드 성공 여부에 따라 다른 작업을 수행하게 됩니다.


5. 요약

Swift에서 클로저와 콜백 함수는 비동기 작업의 결과를 처리하거나, 코드의 특정 동작을 캡슐화하여 나중에 실행할 수 있는 강력한 도구입니다. 클로저와 콜백 함수를 통해 비동기 작업이 완료된 후의 동작을 제어할 수 있으며, Swift의 클로저 문법 덕분에 코드가 간결해집니다.

이 예제처럼 클로저와 콜백 함수는 네트워크 요청, 데이터 로드, 이벤트 처리 등에서 필수적인 역할을 합니다. 클로저의 사용법과 비동기 작업 처리 방식을 잘 이해하면 Swift에서 더욱 효율적인 비동기 작업 처리가 가능합니다.

728x90

댓글