Java 사용자 정의 예외 클래스 만들기, 개념부터 실전 코드까지 완벽 정리
💡 자바 예외 처리, 직접 만드는 사용자 정의 예외로 한 단계 업그레이드!
개발을 하다 보면 예상하지 못한 오류에 직면할 때가 많죠.
자바(Java)에서는 이런 오류를 ‘예외(Exception)’라고 부르며, 프로그램의 흐름을 안전하게 제어하는 중요한 역할을 합니다.
이런 예외 처리 중에서도 특히 사용자 정의 예외(Custom Exception)는 개발자가 직접 예외 상황을 정의하고 명확하게 표현할 수 있어 많은 프로젝트에서 활용되고 있습니다.
이번 글에서는 사용자 정의 예외의 개념부터 실제로 클래스를 작성하고 활용하는 방법까지 초보자도 쉽게 이해할 수 있도록 하나씩 짚어보겠습니다.
예외 처리를 단순히 try-catch로만 끝내는 건 이제 그만!
복잡한 프로그램 로직에서 오류를 명확히 구분하고 처리하기 위해서는 나만의 예외 클래스를 정의하는 것이 큰 도움이 됩니다.
이 글을 통해 자바 예외 처리의 개념을 정확히 이해하고, 실무에서도 유용하게 사용할 수 있는 사용자 정의 예외 작성법을 확실하게 익혀보세요.
📋 목차
🚨 예외(Exception)의 개념 이해하기
자바(Java)에서 예외(Exception)는 프로그램 실행 중 발생할 수 있는 비정상적인 상황을 의미합니다.
예외는 잘못된 사용자 입력, 네트워크 오류, 파일 접근 실패 등 다양한 원인으로 발생할 수 있으며, 이를 무시하면 프로그램이 비정상 종료될 수 있습니다.
이러한 예외 상황은 미리 예측하고 처리해야 안정적인 프로그램을 만들 수 있습니다.
예외 처리의 목적은 프로그램이 충돌하지 않도록 적절히 대응하고, 사용자에게 오류 메시지를 제공하거나 로그를 남기는 등 신뢰할 수 있는 동작을 유지하는 데 있습니다.
📌 예외와 오류(Error)는 무엇이 다를까?
많은 분들이 ‘예외(Exception)’와 ‘오류(Error)’를 혼용하지만, 자바에서는 명확히 구분됩니다.
‘오류(Error)’는 시스템 레벨에서 발생하는 치명적인 문제로, 예외 처리로는 복구할 수 없는 상황을 의미합니다.
대표적으로 OutOfMemoryError, StackOverflowError 등이 있죠.
반면, ‘예외(Exception)’는 개발자가 직접 처리 가능한 문제로, 네트워크 끊김, 잘못된 입력 등 비교적 통제 가능한 상황입니다.
따라서 예외는 try-catch문이나 throws 키워드를 통해 프로그램 흐름을 제어하고 안정적인 작동을 보장할 수 있습니다.
💎 핵심 포인트:
예외(Exception)는 복구 가능한 문제, 오류(Error)는 시스템적인 치명적 문제로 복구가 어렵다는 점에서 다릅니다.
💬 Java의 예외 처리는 프로그램이 예기치 않게 종료되지 않도록 도와주는 방어적 프로그래밍 기법입니다.
🧩 예외 처리의 필요성과 try-catch 구조
개발자가 작성한 프로그램이 언제나 예상대로만 실행된다면 얼마나 좋을까요?
하지만 현실은 그렇지 않습니다.
파일이 존재하지 않거나, 네트워크 연결이 끊기거나, 숫자를 0으로 나누는 등의 상황은 생각보다 자주 발생합니다.
이런 상황이 예외(Exception)이며, 이를 처리하지 않으면 프로그램은 실행 중단(크래시)이라는 최악의 결과로 이어질 수 있습니다.
따라서 자바에서는 이러한 문제 상황에 대비해 예외를 미리 처리할 수 있는 try-catch 구문을 제공합니다.
이 구조를 통해 예외 발생 시 사용자에게 친절한 메시지를 보여주거나, 대체 동작을 수행하게 만들 수 있습니다.
📌 try-catch 문법 구조
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
// 예외 발생 시 처리할 코드
} finally {
// 예외 발생 여부와 상관없이 항상 실행되는 코드
}
예외 처리 구문은 기본적으로 try, catch, finally로 구성됩니다.
try 블록 안에는 예외가 발생할 수 있는 코드를 작성하고, catch 블록은 해당 예외를 처리합니다.
finally는 예외 발생 여부에 관계없이 반드시 실행되며, 자원 해제 등에 주로 사용됩니다.
- ✅try 블록에는 예외 발생 가능성이 있는 코드를 작성
- ✅catch 블록은 예외 처리 로직을 정의
- ✅finally 블록은 선택적으로 사용되며, 리소스 정리에 활용
💎 핵심 포인트:
try-catch 구문은 예외 발생에 대비한 필수 방어 도구이며, 프로그램의 안정성과 신뢰도를 높이는 핵심 요소입니다.
🛠️ 사용자 정의 예외란 무엇인가요?
자바(Java)에서는 NullPointerException, IOException 등 다양한 예외 클래스가 기본적으로 제공됩니다.
하지만 실제 개발을 하다 보면 상황에 꼭 맞는 예외를 직접 정의하고 싶은 순간이 생깁니다.
이럴 때 사용하는 것이 바로 사용자 정의 예외(Custom Exception)입니다.
사용자 정의 예외는 Exception 또는 RuntimeException 클래스를 상속받아 새로운 예외 클래스를 직접 만들어 쓰는 방식입니다.
이를 통해 프로그램 내에서 발생할 수 있는 특정 상황을 더 명확하게 구분하고, 에러의 원인을 직관적으로 파악할 수 있도록 도와줍니다.
📌 왜 사용자 정의 예외를 사용할까?
기본 예외 클래스만으로는 프로그램의 모든 상황을 커버하기 어렵습니다.
예를 들어, 사용자가 존재하지 않을 때 NullPointerException을 던지는 대신 UserNotFoundException처럼 의미 있는 예외를 정의하면, 에러 로그만 보더라도 문제의 원인을 쉽게 이해할 수 있습니다.
💎 핵심 포인트:
사용자 정의 예외는 코드의 가독성과 유지보수성을 향상시키고, 문제 상황을 더 명확하게 표현할 수 있도록 도와줍니다.
💡 TIP: 사용자 정의 예외를 만들 때는 예외 이름에 상황을 잘 설명하는 단어를 사용하는 것이 좋습니다.
예: InvalidPasswordException, DataFormatException, AccessDeniedException 등
📦 사용자 정의 예외 클래스 작성 방법
사용자 정의 예외를 만드는 방법은 매우 간단합니다.
기본적으로 Exception 또는 RuntimeException 클래스를 상속받아 새로운 클래스를 생성하고, 생성자와 메시지를 정의해주면 됩니다.
다음은 잘못된 사용자 입력이 발생했을 때 사용할 수 있는 InvalidInputException이라는 사용자 정의 예외 클래스 예제입니다.
📌 사용자 정의 예외 클래스 예제
public class InvalidInputException extends Exception {
public InvalidInputException() {
super("입력값이 유효하지 않습니다.");
}
public InvalidInputException(String message) {
super(message);
}
}
위 예제에서 super()는 부모 클래스인 Exception의 생성자를 호출하는 부분입니다.
이렇게 작성된 예외는 일반적인 try-catch 구문에서 다른 예외와 동일하게 처리할 수 있습니다.
- 🛠️Exception 또는 RuntimeException을 상속받는다
- 🧱기본 생성자와 메시지를 받는 생성자를 정의한다
- 📘오류 상황에 맞는 직관적인 예외 이름을 사용한다
💎 핵심 포인트:
사용자 정의 예외는 반드시 생성자 내부에서 부모 클래스의 super()를 호출하여 예외 메시지를 정의해야 합니다.
📌 사용자 정의 예외 실전 예제
이번에는 직접 만든 사용자 정의 예외 InvalidInputException을 실제 프로그램 흐름에 적용해보겠습니다.
사용자에게 숫자를 입력받고, 음수가 입력되었을 경우 예외를 발생시키는 시나리오입니다.
📌 실습 예제 코드
import java.util.Scanner;
public class InputValidator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("숫자를 입력하세요: ");
int number = scanner.nextInt();
try {
validateNumber(number);
System.out.println("올바른 숫자입니다.");
} catch (InvalidInputException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void validateNumber(int num) throws InvalidInputException {
if (num < 0) {
throw new InvalidInputException("음수는 허용되지 않습니다: " + num);
}
}
}
위 코드에서는 음수 입력 시 InvalidInputException이 발생하며, catch 블록에서 메시지를 출력합니다.
이를 통해 예외 발생 상황을 제어하고, 사용자에게 명확한 안내 메시지를 제공할 수 있습니다.
💎 핵심 포인트:
사용자 정의 예외는 throw 키워드로 발생시키고, throws 키워드로 해당 메서드에서 발생 가능성을 명시합니다.
⚠️ 주의: 사용자 정의 예외는 RuntimeException이 아닌 경우 반드시 throws를 사용해야 하며, try-catch로 감싸지 않으면 컴파일 오류가 발생합니다.
❓ 자주 묻는 질문 (FAQ)
사용자 정의 예외는 꼭 만들어야 하나요?
Exception과 RuntimeException 중 어떤 걸 상속해야 하나요?
예외 클래스 이름은 어떻게 짓는 게 좋나요?
예외 클래스에 생성자는 꼭 있어야 하나요?
예외 메시지를 동적으로 만들 수 있나요?
throws와 throw의 차이는 무엇인가요?
여러 개의 사용자 정의 예외를 만들어도 되나요?
실무에서도 사용자 정의 예외를 많이 사용하나요?
🧰 사용자 정의 예외, 실무에서 제대로 활용하는 법
Java에서 예외(Exception)는 프로그램의 안정성과 신뢰성을 높이기 위해 반드시 이해하고 다뤄야 하는 핵심 개념입니다.
특히 사용자 정의 예외(Custom Exception)는 개발자가 직접 예외 상황을 설계하고, 그에 맞는 클래스를 구현함으로써 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.
이 글에서는 예외의 개념부터 시작해 try-catch 구조, 사용자 정의 예외의 장점과 작성법, 실전 예제까지 단계별로 상세히 설명했습니다.
실제 프로젝트에서도 자주 마주치는 상황을 바탕으로, 직접 사용할 수 있는 코드와 팁을 함께 제시해 드렸습니다.
이제 여러분도 자신만의 예외 클래스를 만들어 더 견고한 자바 프로그램을 작성해보세요.
🏷️ 관련 태그 : 자바예외처리, 사용자정의예외, JavaException, CustomException, 예외클래스, 자바기초, trycatch, 예외발생, 예외상속, 자바실전코딩