[Swift] Method Dispatch (1): Static Dispatch vs. Dynamic Dispatch
Method Dispatch
κΈμ μμνκΈ° μ μ, Method Dispatchκ° λ¬΄μμΈμ§μ λν΄ μ 리ν νμκ° μκ² λ€μ. 곡μμ μΈ λ¬Έμλ μλμ§λ§ ꡬκΈμ Method Dispatchμ μ μμ λν΄ κ²μμ ν΄λ³΄λ©΄,
π‘ how a program selects which instructions to execute when invoking a method
μ΄λ κ² ν λ¬Έμ₯μΌλ‘ λ μ μκ° κ°μ₯ μλ¨μ λμ΅λλ€. ν΄μν΄λ³΄λ©΄ μ΄λ€ λ©μλκ° νΈμΆλμμ λ, νλ‘κ·Έλ¨μ΄ μ΄λ€ λͺ λ Ήμ΄λ₯Ό μ€νν μ§ μ ννλ λ©μ»€λμ¦μ΄λΌκ³ ν©λλ€.
λ μ½κ² μ΄μΌκΈ°ν΄λ³΄λ©΄ λ©μλλ₯Ό μ€ννμ λ μ€μ λ‘ μ΄λ€ λ©μλκ° μ€νλλμ§ κ²°μ νλ κ²μ΄λΌκ³ λ΄λ λκ² μ£ ?
Static Dispatch
κ·ΈλΌ μ΄μ κ°λ¨ν μν©μ μκ°ν΄λ΄ μλ€.
struct Test {
func printTest() {
print("test")
}
}
let test = Test()
test.printTest()
μ΄λ κ² κ°λ¨ν ꡬ쑰체λ₯Ό νλ λ§λ€κ³ , λ©μλλ νλ λ§λ€μμ΅λλ€.
μ΄ κ΅¬μ‘°μ²΄μ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ λ©μλλ₯Ό μ€ννλ©΄ μ΄λ€ λ©μλκ° μ€νλ μ§λ λ무λ μλͺ νκ² μ£ ? Testμμ μλ printTestκ° μ€νλ©λλ€. κ·Έλ¦¬κ³ μ΄λ° κ²°μ μ μ»΄νμΌ νμμλ κ°λ₯νκ² μ£ .
μ°λ¦¬κ° μ΄ν΄λ³Έ μ μμ λ°λ₯΄λ©΄ Method Dispatchλ μ΄λ€ μ½λλ₯Ό μ€νν μ§ μ ννλ κ²μΈλ°, μ§κΈμ μ νμ§κ° νλλ°μ μμΌλκΉμ.
κ·Έλμ μ΄λ κ² μ»΄νμΌ νμμ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§ κ²°μ ν μ μλ κ²½μ°λ₯Ό Static DispatchλΌκ³ ν©λλ€. λ§ κ·Έλλ‘ λμ μΌλ‘ κ²°μ ν νμκ° μλ κ±°μ£ .
Static Dispatchλ κΈ°λ³Έμ μΌλ‘ λͺ¨λ κ°νμ μ μ μ©λ©λλ€. μ€νν λ©μλκ° νμ λͺ ννλκΉμ.
Dynamic Dispatch
κ·ΈλΌ μ νμ§κ° μ¬λ¬ κ°κ° λλ μν©μ΄ μμΌλ μ΄λ° κ°λ μ΄ λμμ ν λ° μ΄λ€ μν©μΌκΉμ?
class Test {
func printTest() {
print("test")
}
}
class TestA: Test {
override func printTest() {
print("testA")
}
}
class TestB: Test {
override func printTest() {
print("testB")
}
}
let tests = [Test(), TestA(), TestB()]
for test in tests {
test.printTest()
}
μ΄λ²μ κΈ°μ‘΄ Test ꡬ쑰체λ₯Ό ν΄λλ‘ λ§λ€κ³ μ΄λ₯Ό μμνλ λ ν΄λμ€ TestA, TestBλ₯Ό μ μΈνμ΅λλ€.
κ·Έλ¦¬κ³ μΈ κ°μ λ€λ₯Έ ν΄λμ€ μΈμ€ν΄μ€λ₯Ό λ°°μ΄μ λ£μ΄μ£Όκ³ λ°°μ΄μ μννλ©΄μ printTestλ₯Ό μ€νν΄μ£Όμμ΅λλ€.
μ¦, λ€νμ±μ λ§λ€μ΄μ€ κ²μ΄μ£ .
μ¬κΈ°μ tests λ°°μ΄μ νμ μ 무μμΌκΉμ?
TestAμ TestBλ Testλ₯Ό μμνκΈ° λλ¬Έμ μ μΌ μμ ν΄λμ€μΈ Testκ° λ°°μ΄μ μμ νμ μΌλ‘ μ μλ©λλ€.
for test in tests {
test.printTest()
}
κ·ΈλΌ μ΄ μ½λμμλ Test νμ μ λ©μλμΈ printTestκ° μΈ λ² μ€νλμ΄μ λ€μκ³Ό κ°μ κ²°κ³Όκ° λμ¨λ€κ³ μκ°ν μ μκ² μ£ ..!
test
test
test
νμ§λ§ μ°λ¦¬κ° κΈ°λνλ λλ‘, κ·Έλ¦¬κ³ μ μκ³ μλ λλ‘ μ€μ μΆλ ₯μ μ΄λ μ΅λλ€.
test
testA
testB
μ€μννΈλ λ°°μ΄ μμλ€μ νμ μ΄ TestμΈλ° μ΄λ»κ² μμ ν΄λμ€λ€μΈ TestAμ TestBλ₯Ό ꡬλΆν μ μμμκΉμ?
μ»΄νμΌ νμμλ μ μ μμ΅λλ€. λ°°μ΄ μμμ€ μ΄λ€ μμκ° μ΄λ€ νμ ν΄λμ€μ μΈμ€ν΄μ€μΈμ§ μ μ μμΌλκΉμ.. κ·Έλμ μ€μννΈλ μ΄ μΈμ€ν΄μ€μλ μ΄ λ©μλ ꡬνμ μ¨!λΌκ³ μ νμλ ν μ΄λΈμ μ¬μ©ν©λλ€.
μ΄ ν μ΄λΈμ vTable(virtual dispatch table) μ΄λΌκ³ νλλ°μ, vTableμ μ°Έμ‘°ν μ μλ ν¬μΈν°λ κ° μΈμ€ν΄μ€λ§λ€ νλμ© μ‘΄μ¬νκ³ , μ€μννΈλ λ°νμμ μ΄λ€ μΈμ€ν΄μ€μμ λ©μλκ° νΈμΆλλ©΄ μ΄ ν μ΄λΈμμ ν΄λΉ λ©μλλ₯Ό ꡬννκ³ μλ μ½λλ₯Ό μ°Ύμ μ€ννκ² λ©λλ€.
κ³Όμ μ κ°λ¨ν κ·Έλ €λ³ΌκΉμ?
ν΄λμ€ μΈμ€ν΄μ€μ λ©μλκ° μ€νλλ©΄, 1) λ¨Όμ μΈμ€ν΄μ€μ λ©ν νμ μ μ»κ³ , 2) ν΄λΉ νμ μ΄ κ°μ§ vtableμμ νΈμΆνκ³ μ νλ λ©μλμ μ£Όμλ₯Ό μ°Ύμ, 3) ν΄λΉ μ£Όμλ₯Ό μ°Ύμκ° λ©μλλ₯Ό μ€νν©λλ€.
μ΄λ κ² λ°νμμ λ©μλκ° νΈμΆλλ©΄ ν μ΄λΈμ νμΈν΄ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§ κ²°μ νλ κ²μ Dynamic DispatchλΌκ³ ν©λλ€.
λ€μ΄λλ―Ή λμ€ν¨μΉ λλΆμ μ°λ¦¬λ μ€λ² λΌμ΄λ©μ ν΅ν λ€νμ±μ μ½κ² λ§λ€ μ μμ§λ§, λ°λ©΄μ λͺ¨λ ν΄λμ€λ€μ λ€νμ±μ κ°μ§ μ μκΈ° λλ¬Έμ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνλ©΄ ν μ΄λΈμ ν λ²μ© λ€ νμΈν΄μΌ νλ μ€λ²ν€λκ° λ°μνκ²λ©λλ€.
μμ λ³Έ κ²μ²λΌ μμμ μ¬μ§κ° μμ΄ λμΌν μΈν°νμ΄μ€μ λν λ©μλκ° μ¬λ¬ κ° μ μλ μ μλ€λ©΄ Dynamic Dispatchκ° λ©λλ€. λ°λΌμ ν΄λμ€λ λ°λ‘ μ΅μ νλ₯Ό ν΄μ£Όμ§ μλλ€λ©΄ Dynamic Dispatchλ‘ λμν©λλ€. μ΅μ νμ λν μ΄μΌκΈ°λ λ€λ₯Έ ν¬μ€νΈμμ λ κΉκ² ν΄ λ³Όκ²μ!
μ 리
μ΄λ κ² κ°λ¨νκ² Satic Dispatchμ Dynamic Dispatchμ λν΄μ μ 리ν΄λ³΄μλλ°μ,
μ¬κΈ°μ λλ μλ¬Έ.. κ·ΈλΌ Protocolμ μ±νν΄μ λ©μλλ₯Ό ꡬνν ꡬ쑰체λ..?
μ΄λ° κ²½μ°λ κ°μ μΈν°νμ΄μ€μ λν΄ λ©μλ μ μκ° μ¬λ¬ μ’ λ₯μΌ μ μλλ° Dynamic Dispatchμ΄μ§ μμκΉμ? μ΄ μλ¬Έμ μ λ€μ ν¬μ€νΈμμ ν΄κ²°ν΄λ³΄λλ‘ νκ² μ΅λλ€!