자바

예외 처리

예외(Exception)와 오류(Error)의 차이

자바에서 예외와 오류는 모두 프로그램 실행 중 발생할 수 있는 문제를 나타내지만, 그 성격과 처리 방법이 다릅니다.

예외(Exception): 프로그램의 실행 중 발생할 수 있는 비정상적인 상황으로, 일반적으로 사용자가 처리할 수 있는 문제입니다. 예를 들어, 파일을 찾을 수 없거나, 잘못된 입력이 들어오는 경우가 이에 해당합니다. 예외는 try-catch 블록을 사용하여 처리할 수 있습니다.
오류(Error): 시스템의 심각한 문제로, 일반적으로 프로그램이 정상적으로 처리할 수 없는 상황입니다. 예를 들어, 메모리 부족이나 스택 오버플로우와 같은 문제는 오류로 간주됩니다. 오류는 일반적으로 프로그램에서 처리할 수 없으며, 발생하면 프로그램이 종료될 수 있습니다.

예외 처리의 기본 구조

자바에서 예외를 처리하는 기본 구조는 try, catch, finally 블록으로 구성됩니다.

try 블록: 예외가 발생할 가능성이 있는 코드를 포함합니다. 이 블록 내에서 예외가 발생하면, 해당 예외는 즉시 catch 블록으로 전달됩니다.
catch 블록: try 블록에서 발생한 예외를 처리하는 코드입니다. 여러 개의 catch 블록을 사용하여 다양한 예외를 처리할 수 있으며, 각 catch 블록은 특정 예외 타입을 처리하도록 정의됩니다.
finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 블록입니다. 주로 자원 해제나 정리 작업을 수행하는 데 사용됩니다. 예를 들어, 파일을 열었으면 finally 블록에서 파일을 닫는 작업을 수행할 수 있습니다.

사용자 정의 예외

자바에서는 개발자가 필요에 따라 사용자 정의 예외를 만들 수 있습니다. 사용자 정의 예외는 Exception 클래스를 상속하여 생성합니다. 이를 통해 특정 비즈니스 로직에 맞는 예외를 정의하고 처리할 수 있습니다.

예외 클래스 생성: 사용자 정의 예외 클래스를 만들 때는 생성자를 통해 예외 메시지를 전달할 수 있습니다. 예를 들어, InvalidInputException이라는 클래스를 만들어 잘못된 입력에 대한 예외를 처리할 수 있습니다.
예외 던지기: 사용자 정의 예외를 발생시키기 위해 throw 키워드를 사용합니다. 예를 들어, 특정 조건이 만족되지 않을 때 throw new InvalidInputException("잘못된 입력입니다.");와 같이 사용할 수 있습니다.

예외 전파(Propagation)

자바에서는 예외가 발생하면 해당 예외가 발생한 메서드에서 처리하지 않고 호출한 메서드로 전파할 수 있습니다. 이를 통해 예외를 상위 메서드에서 처리할 수 있습니다.

throws 키워드: 메서드 선언부에 throws 키워드를 사용하여 해당 메서드에서 발생할 수 있는 예외를 명시할 수 있습니다. 예를 들어, public void myMethod() throws IOException과 같이 선언하면, 이 메서드에서 IOException이 발생할 수 있음을 나타냅니다.
예외 전파의 장점: 예외를 전파함으로써, 예외 처리 로직을 메서드 내부에 두지 않고 호출하는 쪽에서 처리할 수 있어 코드의 가독성과 유지보수성을 높일 수 있습니다.

예외 처리의 모범 사례

예외 처리를 효과적으로 수행하기 위해 몇 가지 모범 사례를 따르는 것이 중요합니다.

구체적인 예외 처리: 가능한 한 구체적인 예외를 처리하도록 합니다. 일반적인 Exception 클래스를 catch하는 것보다, 특정 예외 클래스를 catch하여 보다 세밀한 예외 처리를 할 수 있습니다.
예외 메시지 제공: 예외 발생 시 유용한 정보를 제공하는 메시지를 포함하여, 문제를 진단하는 데 도움이 되도록 합니다. 사용자 정의 예외를 사용할 때는 명확한 메시지를 제공하는 것이 좋습니다.
자원 해제: 데이터베이스 연결, 파일 핸들 등과 같은 자원은 finally 블록에서 반드시 해제하도록 합니다. 이를 통해 자원 누수를 방지할 수 있습니다.
로깅: 예외가 발생했을 때, 이를 로깅하여 나중에 문제를 추적할 수 있도록 합니다. 로깅 프레임워크를 사용하여 예외 정보를 기록하면, 운영 중 발생하는 문제를 쉽게 파악할 수 있습니다.
예외 처리의 일관성: 애플리케이션 전반에 걸쳐 일관된 예외 처리 방식을 유지하는 것이 중요합니다. 이를 통해 코드의 가독성을 높이고, 예외 처리 로직을 쉽게 이해할 수 있습니다.