면접 대비

Closure란?

GEEEEEEEE 2023. 2. 3. 17:06

일정 기능을 수행하는 코드의 블럭을 말하며, 일급 객체의 역할을 할 수 있습니다.

 

일급 객체는 전달 인자로 보낼 수 있고 변수, 상수 등으로 저장하거나, 전달할 수 있으며, 함수의 반환값이 될 수 있습니다

 

Swift에서는 함수는 일급 객체이므로 Closure또한 함수의 역할을 할 수 있습니다.

 

Swift에서의 함수는 일급 객체이면서 Closure의 일종입니다.

 

함수는 따로 정의된 형태가 아닌 인자로 들어가 있는 형태를 Inline Closure라고 합니다.

 

<클로저의 예시 코드>

import Foundation

let list = [15, 23, 12, 33, 46]
 
let sorted = list.sorted(by: { (v1: Int, v2: Int) -> Bool in
 
    return v1 < v2
})

print(sorted) // [12, 15, 23, 33, 46]

클로저는 메서드의 특징을 안다면 축약이 가능합니다.

 

첫번째로, 가능한 축약은 타입입니다.

let sorted = list.sorted(by: { (v1, v2) in
    return v1 < v2
})

타입 추론을 통해 list 배열 멤버의 타입이 Int 임을 알 수 있으므로 파라미터 타입을 생략하여 사용할 수 있습니다.

 

두번째로, 반환 키워드 생략입니다.

let sorted = list.sorted(by: { (v1, v2) in
    v1 < v2
})

클로저 내부의 코드가 한 줄이라면 return 키워드를 생략하여 표현할 수 있습니다.

 

세번째로, 파라미터 이름을 생략할 수 있습니다. 코드 블럭 안에서 $0부터 $n 까지 파라미터를 순서대로 호출하여 사용 가능합니다.

let sorted = list.sorted(by: {
    $0 < $1
})

 

네번째로, 연산자를 사용할 수 있는 타입의 경우 연산자만 표현하여 생략이 가능합니다.

let sorted = list.sorted(by: <)

 

마지막으로, 후행 클로저는 함수의 마지막 인자가 클로저라면, 함수 호출을 () 소괄호 대신 {} 중괄호를 사용하여 호출이 가능합니다.

let sorted = list.sorted {$0 < $1}

클로저는 특정 문맥의 상수나 변수의 값을 캡쳐할 수 있습니다.

즉 원본 값이 사라져도 클로저의 body 안 에서 그 값을 활용할 수 있습니다.