Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BFS
- 알고리즘
- 에라스토테네스
- 자료구조
- CHAR_LENGTH
- 백준
- graph array
- aggregate function
- BOJ
- nextInt
- mysql string functions
- not equal
- SQL
- 바닥장식
- 데이터베이스
- 제네릭
- 공변
- graph
- Java
- db
- 자바
- MySQL
- 반공변
- Database
- goormide
- 제네릭 배열
- contravariance
- 모든 순열
- 13164
- DFS
Archives
- Today
- Total
1223
[Java] 공변 본문
1. 공변의 성질
- 공변(Variance)
- A가 B의 하위 타입일 때, T<A>가 T<B>의 하위 타입
- extends
- Read
- 조상관계는 공통부분이므로 적어도 조상타입은 읽을 수 있다.
- 자식관계끼리는 읽을 수 없다.
- Write
- 어떠한 경우에도 불가능하다.
- 반공변(Contravariance)
- A가 B의 하위 타입일 때, T<B>가 T<A>의 하위 타입
- super
- Read
- 불가능
- Write
- 대입 연산자 오른쪽 제네릭이 오른쪽 제네릭 타입과 같을 때만 가능
-
List<? super Integer> same = new ArrayList<Integer>();
- 무공변(Invariance)
- A가 B의 하위 타입일 때, T<A>와 T<B>가 아무런 관계가 없음
2. 공변, 반공변의 필요성
Object obj = new Object();
Object num = new Number();
Object str = new String():
Object inte = new Integer();
위의 코드는 공변관계가 당연히 성립한다. 하지만, 다음의 코드를 보자.
List<Object> obj = new ArrayList<Object>();
// List<Object> num = new ArrayList<Number>(); 에러
// List<Object> str = new ArrayList<String>(); 에러
// List<Object> inte = new ArrayList<Integer>(); 에러
제네릭은 대입 연산자 좌우의 제네릭 타입이 일치해야 하므로 에러가 난다.
이런 이유 때문에 공변이 필요한 것이다.
와일드카드와 공변 키워드 extends를 이용한 공변
List<? extends Number> num = new ArrayList<Number>();
List<? extends Number> numInt = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> numDou = new ArrayList<Double>(); // Double extends Number
이렇게 되면 에러가 나지 않고 제네릭을 사용할 수 있다.
반대로 반공변의 코드를 보자.
List<? super Integer> intInt = new ArrayList<Integer>(); // Integer is a "superclass" of Integer (in this context)
List<? super Integer> intNum = new ArrayList<Number>(); // Number is a superclass of Integer
List<? super Integer> intObj = new ArrayList<Object>(); // Object is a superclass of Integer
결론적으로, 공변과 반공변을 통해서 다른 타입에 제한적인 작업이 가능하게 된다.
'Java' 카테고리의 다른 글
[Java] 제네릭 배열을 생성하지 못하는 이유 (0) | 2022.02.05 |
---|---|
[Java] nextInt vs nextLine 입출력 주의사항 (0) | 2022.01.08 |
Comments