정렬 제네릭 Comparator 컬렉션 클래스 16. 컬렉션과 제네릭 정렬 제네릭 Comparator 컬렉션 클래스
ArrayList 원소 정렬하기 ArrayList 원소들을 정렬하려면 어떻게 해야 할까? API를 뒤져서 정렬 기능을 제공하는 메소드가 있는지 확인!! ArrayList에는 정렬용 메소드가 없습니다. 혹시 다른 컬렉션 객체를 쓸 수 있는지 확인 자동으로 정렬되는 TreeSet 같은 클래스를 활용하는 것도 좋은 대안이 될 수 있습니다.
Collections.sort() 메소드 java.util.Collections 클래스의 클래스 메소드인 sort() 메소드를 활용하면 됩니다. public static void sort(List list) java.util.Collections.sort() 메소드를 이용하면 임의의 List 객체를 알파벳순으로 정렬할 수 있습니다. 하지만 String 객체가 아닌, 다른 복잡한 객체로 구성된 리스트는 어떻게 정렬할까요?
Collections.sort() 메소드 <T extends Comparable<? super T>> List<T> list 처음 보는 이상한 기호들이 등장했습니다. 이런 문법들을 이해하기 위해서 제네릭을 공부해야 되겠습니다.
제네릭과 형안전성 제네릭을 활용하지 않는 경우 일단 컬렉션에 들어가고 나면 어떤 유형이었는지를 잊어버리게 됩니다. ArrayList Object Object Object Object
ArrayList<Fish> 제네릭과 형안전성 제네릭을 활용하는 경우 유형이 엉뚱하게 바뀌지 않습니다. 형안전성이 확보됩니다. ArrayList<Fish>
제네릭 사용법 제네릭을 사용하는 클래스 제네릭형 변수 선언 및 대입 제네릭형을 받아들이는 메소드 선언 및 호출 new ArrayList<Song>() 제네릭형 변수 선언 및 대입 List<Song> songList = new ArrayaList<Song>() 제네릭형을 받아들이는 메소드 선언 및 호출 void foo(List<Song> list) x.foo(songList) public <T extends Animal> void takeThing(ArrayList<T> list) public void takeThing(ArrayList<Animal> list)
제네릭 사용법 extends 키워드의 의미 <T extends Comparable<? super T>> 위 코드가 무엇을 뜻하는지 답해보세요.
Comparator 정렬 순서를 정하는 기준을 직접 정하고 싶다면? 또는 Comparable을 구현하지 않는 클래스를 정렬하고 싶다면? java.util.Comparator 사용 sort(List o, Comparator c) 메소드 사용
Comparator 활용 class ArtistCompare implements Comparator<Song> { public int compare(Song one, Song two) { return one.getArtist().compareTo(two.getArtist()); } . ArtistCompare artistCompare = new ArtistCompare(); Collections.sort(songList, artistCompare);
컬렉션의 종류 Collection Set List SortedSet TreeSet LinkedHashSet HashSet ArrayList LinkedList Vector Map SortedMap TreeMap HashMap LinkedHashMap Hashtable
List List 인덱스 제공 ListIterator를 줄 수 있음 ArrayList Vector LinkedList 상당히 빠르고 크기를 마음대로 조절할 수 있는 초강력 배열 Vector ArrayList의 구형 버전. 모든 메소드가 동기화되어 있음 요즘은 대부분 ArrayList를 사용함 LinkedList 목록 끝에 원소를 추가하거나 끝에 있는 원소를 쉽게 제거할 수 있는 메소드 제공 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 많이 쓰임
Set Set 중복된 항목이 들어가는 것을 방지함 equals() 메소드를 이용하여 중복 확인 HashSet 가장 빠른 임의 접근 속도 순서를 전혀 예측할 수 없음 LinkedHashSet 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능 TreeSet 정렬된 순서대로 보관. 정렬 방법을 지정할 수 있음
Map Map 키와 값을 대응시키는 기능을 제공 키와 값은 모두 객체여야만 함 HashMap Hashtable 가장 빠른 임의 접근 기능을 제공 Hashtable HahsMap의 구형 버전 LinkedHashMap LinkedHashSet과 유사. 입력된 순서 또는 가장 최근에 접근된 순서대로 보관 TreeMap 정렬된 순서대로 유지하기에 좋음
객체가 같은지 확인하는 방법 객체 동치 레퍼런스 동치 equals() 메소드에 대해 true가 리턴되는 것 똑같은 객체를 참조해야 하는 것은 아님 레퍼런스 동치 두 레퍼런스가 같은 객체를 참조하는 경우 a == b 가 참이 되어야 함 어떤 조건에서 두 객체가 같다고 인정할 수 있을지 결정한 다음 equals() 메소드를 오버라이드 이 때 hashCode() 메소드도 반드시 오버라이드해야 함 String a = “abc”; if (a.equals(new String(“abc”)) {
와일드카드 와일드카드를 쓸 때는 목록에 새로운 원소를 추가할 수 없음 public <T extends Animal> void takeThing(ArrayList<T> list) public void takeThing(ArrayList<? extends Animal> list) 와일드카드를 쓸 때는 목록에 새로운 원소를 추가할 수 없음
숙제 본문을 다시 한 번 꼼꼼히 읽어봅시다. 본문 중간에 나와있는 코드를 직접 입력해서 컴파일하고 실행해 봅시다. 본문 중간에 있는 각종 연습문제와 16장 끝에 있는 연습문제, 퍼즐을 풀어봅시다.