틀린 내용이 있을 수도 있습니다!
“리스코프 치환 원칙은 기능의 명세(또는 계약)에 대한 내용이다. 명시된 명세에서 벗어난 기능을 수행하거나, 값을 리턴하거나, 익셉션을 발생하는 것이 흔한 위반 사례이다.”
상위 타입의 객체를 하위 객체로 바꾸어도 정상적으로 동작해야한다
여기서 "정상적으로 동작해야한다"는 단순히 메서드를 사용할 수 있느냐 없느냐가 아니라 상위 객체에서 의도한데로 작동할 수 있는가를 의미한다.
상위 객체와 하위 객체의 행위가 일관성이 있어야 한다
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다. 상위 타입에서 정한 명세를 하위 타입에서도 그대로 지킬 수 있을 때 상속을 해야 한다. 즉, 상속을 할 경우 일반 메서드를 오버라이드하게 되면 이는 LSP를 어기게 된다.
예외 처리 역시 고려해야 한다
인터페이스를 구현하는 모든 클래스가 특정한 Exception이 발생하는지 또한 LSP와 관련된 고려 사항이다.
LSP는 polymorphism에 대한 원칙을 제공한다
변경에는 닫혀 있고 확장에는 열려 있어야한다는 원칙이다.
기능을 변경하거나 확장할 수 있더라도 기능을 사용하는 코드에 영향을 주어서는 안된다. 이를 위해서는 확장되는 기능 부분을 추상화 해야한다.
OCP는 호출될 때 polymorphism이 일어난다
위의 내용을 통해서 OCP와 LSP가 밀접한 관련이 있음을 알 수 있었다.
LSP가 위반되면 OCP도 위반된다.
LSP를 위반하면 서브타입이 추가될 때 마다 클라이언트들이 수정되어야 한다.
Instanceof/downcasting LSP와 OCP 위반 증상
정확한 타입이 무엇인지 알아야하는 상황이 와서는 안된다. 다형성의 의미가 없어진다.