본문 바로가기
아키텍처/클린 아키텍처

클린 아키텍처 - 설계원칙 - LSP

by SSaMKJ 2023. 2. 11.

설계원칙

SOLID

  • SRP: 단일 책임 원칙 Single Responsible Principle
  • OCP: 개방-폐쇄 원칙 Open-Closed Principle
  • LSP: 리스코프 치환 법칙 Liskov Substitution Principle
  • ISP: 인터페이스 분리 원칙 Interface Segregation Principle
  • DIP: 의존성 역전 원칙 Dependency Inversion Principle

 

LSP

  • 리스코프 치환 법칙 Liskov Substitution Principle

S 타입의 객체 o1 각각에 대응하는 T 타입 객체 o2가 있고, T 타입을 이용해서 정의한 모든 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다.

  • 이게 무슨 말인가... 그림으로 보면 쉽게 이해가 간다.

\[그림 3-1. License와 파생 클래스는 LSP를 준수한다.\]
  • 이 설계는 LSP를 준수하는데, Billing 애플리케이션의 행위가 License 하위 타입 중 무엇을 사용하는지에 전혀 의존하지 않기 때문이다. 이들 하위 타입은 모두 License 타입을 치환할 수 있다.

정사각형/직사각형 문제

[그림 3-2 악명 높은 정사각형/직사각형 문제]

  • 이 예제에서 Square는 Rectangle의 하위 타입으로는 적합하지 않다. Rectangle은 높이와 너비가 서로 독립적인 반면, Square는 높이와 너비가 같기 때문이다. User는 대화하고 있는 상대가 Rectangle이라고 생각하므로 혼돈이 생길 수 있다.
Rectangle r = ...
r.setW(5)
r.setH(2)
assert(r.area() == 10)
  • ... 코드에서 Square를 생성한다면 assert 문은 실패 할 것이다.

LSP와 아키텍처

  • 초창기에는 LSP는 상속을 사용하도록 가이드하는 방법 정도로 간주되었다. 하지만 시간이 지나면서 LSP는 인터페이스와 구현체에도 적용되는 더 광범위한 소프트웨어 설계 원칙으로 변모해 왔다.
  • 잘 정의된 인터페이스와 그 인터페이스의 구현체끼리의 상호 치환 가능성에 기대는 사용자들이 존재하기 때문이다.

결론

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

 

 

클린 아키첵처 전체 보기 

클린 아키텍처란? https://blog.kjslab.com/199
클린 아키텍처 - 설계원칙 - SRP https://blog.kjslab.com/200 
클린 아키텍처 - 설계원칙 - OCP https://blog.kjslab.com/201 
클린 아키텍처 - 설계원칙 - LSP https://blog.kjslab.com/202 
클린 아키텍처 - 설계원칙 - ISP https://blog.kjslab.com/203  
클린 아키텍처 - 설계원칙 - DIP & SOLID 요약 https://blog.kjslab.com/204 
클린 아키텍처 - 컴포넌트 https://blog.kjslab.com/205 
클린 아키텍처 - 컴포넌트 결합 - ADP https://blog.kjslab.com/206   
클린 아키텍처 - 컴포넌트 결합 - SDP https://blog.kjslab.com/207
클린 아키텍처 - 컴포넌트 결합 - SAP & 결론 https://blog.kjslab.com/208 

댓글