우리는 입력 매개변수가 특정 도메인 범위를 만족하기를 원한다.
예로 음수면 안된다거나, null이면 안된다라는 조건을 만족해야 하는 것이다.
예)
/**
* 양수 정수의 제곱근을 계산하는 메소드입니다.
*
* @param n 양수 정수
* @return n의 제곱근
* @throws IllegalArgumentException 만약 n이 음수일 경우
*/
public double calculateSquareRoot(int n) throws IllegalArgumentException {
if (n < 0) {
throw new IllegalArgumentException("음수의 제곱근을 계산할 수 없습니다");
}
return Math.sqrt(n);
}
java.util.Object 클래스를 활용하면 매개변수 사용에 대한 유연성을 높일 수 있다.
ex1) requireNonNull 메서드
import java.util.Objects;
String str = Objects.requireNotNull( str2 , "null값이 들어왔습니다!" ) ;
str2가 null이면 뒤의 메세지 출력과 함께 NullPointerException 발생
ex2) checkFromIndexSize
import java.util.Objects;
public class IndexExample {
public static void main(String[] args) {
int[] arr = new int[] {1, 2, 3, 4, 5};
int fromIndex = 2;
int size = 4;
try {
Objects.checkFromIndexSize(fromIndex, size, arr.length);
} catch (IndexOutOfBoundsException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
체크하는 내용)
1. fromIndex가 0이상이고 arr.length 미만인가?
2. 시작인덱스와 크기 size의 합이 arr.length 미만인가? (위 코드는 여기서 예외를 발생시킴)
=> IndexOutOfBoundsException 이 발생한다. ( Index 6 out of bounds for length 5 )
public class Main {
public static void main(String[] args) {
// JVM 옵션으로 -ea (enable assertions)를 설정해야 assert 문이 활성화됩니다.
// 예: java -ea Main
try {
greet(null);
} catch (AssertionError e) {
System.out.println("AssertionError caught: " + e.getMessage());
}
try {
greet("이월");
} catch (AssertionError e) {
System.out.println(e.getMessage());
}
}
public static void greet(String name) {
// 매개변수 검증
assert name != null : "name은 null이면 안돼요";
assert !name.isEmpty() : "name은 empty하면 안돼요";
...
이때 assert는 무조건 "참"이라고 생각한다.
그리고 생성자 매개변수 유효성 검사는 꼭 하자
}
}
메서드나 생성자를 만들때 입력받는 매개변수에 대한 실패 케이스등을 잘 고려하고 TDD까지 하면 더 좋을듯 하다. 이렇게 매개변수에 대한 유효성 검증을 통해 더 안전한 메서드를 만들 수 있다.