C++와 Java는 모두 예외 처리(Exception Handling) 메커니즘을 제공하지만, 두 언어 사이에는 몇 가지 중요한 차이점이 존재합니다. 이러한 차이를 이해하면 각 언어의 설계 철학과 실무 활용 방식을 더 깊이 파악할 수 있습니다.
C++와 Java 예외 처리 비교표
| Java의 예외 처리 | C++의 예외 처리 |
|---|---|
| Throwable 클래스를 상속받은 객체만 던질 수 있습니다. | 모든 타입(int, 문자열, 객체 등)을 예외로 던질 수 있습니다. |
| finally 블록이 존재하며, try-catch 블록 실행 후 리소스 정리 등을 위해 반드시 실행됩니다. | finally 블록이 존재하지 않습니다. |
| throws 키워드를 사용하여 함수가 던질 수 있는 예외 목록을 명시합니다. | throw 키워드를 사용하여 함수가 던질 수 있는 예외 목록을 명시합니다(동적 예외 명세). |
| 컴파일 타임에 확인되는 checked 예외와 unchecked 예외가 모두 존재합니다. | unchecked 예외만 존재합니다. |
주요 차이점 상세 설명
1. 던질 수 있는 예외의 타입
Java에서는 반드시 Throwable 클래스를 상속한 객체만 throw할 수 있습니다. 반면 C++에서는 int, 포인터, 문자열 리터럴 등 어떤 타입이든 예외로 던질 수 있어 유연성은 높지만, 일관성 있는 예외 처리에는 주의가 필요합니다.
2. finally 블록의 유무
Java는 finally 블록을 통해 파일 스트림 닫기, 데이터베이스 연결 해제 등과 같은 리소스 정리 작업을 보장합니다. Java 7부터는 try-with-resources 문법으로 이를 더욱 편리하게 처리할 수 있습니다. C++에는 finally 블록이 없지만, 대신 RAII(Resource Acquisition Is Initialization) 패턴과 소멸자를 활용해 유사한 효과를 얻습니다.
3. throws와 throw 키워드
Java의 throws 키워드는 메서드 시그니처에 예외를 선언하는 데 사용되며, C++의 경우 과거 동적 예외 명세(dynamic exception specification)인 throw(...) 문법이 있었으나 현재는 noexcept 키워드로 대체되어 폐기(deprecated)되었습니다.
4. Checked vs Unchecked 예외
Java는 컴파일러가 강제로 처리 여부를 검사하는 checked 예외(예: IOException)와 검사하지 않는 unchecked 예외(RuntimeException 계열)를 모두 지원합니다. C++는 checked 예외 개념이 없으며, 모든 예외가 unchecked 방식으로 동작합니다.