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


클로저를 사용할 때 함수를 값으로 전달해야 한다. 앞의 예제처럼 함수를 미리 정의 해두고, 그것을 인수로 지정해도 물론 가능하다.

하지만 너무 복잡한 처리가 아니라면, 그리고 한 곳에서만 사용하고, 다른 곳에서 쓸 수도 없다면 일부러 함수를 정의하는 것이 귀찮을 수도 있다.

이러한 경우 클로저를 사용한 함수를 사용할 때 함수를 인수로 그 곳에 직접 작성할 수도 있다. 이는 “함수 리터럴"형식으로 작성한다. 함수 리터럴의 작성은 매우 간단하다.

{... 처리 작성 ...}

이것뿐이다. 사실은 Swift에서는 {} 내에 처리를 작한 것은 모든 함수로 취급한다. 다만, 이것만을 인수의 값으로 전달할 수 없기 때문에, 실제로는 다음과 같이 쓰는 경우가 많을 것이다.

{인수 in ... 처리 작성 ...}

인수가 여러 개인 경우 쉼표로 구분하여 작성한다. 이와 같이 함수 리터럴을 사용하여 함수의 값을 직접 인수를 작성하면, 미리 필요한 함수를 정의해 두지 않아도 된다.

아래에 그 이용 예제를 보도록 하자.

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

printResult({n in n * 2}, n: 10)

printResult({n in
    var re:Int = 0
    for num in 0...n {
        re += num
    }
    return re
}, n: 100)

여기에서는 이전 printResult을 정의해서 그것을 호출 처리로 쓰고 있다. 보면 알 수 있듯이, calc 함수는 더 이상 사용하지 않는다. 그 대신에, printResult를 호출할 때 함수 리터럴로 처리를 직접 작성하고 있다.

함수 리터럴은 단순히 하나의 계산식만으로 결과를 얻을 수 있는 경우는 한줄에 함께 쓸 수 있다. in 후에 단지 간단한 식을 쓰는 것만으로 끝난다.

여러 행을 전달하는 처리가 되면 나름대로 복잡하게 되지만, 한줄의 함수 리터럴이라면 간단히 사용하기 쉽다는 것을 알 수 있다.

클로저와 함수 리터럴에 익숙해지지 않으면 왠지 어려울 것 보일 수도 있지만, “함수를 값으로 처리하는 구조다"라는 것만 기억한다면 그렇게 복잡한 것은 아니다. 실제로 샘플을 여러 번 수정해 가면서 실행해 보면 금방 익숙해 질 것이다.