프로그래밍iOS/Swift 개발자

Swift에서 defer 문이란 무엇인가요? 실행의 특징은 무엇이며, 어디서 사용하면 좋고, 어떤 함정에 빠질 수 있나요?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사:

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…") }

주요 특징:

  • 오류와 조기 반환을 포함하여 scope에서 언제나 실행됩니다.
  • 여러 defer가 역순으로 실행됩니다.
  • 함수뿐만 아니라 어떤 영역에서도 사용할 수 있습니다.

함정이 있는 질문.

애플리케이션이 크래시가 발생하기 전까지 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가 실행될 것이라는 잘못된 기대.
  • 의미가 없는 scope 외부에서 defer를 사용하는 것.
  • defer 내에 무거운 작업을 두는 것.

실제 사례

부정적인 사례

파일이 열리지만 함수의 끝에서 명시적으로 닫히고, 오류가 발생하거나 함수에서 조기 나가면 파일이 열려 있는 상태로 남아 있습니다.

장점:

  • 구현의 용이성

단점:

  • 오류 발생 시 파일이 닫히지 않음
  • 리소스 누수

긍정적인 사례

파일을 연 후 즉시 닫기 위해 defer를 사용하는 경우. 예외가 발생하거나 함수에서 반환이 발생하더라도 파일은 보장되게 닫힐 것입니다.

장점:

  • 안전하며, 누수 없음
  • 깔끔하고 예측 가능한 코드

단점:

  • defer 내의 가변 리소스에 대한 주의가 필요합니다.