DIP (Dependency Inversion Principle)
자주 변화하는 것보다 변화하기 어려운 것, 변화가 거의 없는 것에 의존하라는 것
다른 모듈이나 클래스에 도움을 받을 때는 무조건 의존하지 말고 나름대로의 원칙을 가지고 도움을 받아야 효과적으로 받을 수 있다는 뜻이다.
예를 들어서 사람은 이름이나, 성별, 나이 등은 그 자체의 속성으로써 변하기 어렵지만, 상대적으로 자동차, 핸드폰, 옷등은 자주 교체될 수 있다. 이는 이전의 UML에서의 합성관계냐 집약관계냐에 따른 차이와 비슷하다.
변하기 쉬운 것의 변하기 어려운 부분들을 추상화하여 인터페이스나 추상클래스로 참조함으로써 DIP를 지킬 수 있게된다.
예를 들어서 핸드폰의 경우 핸드폰의 전화를 하거나, 문자를 보내거나, 앱을 실행하는 것 자체는 변하기 어렵지만 브랜드나 가격, 모델 명등은 변하기 쉽다. 해서 위의 변하기 어려운 것을 추상화하여 인터페이스나 추상 클래스로 만들어 참조하면 DIP를 만족하게 될 수 있다.
구현은 아래와 같다
public class Penson {
private String name;
private int age;
private Phone phone;
// gets and sets...
}
여기서 phone 변수의 타입 Phone
은 추상클래스로서 아래와 같다.
public abstract class Phone {
private String phoneNumber;
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public abstract void call(String phoneNumber);
public abstract void turnOn();
public abstract void turnOff();
}
그리고 아래와 같이 상속받아 구현할 수 있다.
public class GlaxyS7 extends Phone{
@Override
public void call(String phoneNumber) {
System.out.println("Call to " + phoneNumber);
}
@Override
public void turnOn() {
System.out.println("Turn on glaxyS7");
}
@Override
public void turnOff() {
System.out.println("Turn off glaxyS7");
}
}
만약 갤럭시가 아닌 lg의 G시리즈나 아이폰등도 상속받아서 구현하여 Person
의 인스턴스 객체의 속성으로 설정함으로서 의존성을 역전 시켜 DIP 원칙을 만족한다.
'소프트웨어' 카테고리의 다른 글
[Trend] 클라우드, 크로스플랫폼, 언어, 프레임워크 (0) | 2017.01.22 |
---|---|
[소프트웨어/팁] 좋은 글귀 모음 (0) | 2017.01.19 |
[소프트웨어/SOLID] 인터페이스 분할 법칙(ISP) (0) | 2017.01.18 |
[소프트웨어/SOLID] 리스코브 치환 법칙(LSP) (0) | 2017.01.18 |
[소프트웨어/SOLID] 개방 폐쇄 원칙(OCP) (0) | 2017.01.18 |