객체지향의 4대 특성은 객체지향이 개발자에게 줄 수 있는 장점이라면 SOLID 원칙은 이러한 강점을 최대한 살리기 위해 지켜야할 원칙을 제시한 개념이다.
1. SRP, 단일 책임 원칙 → 추상화
“어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이여야 한다.” - 로버트 C. 마틴
- 하나의 클래스는 하나의 책임만 가진다.
- 이 책임의 범위는 모호하기 때문에, 수정할 때 생겨나는 파급력이 적다면 SRP가 잘 지켜지고 있다고 판단한다.
2. OCP, 개방-폐쇄 원칙 → 상속
, 다형성
“모든 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.” - 로버트 C. 마틴
- 확장에는 열려있고 수정에는 닫혀있어야 한다.
- 다형성의 원칙과 직접적으로 연결된 원칙이다.
- 인터페이스를 구현하기 위한 클래스로 확장은 무한히 가능하지만, 인터페이스를 수정하게 된다면 모든 상속 클래스에 영향을 줄 수 있다.
3. LSP, 리스코프 치환 원칙 → 상속
“서브 타입은 언제나 자신의 기반 타입으로 교체될 수 있어야 한다.” - 로버트 C. 마틴
- 하위 클래스는 언제나 상위 클래스를 대체할 수 있어야 한다.
- 하나의 객체가 수행하는 역할에 대한 규약을 지켜야한다.
- 마우스 왼쪽 버튼이 클릭으로 정해져 있는 것처럼!
4. ISP, 인터페이스 분리 원칙 → 상속
“클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.” - 로버트 C. 마틴
- 인터페이스를 여러개로 나눠서 기능을 구현해야 한다.
- 기능별로 인터페이스를 쪼개면 쪼갤수록 완벽한 OOP가 가능하다.(이론적으로는)
- 인터페이스 최소주와 관련
- SRP와 비교해서 같은 문제를 다른 시각으로 보고 해결책을 제시하는 원리
5. DIP, 의존관계 역전 원칙 → 상속
“추상화된 것은 구체화된 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다.” - 로버트 C. 마틴
- 추상화에 의존해야한다. 구체화에 의존해선 안된다.
- 즉, 인터페이스를 바라보고 이에 연결된 객체를 통해서 작동해야 한다.
💡 개인적인 견해
- 추상화를 최대한 지켜낸 설계 → SRP
- 상속과 다형성을 어떻게 활용해야 최상의 성능을 낼 수 있는지를 정의해주는 것 → OCP, LSP, ISP, DIP
- 상속과 다형성을 지키며 코드를 작성하다 보면 비슷한 코드를 작성하게 된다.