JAVA/BASIC

자바(JAVA) 예외(Exception) Checked Exception과 UnChecked Exception

유혁스쿨 2023. 4. 10. 23:08
728x90
반응형

Checked Exception (일반 예외)

RuntimeEception 자신을 포함하여 상속받지 않은 모든 Exception들이 해당됩니다. (최상위 Exception 또한 Checked Exception에 해당)

다시말해 Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스들입니다.

이것이 자바다 책에서는 일반 예외라고 설명합니다.

자바 소스를 컴파일 하는 과정에서 예외처리 코드가 필요한지 검사하기 때문에 컴파일러 체크 예외라고도 합니다.

만약 예외 처리 코드가 없다면 컴파일 오류가 발생합니다.

예외처리 필요 유무는 IDE가 판단해주고 무조건 try-catch나 throws로 예외를 처리하라고 강제합니다.

또한 이 예외가 발생할 경우 기본적으로 transaction처리가 되지 않습니다.

따라서 transaction처리를 하기 위해서는 별도 설정을 해야합니다.

이 말은 예외가 발생해도 rollback처리가 되지 않는다는 말을 의미합니다.

제일 자주 볼 수 있는 Checked Exception은 ClassNotFoundException과 FileNotFoundException이 있습니다.

이와같이 외부의 영향을 받을 수 있는 에러가 바로 컴파일 단계에서 미리 IDE가 예외 처리의 필요성을 체크할 수 있어서 CheckedException 이라고 합니다.

 

 

UnChecked Exception(실행예외 - RuntimeException)

Checked Exception과 반대로 내부 요인에 의해 발생할 수 있는 Exception을 의미합니다.

RuntimeException 자신을 포함해 상속 받은 모든 하위 Exception을 의미한다. 따라서 Runtime Exception이라고 할 수 있습니다.

(RuntimeException 또한 Exception을 상속받은 객체입니다.)

컴파일 하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말합니다.

런타임에서 에러를 확인할 수 있기 때문에 컴파일 단계에서 미리 예외를 체크할 수 없습니다. 이름이 UncheckedException인 이유가 바로 이것입니다.

JVM은 RuntimeException을 상속했는지 여부를 보고 실행 예외를 판단하게 됩니다.

기본적으로 transaction을 처리해 주기 때문에 예외가 발생하면 rollback처리됩니다.

 

실행 예외는 컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야만 합니다.

만약 개발자가 실행예외에 대해 예외 처리 코드를 넣지 않았을 경우, 해당 예외가 발생하면 프로그램은 곧바로 종료됩니다.

(UnChecked Exception의 경우 예외처리를 하지 않으면 콘솔창에 오류내용을 출력하고 프로그램이 종료됩니다.)

 

제일 자주 볼 수 있는 실행 예외로는 아래 나열한 4가지가 있습니다.

  1. NullPointer Exception
  2. ArrayIndexOutOfBounds Exception
  3. NumberFormat Exception
  4. ClassCast Exception

 

NullPointer Exception

자바 프로그램에서 가장 빈번하게 발생하는 실행 예외 입니다.

객체 참조가 없는 상태, 즉 null값을 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다.

객체가 없는 상태에서 객체를 사용하려 했으므로 예외가 발생합니다.

public class NullPointerException {
    public static void main(String[] args) {
        String data = null; // data 객체의 참조가 null이다.
        System.out.println(data.toString()); // data객체의 참조가 null이므로 예외가 발생한다.
    }
}

 

ArrayIndexOutOfBound Exception

배열에서 인덱스 범위를 초과하여 사용할 경우 발생하는 예외입니다.

예를들어 길이가 3인 int[] arr = new int[3]인 배열을 선언했다고 가정했을 때 배열 항목을 지정하기 위해 arr[0] ~ arr[2]를 사용할 수 있습니다.

하지만 4번째 요소인 arr[3]을 사용하면 인덱스 범위를 초과했기 때문에 예외가 발생합니다.

public class ArrayIndexOutOfBoundException {
    public static void main(String[] args) {
    // 이클립스를 통해 main메소드의 args 매개변수에 매개값을 주지 않고 실행한다.
        String args1 = args[0];
        String args2 = args[1];
        System.out.println("args[0] : " + args1)
        System.out.println("args[1] : " + args2)
    }
}

 

NumberFormat Exception

문자열로 되어있는 데이터를 숫자로 변경하는 경우 숫자로 변환될 수 없는 문자가 포함되어 있다면 예외를 발생합니다.

예를들어 Wrapper클래스(Integer or Double) 의 parseInt() 혹은 parseDouble() 메소드를 이용하여 문자열을 숫자로 변환한다고 할 때 매개값으로 숫자로 변환될 수 없는 문자가 포함되어 있다면 해당 예외를 발생시킵니다.

public class NumberFormatException {
    public static void main(String[] args) {
        String data1 = 100;
        String data2 = 100A;
        
        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2); // 변환 불가 NumberFormatException 발생
    }
}

ClassCast Exception

상위 클래스와 하위 클래스의 타입 변환시 발생하는 예외입니다.

이는 구현 클래스와 인터페이스 간에도 발생하기도 합니다.

상위-하위 혹은 구현-인터페이스 와 같은 관계가 아닐 경우 클래스는 다른 클래스로 타입 변환할 수 없습니다.

억지로 타입 변환을 시도할 경우 실행 도중 해당 예외가 발생합니다.

위와 같은 관계에서 다음과 같이 타입 정상적인 변환을 할 수 있습니다.

Animal animal = new Dog();
Dog dog = (Dog)animal;

RemoteControl rc = new Television();
Television tv = (Television)rc;

그러나 아래와 같이 타입 변환을 하면 ClassCastException이 발생합니다.

Animal animal = new Dog();
Cat cat = (Cat)animal;

RemoteControl rc = new Television();
Audio audio = (Audio)rc;

Cat과 Dog는 똑같이 Animal을 상속받았으나, 두 클래스는 직접적인 관계가 없기 때문에 타입변환이 될 수 없습니다.

Television과 Audio 클래스에도 동일하게 해당됩니다.

 

 

이상으로 일반 예외에 해당하는 CheckedException과 실행 예외에 해당하는 UnCheckedException에 대해 알아 보았습니다.

728x90
반응형