2024. 2. 17. 19:16ㆍJAVA
Iterator ?
Iterator 라는 인터페이스가 있다. 이 인터페이스의 목적은 ' 컬렉션에 담긴 요소들을 읽어오는 것'이다.
Iterator 는 Collection 인터페이스에 포함 돼 있다. (-> collection 의 sub class 라면 다들 Iterator를 갖는다)
주요 메서드
Iterator의 주요 목적은 컬렉션의 요소 값을 갖고 오는 것이라 했다.
하여 주요 메서드로는
boolean hasNext() - 다음 요소가 있는지 확인한다. 다음 요소가 있다면 true, 없다면 false
Obejct next() - 다음 요소가 있다면 가져온다.
public class IteratorEx {
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 iterator = list.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
}
}
Iterator 은 1회성을 띄고 있다.
위의 예제에서
첫 번째 while(iterator.hasNext(){} 를 통해 컬렉션의 값을 모두 읽었으므로, 두 번째 while 문은 동작하지 않는다.
이미 끝까지 돌아 다음 요소값을 같지 않으므로.
따라서, 처음부터 컬렉션의 요소값을 읽어오기 위해서는
lterator = list.iterator();
를 통해 새롭게 Iterator를 생성해야 한다.
// 결과값 - 1 2 3 4 5
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
// 결과값 - 없음
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
System.out.println("================");
// 결과값 - 1 2 3 4 5
iterator = list.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
Iterator 를 사용하는 이유
상기의 코드는 우리가 아주 생 기초때부터 자주 봐오던 반복문 for문으로도 같은 결과값을 낼 수 있다.
// 위의 while문과 결과값은 같다.
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
System.out.println(obj);
}
그런데, 굳이 Iterator를 사용하는 이유는 무엇일까?
가장 앞선 설명에서, 모든 Collection 인터페이스의 구현 클래스는 Iterator 를 갖는다고 했다.
Iterator를 사용해 동일한 동작을 할 수 있다는 뜻이다.
public class IteratorEx {
public static void main(String[] args) {
//ArrayList list = new ArrayList();
HashSet list = new HashSet();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i); // HashSet 에는 get(int i) 메서드가 없다.
System.out.println(obj);
}
}
}
반면, for 문을 사용하게 될 경우,
필요에 의해 Collection 의 구현 클래스를 바꿨을 때 (위의 예제에서는 ArrayList -> HashSet)
제대로 동작하지 않는 문제가 발생한다. (구현체의 메서드에 종속 돼 버림)
따라서, Collection 의 구현체를 변경할 수 있는 상황이라면, 반복적으로 요소들을 읽어올 때에는 for문 보다 Iterator 사용이 바람직하다.
public class IteratorEx {
public static void main(String[] args) {
//ArrayList list = new ArrayList();
Collection collection1 = new HashSet();
// Collection collection1 = new HashMap();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator iterator = list.iterator();
//어떤 컬렉션으로 구현체를 바꿔도 동일하게 동작한다. (다형성)
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
}
}
참조자료
https://www.youtube.com/watch?v=k5qxJ53RYNc
'JAVA' 카테고리의 다른 글
| 컬렉션_HashSet(1) (0) | 2024.02.19 |
|---|---|
| 컬렉션_Iterator 과 Map (0) | 2024.02.17 |
| 컬렉션_스택&큐 (0) | 2024.02.15 |
| 컬렉션_LinkedList (0) | 2024.02.15 |
| 컬렉션_ArrayList (0) | 2024.02.14 |