백엔드

Java의 Error와 Exception 차이점

Newbie Developer 2025. 2. 15. 07:35

Java에서 ErrorException은 모두 실행 중 발생할 수 있는 문제지만, 그 개념과 처리 방식이 다릅니다.
이번 글에서는 Error와 Exception의 차이점예제 코드를 통해 이를 자세히 살펴보겠습니다.

 


1. Error와 Exception 개념

Java에서 발생하는 실행 오류는 크게 두 가지로 나뉩니다.

  1. Error : 시스템 레벨에서 발생하는 치명적인 오류 (프로그램 복구 불가능)
  2. 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의 ErrorException은 비슷해 보이지만, Error는 시스템적 문제(복구 불가능) 이고 Exception은 프로그램 실행 중 발생하는 문제(복구 가능) 입니다.

핵심 요약

  • Error : 시스템 문제 (OutOfMemoryError, StackOverflowError)
  • Checked Exception : 컴파일러가 체크 (IOException, SQLException)
  • Unchecked Exception : 개발자의 실수로 발생 (NullPointerException)

Java에서 안정적인 프로그램을 개발하려면 적절한 예외 처리 전략을 세우는 것이 중요합니다! 🚀