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