반응형
의존성 주입(Dependency Injection, DI)
Hilt, Koin 등 다양한 Android DI를 돕는 라이브러리가 존재합니다. 그리고, Android 공식 사이트에서는 각종 편의성을 이유로 DI를 사용하길 권장합니다.
의존성(Dependency)
- 클래스 참조를 필요로 하는 다른 클래스 관계
- A class를 만들기 위해서 B class가 필요한 것
class A(bClass: B = B()) { /* ... */ }
class B { /* ... */ }
주입(Injection)
- 외부에서 객체를 생성하여 다른 객체에게 전달하는 것
- Car class의 경우 Tire, Engine 등 다양한 부품을 외부에서 주입받아야함
private class Car(
tire: Tire,
engine: Engine,
name: String = "TestCar"
)
private class Tire
private class Engine
의존성 주입의 의도
- 객체 사이의 결합을 줄이고 의존 관계 역전 원칙과 단일 책임 원칙 유지
- 객체의 생성에 대한 부분을 행위와 분리하도록 함
- 의존 관계 역전 원칙(Dependency Inversion Principle, DIP)
- 상위 모듈은 하위 모듈에 의존해서는 안되며, 모두 추상화에 의존해야 함
- 단일 책임 원칙 유지(Single Responsibility Principle, SRP)
- 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야함
Example
private class Car(
val tire: Tire?,
val engine: Engine?,
val name: String = "TestCar"
) {
fun start() {
if (tire == null) {
println("tire is not equip")
return
}
if (engine == null) {
println("engine is not equip")
return
}
engine.start()
}
}
private class Tire
private class Engine(
val name: String
) {
private var _temperature: Int = 30
val temperature
get() = _temperature
private var _isStarted: Boolean = false
val isStarted
get() = _isStarted
fun start() {
println("engine $name is start")
println("current temperature is $_temperature")
_isStarted = true
_temperature = 90
println("current temperature is $_temperature")
}
}
private fun main() {
val nullCar = Car(
tire = null,
engine = null
)
nullCar.start()
val tire = Tire()
val engine = Engine("custom")
val car = Car(tire, engine)
car.start()
}
/*
tire is not equip
engine custom is start
current temperature is 30
current temperature is 90
*/
반응형
'Android > Other' 카테고리의 다른 글
[잡담] 사이드 프로젝트 6월달 회고 (0) | 2024.07.01 |
---|---|
[잡담] 사이드 프로젝트 1주차 회고 (0) | 2024.05.20 |
[잡담] 사이드 프로젝트 0주차 회고 (0) | 2024.05.20 |
[안드로이드] Intent Action 알아보기 (1) | 2024.03.26 |