Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[8주차] defer란 무엇인지 설명하시오. defer가 호출되는 순서는 어떻게 되고, defer가 호출되지 않는 경우를 설명하시오. #14

Open
kangddong opened this issue Jan 17, 2023 · 2 comments

Comments

@kangddong
Copy link
Contributor

No description provided.

@Lim-YongKwan
Copy link

defer란 현재 코드 블록(구역)을 나가기 전에 꼭 실행해야 되는 코드를 작성하여 코드가 블록을 어떻게 빠져 나가든 꼭 마무리해야 되는 작업을 할 수 있게 도와줍니다.
defer의 실행 순서는 기본적으로 역순으로 이루어지며 defer가 선언 된 코드 블록을 빠져나오기 직전에 실행이 됩니다.
defer는 코드 블록을 빠져나오기 직전에 실행이 되므로 throw나 guard 등을 사용해서 도중에 해당 블록에서 나오게 될 경우 혹은, return 값이 never이기에 비 반환 함수인 경우에 호출이 되지 않습니다.

@obtusa07
Copy link

Defer란?

defer 구문이 나타나는 범위의 바깥으로 제어가 전송되기 직전에 실행되는 코드에 사용

언제 쓰이는가?

파일 닫기와 같은 수동 리소스 관리를 수행하고 에러가 발생하더라도 수행되어야 하는 수행해야 하는 작업이 있는 경우에 사용될수 있다.

func f() {
    defer { print("First defer") }
    defer { print("Second defer") }
    print("End of function")
}
f()
// Prints "End of function"
// Prints "Second defer"
// Prints "First defer"

순서

위의 코드를 보면 알겠지만 같은 범위에 여러개의 defer 구문이 있다면 나타나는 순서는 실행되는 순서와 반대이다.
이는 defer 구문 안의 구문이 다른 ㅇefer 구문에 의해 정리될 리소스를 참조할 수 있다는 의미를 가진다.

do와 같은 구문을 가진다면 먼저 선언되어 있어도 미리 실행되긴 한다.

호출 안 되는 경우

1. 중간에 throw로 틸출하는 경우

이 경우에는 throw에 도달하기 전에 선언된 defer는 실행된다.

2. guard로 탈출하는 경우

위와 동일

3. return 값이 Never인 경우

비반환함수이기 떄문에 작동을 하지 않는다.

ref:
https://bbiguduk.gitbook.io/swift/language-reference/statements#defer-defer-statement
https://swieeft.github.io/2020/02/26/defer.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants