본문 바로가기
java

collection framework : Iterator, Enumeration, Map

by proudev 2023. 8. 31.

Iterator, Enumeration, Map (1)

컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스

Enumeration은 Iterator의 구버전 

Iterator, Enumeration은 next() 다음 요소를 확인하는 매서드가 있다.

ListIterator는 Iterator의 접근성을 향상시킨 것(단방향 -> 양방향)

ListIterator는 양방향이라 이전 객체를 확인하는 previous() 와 next() 매서드 둘 다 있다.

 

Iterator 인터페이스의 매서드

매서드 설  명
boolean hasNext() 읽어 올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
Object next() 다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.

 

Enumeration인터페이스의 매서드

매서드 설  명
boolean hasMoreElements() 읽어 올 요소가 남아 있는지 확인한다. 있으면 true, 없으면 false를 반환한다
Object nextElement() 다음 요소를 읽어 온다. nextElement()를 호출하기전에 hasMoreElements()를 호출해서 읽어올 요소가 남아 있는지 확인하는 것이 안전하다. Iterator의 next()와 같다.

Iterator, Enumeration, Map (2)

1. 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것

List와 Set은 자료구조가 달라서 객체를 읽어오는 방법도 다르다.

그러나 Iterator는 Collection 인터페이스에 있으며,  저장된 요소들을 읽어오는 표준화된 방법이다.

그래서 List, Set 둘 다 적용된고 List만 사용하고 있다가 Set으로 변경해도 객체를 불러오는 Iterator 관련 매서드는 변경을 하지 않아도 된다.

public interface Collection {
   public Iterator iterator();
}

 

2. 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용

List list = new ArrayList();   // 다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
Iterator it = list.iterator(); // iterator를 구현한 객체 반환

while(it.hasNext()){              // boolean hasNext() 읽어올 요소가 있는지 확인   
   System.out.println(it.next()); // Object next() 다음 요소를 읽어옴 
}
public static void main(String args[]){

     ArrayList list = new ArrayList();
     list.add("1");
     list.add("2");
     list.add("3");
     list.add("4");
     list.add("5");
     
     Iterator it = list.iterator();
     
     while(it.hasNext()){
        Object obj = it.next();
        System.out.println(obj);
     }  
     
     it = list.iterator();
     
     while(it.hasNext()){
        Object obj = it.next();
        System.out.println(obj);
     }
}

그래서 Iterator는 1회용이다. 한번 다 읽으면 읽을게 없기 때문이다.

그래서 한번 더 객체를 다 불러오고 싶으면 Iterator 객체를 다시 만들어주어야 한다.

public static void main(String args[]){

     ArrayList list = new ArrayList();
     list.add("1");
     list.add("2");
     list.add("3");
     list.add("4");
     list.add("5");
     
     Iterator it = list.iterator();
     
     while(is.hasNext()){
        Object obj = it.next();
        System.out.println(obj);
     }
     
     새로운 iterator객체 생성
     iterator는 1회용이라 다 쓰고 나면 다시 얻어와야 한다.
     it = list.iterator();

     while(is.hasNext()){
        Object obj = it.next();
        System.out.println(obj);
     }
}

Iterator는 Collection 인터페이스에 속한 매서드이며, Collection 인터페이스에는 Set과 List가 있다.

그래서 Iterator는 get() 매서드와 달리 Set,List 둘다 적용이 가능하다.

즉, Iterator를 사용하면 코드 변경이 줄어들 수 있다.

왜냐하면 get 매서드를 사용하면 자료구조에 따라 또 바뀔 수가 있기 때문이다(예: List -> Set)

 

 


Map과 Iterator

Map에는 iterator()가 없다.

그 이유는 iterator는 Collection인터페이스에 정의되어있다.

근데 Map은 Collection 인터페이스에 속하지 않는다. 그래서 Iterator는 적용되지 않는다.

public interface Collection {
   public Iterator iterator();
}

그래서 Map 대한 저장 정보를 가져오려면 KeySet(), entrySet(), values()를 호출해야한다.

왜냐하면  KeySet(), entrySet(), values() 이것들은 Collection 인터페이스에 속하기 때문에 Iterator()를 사용할 수 있다.

따라서, Map은 Collection 인터페이스에 속하지 않기에 Iterator를 사용할 수 없고 Iterator를 사용하려면 Map을 Collection 인터페이스를 가지고 있는 KeySet(), entrySet(), values() 매서드를 통해 Map을 Collection 매서드를 사용할 수 있게 바꿔준다. 

Map map = new HashMap();

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

위의 코드는 아래의 코드와 같다.

HashMap map = new HashMap();
Set eSet = map.entrySet();
Iterator it = eSet.iterator();

 

 

'java' 카테고리의 다른 글

collections framework - Comparator 와 Comparable  (0) 2023.09.02
collection framework : Arrays  (0) 2023.09.01
collection framework  (0) 2023.08.31
collection framework : LinkedList  (0) 2023.08.29
[java] 배열  (0) 2023.08.12

댓글