향상된 for문 (for-each문)을 사용하자!
전통적인 for문으로 컬렉션을 순회하는 다음 코드들을 보자.
Iterator와 인덱스 변수는 코드를 지저분하게 하고 있다. 한편 우리에게 필요한 것은 원소뿐이다.
for(Iterator<Element> i = c.iterator(); i.hasNext(); ){
Element e = i.next();
... // e로 무언가 한다
}
for(int i=0; i<a.length; i++){
... // a[i]로 무언가 한다
}
이때 향상된 for문을 사용하면? 명확해진다.
성능 저하도 없고, 명료하고, 유연하고, 버그 예방에...
책에서는, 가능한 모든 곳에서 for문 대신 향상된 for문을 사용하라고 이야기한다.
for(Element e : elements){
... // e로 무언가 한다
}
컬렉션에 대한 중첩 반복문을 작성할 때도 훨씬 간결하다.
for(Suit suit : suits)
for(Rank rank : ranks)
deck.add(new Card(suit, rank));
향상된 for문을 사용할 수 없는 상황
다음의 경우를 인지하고 있다가, 일반적인 for문을 사용하면 되겠다.
∨ 파괴적인 필터링(destructive filtering)
: 컬렉션을 순회하며 원소를 제거하는 일이 있다면 Iterator의 remove()를 사용해야 한다.
: 참고로, 자바 8부터는 컬렉션의 removeIf()를 사용해 컬렉션을 명시적으로 순회하는 일을 피할 수 있다.
∨ 변형(transforming)
: 리스트 or 배열 순회 하면서 원소의 값을 교체해야 한다면, 리스트 Iterator 또는 배열의 인덱스를 사용해야 한다.
∨ 병렬 반복(parallel iteration)
: 여러 컬렉션을 병렬로 순회해야 한다면 그렇다! 그치.. 그렇겠다.
Iterable에 대하여
향상된 for문은 Iterable 인터페이스를 구현한 객체라면 뭐든 순회할 수 있다.
Iterable은 iterator() 메서드 단 하나만 가지고 있다.
만약 내가 원소묶음을 표현하는 타입을 작성해야 한다면, Iterable을 구현해보는 시도를 해보자.
그 타입을 사용하는 프로그래머가 향상된 for문을 사용할 때 아주 편리할 것이다.
public interface Iterable<E>{
Iterator<E> iterator();
}
'JAVA > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 정확한 답이 필요하다면 float와 double은 피하라 ─ 9장:일반적인 프로그래밍 원칙:Item60 (0) | 2023.10.20 |
---|---|
[이펙티브 자바] 라이브러리를 익히고 사용하라 ─ 9장:일반적인 프로그래밍 원칙:Item59 (0) | 2023.10.19 |
[이펙티브 자바] 지역변수의 범위를 최소화하라 ─ 9장:일반적인 프로그래밍 원칙:Item57 (0) | 2023.10.19 |
[이펙티브 자바] 옵셔널 반환은 신중히 하라 ─ 8장:메서드:Item55 (1) | 2023.10.18 |
[이펙티브 자바] null이 아닌, 빈 컬렉션이나 배열을 반환하라 ─ 8장:메서드:Item54 (0) | 2023.10.18 |