Swift μμλ λ€λ₯Έ μΈμ΄μ λΉμ·νκ² ν΄λμ€λ₯Ό μμν΄ μλΈν΄λμ€λ₯Ό ꡬνν μ μμ΄μ. λ§μ½, ν΄λΉ ν΄λμ€κ° λμ΄μ μμμ΄ νμμκ±°λ νΉμ μμ±μ μ€λ²λΌμ΄λνμ§ μμμΌ νλ€λ©΄ μ΄λ»κ² ν΄μΌν κΉμ?! π
final ν€μλλ₯Ό ν΅ν΄ λ μ΄μ μμμ΄ νμμμμ λͺ μν μ μκ³ , μ€λ²λΌμ΄λ ν μ μ»΄νμΌ μλ¬λ₯Ό λ°μμν¬ μ μμ΅λλ€! λͺ μμ μΌλ‘ μμλμ§ μλ κ² μΈμ λ°νμ μ±λ₯μ΄ ν₯μλλ€λ μ₯μ λ μλ€κ³ ν΄μ.
π Swift λ¬Έμμμλ λ€μκ³Ό κ°μ΄ μ€λͺ νκ³ μμ΄μ!
μλΈν΄λμ€μμ νΉμ method, property, subscript κ° μ€λ²λΌμ΄λ λμ§ μλλ‘ νκΈ°μν΄μ final ν€μλλ₯Ό μ¬μ©νλ€. final ν€μλλ₯Ό λΆμΈ method, property, subscript λ₯Ό μλΈν΄λμ€μμ μ€λ²λΌμ΄λνλ©΄, μ»΄νμΌνμ μλ¬κ° λ°μνλ€. class μ 체μ λν΄ final ν€μλλ₯Ό λΆμ΄λ κ²½μ°, μλΈν΄λμ€λ₯Ό λ§λλ €κ³ νλ©΄ μ»΄νμΌνμ μλ¬κ° λ°μνλ€.
final class, final var, final func, final class func, and final subscript
π[Swift Docs] Inheritance - Preventing Overrides
π€ final ν€μλλ‘ λ°νμ μ±λ₯ ν₯μ?
final ν€μλλ‘ μΈν μ±λ₯ λΉκ΅λ₯Ό μν΄μλ Dynamic Dispatch, Static Dispatch μ λν΄ λ¨Όμ μμμΌν©λλ€ π.. Dispatch λ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§ κ²°μ νκ³ , μ€ννλ 맀컀λμ¦μ΄μμ. λνμ μΈ λκ°μ§ Static Dispatch, Dynamic Dispatchμ λν΄ μ 리ν΄λ³Όκ²μ.
βοΈ Static Dispatch (Direct Call)
μ»΄νμΌ νμμ μ€μ νΈμΆν ν¨μλ₯Ό κ²°μ νλ λ°©μμΌλ‘, ν¨μ νΈμΆμ΄ κ°λ¨νκ³ μλκ° λΉ λ¦ λλ€. Value type μΈ κ΅¬μ‘°μ²΄μ μ΄κ±°νμ κΈ°λ³Έμ μΌλ‘ μ€λ²λΌμ΄λ©λμ§ μμΌλ―λ‘ Static Dispatch λ₯Ό μ΄μ©ν©λλ€.
βοΈ Dynamic Dispatch (Indirect Call)
λ°νμμ νΈμΆλ ν¨μλ₯Ό κ²°μ νλ λ°©μμΌλ‘, ν¨μ νΈμΆ κ³Όμ μμ μ€μ μ°Έμ‘°ν μμλ₯Ό μ°Ύλ κ³Όμ μ΄ μμ΄ Static μ λΉν΄ μλκ° λ립λλ€. ν΄λμ€λ§λ€ ν¨μ ν¬μΈν°λ€μ λ°°μ΄μΈ vtable(Virtual Dispatch Table) μ κ°κ³ μμΌλ©°, μ΄λ₯Ό μ°Έμ‘°ν΄ μ€μ νΈμΆν ν¨μλ₯Ό κ²°μ ν©λλ€.
βοΈ ν΄λμ€λ₯Ό μμν΄μ λ©μλλ₯Ό μ€λ²λΌμ΄λνλ€λ©΄, μ»΄νμΌλ¬κ° μ€μ νΈμΆν λ©μλλ₯Ό μ΄λ»κ² κ²°μ νκ² λ κΉμ?
Swift μ ν΄λμ€λ μΌλ°μ μΌλ‘ Dynamic Dispatch λ°©μμ μ΄μ©ν΄ λ°νμμ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§ κ²°μ νλ€κ³ ν΄μ.
βοΈ λ§μ½ μ€λ²λΌμ΄λκ° νμνλ€λ©΄ μμ κ³Όμ μ΄ νμνκ² μ§λ§, μ€λ²λΌμ΄λκ° νμμλ λ©μλλΌλ©΄!?
final ν€μλλ₯Ό λΆμ¬ Dynamic Dispatch κ³Όμ μ΄ νμ μμμ λͺ μν΄μ€ μ μκ² μ£ ! ν΄λΉ ν€μλλ₯Ό λΆμΈ λ©μλλ Static Dispatch λ₯Ό μ¬μ©ν΄ μ»΄νμΌ νμμ νΈμΆν λ©μλλ₯Ό μ§μ ν¨μΌλ‘ λ°νμ μ±λ₯μ΄ ν₯μλλ κ²μ΄μμ.