프로그래밍언어/JAVA

[JAVA] Iterator, ListIterator, Enumeration

jammmm 2022. 1. 26. 01:01
반응형

1. Iterator, ListIterator, Enumeration

 

- Iterator

 

컬렉션 프레임워크는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iterator (Iterator 인터페이스를 구현한 클래스의 인스턴스) 를 반환하는 iterator() 를 정의하고 있다.

 

iterator() 는 Collection 인터페이스에 정의된 메서드이므로 List 와 Set 에도 포함되어 있다. iterator() 메서드를 호출하여 Iterator 를 반환받은 후에 반복문을 사용하여 요소들에 접근할 수 있다.

 

메서드 설명
boolean hasNext() 읽어 올 요소가 남아있는지 여부를 반환한다.
Object next() 다음 요소를 읽어온다.
void remove() next() 로 읽어 온 요소를 삭제한다.

 

List list = new ArrayList();
Iterator it = list.iterator();

while(it.haxNext()) {
	System.out.println(it.next()); // list 에 값이 있는 경우 각 요소들이 순서대로 출력된다.
}

 

Map 인터페이스를 구현한 클래스는 key-value 형태로 저장되기 때문에 iterator() 를 직접 호출할 수 없고, keySet() 이나 entrySet() 과 같은 메서드를 통해서 key, value 를 각각 따로 Set 형태로 가져온 후 iterator() 를 호출하여 Iterator 를 얻을 수 있다.

 

- ListIterator, Enumeration

 

Enumeration 은 컬렉션 프레임워크가 만들어지기 이전에 사용하던 것으로 Iterator 의 구버전으로 생각하면 된다.

 

ListIterator 는 Iterator 를 상속받아서 기능을 추가한 것으로, 컬렉션 요소에 접근할 때 Iterator 는 단방향으로만 이동할 수 있는데 반해 ListIterator 는 양방향으로의 이동이 가능하다. 다만 ArrayList 나 LinkedList 와 같이 List 인터페이스를 구현한 컬렉션에서만 사용할 수 있다.

 

Enumeration 의 메서드는 다음과 같은 것들이 있다.

 

메서드 설명
boolean hasMoreElements() 읽어 올 요소가 존재하는지 여부를 반환한다. Iterator 의 hasNext() 와 동일하다.
Object nextElement() 다음 요소를 읽어온다. Iterator 의 next() 와 동일하다.

 

ListIterator 의 메서드는 다음과 같은 것들이 있다.

 

메서드 설명
void add(Object o) 컬렉션에 새로운 객체, o를 추가한다.
boolean hasNext() 읽어 올 다음 요소가 있는지 여부를 반환한다.
boolean hasPrevious() 읽어 올 이전 요소가 있는지 여부를 반환한다.
Object next() 다음 요소를 읽어온다.
Object previous() 이전 요소를 읽어온다.
int nextIndex() 다음 요소의 index 를 반환한다.
int previousIndex() 이전 요소의 index 를 반환한다.
void remove() next() 또는 previous() 로 읽어 온 요소를 삭제한다.
void set(Object o) next() 또는 previous() 로 읽어 온 요소를 지정된 객체 o 로 변경한다.

 

remove() 메서드의 경우 선택사항인데, 이는 클래스에서 해당 메서드를 반드시 구현하지 않아도 된다는 의미이다. java 에서는 Iterator 중 remove() 를 지원하지 않는 클래스의 경우 UnsupportedOperationException 을 발생시키도록 구현해놓았다.

 

remove() 의 경우 next() 또는 previous() 를 호출하여 읽어 온 요소를 삭제한다. 이들을 읽어올 때 index 를 저장하여서 마지막으로 읽어들인 요소의 index 를 보고 삭제를 수행한다. 만약 아무 요소도 호출하지 않고 remove() 를 호출하는 경우에는 IllegalStateException 이 발생한다.

 

반응형