객체지향 (OOP)/객체 지향 설계 5원칙

[DIP] 객체지향 설계 5 원칙 (5)

고인돌개발자 2021. 5. 22. 23:25

학습목표 : 의존관계 역전 원칙 (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 는 스프링의 의존성 주입과도 밀접한 연관성을 가진다.

 

결국 객체지향 설계 원칙들은 결국 추상화를 어떻게 이용하여 설계할지의 이론들이라는 생각이 든다.