본문 바로가기
Java/Effective Java 3E

[이펙티브자바 3판] ITEM49. 매개변수가 유효한지 검사하라

by 잭피 2020. 12. 19.

이번장의 핵심은...

메서드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다

그 제약들을 문서화하고 메서드 코드 시작 부분에서 명시적으로 검사하자

그 노력은 유효성 검사가 실제 오류를 처음 걸러낼 때 충분히 보상받을 것이다!


유효성 검사

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”로 메일을 보내주시면, 바로 삭제하도록 하겠습니다.

 

 

 

댓글