#46 종전의 for 루프보다는 for-each 루프를 사용하자
인덱스(index) 변수를 3번 노출하는 왼쪽 for 루프보다, 1번만 노출하는 오른쪽 for-each 루프를 이용하자는 내용인데, 이에 대해 알아보겠습니다.
인덱스 변수가 3번 나타나므로 잘못 이용될 가능성이 3번이나 일어날 수 있고, 이를 컴파일러가 에러로 반드시 잡아낸 다는 보장이 없습니다.
인덱스 변수가 1번만 나타나므로 잘못 이용될 가능성이 줄어듭니다.
게다가 일반 for loop에 비해 성능 저하가 없습니다.
여러 개의 컬렉션에 대해 중첩된 반복 처리를 할 때는, for 루프보다 for-each 루프가 더 좋습니다.
아래 코드는 두 개의 컬렉션을 이용해 모든 요소들을 순차적으로 출력하는 코드입니다.
cps 컬렉션의 next 메서드가 한번 호출된 후(외곽 루프), types 컬렉션의 next 메서드가 모두 호출(내부 루프) 되길 바라면서 만든 코드이지만, 실제로는 NoSuchElementException이 발생합니다.
이런 문제를 방지하기 위해, 외곽 루프의 요소를 외곽 루프의 유효 범위에 변수로 추가해야 합니다.
for-each 루프를 이용하면 훨씬 간편하게 구현할 수 있습니다.
이처럼 for-each 루프는 for 루프에 비해 성능 저하가 없고, 간단명료하며 버그를 방지해 줍니다.
하지만 이를 이용하지 못하는 경우도 있습니다.
1. 필터링(Filtering)
- 컬렉션 요소들을 삭제할 필요가 있을 때 > iterator가 필요함
2. 변환(Transforming)
- 요소들의 값을 변경할 필요가 있을 때 > 인덱스가 필요함
3. 병행 반복 처리(Parallel iteration)
- 병행으로 여러 컬렉션의 요소들을 오가면서 처리할 필요가 있을 때 > iterator나 인덱스가 필요함