Study Programming/Design Pattern

[SOLID] DIP(=Dependency Inversion Principle, 의존관계 역전 원칙)

네모메모 2022. 6. 30. 19:06
반응형

 

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://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4_%EB%B6%84%EB%A6%AC_%EC%9B%90%EC%B9%99

- https://steady-coding.tistory.com/385

- https://jaeseongdev.github.io/development/2021/04/25/ISP(%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B6%84%EB%A6%AC-%EC%9B%90%EC%B9%99)/ 

 

- 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균

 

 

 

 

반응형