[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์ด์ง ์์๊น์? ์ด ์๋ฌธ์ ์ ๋ค์ ํฌ์คํธ์์ ํด๊ฒฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
'๐ ์์ด-์ค-์์ค > ๐ค ์ค์ํํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Method Dispatch (3): Dynamic Dispatch๋ฅผ ์ค์ฌ๋ณด์ (0) | 2021.12.26 |
---|---|
[Swift] Method Dispatch (2): ๋ ๋ณต์กํ ์ํฉ์ Method Dispatch (0) | 2021.12.26 |
[๋ฉด์ ์ง๋ฌธ] ์ค์ํํธ(Swift) 75๋ฌธ 75๋ต (2) | 2021.12.24 |
[Swift] GCD(Grand Central Dispatch) - Dispatch Queue (2) | 2021.10.25 |
[Swift] ์ค์ํํธ์ ๊ณ ์ฐจํจ์๋ค(High Order Functions) (0) | 2021.10.10 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote