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 |
댓글