개발을 잘하고 싶은 주니어?

의존성(Dependency) 공부하기 본문

개발/iOS

의존성(Dependency) 공부하기

데쿠! 2021. 11. 27. 01:28
반응형

의존성이란?

A클래스와 B클래스가 있다고 가정을 해볼 때, B클래스에서 A클래스를 사용하면 의존성이 생긴다고 합니다.

class Color{
    var currentColor: UIColor = .red
    func printColor(){
        print(currentColor)
    }    
}
class Car{
    var carColor = Color()
}

위와 같이 Car클래스에서 Color클래스를 사용하고 있으므로 의존성이 존재합니다. 

의존성 주입

그럼 의존성 주입이란 무엇일까요?

class Color{
    var currentColor: UIColor
    init(currentColor: UIColor){
        self.currentColor = currentColor
    }
    func printColor(){
        print(currentColor)
    }
}
class Car{
    var carColor = Color(currentColor: .red)
}

let car = Car()
print(car.carColor.printColor())

가장 위의 의존성 코드에서는 Color 클래스 내부의 값이나 함수의 내용이 바뀔 때마다 Car 클래스도 영향을 받게 됩니다. (에러가 나도 영향을 받게 됨)

이런 의존성을 가지는 코드가 많아지면 한 클래스를 바꾸는 상황에서 해당 클래스에 의존하는 다른 클래스까지 바꿔줘야 해서 유지 보수하기에 힘든 코드가 됩니다.

그래서 나온게 의존성 주입입니다.

Car클래스에서 carColor변수에 currentColor argument를 입력합니다. 이것을 주입이라고 합니다.

즉 의존성 주입이란, 외부(여기서는 Car)에서 초기화해서 내부 클래스(Color)의 값(currentColor)에 할당하는 것을 말합니다.

의존성 주입을 하면, 객체 간의 결합도가 낮아지고 의존성을 줄일 수 있습니다. 또한 코드의 재활용성도 높여줍니다.

DIP(Dependency Inversion Principle)

객체 지향 프로그래밍 설계의 다섯 가지 원칙 중 하나인 DIP, 의존 역전 원칙에서 보면 추상화된 것은 구체적인 것에 의존하면 안되고 구체적인 것은 추상화된 것에 의존해야 한다고 합니다.

Swift에서 추상화된 것이라고 하면 Protocol이 있고, 우리는 Protocol을 사용해서 의존성 주입을 구현하면 됩니다.

protocol PrintProtocol{
    func printColor()
}
class Color: PrintProtocol{
    var currentColor: UIColor
    init(currentColor: UIColor){
        self.currentColor = currentColor
    }
    func printColor(){
        switch currentColor{
        case .red:
            print("red")
        case .yellow:
            print("yellow")
        default:
            print("none")
        }
    }
}
struct Car{
    var carColor: PrintProtocol
    func printColor(){
        carColor.printColor()
    }
    mutating func changeCarColor(color: PrintProtocol){
        self.carColor = color
    }
}
let color = Color(currentColor: .red)
let anotherColor = Color(currentColor: .yellow)
var car = Car(carColor: color)
car.printColor()
car.changeCarColor(color: anotherColor)
car.printColor()

Car의 carColor변수는 Color클래스가 아닌 PrintProtocol에 의존합니다(추상화 객체). 그리고 나서, changeCarColor메서드를 이용해서 의존성 주입을 할 수도 있습니다.

그럼 Car와 Color는 독립적인 객체가 되고 이전처럼 Color를 수정한다고 해서 Car에 영향이 가지 않습니다.

 

Reference

https://80000coding.oopy.io/68ee8d89-5d05-449d-87e2-5fba84d604ca#cbf86206-bbd2-47a3-8f33-8e2d912f15e7

 

(Swift) Dependency Injection, 의존성 주입이란? (feat. DIP)

Dependency Injection, 의존성 주입..

80000coding.oopy.io

 

반응형

'개발 > iOS' 카테고리의 다른 글

Swift Package Manager (SPM) 공부하기 - 이론  (0) 2021.11.27
Framework란? Library란?  (0) 2021.11.27
Hex to Color  (0) 2021.11.23
URLSession 공부하기 - 3  (0) 2021.11.23
Diffable Data Source 공부하기 - 2 (실습)  (0) 2021.11.21
Comments