- SRP(단일 책임 원칙): 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
- OCP(개방 폐쇄 원칙): 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
- LSP(리스코프 치환 원칙): 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
- ISP(인터페이스 분리 원칙): 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
- DIP(의존 역전 원칙): 자신보다 변하기 쉬운 것에 의존하지 마라.
Single Responsiblity Principle
"어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다."
Open Closed Principle
"(자신의)확장에 대해서는 열려 있어야 하지만 (주변의)변경에 대해서는 닫혀 있어야 한다."

※ 예시: 직원 교대라고 하는 주변의 변화에 손님의 구매 행위는 영향을 받지 않는 것이고, 직원의 교대라고 하는 확장 행위에는 열려있는 것이다.
Liskov Substitution Principle
하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.
"서브 타입은 자신의 기반 타입으로 교체할 수 있어야한다."
하위 클래스 is kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다.
구현 클래스 is able to 인터페이스 = 구현 분류는 인터페이스 할 수 있어야 한다.

Interface Segregation Principle
"클라이언트는 자신이 사용하지 낳는 메서드에 의존 관계를 맺으면 안 된다."
Dependency Inversion Principle
"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다."
==> "자신보다 변하기 쉬운 것에 의존하지 마라."