7.4.1 클로저 표현식

클로저 표현식은 함수와 달리 생략되는 부분이 많습니다. 우선 func 키워드를 생략하며, 함수명 또한 생략합니다.

{ (매개변수) -> 반환 타입 in 
    실행할 구문
}

in을 기점으로 in 앞쪽에는 함수의 타입이, 뒤쪽에는 실행할 구문이 작성됩니다. 클로저의 표현식의 실행 블록 작성이 끝나면 중괄호로 닫으면 됩니다. 실제 사용 형식을 알아봅시다

{ () -> () in
    print("클로저가 실행됩니다")
}

위 예제의 함수는 인자값과 반환값이 없는 함수입니다. 반환값이 없을 때는 일반 함수처럼 반환값 타입을 생략하는 것이 아니라 명시적으로 표현해야 합니다. 이는 클로저 표현식의 모호성을 제거하기 위한 규칙입니다.

작성된 클로저 표현식은 그 자체로 함수라고 할 수 있습니다. 클로저 표현식은 대부분 인자값으로 함수를 넘겨주어야 할 때 사용하지만, 직접 실행해볼 수도 있습니다. 이를 위한 두 가지 방법이 있는데 첫 번째는 일급 함수로서의 특성을 활용하여 상수나 변수에 클로저 표현식을 할당한 다음 실행하는 방법입니다.

let f = { () -> Void in
    print("클로저가 실행됩니다")
}

f() // "클로저가 실행됩니다"

두 번째 방법은 상수 f마저 생략하는 구문입니다.

({ () -> Void in
    print("클로저가 실행됩니다")
})()

클로저 전체에 소괄호를 붙이고 뒤에 호출 연산자(소괄호)를 붙이면 클로저 표현식이 실행됩니다.

이번에는 매개변수가 있는 형태의 클로저 표현식을 알아봅시다. 예제를 보겠습니다.

let c = { (s1: Int, s2: String) -> Void in 
    print("s1:\(s1), s2:\(s2)")
}

c(1, "closure") // s1:1, s2:closure

이 클로저 표현식은 정수와 문자열 두 개의 인자를 각각 s1, s2라는 매개변수로 받습니다. 이 매개변수는 클로저의 실행 블록 내부에서 상수로 선언되므로 실행 구문의 범위 내에서 사용할 수 있습니다. 위 예제는 더 간결하게 작성할 수 있습니다.

({ (s1: Int, s2: String) -> Void in 
    print("s1:\(s1), s2:\(s2)")
})(1, "closure")

더 간결하긴 하지만 가독성이 떨어졌습니다. 클로저의 경우 형태에 따라 간결성과 가독성이 달라지므로 적당한 수준을 고려하여 작성해야 합니다.

Last updated