본문 바로가기

소프트웨어

[소프트웨어/SOLID] 의존 역전 원칙(DIP)


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 원칙을 만족한다.