-
Java | Iterator & EnumerationJAVA/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 반환 메소드가 없는 컬렉션의 경우
- Collection을 반환하는 메소드를 사용해서 Collection 객체 생성
ex) HashMap - values() - 컬렉션의 iterator() 메소드로 Iterator를 반환해서 Iterator 객체 생성
- 데이터 조회
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 문서 참조 단축키)를 이용해서각 인터페이스를 반환하는 메소드가 있는지 확인해보는 것도 좋은 방법인 것 같습니다.
'JAVA > JAVA' 카테고리의 다른 글
Java | Generic (2) <?> & <T extends Class> & <? super Class> (0) 2020.02.10 Java | Generic (1) <T> (0) 2020.02.10 Java | Map_HashMap (0) 2020.02.08 Java | List_ArrayList & LinkedList & Vector (0) 2020.02.08 Java | Collection Framework 컬렉션 프레임워크 (0) 2020.02.07 - 자료 구조를 A에서 B로 바꾸면 출력문까지 전부 수정해야하는데