객체 지향 프로그래밍을 하면서 지켜야하는 5대 원칙
각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), DIP(의존 역전 원칙), ISP(인터페이스 분리 원칙)의 앞글자를 따서 만들어졌다.
SOLID 원칙을 철저히 지키면 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 되는 것으로 알려져있다.
🐣 해당 프로젝트에서는 각각의 원칙에 대해 위배된 코드를 생각해보고 위배된 코드를 해결해보는 시간을 가져보고자 한다.
클래스(객체)는 단 하나의 책임만 가져야 한다는 원칙
- 클래스가 오직 하나의 목적이나 이유로만 변경되어야 한다는 것을 강조 (“책임”이란 단순히 메서드의 개수를 뜻하지 않고, 특정 사용자나 기능 요구사항에 따라 소프트웨어의 변경 요청을 처리하는 역할을 의미)
즉, 클래스는 한 가지 변화의 이유만 가져야 하며, 이를 통해 변경이 발생했을 때 다른 기능에 영향을 덜 미치도록 설계됩니다. 이렇게 하면 유지보수가 쉬워지고 코드가 더 이해하기 쉬워집니다.
확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다는 원칙
- 확장: 새로운 타입을 추가함으로써 새로운 기능을 추가하는 것
- 폐쇄: 확장이 일어날 때 상위 레벨의 모듈이 영향을 받지 않아야 함
- 이를 통해서 모듈의 행동을 쉽게 변경할 수 있다. (모듈이란 크기와 상관없이 클래스, 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소를 의미)
서브 타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙
- 서브 타입은 상위 타입이 약속한 규약을 지켜야 함을 강조
- 이 원칙은 부모 쪽으로 업 캐스팅하는 것이 안전함을 보장하기 위해 존재
- LSP를 위반하는 대표적인 사례: Rectangle
인터페이스를 각각 사용에 맞게 끔 잘게 분리해야한다는 설계 원칙
어떤 Class를 참조해서 사용해야하는 상황이 생긴다면, 그 Class를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조하라는 원칙 (상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 되며, 모두 추상화에 의존해야 함을 강조)