JAVA - 컬렉션 프레임웍(Collections Framework) (5)

jodbsgh·2022년 4월 1일
0

💡"JAVA"

목록 보기
32/67

Iterator, ListIterator, Enumeration

collection 인터페이스에는 "Iterator(Iterator를 구현한 클래스의 인스턴스)"를 반환하는 iterator()를 정의하고 있다.

public interface Iterator{
	boolean hasNext();
    Object next();
    void remove();
}

public interface Collection{
	public Iterator iterator();
}

iterator()는 Collectin 인터페이스에 정의된 메서드이므로 Collection 인터페이스의 자손인 List와 Set도 포함되어있다.

컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음 반복문, 주로 While문을 사용해서 컬렉션 클래스의 요소들을 읽어올 수 있다.

ArrayList에 저장된 요소들을 출력하기 위한 코드

	Collection c = new ArrayList();	//다른 컬렉션으로 변경시 이 부분만 고치면 된다.
    
    Iterator it = c.iterator();
    
    while(it.hasNext()){
    	System.out.println(it.next());
    }

첫 줄에서 ArrayList대신 Collection 인터페이스를 구현한 다른 컬렉션 클래스의 객체를 생성하도록 변경하기만 하면 된다.

참조변수 타입을 ArrayList가 아니라 Collection 타입으로 한 이유?
Collectio에 없고 ArrayList에만 있는 메서드를 사용하는게 아니면, Collectiom타입의 참조변수로 선언하는게 좋다.
만일 LinkedList로 바꿔야 한다면 선언문 하나만 변경하면 나머지 코드는 검토하지 않아도 되기 때문.
만일 ArrayList로 참조했다면 Collection에 정의되어 있지 않은 메서드를 호출했을 수도 있기 때문에 검토가 필요해진다. 따라서, 이를 방지할 수 있다.

 
Map인터페이스를 구현한 컬렉션 클래스는 키와 값을 쌍으로 저장한다. 따라서 iterator()를 직접 호출하지 못하고 keySet()이나 entrySet()과 같은 메서드를 통해서 Set의 형태로 얻어 온 후에 다시 iterator()를 호출해야 Iterator를 얻을 수 있다.

Map map = new HashMap();

Iterator it = map.entrySet().iterator();

ListIterator 와 Enumeration

Enumeration는 Iterator의 구버전이라고 생각하면 된다. 따라서 가능하면 Iterator를 사용하도록 하자.

Enumeration Iterator의 구버전
ListIterator Iterator에 양방향 조회기능 추가(List를 구현한 경우만 사용 가능)

ListIterator는 양방향으로 이동하기 때문에 각 요소간의 이동이 자유롭다.
하지만, 이동하기 전에 반드시 hasNext()나 hasPrevious()를 호출하여 이동할 수 있는지 확인해야 한다.

profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글