제가 나중에 보기 위해 정리해놓은 자료이므로 틀린 내용이 있을 수 있습니다. 댓글로 피드백 주시면 바로 수정하겠습니다. 감사합니다. ☺️ - 민쏜 -
defer 구문은 오류처리를 할 때 유용하게 쓰인다.
물론, defer 구문은 함수, 메서드, 반복문, 조건문 등 보통의 코드 블록 어디서든 사용할 수 있다.
함수 내에서 파일을 열어 사용하다가 오류가 발생해 코드가 블록을 빠져나가든, return을 만나서 나가든, 열어놓은 파일을 정상적으로 닫아주지 않으면 메모리에 남아있을 수 있다.
func writeData() {
let file = openFile()
if ... {
close(file) // 실수로 누락시키면 안되니 조마조마..
return
}
if ... {
close(file) // 같은 코드를 중복해서 쓰는 문제까지..
return
}
}
func writeData() {
let file = openFile()
// defer를 훑고 지나가기만 했다면,
// 최대 근접 구문인 writeData() 메서드의 코드블록이 끝날 때 무조건 실행
defer {
close(file)
}
if ... {
return // 안심하고 리턴
}
if ... {
return // 안심하고 리턴
}
}
defer 구문 내부에는 break, return 등과 같이 구문을 빠져나갈 수 있는 코드 또는 오류를 던지는 코드를 작성하면 안된다.
break | return |
---|---|
![]() | ![]() |
여러 개의 defer 구문이 하나의 범위(블록) 내부에 속한다면, defer 구문을 훑고 지나갈 때마다 스택처럼 쌓여, 쌓인 순서의 역순으로 실행된다.
[Swift] defer의 동작 원리는 무엇일까? (번역)
(원문을 쓴 원저자도, 번역하신 분도 경이롭다...! 😵)
좋은 내용 잘 보고 갑니다 👍