이우의 개발일지
[Design pattern] RAII(Resource Acquisition Is Initialization) 리소스 획득 초기화 본문
[Design pattern] RAII(Resource Acquisition Is Initialization) 리소스 획득 초기화
공대이우 2024. 11. 7. 10:44RAII (Resource Acquisition Is Initialization)이란?
자원의 안전한 사용을 위해 객체가 쓰이는 스코프를 벗어나면 자원을 자동으로 해제해주는 기법입니다.
즉, 변수가 선언되거나 파일을 열 때 자원이 할당 되고 해당 스코프에서 벗어나면 자동으로 해제되는 기법입니다.
보통 자원 획득이 필요한 경우, 자원 획득을 담당하는 클래스를 만들어 그 클래스의 생성자에서만 자원 획득을 하는 것입니다. (프로그램을 개발하다보면 동적 메모리 할당, 파일 열기, 락 등 자원 획득을 많이 하는데, 이러한 자원 획득을 담당하는 클래스를 만들어 그 클래스의 생성자에서만 자원 획득을 하는 것입니다.)
RAII의 핵심 원리
- 생성과 동시에 리소스 획득: 객체가 생성될 때 필요한 리소스를 획득하고, 생성자에서 이를 초기화합니다.
- 소멸 시 자동 해제: 객체가 스코프를 벗어나거나 삭제될 때, 소멸자에서 리소스를 자동으로 해제합니다. 이는 블록을 벗어나거나 프로그램이 종료될 때 발생하므로 명시적인 리소스 해제 코드가 필요하지 않습니다.
RAII를 쓰는 이유?
자원 획득을 하는 경우에는 획득하지 않고 사용할 시 즉각적으로 에러가 발생하기에 디버깅하기 쉽습니다. 그러나 자원 해제의 경우 자원 해제를 호출하지 않으면 메모리 누수가 발생하지만 즉각적으로 문제가 발생하는 것은 아니기에 디버깅하기가 쉽지 않습니다.
그냥 쓰고 바로 해제 하면 안돼? 라고 물을 수도 있는데, 프로그램이 거대해지면 예외 발생 등 프로그램의 실행 흐름이 매우 복잡해지기 때문에 초기에 문제를 예방하는 것이 좋습니다.
사실 다른 언어에서는 GC(Gabage Colletion)이 존재하기 때문에 RAII 기법이 필요하지 않지만, C++에서는 11 버전에 추가됐긴 하지만 GC를 구현한 컴파일러는 아직 없기 때문에 이러한 디자인 패턴을 사용하는 것입니다.
RAII 사용 예시 코드
#include <iostream>
#include <fstream>
#include <stdexcept>
class FileHandler {
public:
FileHandler(const std::string& filePath) {
file.open(filePath, std::ios::in); // 생성자에서 파일을 엽니다
if (!file.is_open()) {
throw std::runtime_error("Could not open file");
}
}
~FileHandler() {
if (file.is_open()) {
file.close(); // 소멸자에서 파일을 닫습니다
}
}
void readFile() {
std::string line;
while (std::getline(file, line)) {
std::cout << line << std::endl;
}
}
private:
std::ifstream file;
};
int main() {
try {
FileHandler fileHandler("example.txt");
fileHandler.readFile();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
} // fileHandler가 스코프를 벗어나면 자동으로 소멸되고 파일이 닫힘
return 0;
}
여기서 FileHandler fileHandelr가 스택에 생성되며, 스코프를 벗어날 때 자동으로 소멸됩니다.
~FileHandler() {
if (file.is_open()) {
file.close(); // 소멸자에서 파일을 닫습니다
}
}
코드 상 이 부분에 해당하는 부분입니다. fileHandler가 소멸 될 때 소멸자가 호출되어 열려 있던 파일이 닫히므로 명시적으로 close를 호출할 필요가 없어지는 것이죠.
RAII에 대한 부분은 여기까지 다루도록 하겠습니다!
'Coding > Algorithm' 카테고리의 다른 글
동적계획법 - DP (Dynamic Programming) 알고리즘 (0) | 2024.11.12 |
---|---|
[백준/C++] 7785번 unorderd_map 활용법 및 sort하는 법 /해시 / 회사에 있는 사람 - (1) (0) | 2024.08.13 |
[백준/C++] 1806번 부분합 /투 포인터/two_pointer - (1) (0) | 2024.08.09 |
[백준/C++] 2559번 수열 /투 포인터 알고리즘/ two_pointer - (1) (0) | 2024.08.09 |
[SWEA/C++] 1859 백만 장자 프로젝트 (0) | 2024.08.08 |