리스코프 치환 원칙(Liskov substitution principle)

2024. 12. 8. 10:20·Computer Science/Terminology and Concepts
“자식 클래스는 부모 클래스로 교체해도 프로그램의 동작에 문제가 없어야 한다”

리스코프 치환 원칙 (Liskov Substitution Principle, LSP) 주요 특징

1. 서브타입의 대체 가능성

  • 자식 클래스(서브타입)는 부모 클래스(슈퍼타입)와 완전히 호환되어야 하며, 부모 클래스 대신 자식 클래스를 사용해도 프로그램이 정상적으로 동작해야 합니다.
  • 즉, 부모 클래스의 인스턴스가 필요한 모든 곳에서 자식 클래스 인스턴스를 대체할 수 있어야 합니다.

2. 행동 일관성 보장

  • 자식 클래스는 부모 클래스의 행동(메서드)을 변경하거나 예외를 추가하지 않고, 기존의 계약(Contract)을 그대로 따라야 합니다.
  • 부모 클래스가 특정 입력에 대해 예상되는 출력을 제공하면, 자식 클래스도 동일한 입력에 대해 일관된 출력을 제공해야 합니다.

3. 사전 조건 약화, 사후 조건 강화

  • 사전 조건(Precondition): 자식 클래스는 부모 클래스보다 더 엄격한 사전 조건을 요구해서는 안 됩니다.
  • 사후 조건(Postcondition): 자식 클래스는 부모 클래스보다 더 강력한 사후 조건을 제공할 수 있습니다.

4. 부모 클래스의 메서드와 일관된 반환 값

  • 부모 클래스의 메서드가 특정 타입의 값을 반환한다면, 자식 클래스도 동일한 타입 또는 그 서브타입을 반환해야 합니다.

5. 부모 클래스와 자식 클래스의 상태 일관성

  • 자식 클래스는 부모 클래스에서 정의된 속성과 상태를 변경해서는 안 됩니다.
  • 자식 클래스가 부모 클래스의 메서드를 재정의할 때, 기존의 동작을 위반하지 않고 확장해야 합니다.

 

예시

class Bird {
  fly(): void {
    console.log("Flying");
  }
}

class Penguin extends Bird {
  // 리스코프 치환 원칙 위반 예시
  fly(): void {
    throw new Error("Penguins can't fly!");
  }
}
  • Penguin은 Bird의 자식 클래스이지만, fly() 메서드를 재정의하여 예외를 발생시키므로 리스코프 치환 원칙을 위반합니다.
  • 이 문제를 해결하려면 Bird 클래스를 FlyingBird와 NonFlyingBird로 분리하여 더 명확한 타입 구조를 사용하는 것이 좋습니다.

'Computer Science > Terminology and Concepts' 카테고리의 다른 글

쿠키🍪_Cookie  (0) 2025.02.07
Unique Identifiers  (1) 2024.12.08
에러와 버그의 차이점  (0) 2024.12.08
peerDependencies 와 overrides 의 차이점(package management)  (0) 2024.11.09
DOM 트리의 탐색  (0) 2022.12.13
'Computer Science/Terminology and Concepts' 카테고리의 다른 글
  • 쿠키🍪_Cookie
  • Unique Identifiers
  • 에러와 버그의 차이점
  • peerDependencies 와 overrides 의 차이점(package management)
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;)
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
        • Web Development
      • Frontend
        • Javascript Essentials
        • Perfomance Optimization
        • JS Patterns
        • React
        • Next.js
        • Flutter
        • Testing
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test
        • LeetCode
        • Programmers
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML & CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    Time complexity and Space complexity
    이벤트
    Shared resources
    CPU scheduling algorithm
    How memory manage data
    js pattern
    polylingo
    TCP/IP
    자바스크립트 딥다이브
    mobile app
    database
    leetcode
    Data Structure
    structure of os
    testing
    indie hacker
    모던 자바스크립트 Deep Dive
    Binary Tree BFS
    프론트엔드 성능 최적화 가이드
    커리어
    Operating System
    need a database
    Javascript Essentials
    스코프
    자바스크립트
    딥다이브
    Threads and Multithreading
    DOM
    Network
    VoiceJournal
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
리스코프 치환 원칙(Liskov substitution principle)
상단으로

티스토리툴바