리스코프 교체 원칙 (Liskov Substitution Principle; LSP)
서브타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야한다.
if문과 instanceof 표현식이 수없이 많은 코드는 보통 LSP를 지키지 않아서 생기는 경우가 많다. 이는 곧 OCP도 지키지 않았다는 의미다.
LSP에 따르면, 기반 클래스(base class)의 사용자는 그 기반 클래스에서 유도된 클래스를 기반 클래스로써 사용하더라도 특별한 것을 할 필요없이 마치 우너래 기반 클래스를 사용하는 양 그대로 사용할 수 있어야 한다.
- 더 자세히 말하자면, instanceof나 다운캐스트(downcast)를 할 필요가 없어야 한다. 즉, 사용자는 파생 클래스에 대해서는 아무것도 알 필요가 없어야한다. (파생클래스가 있다는 사실조차도 몰라야한다.)
상속받은 자식 클래스의 어떤 함수를 호출하지 못하도록 제약사항을 걸려고 할때마다 아래의 방법들이 사용되면 LSP를 어기는 것은 아닐까 의심해볼수 있다.
- if문이나 instanceof 등과 같은 타입검사를 한다거나
- 미지원 예외(UnsupportedOperationException)를 던진다거나
- 해당 메서드에서 지원하지 않는 기능을 구분하기 위해 특정 값을 반환하거나
- 해당 메서드의 구현을 (아무것도 하지 않도록) 비워놓거나 의미없는 값을 반환하거나