반응형
https://itchallenger.tistory.com/382?category=1091150
함수 파라미터는 반공변성, 리턴 타입은 공변성을 갖는다.
(예제 코드는 위 글의 2. Function Parameter Bi-variance(이분산) 부분을 참고하자.)
그 이유는 리스코프 치환 원칙 때문이다.
리스코프의 원칙은 새로운 객체 지향 프로그래밍 언어에 채용된 시그니처에 관한 몇 가지 표준적인 요구사항을 강제한다.
(즉 여기서 메서드 인수와 반환형의 반공변성, 공변성이 함수에 적용되는 것이다.)
공변성은 타입 파라미터(제네릭)의 관계이기 때문에, 객체지향 프로그래밍에서는 생각보다 볼 일이 없다.
객체지향 프로그래밍에서 제네릭이 유용한 경우는 거의 컬렉션밖에 없기 때문이다.
추가로 LSP는 문법적인 의미 뿐만 아니라, 문맥(업무)적인 의미도 갖는다.
- 하위형에서 선행조건은 강화될 수 없다.
- 기본 클래스가 memberId:number 필드를 갖고 있다 가정하자.
- 하위 클래스에서 해당 필드가 양수 number여야 한다고 가정하자.
- 전제 조건이 강화되었다. 이 경우 업무 조건에 따라 기본 클래스를 하위 클래스 위치에 적용할 수 없으므로, LSP가 깨진다.
- 하위형에서 후행조건은 약화될 수 없다.
- 기본 클래스는 양수 정수임을 판별한다.
- 하위 클래스는 정수임을 판별한다.
- 후행 조건이 약화되었다. 이제 하위 클래스 판별식을 통과하는 인자는 기본 클래스 판별식을 통과하지 못할 수 있다. LSP가 깨졌다.
- 하위형에서 상위형의 불변조건은 반드시 유지되어야 한다.
- 위 두 케이스보다 업무적인 이야기이다.
- 예를 들어, 길이 속성이 int이고 배열이 T[]인 List<T> 클래스가 있는 경우 해당 클래스의 모든 메서드에서 Length가 항상 길이보다 작거나 같다고 가정할 수 있다. 이것은 해당 클래스의 불변조건이다.
- List<T>의 하위 클래스가 Length가 (어떤 상황에서도) 배열의 길이보다 클 수 있도록 만드는 경우 하위 클래스는 해당 불변조건을 위반하게 된다.
반응형
'FrontEnd' 카테고리의 다른 글
타입스트립트의 타입시스템으로 산수 구현하기 (0) | 2022.04.27 |
---|---|
React Remix Framework로 알아보는 중첩 경로(nested routing) (0) | 2022.04.26 |
타입스크립트의 타입 대수(type argebra)를 통해 타입 오류 분석하기 (0) | 2022.03.27 |
타입스크립트 타입 호환성과 타입 계층 트리 (0) | 2022.03.27 |
아폴로 클라이언트로 알아보는 클라이언트 아키텍처 [Apollo Client & Client-side Architecture Basics] (0) | 2022.03.27 |