ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

 

 

๋””์ž์ธ ์›์น™ - ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์€ ๋ถ„๋ฆฌ, ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ ์บก์Šํ™” ํ•œ๋‹ค.

 

 

๊ตฌํ˜„ ์œ„์ฃผ๊ฐ€ ์•„๋‹Œ, ์ธํ„ฐํŽ˜์ด์Šค ์œ„์ฃผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋” ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

 

 

์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„ํ•ด์•ผํ•  ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ 

ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฑ„ํƒํ•˜๋Š” class์— ๊ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค

 

 

e.g.

์ƒˆ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค

์ƒˆ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ ๊ฐœ์ง“์„ ํ•˜๋Š”๋ฐ ๋‚ ์ˆ˜๋„์žˆ๊ณ  ๋‚ ์ง€ ๋ชปํ• ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋””์ž์ธ ์›์น™์„ ์ ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค ์œ„์ฃผ์˜ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋‚ ๊ฐœ์ง“ํ•œ๋‹ค๋Š” Fly ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด์žˆ๊ณ (์บก์Šํ™”)

๋‚ ์ˆ˜์žˆ๋Š” class์™€ ๋‚ ์ง€ ๋ชปํ•˜๋Š” class๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค

ํ•ด๋‹น class๋Š” ๋ชจ๋‘ Fly๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค

 

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ

๋‚˜๋Š” ์ƒˆ, ๋‚ ์ง€ ๋ชปํ•˜๋Š” ์ƒˆ ๋ชจ๋‘ ๋™์ผํ•œ ํ–‰์œ„(flyํ•จ์ˆ˜)์— ๋Œ€ํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฑ„ํƒํ•˜๊ณ 

๊ฐ class์— ๋งž๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ถ„๋ฅ˜๋œ ๊ธฐ๋Šฅ๊ณผ ์บก์Šํ™”๋œ ๊ธฐ๋Šฅ์ด

๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

 

protocol Fly { 
    func fly()
}

class Flyable: Fly {
    func fly() {
        print("๋‚ ๋‹ค")
    }
}

class Flydisable: Fly {
    func fly() {
        print("๋ชป๋‚ ์•„")
    }
}

class Bird {
    private var interface: Fly
    
    init(interface: Fly) {
        self.interface = interface
    }
    
    func setInterface(interface: Fly){
        self.interface = interface
    }
    
    func birdFly() {
        interface.fly()
    }
}

 

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๊ณ 

 

import UIKit

class ViewController: UIViewController {

    var duck: Bird = Bird(interface: Flyable())
    var chicken: Bird = Bird(interface: Flydisable())
    
    override func viewDidLoad() {
        super.viewDidLoad()
        duck.birdFly() // 1
        chicken.birdFly() // 2
    }
}

 

 

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ž˜ ๋‚˜์˜ค๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

 

 

 

 

import UIKit

class ViewController: UIViewController {

    var duck: Bird = Bird(interface: Flyable())
    var chicken: Bird = Bird(interface: Flydisable())
    
    override func viewDidLoad() {
        super.viewDidLoad()
        duck.birdFly() // 1
        duck.setInterface(interface: Flydisable()) 
        duck.birdFly() // 2
        chicken.birdFly() // 3
    }
}

 

 

 

duck.setInterface ์ฝ”๋“œ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ (D.I. ํŒจํ„ด)

์ข€ ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ ์ˆ˜์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

Dependency Injection Pattern ์ด๋ž€

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์„ ์ฃผ์ž…ํ•˜์—ฌ

์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ฑ„ํƒํ•˜๊ณ  ๊ฐ’์€ ๊ฐ–๊ณ ์žˆ์ง€ ์•Š์€ ViewModel์˜ ๋‚ด๋ถ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

import Foundation

// DI ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. getter์™€ setter๊ฐ€ ์žˆ๋Š” intํ˜• ๋ณ€์ˆ˜ num์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
protocol DependencyIndependentInterface {
    var num : Int { get set }
}

// DI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” Model ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค. ์ƒ์†๋ฐ›์€ num์— 10์„ set ํ•ฉ๋‹ˆ๋‹ค.
class Model: DependencyIndependentInterface {
    var num: Int = 10
}


// DI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค.
class ViewModel {
    var internalVarialbe: DependencyIndependentInterface
    init(withExternalVariable variable: DependencyIndependentInterface){
        self.internalVarialbe = variable
    }
}

let test01 = ViewModel(withExternalVariable: Model())
print(test01.internalVarialbe.num)

 

 

ViewModel test01์˜ ๋‚ด๋ถ€๊ฐ’์ด 10์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๋ชจ์Šต

 

 

 

 

์ด๋Ÿฐ ์˜์กด์„ฑ ๋ถ„๋ฆฌ(DI)์™€ ์บก์Šํ™” ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„(์ „๋žตํŒจํ„ด)์œผ๋กœ

์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ์„ฑ, ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ํ‘œ์ค€ํ™”๋œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์ถ”๊ฐ€๋กœ

๋””์ž์ธ ํŒจํ„ด์€ ๋„๊ตฌ์ผ๋ฟ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ,

๊ฐ ์ƒํ™ฉ์— ์ ์ ˆํ•œ ํŒจํ„ด์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค

 

 

 

"์ƒ์†๋ณด๋‹ค๋Š” ์กฐํ•ฉ(Composition)์„ ์‚ฌ์šฉํ•ด๋ผ"

 

 

์ˆ˜์ • ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” fly() ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€๊นŒ์ง€ ๊ตฌํ˜„ํ•˜์—ฌ ์ƒ์†ํ•˜๊ธฐ ๋ณด๋‹ค๋Š”

๋‚ ์ˆ˜๋„ ๋‚ ์ง€ ๋ชปํ• ์ˆ˜๋„ ์žˆ๋Š” fly()๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ,

fly() ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฑ„ํƒํ•˜๋Š”

๋‚ ์ˆ˜์žˆ๋Š” class์™€ ๋‚ ์ง€๋ชปํ•˜๋Š” class๋ฅผ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ๊ฐ€์ ธ๋‹ค ์“ธ์ˆ˜์žˆ๋‹ค (์กฐํ•ฉ)

 

์ด๋Ÿฐ ์‹์˜ ์ „๋žตํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์† ๋ณด๋‹ค๋Š” ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

๋Œ“๊ธ€