본문 바로가기
Dev/Clean Code

[클린 소프트웨어] PART 2 - CHAPTER 10 - 리스코프 치환 원칙(LSP)

by 돈코츠라멘 2022. 2. 8.
서브타입(subtype)은 그것의 기반 타입(base type)으로 치환 가능해야 한다.

 

LSP; Liskov Substitution Principle

1988년 바버라 리스코프(Barbara Liskov)가 처음으로 작성해서 리스포크 치환 원칙이라고 불린다. 그녀는 다음과 같이 말했다.

타입 S의 각 객체 o1과 타입 T의 각 객체 o2가 있을 때, T로 프로그램 P를 정의했음에도 불구하고 o1이 o2로 치환될 때 P의 행위가 변하지 않으면, S는 P의 서브타입니다.

이 원칙은 반대로 위반한 결과를 생각하면 더 쉽다. 어떤 함수 f가 인자로 클래스 B를 참조하고 있따고 생각해보자. B의 파생 클래스 D가 B를 가장해 f에 넘겨졌을 때 f가 의도한대로 동작하지 않는다면 D는 f에 대해 취약하며 LSP를 위반한다. f의 작성자는 D에 대한 테스트를 넣어 D를 넘겨받아도 f가제대로 동작할 수 있도록 하고 싶을 것이다. 이 경우 테스트는 f가 B의 모든 파생 클래스에 대해 닫혀 있지 않기 때문에 OCP를 위반한다. 👉 LSP 위반은 대개 심각하게 OCP를 위반하는 런타임 타입 정보(RTTI: Run-Time Type Information) 사용으로 이어진다. (가장 대표적인 예: 객체의 타입에 따라 if/else로 나눠지는 코드)

fun drawShape(s:Shape) {
  when(s) { // Shape의 subtype이 추가될 때마다 아래 코드가 변경되어야 한다. -> OCP 위반!!! 
    is Square -> /* do something */
    is Circle -> /* do something */
  }
}

LSP는 OCP를 가능하게 하는 주요 요인 중 하나다. 이것은 기반 타입으로 표현된 모듈을 수정 없이도 확장 가능하게 만드는, 서브타입의 치환 가능성을 말한다. 

 


Reference

  • Robert C. Martin - <Clean Software(Agile Software Development)>

책에 나오는 예제 코드는 제외
그냥 내가 기억하고 싶은 내용 위주로 정리

 

 

Related

 

[클린 소프트웨어] PART 2 - CHAPTER 9 - 개방 폐쇄 원칙(OCP)

소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. OCP; Open-Closed Principle OCP를 따르는 모듈은 다음과 같은 두 가지 속성을 갖는다. Open:

deep-dive-dev.tistory.com

 

댓글