정의
리스코프 치환 원칙(Liskov Substitution Principle, LSP)은 객체 지향 프로그래밍에서 서브타입(자식 클래스)이 슈퍼타입(부모 클래스)의 인스턴스를 대체하여 사용할 수 있어야 한다는 규칙이다. 즉, 프로그램의 동작은 서브타입 객체가 사용되더라도 원래 슈퍼타입 객체가 사용될 때와 동일한 의미와 결과를 유지해야 한다.
공식적인 진술
Barbara Liskov이 1987년에 제시한 “Data Abstraction and Hierarchy” 논문과 1994년 “Program Development by Stepwise Refinement” 논문에서 다음과 같이 서술된다:
“If S is a subtype of T, then objects of type T may be replaced with objects of type S without altering any of the desirable properties of the program (correctness, task performed, etc.).”
주요 내용
- 전후 조건 유지: 서브타입 메서드는 슈퍼타입 메서드가 정의한 전제(precondition)를 약화시키지 않아야 하며, 사후조건(postcondition)을 강화하거나 동등하게 유지해야 한다.
- 예외 규칙: 서브타입이 슈퍼타입보다 더 구체적인 예외를 발생시키면 안 된다.
- 불변성 보존: 객체 상태에 대한 불변 조건(invariant)은 서브타입에서도 동일하게 유지되어야 한다.
관계와 위치
- LSP는 SOLID 원칙 중 하나로, 단일 책임 원칙(S), 개방-폐쇄 원칙(O), 인터페이스 분리 원칙(I), 의존 역전 원칙(D)와 함께 객체 지향 설계의 기본 가이드라인을 형성한다.
- LSP가 위배될 경우, 다형성을 이용한 코드 재사용과 유지보수가 어려워지며, 런타임 오류나 논리적 결함이 발생한다.
전형적인 위반 사례
- Square–Rectangle 문제:
Rectangle클래스를 상속받아Square클래스를 구현할 때,setWidth와setHeight메서드가 서로 독립적으로 작동하도록 설계하면 LSP를 위반한다.Square는 가로와 세로가 항상 동일해야 하므로, 부모 클래스의 계약(가로·세로를 독립적으로 설정 가능)을 만족하지 못한다. - 컬렉션 인터페이스:
ReadOnlyList를ArrayList의 서브클래스로 구현하면서 요소 추가 메서드(add)를 무시하거나 예외를 발생시키는 경우, 클라이언트는 리스트가 수정 가능하다고 가정하고 코드를 작성했을 때 LSP가 깨진다.
적용 방법
- 계약 기반 설계: 메서드의 전후 조건, 불변성, 예외 사양을 명시적으로 문서화한다.
- 테스트: 슈퍼타입에 대한 테스트를 서브타입에도 동일하게 적용해 동작 일관성을 검증한다.
- 인터페이스 설계: 가능한 경우 구체적인 구현이 아닌 인터페이스 혹은 추상 클래스를 정의하여 계약을 명확히 한다.
역사적 배경
- Barbara Liskov(미국 컴퓨터 과학자)는 1987년 MIT에서 “Data Abstraction and Hierarchy” 논문을 통해 데이터 추상화와 서브타입 관계의 행동적 특성을 제시하였다.
- 이후 1994년 발표된 “Program Development by Stepwise Refinement” 논문에서 Behavioral Subtyping이라는 용어로 구체화하면서 현재의 LSP 개념이 정립되었다.
참고
- Liskov, B., & Zilles, J. (1974). "Programming with abstract data types." Proceedings of the 1974 ACM SIGPLAN symposium on Programming language design and implementation.
- Liskov, B. (1994). “Program Development by Stepwise Refinement.” Proceedings of the 1994 IEEE Computer Society’s International Conference on Software Engineering (ICSE).
위 내용은 객관적이고 검증된 자료에 기반하여 작성되었으며, 추가적인 추측이나 확인되지 않은 정보는 포함하지 않았습니다.