반응형

 

 

 - Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스입니다.

   Enumeration은 Iterator의 구버전이며, ListIterator는 Iterator의 기능을 향상 시킨 것입니다. 자, 이제 하나씩 자세히 살펴보겠습니다.

 

1. Iterator 인터페이스

 

 - Vector 컬렉션 클래스, ArrayList 컬렉션 클래스, LinkedList 컬렉션 클래스와 같이 요소가 순서대로 저장된 컬렉션에서 요소를 순차적으로 검색할 때는

   java.util 패키지에 속한 Iterator 인터페이스를 사용하면 편리합니다.

 

 - List인터페이스 뿐만 아니라, Set인터페이스를 구현한 컬렉션에도 사용 가능합니다. 다음은 Iterator인터페이스의 주요 메서드입니다.

 

 

<사진 1.1> Iterator인터페이스 메서드

 

 - hasNext()메서드와 next()메서드는 Iterator의 핵심 메서드입니다.

 - remove()메서드의 설명에 '선택적 기능'이란 Iterator인터페이스를 구현할 때 remove()메서드가 필수 기능이 아니므로 구현하지

   않아도 괜찮다는 뜻 입니다. 

 - 다음은 ArrayList에 저장된 모든 요소들을 출력하기 위한 코드입니다.

 

1
2
3
4
5
6
List lit = new ArrayList();
 
Iterator it = list.iterator();
while(it.hasNext()) {
    System.out.println(it.next());
}
cs

<사진 1.2>

 

- ArrayList컬렉션 클래스 대신에 List인터페이스를 구현한 다른 컬렉션 클래스(Vector, LinkedList 등)에 대해서도 이와 동일한 코드를

  사용할 수 있습니다. 첫 줄에서 ArrayList대신에 List인터페이스를 구현한 다른 컬렉션 클래스의 객체를 생성하도록 변경하기만 하면 됩니다.

** Map인터페이스는 Collection인터페이스의 자손이 아니므로 iterator()메서드가 존재하지 않습니다.

   Map인터페이스를 구현한 컬렉션 클래스(HashMap, SortedMap 등)는 키(Key)와 값(Value)을 쌍(pair)으로 저장하고 있기 때문에

   iterator()를 직접 호출할 수 없습니다. 그 대신 keySet()이나 entrySet()과 같은 반환 타입이 Set컬렉션인 메서드를 통해서

   키와 값을 각각 따로 Set의 형태로 얻어 온 후에 Set컬렉션에는 iterator()가 존재하므로 iterator()를 호출하여 Iterator를 얻을 수 있습니다.

 

- 다음은 ArrayList에 있는 요소들을 Iterator를 사용하여 읽어 오는 코드입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.edu.test;
 
import java.util.*;
 
public class test {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("1");
        al.add("2");
        al.add("3");
        al.add("4");
        al.add("5");
        
        Iterator it = al.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }    
}
 
cs

<사진 1.3>

 

 다음은 결과 화면입니다.

 

<사진 1.3 결과 화면>

 

 

2. Enumeration 인터페이스

 

 - Enumeration인터페이스는 컬렉션 프레임웍이 만들어지기 이전에 사용하던 것으로 Iterator의 구버전이라고 생각하면 됩니다.

   이전 버전으로 작성된 소스와의 호환을 위해서 남겨 두고 있을 뿐이므로 가능하면 Enumeration대신 Iterator를 사용하도록 합시다.

 

 - 다음은 Enumeration인터페이스의 메서드입니다. Enumeration은 Iterator와 메서드 이름만 다를 뿐 기능은 같습니다.

 

<사진 1.4> Enumeration인터페이스의 메서드

 

 

3. ListIterator 인터페이스

 

 - ListIterator인터페이스는 Iterator를 상속받아서 기능을 추가한 것입니다. 컬렉션의 요소에 접근할 때 Iterator는 단방향으로만 이동할 수

   있지만 ListIterator는 양방향으로 이동이 가능하다는 장점이 있습니다. 또한 ArrayList나 LinkedList처럼 List인터페이스를 구현한 컬렉션

   클래스에서만 사용할 수 있습니다.

 

 - 다음은 ListIterator인터페이스의 메서드입니다.

 

<사진 1.5> ListIterator인터페이스의 메서드

 

 

 - 다음은 ListIterator인터페이스의 양방향 접근이 가능한 previous()메서드를 호출하여 이전 요소로 접근해보는 코드입니다.

 

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
package com.edu.test;
 
import java.util.*;
 
public class test {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("1");
        al.add("2");
        al.add("3");
        al.add("4");
        al.add("5");
        
        ListIterator li = al.listIterator(); // 순방향으로 진행하면서 요소를 읽어옵니다.
        
        while(li.hasNext()) {
            System.out.println(li.next());
        }
        System.out.println("-----------");
        
        while(li.hasPrevious()) { // 역방향으로 진행하면서 요소를 읽어옵니다.
            System.out.println(li.previous());
        }
        
        
    }    
}
cs

<사진 1.6> ListIterator인터페이스의 previous()메서드 사용

 

 - Iterator인터페이스는 단방향으로만 이동하기 때문에 컬렉션의 마지막 요소에 다다르면 더 이상 사용할 수 없지만,

   ListIterator인터페이스는 양방향으로 이동하기 때문에 각 요소간의 이동이 자유롭습니다. 다만 이동하기 전에 hasNext()메서드나

   hasPrevious()메서드를 호출하여 이동할 수 있는지 확인해야합니다.

반응형

+ Recent posts