Skip to content

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

Description

@DongLee99

전통적인 for 문보다는 for-each 문을 사용하라

전통적인 for 문

for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
    Element e = i.next();
}

for (int i = 0; i < a.length; i++) {
}

이 방식은 while문 보다는 낫지만 #31 좋은 방법은 아니다. 우리는 협업을 해야하기 때문에 가독성이 좋은 코드를 작성해야한다. 하지만 전통적인 방식의 for 문은 가독성을 다소 저하시킨다. 반복자와, 인덱스 변수는 코드를 지저분하게 하며 우리가 꼭 필요한 부분이 아니다.

이 문제는 for-each문으로 해결이 가능하다. for-each 문은 익히 들어본 향상된 for문과 같다.

  • 반복자와 인덱스 변수를 사용하지 않아 코드가 깔끔해지고 오류가 발생할 우려가 없다.
for (Element e : elements) {
}

이 반복문은 elements 안의 각 원소 e에 대해 라고 읽으며 반복 대상이 컬렉션이든 배열이든, for-each문을 사용해도 속도는 그대로다.
컬렉션을 중첩해 순회해야 한다면 for-each 문의 이점이 더욱 커진다.

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

for-each문을 사용할 수 없는 케이스

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

정리

전통적인 for 문과 비교했을 때 for-each 문은 명료하고, 유연하고, 버그를 예방해준다. 따라서 가능한 모든 곳에서 for 문보다는 for-each 문을 사용하자

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions