iOS 앱에서 비동기 작업을 처리하기 위해 GCD(Grand Central Dispatch)를 사용하는 경우, `DispatchQueue.main.async`와 `DispatchQueue.global().async`의 차이점을 설명하고, 각각 어떤 용도로 사용되는지 예시를 들어 설명해주세요.
힌트 · `main` 큐는 UI 관련 작업을 처리하는 직렬 큐이며, `global` 큐는 백그라운드에서 CPU-intensive 작업을 처리하는 동시 큐입니다.
모범답안
GCD를 사용하여 비동기 작업을 처리할 때 DispatchQueue.main.async와 DispatchQueue.global().async는 중요한 차이점을 가집니다.
DispatchQueue.main.async는 메인 큐에서 작업을 실행합니다. 메인 큐는 UI 업데이트와 관련된 모든 작업을 처리하는 직렬 큐입니다. 즉, UI를 변경하거나 UI 관련 데이터를 업데이트할 때는 반드시 메인 큐를 사용해야 합니다. 예를 들어, 네트워크 요청 후 응답을 받아 UI에 표시할 때 DispatchQueue.main.async를 사용합니다.
DispatchQueue.global().async는 백그라운드에서 작업을 실행합니다. 글로벌 큐는 시스템에서 관리하는 동시 큐이며, 다양한 우선순위를 가집니다. CPU 사용량이 많은 작업이나 시간이 오래 걸리는 작업을 메인 큐에서 분리하여 앱의 응답성을 유지하는 데 사용됩니다. 예를 들어, 이미지 처리나 복잡한 계산 작업을 백그라운드에서 처리할 때 DispatchQueue.global().async를 사용합니다.
요약하자면, UI 관련 작업은 main.async를, 그 외의 작업은 global().async를 사용하여 앱의 성능과 사용자 경험을 최적화할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 iOS / Swift 면접 질문
- Swift의 `Enum` (열거형)은 무엇이며, 원시 값(Raw Value)과 연관 값(Associated Value)의 차이점을 설명하고 각각의 사용 예를 들어주세요.
- iOS 앱 개발 시 ARC(Automatic Reference Counting)가 어떻게 동작하는지 설명하고, 강한 참조 순환(Retain Cycle)이 발생하는 대표적인 상황과 이를 해결하는 방법에 대해 구체적인 코드 예시 없이 개념적으로 설명해주세요.
- Swift에서 구조체(Struct)와 클래스(Class)의 주요 차이점을 메모리 관리 및 데이터 전달 관점에서 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한지 구체적인 사용 사례와 함께 비교하여 설명해주세요.
- Swift에서 델리게이트(Delegate) 패턴은 어떤 목적으로 사용되며, 이를 구현하기 위한 핵심적인 요소(프로토콜, weak 키워드 등)들을 설명하고, 델리게이트 패턴이 NotificationCenter나 KVO에 비해 가지는 장점은 무엇인지 설명해주세요.
- Swift의 에러 처리(Error Handling) 방식에 대해 설명하고, `do-catch`, `try?`, `try!`의 각각의 용도와 차이점을 구체적인 상황과 연결하여 설명해주세요.
- Swift 클로저(Closure)의 특징에 대해 설명하고, 클로저에서 강한 참조 순환(Retain Cycle)이 발생할 수 있는 상황과 이를 방지하기 위한 캡처 리스트(Capture List)의 `weak` 및 `unowned` 사용법에 대해 설명해주세요.