질문 1: ARC(Automatic Reference Counting)가 무엇인가요? 그리고 어떻게 작동하나요?
답변:
ARC는 Automatic Reference Counting의 약자로, iOS와 macOS에서 메모리 관리를 자동화하는 기술입니다. ARC는 각 객체의 사용 횟수를 추적하여 더 이상 사용되지 않는 객체를 메모리에서 해제하는 역할을 합니다. ARC는 컴파일 타임에 코드에 메모리 관리 코드를 자동으로 삽입하며, 개발자가 수동으로 메모리 관리를 하지 않아도 안전하고 효율적인 메모리 관리를 가능하게 합니다. ARC는 객체의 참조 횟수를 기반으로 동작하며, 참조 횟수가 0이 되면 해당 객체를 메모리에서 해제합니다. 이때, 객체의 deinit 메서드가 호출되어 객체가 해제될 때 필요한 정리 작업을 수행할 수 있습니다. ARC는 강한 참조(Strong Reference), 약한 참조(Weak Reference), 비소유 참조(Unowned Reference)를 통해 참조 사이클을 방지하고 메모리 누수를 줄입니다. 이러한 참조 유형을 적절히 사용하면 강한 참조로 인한 순환 참조 문제를 예방할 수 있습니다. ARC는 Objective-C에서도 사용할 수 있지만, Swift 언어에서 더욱 원활하게 작동하도록 설계되었습니다. ARC는 GC(Garbage Collection)와는 달리 실시간으로 객체의 참조 횟수를 관리하기 때문에 메모리 관리에 있어서 성능적인 이점을 제공합니다.
- ARC (Automatic Reference Counting): 객체의 사용 횟수를 자동으로 관리하여 메모리 할당과 해제를 자동화하는 시스템.
- 강한 참조 (Strong Reference): 객체의 참조 횟수를 증가시켜 메모리에서 해제되지 않도록 하는 참조 유형.
- 약한 참조 (Weak Reference): 참조 대상 객체의 생명주기를 관리하지 않으며, 객체가 해제되면 nil로 설정되는 참조 유형.
- 비소유 참조 (Unowned Reference): 약한 참조와 비슷하지만, 참조 대상 객체가 항상 메모리에 존재할 것이라고 가정하는 참조 유형.
질문 2: 순환 참조(Circular Reference)가 무엇인지 설명하고, 이를 해결하는 방법에는 어떤 것이 있는지 설명해주세요.
답변:
순환 참조는 두 개 이상의 객체가 서로를 강하게 참조하는 경우 발생합니다. 이로 인해 참조 횟수가 0이 되지 않아서 메모리에서 해제되지 않는 상황이 생깁니다. 예를 들어, 클래스 A의 인스턴스가 클래스 B의 인스턴스를 강한 참조하고, 클래스 B의 인스턴스도 클래스 A의 인스턴스를 강한 참조하면 이 두 객체는 서로의 참조 횟수를 계속 증가시키게 되어 해제되지 않습니다. 이러한 순환 참조는 메모리 누수의 주요 원인이 될 수 있으며, 앱의 메모리 사용량을 증가시켜 성능 저하나 크래시를 유발할 수 있습니다. 이를 해결하기 위해 ARC에서는 약한 참조(Weak Reference)와 비소유 참조(Unowned Reference)를 제공합니다. 약한 참조는 객체가 메모리에서 해제될 때 자동으로 nil로 설정되므로 순환 참조를 방지할 수 있습니다. 비소유 참조는 객체가 항상 메모리에 존재할 것이라고 가정하여, 참조가 필요할 때 사용하지만 순환 참조를 일으키지 않습니다. 이러한 참조를 적절히 사용함으로써 메모리 누수를 방지하고 안정적인 메모리 관리를 할 수 있습니다.
- 순환 참조 (Circular Reference): 두 개 이상의 객체가 서로를 강하게 참조하여 메모리에서 해제되지 않는 상태.
- 메모리 누수 (Memory Leak): 사용되지 않는 메모리가 해제되지 않아 시스템의 메모리 사용량이 증가하는 문제.
- 약한 참조 (Weak Reference): 참조 대상 객체가 메모리에서 해제되면 자동으로 nil로 설정되는 참조 유형.
- 비소유 참조 (Unowned Reference): 객체의 생명주기를 관리하지 않으면서도 순환 참조를 방지할 수 있는 참조 유형.

질문 3: 메모리 누수(Memory Leak)가 발생하는 주요 원인과 이를 식별하고 해결하는 방법에 대해 설명해주세요.
답변:
메모리 누수는 사용되지 않는 메모리가 해제되지 않아 시스템의 메모리 사용량이 지속적으로 증가하는 문제입니다. 메모리 누수가 발생하는 주요 원인 중 하나는 순환 참조입니다. 두 객체가 서로를 강하게 참조하여 참조 횟수가 0이 되지 않고 메모리에 남아있는 경우 메모리 누수가 발생할 수 있습니다. 또한, 클로저(Closure)에서 self를 강하게 캡처하여 발생하는 참조 사이클도 메모리 누수의 원인이 될 수 있습니다. 메모리 누수를 식별하기 위해서는 Xcode의 Instruments 도구 중 Allocations 및 Leaks를 사용할 수 있습니다. 이 도구들은 앱이 메모리를 어떻게 할당하고 해제하는지 모니터링하여 메모리 누수가 발생하는 지점을 파악할 수 있게 도와줍니다. 메모리 누수를 해결하기 위해서는 코드에서 순환 참조를 방지하기 위해 약한 참조(Weak) 또는 비소유 참조(Unowned)를 사용하거나, 클로저에서 [weak self]나 [unowned self] 캡처 목록을 사용하여 강한 참조를 피하는 방법이 있습니다. 정기적인 코드 리뷰와 메모리 관리 최적화 작업을 통해 메모리 누수를 예방하고 성능을 유지하는 것이 중요합니다.
- 메모리 누수 (Memory Leak): 해제되지 않은 메모리가 계속해서 축적되어 시스템 메모리 자원을 소모하는 문제.
- 클로저 (Closure): 변수나 상수를 캡처하고, 이후에 참조할 수 있는 코드 블록.
- 캡처 목록 (Capture List): 클로저 내에서 사용되는 외부 변수를 약한 참조 또는 비소유 참조로 캡처하기 위해 사용되는 문법.
- Instruments: Xcode에서 제공하는 프로파일링 도구로, 앱의 메모리 사용, 성능, 리소스 사용 등을 모니터링할 수 있는 도구.

'iOS' 카테고리의 다른 글
iOS 면접 전 체크할 기본질문 10가지 (2) | 2024.08.17 |
---|---|
iOS 앱 개발자로서 기술 트렌드를 어떻게 따라가는가? (0) | 2024.08.15 |