모바일 개발 · 중급
Swift 클로저(Closure)의 특징에 대해 설명하고, 클로저에서 강한 참조 순환(Retain Cycle)이 발생할 수 있는 상황과 이를 방지하기 위한 캡처 리스트(Capture List)의 `weak` 및 `unowned` 사용법에 대해 설명해주세요.
힌트 · 클로저는 주변 환경의 변수를 캡처할 수 있으며, 이로 인해 강한 참조 순환이 발생할 수 있습니다. `[weak self]`나 `[unowned self]`를 사용하여 참조 카운트 문제를 해결합니다.
일급 객체참조 타입강한 참조 순환캡처 리스트weak/unowned
모범답안
Swift 클로저는 익명 함수라고 생각하시면 됩니다. 특징으로는 일급 객체이기 때문에 변수에 할당하거나 함수의 인자로 전달할 수 있습니다. 또한, 주변 환경의 변수를 캡처할 수 있다는 장점이 있습니다.
하지만 이 캡처 때문에 강한 참조 순환이 발생할 수 있습니다. 예를 들어, 클래스 인스턴스가 클로저를 소유하고, 클로저가 그 인스턴스를 다시 참조할 때 서로 강하게 참조하여 메모리에서 해제되지 못하는 상황이 발생할 수 있습니다.
이를 해결하기 위해 캡처 리스트를 사용합니다. [weak self]는 self를 약한 참조로 캡처하여, self가 해제되면 클로저 내의 self도 nil이 됩니다. [unowned self]는 self가 항상 존재한다고 가정하고 약한 참조보다 더 빠르게 접근하지만, self가 해제된 후 접근하면 런타임 에러가 발생할 수 있습니다. 따라서 self가 항상 존재한다고 확신할 수 있을 때만 unowned를 사용해야 합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 iOS / Swift 면접 질문
- iOS 앱에서 비동기 작업을 처리하기 위해 GCD(Grand Central Dispatch)를 사용하는 경우, `DispatchQueue.main.async`와 `DispatchQueue.global().async`의 차이점을 설명하고, 각각 어떤 용도로 사용되는지 예시를 들어 설명해주세요.
- Swift에서 델리게이트(Delegate) 패턴은 어떤 목적으로 사용되며, 이를 구현하기 위한 핵심적인 요소(프로토콜, weak 키워드 등)들을 설명하고, 델리게이트 패턴이 NotificationCenter나 KVO에 비해 가지는 장점은 무엇인지 설명해주세요.
- Swift의 에러 처리(Error Handling) 방식에 대해 설명하고, `do-catch`, `try?`, `try!`의 각각의 용도와 차이점을 구체적인 상황과 연결하여 설명해주세요.
- Swift에서 옵셔널 값에 접근할 때 옵셔널 체이닝(Optional Chaining)과 강제 언래핑(Forced Unwrapping)의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 안전하고 적절한지 예시를 들어 설명해주세요.
- Swift의 async/await 및 Actor를 활용하여 고도로 동시성 높은 네트워크 요청 시스템을 설계할 때, 스레드 안전성을 보장하고 리소스 사용을 최적화하며, 특히 상호 의존적인 요청 처리 및 취소 메커니즘을 어떻게 구현할 것인지 구체적으로 설명하시오.
- 대규모 iOS 애플리케이션에서 복잡한 뷰 계층과 데이터 모델 간의 메모리 누수를 진단하고 해결하기 위한 심층적인 전략을 설명하고, Instruments 도구 중 어떤 것을 주로 활용할 것인지 구체적인 시나리오와 함께 제시하시오.