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
등)
- Checked Exception:
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이 됩니다.- 장점:
- 객체 활용: 예외 객체에 추가 정보를 담아 전달할 수 있습니다.
- 코드 재사용: 동일한 예외 상황에서 재사용이 가능합니다.
- 가독성 향상: 예외의 의도가 명확해져 코드의 가독성과 유지보수성이 높아집니다.
내일 할 일
- B형 시험 준비를 위해 pro문제를 풀어본다.
- Java File I/O 관련 내용