내용
Info
LSP (Listov Substitution Principle, 리스코프 치환 원칙)를 위반하는 전형적인 문제
--- title: 정사각형/직사각형 문제 --- classDiagram class Rectangle{ +setH +setW } User ..> Rectangle Square --|> Rectangle Square: +setSide
Square는 Rectangle의 하위 타입으로 적절하지 않다.
Rectangle에서의 높이와 너비는 독립적으로 변경될 수 있는 반면에 Square는 높이와 너비가 함께 변경되어야 하기 때문이다.
User가 현재 객체를 Rectangle이라고 고려하고 있지만 Square의 동작을 수행한다면 혼동이 생길 수 있다.
Rectangle r = new Square(10);
r.setW(5);
r.setH(2);
assert(r.area() == 10); // → Assertion Error
이런 LSP 위반을 막기 위한 유일한 방법은 Rectangle이 실제로 Square인지를 검사하는 매커니즘이 User에 추가되어야 한다. 하지만 User의 행위가 사용하는 타입에 따라 의존하게 되는 것이고 서로 타입을 치환하지 못하는 것이다.