티스토리 뷰

의존 관계 역전 원칙(DIP)

의존 관계 역전 원칙(DIP)

 

상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다. 둘 모두 추상화에 의존해야한다.

 

기존 절차지향적 프로그래밍에서는 상위수준의 모듈이 하위수준의 모듈에 의존하는 경향이 있었다. 이러한 의존성을 역전시켜 상위수준의 모듈이 하위수준의 모듈에 의존하지 않도록 하는 원칙이다. 의존성을 역전시키는 방법은 상위 모듈과 하위 모듈 둘 다 추상화에 의존하게 하는 것이다.

 

Abstraction vs Encapsulation

Abstraction과 Encapsulation의 관계는 상호보완적이라 볼 수 있다. Abstraction은 객체의 행동에 초점을 맞추어 공통적인 부분을 묶어낸 것이라면 Encapsulation은 이러한 행동을 뒷받침해주는 Implementation에 초점을 맞춘 것이다.

 

이에 따라 클래스를 구현할 때는 아래의 원칙을 지켜야 한다.

  • 어떤 변수도 구체 클래스에 대한 포인터나 참조값을 가져선 안 된다.
  • 어떤 클래스도 구체 클래스에서 파생되어서는 안 된다.
  • 어떤 메소드도 그 기반 클래스에서 구현된 메소드를 오버라이드해서는 안된다.

 

Example

class Switch{
	private Light light;
    void activate(){
		light.turnOn();
    }
}

Switch 클래스를 통해 Light 클래스를 켜는 코드입니다. SwitchLight 클래스만을 사용하는 경우를 한정하여서 코드의 재사용이 가능합니다. 결국 재사용이 불가능한 상태입니다. 문제가 발생한 원인은 상위 클래스가 직접적으로 Light라는 타입을 변수로 갖기 때문입니다. 이를 해결하기 위해 turnOn()이 가능한 것들을 추상화하여 사용해야합니다.

 

class Switch{
	Lightable light;
	void activate(){
		light.turnOn();
	}
}

직접적인 Light클래스에 의존하는 대신 Lightable이라는 추상화된 인터페이스에 의존하도록 변경했습니다. 상위 모듈이 하위모듈에 직접 의존하지 않으므로 DIP가 실현되었습니다.

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함