반응형
RAII란 무엇인가?
C++을 공부하다 보면 만나게 되는 개념인 RAII(Resource Acquisition Is Initialization)는 "자원 획득은 초기화다"라는 다소 난해한 이름을 가진 디자인 패턴이다. 하지만 핵심은 명확하다.
객체의 수명을 자원의 관리 도구로 활용하자.
RAII 발음하기에 따라서 알-에이-아이-아이 혹은 라이라고 읽는 이 패턴은 확실히 매번 마주칠 때마다 낯설고 어색하다. 이번 기회에 명확하게 한번 짚고 넘어가보도록 하자.
RAII의 핵심 원리
자원(메모리, 파일 핸들, 소켓, 뮤텍스 등)은 반드시 해제가 필요하다. RAII는 해제 절차를 객체의 소멸자에게 맡긴다. 즉 프로그래머가 명시적으로 해제하지 않아도 소멸자가 호출되면 자동으로 해당 자원이 해제되는 것이다.
- 획득(Acquisition) : 객체가 생성될 때 자원을 할당받는다.
- 소유(Ownership): 객체가 살아있는 동안 자원을 소유한다.
- 릴리즈(Release): 객체가 범위를 벗어나 소멸할 때(소멸자 호출 시) 자동으로 해당 자원을 해제한다.
왜 RAII을 사용해야 하나요?
RAII를 쓰지 않으면 개발자가 직접 delete나 close()를 호출해야 한다. 이때 발생할 수 있는 치명적인 실수들을 RAII가 방지해 준다.
- 메모리 누수 방지: 함수 중간에 return이 있더라도, 지역 객체가 소멸하면서 자원을 자동으로 반납한다.
- 예외 안전성: 예외가 발생하여 스택 풀기(Stack Unwinding)가 일어나도, 소멸자는 반드시 호출되므로 자원이 고립되지 않는다.
- 코드의 간결화: delete나 close()를 명시적으로 호출하지 않아도 되기 때문에 코드가 간결해진다.
RAII 예제 코드
#include <memory>
#include <mutex>
void raiiUsage() {
// 1. 스마트 포인터: 범위를 벗어나면 자동으로 delete 호출
std::unique_ptr<int[]> data(new int[100]);
// 2. 뮤텍스 락: 함수가 종료되거나 예외가 발생해도 자동으로 unlock
std::mutex m;
std::lock_guard<std::mutex> lock(m);
if (/* 어떤 조건 */) {
return; // 안전하게 자원 반납됨
}
} // 객체들이 소멸하며 자원 자동 해제
정리하자면
- RAII는 자원의 수명과 객체의 수명과 일치시켜 자원 관리를 편하게 만들어주는 디자인 패턴이다.
- 프로그래머가 신경 쓰지 않아도 객체가 소멸하면 해당 자원도 같이 소멸된다.
- std::unique_ptr, std::shared_ptr
- std::lock_guard, std::unique_lock
- std::vector, std::string 등에 RAII가 적용되어 있다.
함께 읽으면 좋은 글
C++ 스마트 포인터 unique_ptr에 대해서 알아보자
unique_ptr 객체는 스택(stack)에 살아요스마트 포인터인 unique_ptr로 생성한 객체 자체는 스택에 존재한다. 스택에 존재하면서 힙에 할당된 메모리를 관리한다. 이를 C++에서는 RAII(Resource Acquisition Is In
jettstream.tistory.com
'프로그래밍 > C++' 카테고리의 다른 글
| 상호배제란 무엇인가? (0) | 2026.02.01 |
|---|---|
| thread_local 키워드에 대해서 (0) | 2026.01.31 |
| C++ 임시 객체에 대해서 (0) | 2026.01.25 |
| unique_ptr vs shared_ptr 차이는 무엇인가? (0) | 2026.01.03 |
| C++ 스마트 포인터 unique_ptr에 대해서 알아보자 (0) | 2026.01.02 |
댓글