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