Swift 주니어 프레임워크 기술면접
새 면접Q. UIViewController의 생명주기(Lifecycle) 메서드들을 순서대로 설명하고, 각 메서드에서 주로 어떤 작업을 수행하는지 말씀해주세요.
뷰가 메모리에 로드되는 시점부터 화면에 나타나고 사라지는 순서를 생각해보세요.
UIViewController의 생명주기는 loadView, viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear 순서로 진행됩니다. viewDidLoad는 뷰가 메모리에 로드된 직후 한 번만 호출되며, 초기 설정 작업을 수행합니다. viewWillAppear는 뷰가 화면에 나타나기 직전 호출되며, 데이터 갱신이나 애니메이션 준비를 합니다. viewDidAppear는 뷰가 완전히 표시된 후 호출되며, 애니메이션 시작이나 타이머 설정 등을 수행합니다. viewWillDisappear와 viewDidDisappear는 뷰가 사라질 때 호출되며, 리소스 정리나 상태 저장 작업을 합니다.
- • 생명주기 메서드의 호출 순서를 정확히 알고 있음
- • 각 메서드의 적절한 사용 시점을 이해함
- • viewDidLoad는 한 번만, viewWillAppear는 여러 번 호출될 수 있음을 구분
화면 전환 시 데이터 새로고침, 키보드 처리, 애니메이션 타이밍 제어 등 모든 UI 작업의 기초가 됩니다.
viewDidLoad와 viewWillAppear의 차이점은 무엇이며, 네트워크 호출은 어느 시점에 하는 것이 적절할까요?
Q. ARC(Automatic Reference Counting)가 무엇인지 설명하고, strong, weak, unowned 참조의 차이점과 각각 언제 사용해야 하는지 말씀해주세요.
순환 참조 문제와 메모리 해제 시점을 중심으로 생각해보세요.
ARC는 Swift의 자동 메모리 관리 방식으로, 객체의 참조 카운트를 추적하여 0이 되면 자동으로 메모리를 해제합니다. strong은 기본 참조 방식으로 참조 카운트를 증가시키며, 일반적인 소유 관계에 사용합니다. weak은 참조 카운트를 증가시키지 않고 참조 대상이 해제되면 자동으로 nil이 되며, delegate 패턴이나 부모-자식 관계에서 순환 참조를 방지할 때 사용합니다. unowned도 참조 카운트를 증가시키지 않지만 nil이 될 수 없으며, 참조 대상이 항상 먼저 해제되지 않을 것이 확실할 때 사용합니다. 클로저에서 self를 캡처할 때는 weak이나 unowned를 사용하여 순환 참조를 방지해야 합니다.
- • ARC의 동작 원리를 이해함
- • 각 참조 타입의 메모리 관리 방식 차이를 설명함
- • 순환 참조 문제와 해결 방법을 알고 있음
delegate 패턴 구현, 클로저 사용, 뷰 컨트롤러 간 참조 등에서 메모리 누수를 방지하는 데 필수적입니다.
클로저에서 캡처 리스트를 사용하는 이유와 방법을 설명해주세요.
Q. SwiftUI의 @State, @Binding, @ObservedObject의 차이점과 각각의 사용 목적을 설명해주세요.
데이터의 소유권과 뷰 간 데이터 전달 방식을 중심으로 생각해보세요.
@State는 뷰 내부에서 소유하고 관리하는 private한 상태 값으로, 값이 변경되면 뷰를 다시 렌더링합니다. @Binding은 다른 뷰가 소유한 상태를 참조하여 읽고 쓸 수 있게 하는 양방향 연결로, 부모-자식 뷰 간 데이터를 공유할 때 사용합니다. @ObservedObject는 외부의 ObservableObject 클래스를 관찰하며, 클래스의 @Published 프로퍼티가 변경되면 뷰를 업데이트합니다. @State는 단순한 값 타입의 로컬 상태에, @Binding은 하위 뷰에 상태를 전달할 때, @ObservedObject는 복잡한 비즈니스 로직을 가진 뷰모델에 사용합니다.
- • 각 프로퍼티 래퍼의 용도와 차이를 명확히 구분함
- • 데이터 소유권과 흐름을 이해함
- • 적절한 사용 시나리오를 설명함
SwiftUI 앱에서 폼 입력, 화면 간 데이터 전달, MVVM 패턴 구현 등 모든 상태 관리에 사용됩니다.
@StateObject와 @ObservedObject의 차이점은 무엇인가요?
Q. 옵셔널(Optional)이 무엇인지 설명하고, 옵셔널 바인딩(if let, guard let)과 옵셔널 체이닝의 차이점을 말씀해주세요.
값이 없을 수 있는 상황을 안전하게 처리하는 방법들을 비교해보세요.
옵셔널은 값이 있을 수도 있고 없을 수도 있는 상태를 표현하는 Swift의 타입으로, nil을 안전하게 처리할 수 있게 합니다. if let은 옵셔널 값이 존재할 때만 언래핑하여 특정 스코프 내에서 사용하며, 값이 없으면 else 블록을 실행합니다. guard let은 옵셔널 값이 없으면 early return하고, 있으면 이후 코드에서 계속 사용할 수 있어 함수 전체에서 언래핑된 값을 사용할 때 적합합니다. 옵셔널 체이닝은 물음표를 사용하여 옵셔널의 프로퍼티나 메서드에 연속적으로 접근하며, 중간에 nil이 있으면 전체 표현식이 nil을 반환합니다.
- • 옵셔널의 개념과 필요성을 이해함
- • 옵셔널 바인딩 방법들의 차이를 설명함
- • 각 방법의 적절한 사용 시나리오를 알고 있음
API 응답 파싱, 사용자 입력 처리, 딕셔너리 접근 등 nil이 발생할 수 있는 모든 상황에서 안전한 코드를 작성하는 데 사용됩니다.
강제 언래핑(!)을 사용하는 것이 위험한 이유와, 그럼에도 사용해도 되는 경우는 언제인가요?
Q. GCD(Grand Central Dispatch)의 DispatchQueue에서 main queue와 global queue의 차이점을 설명하고, UI 업데이트를 반드시 main queue에서 해야 하는 이유를 말씀해주세요.
스레드 안전성과 UIKit의 동작 방식을 고려해보세요.
main queue는 메인 스레드에서 동작하는 직렬 큐로 UI 업데이트와 사용자 인터랙션을 처리하며, global queue는 백그라운드 스레드에서 동작하는 동시 큐로 무거운 작업을 처리합니다. UIKit의 모든 컴포넌트는 스레드 안전하지 않아 여러 스레드에서 동시에 접근하면 예측 불가능한 동작이나 크래시가 발생할 수 있습니다. 따라서 네트워크 호출이나 데이터 처리는 global queue에서 수행하고, 결과를 받아 UI를 업데이트할 때는 DispatchQueue.main.async를 사용하여 main queue로 전환해야 합니다. 이를 통해 UI 일관성을 보장하고 앱의 안정성을 유지할 수 있습니다.
- • main queue와 global queue의 역할 차이를 이해함
- • UIKit의 스레드 안전성 문제를 설명함
- • 비동기 작업 후 UI 업데이트 패턴을 알고 있음
네트워크 통신 후 화면 업데이트, 이미지 다운로드 및 표시, 데이터베이스 작업 등 모든 비동기 작업에서 필수적으로 사용됩니다.
sync와 async의 차이점과, main queue에서 sync를 호출하면 어떤 문제가 발생하나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!