본문 바로가기

FrontEnd

타입스크립트 함수의 시그니처와 리스코프 치환 원칙

반응형

https://itchallenger.tistory.com/382?category=1091150 

 

타입스크립트의 타입 불건전성에 대하여 2 : 공식 예제 코드 살펴보기

https://www.typescriptlang.org/play?strictFunctionTypes=false#example/soundness TS Playground - An online editor for exploring TypeScript and JavaScript The Playground lets you write TypeScript or J..

itchallenger.tistory.com

함수 파라미터는 반공변성, 리턴 타입은 공변성을 갖는다.

(예제 코드는 위 글의 2.  Function Parameter Bi-variance(이분산) 부분을 참고하자.)

 

그 이유는 리스코프 치환 원칙 때문이다.

https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84_%EC%B9%98%ED%99%98_%EC%9B%90%EC%B9%99

 

리스코프 치환 원칙 - 위키백과, 우리 모두의 백과사전

치환성(영어: substitutability)은 객체 지향 프로그래밍 원칙이다. 컴퓨터 프로그램에서 자료형 S {\displaystyle S} 가 자료형 T {\displaystyle T} 의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는

ko.wikipedia.org

리스코프의 원칙은 새로운 객체 지향 프로그래밍 언어에 채용된 시그니처에 관한 몇 가지 표준적인 요구사항을 강제한다.

  • 하위형에서 메서드 인수의 반공변성
  • 하위형에서 반환형의 공변성
  • 하위형에서 메서드는 상위형 메서드에서 던져진 예외의 하위형을 제외하고 새로운 예외를 던지면 안된다.

(즉 여기서 메서드 인수와 반환형의 반공변성, 공변성이 함수에 적용되는 것이다.)

 

공변성은 타입 파라미터(제네릭)의 관계이기 때문에, 객체지향 프로그래밍에서는 생각보다 볼 일이 없다.

객체지향 프로그래밍에서 제네릭이 유용한 경우는 거의 컬렉션밖에 없기 때문이다.

 

추가로 LSP는 문법적인 의미 뿐만 아니라, 문맥(업무)적인 의미도 갖는다.

  • 하위형에서 선행조건은 강화될 수 없다.
    • 기본 클래스가 memberId:number 필드를 갖고 있다 가정하자.
    • 하위 클래스에서 해당 필드가 양수 number여야 한다고 가정하자.
    • 전제 조건이 강화되었다. 이 경우 업무 조건에 따라 기본 클래스를 하위 클래스 위치에 적용할 수 없으므로, LSP가 깨진다.
  • 하위형에서 후행조건은 약화될 수 없다.
    • 기본 클래스는 양수 정수임을 판별한다.
    • 하위 클래스는 정수임을 판별한다.
      • 후행 조건이 약화되었다. 이제 하위 클래스 판별식을 통과하는 인자는 기본 클래스 판별식을 통과하지 못할 수 있다. LSP가 깨졌다.
  • 하위형에서 상위형의 불변조건은 반드시 유지되어야 한다.
    • 위 두 케이스보다 업무적인 이야기이다.
    • 예를 들어, 길이 속성이 int이고 배열이 T[]인 List<T> 클래스가 있는 경우 해당 클래스의 모든 메서드에서 Length가 항상 길이보다 작거나 같다고 가정할 수 있다. 이것은 해당 클래스의 불변조건이다.
    • List<T>의 하위 클래스가 Length가 (어떤 상황에서도) 배열의 길이보다 클 수 있도록 만드는 경우 하위 클래스는 해당 불변조건을 위반하게 된다.

참고 : https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84_%EC%B9%98%ED%99%98_%EC%9B%90%EC%B9%99

 

 

 

 

반응형