Java 사용자 정의 예외 생성

JavaBeginner
지금 연습하기

소개

Java 에서 예외 (exception) 는 프로그램 실행 중에 발생하는 예외적인 이벤트를 나타내기 위해 발생합니다. Java 는 다양한 내장 예외를 제공하지만, 특정 상황에 맞게 사용자 정의 예외를 정의해야 할 때가 있습니다. 사용자 정의 예외에는 두 가지 유형이 있습니다: 검사 예외 (checked exception) 와 비검사 예외 (unchecked exception) 입니다. 검사 예외는 컴파일 시간에 처리해야 하는 예외인 반면, 비검사 예외는 런타임에만 감지됩니다. 이 랩에서는 두 가지 유형의 사용자 정의 예외를 모두 생성하고 사용하는 방법을 배웁니다.

MyArray 라는 Java 클래스 생성

먼저, 인덱스가 유효하지 않은 경우 예외를 발생시킬 수 있는 get() 메서드를 사용하여 배열을 구현하기 위해 MyArray라는 Java 클래스를 생성합니다.

public class MyArray {
    int[] array;

    public MyArray(int size) {
        array = new int[size];
        for (int i = 0; i < size; i++) {
            array[i] = i * 5;
        }
    }

    // Get method that may throw an exception
    public int get(int index) {
        if (index >= array.length) {
            throw new IndexOutOfBoundsException("Index " + index + " is invalid.");
        } else {
            return array[index];
        }
    }
}

사용자 정의 Checked 예외 생성

Exception 클래스를 확장하여 사용자 정의 검사 예외를 생성할 수 있습니다. 이 예제에서는 인덱스가 유효하지 않을 때 IndexNotValidException을 생성합니다. 이 예외는 MyArray 클래스의 get() 메서드에 의해 발생합니다.

public class IndexNotValidException extends Exception {
    public IndexNotValidException(String message) {
        super(message);
    }
}

이제 MyArray 클래스의 get() 메서드를 업데이트하여 이 사용자 정의 예외를 발생시킬 수 있습니다.

public int get(int index) throws IndexNotValidException {
    if (index >= array.length) {
        throw new IndexNotValidException("Index " + index + " is invalid.");
    } else {
        return array[index];
    }
}

사용자 정의 Checked 예외 처리

사용자 정의 검사 예외를 처리하려면 Demo 클래스에서 get() 메서드를 호출할 때 해당 예외를 잡거나 throws 키워드를 사용하여 선언해야 합니다.

public class Demo {
    public static void main(String[] args) {
        MyArray arr = new MyArray(5);
        try {
            System.out.println(arr.get(10)); // Throws IndexNotValidException
        } catch (IndexNotValidException e) {
            System.err.println(e.getMessage());
        }
    }
}

사용자 정의 Unchecked 예외 생성

Exception 클래스 대신 RuntimeException 클래스를 확장하여 사용자 정의 언체크 예외를 생성할 수 있습니다. 다음 예제에서는 인덱스가 유효하지 않을 때 IndexNotValidRuntimeException을 생성하며, 이는 MyArray 클래스의 get() 메서드에 의해 발생합니다.

public class IndexNotValidRuntimeException extends RuntimeException {
    public IndexNotValidRuntimeException(String message, Throwable cause) {
        super(message, cause);
    }
}

또한, 기본 예외 또는 예외의 원인을 정의하는 throwable 예외를 정의합니다. 이 경우, 기본 예외는 ArrayIndexOutOfBounds입니다. MyArray 클래스의 get() 메서드를 업데이트하여 사용자 정의 언체크 예외를 발생시킬 수 있습니다.

public int get(int index) {
    if (index >= array.length) {
        Throwable cause = new ArrayIndexOutOfBoundsException();
        throw new IndexNotValidRuntimeException("Index " + index + " is invalid.", cause);
    } else {
        return array[index];
    }
}

사용자 정의 Unchecked 예외 처리

사용자 정의 언체크 예외를 잡거나 선언할 필요가 없습니다. 다음 예제에서 Demo 클래스에서 get() 메서드가 유효하지 않은 인덱스로 호출되면 IndexNotValidRuntimeException이 발생합니다.

public class Demo {
    public static void main(String[] args) {
        MyArray arr = new MyArray(5);
        System.out.println(arr.get(10)); // Throws IndexNotValidRuntimeException
    }
}

요약

사용자 정의 Java 예외는 필요에 맞게 조정된 예외를 생성하여 애플리케이션에서 특정 오류 또는 예외를 효과적으로 처리하는 데 도움이 될 수 있습니다. 이 랩에서는 비즈니스 로직 또는 워크플로우에서 오류를 처리하기 위해 자체 사용자 정의 예외를 만드는 방법을 배웠습니다. 또한 각 예시와 함께 checked 예외와 unchecked 예외를 모두 만드는 방법에 대해서도 논의했습니다.