☕️ JAVA/Effective JAVA

[Effective Java] 아이템 49 : 매개변수가 유효한지 검사하라

1HOON 2021. 12. 4. 20:58

 

아이템 49 : 매개변수가 유효한지 검사하라


메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바랍니다.

  • 예) 인덱스 값은 음수가 아니어야함
  • 예) 객체 참조는 null이 아니어야함

이러한 제약은 반드시 문서화해야 하며 메서드 몸체(로직)가 시작되기 전에 검사해야합니다.

 

매개변수 검사를 제대로 하지 못하면 아래와 같은 문제가 발생합니다.

  • 메서드가 수행되는 중간에 모호한 예외를 던지며 실패
  • 메서드가 잘 수행되지만 잘못된 결과를 반환
  • 메서드가 문제없이 수행되었지만, 어떤 객체를 이상한 상태로 만들어놓아서 미래의 알 수 없는 시점에 이 메서드와 관련 없는 오류가 발생

 

 

public & protected 메서드


매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술해야합니다.

/**
 * (현재 값 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);
    }
    ...
}

자바 7에 추가된 java.util.Objects.requireNonNull 메서드는 null 검사를 수동으로 하지 않게끔 해줍니다.

// strategy가 null일 경우 NullPointerException이 발생하고, exception 메시지로 "전략"이 세팅됩니다.
this.strategy = Objects.requireNonNull(strategy, "전략");

자바 9에서는 Objects에 범위 검사 기능도 추가되었습니다.

  • checkFromIndexSize
  • checkFromToIndex
  • checkIndex

 

 

private 메서드


공개되지 않은 메서드라면 assert를 사용할 수도 있습니다.

단, assert는 JVM 옵션으로 -ea 또는 --enableassertions 플래그를 설정하면 검사를 수행하지 않습니다.

private void methodName(Integer value) {
    assert value != null;
    ...
}

 

 

유효성 검사의 예외가 되는 경우


  • 유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때
  • 계산 과정에서 암묵적으로 검사가 수행될 때

 

 

Reference


 

이펙티브 자바 3/E - 교보문고

프로그래밍인사이트 | 자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브러리의 최신 기능을 십분 활용

www.kyobobook.co.kr

반응형