본문 바로가기

iOS/Swift

Swift) defer를 알아보자

 

 

 

안녕하세요 :) 소들입니다

오늘은 Swift의 문법 중 defer라는 것에 대해

공부를 해보려고 합니다~~!!!

 

간단한 내용이고, 어렵지 않아요!! 

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. defer가 뭘까

 

자, 먼저 defer라는 것의 사전적 정의는

 

 

 

 

미루다, 연기하다 이런 뜻임

defer는 보통 함수 안에서 작성되는 클로저인데,

 

작성된 위치와 상관 없이 함수 종료 직전에 실행되는 구문

 

뭐 말 그대로 자신의 실행함수의 맨 마지막으로 미루다..! 

이런 느낌임!!!

그럼 어떻게 사용하는지 보자 :)

 

 

 

 

2. defer 사용법

 

간..단..하..게.. defer라는 키워드를 작성하면

 

 

 

 

자동 완성ㅇㅣ 뙇....!!!!!

 

그럼 진짜로 함수의 마지막에 실행되는지

실험을 해보자.....!!!!!!11

 

 

func testDefer() {
    print("Check #1")
    
    defer { print("defer #1") }
    
    print("Check #2")
}
 
testDefer()

 

 

이렇게 defer를 사용하면 

 

 

 

 

이렇게 defer 구문은 함수의 가장 마지막에 실행되는 것을

볼 수 이따 👀

 

자, 이 defer도 몇 가지 특징이 있는데

알아보겠음

 

 

 

2-1. defer를 읽기 전에 함수가 종료되면 defer는 실행되지 않는다

 

 

func testDefer() {
    print("Check #1")
    
    return;
    defer { print("defer #1") }
    
    print("Check #2")
}
 
testDefer()

 

 

이렇게 defer를 읽기 전에 함수가 종료되어 버리면

 

 

 

 

defer는 불리지 않음!!!!

 

 

 

2-2. 하나의 함수에서 여러 번 defer를 호출 가능하며, 실행 순서는 가장 마지막에 실행된 defer부터 역순이다

 

defer는 다음과 같이 여러 번 호출이 가능한데,

 

 

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

 

 

먼저 읽은 defer부터 stack에 쌓인다고 생각하면 됨!!!

 

 

 

 

따라서, 가장 마지막에 읽은 defer가 가장 먼저 실행되고,

가장 처음 읽은 defer가 가장 마지막에 실행 됨!!! 

 

 

 

2-3. defer는 중첩해서도 사용 가능하며, 실행 순서는 가장 바깥쪽 defer부터 실행된다

 

이 defer는 defer 안에서도 다음과 같이

 

 

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

 

 

중첩해서 실행이 가능하며,

 

 

 

 

이때는 

가장 바깥 쪽에 있는 defer가 가장 먼저 실행되고,

가장 안쪽에 있는 defer가 가장 마지막에 실행

 

 

 

 

3. 그렇다면 defer는 언제 사용할까?

 

defer가 읽힌 이후론 함수의 종료 직전에 실행된단 것을 알았셈

그럼 이 defer는 도대체 언제 사용할까?

 

함수를 종료하기 직전에 정리해야 하는 변수나 상수를 처리하는 용도

 

로 사용됨!!!!
예를 들어, NSLock을 이용해 상호배제를 걸 때 

함수가 종료되기 전에 Lock이 걸린 경우, 이 Lock을 풀어주어야 데드락에 걸리지 않음!

 

 

let myLock: NSLock = .init()

func fetchData() {
    myLock.lock()
    
    defer { myLock.unlock() }
    
    if data == nil { return }
    
    //이후 작업 ~.~
}
 

 

 

근데 함수가 종료되는 시점마다 Lock을 풀어주는 코드를 추가하는 것보다

defer를 사용하면 알아서 종료되기 전에 Lock을 풀어주기 때문에

간단데스 :)

 

 

SQLite3을 사용할 떄도,

defer를 사용해 함수가 종료될 때가 되면 DB를 닫아주는

뭐 그런용도로도 사용함!!!

 

 

 

 

.

.

.

가볍지만 유용한 defer

포스팅 끝



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday