반응형

출처 : https://velog.io/@soongle/c-RAII-Resource-acquisition-is-initialization

RAII(Resouce Acquisition Is Initialization)는 C++ 프로그래밍에서 중요한 개념 중 하나입니다. 이는 자원을 획득하는 것과 동시에 그 자원을 초기화하는 디자인 패턴을 나타냅니다. 이 개념을 통해 자원 누수를 방지하고 코드를 보다 안정적이고 예측 가능하게 만들 수 있습니다.

RAII의 핵심 아이디어는 자원을 클래스의 생성자에서 할당하고, 해당 자원을 클래스의 소멸자에서 해제하는 것입니다. 이를 통해 객체가 생성되고 소멸될 때 자동으로 자원 관리가 이루어지며, 예외가 발생하더라도 소멸자가 호출되어 자원이 안전하게 해제됩니다.

간단한 RAII 클래스의 예시로 파일 핸들링을 들어보겠습니다.

#include <iostream>
#include <fstream>

class FileHandler {
public:
    FileHandler(const std::string& filename) : file(filename) {
        if (!file.is_open()) {
            throw std::runtime_error("Failed to open file");
        }
        std::cout << "File opened: " << filename << std::endl;
    }

    ~FileHandler() {
        if (file.is_open()) {
            file.close();
            std::cout << "File closed" << std::endl;
        }
    }

    // 다른 멤버 함수들...

private:
    std::ifstream file;
};

int main() {
    try {
        FileHandler file("example.txt");
        // 파일 조작 로직...
    } catch (const std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
        // 예외 처리 로직...
    }

    return 0;
}



이 예제에서 `FileHandler` 클래스는 파일을 열고, 생성자에서 파일을 열지 못하면 예외를 던집니다. 소멸자에서는 파일을 닫습니다. 이렇게 하면 `FileHandler` 객체가 스코프를 벗어나면 항상 파일이 닫히게 됩니다.

RAII 패턴은 메모리 관리, 파일 핸들링, 락 관리 등 다양한 자원 관리 상황에서 유용하게 사용됩니다.

 

FileHandler 자세한 설명

`FileHandler`는 위에서 제시한 예시에서 만든 RAII 클래스의 이름입니다. 이 클래스는 파일 핸들을 관리하는 역할을 합니다. 여기서 파일 핸들은 파일을 열고 닫는 데 사용되는 것을 의미합니다.

`FileHandler` 클래스의 주요 기능은 다음과 같습니다.

1. 생성자 (`FileHandler(const std::string& filename)`)
   - 파일 이름을 매개변수로 받아 파일을 엽니다.
   - 파일을 열지 못하면 예외를 던집니다.

2. 소멸자 (`~FileHandler()`)
   - 파일이 열려 있으면 파일을 닫습니다.
   - 파일이 이미 닫혀 있으면 아무 작업도 수행하지 않습니다.

3. 멤버 변수 (`std::ifstream file`)
   - `std::ifstream` 클래스를 사용하여 파일을 나타냅니다.
   - 파일을 열고 닫는 작업은 `std::ifstream` 객체를 통해 이루어집니다.

이 클래스를 사용하면 파일을 열고 닫는 작업을 클래스의 인스턴스 생성과 소멸에 자동으로 묶을 수 있습니다. 이는 RAII 원칙에 따라 리소스의 획득과 해제를 객체의 생명주기에 결합시켜 코드를 보다 안전하고 예측 가능하게 만드는데 도움이 됩니다.

반응형

+ Recent posts