클래스 하나가 하나의 책임만을 가진다.
만약 한 클래스에 여러가지 책임이 있다면 여러 개의 클래스로 나누어줘야한다.
책임을 적절히 분배하면 코드의 가독성 향상, 유지보수 용이라는 이점이 있다.
확장(상속)에는 열려있고 변경하는것에는 닫혀있어야 한다.
공통된 기능을 추상화해서 상위단계로 올려서 인터페이스나 추상객체를 만들고 하위에서는 그것을 상속받거나 구현해서 목적에 맞게 상세한 기능을 구현한다. 프로그램은 최대한 추상화된 클래스를 사용함으로써 신규 하위클래스나 변경에 종속되어서는 안된다.
변경될것과 변하지 않을 것을 구분한다. 그리고 변하는 것을 인터페이스로 정의하고, 하위 클래스에서는 인터페이스를 구현한다.
서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
ISP원리는 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원리다. 즉 어떤 클래스가 다른 클래스에 종속될때에는 가능한 최소한의 인터페이스만을 사용해야 한다. ISP는 '하나의 일반적인 인터페이스 보다는, 여러개의 구체적인 인터페이스가 낫다'라고도 정의할 수 있다. SRP와 유사하나 SRP는 클래스를 분리, ISP는 인터페이스를 분리하라고 말한다.
상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
SOLID 관련해서 잘 정리되어있는 블로그 https://www.nextree.co.kr/p6960/