class
μ μ μΈ μμ final
μ΄λΌλ ν€μλλ₯Ό λ³Έ μ μμΌμ κ°μ?
μ°μ final
ν€μλλ₯Ό μμ보기 μ μ, Swiftμμ νΉμ ν¨μ λλ λ³μλ₯Ό λΆλ¬μ€λ 맀컀λμ¦μΈ Dispatch μλν΄ μμλ³΄κ² μ΅λλ€.
Swiftμμ Dispatch λ°©λ²μ Type μλ°λΌ 2κ°μ§λ‘ λλκ² λ©λλ€. (Swiftμ Type μμ보기)
Static Dispatch λ Direct Call μ΄λΌκ³ λ λΆλ¦¬λ©°, μ»΄νμΌ νμμ νΈμΆλ ν¨μ λλ λ³μλ₯Ό κ²°μ νμ¬ λ°νμλ κ·Έλλ‘ μ€ννλ κ²μ
λλ€. μ»΄νμΌ νμμ κ²°μ μ΄ λλ―λ‘ λ°νμμμ μ±λ₯μ μ΄μ μ΄ μμ΅λλ€. Value TypeμΈ struct
, enum
λ±λ± μ Static Dispatch λ₯Ό νκ² λ©λλ€. (λΉμ°ν μμμ΄ λΆκ°λ₯νκΈ° λλ¬Έμ..!)
Dynamic Dispatch λ Indirect Call μ΄λΌκ³ λ λΆλ¦¬λ©°, λ°νμμ νΈμΆλ ν¨μ λλ λ³μλ₯Ό κ²°μ νλ κ²μ
λλ€. ν¨μ ν¬μΈν° λ°°μ΄μΈ vTable(Virtual Dispatch Table) μ΄λΌλ κ²μ μ μ§νλ©° νμ ν΄λμ€μμ νΈμΆν λ, vTable μ μ°Έμ‘°νμ¬ μ€νλ λμλ₯Ό κ²°μ ν©λλ€. (μνΌ ν΄λμ€μ μλ λ©μλλ₯Ό μ¬μ©ν μ§, μλΈ ν΄λμ€μ μλ λ©μλλ₯Ό μ¬μ©ν μ§!)
Reference Type μ μμμ κ°λ₯μ±μ΄ μκΈ° λλ¬Έμ Reference Type μΈ class
, actor
λ±λ±μμλ κΈ°λ³Έμ μΌλ‘ Dynamic Dispatch λ₯Ό νκ² λ©λλ€.
π protocol κ³Ό extension
protocol μμ μ μΈλ λ©μλλ₯Ό extension μ ν΅ν΄ λν΄νΈ λ©μλλ₯Ό ꡬνν κ²½μ°
protocol μ conform ν ν΄λμ€μμ λ©μλλ₯Ό ꡬνμ νμ μλ μκ³ μ νμ μλ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ μ΄λ° κ²½μ° Dynamic Dispatch λ₯Ό νκ² λ©λλ€.protocol μμ μ μΈλμ§ μκ³ , extension μ ν΅ν΄ ꡬνν κ²½μ°
protocol μ conform ν ν΄λμ€μμ ν΄λΉ λ©μλ ꡬνμ΄ νμμκΈ° λλ¬Έμ, ν΄λΉ ν΄λμ€μμ λ©μλ νΈμΆμ extension μ ꡬνν λ©μλλ₯Ό Static Dispatch νκ² λ©λλ€.Dispatch λ°©μμ ν΅ν μ±λ₯ ν₯μμ μ΄μ λ‘,
Swiftμμ protocol extension μ ν΅ν POP λ₯Ό μ§ν₯νλ νλμ μ΄μ λΌκ³ μκ°μ΄ λ©λλ€!
Advice: Use 'final' when you know the declaration does not need to be overridden - π Github apple/swift/OptimizationTips
Dynamic Dispatch μ λͺ¨λ κ³Όμ μ΄ λ°νμμ μΌμ΄λκΈ° λλ¬Έμ μ€λ²ν€λκ° λ°μνκ³ , μ±λ₯μ μν΄ λ₯Ό λ³Ό μ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ μ νμμλ νΉμ class
, method
, property
κ° μμλκ±°λ μ¬μ μλ κ°λ₯μ±μ΄ μλ€λ©΄, κ΅³μ΄ Dynamic Dispatch λ₯Ό νμ§ μκ³ Static Dispatch λ₯Ό ν μ μλ λ°©λ²μ μ 곡 νκ³ μμ΅λλ€.
final
keywordfinal
ν€μλλ ν΄λΉ class
, method
, property
κ° μμμ΄ λΆκ°λ₯νκ³ νμ ν΄λμ€μμ μ€λ²λΌμ΄λ©ν μ μλ€λ κ²μ λͺ
μνλ ν€μλ μ
λλ€.
μ¬μ© λ°©λ²μ κ°λ¨ν©λλ€!
class
κ° μμμ΄ λΆκ°λ₯νλ€λ κ²μ λͺ
μνκΈ° μν΄ μ¬μ©ν μ μμ΅λλ€.
final class exampleClass {
var
}
class derivedExampleClass : exampleClass { // π₯ ERROR
...
}
β final
ν€μλκ° λΆμ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μμ μμμ λ°μ μ μμ΅λλ€!
method
, property
κ° μλΈ ν΄λμ€μμ μ¬μ μ (μ€λ²λΌμ΄λ©) μ΄ λ μ μλ€λ κ²μ λͺ
μνκΈ° μν΄ μ¬μ©ν μ μμ΅λλ€.
class exampleClass {
final var exampleVar : [Int] = ...
final func exampleMethod() { ... }
}
class derivedExampleClass : exampleClass {
override var exampleVar : [Int] = ... // π₯ ERROR
override func exampleMethod() { ... } // π₯ ERROR
}
β final
ν€μλκ° λΆμ method
λ property
λ μλΈ ν΄λμ€μμ μ¬μ μ (μ€λ²λΌμ΄λ©) ν μ μμ΅λλ€!
κ²°κ³Όμ μΌλ‘ final
ν€μλλ₯Ό μ¬μ©νμλ, ν΄λΉ class
, method
, property
λ₯Ό μ¬μ©ν λλ λ μ΄μ Dynamic Dispatch κ° μλ Static Dispatch λ₯Ό ν΅ν΄ Directly Call μ νκΈ° λλ¬Έμ λ°νμ μ±λ₯ ν₯μμ κΈ°λν μ μμ΅λλ€!
μ€λμ Swiftμ Type μ λ°λ₯Έ Dispatch λ°©μκ³Ό final
ν€μλμ λν΄μ μμ보μμ΅λλ€.
μ°Έκ³ λ‘ μ λ class
λ₯Ό μμ±ν λλ νμ final
ν€μλλ₯Ό λΆμ΄κ³ , κ°νΉ μμμ΄ νμν κ²½μ°μλ§ final
ν€μλλ₯Ό μμ νλ μ΅κ΄μ κ°κ³ μμ΅λλ€!
Swift μ μλ λ°©μμ 곡λΆν΄λκ°λ©΄μ, κΈ°λ³Έ μλ£νλ€μ΄ struct λ‘ κ΅¬νλμ΄μλ μ΄μ
, Optional μ΄ Enum μΌλ‘ ꡬνλμ΄μλ μ΄μ
λ±μ μ‘°κΈμ© μ΄ν΄κ° λλ κ² κ°μ΅λλ€.
λν κΈ°μ‘΄μ class
μ€μ¬μ OOP μ Dynamic Dispatch λΌλ μ½μ μ 보μνκΈ° μνμ¬, protocol μ extension
μ μ¬μ©ν μμκ³Ό λ€μ€ μμκ³Ό κ°μ ν¨κ³Όλ₯Ό μ»μ μ μμκ³Ό λμμ Static Dispatch λ₯Ό νμ©ν μ μλλ‘ POP λ₯Ό μ§ν₯νλ μ νμ΄ κ΅μ₯ν λλνκ³ ν₯λ―Έλ‘κ² λκ»΄μ‘μ΅λλ€!
νλ¦° μ 보 λλ κΆκΈν μ μ΄ μλ€λ©΄ λκΈ λΆνλ립λλ€! μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€βΌοΈ