본문 바로가기
자바 한계단

자바 Iterator, Enumeration 인터페이스

by juneMiller 2021. 12. 26.

Iterator 반복자라는 뜻으로 자료를 얻어 내는데 사용. 

이 자료를 얻어내는 iterator()메소드는 컬렉션(Collection) 자료형이라면 관계없이 

사용가능하다. 

 

For 문 등으로 충분히 자료들을 꺼내올 수 있는데, 굳이 Iterator 가 필요한 이유는? 

혹 ArrayList 에 담긴 데이터를 Set으로 옮겼다면 일반적으로 출력문까지 전면 수정이 필요하지만

Iterator는 데이터를 빼오는 방식을 표준화하는데 목적이 있어 코드 재활용이 가능하다(다형성) 

 

Iterator 대표 메소드

hasNext():

뒤에 남은 데이터가 있으면 True, 없으면 False 반환 

while 루프를 통한 제어처리시 사용한다. 

 

next() 

자료구조의 다음 데이터를 반환하여, 다음 객체의 레퍼런스를 얻는다. 

 

remove() 

현재 조회하는 객체의 레퍼런스를 삭제한다. 

 

Enumeration 은 iterator 에서 reomve() 메소드만 빠지고, 이름이 다를 뿐 사용법이 같다. 

hasMoreElements() : Iterator의 .hasNext()와 같은 기능이다. 

nextElement(): iterator의 next()와 같은 기능이다. 

 

 

 

public class test {

	public static void main(String[] args) {
		
		//ArrayList에서 iterator 인터페이스 사용하기
		System.out.println("===ArrayList===");
		
		//List 선언
		ArrayList<String> list = new ArrayList<>();
		
		for(int i=0; i<3; i++) {
			list.add("AAA" + i);
		}
		
		//Iterator 선언 
		Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
	
		  //HashSet에서 iterator 인터페이스 이용하기
		System.out.println("===HashMap===");
		HashMap<Integer, String> map = new HashMap<>();
		for(int i=0; i<3; i++) {
			map.put(i, "AAA" + i);
		}
		
		Iterator<Integer> it3 = map.keySet().iterator();
		while(it3.hasNext()) {
			int key = it3.next();
			System.out.println("key : " + key);
			System.out.println("/ value: " + map.get(key));
		}
		
		//HashMap에서 iterator 인터페이스 이용하기
		System.out.println("===HashSet===");
		HashSet<String> set = new HashSet<>();
		for(int i =0; i<3; i++) {
			set.add("ABC" + i);
		}
		
		Iterator<String> it2 = set.iterator();
		while(it2.hasNext()) {
			System.out.println(it2.next());
		}
		
		System.out.println("===ArrayList 사용 예제===");
		ArrayList<String> nameList = new ArrayList<>();
		String name;
		nameList.add("A");
		nameList.add("B");
		nameList.add("C");
		nameList.add("D");
		nameList.add("E");
		nameList.add("F");
		
		Iterator<String> it4 = nameList.iterator();
		
		while(it4.hasNext()) {
			name = it4.next();
			if("F".equals(name)) {
				it4.remove();
			}
		}
		
		for(String li : nameList) {
			System.out.println(li);
		}
		
		System.out.println("===Vector===");
		Vector<String> vt = new Vector<>();
		vt.addElement("A");
		vt.addElement("B");
		vt.addElement("C");
		vt.addElement("D");
		vt.addElement("E");
		
		Enumeration<String> e = vt.elements();
		
		while(e.hasMoreElements()) {
			System.out.println(e.nextElement());
		}

	}
	
	

}

 

 

두 개의 인터페이스는 거의 비슷하지만 스레드(thread)의 지원 여부가 다르다. 

iterator : 스레드에 안전하지 않고, Enumeration 은 스레드에 안전하다. 

 

 

'자바 한계단' 카테고리의 다른 글

직렬화 Serialize 란?  (0) 2022.01.27
제네릭 Generic  (0) 2022.01.27
Map 컬렉션 - HasMap, Hashtable  (0) 2021.12.08
다형성 ploymorphism  (0) 2021.10.17
상속 Inherit  (0) 2021.10.17