Search

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

 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 문을 사용하자.
훨씬 명료하고, 유연하고, 버그를 예방할 수 있다.
성능 저하도 없다.