item 58 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์ ํต์ ์ธ for ๋ฌธ๊ณผ ๋น๊ตํ์ ๋ for-each ๋ฌธ์ ๋ช ๋ฃํ๊ณ , ์ ์ฐํ๊ณ , ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํด์ค๋ค. ์ฑ๋ฅ ์ ํ๋ ์๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ๊ณณ์์ for ๋ฌธ์ด ์๋ for-each ๋ฌธ์ ์ฌ์ฉํ์.
for(Iterator<Element> i = c.iterator(); i.hasNext(); ) {
Element e = i.next();
... // e๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ค.
}
for(int i=0;i<a.length;i++){
... // a[i]๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ค.
}
์ ์ฝ๋๋ ๋ฐฐ์ด์ ์ํํ๋ ๊ธฐ๋ณธ์ ์ธ for๋ฌธ์ด๋ค. ์ด๋ฐ ์ฝ๋๋ ๋ฐ๋ณต์ ์ํ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ฉฐ ์๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
- ๋ฐ๋ณต์์ ์ธ๋ฑ์ค ๋ณ์๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ง์ ๋ถํ๊ฒ ํ๋ค.
- ์์ ์ข ๋ฅ๊ฐ ๋์ด๋๋ฉด ์ค๋ฅ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
- ํน์๋ผ๋ ์๋ชป๋ ๋ณ์๋ฅผ ์ฌ์ฉ ํ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ก์์ฃผ๋ฆฌ๋ผ๋ ๋ณด์ฅ๋ ์๋ค.
- ์ปฌ๋ ์ ์ด๋ ๋ฐฐ์ด์ด๋์ ๋ฐ๋ผ ์ฝ๋ ํํ๊ฐ ์๋นํ ๋ฌ๋ผ์ง๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
์ ๋ฌธ์ ๋ for-each ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ํด๊ฒฐ๋๋ค. ์ฐธ๊ณ ๋ก for-each ๋ฌธ์ ์ ์ ์ด๋ฆ์ 'ํฅ์๋ for ๋ฌธ(enhanced for statement)์ด๋ค.
for (Element e : elements) {
... // e๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ค.
}
for-each
๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ปฌ๋ ์
์ด๋ ๋ฐฐ์ด์ด๋ , ์๋๋ ์ด์ ๊ณผ ๋์ผํ๋ค. ์ฌ๋์ด ์์ผ๋ก ์ต์ ํํ ๊ฒ๊ณผ ์ฌ์ค์ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์ปฌ๋ ์ ์ ์ค์ฒฉํด ์ํํด์ผ ํ๋ค๋ฉด for-each ๋ฌธ์ ์ด์ ์ด ๋์ฑ ์ปค์ง๋ค. ์๋๋ ๋ฐ๋ณต๋ฌธ์ ์ค์ฒฉํ ๋ ํํ ์ ์ง๋ฅด๋ ์ค์๋ฅผ ๋ณด์ฌ์ค๋ค.
for (Iterator<Suit> i = suits.iterator(); i.hasNext(); )
for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
deck.add(new Card(i.next(), j.next())); // i.next()-->์๋ฌ
for-each ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ์ํฉ์ด ์ธ๊ฐ์ง ์กด์ฌํ๋ค.
-
ํ๊ดด์ ์ธ ํํฐ๋ง(destructive filtering) - ์ปฌ๋ ์ ์ ์ํํ๋ฉด์ ์ ํ๋ ์์๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค๋ฉด ๋ฐ๋ณต์์ remove ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค. ์๋ฐ 8๋ถํฐ๋ Collection์ removeIf ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ปฌ๋ ์ ์ ๋ช ์์ ์ผ๋ก ์ํํ๋ ์ผ์ ํผํ ์ ์๋ค.
List<Integer> list = new ArrayList<Integer>(); list.add(0); list.add(1); list.add(2); for(Iterator<Integer> it = list.iterator();it.hasNext();) { if(it.next() == 2) { it.remove(); // remove ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค } }
list.removeIf(item -> item == 2); // ์๋ฐ 8๋ถํฐ removeIf ์ฌ์ฉ ๊ฐ๋ฅ
-
๋ณํ(transforming) - ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๊ทธ ์์์ ๊ฐ ์ผ๋ถ ํน์ ์ ์ฒด๋ฅผ ๊ต์ฒดํด์ผ ํ๋ค๋ฉด ๋ฆฌ์คํธ์ ๋ฐ๋ณต์๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
-
๋ณ๋ ฌ ๋ฐ๋ณต(parallel iteration) - ์ฌ๋ฌ ์ปฌ๋ ์ ์ ๋ณ๋ ฌ๋ก ์ํํด์ผ ํ๋ค๋ฉด ๊ฐ๊ฐ์ ๋ฐ๋ณต์์ ์ธ๋ฑ์ค ๋ณ์๋ฅผ ์ฌ์ฉํด ์๊ฒฉํ๊ณ ๋ช ์์ ์ผ๋ก ์ ์ดํด์ผ ํ๋ค(์๋ํ ๊ฒ์ ์๋์ง๋ง ์์์ ์ฝ๋ 58-4๊ฐ ์ด๋ฌํ ์ฌ๋ก์ ์ํ๋ค).
int[] sample1 = new int[100]; int[] sample2 = new int[100]; for(int i=0;i<100;i++) { sample1[i] = 0; sample2[i] = 1; }
for-each ๋ฌธ์ ์ปฌ๋ ์ ๊ณผ ๋ฐฐ์ด์ ๋ฌผ๋ก Iterable ์ธํฐํ์ด์ค๋ฅด ๊ตฌํํ ๊ฐ์ฒด๋ผ๋ฉด ๋ฌด์์ด๋ ์ํํ ์ ์๋ค. Iterable ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ์๋๊ฐ ๋จ ํ๋ ๋ฟ์ด๋ค.
public interface Iterable<T> {
Iterator<T> iterator();
}
Iterable์ ์ฒ์๋ถํฐ ์ง์ ๊ตฌํํ๊ธฐ๋ ๊น๋ค๋กญ์ง๋ง, ์์๋ค์ ๋ฌถ์์ ํํํ๋ ํ์ ์ ์์ฑํด์ผ ํ๋ค๋ฉด Iterable์ ๊ตฌํํ๋ ์ชฝ์ผ๋ก ๊ณ ๋ฏผํด๋ณด๊ธฐ ๋ฐ๋๋ค. Iterable์ ๊ตฌํํด๋๋ฉด ๊ทธ ํ์ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ for-each ๋ฌธ์ ์ฌ์ฉํ ๋๋ง๋ค ์ฌ๋ฌ๋ถ์๊ฒ ๊ฐ์ฌํดํ ๊ฒ์ด๋ค.