[c++] RAII와 예외 처리

RAII(Resoource Acquisition Is Initialization)는 C++ 프로그래밍에서 매우 중요한 개념 중 하나입니다. RAII는 자원의 취득을 자원의 초기화와 결합하여 자원 해제를 자동으로 처리하는 디자인 패턴을 말합니다.

이 디자인 패턴은 많은 상황에서 메모리 누수와 같은 자원 관리 문제를 해결하는 데 도움이 됩니다. 특히, RAII는 예외가 발생했을 때의 처리를 간편하게 해줍니다.

#include <iostream>
#include <fstream>
#include <stdexcept>

class FileHandler {
public:
    explicit FileHandler(const std::string& filename) : file(filename) {
        if (!file.is_open()) {
            throw std::runtime_error("File open error");
        }
    }

    ~FileHandler() {
        if (file.is_open()) {
            file.close();
        }
    }

    void write(const std::string& data) {
        if (file.is_open()) {
            file << data;
        } else {
            throw std::runtime_error("File write error");
        }
    }

private:
    std::ofstream file;
};

int main() {
    try {
        FileHandler fh("test.txt");
        fh.write("Hello, RAII!");
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

위의 예제에서 FileHandler 클래스는 파일을 열고, 사용이 끝나면 자동으로 파일을 닫는 역할을 합니다. 파일 작업 중 예외가 발생하더라도 FileHandler의 소멸자가 자동으로 호출되어 파일이 닫히게 됩니다. 이로써 메모리 누수를 방지할 수 있습니다.

RAII는 C++ 표준 라이브러리에서도 많이 사용되고 있으며, 스마트 포인터와 파일 입출력 스트림 등 많은 기능에서 이 패턴이 적용되어 있습니다.

RAII는 C++에서 안전하고 유연한 프로그래밍을 지원하는 핵심적인 개념 중 하나이므로, 이를 적절히 이해하고 활용하는 것이 중요합니다.