Swift 입문 | 함수 리터럴 및 클로저 | 클로저 (Closure)


이 “값으로써의 함수"의 기본을 알았으니, 이제 Swift의 중심 기능인 “클로저(Closure)“를 사용해 보기로하자.

클로저라고 하는 것은 “값으로써 함수를 인수로 지정하고 다른 함수에 전달하여 사용한다"는 방식이다. 함수는 값이기에 함수 자체를 인자로 지정한 함수도 만들 수 있다.

이렇게 함수의 처리 자체를 인수로 지정하고 다른 함수에 전달하는 기능이 클로저이다.

이는 실제로 보지 않으면 왠지 생소하게 느껴질 것이다. 아래에 간단한 사용 예제를 보도록 하자.

func calc(num:Int)->Int {
    var res = 0
    for n in 0...num {
        res += n
    }
    return res
}

func printResult(function:(num:Int)->Int, n:Int) {
    print(function(num: n))
}

printResult(calc, n: 123)

여기에서는 calc와 printResult라는 2개의 함수를 정의하고 있다. calc는 이전까지의 샘플과 동일하고 0부터 인수 값까지의 합을 계산하여 반환하는 예제이다. 클로저를 사용하는 함수는 printResult이다.

이 printResult에서는 함수와 Int 값을 인수로 전달된다. 함수의 형태는 (num:Int)->Int으로 지정되어 있다. 이것으로 calc 함수를 인수로 전달하여 호출하면 내부적으로 함수를 실행하고 결과가 출력되는 거다.

이 printResult은 단순히 “calc의 결과를 출력한다"는 것은 아니다. 인수 전달은 calc가 아니어도 상관없다. Int 값을 인수로 전달 Int 값을 반환하는 함수라면 무엇이든 전달해서 사용할 수 있다.

즉, 클로저를 사용하면 “처리를 외부로 분리할 수 있다"라는 장점이 있다. 이것이 클로저를 사용하는 큰 장점이다.