제어 흐름 (Control Flow) - 연기된 동작 (Deferred Actions)

00yhsp·2024년 4월 7일

코드의 일부분이 실행되거나 실행 횟수를 제어할 수 있는 if 와 while 과 같은 제어 흐름 구조와 다르게 defer 는 코드 일부분이 실행되는 시기를 제어한다.
현재 범위의 마지막에 실행되는 코드블럭을 작성하기 위해 defer 블럭을 사용한다.

var score = 1
if score < 10 {
    defer {
        print(score)
    }
    score += 5
}
// Prints "6"

위의 예제에서 defer 블럭 안의 코드는 if 구문의 본문이 종료되기 전에 실행된다. 먼저 score 를 5 증가시키는 if 구문의 코드가 수행된다. 그런 다음 if 구문의 범위가 종료되기 전에 score 를 보여주는 연기된 코드가 수행된다.

프로그램이 어떻게 종료하는지에 관계없이 defer 안의 코드는 항상 수행된다.
여기에는 함수의 이른 종료, for 루프의 중단 또는 에러를 던지는 동작도 포함된다.
수동으로 메모리 할당과 해제, 저수준 파일 열기와 닫기, 데이터베이스에서 트랜젝션 시작과 종료와 같은 동작에서 defer 는 이러한 동작을 나란히 작성할 수 있기때문에 쌍으로 수행되는 동작을 보장할 때 유용하다.
예를 들어 다음의 코드는 점수에 100을 더하고 뺌으로써 임시로 보너스를 주는 코드이다.

var score = 3
if score < 100 {
    score += 100
    defer {
        score -= 100
    }
    // Other code that uses the score with its bonus goes here.
    print(score)
}
// Prints "103"

같은 범위에 하나 이상의 defer 블럭을 작성하면 첫번째 defer 블럭은 마지막에 수행된다.

if score < 10 {
    defer {
        print(score)
    }
    defer {
        print("The score is:")
    }
    score += 5
}
// Prints "The score is:"
// Prints "6"

예를 들어 런타임 에러나 충돌로 인해 프로그램 수행이 멈추면 연기된 코드는 수행되지 않는다.
그러나 연기된 코드는 에러가 발생한 후에 수행된다.

profile
iOS Dev

0개의 댓글