- 의존 관계를 맺을 때 변하기 쉬운 것(구체적인 것)보다는 변하기 어려운 것(추상적인 것)에 의존해야 한다.
- 구체화된 클래스에 의존하기보다는 추상 클래스나 인터페이스에 의존해야한다.
다음과 같이 database를 가지는 Phone 클래스가 있고, createDatabase를 통해서 database에 data를 만든다고 가정하자.
이 경우 Phone 클래스를 인스턴스화할때 LocalDatabase에 의존성을 가지게 되고, createDatabase 메소드도 LocalDatabase에 의존성을 가지게 된다.
만약 LocalDatabase대신 RemoteDatabase를 사용하게 된다면 database의 클래스 타입을 교체해줘야 한다.
class Phone {
var database = LocalDatabase()
fun createDatabase(){
database.create()
}
}
이를 모든 Database 종류로 교체가 가능한 DB 인터페이스를 생성하여 상속하도록하여 의존성 문제를 해결할 수 있다.
interface DB {
fun create()
}
class LocalDatabase : DB {
override fun create() {
...
}
}
class RemoteDatabase : DB {
override fun create() {
...
}
}
class Phone {
lateinit var database : DB
constructor(database: DB) {
this.database = database
}
fun createDatabase(){
database.create()
}
}