백엔드 개발자라면 대답해야 할 100가지 질문

13. Iterator의 자매품? Enumeration, ListIterator

ignuy 2023. 8. 10.

자바 진영에서는 Collection Framework에 규정된 컬렉션에 저장된 원소 하나하나를 읽어오는 방법을 Iterator 인터페이스로 표준화하고 있다. 컬렉션 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메서드를 정의하고 있어 이를 통해 각각의 요소로 접근할 수 있다. 따라서 Collection 인터페이스를 상속받는 List, Set 인터페이스에서도 iterator() 메서드를 사용할 수 있다.

Iterator란 무엇인가? 에서 다루었듯이 Iterator는 총 네가지 메서드(hasNext(), next(), remove(), forEachReaminaing())로 컬렉션을 모두 순회한다. 순회는 무조건 단방향으로만 반복가능하고 값을 변경하거나 추가하는 연산은 불가능하다.

LinkedList<Integer> lnkList = new LinkedList<>();

lnkList.add(4);
lnkList.add(3);
lnkList.add(2);
lnkList.add(1);

Iterator<Integer> iter = lnkList.iterator();
while(iter.hasNext()) {
		System.out.print(iter.next() + " ");
}

/**
 * 4 3 2 1
 */

Iterator의 현위치?

현재 자바는 JDK 1.5부터 추가된 Enhanced for문을 사용하도록 권장하고 있다. 향상된 for문은 같은 성능을 유지하면서 코드의 명확성을 확보하고 발생할 수 있는 버그를 사전에 예방하는 역할을 하고 있다.

하지만 Enhanced for문은 값을 가져오는 역할을 하지 그게 collection에 저장된 값 그 자체는 아니다. 즉, 삭제나 변경 연산이 불가능하다. 따라서 요소의 선택적 제거나 대체 등을 수행하기 위한 경우 Iterator를 사용해야 한다.

Enumeration<E> 인터페이스

Lecacy Collection 객체(Vector, Hashtable)의 데이터를 가져올 때 Iterator와 같은 동작을 수행하는 인터페이스이다. 하지만 Collection Framework 등장 이후에 사용이 권장되지 않고 현재에는 기존 코드와의 호환을 위해 남아있다.

ListIterator<E> 인터페이스

Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스이다. 기존에 단방향으로만 원소에 접근하던 Iterator 인터페이스의 단점을 극복하기 위해 ListIterator 인터페이스에서는 컬렉션 원소의 대체, 추가, 인덱스 기반 조회 등을 위한 작업에서 양방향으로 원소에 접근할 수 있도록 지원한다.

단, 이름에서 알 수 있듯이 List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator()를 통해 사용할 수 있다.

댓글