내용
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의 행위가 사용하는 타입에 따라 의존하게 되는 것이고 서로 타입을 치환하지 못하는 것이다.