컬렉션 프레임워크2 1차시 강의)
집중해서 듣는게 중요하다!
넘어야 될 약간의 벽?!
컬렉션 기반-정렬(sort), 탐색 알고리즘 소개
복습) extends super 꺼내는 거나 참조하는 거나 둘 중 하나만
super는 넣는 것만 가능하다.
<T extends Comparable<T>>
sort 메서드가 제너릭임을 명시한다.
T는 메서드를 호출하는 시점에 결정된다.
단, T는 Comparable<T> 인터페이스 이거를 구현하는 하위클래스의 인스턴스여야 한다.
얘는 상한 제한
extends 붙었는데 직접 구현, 간접 구현 상관없고
public static <T extends Comparable<T>> void sort(List<T> list)
T가 String으로 결정났다 해보자. String 인스턴스 저장하고 있는 list 인스턴스가, 컬렉션 인스턴스가 인자로 전달되었다.
T는 String으로 결정되었다. T는 Comparable String 인터페이스를 구현해야 한다.
호출 문장이 중요하다.
다음 두 문장을 통해서
List<String> list = Arrays.asList("Toy", "Box", "Robot", "Weapon");
list = new ArrayList<>(list);
ArrayList 인스턴스가 만들어진다. 안에 String으로 결정된다.
실제 만들어진 인스턴스는 ArrayList<String> 인스턴스다. 컬렉션 인스턴스가 만들어짐
그러고 다음 보라색 동그라미 표시와 같이 얘가 인자로 전달이 되었다.
전달되는 인자를 통해 T가 결정된다. T는 String
요 T가 어떤 T인지 알려주는 T이다.
이 T는 Comparable<T>를 구현해야 된다. 즉, Comparable<String>을 구현해야 된다.
class String extends Object implements Comparable<String>
실제 String 클래스는 비교가 가능하도록 Comparable 인터페이스를 구현하고 있다.
->sort 메서드의 인자로 T가 String으로 결정될 수 있다.
public static <T extends Comparable<T>> void sort(List<T> list)
class String extends Object implements Comparable<String>
List 인스턴스를 인자로 전달할 수 있는 sort 메서드구나! 라고 생각하면 되긴 하다.
complie error) 제약사항을 만족시키기 위한 노력 - T 관련
sort메서드를 사용한다면
Comparable 인터페이스를 구현한 클래스의 이름이 T로 결정되어서 전달되는 것을 발견
2차시 강의)
메서드 호출 시 T가 String으로 결정되면, T가 Comparable 인터페이스를 구현해야 된다.
String implements Comparable<T>면 호출할 수 있는데,
String은 실제로 Comparable<T>를 구현하고 있다.
실제로는 아래와 같이 선언되었다. (체크표시 참고)
예제를 외우러 가자!
Car가 Comparable 인터페이스를 구현하는 상황
Car는 Comparable<Car>를 구현
이 때의 sort 메서드의 T가 Car
sort 메서드를 호출하면서 list를 전달
sort 메서드의 T는 어떻게 결정되냐
참고)
T가 구현해야 된다. T가 Car로 결정되었으니
위를 따르면, Car가 Comparable<Car>를 구현해야 된다. 실제로 구현하기 떄문에 sort 메서드의 인자로 전달될 수 있다.
sort 메서드는 인스턴스들의 compareTo를 호출해가면서 정렬
ECar는 Comparable<Car> 간접 구현
List<Ecar> list = new ArrayList<>();
ECar의 인스턴스를 생성해서 ArrayList에 저장했다.
Collections.sort(list); // 이 메서드 호출 성공 가능?
Collections.sort(list);를 호출했을 때, T가 ECar다.
void sort<List<ECar> list>
문제는? T가 ECar여서 인자로 전달된 ECar는 Comparable<ECar>를 구현해야 된다.
근데 ECar가 Comparable<ECar>를 구현하는게 아니라 Car가 Comparable<Car>를 구현하는 상황이다.
상속 관계상(제너릭 2 참고) Comparable<Car>와 Comparable<ECar>의 상속 관계가 연결되지는 않는다.
결국 ECar가 Comparable<ECar>를 구현하지 않아서 Collections.sort(list);는 에러가 발생
그래서 실제로는 ? super T로 마무리 지었다.
ECar는 Comparable<Car>를 간접 구현
? super가 붙으면 sort 메서드 호출 시점에서....
<? super ECar> : ECar나 ECar가 상속하는 클래스로 하한 제한 걸어줌
Car와 ECar의 관계를 보면 ? super T의 등장을 알 수 있다.
자바 Map 내용 꺼내기 (0) | 2023.01.07 |
---|---|
[Java] HashMap<K,V> (0) | 2022.12.23 |
[Java] 제네릭 메서드 예제 (0) | 2022.12.22 |
[Java] 제네릭 예제 틀린 거 분석 (0) | 2022.12.22 |
[Java] Set<E> 클래스 (0) | 2022.12.20 |
댓글 영역