ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java | Iterator & Enumeration
    JAVA/JAVA 2020. 2. 8. 18:03

    Iterator, Enumeration

    컬렉션의 구조가 다르다 할지라도 공통으로 자료를 검색할 수 있는 기능을 제공하는 인터페이스
    • 자료 구조를 A에서 B로 바꾸면 출력문까지 전부 수정해야하는데
      데이터 검색 방식을 표준화함으로써 코드의 재사용이 가능해짐
    • 컬렉션 자료형이라면 자료구조에 관계없이 사용가능하지만
      Iterator / Enumeration을 반환하는 메소드가 있는지 확인이 필요함

    Iterator

    반복자라는 뜻을 가진 인터페이스로 컬렉션에서 자료를 얻어오는데 사용

    • Collection 인터페이스를 구현한 모든 컬렉션 클래스에서 사용 가능
    • Enumeration의 기능이 확장된 것으로 jdk 1.2부터 제공됨

    Iterator 메소드

    메소드 설명
    boolean hasNext() iterator가 요소를 가지고 있다면 true 반환
    E next() iterator의 다음 요소 반환
    void remove() next()가 한 번 호출될 때마다 한 번씩 호출 가능
    next()에 의해 반환된 요소를 삭제
    원본에도 영향을 미침

    Iterator 반환 메소드가 없는 컬렉션의 경우

    1. Collection을 반환하는 메소드를 사용해서 Collection 객체 생성
      ex) HashMap - values()
    2. 컬렉션의 iterator() 메소드로 Iterator를 반환해서 Iterator 객체 생성
    3. 데이터 조회

    Enumeration

    하나하나 센다는 뜻을 가진 인터페이스로 Iterator와 동일한 기능을 함

    • 자바 초기 버전에서 개발됨
    • Hashtable, Vector에서 사용 가능함

    Enumeration 메소드

    Iterator의 remove()를 제외하고는 유사한 메소드를 가짐

    메소드 설명
    boolean hasMoreElements() 해당 enumeration에 값이 더 있는지 확인
    enumeration 객체가 하나 이상의 요소를 갖는다면 true 반환
    E nextElement() enumeration 객체의 다음 요소 반환

    예제

    사용법은 유사하기 때문에 Iterator 예제만 다룸

    package j200207;
    
    import java.util.*;
    
    public class IteratorTest {
    
        public static void main(String[] args) {
    
            // ArrayList 컬렉션 객체 생성
            ArrayList<String> al = new ArrayList();
            al.add("홍길동");
            al.add("이순신");
            al.add("세종대왕");
            System.out.println(al); // [홍길동, 이순신, 세종대왕]
    
            // Iterator 객체 생성
            Iterator<String> it = al.iterator();
    
            // Iterator 요소 조회
            while (it.hasNext()) {
                System.out.println(it.next());
            }
            // 홍길동 이순신 세종대왕
    
            // HashMap 컬렉션 객체 생성
            HashMap<Integer, String> hm = new HashMap();
            hm.put(1, "강감찬");
            hm.put(2, "유성룡");
            hm.put(3, "정약용");
            System.out.println(hm); // {1=강감찬, 2=유성룡, 3=정약용}
    
            /* HashMap에는 Iterator를 반환하는 메소드가 없기 때문에
            values() 메소드로 Collection view를 반환해서 컬렉션 객체를 생성한 뒤에
            컬렉션의 iterator()메소드로 Iterator를 반환해서 객체 생성 */
            Collection<String> cl = hm.values();
            Iterator ir = cl.iterator();
    
            System.out.println(ir.next()); // 강감찬
            ir.remove();
            System.out.println(ir.next()); // 유성룡
            ir.remove();
            System.out.println(ir.next()); // 정약용
    
            for (int i = 1; i < 4; i++) {
                System.out.println(hm.get(i));
            }
            // null null 정약용
        }
    
    }

    자료구조에 상관없이 데이터 조회 기능을 제공하는 Iterator와 Enumeration에 대해 알아보았습니다.

    두 인터페이스의 기능은 동일하지만 Iterator의 경우

    Collection 인터페이스를 구현한 모든 컬렉션 클래스에서 사용할 수 있습니다.

    반면 Enumeration은 Vector, Hashtable에서만 사용 가능하기 때문에 이 점에 유의해야겠습니다.

     

    어떤 기능이 제공되는지 헷갈리는 경우에는 그냥 Iterator를 사용하거나,
    Shift + F2 (이클립스, API 문서 참조 단축키)를 이용해서

    각 인터페이스를 반환하는 메소드가 있는지 확인해보는 것도 좋은 방법인 것 같습니다.

    댓글

Designed by Tistory.