RAII (Resource Acquisition Is Initialization) — C++ 리소스 관리의 핵심 철학

Bean·2025년 8월 12일

프로그래밍

목록 보기
22/46

1. RAII란 무엇인가?

RAII(Resource Acquisition Is Initialization)는 "자원 획득은 초기화"라는 철학을 담고 있는 C++의 리소스 관리 기법입니다.
핵심 아이디어는 리소스의 생명주기를 객체의 생명주기에 묶는 것입니다.

  • 자원 획득 (Acquisition) → 생성자에서 필요한 리소스(메모리, 파일 핸들, 뮤텍스 등)를 초기화
  • 자원 해제 (Release) → 소멸자에서 리소스를 자동으로 반환

이 구조 덕분에, 함수 종료나 예외 발생 여부와 관계없이 객체가 범위를 벗어나면 자동으로 리소스가 해제됩니다.


2. 왜 RAII가 필요한가?

C++은 가비지 컬렉터(GC)가 없기 때문에, 프로그래머가 직접 리소스를 해제해야 합니다.
하지만 다음과 같은 상황이 발생하면 문제가 됩니다.

void processFile() {
    FILE* fp = fopen("data.txt", "r");
    if (!fp) throw std::runtime_error("파일 열기 실패");
    
    // 중간에 예외 발생 가능
    throw std::runtime_error("처리 중 오류");
    
    fclose(fp); // 실행되지 않을 수 있음 → 파일 누수 발생
}

📌 RAII 적용 후

#include <fstream>

void processFile() {
    std::ifstream file("data.txt"); // 생성자에서 파일 열기
    if (!file) throw std::runtime_error("파일 열기 실패");

    // 중간에 예외 발생해도 소멸자가 자동으로 파일 닫음
}

RAII는 예외 안전성(Exception Safety)을 확보하는 가장 강력한 방법입니다.


3. RAII의 대표적인 활용 — 스마트 포인터

스마트 포인터(std::unique_ptr, std::shared_ptr)는 RAII의 대표적인 구현입니다.

#include <memory>

void process() {
    std::unique_ptr<int> ptr(new int(42)); // 생성자에서 메모리 획득
    // ptr 사용
} // 소멸자에서 delete 자동 호출

4. 스마트 포인터 외 RAII 활용 예시

  • 뮤텍스 락 관리: std::lock_guard, std::unique_lock
  • 파일·소켓 관리: std::ifstream, std::ofstream, 네트워크 소켓 래퍼 클래스
  • 그래픽 리소스 관리: OpenGL 텍스처, DirectX 버퍼 등
  • 임시 설정 관리: 함수 범위 동안만 활성화되는 환경 변수나 상태 값 변경

5. RAII의 장점과 단점

장점

  • 예외 안전성 확보
  • 메모리·리소스 누수 방지
  • 코드 간결화 (해제 코드 별도로 작성할 필요 없음)
  • 유지보수성 향상

단점

  • 객체 수명과 리소스 수명을 항상 일치시켜야 함
  • 잘못된 범위 관리 시, 의도보다 빨리 리소스가 해제될 수 있음
  • 초보자에게는 객체 설계와 초기화 규칙이 다소 어려울 수 있음

6. 마무리

RAII는 C++의 "리소스는 객체에 맡겨라"라는 철학을 가장 잘 구현한 기법입니다.
메모리뿐 아니라 파일, 네트워크, 락 등 다양한 리소스에 적용 가능하며,
특히 예외가 발생하더라도 안전하게 리소스를 정리할 수 있다는 점이 강력한 장점입니다.

💡 Tip: RAII를 잘 활용하면 try-catch 블록 안에서 직접 deleteclose를 호출하는 경우가 크게 줄어듭니다.

profile
AI developer

0개의 댓글