스터디/이펙티브 자바

[Effective Java] Item49. 매개변수가 유효한지 검사하라

📝 작성 : 2022.07.10  ⏱ 수정 : 
728x90

매개변수를 제대로 검사하지 않으면?

  • 메서드 수행 중간에 모호한 예외를 던질 수 있습니다.
  • 메서드가 잘못된 결과를 반환할 수 있습니다.
  • 잘못된 결과를 반환하므로 이후에 알 수 없는 시점에 이 메서드와 관련없는 오류를 낼 수 있습니다.

public과 protected 메서드는 매개변수 값이 잘 못 됐을 때 던지는 예외를 @throws 자바독 태그를 이용해 문서화해야 합니다. 매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술해야합니다.

/**
 * Returns a BigInteger whose value is {@code (this mod m}).  This method
 * differs from {@code remainder} in that it always returns a
 * <i>non-negative</i> BigInteger.
 *
 * @param  m the modulus.
 * @return {@code this mod m}
 * @throws ArithmeticException {@code m} &le; 0
 * @see    #remainder
 */
public BigInteger mod(BigInteger m) {
    if (m.signum <= 0)
        throw new ArithmeticException("BigInteger: modulus not positive");

    BigInteger result = this.remainder(m);
    return (result.signum >= 0 ? result : result.add(m));
}

m이 null일때 NullPointerException을 던진다는 예외가 없는데 그 이유는 이 설명을 mod라는 개별 메서드가 아닌 BigInteger 클래스 수준에서 기술했기 때문입니다. 클래스 수준의 주석은 모든 public 메서드에도 적용되므로 개별 메서드에 일일히 적는 것보다 훨씬 깔끔합니다.

자바 7에 추가된 java.util.Objects.requireNonNull메서드는 null검사를 편하게 도와줍니다.

단언문(assert)

공개되지 않는 메서드라면 단언문을 사용해 매개변수 유효성을 검증할 수 있ㄸ습니다.

단언문 vs 일반적인 유효성검사

  • 단언문은 실패하면 AssertionError를 던집니다.
  • 런타임에 아무런 효과도, 성능저하도 없습니다.(java 실행시 명령줄에 -ea혹은 --enableassertions을 추가하면 영향이 있습니다.)

예외상황

유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때, 혹은 계산 과정에서 암묵적으로 검사가 수행될 때는 매개변수 유효성 검사를 생략할 수 있습니다.

반응형