Single Responsibility Principle
한 클래스는 하나의 책임만 가져야 한다.
하나의 책임이라는 것은 모호하다.
중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적을수록 단일 책임 원칙을 잘 따른 것이다.
EX: UI 변경, 객체의 생성과 사용을 분리.
Open/Closed Principle
코드를 변경하지 않으면서 확장을 어떻게 해야하는가? 정답은 다형성이다.
//Car car = new K3("K3 자동차");
Car car = new Sonata("쏘나타");
뭔가 이상하다. 분명 변경에는 닫혀있어야한다고 했는데, K3에서 Sonata로 변경한데 있어 주석을 통해 코드를 변경했다. 다형성을 사용했는데도 코드를 변경함으로써 OCP 원칙을 위반하고 말았다.
그럼 어떻게 해야할까? 이를 해결하기위해 객체 생성, 관계수립을 해주는 설정자가 필요하다.
Liskov substitution principle
프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다.
⇒ 특정 인터페이스(Car)에서 전진기능(go)이 있다고 할때 구현체에서는 전진이라는 책임을 다해야지 특정 구현체가 전진기능을 수행할 때 전진이 아닌 후진이나 우회전등을 한다면 LSP 원칙에 위배된다.
컴파일단계에서 생기는 문제는 아니지만 클라이언트는 특정 역할을 사용할 때 해당 기능에 대해 기대하는 책임이 있기에 해당 책임을 수행할것을 믿고 동작하는것이기에 이 원칙이 필요하다.