<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 ![image](https://hackmd.io/_uploads/ryonv-t9lg.png) 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 ![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-09-06 09.59.41](https://hackmd.io/_uploads/BJFKwWt9le.png) ![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-09-06 09.59.16](https://hackmd.io/_uploads/Syy_w-F5ll.png) 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 ์‹คํ–‰ํ–ˆ์„ ๋•Œ... ![image](https://hackmd.io/_uploads/B13VYZF5ee.png) 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)์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”? ------------