객체 지향 코드 개발 시 가급적 지켜야 한다고 여겨지는 원칙들의 모음으로, 다양한 디자인 패턴들이 SOLID 설계 원칙에 입각하여 만들어진 것임.
뿐만 아니라, 표준화 작업 및 아키텍처 설계에 이르기까지 다양한 설계 작업의 근본 원리로 이용된다.
결과적으로, 복잡성이 제거되어 개발의 생산성 향상에 용이함
아무리 S.O.L.I.D 라고 해도, 시스템을 고려하지 않고 원칙을 적용하면 불필요한 일이 발생할 수 있으므로, 각각의 원칙들은 코드의 목적에 맞게 적용할 것
: Single Responsibility를 가진다는 것은, Module이 오직 하나의 Actor에 대해서만 책임을 짐으로서, 모듈에 수정이 필요할 때 모듈 수정이 필요한 이유가 오직 한 가지인 상황을 보장하도록 할 수 있기 위함임.
만일 SRP가 지켜지지 않을 경우, 어떤 Action에 대한 책임이 여러 Module로 분산됨으로서, 모듈 수정의 연쇄성을 불러일으키거나, 최악의 경우 책임 순환으로 인해 정상적 수정이 불가능한 형태까지 다다를 수 있음.
SRP는 변경이 필요할 때 수정할 대상을 명확화함으로서, 프로그램 유지보수성을 증가시키는 것
: 모듈의 수정에 있어, 확장에는 Open되어 있어야 하고, 변경에는 Closed되어 있어야 한다는 원칙.
즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 해야 한다는 뜻.
이를 지키지 않으면, instanceof와 같은 연산자를 사용하거나, 다운 캐스팅 발생
결과적으로 OCP란, 모듈을 추상화시키는 것을 통해, 변하는 것들을 숨기고, 변하지 않는 것들에 의존하게 하여, 기존의 코드 및 클래스들을 수정하지 않은 채로 Application을 확장할 수 있도록 하여, 코드의 확장성을 증가시키는 것
: 어떤 Module을 Client 관점에서 볼 때, 부모 모듈과 자식 모듈의 액션이 항상 호환되게 하여, 하위 타입이 상위 타입을 대체 가능하도록 해야 한다는 원칙
즉, 상속관계에서는 꼭 일반화 관계 (IS-A)가 성립해야 한다는 의미
상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배됨 (재사용 목적으로 사용하는 경우)
LSP를 위반하면 OCP 또한 위반한다.
따라서 상속 관계를 잘 정의하여 LSP가 위반되지 않도록 설계해야 한다.
: ISP는 SRP의 개념이 Interface에 적용된 것이라고 볼 수 있는데, 이는 Client의 목적과 관심이 다르다면, 이 Client의 목적과 용도에 적합한 인터페이스만을 분리 제공하여 Client의 관심에 맞는 Public Interface만을 접근하도록 함으로서, 불필요한 간섭을 최소화하는 원칙이다.
요약하면
다만 한번 인터페이스를 분리 구성하였다면 이후 수정사항이 생겼을 때 인터페이스들을 재분리하는 행위를 가하지 말하야 한다
의존 관계 역전(Dependency Inversion)
구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역전
: Client가 어떤 Class를 참조해서 사용할 때, 해당 Class를 직접 참조하는 것이 아니라, 그 대상의 상위 요소 (추상 클래스, 인터페이스)로 참조하라는 원칙.
즉, 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에 의존해야 한다는 뜻이고, 이는 비즈니스 로직이 세부 사항이 아닌 추상적 사항에 의존해야 한다는 뜻이다.