반응형
SOLID 원칙 중 마지막인
5. DIP(=Dependency Inversion Principle, 의존관계 역전 원칙)
" '고수준 모듈'은 '저수준 모듈'의 구현에 의존해서는 안 된다.
'저수준 모듈'이 '고수준 모듈'에서 정의한 추상 타입에 의존해야 한다."
- 다른 말로 "자신보다 변하기 쉬운 것에 의존하 지 마라"
- Ex) 고수준 모듈은 자동차 / 저수준 모듈은 스노우 타이어
- '추상화'를 이용해 문제 해결
- Ex) DIP 위반 사례
ⓐ 고수준 모듈인 자동차가 저수준 모듈인 스노우 타이어에 의존하는 상태
ⓑ 일반 타이어로 교체하기로 결정
ⓒ [문제] 의존하고 있던 자동차의 코드도 연쇄적으로 영향을 끼치게 됩니다.(개방-폐쇄 원칙을 위반)
class Car(val tire: SnowTire) {
fun checkTire() {
if(tire.isSnow) {
// 눈오는 중일 때 처리
}
else {
// 눈 안오는 중일 때 처리 등등
}
}
}
class SnowTire {
val isSnow: Boolean = true
}
ⓓ 따라서 스노우 타이어나 일반 타이어를 '타이어' 자체로 추상화하여 DIP를 준수한다.
class Car(val tire: Tire) {
fun checkTire() {
// Tire 공통 처리
}
}
interface Tire {
}
interface SnowTire: Tire {
val isSnow: Boolean
}
interface NormalTire: Tire {
}
ㄴ> 이제 타이어는 저수준 모듈보다는 고수준 모듈인 자동차 입장에서 만들어지는데,
이것은 고수준 모듈이 저수준 모듈에 "의존했던 상황이 역전"되어
저수준 모듈이 고수준 모듈에 의존하게 된다는 것을 의미하며 이런 맥락에서 '의존 역전 원칙'인 것입니다.
- 주의 : 런타임에서의 의존을 역전시키는 것이 아니라 소스 코드 단계에서의 의존을 역전시킨다는 것을 의미한다.
더보기
다만, 소스 코드의 의존은 자동차가 '타이어'를 의존하지만, 런타임에서의 객체 의존은 타이어가 아니라 하위 타이어 중 하나를 의존합니다.
따라서,
의존 역전 원칙은 런타임에서의 의존을 역전시키는 것이 아니라 소스 코드 단계에서의 의존을 역전시킨다는 것을 유의해야 합니다.
[출처]
- https://steady-coding.tistory.com/385
- 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균
반응형