반응형

🎯 목적
스코프가 끝날 때 반드시 실행되어야 하는 정리(clean-up) 코드를 안전하게 보장하기 위해
코드와 실행 결과를 보고 한번, 특징을 정리해보자.
🤖 코드
func deferShowcase(shouldThrow: Bool) throws -> Int {
print("🚀 함수 시작")
var x = 10
// (1) 함수 스코프 defer #1
defer { print("🧹 defer A (function scope) - x =", x) }
// (2) 함수 스코프 defer #2 (A보다 나중에 선언 → 먼저 실행됨)
defer { print("🧹 defer B (function scope)") }
// 값 변경 (캡처 타이밍 확인용)
x = 20
// (3) do 블록 스코프
do {
defer { print("🧹 defer C (do scope)") }
print("📦 do 블록 진입")
// (4) 반복문 스코프
for i in 1...2 {
defer { print("🔁 defer loop \(i)") }
print(" loop body \(i)")
}
print("📦 do 블록 끝 직전")
}
print("📍 do 블록 밖 도착")
// (5) 조건문 스코프
if true {
defer { print("🧹 defer D (if scope)") }
print("🌿 if 블록 내부")
}
print("📍 if 블록 밖 도착")
// (6) 에러 발생 테스트
if shouldThrow {
print("💥 에러 발생 직전")
throw SampleError.boom
}
print("🔚 return 직전")
return 42
}
✅ 결과

| 상황 | 확인 포인트 |
| 반복문 defer | 반복 한 바퀴 끝날 때마다 실행됨 |
| do 스코프 defer | do 블록 빠져나올 때 실행 |
| if 스코프 defer | if 블록 끝나자마자 실행 |
| 함수 스코프 defer | 함수가 return 직전 실행 |
| 여러 defer | 나중에 선언한 B가 A보다 먼저 실행 (LIFO) |
| 변수 캡처 | x = 20 출력 → 실행 시점 값 사용 |
😀 정리
| 실행 시점 | 선언된 스코프가 종료될 때 |
| 실행 순서 | 같은 스코프 안에서는 LIFO (나중 선언 → 먼저 실행) |
| 실행 보장 | return, throw, break, cancel 모두 포함 |
| 스코프 단위 | 함수 / if / do / for / Task 등 블록 단위 |
| 값 캡처 | 실행 시점 값 사용 |
| 비동기와 관계 | await는 스코프 안 끊음, defer 정상 동작 |
출처
반응형
'Programing Langauge > swift' 카테고리의 다른 글
| 퀵 헬프 주석 (0) | 2026.01.14 |
|---|---|
| Transferable (0) | 2025.12.14 |
| @DynamicProperty (0) | 2025.10.24 |
| @resultBuilder (0) | 2025.10.22 |
| @autoclosure (0) | 2025.10.10 |