Open Do-hyun-Kim opened 12 months ago
defer {
//statements
}
함수를 종료하기 직전에 정리해야 하는 변수나 상수를 처리하는 용도
var money = 1000
let lock = NSLock()
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
buy()
}
func buy() {
lock.lock();
defer { lock.unlock() }
money = money - 100
print(money)
}
/* 결과
900
800
*/
블록 내에서 작성된 위치에 상관없이 함수 종료시점에 실행되도록 하는 클로저이다.
func ...() {
defer {
print("world")
}
print("hello")
}
// 결과
// hello
// world
defer란 무엇인지 설명하시오.
Defer Statement
defer Statement
는 함수 안에 작성 되는non-escaping closure
이며 함수 작성된 위치와 상관없이 함수가 종료되기 직전에 실행 되는 구문이다.defer
구문은 후 처리 방식을 할 때 사용되며 함수 scpoe 범위 내에서 가장 마지막에 실행이 된다.defer
구문을 중첩으로 사용 할 수 있으며LIFO
형식으로 가장 마지막에 있는defer
가 먼저 실행되고 가장 처음에 있는defer
가 마지막에 실행된다.defer
구문 내부에는break
,return
,throw
등과 같이 구문을 빠져나갈 수 있는 코드 또는 오류를 던지는 코드를 작성하면 오류를 발생한다.Defer 호출 되지 않는 경우
defer
를 읽기전에 함수가 종료return
되면defer
가 실행되지 않으며throw
error 가 발생해도 동일하게defer
가 실행되지 않는다.guard
구문과 같은defer
를 읽기 전 함수를 종료 시킬 수 있는 구문이 있다면 실행이 안 될 수도 있다.Never
값일 경우 에러가 발생하면서 함수를 반환하지 않고 실행을 종료하기 때문에defer
가 호출되지 않는다.Defer를 사용하는 경우
defer
는NSLock
클래스를 통해 멀티 스레딩 환경에서Thread-Safe
하게 작업을 할 수 있도록 도와주며deadlock
을 방지 할 수 있기 때문에 함수 종료 직전에 DB 등을 닫아주는 용도로 사용하면 보장을 받을 수 있다.📝 참고 사이트