본문 바로가기

BackEnd/구 생활코딩 자바

Iterator 를 이용한 인스턴스의 순차적 접근

반응형

1. 컬렉션 프레임워크와 Iterator<E> 의 관계

자바의 컬렉션 프레임워크는 컬렉션에 저장된 요소를 읽어오는 방법을 Iterator 인터페이스로 표준화하고 있습니다.

Collection<E> 인터페이스에는 iterator 라는 이름의 메소드가 정의되어있다.

Iterator<E> iterator() { .... }

iterator 메소드가 반환하는 참조 값의 인스턴스는 Iterator<E>인터페이스를 구현하고 있다.

iterator 메소드의 반환형이 Iterator<E>이니, 반환된 참조값을 이용해서 Iterator<E>에 선언된 함수들을 호출할수있다

그러면 컬렉션 인스턴스에 저장된 인스턴스의 순차적 접근이 가능하다.

따라서 Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator() 메소드를 사용할 수 있다.


2. Iterator<E> 인터페이스에 정의된 메소드

https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html

메소드

설명

boolean hasNext()

해당 이터레이션(iteration)이 참조할 다음번 요소가 존재하면 true를 반환하고, 없으면 false를 반환.

Returns true if the iteration has more elements.

E next()


이터레이션(iteration)의 다음번 요소를 반환.

Returns the next element in the iteration.

void remove()

해당 반복자로 반환되는 마지막 요소(현재 위치의 요소)를 현재 컬렉션에서 삭제함.(선택적 기능)

removes from the underlying collection the last element returned by this iterator (optional  operation).

    


3. Iterator의 사용예

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
import java.util.Iterator;
import java.util.LinkedList;
 
class IteratorUsage
{
    public static void main(String[] args)
    {
        LinkedList<String> list=new LinkedList<String>();
        list.add("First");
        list.add("Second");
        list.add("Third");
        list.add("Fourth");
        
        Iterator<String> itr=list.iterator();
        
        System.out.println("반복자를 이용한 1차 출력과 \"Third\" 삭제");
        while(itr.hasNext())
        {
            String curStr=itr.next();
            System.out.println(curStr);
            if(curStr.compareTo("Third")==0)//curStr와 Third가 같으면 0을 반환
                itr.remove();
        }
        
        System.out.println("\n\"Third\" 삭제 후 반복자를 이용한 2차 출력 ");        
        itr=list.iterator();
        while(itr.hasNext())
            System.out.println(itr.next());
    }
}
cs


4. 반복자를 꼭 이용할 필요가 있을까?

반복자를 사용하면 컬렉션 클래스의 종류에 상관없이 동일한 형태의 데이터 참조방식을 유지할수 있기 때문에 반복자를 이용하는 것이 좋다.

데이터 참조를 위해 반복자를 기반으로 코드가 작성되면,컬렉션 클래스의 교체만 필요할 뿐,추가적인 변경은 발생하지 않기 때문이다.

다음과 같이 간단하게 바꾸고 나머지 반복자 부분은 변경이 필요없다.

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
 
import java.util.Iterator;
import java.util.LinkedList;
import java.util.HashSet;//변경부분
 
class a03_UsefulIterator
{
    public static void main(String[] args)
    {
        HashSet<String> set=new HashSet<String>();//변경부분
        //LinkedList<String> list=new LinkedList<String>();
        set.add("First");
        set.add("Second");
        set.add("Third");
        set.add("Fourth");
        
        Iterator<String> itr=set.iterator();
        //Iterator<String> itr=list.iterator();
        
        System.out.println("반복자를 이용한 1차 출력과 \"Third\" 삭제");
        while(itr.hasNext())
        {
            String curStr=itr.next();
            System.out.println(curStr);
            if(curStr.compareTo("Third")==0)
                itr.remove();
        }
        
        System.out.println("\n\"Third\" 삭제 후 반복자를 이용한 2차 출력 ");        
        itr=set.iterator();
        while(itr.hasNext())
            System.out.println(itr.next());
    }
}
cs


반응형