Interface Iterator<E>
다음은 Iterator 의 실제 소스다.
1 2 3 4 5 | public interface Iterator<E> { boolean hasNext(); E next(); void remove(); } |
List 는 인덱스가 존재하여 단순한 for문으로도 객체의 데이터를 가져올 수 있으며
향상된 포문문을 사용하면 Set의 데이터도 가져오는게 가능하다.
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 31 32 | ArrayList<String> list = new ArrayList<String>(); list.add( "하나" ); list.add( "둘" ); list.add( "셋" ); for (String ele : list) { System.out.println(ele); } for ( int loop= 0 ; loop<list.size(); loop++) { System.out.println(list.get(loop)); } HashSet<Integer> set = new HashSet<>(); set.add( 1 ); set.add( 3 ); set.add( 2 ); for (Integer ele : set) { System.out.println(ele); } 하나 둘 셋 하나 둘 셋 1 2 3 |
List, Set 모두 Iterator를 구현해 놓은 클래스이기 때문에 향상된 포문을 사용할 수 있는 것이다.
하지만 Map은 인덱스도 없고 Iterator 구현도 없다. 어떻게 해야 할까
● boolean hasNext() : Iterator 객체가 다음요소를 소유하는지 여부를 불리언으로 리턴.
● E next() : 다음요소를 리턴.
● void remove() : 컬렉션에서 Iterator 의해 반환된 마지막 요소를 제거.
우선 아래는 List와 Set에서 Iterator를 사용하는 예제다.
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 31 32 | ArrayList<String> list = new ArrayList<String>(); list.add( "하나" ); list.add( "둘" ); list.add( "셋" ); Iterator<String> it = list.iterator(); while (it.hasNext()) { //Iterator 객체에 다음 데이터가 있으면 true String ele = it.next(); //다음 데이터를 리턴 System.out.println(ele); } HashSet<Integer> set = new HashSet<>(); set.add( 1 ); set.add( 3 ); set.add( 2 ); Iterator<Integer> it2 = set.iterator(); while (it2.hasNext()) { int ele = it2.next(); System.out.println(ele); } 하나 둘 셋 1 2 3 |
Map에선 다음과 같이 사용한다.
1 2 3 4 5 | ArrayList<String> list = new ArrayList<String>(); HashMap<String, Integer> map = new HashMap<>(); map.put( "일공일" , 101 ); map.put( "이공이" , 202 ); map.put( "삼공삼" , 303 ); |
여기서 keySet() 메서드로 key값을 Set 컬렉션으로 추출한다.
1 2 3 4 5 | Set<String> set = map.keySet(); System.out.println(set); [삼공삼, 일공일, 이공이] |
이제 Iterator를 사용하여 value를 가져올 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 | Iterator<String> it = set.iterator(); while (it.hasNext()) { String key = it.next(); int value = map.get(key); System.out.println(key + " : " + value); } 삼공삼 : 303 일공일 : 101 이공이 : 202 |
번거롭다면 향상된 포문을 써도 된다. (향상된 포문은 Java 5.0 이상에서만 사용가능)
1 2 3 4 5 6 7 8 9 10 11 | Iterator<String> it = set.iterator(); for (String key : set) { int value = map.get(key); System.out.println(key + " : " + value); } 삼공삼 : 303 일공일 : 101 이공이 : 202 |
● 완성 구문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.util.HashMap; import java.util.Iterator; public class LogicTest { public static void main(String[] args) throws Exception { HashMap<String, Integer> map = new HashMap<>(); map.put( "일공일" , 101 ); map.put( "이공이" , 202 ); map.put( "삼공삼" , 303 ); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String key = it.next(); int value = map.get(key); System.out.println(key + " : " + value); } } } |