Swift/개념 & 응용

[Swift] defer

유정주 2023. 4. 20. 11:04
반응형

서론

최근 lock 코드를 작성하면서 defer를 처음 사용해보았는데요.

이번 포스팅에서 defer란 무엇이고 어떤 특징이 있는지 알아보겠습니다.

 

defer

defer는 코드 블럭이 종료되기 직전에 호출되는 코드 블럭입니다.

"코드 블럭"이기 때문에 메서드 뿐만 아니라 for문, if문 등이 종료될 때도 사용할 수 있습니다.

 

사용법은 간단합니다.

코드 블럭 안에 defer { } 를 추가하면 됩니다.

 

func functionA() {
    print("In functionA")
    
    defer {
        print("Out functionA")
    }
}

functionA()
//In functionA
//Out functionA

메서드가 종료될 때 Out functionA가 호출되는 것을 볼 수 있습니다.

 

if true {
    defer {
        print("Out if")
    }
    
    print("In if")
}
//In if
//Out if

if문이 종료될 때도 defer에 의해 Out if가 출력됩니다.

 

defer 중첩

defer는 여러 개 중첩이 가능합니다.

주의할 점은 호출이 역순이라는 것입니다.

defer는 Stack으로 동작하기 때문에 먼저 선언된 defer가 나중에 호출됩니다.

 

func functionA() {
    print("In functionA")
    
    defer {
        print("Out 1")
    }
    
    defer {
        print("Out 2")
    }
}

functionA()
//In functionA
//Out 2
//Out 1

위 코드는 Out 1부터 선언되었지만 Out 2가 먼저 호출됩니다.

 

defer가 호출되지 않는 상황

defer가 호출이 되지 않는 상황도 있습니다.

throw나 guard에 의해 탈출될 때 그 아래에 있는 defer는 호출이 되지 않습니다.

 

예를 들어,

let value: Int? = nil

func functionB() {
    defer {
        print("Out functionB 1")
    }
    
    guard let value = value else {
        return
    }
    
    defer {
        print("Out functionB 2")
    }
}

functionB()
//Out functionB 1

위 코드에서 두 번째 defer는 guard문 아래에 있습니다.

이런 상황에서 guard문에 의해 탈출이 되면

두 번째 defer는 호출되지 않아서 Out functionB 1만 출력이 됩니다.

 

defer 장점

defer는 개발자의 실수를 줄여줍니다.

NSLock의 lock을 두 번할 경우 데드락에 빠지는데요.

defer로 unlock을 해줌으로서 안정성을 높일 수 있습니다.

 

감사합니다.


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형