9장 LSP: 리스코프 치환 원칙

S 타입의 객체 o1과 T 타입의 객체 02가 있을 때, 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면 S는 T의 하위 타입이다.

상속을 사용하도록 가이드하기

Licence라는 인터페이스는 PersonalLicense와 BusinessLicense라는 두 가지 하위 타입을 갖고, 두 하위 타입은 서로 다른 알고리즘을 이용해 라이센스 비용을 계산한다.

이러한 설계는 LSP를 준수한다. License를 사용하는 측에서 어떤 하위타입을 사용하는지에 의존하지 않기 때문이다. 두 하위 타입은 모두 License 타입으로 치환할 수 있다.

정사각형/직사각형 문제

정사각형은 직사각형의 하위 타입으로 적합하지 않은데, Rectangle의 높이와 너비는 독립적으로 변경될 수 있지만 정사각형의 높이와 너비는 함께 변경되기 때문이다.

이러한 LSP 위반을 막기 위해 타입을 검사하는 로직을 추가할 수 있지만 클라이언트의 행위가 사각형 타입에 의존하게 된다.

LSP와 아키텍처

객체 지향 등장 초기에는 LSP가 상속을 사용하도록 가이드하는 방법 정도로 간주되었다. 하지만 시간이 지나면서 LSP는 인터페이스와 구현체에도 적용되는 광범위한 소프트웨어 설계 원칙으로 변했다.

결론

LSP는 아키텍처 수준까지 확장할 수 있고 반드시 확장해야만 한다. 치환 가능성을 조금이라도 위배하면 시스템 아키텍처가 오염되어 상당량의 별도 메커니즘을 추가해야할 수 있기 때문이다.

Last updated