DIP 원칙이란 객체에서 어떤 Class를 참조해서 사용해야하는 상황이 생긴다면, 그 Class를 직접 참조하는 것이 아니라 그대상의 상위 요소(추상 클래스 or 인터페이스)로 참조하라는 원칙이다.
저수준 모듈 : 고수준 모듈보다 더 구체적으로 구현된 객체.
고수준 모듈 : 인터페이스와 같이 추상적인 개념
위키백과에서는 다음처럼 설명한다.
객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다. 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다. 이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다.
이해하기 좀 어려운데, 결국 변화가 어려운 저수준 보다는 변화가 쉬운 고수준에 의존하는게 좋다는 것이다. 예시를 보자.
public class User(){
private Vegetable vegetable = new Vegetable();
public void buy(Vegetable product){
product.setType("buy");
}
}
User가 Vegetable을 가져와 사용하는 모습이다. 이 코드에서 User는 vegetable에 의존하게 된다. 문제는 user가 채소가 아니라 다른걸 사고 싶을 때가 생길 때 이다.
public class User(){
private Vegetable vegetable;
private Fruit fruit; //과일
public void buy(Vegetable product){
product.setType("buy");
}
//과일을 이용한 buy메서드도 생성
}