크게 다가온 defer 구문

Apple의 Swift2 메뉴얼의 Error Handling에서 짧게 설명한 defer 구문. 설명은 얼마 안 되었지만 크게 다가왔다. 정리 작업 처리 코드 작성을 상당히 편하게 만들어 줄 수 있을 것으로 보였기 때문이다.

정리 작업을 하는 경우

어떤 작업을 하기 위해 준비 작업과, 정리 작업을 하는 함수의 경우에 다음과 같은 형태로 작성될 것이다.

boolean f()
{
    a()
    b()
    
    do1()

    if something is fail {
        ~b()
        ~a()
        return false
    }

    do2()

    ~b()
    ~a()

    return true
}

작업 중간에 함수를 빠져나가게 될 경우, 정리 작업을 해줘야 한다.

defer를 사용 시

boolean f() {
    a()
    defer {
        ~a()
    }
		
    b()
    defer {
        ~b()
    }
		
    do1()

    if something is fail {
        return false
    }

    do2()

    return true
}

함수를 빠져나갈 때, 정리 작업을 하게 된다.

defer가 수행되는 시점

참고로 defer 구문이 수행되는 시점은 defer 구문이 속한 Scope을 벗어날 때이다. 즉, 함수 단위가 아닌 그보다 작은 단위라 할 수 있다. Apple 매뉴얼의 예제를 보면 그 부분을 바로 설명하고 있다. 다음은 그 예를 그대로 가지고 왔다.

func processFile(filename: String) throws {
    if exists(filename) {
        let file = open(filename)
        defer {
            close(file)
        }
        while let line = try file.readline() {
            // Work with the file.
        }
        // close(file) is called here, at the end of the scope.
    }
}

Comments