Swift의 에러 처리(Error Handling) 방식에 대해 설명하고, `do-catch`, `try?`, `try!`의 각각의 용도와 차이점을 구체적인 상황과 연결하여 설명해주세요.
힌트 · `do-catch`는 에러를 직접 처리하고, `try?`는 에러 발생 시 nil을 반환하며, `try!`는 에러가 발생하지 않을 것이라고 확신할 때 사용합니다.
모범답안
Swift의 에러 처리 방식은 Error 프로토콜을 준수하는 타입을 통해 에러를 표현하고, do-catch, try?, try! 구문을 사용하여 에러를 처리합니다.
do-catch는 에러가 발생할 수 있는 코드를 do 블록 안에 넣고, catch 블록에서 특정 에러를 잡아 처리합니다. 예를 들어, 파일 읽기 작업 중 에러가 발생하면 에러 메시지를 사용자에게 보여주는 방식으로 처리할 수 있습니다.
try?는 에러 발생 가능성이 있지만, 에러 처리 로직이 중요하지 않을 때 사용합니다. 에러가 발생하면 nil을 반환하고, 성공하면 옵셔널 값을 반환합니다. 예를 들어, 이미지 다운로드 시 실패해도 앱이 멈추지 않고 기본 이미지를 보여주는 경우에 사용할 수 있습니다. 옵셔널 바인딩을 통해 안전하게 값을 사용할 수 있습니다.
try!는 에러가 절대 발생하지 않을 것이라고 확신할 때 사용합니다. 만약 에러가 발생하면 런타임 에러가 발생하여 앱이 크래시될 수 있으므로, 사용에 주의해야 합니다. 예를 들어, 앱 번들에 포함된 리소스 파일 접근 시 파일이 반드시 존재한다고 확신할 때 사용할 수 있습니다. 하지만 일반적으로는 try!보다는 try?나 do-catch를 사용하여 에러를 안전하게 처리하는 것이 좋습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 iOS / Swift 면접 질문
- Swift에서 구조체(Struct)와 클래스(Class)의 주요 차이점을 메모리 관리 및 데이터 전달 관점에서 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한지 구체적인 사용 사례와 함께 비교하여 설명해주세요.
- iOS 앱에서 비동기 작업을 처리하기 위해 GCD(Grand Central Dispatch)를 사용하는 경우, `DispatchQueue.main.async`와 `DispatchQueue.global().async`의 차이점을 설명하고, 각각 어떤 용도로 사용되는지 예시를 들어 설명해주세요.
- Swift에서 델리게이트(Delegate) 패턴은 어떤 목적으로 사용되며, 이를 구현하기 위한 핵심적인 요소(프로토콜, weak 키워드 등)들을 설명하고, 델리게이트 패턴이 NotificationCenter나 KVO에 비해 가지는 장점은 무엇인지 설명해주세요.
- Swift 클로저(Closure)의 특징에 대해 설명하고, 클로저에서 강한 참조 순환(Retain Cycle)이 발생할 수 있는 상황과 이를 방지하기 위한 캡처 리스트(Capture List)의 `weak` 및 `unowned` 사용법에 대해 설명해주세요.
- Swift에서 옵셔널 값에 접근할 때 옵셔널 체이닝(Optional Chaining)과 강제 언래핑(Forced Unwrapping)의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 안전하고 적절한지 예시를 들어 설명해주세요.
- Swift의 async/await 및 Actor를 활용하여 고도로 동시성 높은 네트워크 요청 시스템을 설계할 때, 스레드 안전성을 보장하고 리소스 사용을 최적화하며, 특히 상호 의존적인 요청 처리 및 취소 메커니즘을 어떻게 구현할 것인지 구체적으로 설명하시오.