메소드 나 생성자 를 구현할 때는 받을 수 있는 인자에 제한이 있는지 따져봐야 한다. 제한이 있다면 그 사실을 문서에 남기고, 메소드 앞부분에서 검사하도록 해야 한다.
index 값은 음수가 될 수 없다
객체 참조는 null 이 될 수 없다
라는 등의 규칙이 필요한 것이 인자로 올 수 있다.
알고리즘 문제풀 때는 예외가 안들어 오기 때문에 이런 코드를 짜지 않았지만,
실제로는 인자가 유효한 값이 들어왔는지 체크를 해줘야 한다.
( 예외 : 유효성 검사 오버헤드가 크다 / 비현실적이다 / 계산 과정에서 자동으로 이루어진다)
그 시기는 제일 앞단이다.
이 처리를 안해주면 생기는 문제점
-
예외를 내면서 프로그램이 죽는다
-
잘못된 결과가 나온다.
-
실행은 되는데 사이드이펙트 발생
public 메소드 일 경우 유효성 위반인 경우 발생하는 예외는 @throws 를 사용해서 문서화하라 (규칙 62)
인자 유효성에 관계된 조건. 유효성 위반 시에 발생하는 예외 까지 문서로 남겼다면, 유효성을 검사하는 코드를 만드는 것은 간단하다.
public 메소드 가 아닐 경우, 개발자가 메서드 호출을 통제할 수 있으므로 항상 유효한 인자가 전달될 것으로 예상할 수 있다. 따라서, public이 아닌 메소드 는 일반적으로 인자 유효성을 검사할 때 assertion 을 이용한다.
//재귀적으로 정렬하는 private 도움 함수
private static void sort(long a[], int offset, int length) {
assert a != null;
assert offset >= 0 && offset <= a.length;
assert length >= 0 && length <= a.length - offset;
... //계산 수행
}assertion 은 그냥 실행되는 것이 아니라,
활성화 시키려면 java 인터프리터에 -ea(enableassertions) 옵션을 주어야 한다
assertion 은 조건 불만족시 AssertionError를 낸다.
생성자는 나중을 위해 보관될 인자의 유효성을 반드시 검사해야 한다
클래스 불변식을 위반하는 객체가 만들어지는 것을 막으려면, 생성자에 전달되는 인자의 유효성을 반드시 검사해야 한다.