Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준
11강. Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준
이번 강의에서 해결할 문제
소멸자 하나를 직접 작성한 뒤 복사와 이동의 기본 동작을 그대로 두면 자원 관리 규칙이 어긋날 수 있습니다. 반대로 모든 클래스에 다섯 특별 멤버 함수를 기계적으로 작성하면 오류와 유지보수 비용이 늘어납니다.
학습 목표
먼저 알아야 할 핵심 개념
특별 멤버 함수는 소멸자, 복사 생성자, 복사 대입, 이동 생성자, 이동 대입을 포함합니다. raw 자원을 직접 관리해 소멸자·복사 중 하나가 필요하다면 관련 연산 전체를 검토해야 합니다. 가장 좋은 출발점은 표준 RAII 멤버만 조합해 아무것도 직접 작성하지 않는 Rule of Zero입니다.
왜 이 문제가 위험한가
소멸자만 직접 작성한 raw 포인터 소유 클래스는 기본 복사가 주소를 복사해 이중 해제를 만들 수 있습니다. 이동 연산에 기존 자원 정리나 원본 무효화가 빠지면 누수와 중복 소유가 생깁니다. = default도 의미를 검토한 뒤 의도를 명시할 때 사용해야 합니다.
가장 작은 예제로 시작하기
#include <string>
#include <utility>
#include <vector>
class TaskBatch {
public:
TaskBatch(std::string name, std::vector<int> priorities)
: name_{std::move(name)}, priorities_{std::move(priorities)} {}
const std::string& name() const { return name_; }
const std::vector<int>& priorities() const { return priorities_; }
private:
std::string name_;
std::vector<int> priorities_;
};
class FileLogger {
public:
FileLogger(const FileLogger&) = delete;
FileLogger& operator=(const FileLogger&) = delete;
FileLogger(FileLogger&&) noexcept = default;
FileLogger& operator=(FileLogger&&) noexcept = default;
};
코드 한 줄씩 이해하기
TaskBatch는 값 타입 멤버만 사용해 기본 복사·이동·소멸이 올바릅니다.- 특별 멤버 함수를 선언하지 않은 Rule of Zero 형태입니다.
- 파일 로거는 하나의 파일 자원을 두 객체가 독립 값처럼 복사한다는 의미가 자연스럽지 않습니다.
- 복사를
delete해 잘못된 사용을 컴파일 오류로 만듭니다. - 실제 멤버가 이동 가능할 때만 이동을 기본 제공해야 합니다.
실행 결과와 메모리·동작 흐름
TaskBatch 복사본은 독립된 문자열과 vector 값을 가집니다. FileLogger 복사를 시도하면 컴파일 단계에서 막힙니다. 실행 중 이중 해제를 발견하는 것보다 잘못된 소유 의미를 컴파일할 수 없게 만드는 편이 안전합니다.
단계별 실습
흔한 실수와 해결 방법
언제 사용하고 언제 피할까
값 타입은 Rule of Zero를 우선합니다. 고유 자원 핸들을 직접 감싸야 한다면 복사·이동·소멸 전체 정책을 결정합니다. 복제 의미가 도메인에 없으면 억지로 지원하지 않습니다.
게임 개발 연결
리소스 핸들, 작업 객체, 설정 데이터는 복사 의미가 다릅니다. 클래스 이름이 아니라 실제 자원과 책임을 보고 정책을 결정합니다.
이해 점검 질문 3개
- Rule of Zero가 직접 특별 멤버 함수를 작성하는 것보다 안전한 이유는 무엇인가요?
- 소멸자를 직접 작성했다면 복사·이동 정책도 검토해야 하는 이유는 무엇인가요?
- 복사 의미가 없는 타입에
= delete를 사용하면 어떤 오류를 앞당길 수 있나요?
핵심 요약
다음 강의 연결
12강. const 정확성에서 객체의 읽기와 수정을 API 계약으로 분리합니다.
Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.