<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
}
}
```

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