모바일 개발 · 중급
iOS 앱 개발 시 ARC(Automatic Reference Counting)가 어떻게 동작하는지 설명하고, 강한 참조 순환(Retain Cycle)이 발생하는 대표적인 상황과 이를 해결하는 방법에 대해 구체적인 코드 예시 없이 개념적으로 설명해주세요.
힌트 · ARC는 참조 카운트를 관리하며, 클로저나 델리게이트 패턴에서 `weak` 또는 `unowned` 키워드를 사용하여 순환 참조를 방지할 수 있습니다.
ARC참조 횟수강한 참조 순환약한 참조미소유 참조
모범답안
ARC는 iOS 앱 개발에서 메모리 관리를 자동으로 해주는 기술입니다. 객체가 더 이상 필요하지 않다고 판단되면 자동으로 메모리에서 해제해줍니다. ARC는 객체의 참조 횟수를 추적하여 동작하는데, 객체를 참조하는 변수나 상수가 늘어날 때마다 참조 횟수가 증가하고, 참조가 끊어질 때마다 감소합니다. 참조 횟수가 0이 되면 시스템은 해당 객체를 메모리에서 해제합니다.
강한 참조 순환은 두 객체가 서로를 강하게 참조하여, 어느 객체도 메모리에서 해제될 수 없는 상황을 말합니다. 예를 들어, A 객체가 B 객체를 강하게 참조하고, B 객체도 A 객체를 강하게 참조하면 순환 참조가 발생합니다.
이러한 순환 참조는 주로 클로저나 델리게이트 패턴에서 발생하기 쉽습니다. 해결 방법으로는 weak 또는 unowned 키워드를 사용하여 참조 중 하나를 약한 참조 또는 미소유 참조로 만드는 것입니다. weak 참조는 객체가 해제될 때 자동으로 nil이 되지만, unowned 참조는 객체가 항상 존재한다고 가정하므로, 객체가 해제된 후 접근하면 런타임 에러가 발생할 수 있습니다. 따라서 상황에 맞게 적절한 키워드를 선택해야 합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 iOS / Swift 면접 질문
- Swift의 `Protocol`이 무엇이며, 어떤 상황에서 유용하게 사용될 수 있는지 구체적인 예를 들어 설명해주세요.
- Swift의 `Extension`이 무엇이며, 기존 클래스, 구조체, 열거형 또는 프로토콜에 어떤 기능을 추가할 수 있는지 설명해주세요.
- Swift의 `Enum` (열거형)은 무엇이며, 원시 값(Raw Value)과 연관 값(Associated Value)의 차이점을 설명하고 각각의 사용 예를 들어주세요.
- Swift에서 구조체(Struct)와 클래스(Class)의 주요 차이점을 메모리 관리 및 데이터 전달 관점에서 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한지 구체적인 사용 사례와 함께 비교하여 설명해주세요.
- iOS 앱에서 비동기 작업을 처리하기 위해 GCD(Grand Central Dispatch)를 사용하는 경우, `DispatchQueue.main.async`와 `DispatchQueue.global().async`의 차이점을 설명하고, 각각 어떤 용도로 사용되는지 예시를 들어 설명해주세요.
- Swift에서 델리게이트(Delegate) 패턴은 어떤 목적으로 사용되며, 이를 구현하기 위한 핵심적인 요소(프로토콜, weak 키워드 등)들을 설명하고, 델리게이트 패턴이 NotificationCenter나 KVO에 비해 가지는 장점은 무엇인지 설명해주세요.