💡 리스코프 치환 원칙
리스코프 치환 원칙이란
<aside>
💡 자료형 S가 자료형 T의 Subtype 이라면, T의 객체를 S의 객체로 치환 할 수 있어야 한다
</aside>
- B가 A의 자식 타입이면, 부모 타입인 A객체는 자식 타입인 B로 치환 해도 작동에 문제가 없어야 한다는 것
원칙이 지켜지지 않았을 때의 단점
- 부모 클래스의 객체를, 자식 클래스의 객체로 치환 했을 시 유저가 바라보기엔 정말 이상한 행동을 하게 될 수 있음
- 심지어 crash / exception도 발생 가능
리스코프 치환이 제대로 이루어 지지 않은 예시
Rectangle / Square의 예시
class Rectangle() {
var height = 0
var width = 0
}
class Square() : Rectangle() {
fun setSide(len: Int) {
height = len
width = len
}
}
- 위 경우는, 정사각형 ( Square )이 직사각형 ( Rectangle )을 상속 받고 있음
- 이 경우, 직사각형의 객체를 정사각형 객체로 바꾸는 경우 문제가 있을 수 있음
- 정사각형의 경우 height와 width를 동시에 변경 해야 하지만, 직사각형은 그렇지 않기 때문
- 따라서 Rectangle 클래스를 사용하는 유저의 경우, 잘못된 상속에 이상한 행동을 할 수 도 있음
Java의 Stack / Vector ( list )의 예시
- 리팩터링 - 상속다루기 에서 나왔던 Stack / Vector의 예시
- Vector가 부모 클래스 이기 때문에, Stack을 치환 하면 Stack의 행동과는 다른 의도치 않은 행동을 하게 될 수 있는 코드들이 많음