상세 컨텐츠

본문 제목

ch24) 컬렉션 기반 알고리즘 ①,②

JAVA

by 빙하둘리 2022. 12. 31. 05:41

본문

728x90

컬렉션 프레임워크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의 등장을 알 수 있다.

728x90

'JAVA' 카테고리의 다른 글

자바 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

관련글 더보기

댓글 영역