SOLID란?
로버트 마틴 이 객체 지향 프로그래밍 설계를 할때 지켜야 할 규칙을 정의한 것으로 SRP, OCP, LSP, DIP, ISP의 앞글자를 따 만들어진 것이다.
1. SRP 단일 책임 원칙 ( Single Responsibility Principle )
한 클래스는 하나의 책임만 가져야 한다.
Car 클래스에는 전진하기, 후진하기, 멈추기, 엔진오일 갈기, 바퀴 갈기 의 기능이 있다.
보통 차를 사용할때, 사용자는 전진하기, 후진하기, 멈추기 의 기능을 사용하고
정비사가 엔진 오일 갈기, 바퀴 갈기 와 같은 기능을 사용한다.
SRP의 의미는 하나의 클래스는 하나의 actor를 담당해야 한다는 것이다.
어떤 클래스나 모듈을 변경하려는 이유를 단 하나의 이유만 가져야 한다는 뜻이다. 정비사의 기능을 변경하는 데 사용자의 기능 까지 영향을 주고 있는 Car 클래스를 변경해야 하는건 좋지 않은 설계이다.
→ 한 클래스는 한 관심사에 집중하도록 유지하자.
2. OCP 개방 - 폐쇄 원칙 ( Open / Closed Principle )
소프트 웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
→ 새로운 기능을 추가할 때 기존 코드는 변경을 변경하지 않고 유연하게 변경 사항을 적용할 수 있어야 한다.
Draw 클래스에 동그라미 그리기 라는 기능이 있다.
새로운 기능 사각형 그리가, 삼각형 그리기를 추가하려고 한다.
새로운 기능을 추가하기 위해서는 Draw 클래스를 수정해야하고, 변경에 닫혀있어야 할 기존 코드가 변경이 생기는 것이기 때문에,
OCP위반에 해당한다.
그러면 어떻게 확장에는 유연하되, 변경에는 폐쇄적일 수 있을까?
다형성(polymorphism) 이 OCP를 가능하게 해준다!
부모 인터페이스를 자식클래스를 통해 구현한다면 기존 코드는 건들지 않으면서 새로운 코드를 추가, 확장할 수 있다!
다형성이야 말로 OCP의 핵심 매커니즘이다.
변경과 확장이 잦은 코드들은 interface로 선언하고 구현을 통해 확장을 하는것이 좋은 방법이다!
3. LSP 리스코프 치환 원칙 ( Liskov Subsitution Principle )
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
무슨 말일까? "상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다."
라는 의미이다.
간단히 설명하면 Car이라는 부모타입이 있고 front()라는 앞으로 가는 함수가 있다.
만약 자식 타입의 객체가 front()를 다형성을 통해 뒤로 가는 기능으로 확장하면 ? LSP위반이다.
나는 이렇게 간단히만 알아 왔는데 https://steady-coding.tistory.com/383 이 글을 참고하면 더 도움이 될것 같다.
4. ISP 인터페이스 분리 원칙 ( Interface Segregation Principle )
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
5. DIP 의존관계 역전 원칙 ( Dependency Inversion Principle )
프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다."