Java 프로그램을 작성하다 보면 다양한 오류에 직면하게 됩니다. 이를 "예외(Exception)"라고 하며, 예외를 제대로 처리하지 않으면 프로그램이 갑자기 종료될 수 있습니다. 이번 포스팅에서는 예외 처리의 기본 개념부터 사용자 정의 예외를 활용하는 방법까지 알아보겠습니다.
1. 예외 처리란?
예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 처리하여, 프로그램이 갑작스럽게 종료되지 않고 안정적으로 동작하도록 돕는 과정입니다.
예외의 두 가지 유형:
- Checked Exception: 컴파일 시 반드시 처리해야 하는 예외
예: IOException, SQLException - Unchecked Exception: 런타임에서 발생하며, 처리하지 않아도 컴파일 오류가 발생하지 않음
예: NullPointerException, ArithmeticException
2. 예외 처리 기본 구조
Java에서 예외를 처리하는 기본 구조는 try-catch-finally 문을 사용합니다.
try {
// 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
} finally {
// 항상 실행되는 코드 (선택적)
}
예제: NullPointerException 처리
public class NullPointExceptionEx {
public static void main(String[] args) {
String str = null; // null 값 할당
try {
System.out.println(str.toString()); // 예외 발생
} catch (NullPointerException e) {
System.err.println("널 입니다."); // 예외 메시지 출력
} finally {
System.out.println("예외처리 종료"); // 항상 실행
}
}
}
실행 결과:
널 입니다.
예외처리 종료
3. 사용자 정의 예외 만들기
Java는 기본 제공 예외 외에도 개발자가 직접 예외 클래스를 정의하여 사용할 수 있습니다. 이를 통해 오류 상황에 대한 구체적인 정보를 제공할 수 있습니다.
사용자 정의 예외 클래스 생성
class CustomArithException extends ArithmeticException {
private int num1;
private int num2;
public CustomArithException(String message, int num1, int num2) {
super(message); // 부모 클래스 생성자 호출
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
}
4. Checked 및 Unchecked Exception 처리
Checked Exception 처리: IOException
public void executeExcept() throws IOException {
System.out.println("강제 예외 발생!");
throw new IOException("강제 예외!"); // Checked Exception 발생
}
executeExcept 메서드는 Checked Exception인 IOException을 던집니다.
따라서 반드시 try-catch로 처리하거나, 메서드 선언부에 throws로 명시해야 합니다.
Unchecked Exception 처리: RuntimeException
public void executeRuntimeException() {
throw new RuntimeException("런타임 익셉션");
}
Unchecked Exception인 RuntimeException은 컴파일 시 예외 처리를 강제하지 않습니다.
하지만 처리하지 않으면 런타임에서 프로그램이 종료될 수 있으므로, 안정성을 위해 예외 처리가 권장됩니다.
5. 사용자 정의 예외 활용
예제: 0으로 나누기 예외 처리
public double divide(int num1, int num2) {
try {
return num1 / num2;
} catch (ArithmeticException e) {
throw new CustomArithException("사용자 정의 Exception", num1, num2);
}
}
ArithmeticException을 사용자 정의 예외로 변환하여, 보다 구체적인 정보를 제공합니다.
6. 모든 예외 처리 통합
통합 예제 코드
public static void main(String[] args) {
ThrowsExcept except = new ThrowsExcept();
try {
except.divide(100, 0); // 사용자 정의 예외 발생
except.executeRuntimeException(); // 런타임 예외 발생
except.executeExcept(); // CheckedException 발생
} catch (IOException e) {
System.err.println("IOException: " + e.getMessage());
} catch (CustomArithException e) {
System.err.println("에러 메시지: " + e.getMessage());
System.err.println("나누어지는 수: " + e.getNum1());
System.err.println("나누는 수: " + e.getNum2());
} catch (RuntimeException e) {
System.err.println("RuntimeException: " + e.getMessage());
}
}
7. 실행 결과
사용자 정의 예외 발생:
에러 메시지: 사용자 정의 Exception
나누어지는 수: 100
나누는 수: 0
Unchecked Exception 발생:
RuntimeException: 런타임 익셉션
Checked Exception 발생:
IOException: 강제 예외!
8. 결론
이번 포스팅에서는 Java의 예외 처리 구조와 사용자 정의 예외 활용법을 살펴봤습니다. 예외 처리는 프로그램의 안정성을 보장하고, 오류 발생 시 정확한 원인을 파악하는 데 필수적입니다.
핵심 정리:
- 예외는 try-catch-finally로 처리합니다.
- Checked Exception은 반드시 처리해야 하며, Unchecked Exception은 선택적입니다.
- 사용자 정의 예외를 사용하면 보다 구체적이고 의미 있는 오류 정보를 제공할 수 있습니다.

'개발 > JAVA' 카테고리의 다른 글
자바 I/O 스트림 이해하기: BufferedStream, ByteArrayStream, DataStream 활용하기 ✨ (6) | 2025.01.17 |
---|---|
JAVA의 함수형 프로그래밍과 Stream 활용하기 (7) | 2025.01.16 |
Java 예외 처리: 안전한 프로그램을 위한 기본 개념 (9) | 2025.01.14 |
Java 제네릭(Generic): 타입을 유연하게 관리하는 방법 (24) | 2025.01.13 |
Java 컬렉션: 벡터(Vector) 배우기 (26) | 2025.01.10 |