반응형

1. 예외(Exception)란 무엇인가?

Java 프로그램을 실행하다 보면 예상치 못한 문제가 발생할 수 있습니다. 이런 문제를 예외(Exception)라고 부릅니다. 예외는 정상적인 프로그램의 흐름을 방해하며, 이를 적절히 처리하지 않으면 프로그램이 갑자기 종료될 수 있습니다.

Java에서는 예외를 객체로 표현하며, 이는 Throwable 클래스를 상속받는 두 가지 주요 하위 클래스인 ErrorException으로 나뉩니다:

  • Error: JVM에서 발생하는 심각한 문제(예: OutOfMemoryError).
  • Exception: 개발자가 처리 가능한 문제(예: 파일을 찾을 수 없는 경우).

2. Java 예외 처리의 기본: try-catch

Java는 예외가 발생했을 때 프로그램이 갑자기 종료되지 않고, 이를 처리할 수 있는 메커니즘을 제공합니다. 이 메커니즘의 핵심이 바로 try-catch 블록입니다.

try-catch는 예외가 발생할 수 있는 코드를 보호하고, 문제가 발생했을 때 이를 처리하는 방법을 정의합니다.


3. try-catch 블록의 기본 구조

try-catch 블록은 다음과 같은 구조를 가지고 있습니다:

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType e) {
    // 예외가 발생했을 때 실행되는 코드
}

간단한 예제

public class TryCatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 0으로 나누기 시도 (예외 발생)
        } catch (ArithmeticException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }
}

출력:

예외 발생: / by zero

주요 구성 요소

  1. try 블록:
    예외가 발생할 가능성이 있는 코드를 포함합니다.
  2. catch 블록:
    특정 예외가 발생했을 때 이를 처리하는 코드를 작성합니다.
  3. 예외 객체:
    예외 발생 시, catch 블록에서 예외 객체를 통해 상세한 정보를 확인할 수 있습니다(예: 메시지, 스택 트레이스).

4. try-catch에서 finally의 역할

finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드 블록입니다. 주로 파일, 네트워크, 데이터베이스 연결 등을 해제하는 데 사용됩니다.

구조

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType e) {
    // 예외 처리 코드
} finally {
    // 항상 실행되는 코드
}

예제

public class FinallyExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[5]); // 예외 발생
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("예외 처리: " + e.getMessage());
        } finally {
            System.out.println("리소스를 정리합니다.");
        }
    }
}

출력:

예외 처리: Index 5 out of bounds for length 3
리소스를 정리합니다.

5. try-catch와 함께 사용하는 다중 예외 처리

Java에서는 catch 블록을 여러 개 작성하여 다양한 예외를 처리할 수 있습니다.

예제

public class MultipleCatchExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[5]); // ArrayIndexOutOfBoundsException 발생
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("배열 인덱스 오류: " + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("산술 오류: " + e.getMessage());
        }
    }
}

6. 예외 처리와 리소스 관리: try-with-resources

Java 7부터 추가된 try-with-resources는 리소스 관리가 필요한 코드를 작성할 때 매우 유용합니다. 이는 AutoCloseable 인터페이스를 구현한 객체를 자동으로 닫아줍니다.

예제

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            System.out.println(br.readLine());
        } catch (IOException e) {
            System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
        }
    }
}

7. 사용자 정의 예외 처리

Java에서는 개발자가 직접 예외 클래스를 정의하여 특정 상황에 대한 예외를 처리할 수 있습니다.

사용자 정의 예외 클래스

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());
        }
    }
}

출력:

사용자 정의 예외 발생!

8. 예외 처리에서의 모범 사례

  1. 구체적인 예외를 처리하라
    모든 예외를 Exception으로 처리하지 말고, 특정 예외를 처리하는 것이 좋습니다.
  2. 필요한 경우에만 catch 사용
    예외를 처리하지 않고 로그만 남긴다면, 굳이 catch 블록을 남발하지 않는 것이 좋습니다.
  3. finally 블록을 사용하여 리소스 정리
    리소스가 제대로 해제되지 않으면 메모리 누수가 발생할 수 있습니다.
  4. 예외 메시지를 명확하게 작성하라
    사용자에게 유용한 정보를 제공하는 메시지를 남기세요.

9. 결론

Java의 try-catch는 예외 처리의 핵심 메커니즘으로, 프로그램의 안정성과 신뢰성을 높이는 데 필수적인 도구입니다. try, catch, finally의 조합과 다양한 활용 방법을 이해하고 적재적소에 적용하면, 예외 상황에서도 견고한 애플리케이션을 개발할 수 있습니다.

예외 처리의 기본부터 고급 활용법까지 익혀, 오류 없는 안정적인 코드를 작성해보세요!

반응형

+ Recent posts