SOLID란 객체지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 앞 글자만 따서 만든 단어로써, 프로그래머가 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 적용이 된다. SOLID는 각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)를 의미하며 아래에서 더 자세히 설명하고자 한다.
1) SRP(Single Responsiblity Principle) : 단일 책임 원칙
한 클래스는 하나의 책임만 갖는다.
- 책임이라는 것이 다소 모호해서 설계 경험이 제일 중요하다. 보통 설계에서는 책임이라는 것을, '변경'을 기준으로 삼는데, 코드의 변경이 있을 때, 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이 된다.
2) OCP(Open-Closed Principle) : 개방- 폐쇄 원칙
확장에는 열려(Open) 있고 변경에는 닫혀(Closed) 있어야 한다.
- 같은 유형의 프로그램의 변경이 더 이상의 수정을 유발하지 않도록 하는 것이다. 즉, 기능을 새롭게 추가하거나 변경 할 때,
기존의 코드를 변경하지 않아도, 새로운 코드를 추가함으로써 구현이 가능하게 하는 것이다. 주로 인터페이스를 사용하여 구현한다.
3) LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 부모 클래스에서 가능한 행위를 자식 클래스도 수행 할 수 있어야 한다는 원칙이다. 이해가 어렵기 때문에 예시를 들어 보겠다. 예를 들어, 자동차 기능이라는 부모 클래스와 각각 승용차, 버스라는 자동차 기능을 상속받은 자식 클래스가 있다고 가정하자. 자동차 기능에는 엑셀(앞으로 간다고 가정)과 브레이크 동작을 하는 메서드가 있다고 하자. 만약 자식 클래스인 승용차가 엑셀 메서드를 불렀을 때, 부모 클래스의 메서드 기능인 '앞으로 가는 행위'를 한다면, 리스코프 치환 원칙이 지켜진것이다. 하지만 버스라는 자식클래스가 엑셀 메서드를 불렀을 때, '뒤로가는 행위'를 한다면 이것은 리스코프 치환 원칙이 잘 지켜지지가 않은 것이다.
4) ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 자신이 사용하지 않는 인터페이스(기능)에는 영향을 받으면 안된다는 의미이다.
5) DIP(Dependency Inversion Principle) : 의존관계 역전 원칙
프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다."
- 코드가 구현 클래스에 의존하지 말아야 하고, 인터페이스나 추상 클래스에 의존해야한다는 원칙이다. 인터페이스에 의존하게 설계하면, 역할에 의존하게 설계 하는것이고 구현에 의존하지 않는 설계가 된다.