item 69 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μμΈλ μ§μ§ μμΈ μν©μμλ§ μ¬μ©νλΌ
// μμΈλ₯Ό μ¬μ©ν΄ 볡μ‘νκ² λ§λ μ½λ
try{
int i = 0;
while(true)
range[i++].climb();
} catch (ArrayIndexOutOfBoundsException e) {
//
}
// νμ€μ μΈ κ΄μ©κ΅¬λλ‘ μμ±ν μ½λ
for (Mountain m : range)
m.climb();
μμΈλ₯Ό λ°μμμΌ μμ£Ό λμ°ν λ°©λ²μΌλ‘ λ°λ³΅μ μ’ λ£ν μ½λκ° μλ‘ λμμλ€. μ μκΈ°μ½κ³ 보기μ¬μ΄ νμ€μ μΈ κ΄μ©κ΅¬ forλ₯Ό μ¬μ©νμ§ μκ³ μμΈλ₯Ό μ¬μ©νμκΉ?
- μλͺ»λ μΆλ‘ μ κ·Όκ±°λ‘ μ±λ₯μ λμ¬λ³΄λ €κ³ ν κ²μ΄λ€.
- JVMμ λ°°μ΄μ μ κ·Όν λλ§λ€ κ²½κ³λ₯Ό λμ§ μλμ§ κ²μ¬νλλ°, μΌλ°μ μΈ λ°λ³΅λ¬Έλ λ°°μ΄ κ²½κ³μ λλ¬νλ©΄ μ’
λ£νλ€. β μ΄ κ²μ¬λ₯Ό λ°λ³΅λ¬Έμλ λͺ
μνλ©΄ μΌμ΄ μ€λ³΅λλ€ β μ€λ³΅λλκΉ νλλ₯Ό μλ΅νμ! λμ μμΈλ₯Ό λ£μ. β κ·Έλ¬λ μλͺ»λ μΆλ‘ μ΄λ€.
- μμΈλ μμΈμ μν©μ μΈ μ©λλ‘ μ€κ³λμμΌλ―λ‘ JVM ꡬνμ μ μ₯μμλ λͺ νν κ²μ¬λ§νΌ(μΌλ°μ μΌλ‘ μ¬μ©λλ κΈ°λ₯)λ§νΌ λΉ λ₯΄κ² λ§λ€μ΄μΌ ν νμλ₯Ό λͺ» λλλ€. μ΅μ νμ λ³λ‘ μ κ²½μ μ°μ§ μμλ€λ λ»μ΄λ€.
- λ°°μ΄μ μννλ νμ€ κ΄μ©κ΅¬λ μμ μΈκΈν μ€λ³΅ κ²μ¬λ₯Ό μννμ§ μλλ€. JVMμ΄ μμμ μ΅μ νλ₯Ό νκΈ° λλ¬Έμ΄λ€.
- try-catch λΈλ‘ μμͺ½μ μλ μ½λλ JVMμ΄ μ μ©ν μ μλ μ΅μ νκ° μ νλλ€.
μ€μμ μμΈλ₯Ό μ¬μ©ν μͺ½μ΄ νμ€ κ΄μ©κ΅¬λ³΄λ€ ν¨μ¬ λ리λ€. μμΈλ₯Ό μ¬μ©ν λ°λ³΅λ¬Έμ ν΄μ μ μ½λλ₯Ό ν·κ°λ¦¬κ² νκ³ μ±λ₯μ λ¨μ΄λ¨λ¦¬λλ°μ λλμ§ μλλ€. μ¬μ§μ΄ μ λλ‘ λμνμ§ μμ μλ μλ€. λ°λ³΅λ¬Έ μμ λ²κ·Έκ° μ¨μ΄μλ€λ©΄ νλ¦ μ μ΄μ μ°μΈ μμΈκ° μ΄ λ²κ·Έλ₯Ό μ¨κ²¨ λλ²κΉ μ ν¨μ¬ μ΄λ ΅κ² ν κ²μ΄λ€.
β λ°λ³΅λ¬Έμ λͺΈμ²΄μμ νΈμΆν λ©μλκ° λ΄λΆμμ κ΄λ ¨ μλ λ°°μ΄μ μ¬μ©νλ€κ° ArrayIndexOutOfBoundsExceptionμ μΌμΌμΌ°λ€λ©΄ νμ€ κ΄μ©μ΄κ΅¬μμλ ν΄λΉ μ€λ λλ₯Ό μ¦κ° μ’ λ£ν κ²μ΄λ€. κ·Έλ¬λ μμΈλ₯Ό μ¬μ©νλ€λ©΄ λ°λͺ©λ¬Έμ λ²κ·Έ λλ¬Έμ κ°μ΄ μλͺ»λμλλ°λ μ μμ μλμ΄λΌ μκ°νμ¬ μν©μ μ€ν΄νκ³ λμ΄κ°λ€.
μμΈλ μ€μ§ μν μν©μμλ§ μ¨μΌ νλ€. μ λλ‘ μΌμμ μΈ μ μ΄ νλ¦μ©μΌλ‘ μ°μ¬μ μ λλ€.
νμ€μ μ΄κ³ μ½κ² μ΄ν΄λλ κ΄μ©κ΅¬λ₯Ό μ¬μ©νκ³ , μ±λ₯ κ°μ μ λͺ©μ μΌλ‘ κ³Όνκ² λ¨Έλ¦¬λ₯Ό μ΄ κΈ°λ²μ μμ νμ. μ€μ λ‘ μ±λ₯μ΄ μ’μμ§λλΌλ μλ° νλ«νΌμ΄ κΎΈμ€ν κ°μ λκ³ μμΌλ μ΅μ νλ‘ μ»μ μλμ μΈ μ±λ₯ μ°μκ° μ€λκ°μ§ μμ μ μλ€. λ°λ©΄ κ³Όνκ² μ리ν κΈ°λ²μ μ¨κ²¨μ§ λ―Έλ¬ν λ²κ·Έμ νν΄μ μ΄λ €μμ§ μ μ§λ³΄μ λ¬Έμ λ κ³μ μ΄μ΄μ§ κ²μ΄λ€.
μ μ€κ³λ APIλΌλ©΄ ν΄λΌμ΄μΈνΈκ° μ μμ μΈ μ μ΄ νλ¦μμ μμΈλ₯Ό μ¬μ©ν μΌμ΄ μκ² ν΄μΌ νλ€.
νΉμ μνμμλ§ νΈμΆν μ μλ 'μν μμ‘΄μ ' λ©μλλ₯Ό μ 곡νλ ν΄λμ€λ 'μν κ²μ¬' λ©μλκ³ ν¨κ» μ 곡ν΄μΌ νλ€. (ex: Iterator μΈν°νμ΄μ€μ nextμ hasNext
// μν κ²μ¬ λ©μλ μ¬μ©!
for (Iterator<Foo> i = collection.iterator(); i.hasNext(); ) {
Foo foo = i.next();
....
}
// μν κ²μ¬ λ©μλκ° μλ€λ©΄ ν΄λΌμ΄μΈνΈκ° νκ² λ μΌ
// μ λ μ΄λ° μμΈλ₯Ό λ°μμν€λ λ°©μμΌλ‘ 컬λ μ
μννμ§ λ§ κ²
try {
Iterator<Foo> i = collection.iterator();
while(true) {
Foo foo = i.next();
...
}
} catch (NoSuchElementException e) {
}
μν κ²μ¬ λ©μλκ° μμλ€λ©΄ μ°λ¦¬λ λ°λ³΅λ¬Έμ μμΈλ₯Ό μ¬μ©ν΄μ μ₯ν©νκ³ ν·κ°λ¦¬κ³ , μλλ λλ¦¬κ³ μλ±ν κ³³μμ λ°μν λ²κ·Έλ₯Ό μ¨κΈ°λ μ½λλ₯Ό μμ±νκ² λλ€. κ·Έλ°λ° μν κ²μ¬ λ©μλ λμ μ¬μ©ν μ μλ μ νμ§λ μλ€. μ΅μ λ νΉμ nullκ³Ό κ°μ νΉμν κ°μ λ°ννλ κ²μ΄λ€!
- μΈλΆ λκΈ°ν μμ΄ μ¬λ¬ μ€λ λκ° λμμ μ κ·Όν μ μκ±°λ μΈλΆ μμΈμΌλ‘ μνκ° λ³ν μ μλ€λ©΄ μ΅μ λμ΄λ νΉμ κ°μ μ¬μ©νλ€. μν κ²μ¬ λ©μλμ μν μμ‘΄λ©μλ νΈμΆ μ¬μ΄μ κ°μ²΄μ μνκ° λ³ν μ μκΈ° λλ¬Έμ΄λ€.
- μ±λ₯μ΄ μ€μν μν©μμ μν κ²μ¬ λ©μλκ° μν μμ‘΄μ λ©μλμ μμ μΌλΆλ₯Ό μ€λ³΅ μννλ€λ©΄ μ΅μ λμ λ°ννμ.
- μ΄μΈμ λͺ¨λ κ²½μ°μ μν κ²μ¬ λ©μλ λ°©μμ΄ μ‘°κΈ λ λ«λ€. κ°λ μ±μ΄ μ΄μ§ λ μ’κ³ , μλͺ» μ¬μ©νμ λ λ°κ²¬λ μ½λ€. λν μν κ²μ¬ λ©μλ νΈμΆμ κΉλΉ‘νλ€λ©΄ μν μμ‘΄ λ©μλκ° μμΈλ₯Ό νμ€νκ² λμ Έμ λ²κ·Έλ₯Ό μ 보μ¬μ€ κ²μ΄λ€.
μμΈλ μμΈ μν©μμ μΈ μλλ‘ μ€κ³λμλ€. μ μμ μΈ μ μ΄ νλ¦μμ μ¬μ©ν΄μλ μλλ©°, μ΄λ₯Ό νλ‘κ·Έλλ¨Έμκ² κ°μνλ APIλ₯Ό λ§λ€μ΄μλ μλγ·