<h1><center> iOS interview 5 </center></h1>
###### tags: `๐ป ๋ฉด์ ์ง๋ฌธ`
###### date: `2025-09-2717:21:33.284Z`
> [iOS interview](https://github.com/JeaSungLEE/iOSInterviewquestions)
# iOS Liquid Glass ์ ์ฉํ๊ธฐ - Apple Session
## Liquid Glass์ ์ธ์ฌ์ดํธ์ ๋์์ธ ํ
๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ Liquid Glass๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์ด๋ ค์ ๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ํด์ผํ๋?
- ๋์์ธ ์ธ์ด๋ฅผ ๊ฐํธํ๋ ๊ฒ์ด ๋์์ด ๋ ๊น?
Liquid Glass
โ Regular vs Clear
Clear โ ์์์ด ๋ฐ๋ ์ด๋ก๋ background ์์์ด ๋ฐ๋์ง ์์ but, clear๋ ๋ ํฌ๋ช
์ฑ์ ๊ฐ๋๋ค.
- ์์์ ์งํํ ๋ ์ฐ๋ ๊ฒ์ ๋ ์ถ์ฒํ๋ค โ ์์
playback - (๋ฏธ๋ฆฌ๋ฃ๊ธฐ) / ์ปจํ
์ธ ์ฌ์์ ์ค๋ฒ๋ง
> Scroll Edge Effect
>
Soft Style โ iOS Safari์ ๊ฐ์ ๊ฒฝ์ฐ - ์ค์ฌ๋๊ฐ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค.
Hard Style
### Component
โ ์ด๋ป๊ฒ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก Liquid glass๋ฅผ ์ ์ฉํ๋ค๊ณ ๋ณผ ์ ์๋?
1. ํด ๋ฐ
1. concentric โ ๊ธฐ๊ธฐ Bazel ๊ธฐ๋ฐ Radius๋ฅผ ์ค์ ํ๋ค. - inner circle ์์ฑ
2. ์ปจํ
์ธ ๋ ์ด์ด์ ๋ค๋น๊ฒ์ด์
๋ ์ด์ด๊ฐ ๋์ด์ ธ ์๋ค. โ ์คํ๋ ค ์ฝํ
์ธ ์์ญ์ ๋ง์ด ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋ง๋ฆ
3. Optical Concentric์ ์ ์ฉํจ โ ์ค์ ์ํ์ ๋งค์นญํ์ง ์์
4. System Component๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๊ธฐ edge์ ๊ฐ๊น์์ง ์๋ก ๊ณก๋ฅ ์ด ์กฐ์ ๋จ
5. ์์ 44pt / ๋ฐ์ 48pt๋ฅผ ์ ์ฉํ๋ค.
2. ํญ ๋ฐ
1. ๊ฒ์ ๋ฒํผ์ด ๊ผญ ๋ฐ์ ์์ ํ์๋ ์๋ค.
2. accessories view โ ํญ ๋ฐ ์์ ์์นํ ๋ทฐ - ex) ์ ํ ๋ฎค์ง ํ๋ ์ด ๋ฐ
3. ์ํธ
1. ํ์
์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ ์์
์ ํ ์ ์๋ค.
2. Glass Material ์์ Glass Material์ ์ฐ๋ฉด ์ข์ง ์๋ค.
- https://medium.com/design-warp/skeuomorphism-design-we-learned-to-outgrow-8a24895a80d0
- https://www.google.com/url?sa=i&url=https%3A%2F%2Fmedium.com%2Fdesign-warp%2Fskeuomorphism-design-we-learned-to-outgrow-8a24895a80d0&psig=AOvVaw0ivdF2LcZVqeRRPIv1Djkc&ust=1759018988989000&source=images&cd=vfe&opi=89978449&ved=0CBUQjRxqFwoTCIiryMTW948DFQAAAAAdAAAAABAu
- https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.apple.com%2Fkr%2Fnewsroom%2F2025%2F06%2Fapple-introduces-a-delightful-and-elegant-new-software-design%2F&psig=AOvVaw281CwdmEs7vJLBnS2-bg7A&ust=1759019175997000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCOCc1JvX948DFQAAAAAdAAAAABAE
- https://en.zicos.com/mac/i32293944-How-to-turn-off-and-tone-down-the-iOS-26-features-you-hate-the-most.html
### App Icon
- Symbol์ ์ด๋ป๊ฒ ๋์ํ๋๋ฐ?
- Icon Composer โ ๋์์ด๋๋ค์ด ๋น ๋ฅด๊ฒ ์ปค์คํ
์ด ๊ฐ๋ฅํ ์์ด์ฝ์ ๋ง๋ค ์ ์๊ฒ ์ ๊ณตํจ
ใ
ใ
ใ
### ์ค๋ ํ ๊ฒ๊ณผ ์ข ๋ ๋ด์ผํ ๊ฒ
1. TaskLocal => ๋ฐ์ธ๋ฉ, TCA ๊ฐ๋
- ์ค์ ๋ก ์ฐ๋ ์ฌ๋ก...
### ๋ค์์ ํ ๊ฒ
1. โญ๏ธ **Shared Mutable State**
2. Task isolation
3. Race Condition ๋ฌธ์
4. Sendable
5. actor ๊ฐ๋
๋ง...
## Actor / AsyncStream
- AsyncStream
## Shared Mutable State
> ๊ณต์ ๊ฐ๋ณ ์ํ => ๊ณต์ ๊ฐ ๋๋ฉด์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ๋ฐ์ดํฐ
> '๊ณต์ ' -> ๋ฉ๋ชจ๋ฆฌ์ Data, Heap์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ฐ๋ ๋์์ ์ ๊ทผํ๋ ๊ฒ
> '์๊ณ ์์ญ' -> Thread๊ฐ ์ ๊ทผํ ์ ์๋ ๊ณตํต์ ์์ ์์ญ
> ##### ๊ณต์ ๊ฐ๋ณ ์ํ์ ๋ฐ์ดํฐ๋ Thread-safety ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
### Race Condition ๋ฌธ์
-> ์ฌ๋ฌ ์ค๋ ๋์์ ์ ๊ทผํ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฑฐ
#### Swift Code์ ๋ฐ์ํ ์ ์๋ ๊ฒ๋ค
1. ์ ์ญ ๋ณ์ / static var -> ๋ฉ๋ชจ๋ฆฌ ์ Data ์์ญ์์ ๊ณต์ ๊ฐ ์ผ์ด๋๋ค.
2. class ํ์
์ var -> ๋ฉ๋ชจ๋ฆฌ์ Heap์์ ๊ณต์ ๊ฐ ์ผ์ด๋๋ค.
3. โญ๏ธclosure / Task์ ์บก์ณ๋ ๋ณ์
``` swift
// 3๋ฒ Closure / Task์ ์บก์ณ๋ ๋ณ์
func test() {
var name: String = "ํ
์คํธ"
Task {
name = "Liquid glass"
}
Task {
name = "Kakao"
}
Task { [name] in // ์ด๋ฌ๋ฉด ๊ด์ฐฎ์๊ฑธ?
var newName = name
newName = "Apple"
}
}
```
-> (์์ง) ๊ทธ๋์ ์ด๋ฐ ๊ฒฝ์ฐ์ actor๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๊ฑด๊ฐ์? => Yes but, it's not only solution.
-> (์์ง) ํน์ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ Swift6์์๋ ์ปดํ์ผ์์ ์ก์์ฃผ๋์..? ์์ ์ค ๊ทธ๋์? ใ
ใ
ใ
#### ๊ฒฐ๋ก
1. Swift Concurrency๋ ๋์์ฑ ๋ฌธ์ (Race Condition)์ ์ปดํ์ผ ๋จ๊ณ์์ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌํ๋๋ก ํด์ค
2. ์๋ก์ด ์ฐธ์กฐ ํ์
์ ๋์
ํด ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํจ
## Task isolation
> Task isolation์ ์ ์ง์ผ์ผํ๋? Race condition์ด ๋ฐ์ํ์ง ์๋ ์์ ํ ์์
์ฒ๋ฆฌ
#### ์ ์ ์กฐ๊ฑด
1. ์๋ก ๋ค๋ฅธ ์์
๊ฐ์ Share Mutable State๋ฅผ ๋ฐฉ์งํจ
(์์ง)
๋ค ์ ๋ ์ฐพ๋ค๋ณด๋ **actor isolation** ์ธ๊ธ์ด ๋ง๋ค์
๊ทธ๋์ ์ด ๊ฐ๋
์ด ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋ณด๊ณ ์์์ด์
Task isolation์ Task ๋ด๋ถ ์ ์๋ ๊ฐ์ ํด๋น Task๋ง ์ ๊ทผ? ๋ค๋ฅธ Task์ ๊ณต์ ๋์ง ์์
๊ทผ๋ฐ ํด๋ก์ ์บก์ฒ, ์ ์ญ ๋ณ์, ์ฐธ์กฐ ํ์
๋ฑ์ ๊ณต์ ํ๋ ์๊ฐ
isolation์ด ๊นจ์ง๋ฉด์ race condition ๊ฐ๋ฅ
=> ๊ฐ๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ๋ฐ์ํ๋ Task ์์
๊ฐ์ ์์ ํ ํ์
์ ๋ฌ์ด Task isolation์ ์ง์ผ์ค ์ ์๋ค.
Actor isolation์ ๊ณต์ ํด์ผ ํ๋ ์ํ๊ฐ ์๋ค๋ฉด, ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ํจ
๊ทธ๋์ ๊ณต์ ํ๊ณ ์ถ์๊ฑฐ ์์? Task๋ ์๋ isolationํด์ผ ํ๋๋ฐ
Actor๋ก ํด์ ์จ๋ผ ์ด๋ฐ ๋๋ ๊ฐ์๋ฐ์?
๊ทธ๋ผ Actor๊ฐ ์์์ ๊ณต์ ์ํ ๊ด๋ฆฌํด์ค ํ ๋ฒ์ ํ ์ค๋ ๋๋ง ์ ๊ทผํ๊ฒ ํ ๊ฒ.. ์ด๋ฐ๊ฑฐ?
nonisolated? (ํํ) @MainActor ์ฒ๋ฆฌ๊ฐ ๋์ด ์๊ฑฐ๋ Actor ๋ฑ์ผ๋ก isolation ๋์ด ์์ผ๋ฉด
์ผ๋ถ๋ฌ ๊ฒฉ๋ฆฌ๋ฅผ ๊นจ๋ฒ๋ฆฌ๋๊ฒ ๊ฐ์์... -> ์์ง์ด ์ฐ๊ธด ํจ.. ใ
ใ
=> (ํ์ค) ์ด๊ฑด actor isolated๋ฅผ ๋ณด๊ณ ์ด์ผ๊ธฐ ํ๋๊ฒ ์ข๊ฒ ๋ค.
```
non
๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋๋ฆฐ๋ค
@concurrent
func a() { }
```
Task isolation ๊ฒฐ๊ตญ -> actor ํด๋ผ ์ด ๊ฐ๋
์๋๊ฐ์?
### Task isolation '๋ฒ์น'์ ๊นจ๋ ๊ฒฝ์ฐ
- 'race condition' ์ ์ผ์ด๋๋๋ก ์ปดํ์ผ๋ฌ๊ฐ ๋ณด์ฅ?
- ๊ทผ๋ฐ
```swift
struct Hello {
var value = 0
mutating func increment() {
value += 1
}
}
// Closure, Task Capture๋ ๋ณ์ ์๋ฐฐ
func breakTaskIsolated() {
var hello = Hello()
Task { // ์ฌ๊ธฐ์ hello ๋ณ์๋ heap์ ์บก์ณ๋จ
hello.increment()
}
sleep(3)
print(hello.value) // 1 - ์ฅ๊ฐํ๋ฉด?
}
```
-> ์ค๋ฅ๋ ์๋ธ
์ฌ์ค Task isolation์ ๊ทธ๋ฅ ์ด๋ค ๊ฐ๋
๊ฐ์ ์์ค์ด๊ตฐ์?
๊นจ๋ฉด ๊นจ์ง๊ณ ๋ณ์ ์๋ชป ์ฐธ์กฐํด์ค๋ฉด ๊ทธ๋ฅ ๊ฐ๋ฐ์ ์๋ชป์ผ๋ก ๊นจ์ง๊ณ
> "Task isolation์ โ๊ณต์ ํ์ง ์๋ ๊ฒ ์์นโ์ด๋ผ๋ Swift Concurrency์ ๊ธฐ๋ณธ ์ฒ ํ์ ์ฝ๋ ๋ ๋ฒจ์์ ๊ตฌํํ ๊ท์น"
ใ
ใ
ใ
๊ทธ๋์ Swift6 ์ฌ๋ฆฌ๋ ค๋ฉด ๋งํ๋.. ๊ทผ๋ฐ ๊ทธ๊ฒ ๊ฐ๋ฅํ๊ฐ..
## Sendable
> ์ฌ๋ฌ ์ฐ๋ ๋์์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณด์ฅํ๋ Protocol
Swift์์ ์์ ํจ์ด ๋ณด์ฅ๋ ํ์
์ ๊ทธ๋ฅ ์ฑํ๋ง ํด๋ ๋๋ค.
##### Sendable์ Marker Protocol
- ์๊ตฌ์ฌํญ์ด ๋ฐ๋ก ์๋ ํ๋กํ ์ฝ / ๋จ์ํ ๋์์ฑ ์์ญ ๊ฐ ์ ๋ฌ์ด ์์ ํ ํ์
์ด๋ผ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ค
```swift
// marker protocol
public protocol Sendable {
}
// Lint: Stored property 'name' of 'Sendable'-conforming class 'Test' is mutable; this is an error in the Swift 6 language mode
final class Test: Sendable {
var name: String // final ํด์ ์๋ ์ค๋ฅ๋ ๊ฒฝ๊ณ ์์๋๋ฐ, ๋ณ์ ์๊ธฐ๋ฉด์ ๋ฆฐํธ๋ธ
static var greeting: String = "hi" // ์ด๊ฑด ์ค๋ฅ ์๋ธ
}
```
- ํ๋กํ ์ฝ๋ก์๋ ์๋ฌด ๊ตฌํ ์๊ตฌ์ฌํญ์ด ์์ผ๋,
- ์ปดํ์ผ๋ฌ๊ฐ ํน๋ณํ ํด์ํด์ ๊ฒ์ฆ์ ์ํํจ
(sendableํ ์น๊ตฌ๋ค) - ์ปดํ์ผ๋ฌ๊ฐ ์ Sendable ํ๊ตฌ๋ง... ํ๊ณ ๋์ด๊ฐ๋ ์น๊ตฌ๋ค
- ๊ฐ ํ์
- Immutable class - var ์๋ ๊ฐ ํ์
์ธ ์ ์ฅ ํ๋กํผํฐ + final๋ก ์์ ๋ถ๊ฐ (class ๋ด๋ถ์ static ๋ณ์๊ฐ ์์ผ๋ฉด..? ์๊ด ์๋? => static ๋ณ์ ๋ฐ๋ก Sendable ํ์ง ์์)
- class์์ sendable์ ์ฑํํ๋ฉด ๋ด๋ถ ์ ์ฅํ๋กํผํฐ๋ sendable ํด์ผํจ
- NSLock, Semaphore๋ก class ๋ด๋ถ์์ ๋๊ธฐํ์ฒ๋ฆฌ -> ์ด๊ฑธ ์ปดํ์ผ๋ฌ๊ฐ ํ์
์ ํ๋?
- Actor ํ์
- Functions and closures (by marking them with @Sendable)
(ํํ)
- Sendable์ Thread Safeํ ํ์
์ผ๋ก ๋ง๋๋ ๊ฑด ์๋์ง๋ง, ์ ์ด์ Sendable์ ์ฑํํ ๊ฐ์ฒด๋ ์์ ํ๋ค๊ณ ์ธ์ํ๋ค?
ใ
ใ
ใ
ใ
ใ
ใ
ใ
#### ์ ๋ค๋ฆญ ํ์
์์ Sendable
```swift
struct Pair<T, U> { }
extension Pair: Sendable where T: Sendable, U: Sendable { }
```
# ์ ๊น Continuation
Continuation์ ํ์ง๋ง ๋ถ์์ ํ๋ค..?
someLegacyAPI error์ ๋ํ ๋์์ด ์๋ค?
๊ทผ๋ฐ ์์ ๋ฐ๊พธ๋๊ฒ ์ฝ์ง ์์ผ๋.. ์ด๋ฐ๊ฑธ ์ ๊ณตํด์ค๊ฒ ์๋๊น...
ใ
ใ
ใ
ใ
ใ
์ฐ๋ ๊ธฐ์ ์ฐ๋ ๊ธฐ.. ๊ณต๊ฐํฉ๋๋ค
```swift
func fetchData() async -> String {
await withCheckedContinuation { continuation in
someLegacyAPI { result in
continuation.resume(returning: result)
}
}
}
func fetchData() async throws -> String {
try await withCheckedThrowingContinuation { continuation in
someLegacyAPI { result, error in
if let error = error {
continuation.resume(throwing: error)
} else {
continuation.resume(returning: result!)
}
}
}
}
```
(์ฐธ๊ณ )
๋ฌธ๋ ๊ถ๊ธํด์ ๊ฐ์ ธ์๋๋ฐ ํํธ2์ ๋์ค๊ธด ํ๋ค์!
(2) Part - 2์์ ์ฃผ๋ก ๋ค๋ฃจ๋ ๋ด์ฉ (๋ณธ ๊ฐ์) โญ๏ธโญ๏ธโญ
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ Computer Science ๊ด์ ์์ ์ดํดํ๊ธฐ (์ฐ๋ ๋/๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ดํด)
Data Isolation / Task Isolation / Actor Isolation (๊ฒฉ๋ฆฌ ๊ฐ๋
์ ์ดํด)
Task Isolation๊ณผ Shared Mutable State (๊ณต์ ๋ฐ์ดํฐ)
Sendable ํ์
(์ฐ๋ ๋ ๊ฐ์ ๊ณต์ ํด๋ ์์ ํ ๋ฐ์ดํฐ ํ์
)
Actor ์์ ์ ๋ณต (1) ๊ฒฉ๋ฆฌ/๋น๊ฒฉ๋ฆฌ (2) ์์์ฑ (3) ์ฌ์ง์
(4) ์กํฐ ํํ
(5) ๋ฉ์ธ์กํฐ ๋ธ๋กํน (6) ์กํฐ ๊ฒฝํฉ ํด๊ฒฐํ๊ธฐ
๊ธ๋ก๋ฒ ์กํฐ์ ๋ฉ์ธ์กํฐ
์กํฐ๋ก ์บ์(cache) ๊ตฌํํ๊ธฐ ํ๋ก์ ํธ ์์
AsyncSequence (๋น๋๊ธฐ ์ํ์ค)์ AsyncStream (๋น๋๊ธฐ ์คํธ๋ฆผ)
์น์์ผ์ AsyncStream ์ ์ฉํ๊ธฐ ํ๋ก์ ํธ ์์
Non-Sendable ํ์
์ ์ ์ก (sending)
ํจ์(ํด๋ก์ )์ ๊ฒฉ๋ฆฌ ๊ด๋ จ ๋ฌธ์ - isolated (Actor)? = #isolation / @isolated(any)
Custom ์คํ์(Executor)์ ๊ตฌํ / Task ์คํ์(Executor) ์ ํธ๋
(์ฐธ๊ณ ) consume / consuming ํค์๋
์กํฐ์ ๋ฌธ๋ฒ ๊ท์น ์ฌํ - ์์ฑ์ / ์๋ฉธ์ / ํ๋กํ ์ฝ / ์์ / ํ์ฅ
Swift5 ์์ Swift6๋ก ๋์ด๊ฐ๊ธฐ
Instruments ์ฌ์ฉํด์ ํ๋ก์ ํธ ๋ถ์ํ๊ธฐ
### ๋ค์์ฃผ
- Actor
์ผ๋จ ๊ฐ์ก๊ณ ๊ณต๋ถ๋ฅผ ๋นก์ธ๊ฐ ํด์ฌ๊ฒ์ ์ฃ์กํด์ฅ
๊ฐ์ ๊ฐ์ ๊ธด๊ธ๊ธด๊ธ
(์ ๋ด์ฃผ ์ธ๋ถ ๋ฏธํ
๋ง 4๊ฐ๋ผ ํ .. ํ .. ๋ค.. ํค,,) ์ค!
์ค ์กฐ์์ ๊ทธ๋ฆฌ๊ณ ์ ํฌ ์ถ์์๋ ๋นก์ธ๊ฒ ํด๋ด์
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
์๋น ์ง ์์
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
์ํผ ๋ด์ฃผ ์กํฐ ํด์ค๊ฒ ์ด์
- ์ถ์ ๋ ๋ญ ํ ์ง?
Concurrency ?
Combine ?
์ ๋ ํ์ฌ์์ AI ํ๋๊ฒ ์์ด์ ๊ทธ๊ฒ๋ ๋ด์ผํด์ RAG(๋๊ทธ)+๋ญ์ฒด์ธ ์ด์ฉ๊ตฌ.. ํท
์ํผ ๋ญ๋ณผ์ง ์๊ฐํด๋ณผ๊ฒ์
๊ตฟ๊ตฟ!! ๋์ง๊ธฐ
> ์ด๋ฒ์ฃผ์ ๋์ง๊ณ ํฌํ ํ ๊ฒฐ์
> 1. Coordinator?
> 2. ๋์์ธ ํจํด ? ํ๋ ๋ต
> 3. Unit Test๋ฅผ ๊ณต๋ถํ๊ณ ์ ์ฉํ๊ธฐ
> 4. ํ ์ค ๊ณผ์ ํผ๋๋ฐฑํ๊ธฐ
https://github.com/DeveloperAcademy-POSTECH/2024-MacC-A10-Akdong-Cookiez
-> ์ด๊ฑฐ Coordinator ์ด๋ฆ์ ๋ฌด์ธ๊ฐ๊ฐ ํฌํจ๋์ด์๋ ํ์
-> ์ด๊ฑฐ UnitTest๋ ์ฐ๋ ๋ค์ด๊ฐ ์์ ใ
ใ
ํใ
ใ
ใ
ใ
ํจ์ํ.. ํํ
๋๋ฌด ๋ง์์