Static Dispatch & Dynamic Dispatch 1 - ehrldyd15/Swift_Skills GitHub Wiki
Dispatch๋ ์ด๋ ํ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ์ฌ ๊ทธ๊ฒ์ ์คํํ๋ค.
1. Static Dispatch & Dynamic Dispatch
Swift์์๋ Static Dispatch์ Dynamic Dispatch ๋๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
1-1. Static Dispatch (Direct Call)
Static Dispatch๋ '์ปดํ์ผํ์'์ ํธ์ถ๋ ํจ์๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ๋ฐํ์๋ ์คํํ๋ค.
์ปดํ์ผํ์์ ๊ฒฐ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ด์ ์ด ์์
1-2. Dynamic Dispatch
Dynamic Dispatch๋ '๋ฐํ์'์ ํธ์ถ๋ ํจ์๋ฅผ ๊ฒฐ์ ํ๋ค.
Swift์์๋ ํด๋์ค๋ง๋ค ํจ์ ํฌ์ธํฐ๋ค์ ๋ฐฐ์ด์ธ vTable(Virtual Dispatch Table)์ด๋ผ๋ ๊ฒ์ ์ ์งํ๋ค.
ํ์ ํด๋์ค๊ฐ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ์ด vTable ๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ํธ์ถํ ํจ์๋ฅผ ๊ฒฐ์ ํ๋ค.
์ด ๊ณผ์ ๋ค์ด "๋ฐํ์"์ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํด๋ฅผ ๋ณด๊ฒ ๋๋ค.
2. Swift์์์ Dispatch
2-1. Reference Type์์์ Dispatch
Reference Type์ Class๋ ์์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์๋ธ ํด๋์ค์์ ํจ์๋ฅผ ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์, Dynamic Dispatch๋ฅผ ์ฌ์ฉํ๋ค.
์์ฃผ ์ฌ์ฉํ๋ Class์ ๊ฒฝ์ฐ Dynamic Dispatch๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ ์ด์ ๋ '์ค๋ฒ๋ผ์ด๋ฉ'์ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ด๋ค.
class ClassA {
func callHello() {
print("Hello ClassA!")
}
}
class ClassB: ClassA { }
ClassA์์ callHello๋ผ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ
ClassB์์ ClassA๋ฅผ ์์๋ฐ๊ณ ์์ง๋ง callHello๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ง ์์์
let classA: ClassA = ClassB()
classA.callHello() //Hello ClassA!
๋ณ์๋ฅผ ClassA๋ก ์ง์ ํ๊ณ ClassB ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ ๋
callHello๋ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ๋ณ์ ํ์ ์ธ ClassA์ callHello๊ฐ ํธ์ถ๋๋ค.
class ClassA {
func callHello() {
print("Hello ClassA!")
}
}
class ClassB: ClassA {
override func callHello() {
print("Hello ClassB!")
}
}
ํ์ง๋ง ์์ฒ๋ผ ํ์ํด๋์ค์์ callHello๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค๋ฉด
let classA: ClassA = ClassB()
classA.callHello() //Hello ClassB!
๋ณ์ classA์ ํ์ ์ ClassA์ด์ง๋ง ClassB์ธ์คํด์ค๋ฅผ ์ ์บ์คํ ํด์ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์
ClassA์ callHello๊ฐ ์๋ ClassB์ callHello๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค.
์ด์ฒ๋ผ ์ปดํ์ผ๋ฌ๋ ํด๋์ค์ ๋ฉ์๋๊ฐ ํ์ํด๋์ค์์ ์ค๋ฒ๋ผ๋ฉ์ด ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ
์์ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํด์ผํ๋์ง ํ์ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํด์ผํ๋์ง ํ์ธํ๋ ์์ ์ '๋ฐํ์'์ ์คํํ๋ค.
๋ฐ๋ผ์ callHello๋ผ๋ ํจ์๋ ๊ฐ ํด๋์ค๋ง๋ค ๊ฐ์ง๊ณ ์๋ vTable์ด๋ ๊ฒ ๋ด๋ถ์ ํจ์ ํฌ์ธํฐ๋ก ๋๊ณ ,
์ค์ ๋ฐํฐ์ ์์ ์ ์ด๊ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ค ๋ฉ์๋๋ฅผ ํธ์ถํ ์ง ๊ฒฐ์ ํ๋ค.
์ฒซ๋ฒ์จฐ ์์ ์ฒ๋ผ callHello๋ฅผ ์๋ฌด๋ฐ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ง ์์ ์ ์์ง๋ง
๊ฒฐ๊ตญ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ ์ ์๋ค๋ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ ์ค์ ์ค๋ฒ๋ผ์ด๋ฉ ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์๊ณ ๋ฌด์กฐ๊ฑด vTable์ ์ฐธ์กฐํ์ฌ ์คํํ๋ค.
๋ชจ๋ ํ์ํด๋์ค์๋ ๊ณ ์ ํ ์์ํด๋์ค์ vTable ๋ณต์ฌ๋ณธ์ด ์กด์ฌํ๊ณ , ์ด vTable์๋ ์ด ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ชจ๋ ๋ฉ์๋๋ค์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋ค.
๋ง์ฝ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ง ์์ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ์์ํด๋์ค์ ํจ์ ํฌ์ธํฐ๊ฐ ์์๊ฒ์ด๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ํ์ํด๋์ค์ ๋ฉ์๋์ ํฌ์ธํฐ๊ฐ ์์๊ฒ์ด๋ค.
์ด์ฒ๋ผ, ๋ฐํ์ ๊ณผ์ ์ ํด๋นํด๋์ค์ vTable์์ ํจ์๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฝ๊ณ , ๊ทธ ์ฃผ์๋ก ์ ํ๋ฅผ ํ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํด๊ฐ ์๊ธฐ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฑ๋ฅ์ด ์๋์ค๋ Dynamic Dispatch๋ฅผ ์ฐ๋ ์ด์ ๋ OOP์์ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๊ธฐ ์ํ์ฌ Dynamic Dispatch๋ ํ์์๋ ๊ฒ์ด๋ค.
(์ด๋ฅผ ํด๊ฒฐํ๋ Static Dispatch๋ ๋ค์ ์ค๋ช .....)
2-2. Value Type์์์ Dispatch
Value Type์ธ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์์์ ํ ์ ์๋ค๋ ํน์ง ๋๋ฌธ์
์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ณ , ๋ฐ๋ผ์ Static Dispatch๋ฅผ ์ฌ์ฉํ๋ค
์์์ Dispatch๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ฐ๋ ๋๋ฌธ์ Dynamic Dispatch๋ก ๋์ํ๋๋ฐ,
Value Type์ ์์์ด ์ ๋๋๊น Static Dispatc๊ฐ ๊ฐ๋ฅํ ๊ฒ์
struct Human {
func callHello() {
print("Hello Human!")
}
}
๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ ์ด๋์ callHello๋ ํจ์๋ฅผ ๋ถ๋ฌ๋,
๋ Human์ด๋ ๊ตฌ์กฐ์ฒด ์์ ํจ์๊ฐ ๋ถ๋ฆด ๊ฒ์ด ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์
๋ฐํ์์ ๋ฐ๋ก ์ถ์ ํ ํ์๊ฐ ์์ด์ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ์ด ๋๋ค.
2-3. Protocol์์์ Dispatch
ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋์ ์ ์ธ๋ถ๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์,
์ค์ ์ฌ์ฉํ ๋ ํ๋กํ ์ฝ ํ์ ์ ์ฐธ์กฐ๋ก๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ,
ํด๋น ์ธ์คํด์ค ํ์ ์ ๋ง๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํด์ Dynamic Dispatch๋ฅผ ์ฌ์ฉํ๋ค.
protocol Human {
func description()
}
struct Teacher: Human {
func description() {
print("I'm a teacher")
}
}
struct Student: Human {
func description() {
print("I'm a student")
}
}
์์๊ฐ์ด Human์ด๋ ํ๋กํ ์ฝ์ด ์๊ณ ,
Teacher, Student๋ผ๋ ๊ตฌ์กฐ์ฒด์์ Human์ด๋ ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์์๋
let teacher: Teacher = .init()
teacher.description() //I'm a teacher
let student: Student = .init()
student.description() //I'm a student
ํด๋น ๊ตฌ์กฐ์ฒด์ ํํด์๋ง description์ด ๋ถ๋ฆด ๊ฒ์ด๊ธฐ ๋๋ฌธ์,
protocol ๋ํ Static Dispatch๋ก ์๋ํด๋ ๋ ๊ฒ ๊ฐ์ง๋ง
๋ง์ฝ ์๋์ ๊ฐ์ด Protocol์ ํ์ ์ผ๋ก ์ฌ์ฉํด์
ํด๋น ์ธ์คํด์ค๋ค์ description์ด๋ ๋ฉ์๋๋ฅผ ์คํํ ๊ฒฝ์ฐ์๋
var human: Human = Teacher()
human.description() //I'm a teacher
human = Student()
human.description() //I'm a student
์๊น Human์ด๋ ํด๋์ค ํ์ ์์ ์์ ํด๋์ค์ธ์ง ํ์ํด๋์ค์ธ์ง ํ์ธ ํ๋ ์์ ์ฒ๋ผ
ํ๋กํ ์ฝ ํ์ ์ผ๋ก ํด๋น ์ธ์คํด์ค ํ์ ์ ๋ง๋ ๋ฉ์๋๋ฅผ ํ์ธํ์ฌ ํธ์ถํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์,
Static Dispatch์ฒ๋ผ description์ด ํธ์ถ๋๋ ํ์ ์ ์ง์ ํด๋์ ์๊ฐ ์์ด์
์ด๋๋ Dynamic Dispatch๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฃ์ถ์ฒ https://babbab2.tistory.com/143