Optional
๐ฝ Optional๊ณผ Optional Unwrapping์ ๋ํ ๋ด์ฉ ์ ๋ฆฌ
+ Optional ํ์ ์ ๊ฐ์ == ์ฐ์ฐ์๋ก ๋น๊ตํ ์ ์๋ ์ด์ ?
Optional์ ๊ฐ ๋น๊ต๊ฐ ๊ฐ๋ฅํ ์ด์ ๋ Swift์์ Optional์ ๊ตฌํํ ๋, ==, =! ์ฐ์ฐ์๋ฅผ ๊ตฌํํด๋์๊ธฐ ๋๋ฌธ
Equatable ํ๋กํ ์ฝ์ ์ฑํํ์ฌ == ์ฐ์ฐ์๋ฅผ ๊ตฌํํ๋ ๋ด๋ถ ์ฝ๋๋ฅผ ํ์ธํ ์ ์์
extension Optional: Equatable where Wrapped: Equatable {
@_transparent
public static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l == r
case (nil, nil):
return true
default:
return false
}
}
}
์ถ์ฒ: https://github.com/apple/swift/blob/main/stdlib/public/core/Optional.swift
final ํค์๋
์ฝ๋ ๋ฆฌ๋ทฐ๋ก final ํค์๋์ ๋ํ ์ง๋ฌธ์ ๋ฐ์์
๊ฐ๋จํ๊ฒ ์ง๋ฌธ์ ๋ํ ์ฝ๋ฉํธ๋ฅผ ๋ฌ์์ง๋ง ์ง๋ฌธ์ ๋ฐ์ ๊น์ ์ ๋๋ก ์ ๋ฆฌํด๋ด ์๋ค!!
final ํค์๋๋? (๊ณต์๋ฌธ์ ๋ฒ์ญ)
final ํค์๋๋ฅผ ์ด์ฉํด ๋ฉ์๋, ํ๋กํผํฐ, ํน์ ์๋ธ์คํฌ๋ฆฝํธ๊ฐ ์ค๋ฒ๋ผ์ด๋ ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
ex) final var, final func, final class
final ํค์๋๋ฅผ ๋ถ์ธ method, property, subscript ๋ฅผ ์๋ธํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด, ์ปดํ์ผ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ํ, ํด๋์ค ์ ์ ์ ์์ final ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ํด๋์ค ์์ฒด๋ฅผ final๋ก ํ์ํ ์ ์์ต๋๋ค. ์๋ธํด๋์ค๋ฅผ ๋ง๋๋ ์๋๋ฅผ ํ๋ค๋ฉด ์ปดํ์ผ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ฝ
1. class ์์ final ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋ค๋ฅธ ํด๋์ค์์ ์์์ด ๋ถ๊ฐ๋ฅํด์ง
2. ํด๋์ค์ ์์ฑ(๋ฉ์๋, ํ๋กํผํฐ ๋ฑ)์ final์ ๋ถ์ฌ์ฃผ๋ฉด override(์ฌ์ ์)๊ฐ ๋ถ๊ฐ๋ฅํด์ง
์ฑ๋ฅ์ ์ด์
์์, ์ฌ์ ์ ๋ฐฉ์ง ์ด์ธ์ final ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ธ ์ด์ ๋ ์์!
์ปดํ์ผ๋ฌ๊ฐ ๋ฉ์๋์ ํธ์ถ ์์น๋ฅผ ํ์ ํ๋ ๋ฐฉ๋ฒ: Method Dispatch ๋ผ๋ ๋งค์ปค๋์ฆ์ ํตํด ํ๋จํจ
Method Dispatch
์ด๋ค ์ฐ์ฐ(operation)์ ์คํํด์ผํ๋์ง ๊ฒฐ์ ํ๋๋ก ๋๋ ๋ฉ์ปค๋์ฆ์ผ๋ก,
ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ์์ ํน์ ๋ฉ์๋ ํธ์ถ์ ๋ํ ์คํ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์๋ ์์น๋ฅผ CPU์ ์๋ฆฌ๋ ํ๋ก์ธ์ค
์ข ๋ฅ
1. Static Dispatch
์ปดํ์ผ ํ์์ ์ค์ ํธ์ถํ ํจ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์
์ฅ์ : ํจ์ ํธ์ถ์ด ๊ฐ๋จํ๊ณ ์๋๊ฐ ๋น ๋ฆ
๋จ์ : ์๋ธ ํด๋์ฑ(์์)์ด ๋ถ๊ฐ๋ฅํจ
์ฐธ๊ณ ) UIKit์ class๋ก ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ์ง๋ง, SwiftUI๋ struct๋ก ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ๋๋ฌธ์ Static Dispatch ๋ฐฉ์์ธ SwiftUI๊ฐ ์๋ ์ธก๋ฉด์์ ๋น ๋ฅผ ์ ๋ฐ์ ์์. (struct๋ ๊ฐ ํ์ ์ด๋ผ ์ ์ด์ ์์์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ)
2. Dynamic Dispatch
๋ฐํ์ ์์ ์ ์ด๋ค ๋ฉ์๋๊ฐ ์คํ๋ ์ง ๊ฒฐ์ ๋๋ ๊ฒ, ์ปดํ์ผ ์์ ์์๋ ์ด๋ค ํจ์๊ฐ ์คํ๋ ์ง ๋ชจ๋ฆ
์ฅ์ : ๋ฉ์๋๋ ํจ์ ํธ์ถ์ด ๋ฐํ์ ์ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์, ์คํ ์ค์ ๊ฐ์ฒด์ ์ค์ ํ์ ์ ๊ณ ๋ คํ ์ ์์. ์ด๋ ์คํ ์ค์ ๋ค์ํ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ํ ์ ์๋๋ก ํด์ฃผ๋ฉฐ ์ฝ๋๋ฅผ ์ ์ฐํ๊ณ ํ์ฅ๊ฐ๋ฅํ๊ฒ ํด์ค
๋จ์ : ํด๋์ค์ vTable์์์ ์ฃผ์ ๊ฐ์ ์ฐพ์ ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ Static Dispatch์ ๋นํด ๋๋ฆผ
final์ ์ด์ฉํ ์ฑ ์ฑ๋ฅ ํฅ์
final๋ฅผ ๋ถ์ด๋ฉด ํด๋์ค์ ๊ฒฝ์ฐ ์์์ด ๋ถ๊ฐ๋ฅํ๊ณ ๋ฉ์๋๋ ํ๋กํผํฐ์ ๋ถ์ ๊ฒฝ์ฐ์๋ ํ์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ Static Dispatch๋ก ์๋ํ๊ฒ ๋๋ค.
๋ช ์์ ์ผ๋ก ์์์ด๋ ์ฌ์ ์๋ฅผ ๋ฐฉ์งํ์ฌ Static Dispatch๋ก ์๋ํ ์ ์๋๋ก ๋ง๋ค์ด ์ฑ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๊ฒ!
[์ฐธ๊ณ ์๋ฃ]
'๐ ๊ธฐ๋ก > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 20231129 (1) | 2023.11.29 |
---|---|
[TIL] 20231128 (3) | 2023.11.29 |
[TIL] 20231124 (1) | 2023.11.25 |
[TIL] 20231123 (1) | 2023.11.23 |
[TIL] 20231121 (0) | 2023.11.21 |