Skip to content

Latest commit

Β 

History

History
105 lines (78 loc) Β· 3.94 KB

item69.md

File metadata and controls

105 lines (78 loc) Β· 3.94 KB

μ˜ˆμ™ΈλŠ” μ§„μ§œ μ˜ˆμ™Έ μƒν™©μ—λ§Œ μ‚¬μš©ν•˜λΌ.

import java.awt.event.MouseAdapter;import java.util.Arrays;class Mountain {
    public void climb() throws InterruptedException {
        Thread.sleep(1000L);
        System.out.println("ν•œκ±ΈμŒ~");
    }
}

public static void main(String[] args) {
    List<Mountain> range = Arrays.asList(new Mountain(), new Mountain(), new Mountain());
    for (Mountain m : range) {
        m.climb();
    }
}

이 순회λ₯Ό μ΅œμ ν™” ν•˜λŠ” 방법은 ?







for-each 문은 λ‚΄λΆ€μ μœΌλ‘œ iterator λ₯Ό 톡해 λ°˜λ³΅μ„ μ‹€ν–‰ν•œλ‹€.

  • JVM 은 배열에 μ ‘κ·Όν•  λ•Œ λ§ˆλ‹€ 경계λ₯Ό λ„˜λŠ”μ§€ μ•ˆλ„˜λŠ”μ§€ λ°˜λ³΅ν•œλ‹€.
  • 일반적인 λ°˜λ³΅λ¬Έλ„ λ°°μ—΄ 경계에 λ„λ‹¬ν•˜λ©΄ μ’…λ£Œν•œλ‹€.
  • JVM μ—μ„œ ν•œλ²ˆ, Iterator 의 hasNext() μ΄λ ‡κ²Œ λ‘λ²ˆ κ²€μ‚¬ν•˜λŠ” 것은 λ°˜λ³΅μ΄λ‹€ ?
int i = 0;
try {
    while (true) {
        range[i++].climb();
    }
} catch (Exception e) {
}
  • 이 μ½”λ“œλŠ” 계속 μˆœνšŒν•˜λ‹€κ°€ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜ ArrayIndexOutOfBoundsException 이 μΌμ–΄λ‚˜λ©΄ λ°˜λ³΅μ„ μ€‘μ§€ν•˜λŠ” 방법이닀.

이 μ΅œμ ν™” 방법은 잘λͺ»λ˜μ—ˆλ‹€!

  1. μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ 상황에 μ“Έ μš©λ„λ‘œ μ„€κ³„λ˜μ—ˆλ‹€.
  2. μ½”λ“œλ₯Ό try-catch 블둝 μ•ˆμ— λ„£μœΌλ©΄ JVM 이 μ μš©ν•  수 μžˆλŠ” μ΅œμ ν™”κ°€ μ œν•œλœλ‹€.
  3. 배열을 μˆœνšŒν•˜λŠ” ν‘œμ€€ κ΄€μš©κ΅¬λŠ” μ•žμ„œμ˜ 쀑볡적인 검사λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€. JVM 이 μ•Œμ•„μ„œ μ΅œμ ν™”ν•΄μ€€λ‹€.

μ‹€μ œλ‘œ λ’· 방법이 훨씬 λŠλ¦¬λ‹€.

Mountain[] range = new Mountain[1000000];
System.currentTimeMillis();
κΈ°μ€€

일반적 for-each : 10715
μ˜ˆμ™Έλ₯Ό μ΄μš©ν•œ 반볡 : 10075

제 μ»΄ν“¨ν„°μ—μ„œλŠ” λΉ„μŠ·ν•˜μ§€λ§Œ, μ£ μŠˆμ•„λ‹˜μ˜ μ»΄ν“¨ν„°μ—μ„œλŠ” μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•œ 방법이 2λ°° λŠλ¦¬λ‹€κ³  ν•©λ‹ˆλ‹€.

μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•œ 반볡문의 λ‹€λ₯Έ 단점

  1. μ½”λ“œλ₯Ό λ”λŸ½κ³  μ„±λŠ₯을 λ–¨μ–΄λœ¨λ¦°λ‹€.
  2. 반볡문이 λŒλ•Œ ArrayIndexOutOfBoundsException κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ μ •μƒμ μœΌλ‘œ λ°°μ—΄μ˜ 반볡이 λλ‚œμ€„ μ•Œ 것이닀.

μ˜ˆμ™ΈλŠ” 였직 μ˜ˆμ™Έ μƒν™©μ—μ„œλ§Œ μ¨μ•Όν•œλ‹€. μ ˆλŒ€ 일상적인 μ œμ–΄ νλ¦„μš©μœΌλ‘œ μ“°μ—¬μ„  μ•ˆλœλ‹€.

ν‘œμ€€μ μ΄κ³  μ‰½κ²Œ μ΄ν•΄λ˜λŠ” κ΄€μš©κ΅¬λ₯Ό μ‚¬μš©ν•΄λΌ. μžμ‹ μ˜ 머리가 λ›°μ–΄λ‚˜λ‹€κ³  μ°©κ°ν•˜μ§€ 말라.


잘 μ„€κ³„λœ API 라면 ν΄λΌμ΄μ–ΈνŠΈκ°€ 정상적인 μ œμ–΄ νλ¦„μ—μ„œ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•  일이 μ—†κ²Œ ν•΄μ•Ό ν•œλ‹€.

μƒνƒœ 의쑴적 λ©”μ„œλ“œμ™€ μƒνƒœ 검사 λ©”μ„œλ“œλ₯Ό 톡해 정상적 μ œμ–΄ νλ¦„μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ•Όν•œλ‹€.

  • μƒνƒœ 의쑴적 λ©”μ„œλ“œ : νŠΉμ • μƒνƒœμ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œ
  • μƒνƒœ 검사 λ©”μ„œλ“œ : μƒνƒœλ₯Ό κ²€μ‚¬ν•˜λŠ” λ©”μ„œλ“œ

μœ„μ˜ 두 λ©”μ„œλ“œλŠ” ν•¨κ»˜ μ œκ³΅ν•΄μ•Όν•œλ‹€.

예λ₯Ό λ“€μ–΄, Iterator μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μƒνƒœ 의쑴적 λ©”μ„œλ“œλŠ” next(), μƒνƒœ 검사 λ©”μ„œλ“œλŠ” hasNext()

정상 흐름을 μœ„ν•΄ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ μƒνƒœμΌλ•Œ, 빈 μ˜΅μ…”λ„μ΄λ‚˜ null 같은 νŠΉμˆ˜ν•œ 값을 λ„˜κΈΈμˆ˜λ„ μžˆλ‹€.


μƒνƒœ 검사 λ©”μ„œλ“œ, μ˜΅μ…”λ„, νŠΉμ • κ°’ 쀑 선택을 ν•˜λŠ” 팁

  1. μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ ‘κ·Όκ°€λŠ₯ν•˜κ±°λ‚˜ μ™ΈλΆ€μ—μ„œ μƒνƒœλ₯Ό λ°”κΏ€ 수 μžˆλ‹€
    -> μ˜΅μ…”λ„μ΄λ‚˜ νŠΉμ • 값을 μ‚¬μš©ν•œλ‹€.
    -> μƒνƒœ 검사 λ©”μ„œλ“œμ™€ μƒνƒœ 의쑴적 λ©”μ„œλ“œμ˜ λ™μž‘ 사이에 값이 변해버릴 수 μžˆλ‹€.
  2. μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ μƒνƒœ 검사 λ©”μ„œλ“œκ°€ μƒνƒœ 의쑴적 λ©”μ„œλ“œμ˜ 일과 μ€‘λ³΅λ˜λŠ” 일을 ν•œλ‹€.
    -> μ˜΅μ…”λ„μ΄λ‚˜ νŠΉμ • 값을 μ‚¬μš©ν•œλ‹€.
  3. λ‹€λ₯Έ λͺ¨λ“  κ²½μš°μ—λŠ” μƒνƒœ 검사 λ©”μ„œλ“œ, μƒνƒœ 의쑴적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μž.


κ²°λ‘ 

  • μ˜ˆμ™Έλ₯Ό 정상 νλ¦„μ—μ„œ μ œμ–΄λ₯Ό μœ„ν•΄ μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€.
  • 또, 정상 νλ¦„μ—μ„œ μ œμ–΄ν•˜κΈ° μœ„ν•΄ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” API λ₯Ό λ§Œλ“€λ©΄ μ•ˆλœλ‹€.
    • 그러기 μœ„ν•΄μ„œλŠ” μƒνƒœ 의쑴적 λ©”μ„œλ“œ, μ˜΅μ…”λ„, νŠΉμ •κ°’ λ°˜ν™˜λ“±μ˜ 방법을 μ œκ³΅ν•  수 μžˆλ‹€.