Hello

Java Iterator, ListIterator, Enumration, Map과 Iterator

by 볼빵빵오춘기

Iterator, ListIterator, Enumeration

  • 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
더보기

* Iterator 인터페이스의 메서드

  • boolean hasNext()
    읽어 올 요소가 남아있는지 확인한다. (있으면 true, 없으면 false를 반환한다.)
  • Object next()
    다음 요소를 읽어온다. (next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.)
  • void remove()
    next()로 읽어 온 요소를 삭제한다.(next()를 호출한 다음에 remove()를 호출해야 한다.(선택적 기능))
  • void forEachRemaining(Consumer<? super E> action)
    컬렉션에 남아있는 요소들에 대해 지정된 작업(action)을 수행한다. (람다식을 사용하는 디폴트 메서드이다.(JDK1.8부터 추가))

⇒ 핵심은 hasNext(), next() 밑에 remove(), forEachRemaining(Consumer<? super E> action) 일단 신경 끄기

 

* Enumeration 인터페이스의 메서드

  • boolean hasMoreElements() 
    읽어 올 요소가 남아있는지 확인한다.(있으면 true, 없으면 false를 반환한다. & Iterator의 hasNext()와 같다.)
  • Object nextElement()
    다음 요소를 읽어 온다. nextElement()를 호출하기 전에 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안전하다. (Iterator의 next()와 같다.)

⇒ Iterator을 쓰면되는데 Enumeration 을 쓰는곳이 남아있음. 하지만 메소드는 기능은 같기 떄문에 알아두기

  • ListIterator는 Iterator의 접근성을 향상시킨 것이다.(단방향[다음요소만 읽어옴] → 양방향[다음요소, 이전요소를 읽어올 수있다.])
  • 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것이다.(= List, Set, Map 마다 구조가 다 다르기 때문에 읽어오는 방법을 표준화 한 것이다.)
  • 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용한다.
더보기

⇒ List, Set은 Collection의 자손이기때문에 바로 읽어 올 수 있다.

 

예제 코드

예제 코드1

더보기
import java.util.*;

public class VarEx3 {
	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);
		}

		// 위에 반복문을 한번 더 돌린다고 하더라도 변수가 있어야만 있어야 나옴
		// 따라서 여기는 실행 돌릴것이 없음
		// Iterator은 1회용.
		// 다시 출력할려면 
		// it = list.iterator(); => 주석해제
		while(it.hasNext()) {
			Object obj = it.next();
			System.out.println(obj);
		}
		
		
	}
}
예제코드1 - 주석해제 전
예제코드1 - 주석해제 후

예제 코드2

더보기
import java.util.*;

public class VarEx3 {
	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);
		}


		for(int i=0;i<list.size();i++) {
			Object obj = list.get(i);
			System.out.println(obj);
		}
		
		
	}
}

for문으로 변경하면 예제 코드1의 주석해제와 같은 결과가 나온다.

예제 코드3

더보기

예제코드2 에서 list변수를 ArrayList로 만드는게 아니라 HashSet으로 변경하면

import java.util.*;

public class VarEx3 {
	public static void main(String[] args) {
		
		HashSet list = new HashSet(); // Set은 Collection의 자손
		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);
		}

		// 동작하지않음
		for(int i=0;i<list.size();i++) {
			Object obj = list.get(i);
			System.out.println(obj);
		}
		
		
	}
}

HashSet에는 get이라는 메소드가 없으므로 for문은 동작하지않는다.

그런데 iterator사용한 코드는 잘 동작한다.

CollectionFramework을 쓰다보면 성능이나 여러가지 문제로 HashSet을 ArrayList로 바꾼다거나 이런 코드 변경이 있는데 위에 같은 문제가 일어나면 동작하지않기때문에 Iterator로 가져오면 표준화되어있기 때문에 다른 코드는 변경하지않아도 된다.

예제 코드4

더보기
import java.util.*;

public class VarEx3 {
	public static void main(String[] args) {
		
		Collection list = new HashSet(); // Set은 Collection의 자손
		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);
		}
		
	}
}

참조변수의 타입을 Collection으로 해줌으로써 아래코드의 영향을 주지않게 할 수도 있다.

 

Map과 Iterator

Map에는 iterator()가 없다.

따라서 Map에 있는 요소를 가져올려면 keySet(), entrySet(), values()를 호출해야한다.

 

 

※ 참고

keySet(),entrySet() ⇒ 반환타입은 Set

values() ⇒ 반환타입 Collection

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기