#SOLID 객체지향 프로그래밍은 유지보수와 확장에 유용하고, 유연하며, 재사용성이 좋은 시스템을 만들 수 있게 해준다. SOLID는 이러한 객체지향의 5가지 핵심 원칙이다. SOLID란 이름은 5가지 핵심 원칙의 첫 글자를 따서 지어졌다. SOLID원칙을 지킨다면 효율적으로 객체지향 프로그래밍을 구현할 수 있으며, 기존의 코드는 리팩토링하여 개선할 수 있다.
#단일 책임 원칙(SRP, Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야 한다. 클래스는 자신의 책임을 완전히 캡슐화해야한다. 이는 클래스를 더 튼튼하게 만들어준다. 강아지라는 클래스가 있다면 강아지 클래스는 강아지로서의 책임을 다해야한다. 강아지 클래스는 강아지로서의 기능을 제공해야하며 그 이상의 책임을 가져서는 안된다.
#개방-폐쇄 원칙(OCP, Open-Closed Principle) 개체는 확장에 대해서는 열려있어야하고, 수정에 대해서는 앋혀 있어야 한다. 만일 클래스의 내용(코드)를 변경하게 된다면 이를 참고하고 있는 모든 클래스에 영향이 갈 수도 있다. 하지만 확장을 사용하면 기존의 코드 변경 없이 새로운 기능을 추가하거나 기존의 기능을 변경할 수 있다. 확장의 가장 핵심이되는 개념은 추상화로서, Java와 같은 객체지향 언어는 추상화와 관련된 기능을 제공한다. 이를 통해 유연성, 재사용성, 유지보수성 등을 보다 효율적으로 얻을 수 있다.
확장이라고 하면 곧 상속을 생각할 수도 있는데, 여기에서 확장은 상속이외에도 포함관계도 포함한다. 무조건 적은 상속은 때때로 독이 될 수도 있다. 추상화 과정에서 클래스 간의 관계가 is-a관계인지 has-a관계인지 파악하여 구현해야 한다.
#리스코프 치환 원칙(LSP, Lskov Substitution Principle) S클래스가 T클래스의 하위 클래스라면 아무 문제 없이 T클래스는 S클래스로 치환될 수 있어야한다. 이를 다시 간단하게 말하자면 다형성을 말한다고 할 수 있다. 하위 클래스인 S클래스는 상위 클래스인 T클래스의 규칙(또는 인터페이스)을 지켜야하며, 그 성질과 책임이 유지되어야한다. 즉, S클래스와 T클래스는 is-a관계이어야 한다.
#인터페이스 분리 법칙(ISP, Interface Segregation Principle) 큰 덩어리의 인터페이스를 구체적으로 나누어 클라이언트에게 꼭 필요한 메서드들만 이용할 수 있게 하는 것이다. 이는 인터페이스에 대한 단일 책임 원칙으로 볼 수 있다. 인터페이스는 사용자가 필요로하는 메서드를 제공해야한다. 인터페이스를 구현하는 클래스는 정의된 메서드를 구현해야하며, 인터페이스 이외의 메서드가 사용자에게 종속되는 것을 피해야 한다. 이를 통해 시스템 내부의 의존성을 약화시켜 확장성 및 유연성 등을 키울 수 있다.
#의존관계 역전 원칙(DIP, Dependency Inversion Principle) 상위 클래스는 하위 클래스에 의존해서는 안된다. 상위와 하위 모두 추상화에 의존해야 한다. 추상화는 세부 사향에 의존해서는 안되고, 세부사항이 추상화에 의존해야 한다. 이는 상위 클래스와 하위 클래스의 관계를 느슨하게 하는 것이다.