begaonnuri
  • 소개
  • Book
    • 이펙티브 코틀린
      • 아이템 1. 가변성을 제한하라
      • 아이템 2. 변수의 스코프를 최소화하라
      • 아이템 3. 최대한 플랫폼 타입을 사용하지 말라
      • 아이템 4. inferred 타입으로 리턴하지 말라
      • 아이템 5. 예외를 활용해 코드에 제한을 걸어라
      • 아이템 6. 사용자 정의 오류보다는 표준 오류를 사용하라
      • 아이템 7. 결과 부족이 발생할 경우 null과 Failure를 사용하라
    • 클린아키텍처
      • 1장 설계와 아키텍처란?
      • 2장 두 가지 가치에 대한 이야기
      • 3장 패러다임 개요
      • 4장 구조적 프로그래밍
      • 5장 객체 지향 프로그래밍
      • 6장 함수형 프로그래밍
      • 7장 SRP: 단일 책임 원칙
      • 8장 OCP: 개방-폐쇄 원칙
      • 9장 LSP: 리스코프 치환 원칙
      • 10장 ISP: 인터페이스 분리 원칙
      • 11장 DIP: 의존성 역전 원칙
      • 12장 컴포넌트
      • 13장 컴포넌트 응집도
      • 14장 컴포넌트 결합
      • 25장 계층과 경계
Powered by GitBook
On this page
  • 상속을 사용하도록 가이드하기
  • 정사각형/직사각형 문제
  • LSP와 아키텍처
  • 결론
  1. Book
  2. 클린아키텍처

9장 LSP: 리스코프 치환 원칙

S 타입의 객체 o1과 T 타입의 객체 02가 있을 때, 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면 S는 T의 하위 타입이다.

상속을 사용하도록 가이드하기

Licence라는 인터페이스는 PersonalLicense와 BusinessLicense라는 두 가지 하위 타입을 갖고, 두 하위 타입은 서로 다른 알고리즘을 이용해 라이센스 비용을 계산한다.

이러한 설계는 LSP를 준수한다. License를 사용하는 측에서 어떤 하위타입을 사용하는지에 의존하지 않기 때문이다. 두 하위 타입은 모두 License 타입으로 치환할 수 있다.

정사각형/직사각형 문제

정사각형은 직사각형의 하위 타입으로 적합하지 않은데, Rectangle의 높이와 너비는 독립적으로 변경될 수 있지만 정사각형의 높이와 너비는 함께 변경되기 때문이다.

이러한 LSP 위반을 막기 위해 타입을 검사하는 로직을 추가할 수 있지만 클라이언트의 행위가 사각형 타입에 의존하게 된다.

LSP와 아키텍처

객체 지향 등장 초기에는 LSP가 상속을 사용하도록 가이드하는 방법 정도로 간주되었다. 하지만 시간이 지나면서 LSP는 인터페이스와 구현체에도 적용되는 광범위한 소프트웨어 설계 원칙으로 변했다.

결론

LSP는 아키텍처 수준까지 확장할 수 있고 반드시 확장해야만 한다. 치환 가능성을 조금이라도 위배하면 시스템 아키텍처가 오염되어 상당량의 별도 메커니즘을 추가해야할 수 있기 때문이다.

Previous8장 OCP: 개방-폐쇄 원칙Next10장 ISP: 인터페이스 분리 원칙

Last updated 3 years ago