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

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

์ „ํ†ต์ ์ธ 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๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ๋ฐ˜๋ณต์„ ์œ„ํ•œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  1. ๋ฐ˜๋ณต์ž์™€ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ฝ”๋“œ๋ฅผ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ํ•œ๋‹ค.
  2. ์›์†Œ ์ข…๋ฅ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.
  3. ํ˜น์‹œ๋ผ๋„ ์ž˜๋ชป๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žก์•„์ฃผ๋ฆฌ๋ผ๋Š” ๋ณด์žฅ๋„ ์—†๋‹ค.
  4. ์ปฌ๋ ‰์…˜์ด๋ƒ ๋ฐฐ์—ด์ด๋ƒ์— ๋”ฐ๋ผ ์ฝ”๋“œ ํ˜•ํƒœ๊ฐ€ ์ƒ๋‹นํžˆ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

์œ„ ๋ฌธ์ œ๋Š” 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 ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ์„ธ๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค.

  1. ํŒŒ๊ดด์ ์ธ ํ•„ํ„ฐ๋ง(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 ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  2. ๋ณ€ํ˜•(transforming) - ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ทธ ์›์†Œ์˜ ๊ฐ’ ์ผ๋ถ€ ํ˜น์€ ์ „์ฒด๋ฅผ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ˜๋ณต์ž๋‚˜ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  3. ๋ณ‘๋ ฌ ๋ฐ˜๋ณต(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 ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๊ฐ์‚ฌํ•ดํ•  ๊ฒƒ์ด๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ