Language/Swift
swift defer 블록
jaewpark
2022. 8. 22. 12:04
문법에 대한 공부를 하다보니 defer 블록에 대해 나와 정리를 하고자 합니다.
defer 블록이란?
함수나 메소드에서 코드의 흐름과 상관없이 가장 마지막에 실행되는 블록입니다.
defer 블록 사용은 언제?
종료 시점에 맞추어서 처리해야 할 구문을 넣으면 됩니다.
각종 리소스의 처리나 해제, 연결 종료 등의 구문을 처리하는 용도로 사용됩니다.
defer 블록의 특성은?
- 작성된 위치와 순서에 상관없이 함수가 종료되기 직전에 실행됩니다.
- 읽기 전에 함수의 실행이 종료될 경우 defer 블록은 실행되지 않습니다.
- defer 블록이 여러 번 사용되었다면, 역순으로 실행됩니다.
- defer 블록을 중첩해서 사용되었다면, 바깥쪽부터 실행됩니다.
func Test() {
defer { print("defer #1") }
defer { print("defer #2") }
defer { print("defer #3") }
...
}
/*
* Test result is
* defer #3
* defer #2
* defer #1
*/
func Test() {
defer {
defer {
defer {
print("defer #1")
}
print("defer #2")
}
print("defer #3")
}
...
}
/*
* Test result is
* defer #3
* defer #2
* defer #1
*/
아직은 문법을 익히는 중이라 사용 용도에 대해서 찾아보니 좋은 블로그가 있어서 참고를 하였습니다.
그 중에서 가장 일반적으로 사용되는 방법 하나만 소개를 하겠습니다.
func append(_ elements: [Element]) {
lock.lock()
defer {
lock.unlock()
}
array.append(contentsOf: elements)
}
위의 코드는 잠금을 잠그고 매개변수의 내용을 지정된 배열에 추가하고 명령문의 잠금을 해제합니다 . 이 코드에서 잠금은 프로그램 제어를 다른 방법으로 이전하기 전에 잠금 해제됩니다.
lock 을 이용해서 교착 상태를 방지하는 방법인데, 교착 상태에 대해서 알고 싶다면 스레드 관련해서 공부를 하면 됩니다.