Item 49. Parameter Validation

λ§€κ°œλ³€μˆ˜κ°€ μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λΌ

λ©”μ„œλ“œμ™€ μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λŠ” νŠΉμ • 쑰건이 λ§Œμ‘±λ˜λŠ” κ°’λ§Œ λ“€μ–΄μ˜€λ„λ‘ κΈ°λŒ€ν•˜μ§€λ§Œ, 검사λ₯Ό μ œλŒ€λ‘œ μˆ˜ν–‰ν•˜μ§€ μ•ŠμœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜κ±°λ‚˜ μ•„μ˜ˆ 잘λͺ»λœ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€. λ•Œλ¬Έμ— publicμ΄λ‚˜ protected λ©”μ„œλ“œμ—λŠ” μ–΄λ–€ μ œμ•½μ΄ μžˆμ„μ§€ μƒκ°ν•˜κ³  λ§€κ°œλ³€μˆ˜ 값이 잘λͺ»λμ„ λ•Œ λ˜μ§€λŠ” μ˜ˆμ™Έλ₯Ό λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€.

// java.math.BigInteger

/**
 * ...
 * <p>All methods and constructors in this class throw
 * {@code NullPointerException} when passed
 * a null object reference for any input parameter.
 * ...
 */
public class BigInteger extends Number implements Comparable<BigInteger> {

    // ...

    /**
     * (ν˜„μž¬ κ°’ mod m) 값을 λ°˜ν™˜ν•œλ‹€. 이 λ©”μ„œλ“œλŠ”
     * 항상 음이 μ•„λ‹Œ 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);
        }
        BigInteger result = this.remainder(m);
        return (result.signum >= 0 ? result : result.add(m));
    }

    // ...
}

μœ„ μ½”λ“œλŠ” BigInteger 클래슀의 mod λ©”μ„œλ“œμ˜ μœ νš¨μ„± 검사 λ¬Έμ„œν™” μ˜ˆμ‹œμ΄λ‹€. BigInteger 클래슀 μˆ˜μ€€μ—μ„œ input parameterκ°€ null인 κ²½μš°μ— λŒ€ν•΄ λ¬Έμ„œν™”κ°€ λ˜μ–΄ 있기 λ•Œλ¬Έμ— mod λ©”μ„œλ“œμ—μ„œλŠ” μ„€λͺ…이 μƒλž΅λ˜μ—ˆλ‹€. (클래슀 μˆ˜μ€€μ˜ 주석은 ν•΄λ‹Ή 클래슀의 λͺ¨λ“  public에 μ μš©λ˜λ―€λ‘œ, λ©”μ„œλ“œ μˆ˜μ€€μ—μ„œ μ€‘λ³΅ν•΄μ„œ μž‘μ„±ν•  ν•„μš”κ°€ μ—†λ‹€.)

λ§€κ°œλ³€μˆ˜ μœ νš¨μ„± κ²€μ‚¬μ˜ μ€‘μš”μ„±

λ§€κ°œλ³€μˆ˜λ‘œ 받은 값을 ν•΄λ‹Ή λ©”μ„œλ“œμ—μ„œ 직접 μ‚¬μš©ν•˜λ©΄ μ—λŸ¬ λ°œμƒ μ‹œ 원인을 μ°ΎλŠ” 것이 μ‰½μ§€λ§Œ, 그렇지 μ•Šμ€ κ²½μš°μ—λŠ” λ§€κ°œλ³€μˆ˜ μœ νš¨μ„± 검사가 λ”μš± μ€‘μš”ν•΄μ§„λ‹€. 예λ₯Ό λ“€μ–΄ 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‚˜μ€‘μ— μ“°κΈ° μœ„ν•΄ μ €μž₯ν•˜λŠ” κ²½μš°μ—”, μ•„λž˜μ˜ μ‹œλ‚˜λ¦¬μ˜€μ™€ 같이 μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λ˜λ©΄μ„œ 원인을 μ°ΎκΈ°κ°€ μ–΄λ €μ›Œμ§„λ‹€.

  1. λ©”μ„œλ“œλ₯Ό 톡해 객체 ν•„λ“œμ— null을 μ €μž₯(비정상적인 μƒνƒœ)

  2. μž„μ˜μ˜ μ‹œμ μ— ν•„λ“œμ— μ €μž₯된 null을 λ°˜ν™˜ν•˜κ±°λ‚˜ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ 호좜

  3. NullPointerException λ°œμƒν•˜λ©΄μ„œ μ–΄λŠ μ‹œμ μ— null이 μ €μž₯λ˜μ—ˆλŠ”μ§€ μΆ”μ ν•˜κΈ° 어렀움

λ§€κ°œλ³€μˆ˜ μœ νš¨μ„± 검사가 μƒλž΅λ˜λŠ” 경우

무쑰건 적으둜 λ§€κ°œλ³€μˆ˜ μœ νš¨μ„± 검사λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹Œλ°, μ•„λž˜μ˜ κ²½μš°μ—λŠ” μƒλž΅ν•΄λ„ λœλ‹€.

  • μœ νš¨μ„± 검사 λΉ„μš©μ΄ μ§€λ‚˜μΉ˜κ²Œ λ†’κ±°λ‚˜ μ‹€μš©μ μ΄μ§€ μ•Šμ€ 경우

  • 계산 κ³Όμ •μ—μ„œ μ•”λ¬΅μ μœΌλ‘œ 검사가 μˆ˜ν–‰λ˜λŠ” 경우

    • Collections.sort(List): μƒν˜Έ 비ꡐ될 수 μ—†λŠ” νƒ€μž…μ˜ 객체가 λ“€μ–΄κ°€λ©΄ ClassCastException이 λ°œμƒν•˜μ—¬, ꡳ이 μœ νš¨μ„± 검사λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

    • ν•˜μ§€λ§Œ 암묡적 μœ νš¨μ„± 검사에 λ„ˆλ¬΄ μ˜μ‘΄ν•˜κ²Œλ˜λ©΄ μ‹€νŒ¨ μ›μžμ„±μ„ ν•΄μΉ  수 μžˆμœΌλ‹ˆ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

Last updated