충분히 쌓여가는
Iterator, ListIterator, Enumeration | Map과 Iterator 본문
Iterator, ListIterator, Enumeration
컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
Enumeration은 Iterator의 구버전
ListIterator은 Iterator의 접근성을 향상시킨 것(단방향[Iterator] -> 양방향[ListIterator])
Iterator
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
List list = new ArrayList(); // 다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다
Iterator it = list.iterator(); // Iterator 객체 반환
while(it.hasNext()) { // boolean hasNext() 읽어올 요소가 있는지 확인
System.out.println(it.next()); // Object next() 다음 요소를 읽어옴
}
Iterator 인터페이스의 메서드
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남이있는지 확인한다 있으면 true, 없으면 false를 반환한다 |
Object next() | 다음 요소를 읽어온다 next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다 |
여기서 while문을 한 번더 반복해도 나오는 결과는 같다
한 번 더 출력하고 싶다면 Iterator을 한 번더 얻어와야한다
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorTest {
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(); // Iterator는 1회용
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
1
2
3
4
5
Iterator 한 번 더 얻어옴
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorTest {
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(); // Iterator는 1회용
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
it = list.iterator(); // 새로운 iterator 객체 얻어옴
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
1
2
3
4
5
1
2
3
4
5
while문 대신 for문 사용
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorTest {
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();
for(int i=0; i < list.size(); i++) {
Object obj = list.get(i);
System.out.println(obj);
}
}
}
1
2
3
4
5
1
2
3
4
5
바로 위의 코드와 같이 되면 ArrayList말고 HashSet로 바꿔도 사용가능하다
(대신 HashSet엔 get이라는 메서드는 없다)
Iterator은 List나 Set이나 똑같이 동작하게 되어있다
import java.util.HashSet;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
HashSet list = new HashSet(); // Set은 Collcetion의 자손
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);
}
}
}
1
2
3
4
5
Collection으로도 구현가능하다
(다형성 때문에 가능함)
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
Collection list = new HashSet(); // Set은 Collcetion의 자손
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);
}
}
}
1
2
3
4
5
Collcetion으로 구현한 경우 HashSet이 아니라 TreeSet으로 바꿔도
참조변수 c는 바뀌지 않았기 때문에 밑의 코드 검토를 따로 안해도 된다
즉, 실제 구현 클래스(HashSet, TreeSet)가 달라도 사용하는 멤버의 개수는 같다(Collcetion 인터페이스에 정의된 메서드민 사용했기 때문)
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeSet;
public class IteratorTest {
public static void main(String[] args) {
Collection c = new TreeSet(); // Set은 Collcetion의 자손
c.add("1");
c.add("2");
c.add("3");
c.add("4");
c.add("5");
Iterator it = c.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
1
2
3
4
5
Enumeration 인터페이스의 메서드
메서드 | 설명 |
boolean hasMoreElements() | 읽어 올 요소가 남아있는지 확인한다 있으면 true, 없으면 false를 반환한다 Iterator의 hasNext()와 같다 |
Object nextElement() | 다음 요소를 읽어 온다, nextElement()를 호출하기 전에 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안전하다 Iterator의 next()와 같다 |
Map와 Iterator
Map에는 iterator()이 없다
그렇다면 Map에 저장되어 있는 요소를 가져오기 위해 keySet(), entrySet(), values()를 호출해야 한다
keySet() 반환타입: Set
entrySet() 반환타입: Set
values() 반환타입: Collection
Map map = new HashMap();
...
Iterator it = map.entrySet().iterator(); // 2개의 줄의 합쳐 놓은것 밑의 주석
// Set eSet = map.entrySet();
// Iterator it = eSet.iterator();
'Java > JAVA2' 카테고리의 다른 글
HashSet 1 (0) | 2023.07.16 |
---|---|
Arrays (0) | 2023.07.14 |
Stack & Queue (0) | 2023.07.07 |
LinkedList - 배열의 단점 보완 (0) | 2023.07.07 |
ArrayList (0) | 2023.07.06 |