defer가 호출되는 순서는 어떻게 되고, defer가 호출되지 않는 경우를 설명하시오.
Opened this issue · 4 comments
defer는 함수 안에서 작성되는 클로저로 작성된 위치와 상관 없이 함수 종료 직전에 실행되는구문입니다.
defer를 읽기 전에 함수가 종료되거나 해당 함수가 Never를 리턴하는 비반환함수인 경우에는 defer는 실행되지 않으며, 하나의 함수에서 여러번 defer를 호출 가능하며 실행 순서는 가장 마지막에 실행된 defer부터 역순으로 stack처럼 실행된다.
defer는 중첩해서 실행 가능하며 가장 바깥쪽에 있는 defer가 가장 먼저 실행되고 가장 안쪽에 있는 defer가 가장 마지막에 실행됩니다.
defer는 보통 함수 종료 직전에 정리해야 하는 변수나 상수를 처리하는 용도로 사용하며 NSLock을 이요해 상호배제를 걸때 defer를 통해 lock을 풀어주는 식으로도 사용 가능하다.
defer는 선언된 순서의 역순으로 호출이 됩니다.
defer가 실행되기 전에 throw를 이용해 오류를 던진 경우나 guard 문을 통해 함수를 빠져나가는 경우에 호출이 되지 않습니다. 또한, 리턴값이 Never인 경우에도 호출이 되지 않는데, 함수를 반환하지 않고 에러를 발생시키기 때문입니다.
defer란 해당 클로저 내부에 있는 코드를 현재 스코프 기준 마지막에 실행되도록 돕는 오퍼레이터입니다. 보통 함수 종료전에 정리해야하는 변수나 상수를 처리하는 용도로 많이 사용합니다.
하나의 스코프에서 여러번 defer를 사용할 경우 스택처럼 쌓여서 가장 먼저 넣은 defer 코드가 가장 마지막에 호출되고 가장 마지막에 넣은 defer 코드가 가장 먼저 호출됩니다. 만약 defer를 사용하기 전에 해당 스코프가 종료(에러반환, 리턴 등)된다면 해당 defer는 처리되지 않습니다. 또한 리턴값이 Never(비반환)인 경우에는 함수를 반환하지 않고 종료되기 때문에 defer가 호출되지 않습니다.
함수 내에 defer 가 여러개가 있다면 스택과 같은 원리로 역순으로 실행되고, defer 가 중첩되어 있다면 가방 바깥쪽 부터 실행됩니다.
호출되지 않는 경우는 defer 가 호출되기전에, throw 를 이용해서 오류를 던지거나 guard 문으로 함수가 중간에 종료되거나 return 값이 Never 이거나 return으로 함수가 종료되는 경우가 있습니다.