본문으로 건너뛰기
모던 C++LESSON 17

RAII 맛보기: 자원이 자동으로 정리되는 이유

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

17강. RAII 맛보기: 자원이 자동으로 정리되는 이유

이번 강의에서 해결할 문제​

파일을 연 뒤 여러 반환 경로마다 닫기 코드를 직접 쓰면 한 경로에서 정리를 빠뜨리기 쉽습니다. 메모리뿐 아니라 파일, 잠금, 소켓도 획득과 해제가 짝을 이루어야 합니다.

학습 목표​

  • RAII가 자원 수명과 객체 수명을 묶는 원칙임을 설명합니다.
  • 생성자와 소멸자의 실행 순서를 출력으로 확인합니다.
  • 수동 open·close 호출이 흩어진 구조와 비교합니다.

먼저 알아야 할 핵심 개념​

RAII는 Resource Acquisition Is Initialization의 약자입니다. 객체가 생성될 때 자원을 사용할 수 있는 상태로 만들고, 객체가 범위를 벗어나 파괴될 때 소멸자가 자원을 정리합니다. C++의 스택 되감기 덕분에 조기 반환과 예외에서도 이미 생성된 지역 객체의 소멸자가 호출됩니다.

가장 작은 실행 가능한 예제​

raii_session.cpp
#include <iostream>

class ScopedSession {
public:
ScopedSession() {
std::cout << "open\n";
}

~ScopedSession() {
std::cout << "close\n";
}

void use() const {
std::cout << "use\n";
}
};

int main() {
ScopedSession session;
session.use();
}

핵심 코드 줄별 설명​

  1. 객체 생성과 동시에 세션이 사용 가능한 상태가 됩니다.
  2. 소멸자는 반환값이 없고 객체가 파괴될 때 자동 호출됩니다.
  3. use는 세션 객체가 존재하는 동안만 호출합니다.
  4. main 범위가 끝나면 별도 close() 호출 없이 정리됩니다.
  5. 실제 클래스는 획득 실패를 생성자나 팩토리 결과로 명확히 알려야 합니다.

실행 결과와 값 변화​

open
use
close

session.use() 앞에서 별도 블록을 만들면 close 시점도 그 블록 끝으로 당겨집니다. 범위가 자원 수명을 눈에 보이게 합니다.

단계별 실습​

실습 목표​

로그 세션의 시작과 종료가 모든 경로에서 짝을 이루게 합니다.

시작 전 상태와 실행 방법​

예제를 복사하고 runTask(bool canRun) 함수를 추가합니다.

1단계: 최소 코드 작성​

함수 안에 ScopedSession을 만들고 정상 경로를 실행합니다.

2단계: 값 또는 조건을 바꿔 결과 비교​

canRun이 false면 중간에 반환하고도 close가 출력되는지 확인합니다.

3단계: 작은 기능 확장​

생성자에 세션 이름을 받아 열기와 닫기 로그에 표시합니다.

4단계: 스스로 해결하기​

복사된 두 객체가 같은 자원을 두 번 닫지 않도록 복사를 금지할지, 공유 모델을 만들지 판단하세요.

막혔을 때​

소멸자를 직접 호출하지 않습니다. 자원 수명을 줄이고 싶다면 별도 중괄호 블록으로 객체 범위를 제한합니다. 생성자에서 획득이 실패했는데도 반쯤 유효한 객체가 남지 않게 설계합니다.

흔한 실수와 해결 방법​

  • RAII를 메모리에만 적용: 파일 스트림, mutex 잠금, 소켓도 같은 원칙을 사용합니다.
  • 소멸자에서 실패를 던짐: 스택 되감기 중 예외가 겹치지 않도록 소멸자 정리는 실패를 외부로 던지지 않는 방향이 일반적입니다.
  • 수동 close와 자동 정리를 섞음: 단일 책임 객체가 한 번만 정리하도록 계약을 통일합니다.

게임 개발 연결​

파일 저장, 프로파일링 구간, 렌더링 상태 잠금처럼 시작과 종료가 반드시 짝을 이루는 작업에 적용됩니다. 엔진 객체는 별도 수명 시스템을 사용할 수 있지만 지역 잠금과 표준 자원은 여전히 RAII가 유용합니다.

이해 점검 질문 3개​

  1. RAII가 조기 반환에서 정리 누락을 줄이는 이유는 무엇인가요?
  2. 객체 범위와 자원 수명은 어떤 관계인가요?
  3. 소멸자에서 예외를 던지는 설계가 위험한 이유는 무엇인가요?

핵심 요약​

RAII는 자원 획득·사용·정리를 객체의 유효한 수명에 묶습니다. 정리 호출을 기억하는 대신 범위가 끝나면 자동으로 실행되는 언어 규칙을 사용합니다.

다음 강의 연결​

18강. unique_ptr 입문에서 동적 객체의 단일 소유권과 삭제를 표준 RAII 타입에 맡깁니다.

MINI QUIZ

RAII 맛보기: 자원이 자동으로 정리되는 이유 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“RAII 맛보기: 자원이 자동으로 정리되는 이유”에서 오류나 데이터 손실을 줄이는 선택은 무엇인가요?
  2. 문제 2‘소멸자에서 실패를 던짐’ 실수를 판단할 때 “RAII 맛보기: 자원이 자동으로 정리되는 이유” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

17강. RAII 맛보기: 자원이 자동으로 정리되는 이유 미완료 상태