Item 58. For-each Loop

전톡적인 for λ¬Έ λ³΄λ‹€λŠ” for-each 문을 μ‚¬μš©ν•˜λΌ

전톡적인 for 문으둜 μˆœνšŒν•˜κ²Œ 되면 λΆˆν•„μš”ν•˜κ²Œ 인덱슀 λ³€μˆ˜μ™€ λ°˜λ³΅μžκ°€ μ‚¬μš©λ˜μ–΄ 가독성이 λ–¨μ–΄μ§€κ³ , 잘λͺ» μ‚¬μš©ν•  경우 버그λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€. 반볡 λŒ€μƒμ΄ λ°°μ—΄μ΄λ‚˜ Iterable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체라면 for-each 문을 μ‚¬μš©ν•˜λ©΄ 더 κ°„κ²°ν•˜κ³  μ•ˆμ „ν•˜κ²Œ μˆœνšŒν•  수 μžˆλ‹€. κ²Œλ‹€κ°€ λŒ€λΆ€λΆ„ 상황에선 μ„±λŠ₯ 차이가 적닀.(LinkedListλŠ” for-each 문이 훨씬 빠름)

forλ¬Έ μ‚¬μš©μ‹œ 버그

for 문을 μ‚¬μš©ν•  경우 μ•„λž˜μ™€ 같은 버그가 λ°œμƒν•  수 μžˆλ‹€.

class Example {

    enum Suit {CLUB, DIAMOND, HEART, SPADE}

    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());

    public static void main(String[] args) {
        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())); // suit(i) μˆœνšŒκ°€ rank μ•ˆμ—μ„œ μ΄λ£¨μ–΄μ§€λ―€λ‘œ 버그 λ°œμƒ
            }
        }
    }

    static class Card {
        private final Suit suit;
        private final Rank rank;

        Card(Suit suit, Rank rank) {
            this.suit = suit;
            this.rank = rank;
        }
    }
}

μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλŠ”λ°, κ·Έλ‚˜λ§ˆ NoSuchElementException이 λ°œμƒν•˜μ—¬ 버그λ₯Ό μ‰½κ²Œ λ°œκ²¬ν•  수 μžˆμ§€λ§Œ, κ°œμˆ˜κ°€ 더 λ§Žμ•˜μ„ κ²½μš°μ—” 논리적 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€. μˆ˜μ •λœ μ½”λ“œμ™€ for-each 문을 μ‚¬μš©ν•œ μ½”λ“œλŠ” μ•„λž˜μ™€ 같은데, for-each 문이 훨씬 κ°„κ²°ν•˜κ³  버그 λ°œμƒ κ°€λŠ₯성이 μ λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

for-each λ¬Έ μ‚¬μš© λΆˆκ°€λŠ₯ 상황

for-each 문을 μ‚¬μš©ν•  수 μ—†λŠ” 상황이 μ„Έ κ°€μ§€ μžˆλ‹€.

  • 파괴적인 필터링(destructive filtering): μ»¬λ ‰μ…˜μ„ μˆœνšŒν•˜λ©΄μ„œ μ„ νƒλœ μ›μ†Œλ₯Ό μ œκ±°ν•΄μ•Ό ν•  λ•Œ

  • λ³€ν˜•(transforming): λ¦¬μŠ€νŠΈλ‚˜ 배열을 μˆœνšŒν•˜λ©΄μ„œ κ·Έ μ›μ†Œμ˜ κ°’ 일뢀 ν˜Ήμ€ 전체λ₯Ό ꡐ체해야 ν•  λ•Œ

  • 병렬 반볡(parallel iteration): μ—¬λŸ¬ μ»¬λ ‰μ…˜μ„ λ³‘λ ¬λ‘œ μˆœνšŒν•΄μ•Ό ν•  λ•ŒλŠ” κ°κ°•μ˜ λ°˜λ³΅μžμ™€ 인덱슀 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λ―€λ‘œ for-each λ¬Έ μ‚¬μš© λΆˆκ°€λŠ₯

Last updated