defer
- 사전적 의미: 미루다, 연기하다
- 자신의 실행을 함수 맨 마지막으로 미루는 클로저
- 보통 함수 내부안에서 작성되며 작성된 위치와 상관없이 함수 종료 직전에 실행된다.
예시
func test1() {
print("TEST #1")
defer { print("TEST #2") }
print("TEST #3")
}
test1()
이렇게 defer문을 사용하면? 쉽게 예측할 수 있다.
결과와 같듯이 2가 마지막에 출력된다.
defer문 내부에 작성된 클로저는 함수 실행 종료 직전에 실행되기 때문이다.
defer문이 실행되지 않는 경우
1. defer를 읽기 전에 함수가 종료(return)되는 경우
func test2() {
print("TEST #1")
return
defer { print("TEST #2") }
print("TEST #3")
}
test2()
// TEST #1
다중 defer를 사용하는 경우의 예
defer를 여러번 호출하는 경우
- 실행순서는 가장 마지막에 실행된 defer부터 역순이다.
- defer라는 스택에 하나씩 쌓인다고 보면 된다.
- 1, 2, 3을 차례로 stack에 push하니 3, 2, 1 순서로 pop된다.
func test() {
defer { print("TEST #1") }
defer { print("TEST #2") }
defer { print("TEST #3") }
}
// TEST #3
// TEST #2
// TEST #1
defer를 중첩해서 사용하는 경우
func test() {
defer {
defer {
defer {
print("TEST #3")
}
print("TEST #2")
}
print("TEST #1")
}
}
// TEST #3
// TEST #2
// TEST #1
가장 바깥쪽에 있는 defer가 먼저실행된다.
Defer를 사용하는 경우 예시
defer가 읽힌 이후론 함수 종료 직전에 실행을 예약한다. 이를 통해 함수의 종료 직전에 정리해야하는 변수나 상수를 처리하는 용도로 활용된다.
예를 들어 NSLock를 이용해 운영체제 개념에서의 상호 배제의 Lock을 풀어줘야 데드락을 예방할 수 있다.
let lock: NSLock = .init()
func fetchData() {
lock.lock()
defer { lock.unlock() }
// 데이터 처리, 이후 작업
}