Item 46. for문보다는 for-each문을 사용하라

  • for-each

    • js의 for...in + for...of

      // array
      for (int i = 0; i < a.length; i++) {
        doSomething(a[i]);
      }
      
      // collection
      for (Iterator i = c.iterator(); i.hasNext(); ) { 
        doSomething((Element) i.next());
      }
      
      for (Element e : elements) {
        doSomething(e);
      }
      
    • Iterable 인터페이스를 구현하는 객체면 사용 가능
      public interface Iterable<E> {
        // Returns an iterator over the elements in this iterable
        Iterator<E> iterator();
      }
      
  • 장점

    • index variable(4번), iterator(3번) 등장 → 다른 변수를 이용하는 실수가 있어도 컴파일 단계에서 잡기 어려움 → 이를 보완
    • ex. 중첩 for 문

      enum Suit { CLUB, DIAMOND, HEART, SPADE }
      enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,
      NINE, TEN, JACK, QUEEN, KING }
      ...
      Collection<Suit> suits = Arrays.asList(Suit.values());
      Collection<Rank> ranks = Arrays.asList(Rank.values());
      List<Card> deck = new ArrayList<Card>();
      
      // 1단계 
      for (Iterator<Suit> i = suits.iterator(); i.hasNext(); )
        for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
            deck.add(new Card(i.next(), j.next()));
      
      // 2단계 
      for (Iterator<Suit> i = suits.iterator(); i.hasNext(); ) {
        Suit suit = i.next();
        for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
            deck.add(new Card(suit, j.next()));
        }
      }
      
      // 3단계 
      for (Suit suit : suits)
        for (Rank rank : ranks)
            deck.add(new Card(suit, rank));
      
  • 사용할 수 없는 경우

    • filtering
      • 단순 순회가 아닌 remove 필요
      • interator.remove() 를 호출해야함
    • transforming
      • 원소의 수정이 있을 경우
    • parallel iteration
      • 여러 컬렉션을 병렬적으로 순회
    • 즉,,, 단순 순회가 아닐경우(컬렉션/배열 내 원소의 변경이 있거나 특수한 규칙에 의해 순회) 사용할 수 없음!

results matching ""

    No results matching ""