clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Q
  • Swift
  • ㅅ
  • uikit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

[Swift] defer문
SWIFT

[Swift] defer문

2023. 8. 26. 21:31

defer

  • 사전적 의미: 미루다, 연기하다
  • 자신의 실행을 함수 맨 마지막으로 미루는 클로저
  • 보통 함수 내부안에서 작성되며 작성된 위치와 상관없이 함수 종료 직전에 실행된다.

 

예시

func test1() {
    print("TEST #1")
    
    defer { print("TEST #2") }
    
    print("TEST #3")
}

test1()

이렇게 defer문을 사용하면? 쉽게 예측할 수 있다.

 

결과와 같듯이  2가 마지막에 출력된다.

defer문 내부에 작성된 클로저는 함수 실행 종료 직전에 실행되기 때문이다.

 

 

defer문이 실행되지 않는 경우

1. defer를 읽기 전에 함수가 종료(return)되는 경우

func test2() {
    print("TEST #1")
    
    return
    defer { print("TEST #2") }
    
    print("TEST #3")
}

test2()

// TEST #1

 

 

다중 defer를 사용하는 경우의 예

defer를 여러번 호출하는 경우

  • 실행순서는 가장 마지막에 실행된 defer부터 역순이다.
  • defer라는 스택에 하나씩 쌓인다고 보면 된다.
  • 1, 2, 3을 차례로 stack에 push하니 3, 2, 1 순서로 pop된다.
func test() {
    defer { print("TEST #1") }
    defer { print("TEST #2") }
    defer { print("TEST #3") }
}

// TEST #3
// TEST #2
// TEST #1

 

defer를 중첩해서 사용하는 경우

func test() {
    defer {
        defer {
            defer {
                print("TEST #3")
            }
            print("TEST #2")
        }
        print("TEST #1")
    }
}

// TEST #3
// TEST #2
// TEST #1

가장 바깥쪽에 있는 defer가 먼저실행된다.

 

Defer를 사용하는 경우 예시

defer가 읽힌 이후론 함수 종료 직전에 실행을 예약한다. 이를 통해 함수의 종료 직전에 정리해야하는 변수나 상수를 처리하는 용도로 활용된다.

예를 들어 NSLock를 이용해 운영체제 개념에서의 상호 배제의 Lock을 풀어줘야 데드락을 예방할 수 있다.

let lock: NSLock = .init()

func fetchData() {
    lock.lock()
    
    defer { lock.unlock() }
    
    // 데이터 처리, 이후 작업
 }
저작자표시 비영리 동일조건 (새창열림)
    'SWIFT' 카테고리의 다른 글
    • [Swift] async / await 과 async에서의 Suspend
    • [Swift] 타입과 다형성
    • POP와 OOP의 차이
    • Singleton 패턴을 활용하는 경우
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바