<h1><center> iOS interview 2 </center></h1>
###### tags: `๐ป ๋ฉด์ ์ง๋ฌธ`
###### date: `2025-09-067:21:33.284Z`
> [iOS interview](https://github.com/JeaSungLEE/iOSInterviewquestions)
# ๊ฐ์
### ์์ง KWDC ํ๊ธฐ
1. ํ๊ธ๊ณผ ์ฌ๊ณผ๋ฐญ
- ํ๊ธ์ด ๋จ์ ํ
์คํธ๊ฐ ์๋ ๋ณตํฉ ๋ฌธ์ ์ฒด๊ณ์์ ์ดํดํ๊ณ , macOSยทWindows์ ์ ๊ทํ ์ฐจ์ด๋ก ์ธํ ํ์ผ๋ช
ยท๋ฌธ์์ด ๋ฌธ์ ์ ๊ตฌ์กฐ์ ์์ธ์ ํ์
ํฉ๋๋ค. ์ค์ ์ฌ๋ก์ ์ฝ๋๋ก ํ๊ธ ์ฒ๋ฆฌ ์ ์ ์์ ์ ๋ฐฐ์ฐ๋ฉฐ, ๋ ๋์ ํ๊ธ ๊ฒฝํ ์ ๊ณต ๋ฐฉํฅ์ ํจ๊ป ๋ชจ์ํฉ๋๋ค.
- ๋ฌธ์์ด ์ ๊ทํ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ํ ์๊ฐ๊ฐ ์์์! ์ฒ์๋ณด๋๋ฐ ๋ชจ๋๊ฐ ํ์ฉํ๋ ๋ฌธ์์ด์ ๋ํ ์ด์ผ๊ธฐ๋ผ๋.. ๋ผ๋ ๊ฐ์
- NFD (Normalization Form Decomposition)
- NFC (Normalization Form Canonical Composition)
- GPT ๋ฐ๋ณด.. C, D์ ์๋ฏธ๊ฐ ์์์ต๋๋ค!
- ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ์ฐ์์ ๋, NFC ์ ์ฉ๊ณผ NFD ์ ์ฉ์ ๋ฐฉ์์ด ๋ค๋ฅด๋ค... => macOS, iOS์์ ์ฑ์ ์ง์ํ๋ ค๋ฉด [ NFC -> **NFD** ๋ณํ์ ํด์ค์ผํ๋ค..? ]
- ๋ธ๋ก๊ทธ ์ ๋ณด: https://cdecl.github.io/devops/nfd-to-nfc/
``` swift
import Foundation
let nfcString = "์๋
ํ์ธ์, ์ธ์! รฉ"
print("NFC (์๋ ๋ฌธ์์ด): \(nfcString)")
// NFC๋ฅผ NFD๋ก ๋ณํ
let nfdString = nfcString.decomposedStringWithCanonicalMapping
print("NFD (๋ณํ๋ ๋ฌธ์์ด): \(nfdString)")
// NFD๋ฅผ ๋ค์ NFC๋ก ๋ณํ
let nfcStringAgain = nfdString.precomposedStringWithCanonicalMapping
print("NFC (๋ค์ ๋ณํ): \(nfcStringAgain)")
```
2. actor boundary๋ฅผ ๋์ด์
- Swift 6์์ ๋ ๊ฑฐ์ ์ค๋ ๋ ๊ธฐ๋ฐ API๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด actor ๊ฒฝ๊ณ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ๋์ด๊ฐ๋ ๋ฐฉ๋ฒ๊ณผ, ์ด๋ฅผ ํด๊ฒฐํ๋ ์ปค์คํ
executor / DispatchQueue ๋ฐฉ์ ๋ฐ ๋ฝ ๊ธฐ๋ฐ ์ ๊ทผ๋ฒ์ ๋น๊ตํ๊ณ ์๊ฐํฉ๋๋ค.
```
โ๏ธ ์ธ์
์์ ํ ๋ง (ํฌ์ธํธ ์ ๋ฆฌ)
- Actor ๊ฒฉ๋ฆฌ ๊ท์น: โactor ์์ ํ๋กํผํฐ๋ ๊ทธ actor ์คํ๊ธฐ ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋คโ โ cross-actor ์ ๊ทผ ์ ํญ์ await.
์?: ๋ฐ์ดํฐ ๋ ์ด์ค ๋ฐฉ์ง, ๋์์ฑ ์์ ๋ณด์ฅ.
โญ๏ธ nonisolated ๋ฉค๋ฒ: ์์ธ ์ผ์ด์ค.
> ์ด ์น๊ตฌ๋ค์ ๋น๋ฏ๊ณผ ๊ฐ์ ํน์ง์ด ์์...
- ์์ฑ ์์ ์ ํ์ ๋ ์์ (let) -> ์คํ ์์ญ, ํ ์์ญ ์๊ด์ด ์๋..?
- ์์ ๊ณ์ฐ ํ๋กํผํฐ (var computed: Int { โฆ })
- static ๋ฉค๋ฒ (ํ์
๋ ๋ฒจ ๊ณต์ )
์ค๋ฌด ์ฌ๋ก:
id, name ๊ฐ์ ๊ณ ์ ๋ ๋ฉํ๋ฐ์ดํฐ๋ nonisolated๋ก ๋นผ์ ์ด๋์๋ ์ฝ๊ฒํจ.
๋ด๋ถ ์ํ(balance, items)๋ await๋ก๋ง ์ ๊ทผํ๋๋ก ์ ์ง.
์ํฐํจํด ๊ฒฝ๊ณ :
nonisolated๋ก mutable ๋ฐ์ดํฐ๋ฅผ ๋
ธ์ถํ๋ฉด actor ๋ชจ๋ธ์ ๊นจ๋จ๋ ค์ race condition ๋ฐ์.
โ๊ฒ๋ณด๊ธฐ ๋๊ธฐ ์ ๊ทผโ์ ์ํด nonisolated๋ฅผ ๋จ์ฉํ์ง ๋ง ๊ฒ.
์ฐ๊ฒฐ ํฌ์ธํธ:
๋ ๊ฑฐ์ ์ค๋ ๋ ๊ธฐ๋ฐ API์ ์ฐ๊ฒฐํ ๋๋, ๋๊ธฐ์ ์ผ๋ก ๋ณด์ด๊ฒ ๋ง๋๋ ๋์ ๋ด๋ถ ์ํ๋ actor ๊ฒฉ๋ฆฌ๋ฅผ ์ง์ผ์ผ ํจ.
โถ๏ธ ์ฆ, actor ๊ฒฉ๋ฆฌ vs nonisolated ์์ธ์ ๊ท ํ์ด ํต์ฌ ๋ฉ์์ง.
--------
์ธ์
๊ณจ์ (Key Takeaways)
Swift 6์ ๊ธฐ๋ณธ ์ ์ : ๋์์ฑ ์์ ์ฑ ๊ฐํ๋ก โ๋๊ธฐ์ cross-actor ์ ๊ทผโ์ ์์น์ ์ผ๋ก ๊ธ์ง/์ ์ฝ.
๋ ๊ฑฐ์ ์ค๋ ๋/์ฝ๋ฐฑ API ๋ค๋ฃจ๊ธฐ: await/๋ฉ์์ง ํจ์ฑ์ด ์ ์. ๋๊ธฐ๋ฅผ ๊ผญ ์ ์งํด์ผ ํ๋ค๋ฉด โ์ค์ ๋ก ๋๊ธฐ์ฌ์ผ ํ๋ ๊ตฌ๊ฐโ์ ์ต์ํํ๊ณ ๊ฒฝ๊ณ(Bridge) ๋ฅผ ๋ง๋๋ ๊ตฌ์กฐ๋ก.
๋์ ๋น๊ต:
- Custom Executor + DispatchQueue ๋ฐ์ธ๋ฉ: ๋ ๊ฑฐ์ ํ ๊ท์ฝ์ ๋ณด์กดํ๋ฉด์๋ actor ๊ฒฉ๋ฆฌ ์ ์ง(์ถ์ฒ).
- ์์ Dispatch(ํ-๊ธฐ๋ฐ) ๋ํ: ๊ฐ๋จํ์ง๋ง ๊ตฌ์กฐ์ ์ผ๋ก ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
์ ํ๊ณ.
- ๋ฝ(NSLock ๋ฑ) ๊ธฐ๋ฐ: ๊ฐ์ฅ ์ง๊ด์ ์ด์ง๋ง ๊ต์ฐฉยท์ฐ์ ์์ ์ญ์ ยท์ฌ์ง์
๋ฌธ์ ์ ์ทจ์ฝ(์ตํ์ ์๋จ).
์ํฐํจํด: ์คํ๊ธฐ(Executor) ์ค๋ ๋๋ฅผ ๋ธ๋กํนํ์ง ๋ง ๊ฒ. reentrancy/priority๋ฅผ ๋ฌด์ํ์ง ๋ง ๊ฒ.
ํ์ค์ ๊ฒฐ๋ก : โ๋๊ธฐ์ฒ๋ผ ๋ณด์ด๋ API ํ๋ฉดโ ๋ค์์ ๋น๋๊ธฐ ๋ด๋ถ ๊ตฌํ์ผ๋ก ์์ ํ๊ฒ ์์ด๊ธฐ.
```
**Custom Executor + DispatchQueue ์ ๋ต (๊ถ์ฅ)**
๋ ๊ฑฐ์๊ฐ โ์ด ํ์์ ๋์ํด์ผ ํ๋คโ๋ ๊ท์ฝ์ ๊ฐ๋ ๊ฒฝ์ฐ, actor๋ฅผ ํด๋น ํ ์คํ๊ธฐ์ ๋ฐ์ธ๋ฉ.
```swift
actor LegacyBoundActor {
nonisolated var unownedExecutor: UnownedSerialExecutor { queue.asUnownedSerialExecutor() }
private let queue = DispatchQueue(label: "legacy.queue") // ๋ ๊ฑฐ์ ๊ท์ฝ ํ
// actor ๋ฉ์๋๋ ํญ์ ์ด ํ์์ ์ง๋ ฌ ์คํ
func doWork() { /* ๋ ๊ฑฐ์ ๊ฐ์ฒด ์์ ์ ๊ทผ */ }
}
```
์ฅ์
- ๋ ๊ฑฐ์์ ํ ์ ์ฝ์ ์ธ์ด ์ฐจ์ ๊ฒฉ๋ฆฌ์ ๊ฒฐํฉ.
- actor ๊ฒฉ๋ฆฌ + ์์ ๋ณด์ฅ + ์ฌ์ง์
๋ชจ๋ธ์ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌ.
- ํ
์คํธ ์ฉ์ด(ํ ๊ต์ฒด/์ธ์ ์
).
์ฃผ์
- ๋ด๋ถ์์ ๋ธ๋กํน ํธ์ถ ๊ธ์ง(๊ฐ์ ํ์ ๋ค์ ๋๊ธฐ ์ง์
ํ๋ฉด ๊ต์ฐฉ).
- ํ ํ/์ค๋ ๋ ์์ ์์๊ณผ ๊ต์ฐจ ๋ฝ ๊ธ์ง(๋ฝ ์์ ์ ๋ฆฝ ํ์).
> ๋ฐ๋ชจ: ๋์ผ ํ ๋๊ธฐ ์ฌ์ง์
์ผ๋ก ๊ต์ฐฉ์ด ๋๋ ์๋ชป๋ ์ฝ๋์, await๋ก ์์ ํ๊ฒ hop ํ๋ ์ฌ๋ฐ๋ฅธ ์ฝ๋ ๋๋น.
``` swift
@globalActor
struct MyGlobalActor {
actor MyActor {}
static let shared = MyActor()
}
```
GPT์ผ ๋ ์ด๊ฑฐ ํ๋๋ ๋ชจ๋ฅด๊ฒ ๋๋ฐ ์ด๊ฑฐ ์๋ ค๋ฉด ๋ญ ์์์ผ ํด?
```
1. Swift Concurrency ์์ฒด
- Actor ๊ฒฉ๋ฆฌ ๋ชจ๋ธ
- actor๊ฐ ์ํ๋ฅผ ์ด๋ป๊ฒ ์ง๋ ฌํํด์ ๋ณดํธํ๋์ง
- cross-actor hop(await)์ด ์ ํ์ํ์ง
- nonisolated
- ์ธ์ actor ๊ฒฉ๋ฆฌ ๋ฐ๊นฅ์์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋์ง (๋ถ๋ณ ๋ฐ์ดํฐ, ์์ ํจ์)
- Executor
- Swift์ ์คํ๊ธฐ(Executor) ๊ฐ๋
: actor ๋ฉ์๋๋ฅผ ์ด๋ค ์ค๋ ๋/ํ์์ ์คํ์ํฌ์ง ๊ฒฐ์
- Custom Executor: actor๋ฅผ ํน์ DispatchQueue ๋ฑ๊ณผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
- Reentrancy(์ฌ์ง์
)
- actor ๋ด๋ถ์์ await ์ ๋ค๋ฅธ ์์
์ด ๋ผ์ด๋ค ์ ์๋ค๋ ํน์ง
- ์ด๋ฅผ ๋ง๊ฑฐ๋ ๋ค๋ฃฐ ์ ์๋ ํจํด (์ค๋
์ท/๋ถ๋ณ์ฑ ๊ฐํ)
2. ์ ํต์ ๋์์ฑ ์ ์ด(๋ ๊ฑฐ์)
์ธ์
์์ Mutex(๋ฝ) ์ด์ผ๊ธฐ๊ฐ ๋์จ ๊ฑด ๊ณผ๊ฑฐ ๋ฐฉ์๊ณผ์ ๋น๊ต ๋๋ฌธ์ผ ๊ฑฐ์์.
- ๋ฎคํ
์ค(Mutex)/NSLock
- ๊ณต์ ์์์ ๋ณดํธํ๊ธฐ ์ํด ์ฐ๋ ๋ฝ
- ๋ฌธ์ ์ : ๊ต์ฐฉ(deadlock), ์ฐ์ ์์ ์ญ์ (priority inversion), ์ฌ์ง์
๋ถ๊ฐ ์ํฉ ๋ฑ
- DispatchQueue(GCD)
- ํ ๋จ์ ์ง๋ ฌํ โ ์ฌ์ค์ โ๋ฝ ๋์ฒด์ฌโ
- ์ฌ์ ํ ๋ง์ด ์ฐ์ด์ง๋ง Swift Concurrency์๋ ๋ค๋ฅธ ์ถ์ํ
- ์ธ๋งํฌ์ด(Semaphore)
- ๋๊ธฐํ primitive, ๋๊ธฐ wait ๊ฐ๋ฅ
- Swift Concurrency์์๋ ๊ฐ๊ธ์ ํผํ๊ณ , await ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ก ์ ํ ๊ถ์ฅ
3. ๊ณต๋ถํ๋ฉด ์ข์ ํค์๋ ๋ชจ์
- Swift Concurrency ๊ธฐ๋ณธ: async/await, Task, TaskGroup, Actor, MainActor
- Actor ๊ด๋ จ: isolated, nonisolated, Sendable, @unchecked Sendable
- Executor ๊ด๋ จ: SerialExecutor, UnownedSerialExecutor, DispatchQueue.asUnownedSerialExecutor()
- ์์ ์ฑ: Reentrancy(์ฌ์ง์
), Cancellation(์ทจ์), Priority(์ฐ์ ์์)
- ์ ํต ๋์์ฑ: Mutex, Semaphore, Condition Variable, GCD(DispatchQueue, OperationQueue)
- ๋น๊ต ๊ด์ : โ๋ฝ ๊ธฐ๋ฐ โ ํ ๊ธฐ๋ฐ โ actor ๊ธฐ๋ฐโ ์ฐจ์ด
4. ํ์ต ํฌ์ธํธ ์ ๋ฆฌ
์ actor๊ฐ ํ์ํ๊ฐ? โ ์ ํต์ ๋ฝ(GCD, Mutex)์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด.
actor ๊ฒฉ๋ฆฌ ๊ท์น โ cross-actor ์ ๊ทผ ์ await์ด ํ์์ธ ์ด์ .
nonisolated โ ์์ธ ์ํฉ (๋ถ๋ณ, ํ์
๋ ๋ฒจ ์ ๋ณด).
Custom Executor โ ๋ ๊ฑฐ์ ํ/์ค๋ ๋ ๊ท์ฝ์ Swift actor์ ์์ ํ๊ฒ ์ด์ํ๋ ๋ฒ.
Mutex ๋ฑ ๋ ๊ฑฐ์ ๊ธฐ๋ฒ์ Swift Concurrency์์ ์ฐจ์ด์ ๋จ์ ์ ์ดํดํ๋ฉด ์ถฉ๋ถ.
```
4. Array๋ก๋ถํฐ ์ดํดํ๋ Swift์ ์ฑ๋ฅ: ๋๊ธฐ, ์งํ, ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋ -> ใ
.ใ
| inline array

6. ์
ฐ์ด๋ ๋ชฐ๋ผ๋ ๊ด์ฐฎ์, Metal ํ์ดํ๋ผ์ธ์ ์ด๋ ๊ฒ ์๊ฒผ์ด
์ด๊ฒ ๋ญ์ง ์ ๋ชฐ๋ผ์ ์ดํด๋ฅผ ..
- Metal? -> GPU ๋ก์ฐ๋ ๋ฒจ
- URL
- Metal4์ ๋ํด ์ด์ผ๊ธฐํ๋. MTLDevice. commandbuffer. commandallocator. renderpipelineState. pipeline, renderpass. rendercommandencoder.computecommandencoder. buffer, texture. ์๋๋ ๊ณ ์ ๋ ๋ญ ์ฌ์ฉํจ. ํ์ง๋ง ๋๋ก์ฐ ๋์ด๋๋ฉด ๋ฆฌ์์ค ๋์ด๋จ. ํผํฌ๋จผ์ค ๋ถ๋ด. ๋์ ์ผ๋ก ํ์ํ๋ฉด bind ์ด์ฉ๊ตฌ. barrier api? metal๊ธฐ gpu์ ๋์ํ๋ ๋ฐฉ์์ ๋ํ ์ค๋ช
https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.kodeco.com%2Fbooks%2Fmetal-by-tutorials%2Fv2.0%2Fchapters%2F3-the-rendering-pipeline&psig=AOvVaw1ipgjPIDBmPpM1dUw3M0Vx&ust=1757206714862000&source=images&cd=vfe&opi=89978449&ved=0CBIQjRxqFwoTCLjD4qz3wo8DFQAAAAAdAAAAABAE
https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_layers/dq_layers.html


7. PassKit / ID Verifier๋ก ๊ฒ์ฆ ํ๋ก์ธ์ค ๊ตฌ์ถํ๊ธฐ
- mDL (mobile Driverโs License)
- ๋ชจ๋ฐ์ผ ์ด์ ๋ฉดํ์ฆ.
- ๊ตญ์ ํ์ค ISO/IEC 18013-5์ ๋ฐ๋ผ NFC๋ QR, BLE ๋ฑ์ ํตํด ๋ค๋ฅธ ๋จ๋ง์ ์ ์ยท๊ฒ์ฆ ๊ฐ๋ฅ.
- mdoc (mobile document)
- mDL์ ํฌํจํ๋ ๋ ๋์ ๊ฐ๋
.
- ์ฌ๊ถ, ์ฃผ๋ฏผ๋ฑ๋ก์ฆ, ํ์์ฆ, ๋ง์ด๋๋ฒ์นด๋ ๋ฑ ๊ณต์ ์ ์ ๋ฌธ์๋ฅผ ๋์งํธํํ ๊ฒ.
- ํ์ค: ISO/IEC 23220 ์๋ฆฌ์ฆ, 18013-5/7 ๋ฑ.
- ์ผ๋ณธ ์ฌ๋ก: iPhone ์์์ ๋ง์ด๋๋ฒ์นด๋(mynumber card) ๋ฅผ mdoc์ฒ๋ผ ํ์ฉ โ ์ ๋ถ์ Apple์ด ํ๋ ฅ.
```
โญ๏ธ CBOR: JSON๋ณด๋ค compactํ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ํฌ๋งท, ํ์ค mdoc ๋ฐ์ดํฐ ๊ตฌ์กฐ.
COSE: CBOR ๊ธฐ๋ฐ์ ์๋ช
ยท์ํธํ ํฌ๋งท.
Verifier / Holder / Issuer:
Issuer: ์ ๋ถ/๊ธฐ๊ด (๋ฉดํ์ฆ ๋ฐ๊ธ)
Holder: ์ฌ์ฉ์(iPhone์ ๋ณด๊ด)
Verifier: ์ ์ ํ์ธํ๋ ์ฑ/๋จ๋ง
Presentation: mdoc ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ ๊ฒ์ฆํ๋ ๊ณผ์ .
```
8. Swift Testing์ผ๋ก ์์ฑํ ํ
์คํธ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฐพ๊ณ ์ํํ ์ ์์๊น?
(์์ง ์ ๋ชจ๋ฆ ์ด์..)
> Suite ์คํํ์ ๋...

9. Apple์ ์ปจํ
์ด๋ํ ํ๋ ์์ํฌ ์ดํดํ๊ธฐ - ๊ธฐ์ด๋ถํฐ ์์ํ๊ธฐ
```
brew install ์ด์ฉ๊ตฌ container
container system run
container run swift ์ด์ฉ๊ตฌ
container build -์ด์ฉ๊ตฌ swift { print("hello world") }
์ ์ฐํ๋๊ฑฐ ๋ณด์ฌ์ค
```
- https://github.com/inductor
**์ฌ๊ธฐ์ ์ฃผ์ ๋ฅผ ๋์ ธ ๋ณด๊ฒ ์ต๋๋ค**
**ํ์ค**
NFC์ NFD์ ๊ด๋ จ๋ ๋ธ๋ก๊ทธ ๊ธ: https://code-notes.tistory.com/160
**ํํ**
1. ํ๊ธ๊ณผ ์ฌ๊ณผ๋ฐญ
https://gist.github.com/oozoofrog/07d7eec63750c4992b09e2709f180497
ํ๊ธ?
- ๋ฌธ์์ด ์ฒ๋ฆฌ ?
- NFC(Normalization F? C?, NFD(- MACOS)?
- ํน์ ๋ฌธ์๊ฐ ์๊ธฐ๋๋ฌธ์ ๊นจ์ง๋ ๊ฒ์ด๋ค.
- ์ ๋์ฝ๋
2. actor boundary
- SerialExecutor
- Executor
- UnownedSerialExecutor
3. Array๋ก๋ถํฐ ์ดํดํ๋ Swift์ ์ฑ๋ฅ
- inline array
---
### DIContainer์ ์ฑ๊ธํค
- ๋์ ๋งค์นญ๋๋ ๊ฒ์ด ์๋๋ค.
- ์ฑ๊ธํค ํจํด์ ์ด๋ค -> ๋ด๋ถ ํ๋กํผํฐ ๊ฐ์ ๋ณํ๊ฐ ์ ์ญ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ค.
- DIContainer๋ ๊ฐ์ฒด ์์ฑ์ ๋งจ ์ฒ์ํ๊ณ , ์ ์ญ์ ์ผ๋ก ์์ฑ๋์ง๋ง, ๋ด๋ถ ํ๋กํผํฐ ๋ณํ๋ ๋ฐ์ํ์ง ์๋๋ค. (๊ฐ์ฒด ์ถ์ํ๊ฐ ๋๋๊น...)
#### ์ฑ๊ธํค
1. ๋์ ๊ฒฐํฉ๋: ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค๋ค์ด ํน์ ์ฑ๊ธํค ํด๋์ค์ ์ง์ ์ ์ผ๋ก ์์กดํ๊ฒ ๋์ด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋๋ค.
2. ํ
์คํธ์ ์ด๋ ค์: ์ฑ๊ธํค์ ์ ์ญ ์ํ๋ฅผ ๊ฐ์ง๋ฏ๋ก, ๋
๋ฆฝ์ ์ธ ๋จ์ ํ
์คํธ๊ฐ ์ด๋ ต์ต๋๋ค. ํ
์คํธ๋ฅผ ํ ๋๋ง๋ค ์ฑ๊ธํค ๊ฐ์ฒด์ ์ํ๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
3. ๋ฉํฐ ์ค๋ ๋ ๋ฌธ์ : ์ง์ ๊ตฌํํ ๊ฒฝ์ฐ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ฉฐ, ์ด๋ ์ฝ๋์ ๋ณต์ก์ฑ์ ๋์
๋๋ค.
#### ์บ์ฑ
์๋ฒ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ -> Core Data ๋ฐ์ดํฐ๋ก ์ ์ฅ -> A ๊ฐ์ฒด
**๋ฌธ์ **
- ๋คํธ์ํฌ ์์ ๋๋ ์ฌ์ฉํ ์ ์๊ฒํด์ผํจ
- ์บ๋ฆญํฐ ๋ฐฉ?์ ๊พธ๋ฏผ๋ค? (์์ฌ)
- ์ฌ์ฉ์ ์์
(์๋ฒ, CoreData)
A <- set
Core Data <- ์ต์ ํ
state = 1, 2, 3 ~ 4
- ์ต์ ํ ์์
- ์๋ฒ
1. add
- Core Data
- server
A ๊ฐ์ฒด๋ก
์๋ฒ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ > Realm -> ๋ฌธ๊ตฌ -> A ๊ฐ
1. Core Data Entity๋ก ๊ด๋ฆฌํ๊ธฐ ํ๋ ์ํ๋ค (๋๋ฌด ์ผ์ด์ค๊ฐ ๋ง์)
==> FileManager๋ฅผ ์ด๋ค. | ์ํ์ด ๋๋ฌด ๋ง๊ณ ํ์
์ ๋ฆฌ๊ฐ ์์ด์... ์ด๊ฑด ์ด๋ป๊ฒ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค... / **UserDefaults** vs FileManager
2. *๊ตณ์ด Sync๋ฅผ ํฌ๊ฒ ๊ณ ๋ ค ์ํด๋ ๋จ* ๋ค์ ๋ค์ด ๋ฐ์ผ๋ฉด ๊ทธ๋ง์ด์ผ~ => ๊ทธ๋๋ ์ข ๋ ๋ค์ด ๋ฐ์์ผ๋ฉด ์ข๊ฒ ์ด
3-1. URLCache๋ก ๋ค์ด ๋ฐ๊ณ ์บ์ฑ ๋์ด์๋ ๊ฒ์ ์ ๋ค์ด๋ฐ์... ์ ์ฅ์ ์ด๋ป๊ฒ? => *FileManager*๋ก json์ด๋ ๋ญ๋ ๋ค์ด
3-2. ์ ์ฅํ๊ธฐ ์ ์ FileManager์ ์ํ๋ ํ์ผ์ด tempDirectory์ ์๋์ง ๋ฌผ์ -> ์์ผ๋ฉด tempDirectory์์ ์ฌ์ฉ, ์์ผ๋ฉด ๋ค์ด๋ฐ์ but, tempDir์ ์ ์ฅ
UserDefaults
https://ios-development.tistory.com/702
```
๊ฐ๋จํ ์ค์ ๊ฐ์ธ๊ฐ? โก๏ธ **UserDefaults**๋ฅผ ์ฌ์ฉํ์ธ์.
ํ์ผ(์ด๋ฏธ์ง, ๋ฌธ์ ๋ฑ)์ด๊ฑฐ๋ ํฌ๊ธฐ๊ฐ ํฐ ๋ฐ์ดํฐ์ธ๊ฐ? โก๏ธ **FileManager**๋ฅผ ์ฌ์ฉํ์ธ์.
์ ๊ทธ๋ด๊น?
๋ฐ์ดํฐ ํ์๊ณผ ์์น: UserDefaults๋ ๋ฐ์ดํฐ๋ฅผ **.plist(Property List)**๋ผ๋ ์ ํด์ง ํ์์ ๋จ์ผ ํ์ผ์ ํค-๊ฐ ํํ๋ก ์ ์ฅํฉ๋๋ค. ์์คํ
์ด ์ด ํ์ผ์ ๊ด๋ฆฌํ๋ฉฐ, ์ต์ ํ๋์ด ์์ด ๊ฐ๋จํ ๋ฐ์ดํฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ฑ๋ฅ: UserDefaults์ ์ ๋ฉ๊ฐ๋ฐ์ดํธ(MB)๊ฐ ๋๋ ํฐ ๋ฐ์ดํฐ(์ด๋ฏธ์ง, ๋์์ ๋ฑ)๋ฅผ ์ ์ฅํ๋ฉด, ์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ์ฑ์ ์ ๋ฐ์ ์ธ ๋ฐ์ ์๋๊ฐ ์ ํ๋ ์ ์์ต๋๋ค. FileManager๋ ๋ฐ์ดํฐ๋ฅผ ํ์ผ ๊ทธ๋๋ก ๋์คํฌ์ ์ ์ฅํ๋ฏ๋ก, ์์คํ
์ ์ฃผ๋ ๋ถ๋ด์ด ์ ์ต๋๋ค.
```
```
๐ง UserDefaults ์ฑ๋ฅ๊ณผ ๋ฐ์ดํฐ ํฌ๊ธฐ ๊ด๊ณ
1. ์ ์ฅ ๋ฐฉ์
UserDefaults๋ ๋ด๋ถ์ ์ผ๋ก plist(XML) ํ์ผ์ ์ง๋ ฌํ(serialize)ํด์ ์ ์ฅํฉ๋๋ค.
์ฑ ์คํ ์ ํด๋น plist ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ก๋ํด๋๊ณ , ์ฝ๊ธฐ/์ฐ๊ธฐ ์์
์ ํ ๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฒ๋ฆฌ โ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ผ์ ๋๊ธฐํ(synchronize)ํฉ๋๋ค.
2. ์ฑ๋ฅ ์ด์
์๊ณ ๋จ์ํ ๊ฐ(Bool, Int, String, Double, ์์ Array/Dictionary)์ ๊ฑฐ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ปค์ง๋ฉด(์์ญ KB~MB ์ด์):
์ฑ ์์ ์ UserDefaults ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํด์ผ ํด์ ๋ฐ์น ํ์ ์ง์ฐ
set() ํธ์ถ ํ ๋ด๋ถ plist ์ง๋ ฌํ๊ฐ ์ปค์ ธ์ ์ฐ๊ธฐ ์ฑ๋ฅ ์ ํ
iCloud Key-Value Store์ ๋๊ธฐํ ์ค์ธ ๊ฒฝ์ฐ, ๋ถํ์ํ๊ฒ ๋ง์ ๋คํธ์ํฌ ํธ๋ํฝ ๋ฐ์
์ฆ, UserDefaults๋ ๋๋ ๋ฐ์ดํฐ ์ ์ฅ์ ์ต์ ํ๋์ง ์์.
3. ๊ถ์ฅ ํฌ๊ธฐ
Apple ๋ฌธ์์์๋ ๋ช
ํํ "์ต๋ ํฌ๊ธฐ" ์ ํ์ ๋์ง ์์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ์ KB ์ ๋๊น์ง๋ง ์ฐ๋ ๊ฒ ์์ ํฉ๋๋ค.
์
๊ณ์์๋ ๋ณดํต ํ key-value ์์ ์์ญ KB ์ด์์ ํผํ๋ผ๋ ๊ฐ์ด๋๊ฐ ๋ง์ต๋๋ค.
4. ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด?
FileManager โ JSON, Data ํ์ผ๋ก ์ ์ฅ
CoreData / Realm โ ๊ตฌ์กฐํ๋ ๋๋ ๋ฐ์ดํฐ
```
<h1><center> iOS interview </center></h1>
###### tags: `๐ป ๋ฉด์ ์ง๋ฌธ`
###### date: `2025-09-06`
> [iOS interview](https://github.com/JeaSungLEE/iOSInterviewquestions)
# ๊ฐ์
> ๋ ๋ฒจ 1 ์ง๋ฌธ ๋ฆฌ์คํธ ์ ๋ฆฌํ๊ธฐ
### ํ์ค (๊ทธ๋ฆผ)
#### ์ด์ผ๊ธฐ ํ๋ฉด ์ข์ ๊ฒ
1. ๋ณต์กํ UI์์ Auto Layout ์ฑ๋ฅ์ด ๋๋ ค์ง ๋ ์ด๋ป๊ฒ ์ต์ ํํ์๊ฒ ์ต๋๊น?
- ์ธ์ ๋๋ ค์ง๊น? ์ด๋ ์ผ์ด์ค์ ๋๋ ค์ง๊น? => Auto Layout ๋๋ฌธ์ ๋๋ ค์ง๋? ๋ณต์กํ UI ๋ผ๋ฉด..? => Hitching..?
- StackView vs No StackView (Auto Layout) => Hidden ์ฒ๋ฆฌ์ StackView๊ฐ ๋ ๋น ๋ฅด๋ค. remakeConstraint ๋ณด๋จ StackView๋ฅผ ์ฌ์ฉํ ๋ฏ..?
- View update ์ํฉ๊ณผ ๊ด๋ จ์ด ์์๊น?
- (์์ง ๊ถ๊ธ์ )
- ๋ณต์กํ UI์์ Auto Layout ์ฑ๋ฅ์ด ๋๋ ค์ง๋ ์์ธ
- hidden๊ณผ ๋น๊ตํ๋ค๋ฉด,
- **์์ฑ ์์ฒด๊ฐ ๋น์ธ**๋ ์์์ ๋ถํฐ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์์
- ๋ณต์กํ UI -> ์์ฑ์ ๋ํ ์ค์ ์ค์ด๋ค๋ฉฐ ์ต์ ํ
- ์ฑ๋ฅ์ด ๋๋ ค์ง์ ์ฒด๊ฐํ๋ ์๊ฐ ์ํฉ?
- ๋์ ์ผ๋ก View๋ฅผ ๋ง๋ค๋ค๋ณด๋, ์ง์ ๋ค๊ฐ ๋ค์ ์ฌ์์ฑํ๋ ๊ฒฝ์ฐ ๊ด๋ฆฌ/์์ฑ ์ธก๋ฉด์์
- Constraint ๋์ ๋ณํ๊ฐ ๋ฒ๋ฒ
์์ด ์ฌํ๋ค -> StackView๋ก ๋ง๋๋ ์์
์ ํ๋ค
- AutoLayout ๊ตฌํ ๋ฐฉ์์ด ์ด๋ป๊ธธ๋ UI ๊ทธ๋ฆฌ๋๊ฒ ๋๋ ค์ง๋๊ฑธ๊น? O(N^3)
2. SwiftUI์์ **Delegate** ํจํด์ ๋์ฒดํ๋ ๋ฐฉ๋ฒ์?
- ๋ฐ์ดํฐ ์ ๋ฌ์ ์ด๋ป๊ฒ ํ๋๊ฐ? -> Combine์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ๋ณํ์ํค๋? / AsyncStream
- UIKit ๋ทฐ ๊ฐ ํต์ ์์ ์ฌ์ฉํ๋ Delegate -> View Binding, escaping closure, @Environment๋ก ์์ ๊ฐ์ฒด ์ ๋ฌ
19-2. deinit ๋ฉ์๋๋ ์ธ์ ํธ์ถ๋๋ฉฐ, ์ด๋ค ์ญํ ์ ํ๋์?
- deinit: ํ์ฌ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋์ง ์ ๋๋ง - print()
- (์์ง) ๋ญ ์ํฉ์ด ์์ฃผ ๋ง๊ฒ ์ง๋ง.. ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์๋ ํ๋ฉด ์ ๋๋ฉ์ด์
์ฒ๋ฆฌ๊ฐ ์์ฃผ ๋ง์๋ฐ Task ๋ฅผ property๋ก ์์ฑํ๊ณ deinit ๋ ๋ ์ ๊ฑฐ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค
- ๋คํธ์ํฌ ์ฟ ํค ์ ๊ฑฐ -> WebView DataSource
- <!-- ํค๋ณด๋ subscribe ํด์ -->
timer <- viewcontoller deinit
๊ทธ๋ฆผ ์๊ฐ: viewcontroller deinit -> timer๋ ์ฌ๋ผ์ง -> timer.invalidate deinit์์ ๋ถ๋ฅผ ํ์๊ฐ? / viewdiddisappear์์ timer invalidate ํธ์ถ
์ด์ค ์๊ฐ: timer๊ฐ viewController๋ฅผ ์๊ณ ์์ -> viewController๋ deinit์ด ๋ถ๋ฆผ
- TimerManager ๋ง๋ ์ ์๋๋ฐ deinit์ stop() ์๋ค์
ใด stop()์ ๋ถ๋ฅธ ์ด์ ๊ฐ ์์๊น์? ๋๋์ผ ํ๋๊น์? deinit ํ์ ํ์ด๋จธ๊ฐ ์ฃฝ์ผ๋ฉด..? ? ์ฃฝ์ด์ผ ํ๋๊น ..? ..?
------------------------------------------
12-2. ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ํตํด ์ป์ ์ ์๋ ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
9-2. ํ๋กํ ์ฝ ํ์ฅ(Protocol Extension)์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
#### ์์๋ณด๋ฉด ์ข์ ๊ฒ
5. Swift์์ ํด๋ก์ (Closure)๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
2-1. ํด๋ก์ ์ ์บก์ฒ(Capture) ๊ธฐ๋ฅ์ ๋ฌด์์ธ๊ฐ์?
2-2. @escaping ํด๋ก์ ์ non-escaping ํด๋ก์ ์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
19-1. Retain Cycle์ด ๋ฐ์ํ์ง ์๋๋ก ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ์?
28. ์ฌ๋ฌ ํ๋ฉด์์ ๋์ผํ ์๋ฆผ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํ ๋, ์ฑ๊ธํค ํจํด ๋์ ์ด๋ค ๋์์ธ ํจํด์ ๊ณ ๋ คํด๋ณผ ์ ์๋์?
28-1. Observer ํจํด๊ณผ NotificationCenter์ ๊ด๊ณ๋ ๋ฌด์์ธ๊ฐ์?
28-2. Dependency Injection์ ์ฌ์ฉํ๋ฉด ์ฑ๊ธํค ๋๋น ์ด๋ค ์ด์ ์ด ์๋์?
28-3. Protocol์ ํ์ฉํ ์์กด์ฑ ์ญ์ ์ ํ
์คํธ ๊ฐ๋ฅ์ฑ์ ์ด๋ป๊ฒ ํฅ์์ํค๋์?
27. SwiftUI์์ @State ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋๋ฐ ํ๋ฉด์ด ์
๋ฐ์ดํธ๋์ง ์๋๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๋ฅผ ์์ฌํด์ผ ํ๋์?
=> Thread๊ฐ MainThread์ธ์ง / ๋ณ์ ๊ฐ์ฒด๊ฐ class์ธ๊ฐ? (Identifiable ํ๊ฐ..?)
### ์์ง (์ด์ค)
1. Swift์์ ํ๋กํ ์ฝ(Protocol)์ด๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ ํ์ฉํ๋์?
1-1. ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Protocol-Oriented Programming)์ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ์? -> ์ค์ ๋ก ์ฒด๊ฐํ๋ ํ๋กํ ์ฝ์ ์ฅ์ ์ด ์๋์ง?
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
2. ๋ณต์กํ UI์์ Auto Layout ์ฑ๋ฅ์ด ๋๋ ค์ง ๋ ์ด๋ป๊ฒ ์ต์ ํํ์๊ฒ ์ต๋๊น?
<!-- - ์ ์ฝ์กฐ๊ฑด hugging vs compression -->
- setneedslayout vs layoutifneeded
3. Swift์์ ํด๋ก์ (Closure)๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
- ํธ๋ ์ผ๋ง ํด๋ก์ (Trailing Closure) ๋ฌธ๋ฒ์ ์ด๋ค ๊ฒฝ์ฐ์ ์ ์ฉํ๊ฐ์? ์ด๊ฒ ๋จธ์ผ?
4.ํ
์ด๋ธ๋ทฐ์ delegate ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๋๋ฒ๊น
ํ์๊ฒ ์ต๋๊น?
- layout์ด ๋ง์ง ์์ผ๋ฉด Cell์ ๋ฑ๋กํด๋ ๋ฐ์ํ์ง ์๋ ๋ฌธ์
- Delegate vs Closure vs Combine์ ์ ํํ๋ ๊ธฐ์ค์?
- 1:1 ํต์ ๊ณผ 1:N ํต์ ์์ ๊ฐ๊ฐ ์ด๋ค ํจํด์ด ์ ํฉํ๊ฐ์?
5. Swift์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
๊ณผ ์ปฌ๋ ์
(Collection) ํ์
์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์?
- ๊ฐ ํ์
(Value Type)๊ณผ ์ฐธ์กฐ ํ์
(Reference Type)์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
- ๊ตฌ์กฐ์ฒด(Struct)์ ํด๋์ค(Class)์ ์ฌ์ฉ ์๊ธฐ๋ ์ด๋ป๊ฒ ๊ตฌ๋ถํ๋์?
- ์ด๊ฑฐํ(Enum)์ ์์๊ฐ(Raw Value)๊ณผ ์ฐ๊ด๊ฐ(Associated Value)์ ๋ฌด์์ธ๊ฐ์?
7. Swift์์ ํ๋กํ ์ฝ(Protocol)์ด๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ ํ์ฉํ๋์?
- Swift๋ ์ ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Protocol-Oriented Programming)์ด๋ผ ํ๋์?
8. API ํธ์ถ์ด ์คํจํ์ ๋ ์ฌ์๋ ๋ก์ง์ ๊ตฌํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ์๊ฒ ์ต๋๊น?
9. ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์์ ๋๊ธฐ(Synchronous)์ ๋น๋๊ธฐ(Asynchronous)์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
------------