티스토리 뷰
의존 관계 역전 원칙(DIP)
상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다. 둘 모두 추상화에 의존해야한다.
기존 절차지향적 프로그래밍에서는 상위수준의 모듈이 하위수준의 모듈에 의존하는 경향이 있었다. 이러한 의존성을 역전시켜 상위수준의 모듈이 하위수준의 모듈에 의존하지 않도록 하는 원칙이다. 의존성을 역전시키는 방법은 상위 모듈과 하위 모듈 둘 다 추상화에 의존하게 하는 것이다.
Abstraction vs Encapsulation
Abstraction과 Encapsulation의 관계는 상호보완적이라 볼 수 있다. Abstraction은 객체의 행동에 초점을 맞추어 공통적인 부분을 묶어낸 것이라면 Encapsulation은 이러한 행동을 뒷받침해주는 Implementation에 초점을 맞춘 것이다.
이에 따라 클래스를 구현할 때는 아래의 원칙을 지켜야 한다.
- 어떤 변수도 구체 클래스에 대한 포인터나 참조값을 가져선 안 된다.
- 어떤 클래스도 구체 클래스에서 파생되어서는 안 된다.
- 어떤 메소드도 그 기반 클래스에서 구현된 메소드를 오버라이드해서는 안된다.
Example
class Switch{
private Light light;
void activate(){
light.turnOn();
}
}
Switch
클래스를 통해 Light
클래스를 켜는 코드입니다. Switch
와 Light
클래스만을 사용하는 경우를 한정하여서 코드의 재사용이 가능합니다. 결국 재사용이 불가능한 상태입니다. 문제가 발생한 원인은 상위 클래스가 직접적으로 Light
라는 타입을 변수로 갖기 때문입니다. 이를 해결하기 위해 turnOn()
이 가능한 것들을 추상화하여 사용해야합니다.
class Switch{
Lightable light;
void activate(){
light.turnOn();
}
}
직접적인 Light
클래스에 의존하는 대신 Lightable
이라는 추상화된 인터페이스에 의존하도록 변경했습니다. 상위 모듈이 하위모듈에 직접 의존하지 않으므로 DIP가 실현되었습니다.
'Design Patterns' 카테고리의 다른 글
[디자인패턴] 인터페이스 분리 원칙(ISP) (0) | 2021.10.27 |
---|---|
[디자인패턴] 리스코프 치환 원칙(LSP) (0) | 2021.10.27 |
[디자인패턴] 개방 폐쇄 원칙(OCP) (0) | 2021.10.27 |
- Total
- Today
- Yesterday
- greedy
- 세그먼트트리
- Segment tree
- Suffix Array
- 정렬
- 동적계획법
- union find
- DP
- Oracle
- spring
- 펜윅트리
- spring boot
- implementation
- 트라이
- dijkstra
- 좌표압축
- string
- SCC
- dfs
- sorting
- 2-SAT
- 이분탐색
- knapsack
- 스위핑
- sweeping
- hld
- kmp
- 이분매칭
- Fenwick
- bfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |