자바에서 예외(Exception)는 프로그램 실행 중에 발생하는 비정상적인 상황을 나타냅니다. 즉, 정상적인 프로그램 흐름에서 벗어나는 예외적인 상황이 발생했을 때, 이를 감지하고 처리하는 것이 바로 예외 처리입니다. 예외는 자바의 중요한 기능 중 하나로, 프로그램이 중단되지 않고 정상적으로 작동할 수 있도록 도와줍니다.
예외는 프로그램이 실행되는 동안 발생하는 예기치 못한 이벤트 또는 오류 상황입니다. 이러한 예외는 다양한 이유로 발생할 수 있으며, 자바에서는 이를 별도의 객체로 다룹니다. 예외가 발생하면 자바는 해당 예외에 대한 객체를 생성하고, 이를 프로그램의 다른 부분에서 처리할 수 있도록 던집니다(throw). 만약 이 예외를 처리하지 않으면 프로그램은 비정상적으로 종료될 수 있습니다.
예를 들어, 다음과 같은 상황에서 예외가 발생할 수 있습니다.
프로그램을 개발할 때, 모든 상황을 미리 예측하기는 불가능합니다. 예기치 못한 입력, 외부 시스템의 불안정성, 사용자의 잘못된 조작 등이 있을 수 있습니다. 이러한 경우 예외 처리를 통해 프로그램이 비정상적으로 종료되지 않도록 보호할 수 있습니다.
예를 들어, 사용자에게 파일을 입력받아 읽어오는 프로그램을 만든다고 가정해봅시다. 사용자가 입력한 파일이 존재하지 않을 수도 있고, 접근 권한이 없을 수도 있습니다. 이런 상황에서 예외 처리가 없다면, 프로그램은 해당 오류를 만나면서 비정상적으로 종료될 것입니다. 그러나 예외 처리를 통해 프로그램이 이러한 상황을 인식하고 적절히 대응하면, 사용자에게 오류 메시지를 보여주고 프로그램을 안전하게 종료하거나 다시 입력을 받을 수 있습니다.
자바에서 예외는 Throwable 클래스를 상속받은 두 가지 주요 클래스, 즉 Exception과 Error로 나뉩니다. 이 두 가지는 발생하는 상황이 다릅니다.
따라서 Exception은 프로그램에서 처리 가능한 비정상적인 상황을 의미하고, Error는 복구할 수 없는 심각한 시스템 레벨의 문제를 나타냅니다.
자바에서는 예외를 크게 두 가지로 분류합니다. Checked 예외와 Unchecked 예외입니다.
public void readFile(String filePath) throws IOException {
FileReader file = new FileReader(filePath);
file.read();
}
Java위의 코드에서 FileReader는 파일을 읽을 때 발생할 수 있는 예외를 체크 예외로 처리합니다. 따라서 개발자는 이를 반드시 처리해야 합니다.
public void divide(int a, int b) {
int result = a / b; // b가 0일 경우 ArithmeticException 발생
}
Java자바에서 예외가 발생하면, 다음과 같은 단계로 흐름이 진행됩니다.
자바에서는 주로 try-catch-finally 블록을 사용하여 예외를 처리합니다. 각각의 키워드가 어떻게 사용되는지 알아보겠습니다.
public void processFile(String fileName) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(fileName));
System.out.println(reader.readLine());
} catch (FileNotFoundException e) {
System.err.println("파일을 찾을 수 없습니다: " + e.getMessage());
} catch (IOException e) {
System.err.println("입출력 오류가 발생했습니다: " + e.getMessage());
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
System.err.println("리소스 해제 중 오류 발생: " + e.getMessage());
}
}
}
Java위 예제에서 try 블록은 파일을 읽는 코드를 포함하고, catch 블록은 예외 발생 시 에러 메시지를 출력하며, finally 블록은 예외와 관계없이 파일을 닫는 작업을 수행합니다.
자바에서는 기본적으로 제공되는 예외 클래스 외에도, 사용자가 직접 예외 클래스를 정의하여 사용할 수 있습니다. 사용자 정의 예외는 특정한 비즈니스 로직에서 발생할 수 있는 오류를 보다 명확하게 나타내기 위해 사용됩니다.
class InvalidUserException extends Exception {
public InvalidUserException(String message) {
super(message);
}
}
public void validateUser(String user) throws InvalidUserException {
if (user == null || user.isEmpty()) {
throw new InvalidUserException("유효하지 않은 사용자입니다.");
}
}
Java위 예제에서는 InvalidUserException이라는 사용자 정의 예외를 만들어, 사용자 유효성 검증 과정에서 조건을 만족하지 않는 경우 명확하게 예외를 발생시킵니다.
예외 전파란 메서드에서 예외가 발생했을 때, 해당 메서드에서 이를 처리하지 않고 호출한 메서드로 예외를 전달하는 것을 의미합니다. 예외 전파는 throws 키워드를 통해 처리되며, 예외가 전파되는 과정에서 호출 스택이 출력되어 문제의 원인을 추적하는 데 유용합니다.
public void methodA() throws IOException {
methodB();
}
public void methodB() throws IOException {
throw new IOException("IO 오류 발생");
}
Java위 코드에서 methodB에서 발생한 예외는 methodA로 전파되고, 최종적으로 methodA를 호출한 쪽에서 예외 처리를 수행하게 됩니다.
자바 7에서 도입된 try-with-resources는 리소스를 자동으로 해제할 수 있는 기능을 제공합니다. AutoCloseable 인터페이스를 구현한 객체는 try-with-resources 블록을 사용해 자동으로 닫을 수 있습니다.
public void readFile(String fileName) {
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
System.out.println(reader.readLine());
} catch (IOException e) {
System.err.println("파일 읽기 중 오류 발생: " + e.getMessage());
}
}
Java위 코드에서는 try 블록에서 BufferedReader를 사용하고, 별도의 finally 블록 없이도 리소스가 자동으로 해제됩니다.
자바의 예외 처리 메커니즘은 프로그램의 안정성을 높이는 중요한 도구입니다. 예외의 종류와 발생하는 상황에 대해 이해하고, 이를 올바르게 처리하는 방법을 익히면 보다 견고한 프로그램을 작성할 수 있습니다. 예외 처리는 단순히 프로그램의 오류를 막는 것을 넘어, 사용자 경험을 향상시키고, 시스템의 신뢰성을 높이는 데 중요한 역할을 합니다. 앞으로 코드를 작성할 때 예외 처리를 염두에 두고, 발생할 수 있는 오류에 대해 적절히 대응하는 습관을 기르길 바랍니다.
소개 자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번…
해시(Hash)란 무엇인가? 해시(Hash)는 자바 프로그래밍에서 빠르고 효율적인 데이터 저장 및 검색을 위한 핵심적인 개념입니다. 이…
LinkedList란 무엇인가? LinkedList는 자바에서 유용하게 사용되는 자료구조 중 하나로, 연결 리스트 방식을 이용하여 데이터를 관리하는…
ArrayList란 무엇인가? ArrayList는 자바에서 가장 널리 사용되는 컬렉션 중 하나로, 가변 크기의 배열을 구현한 클래스입니다.…
제네릭(Generic)이란? 자바 제네릭은 코드의 재사용성을 높이고 타입 안전성을 보장하는 중요한 개념입니다. 이 블로그 글에서는 자바…