클로저(Closure)는 코드에서 독립적인 기능 블록을 변수처럼 저장하거나 전달할 수 있게 해주는 구조입니다.
Swift의 클로저는 익명 함수로 생각할 수 있으며, 함수와 동일하게 매개변수와 반환값을 가질 수 있습니다.
Swift에서는 클로저가 매우 강력하며, 특히 비동기 처리, 이벤트 핸들링, 컬렉션 고차 함수 등에 널리 사용됩니다.
또한, 클로저는 주변 변수나 상수를 캡처(Capture) 하여 사용할 수 있습니다.
1. 기본 클로저 문법
클로저는 중괄호 {}
를 사용하며, 아래 형식으로 작성합니다.
{ (매개변수 목록) -> 반환타입 in
실행 코드
}
가장 단순한 형태의 클로저는 다음과 같습니다.
let greeting = {
print("안녕하세요!")
}
greeting() // 안녕하세요!
2. 매개변수와 반환값이 있는 클로저
let add = { (a: Int, b: Int) -> Int in
return a + b
}
let result = add(3, 5)
print(result) // 8
클로저도 함수처럼 입력과 출력을 가질 수 있으며, 변수처럼 다룰 수 있습니다.
3. 클로저 축약 문법
let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8]
- 매개변수 타입과 반환 타입 생략 가능
in
키워드 이후 단일 표현식이면return
생략 가능- 매개변수 이름은
$0
,$1
, … 로 대체 가능
4. 함수의 인자로 클로저 전달
func operate(_ a: Int, _ b: Int, with operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
let result = operate(4, 2, with: { $0 * $1 })
print(result) // 8
이러한 방식은 연산, 정렬, 필터링, 비동기 처리 등에 활용됩니다.
5. 후행 클로저(Trailing Closure)
let result = operate(5, 3) { $0 - $1 }
print(result) // 2
후행 클로저는 특히 콜백 형태의 함수에서 가독성을 높이는 데 유리합니다.
6. 클로저의 캡처(Capture)
클로저는 외부 변수나 상수를 캡처하여 클로저 내부에서 사용할 수 있습니다.
이러한 변수는 클로저가 생성될 당시의 상태를 유지합니다.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let counter = makeCounter()
print(counter()) // 1
print(counter()) // 2
위 예제에서 count
는 makeCounter()
함수가 종료되었음에도 클로저 내부에 의해 유지됩니다.
마무리
Swift에서 클로저는 함수형 프로그래밍 스타일을 구현하고, 비동기 작업이나 데이터 변환을 간결하게 처리하는 데 필수적인 도구입니다.
클로저 문법과 축약 형태를 잘 이해하고, 클로저의 캡처 특성을 적절히 활용하면 더욱 강력하고 효율적인 Swift 코드를 작성할 수 있습니다.