디자인 패턴 - solid 원칙 정리 2

디자인 패턴 - solid 원칙 정리 2

 

 

4.의존 역전 원칙

의존 역전 원칙은 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운것, 거의 변화가 없는 것에 의존하라

 

5.인터페이스 분리 원칙

인터페이스를 클라이언트에 특화되도록 분리 시켜라

 


 

의존 역전 원칙

객체 사이에 서로 도움을 주고 받으면 의존 관계가 발생한다.

 

의존 역전 원칙은 그러한 의존 관계를 맺을 때의 가이드라인에 해당한다.

 

도움을 받을 때 여기저기 도움을 받을 것이 아니라 원칙을 가지고 도움을 청해야 한다는 것이다.

 

Key point 의존 역전 원칙은 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운것, 거의 변화가 없는 것에 의존하라는 원칙이다.

 

변하기 쉬운것과 어려운것은 어떻게 구분하나?

 

변하기 어려운 것 : 정책, 전략과 같은 큰 흐름이나 개념 같은 추상적인 것

변하기 쉬운 것 : 구체적인 방식, 사물 등..

 

예) - 아이가 장난감을 가지고 노는 경우

 

아이는 어떤 경우에는 로봇 장난감을 가지고 놀고 어떤 경우에는 자동차 장난감을 가지고 놀것이다.

 

변하기 쉬운 것 :  실제 가지고 노는 구체적인 장난감

변하기 어려운 것 : 아이가 장난감을 가지고 노는 사실. 

 

 

객체지향 관점에서는 이와 같이 변하기 어려운 추상적인 것들을 표현하는 수단으로 추상 클래스와 인터페이스가 있다.

 

의존 역전 원칙을 만족하려면 어떤 클래스가 도움을 받을 때 구체적인 클래스 보다는 인터페이스나 추상 클래스와 의존 관계를 맺도록 설계해야 한다.

 

DIP(의존역전원칙)을 만족하는 설계는 변화에 유연한 시스템이 된다.

 

Key point 인터페이스나 추상 클래스와 의존 관계를 맺도록 설계해야 한다.

 

 

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

 

 

DIP를 만족하면 의존성 주입이라는 기술로 변화를 쉽게 수용할 수 있는 코드를 작성할 수 있다.

 

의존성 주입: 클래스 외부에서 의존되는 것을 대상 객체의 인스턴스 변수에 주입하는 기술.

(대상 객체를 변경하지 않고도 외부에서 대상 객체의 외부 의존 객체를 바꿀 수 있다.)

 

 

Kid 클래스에서 setToy 메서드로 아이가 가지고 노는 장난감을 바꿀 수 있다. 만약 로봇 장난감을 가지고 놀고 싶다면 코드 3-6, 3-7이 그 일을 해줄 것이다.

 

 

 

아이가 레고를 가지고 놀고 싶다면 아래 처럼 작성할 수 있다.

Kid, Toy, Robot 등 기존의 코드에 전혀 영향을 받지 않고도 장난감을 바꿀 수 있다.

 

 

✅ 인터페이스 분리 원칙

인터페이스를 클라이언트에 특화되도록 분리 시켜라

 

 

 

위의 그림을 보면 복합기 기능을 제공하는 클래스는 매우 비대해질 가능성이 크다.

 

하지만 이 비대한 클래스의 모든 기능을 클라이언트가 [동시]에 사용하는 경우는 거의 없다.

 

클라이언트의 필요에 따라 프린터 기능만 이용하던지, 팩스 기능만 이용하던지, 복사기 기능만 이용할 수 있다. 

 

따라서 프린터 기능만 이용하는 클라이언트가 팩스 기능의 변경으로 인해 발생하는 문제의 영향을 받지 않도록 해야 한다.

 

클라이언트와 무관하게 발생한 변화로 클라이언트 자신이 영향을 받지 않으려면 범용의 인터페이스 보다는 클라이언트에 특화된 인터페이스를 사용해야 한다.

 

 

복합기를 사용하는 객체들마다 자신이 관심을 갖는 메서드들만 있는 인터페이스를 제공받도록 설계했다.

 

이렇게 설계하면 인터페이스가 일종의 방화벽 역할을 수행해 클라이언트는 자신이 사용하지 않는 메서드에 생긴 변화로 인한 영향을 받지 않게 된다.

 

단일책임원칙과 인터페이스 분리 원칙 관계

어떤 클래스가 단일 책임을 수행하지 않고 여러 책임을 수행하게 되면 방대한 메서드를 가진 비대한 클래스가 될 가능성이 커지며, 당연히 비대한 인터페이스가 제공될 것이다.

 

이렇게 비대한 클래스를 SRP에 따라 단일 책임을 갖는 여러 클래스들로 분할하고 각자의 인터페이스를 제공한다면 ISP도 만족할 수 있다.