item49. 매개변수가 유효한지 검사하라

이월(0216tw)·2024년 6월 29일
0

effective java

목록 보기
6/7

매개변수는 메서드 실행전에 검사되어야 한다


우리는 입력 매개변수가 특정 도메인 범위를 만족하기를 원한다.
예로 음수면 안된다거나, null이면 안된다라는 조건을 만족해야 하는 것이다.

잘못 들어오는 매개변수는 @Throws로 예외를 문서화

예)

/**
 * 양수 정수의 제곱근을 계산하는 메소드입니다.
 *
 * @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 로 매개변수 유연성 높이기

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 ) 

assert(단언문) 으로 매개변수 유효성 검증하기

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까지 하면 더 좋을듯 하다. 이렇게 매개변수에 대한 유효성 검증을 통해 더 안전한 메서드를 만들 수 있다.

profile
Backend Developer (Financial)

0개의 댓글