안녕하세요.
Swift를 보다 보면 @autoclosure라는 키워드를 종종 볼 수 있습니다.
대표적으로 assert 함수에서 사용되는데요.
이번 글에서는 @autoclosure가 무엇인지 간단하게 알아볼게요.
1. @autoclosure란?
@autoclosure는 표현식을 자동으로 클로저로 감싸주는 기능입니다.
쉽게 말하면
함수 호출 시 전달한 값을 자동으로 { } 클로저로 변환해 줍니다.
그래서 개발자는 클로저 문법을 직접 작성하지 않아도 됩니다.
2. @autoclosure를 사용하지 않았을 때 vs 사용했을 때
예를 들어 어떤 조건을 검사하는 함수가 있다고 가정해 보겠습니다.
아래 함수는 Bool을 반환하는 클로저를 받고 호출할 때도 클로저 형태로 전달해야 합니다.
만약 @autoclosure를 적용한다면, 클로저 형태로 넘길 필요가 없게 됩니다.
3. @autoclosure는 언제 사용하면 좋을까?
@autoclosure는 API 사용성을 좋게 만들고 싶을 때 유용합니다.
1️⃣ 단순한 표현식을 클로저로 받아야 할 때
예를 들어 조건식이나 값 비교처럼 짧은 표현식을 전달하는 경우입니다.
대표적인 예가 assert입니다.
2️⃣ Lazy evaluation이 필요한 경우
클로저로 감싸면 필요할 때만 실행할 수 있습니다.
예를 들어 아래 코드처럼 사용할 수 있습니다.
isDebugMode가 false라면
expensiveLogMessage()는 실행되지 않습니다.
4. Swift assert에서 사용하는 이유
Swift의 assert 함수도 @autoclosure를 사용합니다.
대략적인 형태는 아래와 같고
덕분에 우리는 아래처럼 자연스럽게 사용할 수 있습니다.
@autoclosure의 큰 장점은 lazy evaluation입니다.
assert는 Debug 빌드에서만 실행되기 때문에 그래서 조건식이나 메시지도 필요할 때만 필요합니다.
예를 들어 아래 코드가 있다고 가정해 볼게요.
expensiveDebugMessage()가 무거운 연산을 하는 함수라면 Release 빌드에서는 assert가 실행되지 않기 때문에
이 함수도 호출되지 않고, 불필요한 연산을 막을 수 있습니다.
정리해 보면 @autoclosure는
- 표현식을 자동으로 클로저로 변환해 주고
- 함수 호출 코드를 더 깔끔하게 만들어 주고
- 필요할 때만 실행되는 lazy evaluation 가능
자주 사용할 것 같지는 않으나... Swift 표준 라이브러리를 이해하는데 도움이 되니 한 번 알아두면 좋을 것 같습니다~ㅎㅎ
'Swift' 카테고리의 다른 글
| Swift isEmpty vs count == 0 (0) | 2025.08.02 |
|---|---|
| Designated initializer cannot be declared in an extension (0) | 2024.12.29 |
| JSON을 enum associated value로 Decoding 하기 (1) | 2024.09.03 |
| map, compactMap, flatMap (0) | 2024.08.18 |
| lazy var 클로저에서 retain cycle이 생기는 경우 (0) | 2024.06.20 |