Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++와 Java의 예외 처리 완벽 비교: 유사점과 차이점 총정리

예외 처리(Exception Handling)는 현대의 거의 모든 객체 지향 프로그래밍 언어에서 지원하는 핵심 기능입니다. C++와 Java 역시 예외 처리 메커니즘을 제공하며, 두 언어 모두 try-catch 블록을 사용한다는 점에서 기본적인 구조는 매우 유사합니다. 하지만 자세히 들여다보면 몇 가지 중요한 차이점이 존재합니다.

1. 던질 수 있는 예외의 타입

가장 큰 차이점은 예외로 던질 수 있는 데이터의 종류입니다.

C++에서는 어떤 타입의 데이터든 예외로 던질 수 있습니다. 여기에는 int, char 같은 기본(primitive) 데이터 타입은 물론 포인터까지 포함됩니다. 반면 Java에서는 반드시 Throwable 객체만 던질 수 있으며, Throwable 클래스를 상속받은 서브클래스(예: Exception, Error)만이 예외로 사용될 수 있습니다.

C++ 예제 코드

#include <iostream>
using namespace std;
int main() {
    int x = -5;
    try { //보호되는 코드 영역
        if( x < 0 ) {
            throw x; //기본 타입(int)을 그대로 던짐
        }
    }
    catch (int x ) {
        cout << "Exception Caught: thrown value is " << x << endl;
    }
}

실행 결과

Exception Caught: thrown value is -5

2. 모든 예외를 잡는 방법(Catch All)

예상치 못한 다양한 타입의 예외를 한 번에 처리하고 싶을 때, 두 언어는 서로 다른 방식을 사용합니다.

C++에서는 생략 부호(ellipsis)를 활용한 'catch-all' 문법으로 모든 타입의 예외를 잡을 수 있습니다.

try {
    //보호되는 코드
} catch(...) {
    //모든 타입의 예외를 처리
}

C++ 예제 코드

#include <iostream>
using namespace std;
int main() {
    int x = -5;
    char y = 'A';
    try { //보호되는 코드 영역
        if( x < 0 ) {
            throw x;
        }
        if(y == 'A') {
            throw y;
        }
    }
    catch (...) {
        cout << "Exception Caught" << endl;
    }
}

실행 결과

Exception Caught

반면 Java에서는 모든 예외의 최상위 클래스인 Exception 클래스를 catch 블록의 매개변수로 사용하여 모든 종류의 예외를 처리할 수 있습니다. 사용자가 직접 정의한 예외 클래스들도 대부분 이 Exception 클래스를 상속하기 때문입니다.

try {
    //보호되는 코드
} catch(Exception e) {
    //모든 타입의 예외를 처리
}

3. finally 블록의 유무

또 하나의 중요한 차이점은 finally 블록의 존재 여부입니다.

C++에는 finally 블록이 없습니다. 리소스 해제 등의 후처리 작업은 RAII 패턴이나 소멸자를 통해 처리해야 합니다. 반면 Java에는 finally라는 특별한 블록이 존재합니다.

finally 블록 안에 작성된 코드는 예외 발생 여부와 관계없이 항상 실행됩니다. try 블록이 오류 없이 정상적으로 끝나든, 예외가 발생하든 상관없이 finally 블록은 반드시 실행되므로 파일 닫기, 연결 해제 같은 필수 정리 작업에 적합합니다.

Java 예제 코드

public class HelloWorld {
    public static void main(String []args) {
        try {
            int data = 25/5;
            System.out.println(data);
        } catch(NullPointerException e) {
            System.out.println(e);
        } finally {
            System.out.println("finally block is always executed");
        }
        System.out.println("rest of the code...");
    }
}

실행 결과

5
finally block is always executed
rest of the code...

정리

두 언어의 예외 처리 메커니즘을 표로 요약하면 다음과 같습니다.

  • 예외 타입: C++은 모든 데이터 타입 던지기 가능 / Java는 Throwable 객체만 가능
  • 전체 예외 처리: C++은 catch(...) 문법 / Java는 Exception 클래스 활용
  • finally 블록: C++은 미지원(RAII 활용) / Java는 지원(항상 실행 보장)

이러한 차이점을 이해하면 각 언어의 설계 철학을 더 깊이 파악할 수 있으며, 실무에서 더 견고하고 안전한 코드를 작성하는 데 큰 도움이 됩니다.