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 원칙에 따라 리소스의 획득과 해제를 객체의 생명주기에 결합시켜 코드를 보다 안전하고 예측 가능하게 만드는데 도움이 됩니다.