๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS/iOS Programming

[iOS] ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI) ์ด๋ž€ ? Swift ์—์„œ ์ ์šฉํ•˜๊ธฐ, ์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ๋ฒ•์น™

์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋‹ค๋ฅธ add-on ํ”„๋ ˆ์ž„์›Œํฌ api๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ,

dynamic ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด embed ํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น api๊ฐ€ ์ •์ƒ ํ˜ธ์ถœ๋˜์ง€๋งŒ,

embed ํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„์ด ํ•„์š”ํ–ˆ๋‹ค.


์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection) ์ด๋ž€?

๋จผ์ €, ๋‘ ๋‹จ์–ด๋ฅผ ๋œฏ์–ด์„œ ๋ณด๋ฉด,

์˜์กด์„ฑ(Dependency) ์ด๋ž€ ? ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด ์‚ฌ์ด์— ์˜์กด ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 

์ฝ”๋“œ๋กœ ์ดํ•ดํ•ด๋ณด์ž.

 

์ฆ‰, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํด๋ž˜์Šค A๊ฐ€ B๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, '๊ฐ์ฒด๊ฐ€ B ๊ฐ์ฒด๋ฅผ ์˜์กดํ•œ๋‹ค๋ผ๊ณ  ํ•œ๋‹ค.

 

๋ฌด์Šจ ๋ง์ด๋ƒ 

์œ„ ์ฝ”๋“œ์˜ B ํด๋ž˜์Šค name ๋ณ€์ˆ˜๋ฅผ name2๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด,

๋ฐ”๋กœ A ํด๋ž˜์Šค์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ!!!!

๋”ฐ๋ผ์„œ B ํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด,  A์—์„œ๋„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค!

 

์ฆ‰, ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ˆ˜์ •๋˜๋ฉด, ๋‹ค๋ฅธ ๊ฐ์ฒด๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์™€ ๊ฐ™์ด A๊ฐ€ B๋ฅผ ๋ฉค๋ฒ„๋ณ€์ˆ˜ ๋ฐ ๋กœ์ปฌ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ B์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, B์— ๊ด€๋ จ๋œ ์–ด๋– ํ•œ ์—ฐ๊ด€๋œ ์ผ์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜์กดํ•œ๋‹ค๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ A ๊ฐ์ฒด๋Š” B ๊ฐ์ฒด์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

*์˜์กด ๊ด€๊ณ„์˜ ๋ฌธ์ œ์  :

  • A ๊ฐ์ฒด๋Š” B ๊ฐ์ฒด๋ฅผ ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, A๊ฐ์ฒด๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๋ณ€ํ•˜์ง€ ์•Š์•˜์Œ์—๋„ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ์ด ์•ˆ๋˜๋Š” ์ผ ๋ฐœ์ƒ
  • A์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค. ๋งŒ์•ฝ A๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ๋˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, B๋„ ๋Œ์–ด์™€์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒ

๊ทธ๋ ‡๋‹ด, ์ฃผ์ž…(Injection)์ด๋ž€?

์™ธ๋ถ€์—์„œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ฐ’์„ ์ฃผ์ž…ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋Š˜ ์“ฐ๋˜ ์ƒ์„ฑ์ž(init)๊ฐ€ ๋ฐ”๋กœ ์ด ๊ฐœ๋…์ด๋‹ค.

class Person {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

let person = Person(name: "์‚ผ์—ฐ")

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ!

 

๊ทธ๋Ÿผ, ๋‘ ๋‹จ์–ด๋ฅผ ํ•ฉ์นœ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)์ด๋ž€?

๊ธฐ์กด์˜ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๊ฟ”๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๋‘ ํด๋ž˜์Šค๊ฐ€ ์˜์กด์ ์ด์ง€ ์•Š์€ ๊ด€๊ณ„๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์™ธ๋ถ€์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์„œ ํด๋ž˜์Šค ์•ˆ์— ํ• ๋‹นํ•ด์ฃผ๋ฏ€๋กœ ์œ ์—ฐํ•œ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

 

์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜์ง€ ?


์˜์กด์„ฑ ์ฃผ์ž… ์ ์šฉํ•˜๊ธฐ - ์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ๋ฒ•์น™(DIP, Dependency Inversion Principle)

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด A์™€ Bํด๋ž˜์Šค์˜ ์˜์กด์„ฑ์„ ๋Š๊ณ , ์™ธ๋ถ€์—์„œ B๋ฅผ ๋งŒ๋“  ํ›„ ๋งŒ๋“  ๊ฒƒ์„ ๊ฐ€์ ธ์™€์„œ A๊ฐ€ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ”๊พธ์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, A๊ฐ์ฒด๊ฐ€ B๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€(๋งค๊ฐœ์ฒด)์„ ์˜์กดํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด ๋•Œ, ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ค๊ณ„์˜ ์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ๋ฒ•์น™(DIP)์— ๋”ฐ๋ผ,

๊ฐ์ฒด๋“ค ์ค‘๊ฐ„์— ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๋Š” ์ด ๋งค๊ฐœ์ฒด๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์•„๋‹Œ ์ถ”์ƒํ™”๋œ ๊ฒƒ์ด ๋œ๋‹ค.

*๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ (OOP)์˜ 5๋Œ€ ์›์น™(SOLID) ์ค‘ ํ•˜๋‚˜์ธ ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™(DIP: Dependency Inversion Principle) ์˜์กด ๊ด€๊ณ„ ๋ถ„๋ฆฌ : ์ถ”์ƒํ™”๋œ ๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜๋ฉด ์•ˆ๋˜๊ณ , ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์ถ”์ƒํ™”๋œ ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. 

์ฆ‰, ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋Š” ์ถ”์ƒํ™”๋œ ๊ฐ์ฒด(ํ”„๋กœํ† ์ฝœ)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

 

์ด ๋ฒ•์น™์€ ๊ธฐ์กด ์˜์กด๊ด€๊ณ„๋ฅผ ์—ญ์ „์‹œํ‚ด์œผ๋กœ์จ Aํด๋ž˜์Šค์™€ Bํด๋ž˜์Šค๊ฐ€ ๋…๋ฆฝ๋œ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

 

[๊ธฐ์กด ๊ตฌ์กฐ]

[์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ๋ฒ•์น™ ๊ตฌ์กฐ]

 

์ด๋ ‡๊ฒŒ ์˜์กด ๋ฐฉํ–ฅ์ด ์—ญ์ „๋˜์–ด ์ œ์–ด๊ฐ€ ๋ฐ˜์ „๋˜๋Š” ์ƒํ™ฉ์„ ์ œ์–ด์˜ ๋ฐ˜์ „(IoC, Inversion of Control)์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.


์ด ๋•Œ, ์ด ์ถ”์ƒํ™” ๋œ ๊ฒƒ(๋งค๊ฐœ์ฒด)์ด Swift์—์„œ๋Š” Protocol์ด ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด Protocol์„ ํ™œ์šฉํ•ด์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

 

์šฐ์„  Protocol์„ ํ™œ์šฉํ•ด์„œ ์ถ”์ƒ์ ์ธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

protocol DIInterface {
    var name: String{ get set }
}

 

Bํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑํ•œ DIInterface Protocol์„ ์ฑ„ํƒํ•˜์—ฌ ์ •์˜ํ•œ ๋ณ€์ˆ˜๋„ ํ• ๋‹นํ•ด์ค€๋‹ค.

class B: DIInterface {
    var name: String = "B๋ณ€์ˆ˜"
}

 

DI๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด  Aํด๋ž˜์Šค์˜ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋„๋ก ๊ตฌํ˜„ํ•ด๋ณด์ž.

Aํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ ์‹œ ์›ํ•˜๋Š” DIInterface ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

class A{
    // ํ”„๋กœํ† ์ฝœ๋กœ ํƒ€์ž…์œผ๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ
    var b: DIInterface

    //ํ”„๋กœํ† ์ฝœ์— ์„ ์–ธ๋œ ๋ชจ๋“  ํƒ€์ž…๋“ค์€ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.
    init(b: DIInterface) {
        self.b = b
    }
    
    func printName() {
        print(b.name)
    }
}

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, A๊ฐ์ฒด์™€ B๊ฐ์ฒด๋Š” ๋…๋ฆฝ์ ์ธ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

์ฆ‰, ๊ธฐ์กด์ฒ˜๋Ÿผ Bํด๋ž˜์Šค์˜ name ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์—†์–ด๋„ A๋ฅผ ์ˆ˜์ •ํ•ด์•ผ๋˜๋Š” ์ผ์€ ์—†๋‹ค.

 

์ฆ‰, ๊ธฐ์กด์—๋Š” ์˜์กด์„ฑ์„ ์ง์ ‘ ๋ชจ๋‘ ์ œ์–ดํ–ˆ๋‹ค๋ฉด ์ œ์–ด๊ถŒ์ด ์—ญ์ „๋˜์–ด Protocol์— ์ œ์–ด๊ถŒ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


๋˜ํ•œ, ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

A ํด๋ž˜์Šค์˜ ์ƒˆ๋กœ์šด b๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด DIInterface Protocol์„ ์ฑ„ํƒํ•œ ์ƒˆ๋กœ์šด C ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

DIInterface Protocol์„ ์ค€์ˆ˜ํ•˜๋Š” ์–ด๋–ค ํƒ€์ž…์ด๋ผ๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ด์ œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•  ๋•Œ DIInterface๊ฐ€ ์˜์กด์„ฑ ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์„ ์ฃผ์ž…ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

protocol DIInterface {
    var name: String{ get set }
}

class B: DIInterface {
    var name: String = "B๋ณ€์ˆ˜"
}

class C: DIInterface {
    var name: String = "C๋ณ€์ˆ˜"
}

class A{
    var b: DIInterface

    init(b: DIInterface) {
        self.b = b
    }
    
    func printName() {
        print(b.name)
    }
}

let moduledB = B()
let moduledC = C()

let devlopedA = A(b: moduledB)

protocol ํƒ€์ž…์œผ๋กœ ๋œจ๋‹ˆ๊นŒ ํ”„๋กœํ† ์ฝœ์„ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ์• ๋“ค์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰, ์ฃผ์ž…์€ ํ•˜๋˜ protocol ํƒ€์ž…์œผ๋กœ ์ฃผ์ž…์„ ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฝ”๋“œ๋กœ ํ™•์žฅํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ!!!

 

์œ„์˜ ์˜์กด์„ฑ ๋†’๋˜ Aํด๋ž˜์Šค์™€ Bํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ์ธํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

 

DIInterface(Protocol)์—๊ฒŒ ๋ชจ๋“  ๊ด€๊ณ„์„ค์ •์— ๊ด€ํ•œ ์ฑ…์ž„์„ ์œ„์ž„์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


์˜์กด์„ฑ ์ฃผ์ž…์˜ ์žฅ๋‹จ์ 

โœ”๏ธ ์žฅ์  

  1. ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„(Coupling)์„ ๋‚ฎ์ถฐ ์˜์กด์„ฑ ๊ฐ์†Œ
    • ๋ณ€๊ฒฝ์— ๋ฏผ๊ฐํ•˜์ง€ ์•Š์•„ ๊ธฐ์กด ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง ์ˆ˜์›” ๋ฐ ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์šฉ์ด
    • ๋ชจ๋“ˆ๋ณ„ ๋…๋ฆฝ์ ์ธ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
  2. ๋นŒ๋“œ์‹œ๊ฐ„ ๋‹จ์ถ•
    • ๊ฐ์ฒด๊ฐ€ ์˜์กด์„ฑ์„ ๋ฐ›๋Š” ์‹œ์ ์ด ์ปดํŒŒ์ผํƒ€์ž„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋Šฆ์ถฐ์ง„๋‹ค.
    • staticํ•œ class Dependency๊ฐ€ ๋Ÿฐํƒ€์ž„์˜ dynamicํ•œ object Dependency๋กœ ๋ณ€๊ฒฝ ๋˜์–ด ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•
  3.  ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ
    • ์ฃผ์ž…ํ•  ์˜์กด ๊ฐ์ฒด๋ฅผ Mock ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•œ ํ›„ ์ฃผ์ž…

โœ”๏ธ ๋‹จ์  

  1. ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง
    • ์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์„ ํ–‰ ์ž‘์—…์ด ํ•„์š”
    • ํ˜ธ์ถœ๋“ค์ด protocol๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์„œ ํ˜ธ์ถœ์„ ๋”ฐ๋ผ๊ฐ€๊ธฐ๊ฐ€ ํž˜๋“ค์–ด์ง
    • ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง

 

 

Interface Injection

๋‚ด๊ฐ€ ๊ณ ๋ฏผํ•˜๋‹ค ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Interface๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ถ”์ƒํ™” ๊ฐœ๋…์žˆ์Œ swift์—์„œ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ์ถ”์ƒํ™” ๋ฐฉ๋ฒ•์— protocol์ด ์žˆ์Œ

Interface๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์˜์กด์„ฑ์ด ์•ฝํ•ด์ ธ ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“ˆ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ์ด ์ค„์–ด๋“ ๋‹ค.

 


 

728x90
๋ฐ˜์‘ํ˜•