0. 개요
- SOLID 원칙이란 객체 지향 프로그래밍(OOP) 설계 5원칙을 의미한다.
- OOP는 프로그래밍을 객체 간 상호작용으로 간주한다. 그리고 그 객체는 1) 추상화, 2) 상속, 3) 다형성, 4) 캡슐화라는 특징을 기반으로 설계될 것을 권장한다.
- 이를 통해, 개발자는 코드 재사용성, 유지보수의 용이성, 개발 생산성 제고라는 이익을 취할 수 있다.
- SOLID 원칙은 그러한 OOP를 통한 이익을 극대화하기 위한 설계 원칙이라고 간주된다.
- 그러한 SOLID 원칙은 다음과 같이 5개 원칙으로 구성되어 있다.
- SRP(단일 책임 원칙)
- OCP(개방 폐쇠 원칙)
- LSP(리스코프 치환 원칙)
- ISP(인터페이스 분리 원칙)
- DIP(의존 역전 원칙)
- 각 원칙이 강조하는 개념은 명확히 구분되는 개념들이 아니다. 각 원칙에서 지향하는 개념들은 상호 연관되어 있다.
1. SRP(단일 책임 원칙)
- SRP는 하나의 클래스는 하나의 책임만 가져야한다는 설계 원칙이다. 이 때, 책임이라는 것은 하나의 "기능"을 의미한다고 생각하면 된다.
- 하나의 클래스에 여러 책임을 부여하게 되면, 해당 클래스가 담당하는 책임 중 몇가지에서 변경사항이 생겼을 떄, 수정해야하는 코드가 복잡해질 수 있다. 아울러, 클래스가 담당하는 기능이 여러개면, 코드의 가독성 또한 떨어질 수밖에 없다.
- 즉, SRP는 클래스의 책임을 명료화하여, 유지보수의 용이성을 극대화하기 위한 설계원칙이라 할 수 있겠다.
2. OCP(개방 폐쇠 원칙)
- OCP는 클래스는 확장에는 열려있고, 변경에는 닫혀있어야 한다는 설계 원칙이다.
- 이 때, 변경에 닫혀있어야 한다는 것은 실제 사용되고 있는 클래스에 변경사항이 생겼을 때, 해당 클래스를 직접적으로 수정해야만 하는 구조를 지양해야한다는 것으로 이해된다.
- 즉, OCP는 코드 재사용성을 극대화하기 위해 OOP의 특징인 상속과 다형성을 잘 구현하는 것을 권장하는 설게원칙이라 할 수 있겠다.
3. LSP(리스코프 치환 원칙)
- LSP는 하위 클래스는 언제나 상위 클래스로 대체될 수 있어야 한다는 설계 원칙이다.
- 즉, LSP는 OOP의 특징인 다형성을 지향하는 구조를 권장하는 설계원칙이라고 할 수 있겠다.
4. ISP(인터페이스 분리 원칙)
- ISP는 인터페이스에 대한 단일 책임을 강조하는 설계 원칙이다.
- 구체적으로, 인터페이스에 대한 단일 책임을 지향함으로써, 인터페이스를 구현한 클래스가 클래스에서 불필요한 기능을 포함하지 않게끔 해야한다는 것이다.
5. DIP(의존 역전 원칙)
- DIP는 어떤 객체를 참조해야할 떄, 변화하기 쉬운 것보다는 변화하기 어려운 것에 의존해야한다는 설계 원칙이다.
- 이 때, 변화하기 쉬운 것은 구체적인 맥락으로 구현된 클래스를 의미하고, 변화하기 어려운 것은 어떤 대상을 추상화한 인터페이스, 추상 클래스를 의미한다.
- 즉, DIP는 상속 관계를 구현할 때, 구체적인 구현체보다는 그것의 기반이 되는 추상화 인터페이스와 추상 클래스에 의존하라는 설계원칙이다.
- DIP를 통해서 개발자는 객체 간 결합도를 낮출 수 있다.
- 예컨대, 객체 A는 인터페이스 B로 구현된 객체 C,D,E에 상황에 따라 의존해야한다고 했을 떄, DIP를 통해 인터페이스 B만 의존함으로써 다형성을 이용해 객체 A의 다른 객체와의 결합도를 낮추는 것이다.
- 이처럼, DIP는 객체의 다형성이란 특징을 이용해서 객체 간 결합도를 낮추고, 이를 통해 코드 재사용성과 유지보수의 용이성의 이득을 극대화하기 위한 설계원칙으로 이해된다.
6. 정리
- SOLID 원칙은 OOP의 특징을 잘 살려, 이를 통한 개발 생산성을 극대화하기 위한 설계원칙으로 이해된다.
- SOLID는 총 5개 원칙으로 구성되어 있고, 각 원칙은 독립적인 내용이 아니며 상호 연관된다.
- SRP(단일책임원칙)
- 하나의 클래스는 하나의 책임(기능)만 가져야한다.
- 코드 가독성, 유지보수의 용이성
- OCP(개방폐쇠원칙)
- 클래스는 확장에 열려있고, 변경에 닫혀있어야 한다.
- 다형성과 상속에 대한 강조 -> 코드 재사용성, 유지보수의 용이성 극대화
- LSP(리스코프 치환 원칙)
- 하위 클래스는 언제나 상위 클래스로 교체될 수 있어야 한다.
- 다형성에 대한 강조
- ISP(인터페이스 분리 원칙)
- 클래스와 마찬가지로 인터페이스는 하나의 책임만 가져야한다.
- 추상화에 대한 강조
- DIP(의존 역전 원칙)
- 변화하기 쉬운 것(구현체)보다는 변화하기 어려운 것(인터페이스, 추상 클래스)에 의존해야 한다.
- 다형성에 대한 강조 -> 코드 재사용성 극대화
7. 참고자료
- https://minkwon4.tistory.com/281
'디자인패턴, 프로그래밍 패러다임, 아키텍처 > OOP' 카테고리의 다른 글
객체와 OOP의 4가지 특징 (0) | 2023.03.03 |
---|