[Effective Java] 아이템58 - 전통적인 for문보다는 for-each문을 사용하라

전통적인 for문이란 아래와 같이 반복자와 엔덱스를 이용해서 반복을 수행하는 것이다.

for(Iterator<Element> i = c.iterator(); i.hasNext();) {
  Element e = i.next();
}
for(int i=0; i<a.length; i++) {

}

이러한 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐, 원소들만 필요로 할 경우 for-each문을 쓰자 보다 명료하고, 유연하며 버그를 예방해준다.

for(Suit suit : suits) {
  for(Rank rank : ranks) {
    deck.add(new Card(suit, rank));
  }
}

for-each문을 사용할 수 없는 상황은 세 가지다.

  • 파괴적인 필터링 (destructive filtering)
    • 컬렉션을 순회하면서 선택된 원소를 제거해야 한다면 반복자의 remove 메서드를 호출해야 한다.
    • java8 부터는 Collection의 removeIf 메서드를 사용해 컬렉션을 명시적으로 순회하는 일을 피할 수 있다.
  • 변형 (transforming)
    • 순회하면서 값을 교체해야 한다면, 리스트의 반복자나 배열의 인덱스를 사용해야 한다.
  • 병렬 반복 (parallel iteration)
    • 여러 컬렉션을 병렬로 순회해야 한다면 각각의 반복자와 인덱스 변수를 사용해 엄격하고 명시적으로 제어해야 한다.

댓글남기기