Search

반응형

'iterator'에 해당되는 글 1건

  1. 2020.05.15 [자바/java]Iterator 와 Enumeration 쉽게 이해하기 편.
반응형

Iterator와 Enumeration

컬렉션(collection) 인터페이스를 사용하는 클래스의 데이터를 순환해서 사용하는 경우 클래스에서 제공하는 size()를 사용해서 for문으로 데이터를 가져오는 방법도 있지만 순환 인터페이스인 iteratorEnumeration을 사용하는 방법도 있습니다.

두 개의 인터페이스는 거의 비슷하지만 스레드(thread)의 지원 여부가 다릅니다.

Iterator는 스레드에 안전하지 않는 구조입니다.

스레드에 안전한 구조로 사용하고 싶다면 Enumeration을 사용하면 됩니다.

ArrayList, HashSet 등은 Iterator을 사용하면 되고,

Vector, Hashtable 등은 Enumeration을 사용하면 됩니다.

 

사실 이 두 개의 인터페이스는 ArratList, Vector 등 클래스에서 제공하는 size를 통해 데이터를 받는 것 보도 더 느립니다. 이유는 List 데이터를 받아 새로운 구조로 다시 만들기 때문인데..

그렇다면 왜 더 느린 이 친구들을 사용하는 것일까?

유지보수 등의 유연성을 더 좋게 하기 위해서입니다.

예를 들어 기존에 사용하던 컬렉션의 클래스를 다른 컬렉션의 클래스로 변경하는 경우 지원하는 메서드가 다르면 수정하는 부분이 많아질 수 있습니다.

하지만 Iterator 인터페이스를 사용한다면 이 부분의 구현부는 굳이 수정할 이유가 없게 됩니다.

Iterator는 다음 내용이 있는지 확인하는 hasNext() 메서드와 그 값을 가져오는 next() 메서드가 있습니다. 또한 해당 컬렉션의 값을 삭제할 수 있는 remove() 메서드도 제공하게 됩니다.

 

Enumeration은 다음 내용이 있는지 확인하는 hasMoreElements() 메서드와 그 값을 가져오는 nextElement() 메서드가 있고 컬렉션의 데이터를 삭제하는 기능은 없습니다.

예제를 통해서 사용법을 익혀봅니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ArrayList<String> nameList = new ArrayList<String>();
String name;
nameList.add("A");
nameList.add("B");
nameList.add("C");
nameList.add("D");
nameList.add("E");
nameList.add("F");
        
Iterator<String> it = nameList.iterator();
 
while(it.hasNext()) {
    name = it.next();
    if ("F".equals(name)) {
            it.remove();
    }
}
 
        
for(String l : nameList) {
    System.out.println(l);
}
cs

 ArrayList 클래스를 사용한 예제입니다.

해당 클래스는 스레드를 사용하지 않는 클래스입니다.

ArrayList 객체의 iterator() 메서드를 사용해서 Iterator 인터페이스의 it 객체를 생성합니다.

사용법을 잘 확인해 보세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
Vector<String> vt = new Vector<String>();
 
vt.addElement("A");
vt.addElement("B");
vt.addElement("C");
vt.addElement("D");
vt.addElement("E");
 
Enumeration<String> e = vt.elements();
 
while(e.hasMoreElements()) {
    System.out.println(e.nextElement());            
}
cs

이 예제는 Vector 클래스를 사용해서 Enumeration 인터페이스의 e 객체를 Vector의 elements() 메서드를 통해 생성했습니다.

스레드 지원이 가능하며 컬렉션에 대한 클래스의 데이터 삭제 기능은 없습니다.

사용법을 잘 확인해 보세요.

지금까지 컬렉션의 순환기능을 제공하는 두 개의 인터페이스에 대해 알아봤습니다.

즐코딩하세요..

반응형