서브타입(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
'Dev > Clean Code' 카테고리의 다른 글
객체 지향 설계 - SOLID 원칙 (0) | 2022.02.15 |
---|---|
[클린 소프트웨어] PART 2 - CHAPTER 12 - 인터페이스 분리 원칙(ISP) (0) | 2022.02.15 |
[클린 소프트웨어] PART 2 - CHAPTER 9 - 개방 폐쇄 원칙(OCP) (0) | 2022.02.07 |
[클린 소프트웨어] PART 2 - CHAPTER 8 - 단일 책임 원칙(SRP) (0) | 2022.01.21 |
[클린 소프트웨어] PART 2 - CHAPTER 7 - 애자일 설계란 무엇인가? (0) | 2022.01.18 |
댓글