defer

2026. 1. 31. 16:42·Programing Langauge/swift
반응형

🎯 목적

스코프가 끝날 때 반드시 실행되어야 하는 정리(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
'Programing Langauge/swift' 카테고리의 다른 글
  • 퀵 헬프 주석
  • Transferable
  • @DynamicProperty
  • @resultBuilder
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (339)
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (134)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (34)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (21)
        • 어노테이션 (6)
        • 튜토리얼 (14)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (21)
        • 이론 (10)
        • MCP (1)
        • LangGraph (10)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AVFoundation
    IOS
    GIT
    백준
    프로그래머스
    CS
    Swift
    투포인터
    dispatch
    protocol
    boostcamp
    property
    SwiftUI
    dp
    concurrency
    UIKit
    dfs
    Spring
    lifecycle
    Tuist
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
defer
상단으로

티스토리툴바