Java의 예외처리리

오늘 배운 것


1. 예외(Exception)와 오류(Error)

Java에서 프로그램 실행 중 발생하는 문제 상황은 크게 예외(Exception)오류(Error)로 나뉩니다.

  • 오류 (Error): 주로 시스템 수준에서 발생하는 심각한 문제로, 애플리케이션 코드에서 수습할 수 없는 상황을 의미합니다. 예를 들어, 메모리 부족(OutOfMemoryError)이나 스택 오버플로(StackOverflowError)가 여기에 해당합니다.
  • 예외 (Exception): 프로그램 작성의 실수나 사용자의 오용 등으로 인해 발생하며, 개발자가 코드를 통해 수습할 수 있는 상황을 말합니다. 예를 들어, null 객체 참조나 존재하지 않는 파일 열기 시도 등이 있습니다.

예외 처리(Exception Handling) 란, 이러한 예외가 발생했을 때 프로그램이 비정상적으로 종료되는 것을 막고 정상적인 실행 흐름을 유지하도록 만드는 것입니다.

예외 클래스 계층 구조

모든 예외와 오류는 Throwable 클래스를 상속받습니다.

  • Error 계열: 시스템 오류를 나타냅니다.
  • Exception 계열: 프로그램에서 처리 가능한 예외를 나타냅니다.
    • Checked Exception: RuntimeException을 상속하지 않는 예외들입니다. 컴파일러가 해당 예외에 대한 처리(try-catch)나 전가(throws) 여부를 반드시 확인하므로, 처리하지 않으면 컴파일 오류가 발생합니다. (IOException, SQLException 등)
    • Unchecked Exception (Runtime Exception): RuntimeException을 상속하는 예외들입니다. 컴파일러가 예외 처리를 강제하지 않습니다. (NullPointerException, ArrayIndexOutOfBoundsException 등)

2. try-catch-finally

try-catch-finally는 Java의 대표적인 예외 처리 구문입니다.

  • try 블록: 예외 발생 가능성이 있는 코드를 감쌉니다.
  • catch 블록: try 블록에서 특정 예외가 발생했을 때 이를 잡아 처리하는 코드를 작성합니다.
  • finally 블록: 예외 발생 여부나 catch 블록의 실행 여부와 관계없이 항상 실행되는 코드 블록입니다. 주로 파일 스트림이나 데이터베이스 연결과 같은 시스템 자원을 해제(close)하는 데 사용되어 리소스 누수를 방지합니다.

다중 catch 블록

하나의 try 블록에서 여러 종류의 예외가 발생할 수 있을 때, 여러 개의 catch 블록을 사용할 수 있습니다. 이때, 예외 클래스 간의 상속 관계를 고려하여 자식 클래스 타입의 예외를 부모 클래스 타입의 예외보다 먼저 catch 해야 합니다. 그렇지 않으면 부모 클래스의 catch 블록이 모든 자식 예외를 잡게 되어 뒤따르는 catch 블록이 실행될 수 없기 때문입니다 (Unreachable catch block).

try-with-resources

try-with-resources 구문은 자원 관리를 더 편리하게 해줍니다. try 키워드 뒤의 괄호 안에 AutoCloseable 인터페이스를 구현한 자원 객체를 선언하면, try 블록이 종료될 때 해당 자원이 자동으로 해제(close)됩니다. 이로 인해 finally 블록에서 복잡하게 close() 메서드를 호출할 필요가 없어집니다.


3. throws 활용 (예외 전가)

throws 키워드는 메서드 내에서 발생한 예외를 직접 처리하지 않고, 그 메서드를 호출한 곳으로 처리 책임을 넘기는(전가하는) 역할을 합니다.

  • 메서드 선언부 끝에 throws [예외 클래스명] 형식으로 사용합니다.
  • throws는 예외를 처리하는 것이 아니라 단순히 책임을 전가하는 것이므로, 이 메서드를 호출한 쪽에서 try-catch로 처리하거나 다시 throws로 전가해야 합니다.
  • API에서 throws를 사용하는 이유는, API 사용자(개발자)가 예외 발생 가능성을 인지하고 적절한 처리를 하도록 강제하기 위함입니다.

메서드 오버라이딩과 throws

메서드를 오버라이딩할 때, 자식 클래스의 메서드는 부모 클래스의 메서드가 던지는 예외보다 더 상위 타입의 예외를 던질 수 없습니다. 또한, 부모가 선언하지 않은 새로운 checked exception을 던질 수도 없습니다.


4. 사용자 정의 예외

API에서 제공하는 예외 클래스 외에, 특정 비즈니스 로직에 맞는 예외를 직접 만들어 사용할 수 있습니다.

  • Exception 클래스를 상속하면 Checked Exception이 되고, RuntimeException을 상속하면 Unchecked Exception이 됩니다.
  • 장점:
    • 객체 활용: 예외 객체에 추가 정보를 담아 전달할 수 있습니다.
    • 코드 재사용: 동일한 예외 상황에서 재사용이 가능합니다.
    • 가독성 향상: 예외의 의도가 명확해져 코드의 가독성과 유지보수성이 높아집니다.

내일 할 일

  1. B형 시험 준비를 위해 pro문제를 풀어본다.
  2. Java File I/O 관련 내용

results matching ""

    No results matching ""