2023-04-13-OOP-LSP
리스코프 치환 원칙 (LSP - Liskov Substitution Principle)
정의
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 계약에 의한 설계를 참고해야 한다.
계약이란?
- 각 계약 당사자는 계약으로부터 이익(benefit)을 기대하고 의무(obligation)를 이행한다.
- 각 계약 당사자의 이익과 의무는 계약서(인터페이스)에 문서화 된다.
계약에 의한 설계(Design By Contract, DBC)란?
- 의도를 드러내는 인터페이스를 만들어서 협력을 수행하기 위해 수행해야 하는 제약조건을 명시한다.ㅓ
- 인터페이스에 대해 프로그래밍하라는 원칙을 확장한 것이다.
계약에 의한 설계를 구성하는 세 가지 요소
사전조건(precondition)
- 메소드가 호출되기 위해 만족되어야 하는 조건, 이것은 메소드의 요구사항을 명시한다. 사전조건이 만족시키는 것은 메서드를 실행하는 클라이언트의 의무다.
- 일반적으로 매개변수의 정합성을 체크하기 위해 사용하며, 만족시키지 못할 경우 예외 발생
사후조건(postcondition)
- 메소드가 실행 후 클라이언트에 보장해야 하는 조건, 클라이언트가 사전조건을 만족시켰다면 메서드는 사후조건에 명시된 조건을 만족시켜야한다.
- 만약 클라이언트가 사전조건을 만족시켰는데도 사후조건을 만족시키지 못한 경우에는 클라이언트에게 예외를 던져야 한다. 사후조건을 만족시키는 서버의 의무이다.
- 인스턴스 변수의 상태가 올바른지 서술
- 메소드에 전달된 파라미터의 값이 올바르게 변경되었는지 서술
- 반환값이 올바른지 서술
- 한 메소드 안에서 return문이 여러 번 나오는 경우에는 검증이 힘들게 된다.
불변식(invariant)
- 항상 참이라고 보장되어야 하는 서버의 조건, 메소드가 실행되는 도중에는 불변식을 만족시키지 못할 수도 있지만 실행하기 전이나 종료된 후에 항상 불변식은 참이어야 한다.
- 인스턴스 생명주기 전반에 걸쳐 지켜져야 하는 객체 내부의 상태 규칙을 명세한다.
- 모든 인스턴스가 생성된 후에 만족되어야 하며, 클래스에 정의된 모든 생성자는 불변식을 준수해야 한다.
- 쉽게 말해 생성자 내부에서 참조 자료형인 경우 null이 아닌지 체크하거나, 논리적이나 규칙 상 위배되는 값이 발생하는 경우 예외 발생
LSP를 따를 때의 이점
- 개방-폐쇄 원칙을 만족하는 설계를 위한 전제 조건이 된다.
- 기능 확장을 할 때 이득을 볼 수 있다.
주의점
- 클라이언트 관점에서 행동이 호환되는지 여부, 행동이 호환될 경우에만 자식 클래스가 부모 클래스 대신 사용될 수 있다.
출처 : 위키백과, 메타버스 강사님 강의, 오브젝트
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.