Skip to content

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

@DongLee99

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 문을 사용하자

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions