티스토리 뷰
의존 관계 역전 원칙(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
링크
TAG
- SCC
- dfs
- union find
- 정렬
- knapsack
- 이분탐색
- spring boot
- Oracle
- spring
- 세그먼트트리
- dijkstra
- bfs
- sorting
- 이분매칭
- string
- 트라이
- kmp
- DP
- 펜윅트리
- sweeping
- greedy
- Fenwick
- hld
- Suffix Array
- 좌표압축
- implementation
- 스위핑
- Segment tree
- 동적계획법
- 2-SAT
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
