ABOUT ME

다시 시작~!

Today
Yesterday
Total
  • 11. 컬렉션과 제네릭<>
    Programming/JAVA 2010. 5. 3. 21:10

    1 배경
    1.1 데이터 저장 공간

    프로그래밍의 기본

    데이터 저장 공간을 이해하는 것

    데이터 저장공간

    기본 데이터 타입의 변수

    일반적인 클래스의 객체

    배열(Array) 클래스

    단순 용량적인 측면에서의 데이터 저장공간

    컬렉션(Collection)류나 맵(Map)류의 클래스

    자료구조적인 측면에서의 데이터 저장공간
    1.2 용량적인 저장 공간

    10개의int형변수선언

    int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;

    배열을이용한10개의int형변수선언

    int[] ar = new int[10];

    Top 클래스

    class Top {

    //...클래스의 내용

    }

    Top 클래스객체10개선언

    Top t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;

    배열을 이용한 Top 클래스 객체 10개 선언

    Top[] t = new Top[10];
    a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]
    t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9]
    1.3 자료구조적인 저장 공간

    단순 저장공간의 문제

    자료를 처리하는 방식의 문제(자료구조적인 측면)

    동적인 공간의 문제(메모리 공간)

    빠른 검색의 문제

    배열

    양적인저장공간

    배열의 검색

    사용자가 직접 전체 데이터를 확인해서 검색해야 한다

    해결책

    컬렉션류나 맵류의 클래스 사용
    2 Collection과 Map
    2.1 배열의 발전된 형태

    배열의 발전된 모델

    컬렉션(Collection)과 맵(Map) 계열의 클래스

    배열의 크기를 동적으로 늘릴수 없다는 단점을 보완하여 동적으 로 메모리를 확장할 수 있는 클래스이다

    Collection과 Map 인터페이스

    Collection과 Map은 인터페이스이기 때문에 메서드의 프로토 타입만 존재한다.

    Collection계열 클래스는 집합적인 저장공간으로서의 기능을 구 현한 클래스가 된다.

    Map계열 클래스는 검색적인 저장공간으로서의 기능을 구현한 클래스가 된다.
    2.2 Collection과 Map의 특징

    Collection, Map유형의 특징은 객체의 삽입, 삭제, 수정, 검색의 기능을 가지고 있다.

    이들은 각 클래스마다 구현된 알고리즘의 약간의 차이가 있을 뿐 전부 같은 부류이다.

    이 Collection과 Map 유형이 배열과 구분되는 점

    크기를 동적으로 확장할 수 있다는 점과,

    배열은 기본형 타입의 배열도 있는 반면에 오로지 객체만을 그 저 장대상으로 한다는 점이다.
    2.2 Collection과 Map의 특징

    Collection계열 클래스의 삽입과 삭제를 위한 추상 메서드

    JDK 5이전

    boolean add(Object o)

    boolean remove(Object o)

    JDK 5이후

    boolean add(E o)

    boolean remove(Object o)

    Map계열 클래스의 삽입과 삭제를 위한 추상 메서드

    JDK 5이전

    Object put(Object key, Object value)

    Object remove(Object key)

    JDK 5이후

    V put(K key, V value)

    V remove(Object key)
    2.3 Collection과 Map의 상속구조
    Collection
    Set
    List
    Map
    HashSet
    TreeSet
    Stack
    Vector
    ArrayList
    LinkedList
    SortedMap
    Hashtable
    HashMap
    TreeMap
    SortedSet
    키와 값으로 데이터 핸들
    순서나 집합적인 저장공간
    순서가 있는 저장 공간
    집합적인 저장 공간
    동기화 보장하는 Map 계열의 클래스
    동기화 보장하지 않는 Map 계열의 클래스
    정렬을 위한 Map 계열의 클래스
    정렬을 위한 Set 계열의 클래스
    동기화 보장
    동기화 보장 하지 않음
    스택자료구조
    링크드리스트
    Set계열의 대표클래스
    2.3 Collection과 Map의 상속구조

    Collection 인터페이스의 상속구조

    List와Set이된다.

    List는 순서가 있는 Collection으로 중복값을 허용한다.

    Set은 수학적인 집합개념에 가까우며 중복값을 허용하지 않는다.

    List를 구현한 클래스

    Stack, Vector, ArrayList, LinkedList

    Set을 구현한 클래스

    HashSet, TreeSet
    2.3 Collection과 Map의 상속구조

    Map 인터페이스의 상속구조

    List와 Set이 순서나 집합적인 개념의 인터페이스라면

    Map은 검색기능이 강화된 인터페이스이다

    데이터를 삽입할 때, key와 value의 형태로 삽입되며,

    이 key를 이용해서 값을 얻을 수 있는 특징이 있다.

    Map인터페이스를 구현한 클래스

    HashMap, Hashtable, TreeMap
    2.3 Collection과 Map의 상속구조

    Sorted 계열의 상속구조

    Set과 Map인터페이스를 상속받아 정렬기능이 추가된 SortedSet과 SortedMap인터페이스가 된다.

    이들은 각각 TreeSet클래스와 TreeMap클래스로 구현된 다.

    SortedSet : Set 인터페이스 상속

    Set계열이면서정렬이가능한클래스

    SortedMap : Map 인터페이스 상속

    Map계열이면서정렬이가능한클래스

    둘 다 모두 정렬기능을 포함한다!
    2.4 Collection 인터페이스

    Collection 인터페이스의 특징

    이것을 구현한 클래스들은 모두 집합적인 저장공간으로서 의 기능을 가진다.

    모두 객체의 묶음이지만 클래스 별로 약간씩 다르다.

    Collection 인터페이스를 구현하고 있는 클래스

    Stack, Vector, LinkedList, TreeSet, HashSet

    대표적인 클래스는 Vector이다.
    2.4 Collection 인터페이스

    Collection 인터페이스의 데이터 확인을 위한 추상 메서드 (5.0이전 이후 동일)

    boolean isEmpty();

    비어 있는지 확인하는 메서드

    boolean contains(Object o);

    특정 객체가 포함되어 있는지 확인하는 메서드

    int size();

    포함된 객체의 수를 리턴하는 메서드

    Collection 인터페이스의 데이터를 배열로 얻기 위 한 추상메서드도 가지고 있다.

    Object[] toArray(); (T[] toArray() – JDK5이후)

    포함된 모든 객체들을 배열 형태로 리턴하는 메서드
    2.5 Map 인터페이스

    Map 인터페이스의 특징

    Collection과 달리 Map은 검색적인 개념을 담고 있 는 인터페이스

    검색을위해key를가지고있다.

    Map인터페이스는 비어있는지, 특정키가 있는지 특정 데이터가 있는지 데이터가 몇 개인지를 검사하는 메서 드를 지원한다.

    Map으로 구현된 클래스

    Attributes, HashMap, Hashtable, TreeMap

    대표적인 클래스는 Hashtable이다.
    2.5 Map 인터페이스

    Map 인터페이스의 데이터 삽입 삭제를 위한 추상 메서드

    Java 1.4까지

    Object put(Object key, Object value);

    데이터를 삽입하는 메서드

    Object remove(Object key);

    키(key)를 이용해서 데이터를 제거하는 메서드

    Object get(Object key);

    키(key)를 이용해서 데이터를 검색하는 메서드

    int size();

    포함된 객체가 몇 개인지 확인하는 메서드

    Java 5부터

    V put(K key, V value);

    V remove(Object key);

    V get(Object key);
    2.5 Map 인터페이스

    Map 인터페이스의 데이터 확인을 위한 추상 메서드

    자바 5.0 이전 이후 동일하다.

    boolean isEmpty();

    비어 있는지 확인하는 메서드

    boolean containsKey(Object key);

    특정 키가 있는지 확인하는 메서드

    boolean containsValue(Object value);

    특정 데이터가 있는지 확인하는 메서드

    int size();

    포함된 객체가 몇 개인지 확인하는 메서드
    3 컬렉션 클래스 비교
    3.1 Vector와 ArrayList의 비교

    Vector와 ArrayList의 공통점

    순서가 있는 Collection이다.

    배열을 컬렉션으로 만들었다고 보면 된다.

    List 인터페이스를 구현하고 있다.

    데이터를 중복해서 포함할 수 있다.

    둘은 기능면에서 거의 동일하다

    하지만 Vector는 동기화를 보장하는 반면

    ArrayList는 동기화를 보장하지 않는다.
    Collection
    List
    Stack
    Vector
    ArrayList
    LinkedList
    동기화보장
    동기화보장하지 않음
    3.1 Vector와 ArrayList의 비교

    ArrayList도 동기화가 가능하다.

    ArrayList의동기화지원방법

    List list = Collections.synchronizedList(new ArrayList(...));

    이렇게 되면 완전히 Vector와 동일한 클래스가 된다.
    3.2 Hashtable, HashMap의 비교

    Hashtable, HashMap의 공통점

    Map 인터페이스를 구현하고 있다.

    키(Key)와 값(Value)을 이용해서 데이터를 관리한다.

    내부적으로 모두 Hash 기법을 이용하기 때문에 Hash란 단어가 사용되었다.

    Hashtable과 HashMap

    Hashtable은 동기화가 보장 되지만 HashMap은 동기화가 보 장되지 않는다.
    Map
    SortedMap
    Hashtable
    HashMap
    동기화 보장
    동기화 보장하지 않음
    3.2 Hashtable, HashMap의 비교

    HashMap의 동기화 지원 방법

    Map m = Collections.synchronizedMap(new HashMap(...));

    Vector와 ArrayList와 마찬가지로 이렇게 되면 Hashtable과 기능적으로 동일한 클래스가 된다.

    Hashtable, HashMap과 HashSet과의 관계

    Hashtable과 HashMap은 둘다 Map 인터페이스를 구현하고 있다.

    HashSet은 내부적으로 Hash기법을 사용하지만 Set 인터페이 스를 구현하고 있다.
    3.3 Sorted와 Not Sorted의 비교

    Sorted를지원하지않는클래스

    HashSet, HashMap

    Sorted를 지원하는 클래스

    TreeSet과 TreeMap
    Collection
    Set
    Map
    HashSet
    TreeSet
    SortedMap
    Hashtable
    HashMap
    TreeMap
    SortedSet
    3.3 Sorted와 Not Sorted의 비교

    TreeMap

    Key와 Value로 데이터 관리

    Key를 기준으로 오름차순으로 정렬된다.

    Map인터페이스를 상속한 SortedMap인터페이스를 구현한 클래스

    TreeSet

    Set인터페이스를 상속한 SortedSet인터페이스를 구현한 클래스

    데이터들이 자동으로 오름차순으로 정렬된다.

    이 두 클래스는 기본적으로 정렬이 되지만 사용자가 직접 정렬 방식을 지정할 수 있다.

    TreeSet과 TreeMap은 정렬을 위한 Comparator 인터페이스를 구현하면 된다.
    4 Collection 계열 클래스
    4.1 Stack

    Stack 클래스

    데이터의 삽입과 추출이 후입선출(Last-In First-Out)로 되어 있는 자료구조

    즉, 맨 나중에 들어간 데이터가 제일 먼저 나오는 자료구조를 클래스화 한 것이다.

    데이터를 삽입할 때는 push()메서드를 사용

    추출할 때는 pop()메서드를 사용한다.

    그리고 추출한 데이터를 삭제하지 않고 가져오기만 할 때는 peek()을 사용한다.
    4.1 Stack
    import java.util.*;
    public class StackMain{
    public static void main(String[] args) {
    Stack<String> stack = new Stack<String>();
    System.out.println(stack.empty());
    stack.push(new String("jabook"));
    stack.push(new String("java"));
    stack.push(new String("소설같은자바"));
    System.out.println(stack.empty()); //데이터가있는지검사
    System.out.println(stack.peek()); //데이터삭제없이추출만!
    System.out.println(stack.pop()); //데이터추출하며삭제도!
    System.out.println(stack.peek());
    System.out.println(stack.search("jabook")); //데이터검색
    }
    }
    Collection
    List
    Stack
    Vector
    ArrayList
    LinkedList
    4.2 ArrayList

    ArrayList 클래스

    클래스명에서도알수있듯이배열의성격도가지고있으며 List자료구조적인 성격을 가지고 있는 클래스이다.

    List인터페이스의 메서드를 사용해서

    데이터를 삽입할 때는 add()를,

    추출할 때는 get()메서드를 이용한다.
    4.2 ArrayList
    import java.util.*;
    public class ArrayListMain{
    public static void main(String args[]) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("홍길동");
    list.add("김삿갓");
    list.add("이몽룡");
    list.add("성춘향");
    list.add("변사또");
    System.out.println(list);
    System.out.println("Index2 : " + list.get(2));
    System.out.println("Index0 : " + list.get(0));
    String[] arList = new String[list.size()];
    list.toArray(arList);
    System.out.println("Index1 : " + arList[1]);
    System.out.println("Index3 : " + arList[3]);
    }
    }
    Collection
    List
    Stack
    Vector
    ArrayList
    LinkedList
    4.3 HashSet

    HashSet 클래스

    Set의 성격을 가지고 있으면서 내부에는 해시의 기법을 사용 하는 클래스이다.

    중복을 허용하지 않는 집합적인 성격을 가지고 있다

    기본메서드로는

    add(), remove(), contains(), size()등이 있다.

    HashSet에서 데이터를 추출하기 위해서 Iterator를 사용한다
    Iterator<String> iter= set.iterator();
    while(iter.hasNext()){
    String temp = iter.next();
    System.out.print(temp+ ", ");
    }

    Iterator는 컬렉션내의 모든 데이터에 접근할 수 있다.
    4.3 HashSet
    import java.util.*;
    public class HashSetMain{
    public static void main(String args[]) {
    Set<String> set = new HashSet<String>();
    set.add("김삿갓");
    set.add("홍길동");
    set.add("춘향이");
    set.add("이도령");
    set.add("향단이");
    System.out.println("HashSet: " + set);
    set.remove("이도령");
    System.out.println(set.contains("홍길동"));
    Iterator<String> iter = set.iterator();
    while(iter.hasNext()){
    String temp = iter.next();
    System.out.print(temp + ", ");
    }
    System.out.println();
    }
    }
    Collection
    Set
    HashSet
    SortedSet
    4.4 Vector

    Vector 클래스

    순서의 개념을 가지고 있는 저장공간이다.

    가장 많이 쓰이는 컬렉션 클래스 중의 하나이다.

    삽입할때는 addElement()를

    추출할 때는 elementAt()을 사용한다.

    크기를 확인하는 size()메서드가 많이 쓰인다.

    그 외에 insertElement()등의 메서드도 쓰이지만 거의 활용빈도는 없다.

    데이터 삽입, 추출, 크기확인의 메서드만 알아도 된다.
    4.4 Vector
    public class VectorMain {
    public static void main(String[] args) {
    Vector<String> v = new Vector<String>();//Vector 객체생성
    System.out.println("Vector 생성직후의size : " + v.size());
    v.addElement(new String("망아지"));
    v.addElement(new String("송아지"));
    v.addElement(new String("강아지"));
    v.addElement(new String("병아리"));
    System.out.println("Vector에데이터삽입후의size : " + v.size());
    for(int i=0; i< v.size(); i++){
    String temp = v.elementAt(i);
    System.out.println("Vector v의" + i + "번째:" + temp);
    }
    }
    }
    Collection
    List
    Stack
    Vector
    ArrayList
    LinkedList
    new String("망아지")
    new String(”송아지")
    new String(”강아지")
    new String(”병아리")
    인덱스 : 0
    인덱스 : 1
    인덱스 : 2
    인덱스 : 3
    Vector v = new Vector();
    v.addElement(new String(”망아지"));
    v.addElement(new String("송아지"))
    v.addElement(new String("강아지"));
    v.addElement(new String("병아리"));
    4.4 Vector

    Vector v에 데이터가 삽입된 순서
    4.5 Vector

    Vector 예제
    import java.util.Vector;
    class VectorTest{
    public static void main(String[] args){
    Vector<Object> v = new Vector<Object>(); //객체생성
    v.addElement(newCharacter('A')); //Wrapper 클래스의사용
    v.addElement(newString("굼뱅이"));
    v.addElement(newInteger(100)); //Wrapper 클래스의사용
    v.addElement(newInteger(200)); //Wrapper 클래스의사용
    System.out.println("Vector의size():" + v.size());
    v.insertElementAt(newFloat(3.141592), 1);
    System.out.println("insertElementAt()-size():" + v.size());
    v.setElementAt("Hello", 3);
    System.out.println("setElement()-size():" + v.size());
    System.out.println("v의0번째:" + (Character)v.elementAt(0));
    System.out.println("v의1번째:" + (Float)v.elementAt(1));
    System.out.println("v의2번째:" + (String)v.elementAt(2));
    System.out.println("v의3번째:" + (String)v.elementAt(3));
    System.out.println("v의4번째:" + (Integer)v.elementAt(4));
    if(v.contains("Hello")){ //데이터가있는지확인
    int find = v.indexOf("Hello"); //데이터위치확인
    System.out.println("v의" + find + "번째:" + (String)v.elementAt(find));
    }
    }
    }
    4.4 Vector

    Vector 예제

    결과

    Vector의 size():4

    insertElementAt()-size():5

    setElement()-size():5

    v의0번째:A

    v의1번째:3.141592

    v의2번째:굼뱅이

    v의3번째:Hello

    v의4번째:200

    v의3번째:Hello

    Vector클래스 메서드들의 용법에 대해 알아보는 예제
    4.5 AutoBoxing이없을때(자바1.4)

    이전까지는 컬렉션 클래스에 데이터를 삽입할 경우

    기본형 데이터의 경우에는 이에 matching되는 Wrapper클래스를 이용하여 데이터를 삽입하였다.

    자바 1.4까지
    Vector v = new Vector(); //객체생성
    v.addElement(new Integer(100)); //Wrapper클래스사용
    v.addElement(new Integer(200)); //Wrapper클래스사용
    Integer t0 = (Integer)v.elementAt(0);
    Integer t1 = (Integer)v.elementAt(1);
    4.6 AutoBoxing(자바 5.0)

    JDK5이상부터는더이상이러한작업이필요없게되 었다.

    즉, 아래와 같이 컬렉션에 직접 기본형 데이터를 삽입할 수 있게 된 것이다.

    자바 5.0 이후
    Vector<Integer> v = new Vector<Integer>();
    v.addElement(100); //AutoBoxing 발생
    v.addElement(200); //AutoBoxing 발생

    자바 5.0 이상에서는 컴파일러가 내부에서 자동으로 Wrapper 클래스의 객체로 변경시켜 준다.
    int a0= v.elementAt(0);//AutoUnBoxing 발생
    int a1= v.elementAt(1);//AutoUnBoxing 발생

    자바 5.0 이상에서는 컴파일러가 내부에서 자동으로 객체 를 적절한 상수값으로 변경시켜 준다.
    5 Map 계열 클래스
    5.1 HashMap

    Map계열의 대표적인 클래스

    key와 value로 데이터를 관리하며 키를 이용해서 데 이터를추출할수있다.

    데이터를 입력할 때는 put()을

    데이터를 추출할 때는 get()을 이용하면 된다.
    5.1 HashMap
    import java.util.*;
    public class HashMapMain{
    public static void main(String args[]) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("홍길동", new Integer(1));
    map.put("김삿갓", new Integer(2));
    map.put("이도령", new Integer(3));
    map.put("춘향이", new Integer(4));
    map.put("향단이", new Integer(5));
    System.out.println(map.get("홍길동"));
    System.out.println(map.get("김삿갓"));
    System.out.println(map.get("이도령"));
    System.out.println(map.get("춘향이"));
    System.out.println(map.get("향단이"));
    }
    }
    Map
    SortedMap
    Hashtable
    HashMap
    5.2 Hashtable

    일반적으로 동기화가 필요없다면 HashMap을 필요하 다면 Hashtable을 사용하면 된다.

    동기화 보장 외에는 차이가 거의 없으며 심지어 사용 하는 메서드도 같다.
    5.2 Hashtable
    import java.util.Hashtable;
    public class HashtableMain {
    public static void main(String[] args) {
    Hashtable<String, Object> h = new Hashtable<String, Object>();
    //Hashtable에키와데이터의삽입
    h.put("Name", new String("홍길동"));
    h.put("Age", new Integer(27));
    h.put("Tel", new String("02-1111-2222"));
    h.put("Handphone", new String("017-777-9999"));
    h.put("Etc", new String("I'm a boy"));
    //키값을이용해서객체추출
    String name = (String)h.get("Name");
    Integer age = (Integer)h.get("Age");
    }
    }
    Map
    SortedMap
    Hashtable
    HashMap
    6 Sorted 계열 클래스
    6.1 TreeSet과 TreeMap

    HashSet을 이용한 TreeSet 생성

    예제
    import java.util.*;
    public class TreeSetMain{
    public static void main(Stringargs[]) {
    Set<String> set = new HashSet<String>();
    set.add(newString("김삿갓"));
    set.add(newString("홍길동"));
    set.add(newString("춘향이"));
    set.add(newString("이도령"));
    set.add(newString("향단이"));
    System.out.println("HashSet: " + set);
    TreeSet<String> ts= new TreeSet<String>();
    ts.addAll(set);
    System.out.println("TreeSet: " + ts);
    }
    }
    6.1 TreeSet과 TreeMap

    결과

    [이도령, 춘향이, 향단이, 김삿갓, 홍길동]

    [김삿갓, 이도령, 춘향이, 향단이, 홍길동]

    설명

    HashSet을 이용하여 TreeSet을 생성해 보았다.

    입력했던 순서가 아닌 가나다 순서로 출력됨을 알 수 있다.
    HashSet
    TreeSet
    sorted 기능을
    이용하기 위해서
    Set
    6.1 TreeSet과 TreeMap

    HashMap을 이용해서 TreeMap 생성

    예제
    import java.util.*;
    public class TreeMapMain{
    public static void main(Stringargs[]) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("홍길동", new Integer(1));
    map.put("김삿갓", new Integer(2));
    map.put("이도령", new Integer(3));
    map.put("춘향이", new Integer(4));
    map.put("향단이", new Integer(5));
    System.out.println("HashMap: " + map);
    Map<String, Integer>sortedMap= new TreeMap<String, Integer>();
    sortedMap.putAll(map);
    System.out.println("TreeMap: " + sortedMap);
    }
    }
    6.1 TreeSet과 TreeMap

    결과

    {춘향이=4, 이도령=3, 향단이=5, 김삿갓=2, 홍길동=1}

    {김삿갓=2, 이도령=3, 춘향이=4, 향단이=5, 홍길동=1}

    설명

    HashMap을 이용하여 TreeMap을 생성해 보았다.

    출력이 입력했던 순서가 아닌 key값의 가나다 순서로 출력됨을 알 수 있다.
    HashMap
    TreeMap
    sorted 기능을
    이용하기 위해서
    Map
    6.2 TreeSet의 Comparator 구현

    TreeSet/TreeMap에 데이터를 삽입하면 기본적으로 오름차순으로 정렬이 된다

    그것도 문자열이나 기본 데이터 타입 같은 단순한 것에만 해당된다.

    만약 사용자가 직접 만든 클래스의 형이라면 사용자가 직 접 비교법을 넣어 주어야 한다.

    TreeSet/TreeMap의 경우에는 Comparator인터페이스를 구현하면 된다.

    구현방법
    class MyComparator<T> implements Comparator<T>{
    public int compare(To1, T o2){
    //…비교방법구현
    }
    }
    6.2 TreeSet의 Comparator 구현

    예제
    import java.util.*;
    class Score{
    private int korea=0;
    private int math=0;
    public Score(intkorea, int math){
    this.korea= korea;
    this.math= math;
    }
    public int getSum(){
    return this.korea+ this.math;
    }
    public String toString(){
    return "국어:" + korea+ " 수학:" + math;
    }
    }
    6.2 TreeSet의 Comparator 구현

    예제 - 계속
    class MyComparator<T> implements Comparator<T>{
    //정렬작업을한다.
    public int compare(To1, T o2){
    Score s1 = (Score)o1;
    Score s2 = (Score)o2;
    int r = s1.getSum() -s2.getSum();
    if(r>0){
    return 1; //오름차순정렬
    }else if(r==0){
    return 0;
    }else {
    return -1; //내림차운정렬
    }
    }
    }
    6.2 TreeSet의 Comparator 구현

    예제 – TreeSet을 이용한 테스트
    public class ComparatorTreeSetTest{
    public static void main(String[] args){
    TreeSet<Score> tset= new TreeSet<Score>(new MyComparator<Score>());
    //삽입과동시에정렬된다.
    tset.add(newScore(21, 22));
    tset.add(newScore(61, 62));
    tset.add(newScore(81, 82));
    tset.add(newScore(11, 12));
    tset.add(newScore(31, 32));
    System.out.println(tset);
    }
    }

    결과

    [국어:11 수학:12, 국어:21 수학:22, 국어:31 수학:32, 국어:61 수 학:62, 국어:81 수학:82]
    6.3 TreeMap의 Comparator 구현

    예제 – TreeMap을 이용한 테스트
    public class ComparatorTreeMapTest{
    public static void main(String[] args){
    TreeMap<Score, String> tmap= new TreeSet<Score, String>(new MyComparator<Score>());
    //삽입과동시에정렬된다.
    tmap.add(newScore(21, 22), “홍길동1”);
    tmap.add(newScore(61, 62), “홍길동2”);
    tmap.add(newScore(81, 82), “홍길동3”);
    tmap.add(newScore(11, 12), “홍길동4”);
    tmap.add(newScore(31, 32), “홍길동5”);
    System.out.println(tmap);
    }
    }

    결과

    {국어:11 수학:12=홍길동4, 국어:21 수학:22=홍길동1, 국어:31 수학:32=홍길 동5, 국어:61 수학:62=홍길동2, 국어:81 수학:82=홍길동3}
    7 Enumeration과 Iterator
    7.1 컬렉션 검색

    컬렉션 내의 데이터에 손쉽게 접근하기 위한 가장 일반적 인 방법은 바로 Enumeration과 Iterator를 사용하는 것 이다.

    JDK5에 들어오면서 Enumeration과 Iterator대신에 새 로운 제어문인 Advanced for문을 제공해 준다.

    Iterator의경우JDK1.2부터Enumeration의대체용으 로 제공되었다.

    Enumeration의 경우 내부에서 사용하는 메서드의 이름이 길고 Fail-Fast를 지원하지 않았기 때문이다.
    7.1 컬렉션 검색

    컬렉션 검색을 위한 제어문(자바 5.0)

    Advanced for(일명 foreach)

    자바 5.0에 새롭게 추가된 컬렉션을 위한 반복 제어문

    데이터의 마지막에 상관하지 않고 검색하기 위한 제어문

    Advanced for의 예
    import java.util.*;
    public class EasyForEachMain{
    public static void main(String[] args){
    String[] ar= new String[]{"안녕1", "안녕2", "안녕3"};
    for (String tmp: ar){
    System.out.println(tmp);
    }
    }
    }
    7.2 Vector에서 Enumeration얻기

    예제
    import java.util.*;
    class EnumerationVectorTest{
    public static void main(String[] args){
    Vector<String> v = new Vector<String>();
    v.addElement(newString("망아지"));
    v.addElement(newString("송아지"));
    v.addElement(newString("강아지"));
    v.addElement(newString("병아리"));
    Enumeration<String> en = v.elements();
    while(en.hasMoreElements()){
    String temp = en.nextElement();
    System.out.println(temp);
    }
    }
    }
    7.2 Vector에서 Enumeration얻기

    결과

    망아지

    송아지

    강아지

    병아리

    설명

    Vector를 Enumeration 객체로 변환시켜 이를 출력

    다음 원소를 찾을 때 사용하는 메서드 : nextElement()

    원소가 더 있는지 확인하는 메서드 : hasMoreElements()

    이두메서드가가장많이쓰인다.
    7.3 Hashtable에서 Enumeration얻기

    예제
    import java.util.*;
    class EnumerationHashtableTest{
    public static void main(String[] args){
    Hashtable<String, String> h = new Hashtable<String, String>();
    h.put("1", new String("홍길동"));
    h.put("2", new String("안녕하세요"));
    h.put("3", new String("02-1111-2222"));
    h.put("4", new String("017-777-9999"));
    Enumeration<String> en = h.elements();
    while(en.hasMoreElements()){
    String temp = en.nextElement();
    System.out.println(temp);
    }
    }
    }
    7.3 Hashtable에서 Enumeration얻기

    결과

    017-777-9999

    02-1111-2222

    안녕하세요

    홍길동

    설명

    hashtable에 객체의 삽입

    Hashtable<String, String> h = new Hashtable<String, String>();

    h.put("1", new String("홍길동"));



    Enumeration 얻기

    Enumeration en = h.elements();

    나머지는 Vector의 경우와 동일하다.
    7.4 Vector와 Iterator

    Iterator는 Enumeration과 동일한 기능을 한다.

    Vector를 Iterator로 변환시키는 것은

    Vector를 Enumeration으로 변환시키는 것과 동일하다.

    Vector  Enumeration의 경우

    elements()메서드를 사용한 반면,

    Vector  Iterator의 경우

    iterator()메서드를 사용하면 된다.

    hasMoreElements()는 hasNext()로

    nextElement()는 next()로 대체 되었다.
    7.4 Vector와 Iterator

    예제
    import java.util.*;
    class IteratorVectorTest{
    public static void main(String[] args){
    Vector<String> v = new Vector<String>();
    v.addElement(newString("망아지"));
    v.addElement(newString("송아지"));
    v.addElement(newString("강아지"));
    v.addElement(newString("병아리"));
    Iterator<String> iter= v.iterator();
    while(iter.hasNext()){
    String temp = iter.next();
    System.out.println(temp);
    }
    }
    }
    7.4 Hashtable과 Iterator

    예제
    import java.util.*;
    class IteratorHashtableTest{
    public static void main(String[] args){
    Hashtable<String,String> h = new Hashtable<String,String>();
    h.put("1", new String("홍길동"));
    h.put("2", new String("안녕하세요"));
    h.put("3", new String("02-1111-2222"));
    h.put("4", new String("017-777-9999"));
    Iterator<String> iter2 = h.values().iterator();
    while(iter2.hasNext()){
    String temp = iter2.next();
    System.out.println(temp);
    }
    }
    }
    7.5 Enumeration과 Iterator의 차이

    Fail-Fast 방식

    Iterator를 이용해서 순차적으로 접근하고 있는 도중 다른 곳에 서 해당 컬렉션 객체에 데이터를 추가하거나 삭제하는 등의 작 업이 일어난다면 ConcurrentModificationException이발생하 게하는방식

    자바 1.2부터 지원

    Enumeration은 컬렉션의 집합을 통째로 복사해서(SnapShot) 사용하기 때문에 Fail-Fast를 지원하지 않는다.

    그러나 Iterator는 Fail-Fast방식을 지원한다.
    7.6 for each 문(자바 5.0)의 예
    import java.util.*;
    public class ForEachMain{
    public static void main(String[] args){
    ArrayList<String> ar = new ArrayList<String>();
    ar.add("안녕1");
    ar.add("안녕2");
    ar.add("안녕3");
    //1. 일반적인For문
    for(Iterator<String> i = ar.iterator(); i.hasNext();) {
    String tmp = i.next();
    System.out.println(tmp);
    }
    //2. For Each문Java SE 5.0의코드
    for (String tmp : ar){
    System.out.println(tmp);
    }
    }
    }
Designed by Tistory.