본문 바로가기
아카이브/자바의 정석

11장 컬렉션 프레임워크 20201102

by nineteen 2020. 11. 2.
반응형

Iterator, ListIterator, Enumeration   p614~

 

Iterator, ListIterator, Enumeration은 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스

 

Enumeration - Iterator의 구버전

ListIterator - Iterator의 기능 향상 시킨 것

 

 

 

Iterator

 

컬렉션 프레임워크에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화

컬렉션에 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의

-> Collection인터페이스에 Iterator반환하는 iterator()메소드 정의

 

iterator()로 Iterator를 얻은 후 컬렉션 클래스의 요소들을 읽어 올 수 있음

 

Map인터페이스를 구현한 클래스는 키와 값을 쌍으로 저장해서 iterator()를 직접호출 불가,

-> keySet()이나 entrySet()과 같은 메소드로 키와 값을 각각 따로 Set의 형태로 얻은 후 iterator()호출해야 Iterator획득

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class IteratorEx1 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        
        Iterator it = list.iterator();    // Iterator 획득
        
        while(it.hasNext()) {
            Object obj = it.next();
            System.out.println(obj);
        }
    }
}
 
cs

출력

1

2

3

4

5

 

 

 

 

 

ListIterator와 Enumeration

 

Enumeration - Iterator의 구버전

ListIterator - Iterator에 양방향 조회기능추가(List를 구현한 경우만 사용가능)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
 
public class ListIteratorEx1 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        
        ListIterator lit = list.listIterator();    // ListIterator 획득
        
        while(lit.hasNext())                    // 순차적으로 읽어옴
            System.out.print(lit.next());
        System.out.println();
        
        while(lit.hasPrevious())                // 역방향으로 읽어옴
            System.out.print(lit.previous());
        System.out.println();
    }
}
 
cs

출력

12345
54321

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.ArrayList;
import java.util.Iterator;
 
public class IteratorEx2 {
    public static void main(String[] args) {
        ArrayList original = new ArrayList(10);
        ArrayList copy1 = new ArrayList(10);
        ArrayList copy2 = new ArrayList(10);
        
        for(int i=0; i<10; i++)                    // original에 요소 저장
            original.add(i+"");
        
        Iterator it = original.iterator();        // Iterator 획득
        
        while(it.hasNext())                     // original의 요소를 copy1에 복사
            copy1.add(it.next());
        
        System.out.println("= Original에서 copy1로 복사 =");
        System.out.println("original:" + original);
        System.out.println("copy1:" + copy1);
        System.out.println();
        
        it = original.iterator();                // 획득한 Iterator는 재사용 x -> 다시 얻어옴
        
        while(it.hasNext()) {                    // original의 요소를 copy2에 복사, original요소는 삭제    
            copy2.add(it.next());
            it.remove();
        }
        
        System.out.println("= Original에서 copy2로 복사 =");
        System.out.println("original:" + original);
        System.out.println("copy2:" + copy2);
    }
}
 
cs

출력

= Original에서 copy1로 복사 =
original:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
copy1:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

= Original에서 copy2로 복사 =
original:[]
copy2:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 

--> 27행에 의해 original의 요소들은 copy2에 복사 후, 삭제

 

 

 

 

 

Arrays

 

배열을 다루는데 유용한 메소드 정의

 

 

배열 복사

copyOf() - 배열 전체 복사

copyOfRange() - 배열의 일부 복사, 지정된 범위의 끝은 포함x

 

 

배열 채우기

fill() - 배열의 모든 요소를 지정된 값으로 채움

setAll() - 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받음

 

 

배열 정렬/검색

sort() - 배열 정렬

binarySearch() - 배열 검색, 정렬이 선행되어야 함

 

 

문자열 비교/출력

equals() - 두 배열에 저장된 모든 요소를 비교해서 같으면 true

           - 다차원 배열 비교에는 deepEquals() 사용

toString() - 배열의 모든 요소를 문자열로 출력

             - 다차원 배열에는 deepToString()사용

 

배열 -> List 변환

asList() - 배열을 List에 담아서 변환

 

 

 

 

 

 

 

Comparator와 Comparable

 

Arrays.sort()를 호출 시, 정렬되는 이유는 Character클래스의 Comparable의 구현에 의해 정렬된 것

 

Comparator와 Comparable은 인터페이스로, 컬렉션을 정렬하는데 필요한 메소드를 정의

 

Comparable

- 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들(ex. Wrapper, String, File등)에 구현

- 기본적으로 오름차순, 작은 값에서부터 큰 값의 순으로 정렬되도록 구현

- 기본 정렬기준을 구현하는데 사용

 

Comparator

- 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Arrays;
import java.util.Comparator;
 
// 기본 정렬기준 외에 다른기준으로 정렬하기위해 Comparator인터페이스 구현한 클래스 생성
class Descending implements Comparator {
 
    // Comparator인터페이스의 메소드 구현
    @Override
    public int compare(Object o1, Object o2) {
// 정렬방식을 역으로 변경
        if(o1 instanceof Comparable && o2 instanceof Comparable) {
            Comparable c1 = (Comparable)o1;
            Comparable c2 = (Comparable)o2;
            return c1.compareTo(c2) * -1;        // 정렬방식을 역으로 변경
                                                // c2.compareTo(c1);과 같은의미
        }
        return -1;
    }
}
 
public class ComparatorEx {
    public static void main(String[] args) {
        String[] strArr = {"cat","Dog","lion","tiger"};
        
        Arrays.sort(strArr);
        System.out.println(Arrays.toString(strArr));
        
        Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);    // 대소문자 구분x
        System.out.println(Arrays.toString(strArr));
        
        Arrays.sort(strArr, new Descending());                // 역순
        System.out.println(Arrays.toString(strArr));
    }
 
}
 
cs

출력

[Dog, cat, lion, tiger]
[cat, Dog, lion, tiger]
[tiger, lion, cat, Dog]

 

 

24행의 sort()와 27,30행의 sort()는 다름

 

24행 - Comparable에 의한 정렬

27,30행 - 지정한 Comparator에 의한 정렬