Java에서 Error와 Exception은 모두 실행 중 발생할 수 있는 문제지만, 그 개념과 처리 방식이 다릅니다.
이번 글에서는 Error와 Exception의 차이점과 예제 코드를 통해 이를 자세히 살펴보겠습니다.
1. Error와 Exception 개념
Java에서 발생하는 실행 오류는 크게 두 가지로 나뉩니다.
- Error : 시스템 레벨에서 발생하는 치명적인 오류 (프로그램 복구 불가능)
- Exception : 프로그램 실행 중 발생하는 예외 상황 (개발자가 처리 가능)
이 둘은 모두 Throwable 클래스를 상속받습니다.
🔹 Throwable 클래스 계층 구조
java.lang.Throwable
├── java.lang.Error (복구 불가능)
└── java.lang.Exception (복구 가능)
├── Checked Exception (컴파일러 체크)
└── Unchecked Exception (런타임 오류)
➡ Throwable을 상속하는 Error는 시스템적 문제이며, Exception은 프로그램의 로직에서 발생하는 문제입니다.
2. Error (에러)
"JVM에서 발생하는 치명적인 오류로, 프로그램이 정상적으로 복구할 수 없는 경우"
📌 특징
✅ 메모리 부족, 시스템 충돌 등의 심각한 문제를 나타냄
✅ 개발자가 직접 처리하지 않고 프로그램이 종료되는 것이 일반적
✅ try-catch로 처리하지 않는 것이 원칙
📌 주요 Error 종류
Error 종류 | 설명 |
OutOfMemoryError | JVM의 메모리가 부족할 때 발생 |
StackOverflowError | 무한 재귀 호출로 스택이 초과될 때 발생 |
VirtualMachineError | JVM이 정상적으로 실행될 수 없을 때 발생 |
📌 예제 코드
(1) StackOverflowError 예제
public class StackOverflowExample {
public static void recursiveMethod() {
recursiveMethod(); // 무한 재귀 호출
}
public static void main(String[] args) {
recursiveMethod(); // StackOverflowError 발생
}
}
➡ 무한 재귀 호출로 인해 스택이 초과되면서 StackOverflowError가 발생합니다.
(2) OutOfMemoryError 예제
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryExample {
public static void main(String[] args) {
List<int[]> list = new ArrayList<>();
while (true) {
list.add(new int[1_000_000]); // 계속 메모리를 할당
}
}
}
➡ 메모리를 과도하게 할당하여 OutOfMemoryError가 발생합니다.
3. Exception (예외)
"개발자가 예측하고 처리할 수 있는 프로그램 오류"
📌 특징
✅ 프로그램 실행 중 발생하는 예외적인 상황
✅ 개발자가 try-catch 또는 throws 키워드를 이용해 처리 가능
✅ Checked Exception과 Unchecked Exception으로 나뉨
🔹 Checked Exception (컴파일러 체크 예외)
"반드시 예외 처리를 해야 하는 예외"
✅ 컴파일 타임에 체크됨 (try-catch 또는 throws 필요)
✅ 네트워크, 파일 입출력(IO), 데이터베이스 오류 등이 포함됨
📌 주요 Checked Exception 종류
Exception 종류 | 설명 |
IOException | 파일 입출력 중 오류 발생 |
SQLException | 데이터베이스 오류 발생 |
ClassNotFoundException | 클래스를 찾을 수 없을 때 발생 |
📌 Checked Exception 예제
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
File file = new File("nonexistent.txt");
FileReader reader = new FileReader(file); // IOException 발생 가능
} catch (IOException e) {
System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
}
}
}
➡ FileReader는 파일이 존재하지 않으면 IOException을 발생시키므로 try-catch로 처리해야 합니다.
🔹 Unchecked Exception (런타임 예외)
"컴파일러가 강제하지 않는 예외 (개발자의 실수로 발생하는 경우)"
✅ RuntimeException을 상속하는 예외
✅ 개발자의 코드 실수로 인해 발생
✅ try-catch 없이도 실행 가능하지만, 예외 처리를 권장
📌 주요 Unchecked Exception 종류
Exception 종류 | 설명 |
NullPointerException | null 객체를 참조할 때 발생 |
ArrayIndexOutOfBoundsException | 배열 인덱스를 초과할 때 발생 |
ArithmeticException | 0으로 나누는 연산 발생 |
📌 Unchecked Exception 예제
public class UncheckedExceptionExample {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // NullPointerException 발생
}
}
➡ null 값을 참조하려고 하면 NullPointerException이 발생합니다.
4. Error vs Exception 비교 정리
비교 항목 | Error | Exception |
발생 원인 | 시스템 문제 (JVM, 메모리, OS) | 프로그램 실행 중 예외 상황 |
복구 가능 여부 | 복구 불가능 | 복구 가능 |
개발자 처리 | 처리하지 않음 (catch 불가) | try-catch 또는 throws 처리 가능 |
주요 예제 | OutOfMemoryError, StackOverflowError | NullPointerException, IOException |
➡ Error는 시스템 레벨의 문제이므로 복구할 필요가 없으며, Exception은 개발자가 직접 예외 처리를 통해 복구 가능합니다.
5. 예외 처리 Best Practice
(1) 적절한 예외 처리를 하라
try {
int result = 10 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
(2) 여러 예외를 한 번에 처리
try {
int[] arr = new int[5];
arr[10] = 50; // ArrayIndexOutOfBoundsException 발생
} catch (NullPointerException | ArrayIndexOutOfBoundsException e) {
System.out.println("예외 발생: " + e.getMessage());
}
(3) 사용자 정의 예외 만들기
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
public class CustomExceptionExample {
public static void main(String[] args) {
try {
throw new CustomException("사용자 정의 예외 발생");
} catch (CustomException e) {
System.out.println(e.getMessage());
}
}
}
➡ 비즈니스 로직에서 특정 예외가 필요할 경우, 사용자 정의 예외를 활용할 수 있습니다.
6. 결론
Java의 Error와 Exception은 비슷해 보이지만, Error는 시스템적 문제(복구 불가능) 이고 Exception은 프로그램 실행 중 발생하는 문제(복구 가능) 입니다.
✅ 핵심 요약
- Error : 시스템 문제 (OutOfMemoryError, StackOverflowError)
- Checked Exception : 컴파일러가 체크 (IOException, SQLException)
- Unchecked Exception : 개발자의 실수로 발생 (NullPointerException)
Java에서 안정적인 프로그램을 개발하려면 적절한 예외 처리 전략을 세우는 것이 중요합니다! 🚀
'백엔드' 카테고리의 다른 글
메모리 누수: Memory Leak (1) | 2025.02.23 |
---|---|
객체지향 설계 원칙 (SOLID) 개념과 적용 방법 (0) | 2025.02.17 |
Java 메모리 영역과 동작 원리 (1) | 2025.02.14 |
[자바/JAVA] 객체는 뭐로 만들어? Class, Interface, Record? (1) | 2025.02.12 |
[자바/JAVA] DAO, DTO, VO, Entity의 차이점과 역할 (1) | 2025.02.11 |