티스토리 뷰

반응형

LSP(Liskov Substitution Principle - 리스코프 치환 원칙)

  • 서브타입은 언제나 자신이 기반타입 (base type) (상위 타입) 으로 교체할 수 있어야 한다.

S-O-L-I-D로 유명한 다섯가지 객체지향 설계 원칙중에서 LSP는 '상속'에 관한 지침을 이야기 합니다.

 

오리와 오리장난감

LSP를 설명하는 유명한 예제로 오리와 오리장난감이 있습니다. 오리와 오리장난감이 유사한 점이 있다고 오리장난감이 오리를 상속받게 되면 LSP를 위반하게 된다는 예제입니다. 왜냐하면 오리장난감은 배터리가 있어야 제대로된 동작을 하기 떄문입니다. 만약 오리를 기대하던 클라이언트(사용자)에게 오리 대신 오리장난감을 쥐어준다면, 클라이언트는 자신이 원하는 행동을 기대하기 어렵습니다. 

 

오리장난감은 기반타입(상위타입)의 오리를 대체할 수 없기 때문에 상속구조로 구현된다면 LSP를 위반하게 됩니다.

 

 

오리와 오리장난감은 진짜 LSP 위반일까?

오리와 오리장난감 예제는 유명하기 때문에 이 예제가 LSP를 위반하는 것이라고 기계적으로 답변한다면 아마 그 사람은 익히 알고 있는 예제에 '배터리'를 떠올렸기 때문입니다.

 

리스코프 치환원칙의 맹점은 서브타입이 기반타입(상위타입)으로 교체 될 수 있어야 한다이고 이는 단순히 서브타입과 상위타입의 문제가 아니라 이를 의존하고 있는 클라이언트에게 적합한지를 생각해야 한다는 점입니다.

 

클라이언트가 오리를 그저 호수위에 둥둥떠있는 장식품 정도로 생각한다면, 이는 배터리가 없는 오리장난감으로도 멋지게 대체 될 수 있습니다.

 

(SRP에서도 비슷한 얘기를 했었는데) 리스코프 치환원칙을 준수하냐 안하냐를 생각할때는, 단순히 서브타입과 상위타입간의 관계만 생각하는 것이 아니라 이를 사용하고 있는 클라이언트가 어떤식으로 객체를 사용하고 있는지 거시적인 관점에서 생각해봐야 합니다.

 

그러므로 오리와 오리장난감에서 클라이언트의 사용방식과 '배터리'를 함께 언급하지 않는다면 이는 LSP를 위반한다고 볼 수 없습니다.

반응형
댓글