컬렉션 프레임워크와 제네릭
컬렉션 프레임워크와 제네릭
1. 컬렉션 기반 알고리즘
- 정렬
- 탐색
정렬
-
List<E>를 구현한 컬렉션 클래스들은 정렬한 상태를 유지하지 않는다.
-
대신 정렬을 해야한다면 다음 메소드를 사용할 수 있다.
/** 방법 1. Comparable **/
public static <T extends Comparable<? super T>> void sort(List<T> list)
[코드 해석]
-
<T extends Comparable<? super T>> : sort() 메소드가 제네릭임을 명시
-
왼쪽의 T는 Comparable<? super T>를 구현해야한다.
-
즉, 매개변수로 전달되는 List<T>의 T가 Comparable<T>를 구현해야한다는 의미이다.
-
그런데, Comparable<? super T>로 인하여, T를 상속받는 자식 클래스는 들어갈 수 없다.
[예제]
import java.util.ArrayList;
import java.util.Collections;
class Car implements Comparable<Car>{
private int disp; // 배기량
public Car(int d){ disp = d; }
...
@Override
public int compareTo(Car o){
return disp - o.disp;
}
}
/**********************************************
- ECar는 Car를 상속하기에 Comparable<Car>를 구현한다.
- 그러나 Comparable<ECar>는 구현하지 않기에 sort에서 컴파일 에러가 난다.
- 그런데, Comparable<? super T>로 인하여, sort를 할 수 있게 된다.
<? super Ecar>가 되어 Comparable<Car>를 받을 수 있기 때문
**********************************************/
class ECar extends Car{...}
public static void main(String[] args){
List<Car> list = new ArrayList<>();
list.add(new Car(1200));
list.add(new Car(3000));
list.add(new Car(1800));
// Car 클래스는 Comparable를 구현하기 때문에 sort가 가능하다.
Collections.sort(list);
}
/** 방법2. Comparator<T> 사용 **/
public static <T> void sort(List<T> list, Comparator<? super T> c)
[간단 예제]
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Car{ .. }
class ECar extends Car{ .. }
/** Car, ECar의 정렬을 위한 클래스 **/
class CarComp implements Comparator<Car>{ .. }
public static void main(String[] args){
List<Car> clist = new ArrayList<>();
clist.add(new Car(1800));
clist.add(new Car(1200));
List<ECar> elist = new ArrayList<>();
elist.add(new ECar(3000, 55));
elist.add(new ECar(1800, 87));
CarComp comp = new CarComp();
// 각각 정렬
Collections.sort(clist, comp);
Collections.sort(elist, comp);
}
[코드 설명]
- 위의 CarComp comp는 Comparator<Car> 타입이다.
- 만약 Comparator<T>를 사용하는 sort에 Comparator<? super T> 가 없을경우
Collections.sort(elist, comp); 부분에서 컴파일 에러가 난다.
(comp가 Comparator<ECar>가 아니기 때문)
- 하지만 Comparator<? super T>를 사용함으로써
Comparator<ECar>를 참조하는 부모클래스가 들어갈 수 있게 되어
Comparator<ECar>도 들어갈 수 있게 된다.
탐색
/** 이진 탐색 방법 1.Comparable **/
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
-
제네릭이 들어가는 부분은 위의 Car, ECar의 예제로 이해할 수 있다.
복사
public static <T> void copy(List<? super T> dest, List<? extends T> src)
-
src는 꺼내는 용도(Get), dest는 저장하는 용도(Set)로 사용됨을 명시
출처
- 윤성우 열혈 Java 강의
Author And Source
이 문제에 관하여(컬렉션 프레임워크와 제네릭), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@songyw0517/컬렉션-프레임워크와-제네릭
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
정렬
-
List<E>를 구현한 컬렉션 클래스들은 정렬한 상태를 유지하지 않는다.
-
대신 정렬을 해야한다면 다음 메소드를 사용할 수 있다.
/** 방법 1. Comparable **/ public static <T extends Comparable<? super T>> void sort(List<T> list)
[코드 해석]
-
<T extends Comparable<? super T>> : sort() 메소드가 제네릭임을 명시
-
왼쪽의 T는 Comparable<? super T>를 구현해야한다.
-
즉, 매개변수로 전달되는 List<T>의 T가 Comparable<T>를 구현해야한다는 의미이다.
-
그런데, Comparable<? super T>로 인하여, T를 상속받는 자식 클래스는 들어갈 수 없다.
[예제]
import java.util.ArrayList; import java.util.Collections; class Car implements Comparable<Car>{ private int disp; // 배기량 public Car(int d){ disp = d; } ... @Override public int compareTo(Car o){ return disp - o.disp; } } /********************************************** - ECar는 Car를 상속하기에 Comparable<Car>를 구현한다. - 그러나 Comparable<ECar>는 구현하지 않기에 sort에서 컴파일 에러가 난다. - 그런데, Comparable<? super T>로 인하여, sort를 할 수 있게 된다. <? super Ecar>가 되어 Comparable<Car>를 받을 수 있기 때문 **********************************************/ class ECar extends Car{...} public static void main(String[] args){ List<Car> list = new ArrayList<>(); list.add(new Car(1200)); list.add(new Car(3000)); list.add(new Car(1800)); // Car 클래스는 Comparable를 구현하기 때문에 sort가 가능하다. Collections.sort(list); }
/** 방법2. Comparator<T> 사용 **/ public static <T> void sort(List<T> list, Comparator<? super T> c)
[간단 예제]
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; class Car{ .. } class ECar extends Car{ .. } /** Car, ECar의 정렬을 위한 클래스 **/ class CarComp implements Comparator<Car>{ .. } public static void main(String[] args){ List<Car> clist = new ArrayList<>(); clist.add(new Car(1800)); clist.add(new Car(1200)); List<ECar> elist = new ArrayList<>(); elist.add(new ECar(3000, 55)); elist.add(new ECar(1800, 87)); CarComp comp = new CarComp(); // 각각 정렬 Collections.sort(clist, comp); Collections.sort(elist, comp); }
[코드 설명]
- 위의 CarComp comp는 Comparator<Car> 타입이다.
- 만약 Comparator<T>를 사용하는 sort에 Comparator<? super T> 가 없을경우
Collections.sort(elist, comp); 부분에서 컴파일 에러가 난다.
(comp가 Comparator<ECar>가 아니기 때문) - 하지만 Comparator<? super T>를 사용함으로써
Comparator<ECar>를 참조하는 부모클래스가 들어갈 수 있게 되어
Comparator<ECar>도 들어갈 수 있게 된다.
-
탐색
/** 이진 탐색 방법 1.Comparable **/ public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
-
-
제네릭이 들어가는 부분은 위의 Car, ECar의 예제로 이해할 수 있다.
복사
public static <T> void copy(List<? super T> dest, List<? extends T> src)
-
src는 꺼내는 용도(Get), dest는 저장하는 용도(Set)로 사용됨을 명시
Author And Source
이 문제에 관하여(컬렉션 프레임워크와 제네릭), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@songyw0517/컬렉션-프레임워크와-제네릭저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)