// 컬렉션 순회하기 - 더 나은 방법이 있다.
for(Iterator<Element> i = c.iterator(); i.hasNext()) {
Element e = i.next();
... // e로 무언가를 한다
}
// 배열 순회하기 - 더 나은 방법이 있다.
for (int i = 0; i < a.length; i++) {
... // a[i]로 무언가를 한다.
}
for-each 문의 정식 이름은 '향상된 for 문' 이다.
// 컬렉션과 배열을 순회하는 올바른 관용구
for (Element e : elements) {
... //e로 무언가를 한다.
}
// 버그를 찾아보자
enum Suit {CLUB, DIAMOND, HEART, SPACE}
enum Rank {ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING}
...
static Collection<Suit> suits = Arrays.asList(Suit.values());
static Collection<Rank> ranks = Arrays.asList(Rank.values());
List<Card> deck = new ArrayList<>();
for (Iterator<Suit> i = suits.iterator(); i.hasNext()) {
for (Iterator<Rank> j = ranks.iterator(); j.hasNext()) {
deck.add(new Card(i.next(), j.next()));
}
}
// 예외를 고치는 방법
for (Iterator<Suit> i = suits.iterator(); i.hasNext()) {
Suit suit = i.next();
for (Iterator<Rank> j = ranks.iterator(); j.hasNext()) {
deck.add(new Card(suit, j.next()));
}
}
for (Suit suit : suits)
for (Rank rank : ranks)
deck.add(new Card(suit, rank));
for-each 문을 중첩하는 것으로 이 문제는 간단히 해결된다.
for-each를 사용할 수 없는 상황이 세 가지 존대한다.