노트

리스코프 치환 원칙

Liskov Substitution Principle

설계#architecture · 연결된 개념 5개

쉽게 말하면

리스코프 치환 원칙은 부모가 설 자리에 자식을 세워도 아무 문제가 없어야 한다는 약속이에요. 운전기사를 불렀는데 대신 온 사람이 면허는 있지만 후진을 못 하면 곤란하잖아요.

비유가 깨지는 곳 현실에서 '정사각형은 직사각형'이어도 코드에서는 아닐 수 있어요. 기준은 분류가 아니라 부모가 한 약속(사전조건·사후조건·예외)을 자식이 모두 지키는가예요.

부모 타입이 쓰이는 자리에 자식 타입을 넣어도 프로그램이 깨지지 않아야 한다는 원칙. 상속이 컴파일된다는 것만으로는 부족하고, 부모를 기대한 코드가 자식을 받아도 기대한 대로 동작해야 한다.

정사각형은 직사각형인가

수학적으로는 그렇지만 코드에서는 아닐 수 있다.

class Rectangle {
  constructor(protected w = 0, protected h = 0) {}
  setWidth(w: number) { this.w = w }
  setHeight(h: number) { this.h = h }
  area() { return this.w * this.h }
}
class Square extends Rectangle {
  setWidth(w: number) { this.w = this.h = w }
  setHeight(h: number) { this.w = this.h = h }
}
 
function check(r: Rectangle) {
  r.setWidth(5); r.setHeight(4)
  return r.area() === 20 // Square를 넣으면 16
}

Rectangle은 "너비와 높이를 따로 바꿀 수 있다"는 암묵적 약속을 하는데 Square가 그것을 어겼다. 상속의 기준은 현실의 is-a가 아니라 부모의 약속을 자식이 모두 지키는가다.

자식이 지킬 계약

  • 입력 조건을 부모보다 까다롭게 만들지 않는다(사전조건(Precondition) 강화 금지)
  • 결과 보장을 부모보다 약하게 만들지 않는다(사후조건(Postcondition) 약화 금지)
  • 부모가 던지지 않던 예외를 던지지 않는다. fly()를 물려받은 펭귄이 예외를 던지는 것이 전형적인 위반이다. 날 수 있는 능력을 따로 분리해 계층을 다시 짠다

어기는 상속은 위임으로 바꾸는 신호다. 타입 시스템 차원의 대응 개념은 공변성과 반공변성(Covariance and Contravariance)이다. SOLID 원칙의 L이다.

출처: Laws of Software Engineering: SOLID Principles

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 의존성 역전 원칙

    고수준 모듈(업무 규칙)이 저수준 모듈(데이터베이스(DB), HTTP(Hypertext Transfer Protocol) 클라이언트 같은 세부 구현)에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다는 원칙. 의존 방향이 "업무 → 세부"에서 "세부 → 추상화 ← 업무"로 뒤집힌다.

  • 기본형 집착

    전화번호·금액·우선순위 같은 도메인 개념을 끝까지 문자열이나 숫자로만 다루는 냄새. 같은 검증과 포맷 코드가 여기저기 반복되고, 문자열로 모든 걸 표현하는 "stringly typed" 코드가 된다.

  • 소프트웨어 공학의 법칙들

    소프트웨어 시스템과 팀, 의사결정에 반복해서 나타나는 경험칙들을 모아 부르는 말. 법칙이라고 부르지만 대부분 증명된 정리가 아니라 관찰과 격언이다. 판단할 때 떠올릴 이름표로 쓴다. 따로 노트를 둔 것은 링크로, 나머지는 한 줄로 적었다.

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

보기 옵션