Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

Iterator, ListIterator, Enumeration | Map과 Iterator 본문

Java/JAVA2

Iterator, ListIterator, Enumeration | Map과 Iterator

빌드이너프 2023. 7. 13. 23:34

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