문제의 역사:
Defer는 Swift에 추가되었으며 (Go, C#의 유사성에서 영감을 받아) 함수에서 오류가 발생하더라도, 함수에서 나가더라도 또는 다양한 지점에서 값을 반환하더라도 리소스를 보장된 방식으로 정리할 수 있도록 합니다.
문제:
조기 해제, 잊혀진 리소스 정리 (예: 파일 닫기, 로그 기록, 트랜잭션 롤백 등). 때때로 실행 순서를 혼동하여 defer가 선언하는 순간에 실행되는 것으로 잘못 생각합니다.
해결책:
Defer는 현재 영역(scope) 끝까지 코드를 실행을 연기하는 특별한 블록입니다. 일반적으로 함수에서 사용됩니다. 모든 defer는 선언된 순서의 역순으로 실행됩니다 (LIFO). 이는 리소스 정리, 메모리 해제 또는 트랜잭션 롤백을 중앙집중적으로 관리할 수 있게 해줍니다.
코드 예:
func processFile() { let file = File("/tmp/data.txt") file.open() defer { file.close() print("File closed") } // 파일 작업 print("Reading data…") }
주요 특징:
애플리케이션이 크래시가 발생하기 전까지 defer 내의 코드는 실행됩니까?
아니요, defer 코드는 scope에서 올바르게 나갈 때만 실행됩니다. 애플리케이션이 치명적인 오류로 종료되면 (예: fatal error) defer는 실행되지 않습니다.
defer 내에서 return을 사용할 수 있나요?
아니요, 사용할 수 없습니다. Defer 블록은 값을 반환하거나 영역을 종료할 수 없으며, 오직 지시문만을 포함할 수 있습니다.
defer는 defer 전에 선언된 변수를 수정하는 데 사용할 수 있나요?
예, defer는 실행 순간에 현재 스택의 값을 캡처합니다. defer 전에 선언된 값을 변경할 수 있으며, 이는 scope에서 나갈 때 저장됩니다.
코드 예:
func example() -> Int { var result = 0 defer { result = 42 } return result // defer가 실행되고, 결과는 42 }
파일이 열리지만 함수의 끝에서 명시적으로 닫히고, 오류가 발생하거나 함수에서 조기 나가면 파일이 열려 있는 상태로 남아 있습니다.
장점:
단점:
파일을 연 후 즉시 닫기 위해 defer를 사용하는 경우. 예외가 발생하거나 함수에서 반환이 발생하더라도 파일은 보장되게 닫힐 것입니다.
장점:
단점: