안녕하세요 :) 소들입니다
오늘은 Swift의 문법 중 defer라는 것에 대해
공부를 해보려고 합니다~~!!!
간단한 내용이고, 어렵지 않아요!!
모든 포스팅은 편의 말투로 합니다~!!
1. defer가 뭘까
자, 먼저 defer라는 것의 사전적 정의는
미루다, 연기하다 이런 뜻임
defer는 보통 함수 안에서 작성되는 클로저인데,
작성된 위치와 상관 없이 함수 종료 직전에 실행되는 구문
뭐 말 그대로 자신의 실행을 함수의 맨 마지막으로 미루다..!
이런 느낌임!!!
그럼 어떻게 사용하는지 보자 :)
2. defer 사용법
간..단..하..게.. defer라는 키워드를 작성하면
자동 완성ㅇㅣ 뙇....!!!!!
그럼 진짜로 함수의 마지막에 실행되는지
실험을 해보자.....!!!!!!11
func testDefer() {
print("Check #1")
defer { print("defer #1") }
print("Check #2")
}
testDefer()
|
이렇게 defer를 사용하면
이렇게 defer 구문은 함수의 가장 마지막에 실행되는 것을
볼 수 이따 👀
자, 이 defer도 몇 가지 특징이 있는데
알아보겠음
2-1. defer를 읽기 전에 함수가 종료되면 defer는 실행되지 않는다
func testDefer() {
print("Check #1")
return;
defer { print("defer #1") }
print("Check #2")
}
testDefer()
|
이렇게 defer를 읽기 전에 함수가 종료되어 버리면
defer는 불리지 않음!!!!
2-2. 하나의 함수에서 여러 번 defer를 호출 가능하며, 실행 순서는 가장 마지막에 실행된 defer부터 역순이다
defer는 다음과 같이 여러 번 호출이 가능한데,
func testDefer() {
defer { print("defer #1") }
defer { print("defer #2") }
defer { print("defer #3") }
}
testDefer()
|
먼저 읽은 defer부터 stack에 쌓인다고 생각하면 됨!!!
따라서, 가장 마지막에 읽은 defer가 가장 먼저 실행되고,
가장 처음 읽은 defer가 가장 마지막에 실행 됨!!!
2-3. defer는 중첩해서도 사용 가능하며, 실행 순서는 가장 바깥쪽 defer부터 실행된다
이 defer는 defer 안에서도 다음과 같이
func testDefer() {
defer {
defer {
defer {
print("defer #3")
}
print("defer #2")
}
print("defer #1")
}
}
|
중첩해서 실행이 가능하며,
이때는
가장 바깥 쪽에 있는 defer가 가장 먼저 실행되고,
가장 안쪽에 있는 defer가 가장 마지막에 실행 됨
3. 그렇다면 defer는 언제 사용할까?
defer가 읽힌 이후론 함수의 종료 직전에 실행된단 것을 알았셈
그럼 이 defer는 도대체 언제 사용할까?
함수를 종료하기 직전에 정리해야 하는 변수나 상수를 처리하는 용도
로 사용됨!!!!
예를 들어, NSLock을 이용해 상호배제를 걸 때
함수가 종료되기 전에 Lock이 걸린 경우, 이 Lock을 풀어주어야 데드락에 걸리지 않음!
let myLock: NSLock = .init()
func fetchData() {
myLock.lock()
defer { myLock.unlock() }
if data == nil { return }
//이후 작업 ~.~
}
|
근데 함수가 종료되는 시점마다 Lock을 풀어주는 코드를 추가하는 것보다
defer를 사용하면 알아서 종료되기 전에 Lock을 풀어주기 때문에
간단데스 :)
뭐 SQLite3을 사용할 떄도,
defer를 사용해 함수가 종료될 때가 되면 DB를 닫아주는
뭐 그런용도로도 사용함!!!
.
.
.
가볍지만 유용한 defer
포스팅 끝
'iOS > Swift' 카테고리의 다른 글
Swift) 클로저(Closure) 정복하기(2/3) - 문법 경량화 / @escaping / @autoclosure (13) | 2020.12.21 |
---|---|
Swift) 클로저(Closure) 정복하기(1/3) - 클로저, 누구냐 넌 (21) | 2020.12.21 |
Swift) 함수(Function) 정복하기 (3/3) - 함수 표기법 / 함수 타입 / 일급 객체 함수 (13) | 2020.12.16 |
Swift) 함수(Function) 정복하기 (2/3) - inout / 가변 파라미터 / 기본값 / 중첩 함수 (5) | 2020.12.15 |
Swift) 함수(Function) 정복하기 (1/3) - 함수? 메서드? 클로저? (13) | 2020.12.15 |