반응형
예외 처리: 개념과 활용
소프트웨어 개발에서 **예외 처리(Exception Handling)**는 프로그램 실행 중 발생할 수 있는 오류를 처리하고, 예측 불가능한 상황에서도 프로그램의 안정성을 유지하는 데 중요한 역할을 합니다. 이 글에서는 예외 처리의 개념과 자바(Java)에서의 구현 방법, 다양한 활용 예시를 살펴보겠습니다.
예외(Exception)란 무엇인가?
**예외(Exception)**는 프로그램 실행 중 발생하는 비정상적인 상태를 의미하며, 코드의 정상적인 흐름을 방해할 수 있습니다. 예외는 주로 잘못된 사용자 입력, 네트워크 연결 문제, 파일 접근 오류 등 외부 요인으로 인해 발생합니다.
예외의 분류:
- 체크 예외(Checked Exception):
- 컴파일 시점에 처리해야 하는 예외.
- 예:
IOException
,SQLException
등.
- 언체크 예외(Unchecked Exception):
- 실행 시점에 발생하며, 처리하지 않아도 컴파일 오류가 발생하지 않음.
- 예:
NullPointerException
,ArithmeticException
등.
- 에러(Error):
- 주로 JVM에서 발생하며, 복구가 불가능한 심각한 문제.
- 예:
OutOfMemoryError
,StackOverflowError
등.
자바에서 예외 처리의 기본 구조
자바에서는 예외를 처리하기 위해 try-catch-finally
블록과 throw
및 throws
키워드를 사용합니다.
예제:
import java.io.*;
public class ExceptionExample {
public static void main(String[] args) {
try {
File file = new File("test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
System.out.println(br.readLine());
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
} catch (IOException e) {
System.out.println("입출력 오류 발생: " + e.getMessage());
} finally {
System.out.println("예외 처리를 마쳤습니다.");
}
}
}
출력 결과 (파일이 없는 경우):
파일을 찾을 수 없습니다: test.txt (No such file or directory)
예외 처리를 마쳤습니다.
예외 처리의 주요 구성 요소
- try 블록:
- 예외가 발생할 가능성이 있는 코드를 포함.
- catch 블록:
- 발생한 예외를 처리.
- finally 블록:
- 예외 발생 여부와 관계없이 항상 실행되는 코드 (자원 해제에 주로 사용).
- throw 키워드:
- 예외를 명시적으로 발생시킴.
- throws 키워드:
- 메서드에서 처리하지 않은 예외를 호출자에게 전달.
예제:
public class CustomExceptionExample {
public static void main(String[] args) {
try {
validateAge(15);
} catch (IllegalArgumentException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void validateAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("나이는 18 이상이어야 합니다.");
}
System.out.println("나이 검증 통과");
}
}
출력 결과:
예외 발생: 나이는 18 이상이어야 합니다.
사용자 정의 예외 만들기
자바에서는 표준 예외 클래스 외에도 사용자 정의 예외를 생성할 수 있습니다.
예제:
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
public class CustomExceptionDemo {
public static void main(String[] args) {
try {
checkNumber(-1);
} catch (CustomException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void checkNumber(int number) throws CustomException {
if (number < 0) {
throw new CustomException("숫자는 음수가 될 수 없습니다.");
}
System.out.println("숫자 검증 통과: " + number);
}
}
출력 결과:
예외 발생: 숫자는 음수가 될 수 없습니다.
다양한 활용 예시
- 파일 처리:
- 파일 입출력 시 예외를 처리하여 파일이 없거나 읽기/쓰기 권한이 없는 경우에 대처.
- 네트워크 연결:
- 네트워크 오류 발생 시 재시도 또는 사용자 알림.
- 데이터 검증:
- 잘못된 입력 데이터를 걸러내고 적절한 피드백 제공.
- 트랜잭션 관리:
- 데이터베이스 작업 중 예외 발생 시 롤백 처리.
예제:
import java.sql.*;
public class TransactionExample {
public static void main(String[] args) {
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "user", "password");
connection.setAutoCommit(false);
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (1, 1000)");
stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (2, 2000)");
connection.commit();
} catch (SQLException e) {
System.out.println("데이터베이스 오류: " + e.getMessage());
if (connection != null) {
try {
connection.rollback();
System.out.println("롤백 완료");
} catch (SQLException rollbackEx) {
System.out.println("롤백 실패: " + rollbackEx.getMessage());
}
}
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException closeEx) {
System.out.println("연결 종료 실패: " + closeEx.getMessage());
}
}
}
}
}
출력 결과:
데이터베이스 오류: Duplicate entry '1' for key 'PRIMARY'
롤백 완료
마치며
예외 처리는 자바 애플리케이션의 안정성을 높이고, 오류 상황에서도 적절히 대응할 수 있도록 돕는 필수적인 도구입니다. 다양한 상황에서 적절히 예외를 처리하여 안정적이고 신뢰할 수 있는 코드를 작성해 보세요!
반응형
'개발 부트캠프 > 백엔드' 카테고리의 다른 글
[Java] Collection(List / Set / Map) (0) | 2025.01.06 |
---|---|
[Java] 의존성 역전 원칙(DIP) (0) | 2025.01.04 |
[Java] 인터페이스(Interface) & 의존성 주입 (0) | 2025.01.04 |
[Java] 싱글톤 패턴(Singleton Pattern) (1) | 2025.01.04 |
[Java] 디자인 패턴 (0) | 2025.01.04 |