핵심 인사이트 (3줄 요약)

  1. LSP 정의: 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있어야 하며, 프로그램의 정확성을 깨뜨리지 않아야 합니다.
  2. 다형성의 보장: 인터페이스나 상위 클래스의 계약(Contract)을 하위 클래스가 무조건 준수하게 함으로써, 예기치 않은 동작을 방지합니다.
  3. 상속의 오용 방지: '직사각형-정사각형 문제'처럼 논리적으로는 맞지만 행위적으로 일치하지 않는 잘못된 상속을 막아줍니다.

Ⅰ. 개요 (Context & Background)

리스코프 치환 원칙(LSP)은 바바라 리스코프(Barbara Liskov)가 1987년에 제안한 객체지향 설계의 핵심 원칙으로, SOLID의 'L'에 해당합니다. 상속 관계에 있는 클래스들 사이에서, 상위 타입의 객체를 하위 타입의 객체로 치환하더라도 소프트웨어의 실행(동작)에 전혀 문제가 없어야 한다는 개념입니다. 이는 하위 클래스가 상위 클래스의 책임과 규약을 온전히 이어받아야 함을 의미하며, 올바른 다형성(Polymorphism)을 구현하기 위한 필수 조건입니다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

LSP는 객체 계약(Contract)과 서브타이핑(Subtyping)의 일관성을 요구합니다. 부모 클래스가 정의한 사전 조건(Preconditions), 사후 조건(Postconditions), 불변 조건(Invariants)을 자식 클래스에서 위반해서는 안 됩니다.

+---------------------------------------------------+
|               Client (클라이언트)                 |
|  "Expects Bird behavior (Fly)"                    |
|  (새의 동작인 '비행'을 기대함)                    |
+-------------------------+-------------------------+
                          |
             +------------v------------+
             |      Bird (상위 객체)   |
             | + fly()                 |
             +----+---------------+----+
                  |               |
       +----------v--+         +--v----------+
       |   Sparrow   |         |   Penguin   |
       | (참새-자식) |         | (펭귄-자식) |
       | + fly()     |         | + fly() ??? |
       +-------------+         +-------------+
       [LSP Compliant]         [LSP Violation]
       (비행 가능, 준수)       (비행 불가, 위반)
  • 펭귄은 논리적으로 새(Bird)에 속하지만, '날다(fly)'라는 행위 관점에서는 상위 클래스(Bird)를 대체할 수 없습니다. LSP를 위반한 전형적인 사례로, 인터페이스 분리나 계층 재설계(FlyableBird, NonFlyableBird)가 필요합니다.

Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)

비교 항목LSP (리스코프 치환 원칙)OCP (개방-폐쇄 원칙)
초점상속 관계에서 자식 객체가 부모 객체를 완벽히 대체할 수 있는가기능 확장에는 열려 있고, 기존 코드 수정에는 닫혀 있는가
적용 기법사전 조건 강화 금지, 사후 조건 약화 금지, 예외 던지기 주의인터페이스 추상화, 다형성 활용
위반 시 문제점예상치 못한 런타임 에러(예: 펭귄이 날려고 할 때 UnsupportedOperationException), if-else를 통한 타입 체크 남발 (instanceof)새로운 기능 추가 시 기존 코드를 계속 수정해야 하여 유지보수성 저하
시너지LSP가 지켜져야 다형성이 보장되고, 다형성이 보장되어야 진정한 OCP를 달성할 수 있음 (LSP는 OCP를 위한 기반)OCP는 LSP의 구조적 이점을 바탕으로 아키텍처의 유연성을 확장함

Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)

  • 전략적 구조 재편: 실무에서 LSP 위반을 가장 쉽게 발견하는 방법은 코드 내에 다운캐스팅(Downcasting)이나 instanceof 타입 체크 로직이 널려 있는지 확인하는 것입니다. 이를 발견하면 인터페이스 분리(ISP)를 통해 계층 구조를 리팩토링해야 합니다.
  • 테스트 주도 접근: 부모 클래스에 대한 단위 테스트가 자식 클래스에서도 그대로 통과(Pass)하는지 확인하는 것(Contract Testing)이 가장 확실한 LSP 검증 방법입니다.

Ⅴ. 기대효과 및 결론 (Future & Standard)

리스코프 치환 원칙을 준수하면 상속의 오남용을 막고, 클라이언트 코드가 다형성의 이점을 최대한 누릴 수 있게 됩니다. 이는 시스템의 견고함과 확장성을 획기적으로 높여, 장기적인 소프트웨어 유지보수 비용(TCO)을 절감하는 기반 설계 표준으로 자리매김하고 있습니다.

📌 관련 개념 맵 (Knowledge Graph)

  • 상위 개념: SOLID, 객체지향 설계(OOD), 다형성(Polymorphism)
  • 하위/연관 개념: 계약에 의한 설계(Design by Contract), OCP(개방-폐쇄 원칙), ISP(인터페이스 분리 원칙), 상속(Inheritance), 합성(Composition)

👶 어린이를 위한 3줄 비유 설명

  1. 건전지 장난감 차에 'AA 건전지'를 넣으라고 적혀 있어요.
  2. 어떤 브랜드의 AA 건전지를 넣든 장난감 차는 똑같이 잘 움직여야 해요.
  3. 만약 어떤 건전지를 넣었을 때 차가 고장 난다면, 그 건전지는 'AA 건전지의 역할'을 제대로 못한 것이고 이게 바로 LSP를 어긴 거예요!