10-2. 순회

shin·2024년 12월 1일

순회2 - 향상된 for문


Iterable과 향상된 for문

  • Iterable, Iterator를 사용하면 또 하나의 장점을 얻을 수 있음
  • MyArrayMain.main()에 다음 코드를 추가하고 실행
//추가
System.out.println("for-each 사용");
for (int value : myArray) {
 	System.out.println("value = " + value);
}

실행 결과

...
for-each 사용
value = 1
value = 2
value = 3
value = 4
  • for-each 문으로 불리는 향상된 for문은 자료구조를 순회하는 것이 목적임
  • 자바는 iterable 인터페이스를 구현한 객체에 대해서 향상된 for문을 사용할 수 있게 해줌
for (int value : myArray) {
 	System.out.println("value = " + value);
}
  • 이렇게 하면 자바는 컴파일 시점에 다음과 같이 코드를 변경함
while (iterator.hasNext()) {
 	Integer value = iterator.next();
 	System.out.println("value = " + value);
}
  • 따라서 두 코드는 같은 코드임
  • 물론 모든 데이터를 순회한다면 둘 중에 깔끔한 향상된 for문을 사용하는 것이 좋음


순회3 - 자바가 제공하는 Iterable, Iterator


  • 자바 컬렉션 프레임워크는 배열 리스트, 연결 리스트, 해시 셋, 연결 해시 셋, 트리 셋 등등 다양한 자료 구조를 제공함

  • 자바는 컬렉션 프레임워크를 사용하는 개발자가 편리하고 일관된 방법으로 자료 구조를 순회할 수 있도록 Iterable 인터페이스를 제공하고, 이미 각각의 구현체에 맞는 Iterator도 다 구현해둠

  • 자바 Collection 인터페이스의 상위에 Iterable이 있다는 것은 모든 컬렉션을 iterable과 iterator를 사용해서 순회할 수 있다는 뜻임

  • Map의 경우 Key뿐만 아니라 Value까지 있기 때문에 바로 순회를 할 수는 없음

    • 대신에 KeyValue를 정해서 순회할 수 있는데, keySet(), values()를 호출하면 Set, Collection을 반환하기 때문에 KeyValue를 정해서 순회할 수 있음
    • 물론 EntrySet 구조로 반환하는 entrySet()도 순회가 가능함
package collection.iterable;

import java.util.*;

public class JavaIterableMain {
    
    public static void main(String[] args) {
        
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        
        printAll(list.iterator());
        printAll(set.iterator());
        
        foreach(list);
        foreach(set);
        
    }
    
    private static void printAll(Iterator<Integer> iterator) {
        
        System.out.println("iterator = " + iterator.getClass());
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        
    }
    
    private static void foreach(Iterable<Integer> iterable) {
        
        System.out.println("iterable = " + iterable.getClass());
        for (Integer i : iterable) {
 			System.out.println(i);
    	}
        
    }
    
}

실행결과

 iterator = class java.util.ArrayList$Itr
 1
 2
 3
 iterator = class java.util.HashMap$KeyIterator
 1
 2
 3
 iterable = class java.util.ArrayList
 1
 2
 3
 iterable = class java.util.HashSet
 1
 2
 3
  • iterator, Iterable은 인터페이스임

    • 따라서 다형성을 적극 활용할 수 있음
  • printAll(), foreach() 메서드는 새로운 자료구조가 추가되어도 해당 자료구조가 Iterator, Iterable만 구현하고 있다면 코드 변경 없이 사용할 수 있음

  • java.util.ArrayListSItr : ArrayList의 Iterator는 ArrayList의 중첩 클래스임

  • java.util.HashMapSKeyIterator : HashSet 자료 구조는 사실은 내부에서 HashMap 자료 구조를 사용함

    • HashMap 자료 구조에서 Value를 사용하지 않으면 HashSet과 같음

Iterator(반복자) 디자인 패턴은 객체 지향 프로그래밍에서 컬렉션의 요소들을 순회할 때 사용되는 디자인 패턴임

  • 이 패턴은 컬렉션의 내부 표현 방식을 노출시키지 않으면서도 그 안의 각 요소에 순차적으로 접근할 수 있게 해줌
  • Iterator 패턴은 컬렉션의 구현과는 독립적으로 요소들을 탐색할 수 있는 방법을 제공하며, 이로 인해 코드의 복잡성을 줄이고 재사용성을 높일 수 있음


강의 출처 : 김영한의 실전 자바 - 중급 2편

profile
Backend development

0개의 댓글