학습목표 : 의존관계 역전 원칙 (Dependency inversion principle)을 이해하고, 예제로 설명할 수 있다.
DIP [Dependency inversion principle] 의존 역전 원칙
"고차원 모듈은 저차원 모듈에 의존하면 안된다.
이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다.
구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라" - 로버트 C.마틴
[위키피디아] DIP [Dependency inversion principle] 의존 역전 원칙
객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다.[1]첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다.[2]
이미지로 설명하기
예제) 못된 예제
package book.oopforsprings.lec05.solid;
public class DIP커피_NO {
public static void main(String[] args) {
/* 월요일 */
직장인 man = new 직장인();
man.doDrink();
/* 화요일은 라떼를 마시고 싶다. */
}
}
/* 특정 커피에 상속되면,, 다른 커피를 마실때는.. */
class 직장인 extends 아메{
}
class 아메{
void doDrink(){
System.out.println("아메를 마신다.");
}
}
class 라떼{
void doDrink(){
System.out.println("라떼를 마신다.");
}
}
class 카푸치노{
void doDrink(){
System.out.println("카푸치노를 마신다.");
}
}
예제) 잘된 예제
package book.oopforsprings.lec05.solid;
public class DIP커피_OK {
public static void main(String[] args) {
/* 월요일 */
직장인2 man = new 직장인2();
man.doCoffee();
}
}
/* 특정 커피에 상속되면,, 다른 커피를 마실때는..
*
* */
class 직장인2{
/* 월요일 */
//커피 coffee = new 아메2();
/* 화요일 */
커피 coffee = new 라떼2();
void doCoffee() {
System.out.println(coffee.doDrink());
}
}
interface 커피{
String doDrink();
}
class 아메2 implements 커피{
public String doDrink(){
return "아메를 마신다.";
}
}
class 라떼2 implements 커피{
public String doDrink(){
return "라떼를 마신다.";
}
}
class 카푸치노2 implements 커피{
public String doDrink(){
return "카푸치노를 마신다.";
}
}
맺음말
DIP 의존성 주입은 결국 OCP(개방폐쇄의 원칙)와도 연결되어 있다.
또한 DIP 는 스프링의 의존성 주입과도 밀접한 연관성을 가진다.
결국 객체지향 설계 원칙들은 결국 추상화를 어떻게 이용하여 설계할지의 이론들이라는 생각이 든다.
'객체지향 (OOP) > 객체 지향 설계 5원칙' 카테고리의 다른 글
[ISP] 객체지향 설계 5 원칙 (4) (0) | 2021.05.21 |
---|---|
[LSP] 객체지향 설계 5 원칙 (3) (0) | 2021.05.15 |
[OCP] 객체지향 설계 5 원칙 (2) (0) | 2021.05.14 |
[SRP] 객체지향 설계 5 원칙 (1) (0) | 2021.05.13 |
객체지향 설계 5원칙 (0) | 2021.05.13 |