defer

defer는 스위프트에 새로 도입된 키워드입니다. 여기에 현재 유효 범위를 벗어나기 전에 실행되어야하는 마무리(clean-up) 코드를 정의할 수 있습니다. 아래와 같은 예를 들어보겠습니다.

func aTestFunction(a:Int) {

   // 긴 코드가 여기에 있다고 가정하겠습니다.

   if a > 5 {
       print("1")
       print("clean-up")
       return
   }

   // 긴 코드가 있다고 가정하겠습니다.

   print("2")
   print("clean-up")
}

함수가 리턴하기 바로 직전에 어떤 마무리 코드를 실행하고 싶다면, 위의 예로 든 경우에는 두 곳에서 동일한 코드를 넣어 두어야합니다. 그러나defer를 활용하면 마무리 코드를 한 곳에서 정의할 수 있습니다.

func aTestFunction(a:Int) {
    defer {
        print("clean-up")
    }

    //긴 코드가 있다고 가정하겠습니다.

    if a > 5 {
        print("1")
        return
    }

    //긴 코드가 있다고 가정하겠습니다.

    print("2")
}

defer명령문은 현재 유효 범위의 어떤 위치에 두어도 상관 없습니다. 하지만 현재 범위의 시작 지점에 두는 것이 주로 선호됩니다. 또한 하나 이상의defer블럭을 정의할 수 있는데 실행되는 순서는 정의된 순서의 역순이라는 점에 주의해야합니다.

defer블럭은 해당 유효 범위 내에서 에러를 던지는 경우에도 실행이 보장됩니다. 이 점은 마치 Java에서finally코드 블럭을 정의하는 것과 비슷합니다.

enum SomeErrorType: ErrorType {
    case anError
}

func aTestFunction(a:Int) throws {
    defer { 
        print("clean-up") 
    }

    //긴 코드가 있다고 가정하겠습니다.

    if a > 5 {
        print("1")
        throw SomeErrorType.anError
    }

    //긴 코드가 있다고 가정하겠습니다.

    print("2")   
}

결론

defer를 사용하여 현재 유효 범위가 끝날 때 실행되는 마무리 코드를 정의함으로써 코드의 가독성과 품질을 높일 수 있습니다.

results matching ""

    No results matching ""