item 58 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
// ์ปฌ๋ ์
์ํ
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๋ฌธ (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));
- ํ๊ดด์ ์ธ ํํฐ๋ง - ์ปฌ๋ ์ ์ ์ํํ๋ฉด์ ์ ํ๋ ์์๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค๋ฉด remove ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค. ์๋ฐ 8๋ถํฐ๋ removeIf ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ปฌ๋ ์ ์ ๋ช ์์ ์ผ๋ก ์ํํ๋ ์ผ์ ํผํ ์ ์๋ค.
- ๋ณํ - ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๊ทธ ์์์ ๊ฐ ์ผ๋ถ ํน์ ์ ์ฒด๋ฅผ ๊ต์ฒดํด์ผ ํ๋ค๋ฉด ๋ฆฌ์คํธ์ ๋ฐ๋ณต์๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- ๋ณ๋ ฌ ๋ฐ๋ณต - ์ฌ๋ฌ ์ปฌ๋ ์ ์ ๋ณ๋ ฌ๋ก ์ํํด์ผ ํ๋ค๋ฉด ๊ฐ๊ฐ์ ๋ฐ๋ณต์์ ์ธ๋ฑ์ค ๋ณ์๋ฅผ ์ฌ์ฉํด ์๊ฒฉํ๊ณ ๋ช ์์ ์ผ๋ก ์ ์ดํด์ผ ํ๋ค. (์ฝ๋ 58-4 ์์)
3๊ฐ์ง ์ํฉ ์ค ํ๋์ ์ํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก for๋ฌธ์ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ค์ ๊ฒฝ๊ณํ์.
foreach๋ฌธ์ ์ปฌ๋ ์ ๊ณผ ๋ฐฐ์ด์ ๋ฌผ๋ก Iterable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ผ๋ฉด ๋ฌด์์ด๋ ์ํํ ์ ์๋ค.
public interface Iterable<E> {
// ์ด ๊ฐ์ฒด์ ์์๋ค์ ์ํํ๋ ๋ฐ๋ณต์๋ฅผ ๋ฐํํ๋ค.
Iterator<E> iterator();
}- Iterable์ ์ฒ์๋ถํฐ ์ง์ ๊ตฌํํ๊ธฐ๋ ๊น๋ค๋กญ์ง๋ง ์์๋ค์ ๋ฌถ์์ ํํํ๋ ํ์ ์ ์์ฑํด์ผ ํ๋ค๋ฉด Iterable์ ๊ตฌํํ๋ ์ชฝ์ผ๋ก ๊ณ ๋ฏผํด๋ณด๊ธฐ ๋ฐ๋๋ค.
Iterable์ ๊ตฌํํด๋๋ฉด ๊ทธ ํ์ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ for-each ๋ฌธ์ ์ฌ์ฉํ ๋๋ง๋ค ๊ฐ์ฌํดํ ๊ฒ์ด๋ค.
ํต์ฌ ์ ๋ฆฌ
for๋ฌธ ๋ณด๋ค for-each ๋ฌธ์ด ๋ช
๋ฃํ๊ณ ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํด์ค๋ค.