프로젝트를 진행하면서 커스텀 예외(Custom Exception)를 적용하게 되었습니다. 그런데 보통 커스텀 예외를 정의할 때 Exception 대신 RuntimeException을 상속받는다는 얘기를 들었습니다.
이 글에서는 Exception과 RuntimeException의 차이를 살펴보고, 커스텀 예외를 정의할 때 왜 Exception 대신 RuntimeException을 상속받는 것이 일반적인지에 대해 알아보겠습니다.
Checked Exception & Unchecked Exception
Exception과 RuntimeException을 알아보기에 앞서 먼저 알아야할 개념이 있습니다.
바로 "Checked Exception & Unchecked Exception"인데요, 위 표를 보면 알 수 있듯이
Checked Exception
체크드 예외는 컴파일 타임에 발생할 수 있는 예외로, 프로그램에서 이 예외가 발생할 가능성이 있는 경우 반드시 처리해야 합니다.
즉, 메서드에서 발생할 수 있는 체크드예외를 처리하지 않으면 컴파일 오류가 발생합니다.
Checked Exception은 다음과 같은 특징이 있습니다.
처리 필수
- 메서드에 throws 키워드를 사용하거나, try-catch 블록으로 예외를 처리해야 합니다.
- 예시
- IOException: 파일 입출력 시 발생할 수 있는 예외
- SQLException: 데이터베이스 접근 시 발생할 수 있는 예외
Unchecked Exception
언체크 예외는 런타임 시에 발생할 수 있는 예외로, 컴파일 타임에는 검사가 이루어지지 않습니다. 개발자가 이 예외를 처리할 필요가 없으며, 필요에 따라 선택적으로 처리할 수 있습니다.
Unchecked Exception은 다음과 같은 특징이 있습니다.
처리 선택적
- 호출자가 이 예외를 처리하지 않아도
컴파일 오류가 발생하지 않습니다. - 예시
- NullPointerException: null 객체에 접근할 때 발생하는 예외
- ArrayIndexOutOfBoundsException: 배열의 잘못된 인덱스에 접근할 때 발생하는 예외
Exception이란❓
Exception 클래스는 Java의 모든 체크드 예외의 부모 클래스입니다. 체크드 예외는 컴파일 타임에 발생할 수 있는 예외로, 개발자는 이 예외를 반드시 처리해야 합니다.
- Checked Exception이기 때문에 컴파일러가 예외 처리를 강제함
- 메서드 선언부에 throws 키워드로 예외를 명시하거나, try-catch 블록으로 처리해야 함
- 주로 외부 요인으로 인한 예외 상황에 사용
- 예: IOException, SQLException
Exception 사용 예시
try {
FileInputStream file = new FileInputStream("test.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
RuntimeException이란❓
RuntimeException 클래스는 Exception의 하위 클래스이며, 주로 런타임 시에 발생할 수 있는 예외를 나타냅니다. 이 예외는 체크드 예외와는 달리, 컴파일 타임에 반드시 처리할 필요가 없습니다.
- Unchecked Exception이기 때문에 컴파일러가 예외 처리를
강제하지 않음 - 주로 프로그래밍 오류로 인한 예외 상황에 사용
- 예: NullPointerException, ArrayIndexOutOfBoundsException
RuntimeException 사용 예시
public void divideNumbers(int a, int b) {
System.out.println(a / b); // ArithmeticException 가능성
}
Exception과 RuntimeException 차이점
특징 | Exception | RuntimeException |
종류 | Checked Exception | Unchecked Exception |
처리 요구 여부 | 필수 처리(try-catch or Throws) | 선택적 처리(필요 시 처리) |
발생 시점 | 컴파일 타임 | 런타임 |
예시 | IOException, SQLException | NullPointerException, ArrayIndexOutOfBoundsException |
RuntimeException를 상속 받는 이유 ✅
그렇다면 왜 Custom Exception에서는 왜 Excpetion이 아니라 RuntimeException을 상속받을까요❓
public class CustomRuntimeException extends RuntimeException {
public CustomRuntimeException(String message) {
super(message);
}
public CustomRuntimeException(String message, Throwable cause) {
super(message, cause);
}
}
// 사용 예시
public void someMethod() {
throw new CustomRuntimeException("Something went wrong!");
}
1. Checked Exception을 피할 수 있음
- 커스텀 예외를 정의할 때 RuntimeException을 상속받으면 언체크 예외가 됩니다. 이는 호출자가 예외를 처리하도록
강제받지 않기 때문에 코드가 더 간결해질 수 있습니다.
2. 사용자 편의성
- 개발자가 특정한 상황에서 발생하는 예외를 명확하게 정의할 수 있어, 코드의 가독성을 높이고 예외 처리 로직을 간단하게 유지할 수 있습니다. 불필요한 예외 처리를 피할 수 있는 장점이 있습니다.
3. 비즈니스 로직과의 일관성
- 대부분의 비즈니스 로직에서 발생하는 예외는 런타임 예외로 간주되므로, 커스텀 예외도 이를 따르는 것이 자연스럽습니다.
'Language > Java' 카테고리의 다른 글
[Java] 비트 연산(bit)과 비트마스크(bit mask) 알아보기 (0) | 2024.11.20 |
---|---|
[JAVA] Lombok이란 무엇일까❓(lombok 설치 방법, lombok사용법) (0) | 2024.07.20 |
[JAVA] 람다 표현식을 활용한 정렬 기법: 오름차순과 내림차순 (1차원, 2차원) (0) | 2024.07.10 |
[JAVA] 좌표와 2차원 배열 매핑의 이해 (좌표 ➡️ 배열) (0) | 2024.07.01 |
[Java] copyOf(), arraycopy(), copyOfRange() 메서드 알아보기 ✔ (배열 복사 메서드) (0) | 2024.06.16 |