개요
개발을 하다가 심심치 않게 보이는 아래와 같은 문법.

처음에는 '아 클로저가 함수 그냥 축약이구나'라고 넘겨짚고 개발을 했었는데,
알면 알수록 단순한 개념이 아니고, 심화 개념(캡쳐, 순환 참조 문제 등)역시 존재했다.
그래서 이번 시간에는 클로저 관련 개념을 두 포스팅에 걸쳐 정리해보고자 한다.
첫 포스팅(이번 포스팅)은 클로저의 기초 문법에 대해서 다뤄 볼 것이고
두번째 포스팅은 클로저의 심화 개념 및 순환 참조 문제에 대해서 다뤄보고자 한다.
이번 포스팅만 보더라도 기본 클로저의 사용법은 알 수 있게끔 구성하였으니,
아직 Swift가 익숙치 않다면 이번 포스팅만 봐도 충분할 것 같다.
그럼 시작해보자!
클로저란?
Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to closures, anonymous functions, lambdas, and blocks in other programming languages.
출처 : https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/
해석하자면 '코드에 전달되어 사용할 수 있는 독립적인 기능 블록'으로 익명 함수, 람다 함수 등등과 유사한 역할이라고 한다.
.. 말이 어려운데, 간단하게 말하면 익명 함수이다.
'그러면 그냥 클로저가 함수의 다른 형태 아니야?' 싶을 텐데, 오히려 그 반대이다.
함수가 클로저의 또 다른 형태로, 클로저의 일부이다.
클로저는 크게 두 부분으로 나뉜다.

Named Closure는 말 그대로 이름이 있는 클로저이다.
func namedClosure() {
print("저는 이름이 있는 클로저입니다. 사실 함수에요")
}
우리에겐 익숙한 형태인데, 바로 함수이다.
Swift에서는 함수도 사실 클로저의 한 형태, 즉 이름이 붙은 클로저(named closure)이다.
‘코드에 전달되어 사용할 수 있는 기능 블록’이라는 클로저의 정의를 떠올려보면, 함수 역시 이 정의에 정확히 들어맞는다.
즉 클로저라는 개념을 몰랐더라도 우리는 지금까지 클로저를 계속 사용해오고 있던 셈이다.
하지만 '함수'라는 용어는 너무 범용적으로 사용되기 때문에,
일반적으로는 클로저라고 하면 Unnamed Closure를 가리키는 경우가 많다.
(혼동을 방지하기 위해 앞으로는 함수와 클로저를 분리하여 말하겠다)
Unnamed Closure는 이름이 없는 클로저로,

이러한 형태의 Named Closure(함수)를

이와 같이 이름을 없앤 형태로 재구성하여 만들 수 있다.
이렇게 이름을 없애면 코드를 더 간결하게 표현할 수 있고, 일회성으로 사용할 때 특히 유용하다.
이제 클로저의 특성과 구성에 대해 알아보자!
클로저의 특성 : 일급 객체(First-Class Citizen)
Swift에서 클로저는 일급 객체이다.
이는 클로저가 변수과 같이 하나의 값처럼 취급된다는 의미로,
• 변수에 저장할 수 있음
• 함수의 인자로 전달할 수 있음
• 함수의 반환값으로 사용할 수 있음
와 같은 유연한 특징들을 가진다.
이러한 특성 덕분에 클로저는 고차 함수, 콜백 함수, 비동기 처리 등
다양한 상황에서 유연하게 사용된다.
클로저의 구성
그렇다면 이제 클로저가 어떻게 구성되는지 알아보자.
{ (매개변수) -> 반환타입 in
실행 코드
}
기존 함수의 경우 (매개변수) -> 반환타입과 실행 코드를 중괄호의 시작점으로 분류했는데,
클로저의 경우 중괄호를 클로저 시작과 끝으로 나타내기 때문에
in 키워드를 추가하여 매개변수/반환 타입과 실행 코드 사이를 명확히 구분해 준다.
클로저의 경우 동일한 코드를 다양한 형태로 표현할 수 있는데, 클로저의 다양한 표현식에 대해 알아보자.
func calculator(
n1: Int,
n2: Int,
operation: (Int, Int) -> Int
) -> Int {
return operation(n1, n2)
}
이 calculator 함수는 세 개의 매개변수를 받는다.
앞의 두 매개변수 n1과 n2는 Int 값이며,
세 번째 매개변수 operation은 두 개의 Int를 받아 하나의 Int를 반환하는 클로저이다.
이 calculator 세 번째 인자로 클로저를 넘겨 주며, 동일한 로직을 다양한 형태로 표현하며 함수를 호출해 보자.
클로저 표현식 1 : 기본 형태
calculator(
n1: 12,
n2: 23,
operation: { (no1: Int, no2: Int) -> Int in return no1 * no2 }
)
기본 형태이다. 이름을 제외한 함수의 모든 요소를 명시적으로 작성하여 클로저의 구조를 가장 명확하게 보여준다.
이 방식은 클로저 문법의 출발점이 되는 형태로, 이후 단계에서 점차 간결하게 축약해 나갈 수 있다.
클로저 표현식 2: 타입 생략
calculator(
n1: 12,
n2: 23,
operation: { no1, no2 in no1 * no2 }
)
이 표현식은 기본 형태에서 매개변수 타입과 반환 타입을 생략한 형태이다.
Swift는 calculator 함수의 operation 매개변수 타입이
(Int, Int) -> Int라는 것을 이미 알고 있기 때문에,
클로저 내부에서 타입을 생략해도 자동으로 추론할 수 있다.
클로저 표현식 3: 축약 인자명 사용
calculator(
n1: 12,
n2: 23,
operation: { $0 * $1 }
)
매개변수 이름조차 생략하고, 순서 기반의 축약 인자명($0, $1)을 사용한 형태이다.
Swift에서는 클로저 내부의 매개변수를 $0, $1, $2처럼 자동으로 순서에 따라 참조할 수 있는데,
이를 통해 매개변수 이름과 in 키워드까지 모두 생략 가능하다.
또한 클로저의 본문이 한 줄일 경우, return 키워드도 생략된다.
(이는 함수에도 적용된다)
// 함수 body가 한 줄이므로 return 생략 가능.
// 두 코드 모두 동일하게 1 반환
func returnOne() -> Int { return 1 }
func returnOne() -> Int { 1 }
이는 가장 짧고 간결한 형태이며,
간단한 연산이나 일회성 동작에서 매우 자주 사용되는 클로저 표현식이다.
하지만 너무 축약된 형태는 오히려 의도를 파악하기 어려울 수 있으므로, 복잡한 로직에서는 지양하는 것이 좋다.
클로저 표현식 4: 후행 클로저
엄청 자주 쓰는 문법이니 강조해서 표현하였다.
calculator(
n1: 12,
n2: 23
) { $0 * $1 }
클로저가 함수의 마지막 인자일 경우,
소괄호 바깥에 클로저를 따로 분리해서 작성할 수 있다.
이런 형태를 후행 클로저(Trailing Closure) 라고 부른다.
SwiftUI에서의 예시도 보자.

Button은 두 개의 인자를 받는데,
첫 번째는 제목, 두 번째는 action (즉, () -> Void 클로저) 이다.
Button(
"기본 클로저입니다",
action: {
print("기본 클로저입니다.")
}
)
이 코드는 후행 클로저 문법을 사용하면 다음과 같이 더 간결하게 바꿀 수 있다.
Button("후행 클로저입니다") {
print("후행 클로저입니다")
}
후행 클로저 형태로 바꾸면 구조가 깔끔해지고, 읽기도 훨씬 쉬워진다.
실제로 SwiftUI에서 자주 보게 되는 문법이다.
결론
이번 시간에는 클로저의 정의, 특성, 그리고 다양한 표현식까지 알아보았다.
Swift에서 클로저를 적절히 사용한다면,
더 간결하고 유연한 코드를 작성할 수 있을 뿐만 아니라
비동기 처리나 함수형 프로그래밍 스타일을 구현하는 데도 큰 도움이 된다.
클로저의 값 캡처(Capturing Values), @escaping 클로저,
그리고 순환 참조 문제(Strong Reference Cycle) 등에 대해 소개할 예정이다!
'앱 개발 > iOS' 카테고리의 다른 글
[iOS] 딥 링킹 환경에서 콘솔 출력하기 (0) | 2025.03.25 |
---|---|
[iOS] 원격 푸시 알림 정리: FCM, APNs (0) | 2025.03.25 |
[iOS] 생애주기 및 AppDelegate, SceneDelegate의 역할 (2) | 2025.03.10 |
[iOS] XCode 단축키 VSCode처럼 설정하기 (1) | 2025.02.22 |