개발 이야기/OOP

[SOLID] 의존 역전 원칙(DIP)이란?

제이온 (Jayon) 2021. 3. 12.

안녕하세요? 제이온입니다.

 

저번 시간에는 인터페이스 분리 원칙을 알아 보았습니다. 오늘은 의존 역전 원칙을 설명하겠습니다.

 

 

의존 역전 원칙 (Dependency Inversion Principle)의 정의

의존 역전 원칙은 "고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다."를 의미합니다. 이것을 아주 쉽게 말하면, "자신보다 변하기 쉬운 것에 의존하지 마라"라고 이해하시면 되겠습니다.

 

그래도 고수준 모듈과 저수준 모듈이 무엇인지는 알아봐야겠죠? 아래 사례를 통해 이해하실 수 있습니다.

 

 

의존 역전 원칙의 예제

 

 

DIP하면 대표적인 예제라고 할 수 있는 자동차와 스노우 타이어 이야기입니다. 현재는 겨울이기 때문에 스노우 타이어를 구매하여 자동차에 끼도록 설계하였습니다. 즉, 고수준 모듈인 자동차가 저수준 모듈인 스노우 타이어에 의존하는 상태입니다.

 

하지만, 날씨가 따뜻해지면서 더 이상 스노우 타이어를 사용할 필요가 없어졌습니다. 그래서 일반 타이어로 교체하기로 결정하였습니다. 그런데, 단순히 스노우 타이어를 일반 타이어로 바꾼다고 코드가 끝나는 것이 아닙니다. 이것에 의존하고 있던 자동차의 코드도 연쇄적으로 영향을 끼치게 됩니다.

 

이것은 개방-폐쇄 원칙을 위반하는 것이므로 추상화나 다형성을 통해 문제를 고쳐야 합니다. 의존 역전 원칙은 그 중에서도 추상화를 이용합니다. 바로, 스노우 타이어나 일반 타이어를 '타이어' 자체로 추상화하는 것이죠.

 

 

 

 

여기서 타이어는 저수준 모듈보다는 고수준 모듈인 자동차 입장에서 만들어지는데, 이것은 고수준 모듈이 저수준 모듈에 의존했던 상황이 역전되어 저수준 모듈이 고수준 모듈에 의존하게 된다는 것을 의미합니다. 이런 맥락에서 이 원칙의 이름이 의존 역전 원칙인 것입니다.

 

다만, 소스 코드의 의존은 자동차가 '타이어'를 의존하지만, 런타임에서의 객체 의존은 타이어가 아니라 하위 타이어 중 하나를 의존합니다. 따라서, 의존 역전 원칙은 런타임에서의 의존을 역전시키는 것이 아니라 소스 코드 단계에서의 의존을 역전시킨다는 것을 유의해야 합니다.

 

 

정리

지금까지 SOLID 5가지 원칙을 모두 알아 보았습니다. 간단히 5가지 특징을 요약해 보겠습니다.

 

단일 책임 원칙과 인터페이스 분리 원칙은 객체가 커지지 않도록 막아줍니다. 객체가 단일 책임을 갖게 하고 클라이언트마다 다른 인터페이스를 사용하게 함으로써 한 기능의 변경이 다른 곳에까지 미치는 영향을 최소화할 수 있고, 이는 결국 기능 변경을 보다 쉽게 할 수 있도록 만들어 줍니다.

 

리스코프 치환 원칙과 의존 역전 원칙은 개방 폐쇄 원칙을 지원합니다. 개방 폐쇄 원칙은 변화되는 부분을 추상화하고 다형성을 이용함으로써 기능 확장을 하면서도 기존 코드를 수정하기 않도록 만들어 줍니다. 여기서, 변화되는 부분을 추상화할 수 있도록 도와주는 원칙이 바로 의존 역전 원칙이고, 다형성을 도와주는 원칙이 리스코프 치환 원칙인 것입니다.

 

 

출처

개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균

 

 

DIP(Dependency Inversion Principle) : 의존 역전 원칙

# DIP(Dependency Inversion Principle) : 의존 역전 원칙 "자신보다 변하기 쉬운 것에 의존하지 마라." 자동차와 스노우타이어 사이에는 [그림1]처럼 의존 관계가 있다. 자동차가 스노우타이어에 의존한다.

server-engineer.tistory.com

댓글

추천 글