1 / 18

16. 컬렉션과 제네릭

16. 컬렉션과 제네릭. ArrayList. import java.util .*; import java.io.*; public class Jukebox1 { ArrayList <String> songList = new ArrayList <String>(); public static void main(String[] args ) { new Jukebox1().go(); } public void go() { getSongs ();

dallon
Download Presentation

16. 컬렉션과 제네릭

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 16. 컬렉션과 제네릭

  2. ArrayList importjava.util.*; import java.io.*; public class Jukebox1 { ArrayList<String>songList = new ArrayList<String>(); public static void main(String[] args) { new Jukebox1().go(); } public void go() { getSongs(); System.out.println(songList); } voidgetSongs() { try { File file = new File("SongList.txt"); BufferedReader reader = newBufferedReader(newFileReader(file)); String line = null; while ((line = reader.readLine()) != null) { addSong(line); } } catch(Exception ex) { ex.printStackTrace(); } } voidaddSong(String lineToParse) { String[] tokens = lineToParse.split("/"); songList.add(tokens[0]); }} SongList.txt Pink Moon/Nick Drake Somersault/Zero 7 Shiva Moon/Prem Joshua Circles/BT Deep Channel/Afro Celts Passenger/Headmin Listen/Tahiti 80 곡 제목들을 String으로 구성된 ArrayList에 저장 파일로딩을 시작하고 내용을 출력하는 메소드 “정렬기능이 없다” 파일을 읽어들이고 각 행에 대해서 addSong()을 호출 split을 사용하여 두 조각으로 나눈 후 제목만 필요하므로 첫 번째 토큰만 집어넣는다 [Pink Moon, Somersault, Shiva Moon, Circles, Deep Channel, Passenger, Listen] Head First JAVA

  3. 다른 컬렉션 TreeSet : 원소들을 정렬된 상태로 유지하며 원소가 중복되어 들어가지않게 해준다. HashMap : 원소들을 이름/값 쌍 형식으로 저장하고 접근할 수 있게 해준다. LinkedList : 컬렉션 중간에서 원소를 추가하거나 삭제하는 작업을 더 빠르게 처리할 수 있게 해준다. HashSet : 컬렉션에 중복된 원소가 들어가지 않도록 해주고, 컬렉션 내에서 어떤 원소를 빠르게 찾을 수 있게 해준다. LinkedHashMap : HashMap과 거의 똑같지만 원소가 삽입된 순서를 그대로 유지시켜줄 수 있고, 마지막으로 접근했던 순서를 기억하도록 설정할 수도 있다. Head First JAVA

  4. Collections.sort(); (1/2) TreeSet을 쓸 수도 있지만 Collections.sort() 메소드를 사용하여 알파벳 순으로 정렬할 수 있다. Java.util.Collections public static void copy(List destination, List source) public static List emptyList() public static void fill(List listToFill, Object objToFillItWith) public static intfrequency(Collection c, Object o) public static void reverse(List list) public static rotate(List list, int distance) public static void shuffle(List list) public static void sort(List list) Head First JAVA

  5. Collections.sort(); (2/2) public void go() { getSongs(); System.out.println(songList); Collections.sort(songList); System.out.println(songList); } Collections 클래스의 sort()라는 정적 메소드를 호출한 다음 목록을 다시 출력하는데 알파벳 순으로 출력된다. [Pink Moon, Somersault, Shiva Moon, Circles, Deep Channel, Passenger, Listen] [Circles, Deep Channel, Listen, Passenger, Pink Moon, Shiva Moon, Somersault] Head First JAVA

  6. 객체의 정렬 (1/2) class Song { String title; String artist; String rating; String bpm; Song(String t, String a, String r, String b) { title = t; artist = a; rating = r; bpm = b; } public String getTitle() { returntitle; } public String getArtist() { returnartist; } public String getRating() { returnrating; } public String getBpm() { returnbpm; } public String toString() { return title; } } SongList.txt Pink Moon/Nick Drake/5/80 Somersault/Zero 7/4/84 Shiva Moon/Prem Joshua/6/120 Circles/BT/5/110 Deep Channel/Afro Celts/4/120 Passenger/Headmin/4/100 Listen/Tahiti 80/5/90 네 개의 속성들을 모두 목록에 집어넣어야 하므로 네 가지의 인스턴스 변수가 있는 Song 클래스 toString()은 Object 클래스에 정의되어 있기 때문에 모든 클레스에서 상속하는 메소드이다. System.out.println(aSongObject) 메소드를 호출했을 때 곡 제목이 출력될 수 있도록 하기 위해 toString()을 오버라이드 함. Head First JAVA

  7. 객체의 정렬 (2/2) importjava.util.*; import java.io.*; public class Jukebox3 { ArrayList<Song> songList = new ArrayList<Song>(); public static void main(String[] args) { new Jukebox3().go(); } ….. voidaddSong(String lineToParse) { String[] tokens = lineToParse.split("/"); Song nextSong = new Song(tokens[0], tokens[1], tokens[2], tokens[3]); songList.add(nextSong); } } String이 아닌 Song으로 구성된 ArrayList The generic method sort(List<T>) of type Collections is not applicable for the arguments (ArrayList<Song>). The inferred type Song is not a valid substitute for the bounded parameter <T extends Comparable<? super T>> 자바코드나 문서에서 <> 기호가 보인다면 제네릭을 뜻한다. 토큰 네 개를 가지고 Song 객체를 새로 만든 다음 그 Song을 목록에 추가 Head First JAVA

  8. 제네릭 유형 Fish Fish Fish Ball Fish Car 제네릭을 쓸 때 제네릭을 쓰지 않을 때 ArrayList<Fish> ArrayList Fish Fish Fish Object Object Object 제네릭을 사용하면 형 안정성이 확보된 컬렉션을 만들 수 있다. 예를 들면 Dog를 Duck으로 구성된 목록에 집어넣었을 때 컴파일러가 피리 파악하고 사고가 나는 것을 막아줄 수 있게 된다. Head First JAVA

  9. 제네릭 클래스 사용법 제네릭 클래스란 클래스 선언에 유형 매개변수가 들어있는 클래스를 뜻한다. 클래스 선언부 원소를 추가하기 위한 메소드선언부 ArrayList가 AbstractList의 서브클래스이므로 자동으로 AbstractList의 유형으로 쓰임 ArrayList를 선언하고 생성할 때 사용할 실제 유형이 들어감 public class ArrayList<E>extendsAbstracList<E> implements List<E> … { publicboolean add(E o) // 기타 코드 } 주어진 유형이 자동으로 List 인터페이스의 유형이 된다 ‘E’가 무엇이든 간에 그 유형에 의해서 ArrayList에 집어넣을 수 있는 객체의 유형이 결정됨 ‘E’는 컬렉션에서 저장하고 컬렉션에서 리턴할 원소의 유형이라고 생각하면 된다. Head First JAVA

  10. 유형 매개변수 사용법 다음과 같은 코드를 쓰면 : ArrayList<String>thisList = new ArrayList<String> 다음과같은 ArrayList가 : public class ArrayList<E> extends AbstractList<E> … { public boolean add(E o) // 기타코드 } 컴파일러에 의해 다음과 같은 식으로 해석된다 : public class ArrayList<String> extends AbstractList<String> … { public boolean add(String o) // 기타코드 } ‘E’가 ArrayList를 생성할 때 사용한 실제 유형으로 치환된다. ‘E’와 호환되는 유형의 레퍼런스를 제외한 다른 레퍼런스는ArrayList의 add() 메소드에 전달할 수 없는 것이다 Head First JAVA

  11. 제네릭메소드 사용법 제네릭메소드는메소드 선언 서명에 유형 매개변수가 포함되어 있는 메소드를 뜻함 클래스 선언부에서 정의된 유형 매개변수를 사용하는 방법 클래스 선언부에서 쓰이지 않은 유형 매개변수를 사용하는 방법 public class ArrayList<E>extendsAbstracList<E>… { publicboolean add(E o) 클래스를 정의할 때 이미 ‘E’를 썼기 때문에 여기에서도 쓸 수 있음 public <T extends Animal> voidtakeThing(ArrayList<T> list) 클래스 자체에서는 유형 매개변수를 사용하지 않더라도 리턴 유형을 선언하는 곳 바로 앞에서 선언해주기만 하면 메소드 내에서 유형 매개변수를 별도로 지정해서 쓸 수 있다. 위와 같을 경우 Animal 유형(하위클래스 포함)이면 뭐든지 T 자리에 들어갈 수 있다. Head First JAVA

  12. sort() 메소드 sort() 메소드에서는Comparable 객체로 구성된 목록만 받아들일 수 있다. Comparable을 확장하는 유형으로 구성된 List만을 인자로 전달할 수 있다. ‘T’가반드시 Comparable 유형이어야 한다. public static <T extends Comparable<? Super T>> void sort(List<T> list) Comparable은인터페이스이므로 ‘T는 Comparable 인터페이스를 구현하는 유형’이라는 뜻으로 이해해야 한다. 제네릭에서extends는 extends 또는 implements를 의미한다. Head First JAVA

  13. Comparable 인터페이스 (1/2) ArrayList<Song>을 sort() 메소드에 전달하려면 Song 클래스에서 Comparable을 구현해야만 한다. java.lang.Comparable compareTo() public interface Comparable<T> { intcompareTo(T o); } 리턴 값 : 이 객체가 인자로 전달받은 객체보다 작으면 음의 정수, 같으면 0, 크면 양의 정수를 리턴한다. Head First JAVA

  14. Comparable 인터페이스 (2/2) classSong implements Comparable<Song> { String title; String artist; String rating; String bpm; public intcompareTo(Song s) { return.title.comparableTo(s.getTitle()); } Song(String t, String a, String r, String b) { title = t; artist = a; rating = r; bpm = b; } public String getTitle() { returntitle; } public String getArtist() { returnartist; } public String getRating() { returnrating; } public String getBpm() { returnbpm; } public String toString() { returntitle; } } sort() 메소드에서는compareTo()에 어떤 Song 객체를 인자로 전달하여 그 Song 객체를 compareTo() 메소드가 호출된 Song 객체하고 비교해준다. String에도 compareTo() 메소드가 있으므로 title이라는 String 객체에 할 일을 넘기면 된다. [Pink Moon, Somersault, Shiva Moon, Circles, Deep Channel, Passenger, Listen] [Circles, Deep Channel, Listen, Passenger, Pink Moon, Shiva Moon, Somersault] Head First JAVA

  15. Comparator 인터페이스 (1/3) 곡 목록을 제목 순, 아티스트 순, 이렇게 서로 다른 기준으로 출력하려면?? Collections API를 보면 또 다른 sort() 메소드가 있는데, 그 메소드에서는Comparator를 인자로 받아들인다. java.util.Comparator<T> sort(List<T> list, Comparator<? Super T>) - 인자가 한 개인 sort(List o) 메소드를 호출하면 목록에 있는 원소의 compareTo() 메소드에의해 순서가 결정된다. - sort(List o, Comparator c)를 호출했을 때는 대신 Comparator의 compare() 메소드가 호출된다. public interface Comparator<T> { int compare(T o1, T o2); } Head First JAVA

  16. Comparator 인터페이스 (2/3) 주크박스에서 Comparator를 사용하는 방법 Comparator를 (예전에 compareTo() 메소드에서 하던 일을 처리하는 compare() 메소드를) 구현하는 내부 클래스를 추가한다. Comparator 내부 클래스의 인스턴스를 만든다. 오버라이드된sort() 메소드를 호출하며, 이 때 곡 목록과 Comparator 내부 클래스의 인스턴스를 모두 인자로 전달한다. Head First JAVA

  17. Comparator 인터페이스 (3/3) importjava.util.*; import java.io.*; public class Jukebox5 { ArrayList<Song> songList = newArrayList<Song>(); public static void main(String[] args) { new Jukebox5().go(); } class ArtistCompare implements Comparator<Song> { public int compare(Song one, Song two) { return one.getArtist().compareTo(two.getArtist()); } } public void go() { getSongs(); System.out.println(songList); Collections.sort(songList); System.out.println(songList); ArtistCompareartistCompare = new ArtistCompare(); Collections.sort(SongList, artistCompare); System.out.println(songList); } voidgetSongs() { … } voidaddSong(String lineToParse) { … } } Comparator를 구현하는 내부 클래스 String에서는 이미 알파벳 순서를 기준으로 비교하는 방법을 알고 있기 때문에 실제 비교 작업은 String 변수에서 처리 Comparator 내부클래스의 인스턴스 생성 sort() 메소드 호출. 목록과 새로 만든 Comparator 객체에 대한 레퍼런스를 인자로 전달 Head First JAVA

  18. 다른 문법, 같은 기능 public <T extends Animal> voidtakeThing(ArrayList<T> list) = public voidtakeThing(ArrayList<? extends Animal> list) Ex> 메소드에 인자가 두 개 있는데 둘 다 Animal을 확장하는 유형이라면 다음과 같이 유형 매개변수를 한 번만 선언하는 것이 public <T extends Animal> voidtakeThing(ArrayList<T> one, Array<T> two) 다음과 같이 매번 타이핑 하는 것보다 효율적이다. public voidTakeThing(ArrayList<? extends Animal> one, ArrayList<? extends Animal> two) Head First JAVA

More Related