Dagger 기반의 Android용 의존성 주입 라이브러리
-> 앱에서 의존성을 쉽게 주입 & 관리
B의 기능이 추가or변경되거나 형식이 바뀌면 그게 A에 영향을 미침 => 이렇게 클래스를 필요로 하는 것이 의존성!
Dependency = 필요로 하는 것
라면이 가스레인지에 의존하고 있음 = 라면을 만들려면 가스레인지가 있어야 함
의존성 직접 생성
class Ramen {
private val stove = Stove() // ❌ 스스로 Stove를 만듦 (강한 결합)
fun cook() {
stove.heatUp()
println("라면 끓이는 중...")
}
}
-> Stove가 바뀌면 Ramen도 수정해야 함
의존성 주입 - 낮은 결합
class Ramen(private val stove: Stove) { // ✅ 생성자로 받음 (의존성 주입)
fun cook() {
stove.heatUp()
println("라면 끓이는 중...")
}
}
fun main() {
val stove = Stove() // 외부에서 생성
val ramen = Ramen(stove) // ✅ 의존성 주입
ramen.cook()
}
=> 이 과정이 의존성 주입!
=> 나는 햄버거 집이 무엇이든 배달원이 주는 대로 받기만 하면 됨: 유연성 증가!
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main(args: Array) {
val car = Car()
car.start()
}
의존성 미사용 문제점
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main(args: Array) {
val engine = Engine()
val car = Car(engine)
car.start()
}
생성자를 통한 주입
setter를 통한 주입
객체를 생성한 후에 별도의 set 메서드나 lateinit 변수를 통해 의존성을 할당하는 방식
class Car {
lateinit var engine: Engine //setter를 통한 주입
fun start() {
engine.start() // 주입된 engine 객체 사용
}
}
fun main(args: Array) {
val car = Car() // Car 객체 먼저 생성
car.engine = Engine() // 의존성 주입!
car.start()
}
-> 생성자에서 engine을 주입하는 것 x, 객체를 생성한 후 따로 주입