추상 인터페이스에 변경이 생기면 이를 구체화한 구현체들도 따라서 수정해야 한다
반대로 구체적인 구현체에 변경이 생기더라도 그 구현체가 구현하는 인터페이스는 항상, 좀 더 정확히 말하면 대다수의 경우 변경될 필요가 없다
따라서 인터페이스는 구현체보다 변동성이 낮다 실제로 뛰어난 소프트웨어 설계자와 아키텍트라면 인터페이스의 변동성을 낮추기 위해 애쓴다
인터페이스를 변경하지 않고도 구현체에 기능을 추가할 수 있는 방법을 찾기 위해 노력한다 이는 소프트웨어 설계의 기본이다
변동성이 큰 구체 클래스를 참조하지 말라 대신 추상 인터페이스를 참조하라
변동성이 큰 구체 클래스로부터 파생하지 말라 (상속은 아주 신중하게 사용해야 한다)
구체 함수를 오버라이드 하지 말라 차라리 추상 함수로 선언하고 구현체들에서 각자의 용도에 맞게 구현해야 한다
구체적이며 변동성이 크다면 절대로 그 이름을 언급하지 말라
-추가- 출처: https://dreamcoding.tistory.com/69
DIP는 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것에 의존하기 보다는, 변화하기 어려운것, 거의 변화가 없는 것에 의존하라는 원칙입니다.
객체 사이에 서로 도움을 주고 받으면 해당 객체 사이에서는 의존 관계가 발생하게 됩니다.
누군가의 도움을 받을때는 무조건 도움을 받으려고 여기저기 손을 내밀 게 아니라 나름대로의 원칙을 가지고 도움을 요청해야 효과적으로 도움을 받을 수 있습니다.
아이가 장난감을 가지고 노는 경우를 예로 생각해보겠습니다.

어떤 경우에는 로봇 장난감을 가지고 놀고 어떤 경우에는 자동차 장난감을 가지고 놀고 레고를 가지고 놀 수 도 있습니다. 이때 실제 가지고 노는 구체적인 장난감은 변하기 쉬운 것이고, 아이가 장난감을 가지고 노는 사실은 변하기 어려운 것입니다. (인터페이스 = 변하지 않는것, 구현체 클래스 = 변하기 쉬운것)
객체지향 관점에서는 이와 같이 변하기 어려운 추상적인 것들을 표현하는 수단으로 추상 클래스와 인터페이스가 있습니다.
DIP를 만족하려면 어떤 클래스가 도움을 받을 때 구체적인 클래스보다 인터페이스나 추상 클래스와 의존 관계를 맺도록 설계해야 합니다.
DIP를 만족하는 설계는 변화에 유연하게 대처 할 수 있는 시스템이 되기 때문입니다.
DIP를 만족하려면 의존성 주입(Dependency Injection) 이라는 기술로 변화를 쉽게 수용할 수 있는 코드를 작성할 수 있다.
** 의존성 주입(Dependency Injection): 말 그대로 클래스 외부에서 의존되는 것을 대상 객체의 인스턴스 변수에 주입하는 기술
DI를 이용하여 대상 객체를 변경하지 않고도 외부에서 대상 객체의 외부 의존 객체를 바꿀 수 있다.
public class Kid { private Toy toy; public void setToy(Toy toy) { this.toy = toy; } public void play() { System.out.println(toy.toString()); } }Kid 클래스에서 setToy 메서드로 아이가 가지고 노는 장난감을 바꿀 수 있다. 만약 로봇 장난감을 가지고 놀고 싶다면 아래와 같이 바꿀 수 있다.
public class Robot extends Toy { public String toString() { return "Robot"; } }public class Main { public static void main(String[] args) { Toy t = new Robot(); Kid k = new Kid(); k.setToy(t); k.play(); } }아이가 마음이 바뀌어 레고를 가지고 놀고 싶다면 아래와 같이 바꿀 수도 있을것입니다.
public class Lego extends Toy { public String toString() { return "Lego"; } }public class Main { public static void main(String[] args) { Toy t = new Lego(); // Lego로 Toy를 생성(둘다 Toy를 extends 했기때문) Kid k = new Kid(); k.setToy(t); k.play(); } }이렇게 아이(Toy.class)가 가지고 노는 장난감(Toy.class)가 단순히 장난감에 종속적이지 않고 어떠한 장난감이던 의존성을 Toy에 주입하는 클래스의 의존관계를 역전하여 작성 할 수 있도록 하는 게 DIP 원칙입니다.
DIP 원칙을 준수하게 되면 자연스레 OCP원칙에도 맞는 설계가 될 수 있습니다.
어느정도 감이 잡힌다. 객체와 객체사이의 의존관계가 있을때 인터페이스가 그 이음쇠 역할을 하도록 설계 하라는거지?
ㅇㅇ 다형성 찾아보면 좋은 글들 많이 나올듯 맥락은 맞았어
블로그같은건 안해요? 방금 님이 쓴거 정독하고 왔는데 너무 깔끔하네
감사합니다 다시 보고 싶은 구절들 적는거라서요 블로그는 안하고있어요
python 버전 ->
https://doorbw.tistory.com/240