πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

λ§€κ°œλ³€μˆ˜κ°€ μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ49)]

Amenable 2023. 12. 10. 13:40

  λ©”μ„œλ“œλ‚˜ μƒμ„±μžλ₯Ό μž‘μ„±ν•  λ•Œλ©΄ κ·Έ λ§€κ°œλ³€μˆ˜λ“€μ— μ–΄λ–€ μ œμ•½μ΄ μžˆμ„μ§€ 생각해야 ν•œλ‹€. 이λ₯Ό μœ„ν•œ μ›μΉ™ 2κ°€μ§€λ₯Ό μ‚΄νŽ΄λ³΄μž.

 

πŸ“™ 1. 원칙 1 : 였λ₯˜λŠ” κ°€λŠ₯ν•œ ν•œ 빨리 (λ°œμƒν•œ κ³³μ—μ„œ) μž‘μ•„μ•Ό ν•œλ‹€.

  였λ₯˜λ₯Ό λ°œμƒν•œ μ¦‰μ‹œ μž‘μ§€ λͺ»ν•˜λ©΄ ν•΄λ‹Ή 였λ₯˜λ₯Ό κ°μ§€ν•˜κΈ° μ–΄λ €μ›Œμ§€κ³ , κ°μ§€ν•˜λ”λΌλ„ 였λ₯˜μ˜ λ°œμƒ 지점을 μ°ΎκΈ° μ–΄λ €μ›Œμ§„λ‹€.

λ§€κ°œλ³€μˆ˜ 검사λ₯Ό μ œλŒ€λ‘œ ν•˜μ§€ λͺ»ν•˜λ©΄ μ•„λž˜μ™€ 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

  • λ©”μ„œλ“œκ°€ μˆ˜ν–‰λ˜λŠ” 쀑간에 λͺ¨ν˜Έν•œ μ˜ˆμ™Έλ₯Ό λ˜μ§€λ©° μ‹€νŒ¨ν•  수 μžˆλ‹€.
  • λ©”μ„œλ“œκ°€ 잘 μˆ˜ν–‰λ˜μ§€λ§Œ 잘λͺ»λœ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.
  • λ©”μ„œλ“œλŠ” λ¬Έμ œμ—†μ΄ μˆ˜ν–‰λμ§€λ§Œ, μ–΄λ–€ 객체λ₯Ό μ΄μƒν•œ μƒνƒœλ‘œ λ§Œλ“€μ–΄λ†“μ•„μ„œ 미래의 μ•Œ 수 μ—†λŠ” μ‹œμ μ— 이 λ©”μ„œλ“œμ™€λŠ” κ΄€λ ¨ μ—†λŠ” 였λ₯˜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

  μ΄λŸ¬ν•œ 문제λ₯Ό μ˜ˆλ°©ν•˜κ³ μž publicκ³Ό protected λ©”μ„œλ“œλŠ” λ§€κ°œλ³€μˆ˜ 값이 잘λͺ»λμ„ λ•Œ λ˜μ§€λŠ” μ˜ˆμ™Έλ₯Ό λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€. λ˜ν•œ, λ§€κ°œλ³€μˆ˜μ˜ μ œμ•½μ„ λ¬Έμ„œν™”ν•œλ‹€λ©΄ κ·Έ μ œμ•½μ„ μ–΄κ²Όμ„ λ•Œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ„ ν•¨κ»˜ κΈ°μˆ ν•΄μ•Ό ν•œλ‹€.

/**
 *
 * 항상 음이 μ•„λ‹Œ BigIntegerλ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” μ μ—μ„œ remainder λ©”μ„œλ“œμ™€ λ‹€λ₯΄λ‹€.
 *
 * @param m κ³„μˆ˜ (μ–‘μˆ˜μ—¬μ•Ό ν•œλ‹€.)
 * @return ν˜„μž¬ κ°’ mod m
 * @throws ArithmeticException m이 0보닀 μž‘κ±°λ‚˜ κ°™μœΌλ©΄ λ°œμƒν•œλ‹€.
 */
public BigInteger mod(BigInteger m) {
    if (m.signum() <= 0)
        throw new ArithmeticException("κ³„μˆ˜(m)λŠ” μ–‘μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€. " + m);
    ... // 계산 μˆ˜ν–‰
}

 

πŸ“™ 2. 원칙 2 : λ‚˜μ€‘μ— μ“°λ €κ³  μ €μž₯ν•˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λΌ.

  λ©”μ„œλ“œκ°€ 직접 μ‚¬μš©ν•˜μ§€λŠ” μ•ŠμœΌλ‚˜ λ‚˜μ€‘μ— μ“°κΈ° μœ„ν•΄ μ €μž₯ν•˜λŠ” λ§€κ°œλ³€μˆ˜λŠ” 특히 더 μ‹ κ²½ μ¨μ„œ 검사해야 ν•œλ‹€.

  Listλ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œκ°€ μžˆλ‹€κ³  ν•΄λ³΄μž. null 검사λ₯Ό μƒλž΅ν•œ 경우, ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒλ €λ°›μ€ Listλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ λΉ„λ‘œμ†Œ NullPointException이 λ°œμƒν•œλ‹€. 그러면 μ΄ Listλ₯Ό μ–΄λ””μ„œ κ°€μ Έμ™”λŠ”μ§€ μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œ λ””버깅이 μƒλ‹Ήνžˆ κ΄΄λ‘œμ›Œμ§€κ²Œ λœλ‹€.

  λ¬Όλ‘  ν•΄λ‹Ή μ›μΉ™μ˜ μ•„λž˜μ™€ 같은 μ˜ˆμ™Έλ„ μ‘΄μž¬ν•œλ‹€.

  • μœ νš¨μ„± 검사 λΉ„μš©μ΄ μ§€λ‚˜μΉ˜κ²Œ λ†’κ±°λ‚˜ μ‹€μš©μ μ΄μ§€ μ•Šμ„ λ•Œ
  • 계산 κ³Όμ •μ—μ„œ μ•”λ¬΅μ μœΌλ‘œ 검사가 μˆ˜ν–‰λ  λ•Œ

 

  μ •λ¦¬ν•˜μžλ©΄, λ©”μ„œλ“œλ‚˜ μƒμ„±μžλ₯Ό μž‘μ„±ν•  λ•Œλ©΄ κ·Έ λ§€κ°œλ³€μˆ˜λ“€μ— μ–΄λ–€ μ œμ•½μ΄ μžˆμ„μ§€ 생각해야 ν•œλ‹€. 그리고 κ·Έ μ œμ•½λ“€μ„ λ¬Έμ„œν™”ν•˜κ³  λ©”μ„œλ“œ μ½”λ“œ μ‹œμž‘ λΆ€λΆ„μ—μ„œ λͺ…μ‹œμ μœΌλ‘œ κ²€μ‚¬ν•΄μ•Ό ν•œλ‹€.

 

 

ν•΄λ‹Ή 글은 Joshua Bloch λ‹˜μ˜ 'Effective Java 3/E'λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.