item 58 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์ „ํ†ต์ ์ธ for ๋ฌธ๋ณด๋‹ค๋Š” for-each ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ผ

๋‹ค์Œ๊ณผ ๊ฐ™์€ for๋ฌธ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ์ 

// ์ปฌ๋ ‰์…˜ ์ˆœํšŒ 
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
    Element e = i.next();
}

// ์ „ํ†ต์ ์ธ for๋ฌธ ๋ฐฐ์—ด ์ˆœํšŒ 
for (int i = 0;  i  < a.length; i++) {
     // a[i] ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•œ๋‹ค. 
}
  • ๋ฐ˜๋ณต์ž์™€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ฝ”๋“œ๋ฅผ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ํ•  ๋ฟ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ๊ฑด ์›์†Œ๋“ค ๋ฟ์ด๋‹ค.
  • ์ž˜๋ชป๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žก์•„์ฃผ๋ฆฌ๋ผ๋Š” ๋ณด์žฅ๋„ ์—†๋‹ค.
  • ์ปฌ๋ ‰์…˜์ด๋ƒ ๋ฐฐ์—ด์ด๋ƒ์— ๋”ฐ๋ผ ์ฝ”๋“œ ํ˜•ํƒœ๊ฐ€ ์ƒ๋‹นํžˆ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

for-each ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋‘ ํ•ด๊ฒฐ

// for-each 
ํ–ฅ์ƒ๋œ for๋ฌธ (enhanced for statement)  
for (Element e : elements) {
    // e๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•œ๋‹ค. 
}
  • ๋ฐ˜๋ณต์ž์™€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚  ์ผ๋„ ์—†๋‹ค.
  • ์ฝœ๋ก (:)์€ "์•ˆ์˜(in)" ๋ผ๊ณ  ์ฝ๋Š”๋‹ค.
  • "elements ์•ˆ์˜ ๊ฐ ์›์†Œ e์— ๋Œ€ํ•ด" ๋ผ๊ณ  ์ฝ๋Š”๋‹ค.
  • ๋ฐ˜๋ณต ๋Œ€์ƒ์ด ์ปฌ๋ ‰์…˜์ด๋“  ๋ฐฐ์—ด์ด๋“  for-each๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ์†๋„๋ฅผ ๊ทธ๋Œ€๋กœ ์ด๋‹ค. ์ปฌ๋ ‰์…˜์„ ์ค‘์ฒฉํ•ด ์ˆœํšŒํ•ด์•ผ ํ•œ๋‹ค๋ฉด for-each ๋ฌธ์˜ ์ด์ ์ด ๋”์šฑ ์ปค์ง„๋‹ค.

๋ฐ˜๋ณต๋ฌธ ์ค‘์ฒฉ์‹œ ํ”ํžˆ ์ €์ง€๋ฅด๋Š” ์‹ค์ˆ˜

import java.util.*;

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

    // ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„๋ณด์ž.
    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());

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

    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()));
    }
}
  • ๋ฌธ์ œ์ ์€ ๋ฐ”๊นฅ ์ปฌ๋ ‰์…˜(suits)์˜ ๋ฐ˜๋ณต์ž์—์„œ next ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋ถˆ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • i.next()๋Š” ์ˆซ์ž(Suit) ํ•˜๋‚˜๋‹น ํ•œ๋ฒˆ์”ฉ ๋ถˆ๋ฆฌ๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆซ์ž๊ฐ€ ๋ฐ”๋‹ฅ๋‚˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์—์„œ NoSuchElementException์„ ๋˜์ง„๋‹ค.
  • ๋ฐ”๊นฅ ์ปฌ๋ ‰์…˜์˜ ํฌ๊ธฐ๊ฐ€ ์•ˆ์ชฝ ์ปฌ๋ ‰์…˜ ํฌ๊ธฐ์˜ ๋ฐฐ์ˆ˜๋ผ๋ฉด (๊ฐ™์€ ์ปฌ๋ ‰์…˜์ผ ๋•Œ) ์ด ๋ฐ˜๋ณต๋ฌธ์€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

    // ์ฝ”๋“œ 58-7 ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์˜ ์ค‘์ฒฉ ๋ฐ˜๋ณต์„ ์œ„ํ•œ ๊ถŒ์žฅ ๊ด€์šฉ๊ตฌ (349์ชฝ)
 for (Suit suit : suits)
     for (Rank rank : ranks)
        deck.add(new Card(suit, rank));

for-each๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ 3๊ฐ€์ง€

  • ํŒŒ๊ดด์ ์ธ ํ•„ํ„ฐ๋ง - ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์„ ํƒ๋œ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๋ฉด remove ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ์ž๋ฐ” 8๋ถ€ํ„ฐ๋Š” removeIf ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ปฌ๋ ‰์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์ˆœํšŒํ•˜๋Š” ์ผ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ€ํ˜• - ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ทธ ์›์†Œ์˜ ๊ฐ’ ์ผ๋ถ€ ํ˜น์€ ์ „์ฒด๋ฅผ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ˜๋ณต์ž๋‚˜ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
  • ๋ณ‘๋ ฌ ๋ฐ˜๋ณต - ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์„ ๋ณ‘๋ ฌ๋กœ ์ˆœํšŒํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ๋ฐ˜๋ณต์ž์™€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์—„๊ฒฉํ•˜๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค. (์ฝ”๋“œ 58-4 ์˜ˆ์‹œ)

3๊ฐ€์ง€ ์ƒํ™ฉ ์ค‘ ํ•˜๋‚˜์— ์†ํ•  ๋•Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋˜ ๋ฌธ์ œ๋“ค์„ ๊ฒฝ๊ณ„ํ•˜์ž.

foreach๋ฌธ์€ ์ปฌ๋ ‰์…˜๊ณผ ๋ฐฐ์—ด์€ ๋ฌผ๋ก  Iterable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ผ๋ฉด ๋ฌด์—‡์ด๋“  ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

public interface Iterable<E> {
   // ์ด ๊ฐ์ฒด์˜ ์›์†Œ๋“ค์„ ์ˆœํšŒํ•˜๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
   Iterator<E> iterator();
}
  • Iterable์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ๊นŒ๋‹ค๋กญ์ง€๋งŒ ์›์†Œ๋“ค์˜ ๋ฌถ์Œ์„ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด Iterable์„ ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์œผ๋กœ ๊ณ ๋ฏผํ•ด๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

Iterable์„ ๊ตฌํ˜„ํ•ด๋‘๋ฉด ๊ทธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ for-each ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ์‚ฌํ•ดํ•  ๊ฒƒ์ด๋‹ค.

ํ•ต์‹ฌ ์ •๋ฆฌ

for๋ฌธ ๋ณด๋‹ค for-each ๋ฌธ์ด ๋ช…๋ฃŒํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•ด์ค€๋‹ค. 
โš ๏ธ **GitHub.com Fallback** โš ๏ธ