개발 서적 기록/오브젝트_조영호

45일차 - LSP와 계약에 의한 설계 : 가변성 규칙

밍 끄적 2023. 9. 26. 14:25
728x90

2023.09.26 TUE

558p ~ 573p

 

44일차 내용 ⬇️

2023.09.26 - [개발 서적 기록/오브젝트_조영호] - 44일차 - LSP와 계약에 의한 설계 : 계약 규칙

 

44일차 - LSP와 계약에 의한 설계 : 계약 규칙

2023.09.26 TUE 547p ~ 557p 43일차 내용 ⬇️ 2023.09.25 - [개발 서적 기록/오브젝트_조영호] - 43일차 - 계약에 의한 설계 43일차 - 계약에 의한 설계 2023.09.25 MON 538p ~ 546p 42일차 내용 ⬇️ 2023.09.25 - [분류 전

magenta-ming.tistory.com


가변성 규칙 Variance Rules

교체 가능한 타입에 대한 규칙이다.

파라미터와 리턴 타입의 변형에 대해 정의하는 규칙이다.

 

구체적으로는 아래와 같은 특징이 있다.

  • 서브타입의 리턴 타입은 공변성을 가져야 한다.
  • 서브타입의 메서드 파라미터는 반공변성을 가져야 한다.
  • 서브타입은 슈퍼타입이 발생시키는 예외와 다른 타입의 에외를 발생시켜서는 안된다.

( 공변성, 반공변성의 개념은 아래에 기술하였다. )

 

리턴 타입 공변성

가변성 규칙의 첫 번째 특징인 서브타입의 리턴 타입이 공변성을 가진다는 특성이다.

부모 클래스에서 구현된 메서드를 자식 클래스에서 오버라이딩할 때, 부모 클래스에서 선언한 반환타입의 서브타입으로 지정할 수 있다.

즉, 메서드를 구현한 클래스의 타입 계층 방향과, 리턴 타입의 타입 계층 방향이 동일한 경우다.

 

파라미터 타입 반공변성

가변성 규칙의 두 번째 특징인 서브타입의 메서드 파라미터는 반공변성을 가진다는 특성이다.

부모클래스에서 구현된 메서드를 자식 클래스에서 오버 라이딩할 때, 파라미터 타입을 부모 클래스에서 사용한 파라미터의 슈퍼타입으로 지정할 수 있다.

즉, 메서드를 정의한 클래스의 타입 계층과 파라미터의 타입 계층의 방향이 반대인 경우, 서브타입 관계를 만족한다는 특성이다.

 

제네릭의 가변성 3가지

가변성 규칙에는 공변성과 반공변성의 특징을 고려해야한다. 따라서 제네릭의 가변성 유형 3가지를 다루고자 한다.

공변성 Convariance

S와 T 사이의 서브타입 관계가 그대로 유지된다.

그래서 서브타입 S가 슈퍼타입 T 대신 사용될 수 있다.

 

List로 예를 들면, A의 서브타입 B의 관계에 대해서 아래와 같이 사용할 수 있다.

Class B extends A {};

List<? extends A> mylist = new List<B>;

반공변성 Contravariance

S와 T사이의 서브타입 관계가 역전된다.

슈퍼타입인 T가 서브타입인 S대신 사용될 수 있다.

 

List로 예를 들면, A의 서브타입 B의 관계에 대해서 아래와 같이 사용할 수 있다.

Class B extends A {};

List<? super B> mylist = new List<A>;

무공변성 Invariance

S와 T사이에는 아무런 관계도 존재하지 않는다.

S 대신 T를 사용하거나, T 대신 S를 사용할 수 없다.

 

728x90