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 ๋ฌธ์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

class Example {


    public static void main(String[] args) {
        List<Card> deck = new ArrayList<>();

        // ์ˆ˜์ •
        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-each ๋ฌธ ์‚ฌ์šฉ
        for (Suit suit : suits) {
            for (Rank rank : ranks) {
                deck.add(new Card(suit, rank));
            }
        }
    }

}

for-each ๋ฌธ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ ์ƒํ™ฉ

for-each ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ์„ธ ๊ฐ€์ง€ ์žˆ๋‹ค.

  • ํŒŒ๊ดด์ ์ธ ํ•„ํ„ฐ๋ง(destructive filtering): ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์„ ํƒ๋œ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๋•Œ

  • ๋ณ€ํ˜•(transforming): ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ทธ ์›์†Œ์˜ ๊ฐ’ ์ผ๋ถ€ ํ˜น์€ ์ „์ฒด๋ฅผ ๊ต์ฒดํ•ด์•ผ ํ•  ๋•Œ

  • ๋ณ‘๋ ฌ ๋ฐ˜๋ณต(parallel iteration): ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์„ ๋ณ‘๋ ฌ๋กœ ์ˆœํšŒํ•ด์•ผ ํ•  ๋•Œ๋Š” ๊ฐ๊ฐ•์˜ ๋ฐ˜๋ณต์ž์™€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ for-each ๋ฌธ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

Last updated