<h1><center> iOS interview 3 </center></h1> ###### tags: `💻 면접 질문` ###### date: `2025-09-137:21:33.284Z` > [iOS interview](https://github.com/JeaSungLEE/iOSInterviewquestions) # 개요 **태윤** - Swift 6 - Sendable ```swift import Foundation import Combine import UIKit // 간단한 메모리 피크 감지 - Core에 두는게 좋을 듯... protocol MemoryWarningProtocol: Sendable { var isMemoryWarning: Bool { get async } } final actor MemoryWarningActor: MemoryWarningProtocol { var isMemoryWarning: Bool = false @MainActor private var cancellables = Set<AnyCancellable>() @MainActor init(releaseSeconds: Double = 1.0) { setUp() } @MainActor func setUp(releaseSeconds: Double = 1.0) { NotificationCenter.default .publisher(for: UIApplication.didReceiveMemoryWarningNotification) .sink { [weak self] _ in guard let self else { return } Task { await self.setMemoryWarning(true) } // 1초 후 상태를 되돌리기 위해 Task를 사용 Task { try await Task.sleep(for: .seconds(releaseSeconds)) await self.setMemoryWarning(false) } } .store(in: &cancellables) } private func setMemoryWarning(_ value: Bool) { self.isMemoryWarning = value } } ``` ![스크린샷 2025-09-13 09.50.04](https://hackmd.io/_uploads/BJ5p1Szsgg.png) 12-2. 의존성 관리를 통해 얻을 수 있는 이점은 무엇인가요? - 외부 라이브러리를 의미하는 Dependency? - SDK -> CocoaPods SPM Carthage ..? 이런거? - SPM을 사용하면 얻는 이점..? 모듈화를 하면 좋은점은? => - 코코아팟 사용해본적 있어요? 어떤 이점 있어요? - 모듈화 이런건 다른 이야기 같음 9-2. 프로토콜 확장(Protocol Extension)을 사용하는 이유는 무엇인가요? - 교과서적인 답변이라면.. **미리 특정 property나 method를 구현**할 수 있음 - 근데 POP 를 추구하기 위해 Swift에서 많이 활용되는 표준 프로토콜?이 protocol extension을 기반으로 확장된다고 함.. - POP? 클래스 상속이 아닌 프로토콜 확장의 이점을 중요하게 여기는 개념으로 인지하고 있음.. POP VS OOP | IOP - POP: Composition(구성) 중심 → “can-do” 관계로 모델링 → Dog can Bark - OOP: “is-a” 관계로 모델링 → Dog is a Animal. 프로토콜 지향 프로그래밍(POP)이란 무엇인가요? Protocol Oriented Programming -> 왜 swift POP할까요? 다른 언어는 POP라 안하는데? Java 인터페이스 있는데? 왜? POP 먼데? - 인터페이스와는 다르다. 인터페이스는 정의만 가능하나, 프로토콜은 + 공유 기능 구현, 모든 값 타입에 대한 지원, 동시성도 프로토콜 기반이며, 인터페이스보다 더욱 확장된 개념임 #### 알아보면 좋을 것 5. Swift에서 클로저(Closure)란 무엇이며, 어떻게 사용하나요? 2-1. 클로저의 캡처(Capture) 기능은 무엇인가요? - **캡처리스트** 공부 - GCD: ARC에서 release/retain cycle 문제를 벗어나기 위함 | Councurrency: 하위 Task에 안전하게(Sendable) 값 넘기기 ``` swift let hello = Hello() Task { [weak hello] in guard let hello else { return } } ``` - https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures - https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures#Capturing-Values 2-2. @escaping 클로저와 non-escaping 클로저의 차이점은 무엇인가요? - 힙에 담김, 스택에 담김 - 19-1. Retain Cycle이 발생하지 않도록 방지하는 방법은 무엇인가요? ``` swift func escapingGO(_ go: @escaping()->()) { DispatchQueue.main.async { // -> 근데 이렇게 쓰려면 @escaping 써야 하지 않나요 ✅ go() } } // 여기서 weak self를 해야한다. func non_escapingGo(_ go: ()->()) { // 여기서 weak self를 해야할까? go() } ``` - non_escaping: go 이후에 실행이 바로 끝나서 28. 여러 화면에서 동일한 알림 기능을 사용해야 할 때, 싱글톤 패턴 대신 어떤 디자인 패턴을 고려해볼 수 있나요? - 화면에서 동일한 알림 기능을 사용? 즉 상태 공유를 해야 할 때로 해석할 수 있을듯 - 그럼 싱글톤이 아닌 상태 공유 방식이 있냐? 28-1. Observer 패턴과 NotificationCenter의 관계는 무엇인가요? - 옵저버 구독을 하기 위한 방법 중에 NotificationCenter를 활용할 수 있을 듯 28-2. Dependency Injection을 사용하면 싱글톤 대비 어떤 이점이 있나요? - 상태를 지닌 객체의 생명주기나 28-3. Protocol을 활용한 의존성 역전은 테스트 가능성을 어떻게 향상시키나요? 27. SwiftUI에서 @State 변수를 변경했는데 화면이 업데이트되지 않는다면 어떤 문제를 의심해야 하나요? => Thread가 MainThread인지 / 변수 객체가 class인가? (Identifiable 한가..?) ### 안진 (이오) 1. Swift에서 프로토콜(Protocol)이란 무엇이며, 어떻게 활용하나요? 1-1. 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)의 장점은 무엇인가요? -> 실제로 체감하는 프로토콜의 장점이 있는지? - 배열의 transpose matrix 1 2 => 1 3 3 4 => 2 4 https://tech.kakaopay.com/post/ios-manage-resources-in-multi-framework/ ``` swift imageView.image = .pay.ic_core_message button.tintColor = .pay.red100 ``` 2. iOS에서 델리게이트 패턴(Delegate Pattern)은 어떤 목적 2-1. 콜백 함수의 차이점 2-2. 옵저버 패턴 (저는 두 분 적어두신 이야기를 따라 이야기하겠습니다) ### 태현 (데릭) **레벨 1** 1. iOS 앱의 생명주기(App Life Cycle)에 대해 설명해주세요. - Responder와 ResponderChain - First Responder - https://seizze.github.io/2019/11/26/iOS%EC%9D%98-Responder%EC%99%80-Responder-Chain-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0.html 4.테이블뷰의 delegate 메서드가 호출되지 않는 문제를 어떻게 디버깅하시겠습니까? - layout이 맞지 않으면 Cell을 등록해도 발생하지 않는 문제 - Delegate vs Closure vs Combine을 선택하는 기준은? - 1:1 통신과 1:N 통신에서 각각 어떤 패턴이 적합한가요? - Closure -> 1:1 , Combine -> 1:n, Delegate -> 1: n(Coordinator), 1:1 5. Swift의 기본 데이터 타입과 컬렉션(Collection) 타입에는 어떤 것들이 있나요? - 뭐 이런거 물어보나? String, Int, ..? - Collection이면 -> **Sequence** protocol 이런건 이야기할 수도? - String => String -> 가변 + 내부 contents는 힙에 담김 - 값 타입(Value Type)과 참조 타입(Reference Type)의 차이점은 무엇인가요? - 어쩌구 - 구조체(Struct)와 클래스(Class)의 사용 시기는 어떻게 구분하나요? - (안진) 저는 개인적으로 일단 (머 특정 상태 공유 객체 제외..) Struct로 씁니다.. 그리고 쓰다가 재생성되어 사용하는 것이 아닌, 다른 용도가 필요하다면 class 고려를 하기 시작합니다. - (안진) 그래서 class로 VM 정도만 쓰고 현재도 Repository나 Service 등 Data layer를 struct로 쓰긴 해요! - 열거형(Enum)의 원시값(Raw Value)과 연관값(Associated Value)은 무엇인가요? ```swift enum Position: String { case top = "toptop" case bottom = "bottombottom" } enum View { case login case main case setting(let User) var name: Stirng { switch self { case login: case main: case setting: } } } if View.main == result { } ``` #### 8. API 호출이 실패했을 때 재시도 로직을 구현하려면 어떻게 하시겠습니까? - 네트워크 다 씀 - 네트워크 끊김 (와이파이 -> LTE) - 다중 이미지 - interceptor - A,B,C,D - A <- Re - Re, Ac - B, C, D - interceptor A-> R, B ->R, C -> R, D -> R 9. 동시성 프로그래밍에서 동기(Synchronous)와 비동기(Asynchronous)의 차이점은 무엇인가요? - Swift Concurrency -> 고유명사다..! Task / async-await - 비동기 처리 방법? - (안진) 사실 저는 요즘 Task + async/await만 씁니다.. 거의.. / 아 사이드에서 Combine 가끔 씀니다.. 이마저도 비동기처리라기 보다는 데이터 전달용 (저는 Rx 잘 몰라요..) - (태현) RxSwift, DispatchQueue만 씀.. / Combine