C++의 RAII와 자동 자원 해제
이 레슨에서는 C에서 파일을 안전하게 닫는 방법과, 자원이 자동으로 해제되는 C++의 RAII 기법을 비교합니다.
소개
RAII(Resource Acquisition Is Initialization)는 파일, 메모리 영역, 연결 같은 자원의 수명을 객체의 수명에 묶는 기법입니다. 객체가 소멸하면 블록을 어떤 식으로 빠져나가든, 예외가 발생하더라도 자원이 자동으로 해제됩니다.
핵심 정리
- C++의 추상화를 배우기 전에 C에서는 어떻게 하는지 이해하세요.
- 자원의 소유권은 RAII와 값 의미론(value semantics)으로 표현하세요.
- 매크로와 타입 변환보다 C++의 타입 안전한 도구를 쓰세요.
C와 C++ 코드 예제
C
main.c
#include <stdio.h>
int main(void) {
int result = 1;
FILE *file = fopen("scores.txt", "w");
if (!file) goto cleanup;
if (fputs("Ada 95\n", file) < 0) goto cleanup;
result = 0;
cleanup:
if (file) fclose(file);
puts(result ? "failed" : "saved");
return result;
}
saved
C++
main.cpp
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("scores.txt");
if (!file) return 1;
file << "Ada 95\n";
std::cout << "saved\n";
}
saved
C와 C++ 비교
C 프로그램은 cleanup 레이블과 goto 문을 써서 성공이든 오류든 모든 경로가 파일을 닫는 fclose를 거치게 합니다. C++에서는 변수 file이 범위를 벗어날 때 std::ofstream이 소멸자(destructor)에서 파일을 닫습니다. 그래서 자원 관리가 더 깔끔해지고 해제를 잊을 위험이 줄어듭니다.
C
C는 이름 짓기 관례, 콜백, 매크로, 컨텍스트 struct를 씁니다.
C++
C++는 범위가 분명하고 타입 안전하며, 보통 실행 시 추가 비용이 없는 추상화를 제공합니다.
연습 문제
두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.
- 먼저 C로 동작 원리를 작성한 다음 C++의 같은 기능을 써 보세요.
- 직접 하던 자원 해제를 RAII로 바꿔 보세요.
- 그 기능이 메모리 할당이나 가상 함수 호출을 일으키는지 확인해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
모든 챌린지