의존 역전 원칙이란 의존 관계를 맺을 때 변화하기 쉬운 것 보다 변화하기 어려운 것에 의존하라는 원칙을 의미한다.

DIP를 만족하는 설계는 변화에 유연한 시스템이 된다.

변하기 쉬운 것과 변하기 어려운 것은 어떻게 구분 할 수 있을까?

정책, 전략과 같은 어떤 큰 흐름이나 개념같은 추상적인 것은 변하기 어려운 것이고, 구체적인 방식, 사물 등과 같은 것은 변하기 쉬운 것으로 구분한다.

Person클래스가 무기를 착용하기 위한 클래스 다이어그램

위 클래스 다이어그램을 보면 Weapon은 변하기 어려운 것이고, Sword, Axe, Spear는 변하기 쉬운 것이다.

인터페이스 = 변하지 않는 것
구체 클래스 = 변하기 쉬운 것

DIP를 만족하면 여러가지 타입의 클래스를 인터페이스를 통해 쉽게 저장이 가능하다.

public class Person {

    private Weapon weapon;

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public void attack() {
        weapon.attack();
    }
}

 setWeapon을 통해서 Weapon 인터페이스를 구현한 클래스를 외부에서 주입해 무기를 착용한다. 

public interface Weapon {

    public void attack();
}
public class Sword implements Weapon {

    @Override
    public void attack() {
        System.out.println("검으로 휘두르다.");
    }
}

public class Axe implements Weapon {

    @Override
    public void attack() {
        System.out.println("도끼로 휘두르다");
    }

}

public class Spear implements Weapon {

    @Override
    public void attack() {
        System.out.println("창으로 찌르다");
    }

}

 

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        person.setWeapon(new Sword());
        person.attack();

        person.setWeapon(new Axe());
        person.attack();
    }
}

 

참조 : https://defacto-standard.tistory.com/113?category=703460

+ Recent posts