- 클래스나 모듈은 한 가지 기능 또는 책임을 가져야 하며, 이를 초과하는 다른 책임을 포함해서는 안됨
- 클래스나 모듈의 응집도(cohesion)를 높이고, 변경 시점을 최소화하여 코드의 이해와 유지보수를 용이하게 만듦
Ex) UI 변경, 객체의 생성과 사용을 분리
- 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다는 것을 의미
- 새로운 기능이 추가되거나 변경이 필요한 경우에는 기존 코드를 수정하지 않고도 확장할 수 있어야 함
- 코드의 재사용성을 높이고, 유연성과 유지보수성을 향상시킴
- 상속 관계에서는 자식 클래스가 부모 클래스의 기능을 완전히 대체할 수 있어야 함
- 코드의 재사용성과 유연성을 높일 수 있음
Ex) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능, 뒤로 가게 구현하면 LSP 위반; 느리더라도 앞으로 가야함
- 클라이언트는 자신이 필요로 하는 기능만 포함하는 작은 인터페이스를 가져야 함
- 클라이언트와 구현 사이의 결합도를 줄이고, 인터페이스의 응집도를 높일 수 있음
- 의존성은 인터페이스나 추상 클래스와 같은 추상화된 개념에 의존해야 함 ( 구체화에 의존하면 안된다! )
- 코드 간의 결합도를 줄이고, 유지보수성과 테스트 용이성을 향상시킬 수 있음