LSP
LSP는 OCP(개방폐쇄원칙)을 받쳐주는 다형성에 관한 원칙을 제공한다. 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
instanceof
그래서 instanceof
연산자는 타입을 확인하는 기능을 사용하기 때문에 LSP 원칙이 깨지는 주요 현상이다.
Example
before)
public class Order {
public int calcuateDiscountAmount(Item item) {
if (item instanceof Food) // LSP 위반
return 0;
return item.getPrice() * discountRate;
}
}
after)
public class Item {
public boolean isDiscountAvailable() {
return true;
}
}
public class Food extends Item {
// 하위 타입에서 알맞게 오버라이딩
@Override
public boolean isDiscountAvailable() {
return false;
}
}
public class Order {
public int calcuateDiscountAmount(Item item) {
if (item instanceof Food) // LSP 위반
return 0;
return item.getPrice() * discountRate;
}
}
참고
- Jungwoon Blog - 객체지향 설계 5대 원칙 - SOLID
- 책 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해