Swift 클로저(Closure) 핵심 정리 – 함수도 값이다
Swift에서 클로저는 **일급 시민(First-Class Citizen)**이다. 즉, 함수 자체가 변수에 저장되고, 다른 함수에 인자로 넘기거나 반환값으로 사용할 수 있다는 뜻이다.
함수형 프로그래밍이 가능한 Swift에서 클로저는 자주 쓰이며, UIKit/SwiftUI에서 콜백, 이벤트 핸들링, 고차 함수(map, filter, reduce) 등에 폭넓게 사용된다.
클로저란?
- 이름 없는 함수 혹은 익명 함수
- 함수와 동일하게 매개변수, 반환값, 실행 코드 블럭을 포함
- 함수처럼 실행 가능하지만, 값으로 전달하거나 저장할 수 있음
1
2
3
| { (매개변수) -> 반환형 in
실행 코드
}
|
1. 클로저 기본 형태
① 매개변수 X, 반환 X
1
2
3
4
| let closure: () -> Void = {
print("Hello, Closure")
}
closure()
|
② 매개변수 O, 반환 X
- 전체 형태
1
2
3
4
| let closure: (_ name: String) -> Void = { (name: String) in
print(name)
}
closure("차상진")
|
- 생략형
1
2
3
| let closure: (String) -> Void = { name in
print(name)
}
|
- 축약형 (매개변수 1개일 때)
1
2
3
| let closure: (String) -> Void = {
print($0)
}
|
- 매개변수 무시
1
2
3
| let closure: (String) -> Void = { _ in
// 매개변수 안 씀
}
|
③ 매개변수 O, 반환 O
1
2
3
4
5
| let closure: (String) -> String = { name in
return name + "입니다."
}
let result = closure("차상진") // "차상진입니다."
|
2. 클로저 사용 예
클래스 내부에서 클로저 프로퍼티 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| class Sample {
var sampleFunc: () -> Void
init() {
sampleFunc = {} // 초기값
}
func test() {
sampleFunc()
}
}
class MainViewController {
let sample = Sample()
func clickBtn() {
sample.sampleFunc = {
print("click btn")
}
}
}
let mainVC = MainViewController()
mainVC.clickBtn()
mainVC.sample.test() // "click btn"
|
- 위처럼 설정(할당) 후 실행하는 패턴은 Swift에서 자주 쓰인다.
3. 고차 함수에서의 클로저
① 매개변수가 클로저인 경우
1
2
3
4
5
6
7
| let execute: ((Int) -> Void) -> Void = { closure in
closure(5)
}
execute { value in
print(value * 2) // 10
}
|
② 반환값이 클로저인 경우
1
2
3
4
5
6
7
8
| let factory: () -> (() -> String) = {
return {
return "sangjin"
}
}
let result = factory()
print(result()) // "sangjin"
|
③ 매개변수와 반환이 모두 클로저인 경우
1
2
3
4
5
6
7
8
9
10
11
| let composed: (() -> Int) -> (() -> String) = { closure in
return {
return String(closure())
}
}
let result = composed {
return 42
}
print(result()) // "42"
|
마무리
Swift에서 클로저는 단순한 익명 함수 이상의 존재다. 이벤트 핸들링, 네트워크 콜백, 커스텀 알림 등 다양한 영역에서 쓰이며, Swift 개발자가 반드시 이해해야 할 핵심 개념이다.
함수 = 값 → 변수에 저장 가능 → 함수 안에 전달 → 함수에서 반환 이 개념을 이해하면 클로저가 어렵지 않다.