목차
- SOLID 란?
- 1. Single-responsibility principle
- 2. Open–closed principle
- 3. Liskov substitution principle
- 4. Interface segregation principle
- 5. Dependency inversion principle
- 참고자료
SOLID 란?
In object-oriented computer programming, SOLID is a mnemonic acronym
for five design principles intended to make software designs more
understandable, flexible, and maintainable. The principles are a
subset of many principles promoted by American software engineer
and instructor Robert C. Martin, first introduced in his 2000
paper Design Principles and Design Patterns. - Wikipedia
SOLID 란, 5개의 디자인 원칙의 앞글자를 따서 만든 축약어이다. 이 다자인 원칙들은 소프트웨어 디자인을 보다 이해하기 쉽고, 유연하게 만들며 관리하기 쉽게 하는 것이 목적이다. 로버트 마틴에 의해 처음 소개되었다.
5개의 디자인 원칙은 아래와 같다.
- SRP, Single-responsibility principle: 단일 책임 원칙
- OCP, Open–closed principle: 개방-폐쇄 원칙
- LSP, Liskov substitution principle: 리스코프 치환 원칙
- ISP, Interface segregation principle: 인터페이스 분리 원칙
- DIP, Dependency inversion principle: 의존관계 역전 원칙
1. Single-responsibility principle
단일 책임 원칙
- 모든 클래스는 오직 하나의 책임(responsibility)만을 가져야 한다.
- 여기서 책임이란, 바뀌어야하는 이유를 말한다.
- 예를 들어,
- 어떤 문서를 컴파일하고 출력하는 모듈이 있다고 가정하자.
- 그리고, 이 모듈이 변경되어야 할 이유 두 가지를 생각해보자; 문서의 내용이 변경되었을 때, 그리고 문서의 양식이 변경되었을 때
- 이 경우, 단일 책임 원칙에 따르면, 이 두 이유는 두 개의 책임이며, 이들은 각각 별도의 클래스나 모듈로 분리되어야 한다.
2. Open–closed principle
개방-폐쇄 원칙
- 소프트웨어 요소는 확장에는 열려있어야 하고, 변경에는 닫혀있어야 한다.
- 다시 말해, 클래스, 모듈, 함수와 같은 소프트웨어 요소는 자신의 코드를 변경하지 않으면서 자신의 행동을 확장할 수 있어야 한다.
3. Liskov substitution principle
리스코프 치환 원칙
- S가 T의 하위타입이라면, T 타입의 객체들은 정확성과 같은 프로그램의 속성을 변경하지 않고, S 타입의 객체로 대체될 수 있어야 한다.
- 이 원칙에 따르면, Java의 Interface를 이용한 다형성에서, 인터페이스를 구현하는 클래스는 인터페이스가 설계된 방식대로 작동해야한다. (이름만 같고 다른 방식으로 작동하면 안 된다.)
4. Interface segregation principle
인터페이스 분리 원칙
- (어떠한 클라이언트도 자신이 사용하지 않는 메서드들에 의존해서는 안 된다. 따라서,)
- 하나의 범용(general-purpose) 인터페이스보다, 특정 클라이언트를 위해 만들어진 인터페이스 여러 개가 더 좋다.
5. Dependency inversion principle
의존관계 역전 원칙
- 소프트웨어를 디자인할 때, 구체화가 아니라 추상화에 의존해야 한다.
- 이 원칙에 따르면, Java의 Interface를 사용할 때, 클라이언트가 인터페이스를 구현한 클래스가 아니라, 인터페이스에 의존하도록 코드를 작성하는 것이 더 바람직하다.
참고자료
- 스프링 핵심 원리 기본편, 김영한, inflearn
- Wikipedia