for 문의 문제점
•
진짜 필요한 것은 원소이다. 따라서 반복자와 인덱스 변수는 코드를 지저분하게 할 뿐이다.
•
요소 종류가 늘어나면 오류가 생길 가능성이 높아진다.
•
잘못된 변수를 사용했을 때 컴파일러가 잡아줄 보장도 없다.
향상된 for 문(enhanced for statement)
•
for-each 문의 정식 이름은 향상된 for 문이다.
•
반복자와 인덱스 변수를 사용하지 않는다.
어떤 장점이 있을까?
•
반복자와 인덱스 변수가 없어, 코드가 깔끔해지고 오류가 날 일도 없다.
•
컬렉션과 배열 모두 처리할 수 있다.
•
반복 대상이 컬렉션이든 배열이든 for-each 문을 사용해도 속도는 그대로이다.
◦
사람이 손으로 최적화한 것과 사실상 동일하다.
for-each 문을 사용할 수 없는 상황
1.
파괴적인 필터링(destructive filtering)
•
컬렉션을 순회하면서 선택된 원소를 제거하는 경우를 의미한다.
•
반복자의 remove 메서드 호출 필요
•
자바 8부터는 Collection의 removeIf 메서드를 사용해 컬렉션을 명시적으로 순회하는 것을 피한다.
2.
변형(transforming)
•
순회하면서 원소의 값 일부 혹은 전체를 교체하는 경우를 의미한다.
•
인덱스를 사용해야 하기 때문이다.
3.
병렬 반복(parallel iteration)
•
여러 컬렉션을 병렬로 순회하는 경우를 의미한다.
•
각각의 반복자와 인덱스 변수를 사용해 엄격하고 명시적으로 제어해야 한다.
for-each 문으로 순회하려면?
•
컬렉션이든 배열이든 Iterable 인터페이스를 구현한 객체이어야 한다.
public interface Iterable<E> {
// 객체의 원소들을 순회하는 반복자를 반환한다.
Iterable<E> iterator();
}
Java
•
Iterable 인터페이스를 구현해두면 사용하는 프로그래머는 for-each 문을 사용할 때마다 감사할 것이다.
핵심 요약
•
가능한 모든 곳에서 for-each 문을 사용하자.
•
훨씬 명료하고, 유연하고, 버그를 예방할 수 있다.
•
성능 저하도 없다.