본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(56) - Exception Handling (try-catch-finally, throws)

by 머니테크리더 2023. 10. 3.
반응형

초보 자바 프로그래밍(56) - Exception Handling (try-catch-finally, throws)
초보 자바 프로그래밍(56) - Exception Handling (try-catch-finally, throws)

 

 

🔖 INDEX

     

     

    Exception Handling (예외 처리)

    Exception Handling (예외 처리)는 프로그램의 안정성을 확보하고, 예기치 않은 상황에 대응하는 중요한 기술입니다. 자바에서는 주로 try-catch-finally 및 throws를 이용한 예외 처리 방법을 제공합니다.

     

    try-catch-finally 구문 사용

    try-catch-finally 구문은 자바에서 예외 처리를 위해 사용되는 구문입니다. 예외는 프로그램이 정상적으로 실행되지 않을 때 발생하는 상황을 나타냅니다. 예외 처리는 이러한 상황을 안전하게 관리하고 프로그램의 흐름을 제어하는 방법을 제공합니다.

     

    구조

    try {
        // 예외가 발생할 수 있는 코드
    } catch (ExceptionType1 e) {
        // ExceptionType1에 해당하는 예외를 처리하는 코드
    } catch (ExceptionType2 e) {
        // ExceptionType2에 해당하는 예외를 처리하는 코드
    } finally {
        // 항상 실행되는 코드 (옵셔널)
    }

     

    각 부분 설명

    • try: 예외가 발생할 수 있는 코드를 포함하는 블록입니다.
    • catch: try 블록에서 발생한 예외를 잡아서 처리하는 부분입니다. 여러 개의 catch 블록을 가질 수 있으며, 상위 예외부터 아래로 순서대로 처리해야 합니다.
    • finally: 예외 발생 여부와 관계없이 항상 실행되는 코드를 포함하는 블록입니다. 주로 리소스 해제나 정리 작업을 하는 코드가 위치합니다.

     

    예제

    public class TryCatchFinallyExample {
        public static void main(String[] args) {
            try {
                int result = 10 / 0;
                System.out.println(result);
            } catch (ArithmeticException e) {
                System.out.println("0으로 나눌 수 없습니다.");
                e.printStackTrace();  // 스택 추적을 출력
            } finally {
                System.out.println("finally 블록이 실행되었습니다.");
            }
        }
    }

    위의 예제에서는 10 / 0 연산으로 ArithmeticException이 발생합니다. 이 예외는 catch 블록에서 처리되며, finally 블록의 내용은 항상 실행됩니다.

     

    주의 사항

    • 여러 개의 catch 블록을 사용할 때는 하위 예외부터 상위 예외 순서로 정의해야 합니다. 그렇지 않으면 컴파일 에러가 발생합니다.
    • finally 블록은 선택적이지만, 리소스를 해제하거나 중요한 정리 작업을 할 경우 반드시 사용해야 합니다. 예를 들어, 파일 입출력이나 데이터베이스 연결 해제 작업 등입니다.

     

     

    try-catch-finally 관련 참고 사항

    try-with-resources

    자바 7에서 도입된 try-with-resources 구문은 리소스를 자동으로 닫아주는 기능을 제공합니다. AutoCloseable 또는 Closeable 인터페이스를 구현한 클래스의 객체를 자동으로 닫아줍니다. 이로 인해 코드가 더 간결해지며, 리소스 누수의 위험을 줄일 수 있습니다.

    try (FileInputStream fis = new FileInputStream("file.txt")) {
        // 파일 처리 로직
    } catch (IOException e) {
        e.printStackTrace();
    }

    위의 예에서 FileInputStream은 Closeable 인터페이스를 구현하므로 try 블록 종료 시 자동으로 close() 메서드가 호출됩니다.

     

    다중 예외 처리

    자바 7부터 하나의 catch 블록에서 여러 예외를 처리할 수 있게 되었습니다.

    try {
        // 여러 예외를 발생시킬 수 있는 코드
    } catch (IOException | SQLException e) {
        e.printStackTrace();
    }

     

    사용자 정의 예외

    기존의 자바 라이브러리에서 제공하는 예외 클래스 외에도 사용자 정의 예외를 만들 수 있습니다. 이를 통해 비즈니스 로직에 맞는 예외 처리를 구현할 수 있습니다.

    public class CustomException extends Exception {
        public CustomException(String message) {
            super(message);
        }
    }

     

    예외 연쇄

    예외가 다른 예외를 발생시키는 경우에는 원래의 예외를 연쇄적으로 포함시킬 수 있습니다.

    try {
        // 예외 발생 코드
    } catch (SomeException e) {
        throw new AnotherException("This is another exception", e);
    }

    이렇게 함으로써 원래의 예외 정보를 유지하면서 새로운 예외를 발생시킬 수 있습니다.

     

    Throwable과 Exception

    자바에서 예외를 나타내는 최상위 클래스는 Throwable 입니다. 그 아래에는 Error와 Exception 두 가지 하위 클래스가 있습니다. 일반적으로 우리는 Exception과 그 하위 클래스들을 주로 사용하며, Error는 시스템 에러를 나타내는 클래스로 일반적인 어플리케이션에서는 잘 사용되지 않습니다.

     

     

    throws 키워드 사용

    throws 키워드는 메서드 선언부에 사용되며, 해당 메서드가 처리하지 않는 예외를 호출하는 쪽에 전달하려 할 때 사용됩니다. 즉, 메서드 내부에서 발생할 수 있는 예외를 호출자에게 알려주는 역할을 합니다.

     

    사용 방법

    다음은 throws 키워드를 사용하는 기본 구조입니다.

    public returnType methodName(parameters) throws ExceptionType1, ExceptionType2, ... {
        // 메서드 구현
    }

     

    예제

    public class ThrowsExample {
        public static void main(String[] args) {
            try {
                myMethod(0);
            } catch (ArithmeticException e) {
                System.out.println("main에서 예외 처리: " + e.getMessage());
            }
        }
    
        public static int myMethod(int denominator) throws ArithmeticException {
            return 10 / denominator;
        }
    }

    위 예제에서 myMethod는 ArithmeticException을 직접 처리하지 않습니다. 대신 이 메서드를 호출하는 main 메서드에서 예외를 처리합니다.

     

    주의 사항

    • 체크 예외(Checked Exception)와 언체크 예외(Unchecked Exception):
      • 체크 예외는 컴파일 타임에 확인되는 예외로, 이러한 예외는 반드시 처리해야 합니다. 처리 방법은 try-catch 블록을 사용하거나 throws 키워드를 사용하여 호출자에게 예외 처리를 위임하는 두 가지 방법이 있습니다.
      • 언체크 예외는 실행 시에 발생하는 RuntimeException 및 그 하위 클래스의 예외들을 말하며, 명시적으로 처리하지 않아도 컴파일 에러가 발생하지 않습니다.
    • throws를 사용할 때는 해당 메서드를 호출하는 모든 상위 메서드들이 동일한 예외를 처리해야 합니다. 즉, throws를 사용하는 메서드를 호출하는 다른 메서드도 동일한 예외를 throws로 선언하거나, 해당 예외를 try-catch로 처리해야 합니다.
    • throws를 과도하게 사용하면 코드의 가독성과 유지 보수성이 떨어질 수 있습니다. 따라서, 가능한 한 예외 발생 원인을 해결하거나 해당 메서드 내에서 적절히 처리하는 것이 좋습니다.

     

    Custom Exception (사용자 정의 예외)

    사용자 정의 예외(Custom Exception)는 표준 자바 라이브러리에서 제공하는 예외 클래스를 확장하여 사용자의 비즈니스 로직에 맞게 새롭게 정의하는 예외 클래스를 의미합니다. 사용자 정의 예외는 특정 애플리케이션에서 발생할 수 있는 예외 상황을 더 구체적으로 표현할 수 있게 해줍니다.

     

    사용자 정의 예외 생성

    • Checked Exception으로 만들기: Exception 클래스를 상속 받아서 정의합니다.
    • Unchecked Exception으로 만들기: RuntimeException 클래스를 상속 받아서 정의합니다.

     

    예제

    Checked Exception 예제:

    public class InvalidAgeException extends Exception {
        public InvalidAgeException(String message) {
            super(message);
        }
    }

     

    Unchecked Exception 예제:

    public class AgeOutOfBoundsException extends RuntimeException {
        public AgeOutOfBoundsException(String message) {
            super(message);
        }
    }

     

    사용자 정의 예외 사용:

    public class Person {
        private int age;
    
        public void setAge(int age) throws InvalidAgeException {
            if (age < 0 || age > 120) {
                throw new InvalidAgeException("나이는 0 ~ 120 사이만 가능합니다.");
            }
            this.age = age;
        }
    
        public static void main(String[] args) {
            Person person = new Person();
            try {
                person.setAge(150);
            } catch (InvalidAgeException e) {
                e.printStackTrace();
            }
        }
    }

    위 예제에서 setAge 메서드는 나이가 0보다 작거나 120보다 큰 경우 InvalidAgeException을 발생시킵니다.

     

    사용자 정의 예외의 장점

    • 명확한 예외 상황 정의: 비즈니스 로직에 따른 특별한 예외 상황을 정확하게 표현할 수 있습니다.
    • 유지 보수성 향상: 특정 비즈니스 예외에 대한 처리 로직을 쉽게 찾을 수 있게 도와줍니다.
    • 가독성 향상: 예외 이름만으로도 어떤 상황에서 발생하는 예외인지 쉽게 알 수 있습니다.

     

     

    댓글