[이펙티브자바 3판] ITEM49. 매개변수가 유효한지 검사하라
이번장의 핵심은...
메서드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다
그 제약들을 문서화하고 메서드 코드 시작 부분에서 명시적으로 검사하자
그 노력은 유효성 검사가 실제 오류를 처음 걸러낼 때 충분히 보상받을 것이다!
유효성 검사
1. 매개변수에 대한 제약은 반드시 문서화해야하며, 유효성 검사는 메서드 몸체가 시작되기 전에 검사해야합니다
2. 오류는 가능한 한 빨리 (발생한 곳에서) 잡아야 합니다
3. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있습니다
만약, 매개변수 검사를 제대로 하지 못하면?
메서드가 수행되는 중간에 모호한 예외를 던질 수 있습니다
잘못된 결과를 반환할 수도 있습니다
매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외를 함께 기술해야 합니다
아래 예제처럼 기술하면 됩니다
/**
* (현재 값 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);
... // 계산 수행
}
예외 상황
메서드 몸체 실행 전에 매개변수 유효성을 검사해야 한다는 규칙에도 예외는 있습니다
1. 유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때
2. 계산 과정에서 암묵적으로 검사가 수행될 때
예를 들어 Collections.sort(List)처럼 객체 리스트를 정렬하는 메서드를 생각해봅시다
리스트 안의 객체들을 비교하면서 비교될 수 없는 타입의 객체가 들어 있다면 ClassCastException을 던질 것입니다
따라서 비교하기전에 미리 모든 객체가 비교할 수 있는 대상인지 검사하는 것은 별다른 실익이 없습니다
(하지만 암묵적 유효성 검사에 너무 의존했다가는 실패 원자성을 해칠 수 있으니 주의가 필요합니다)
이 글은 “이펙티브 자바 3판” 책 내용을 정리한 글입니다.
만약 저작권 관련 문제가 있다면 “shk3029@kakao.com”로 메일을 보내주시면, 바로 삭제하도록 하겠습니다.