본문으로 건너뛰기
모던 C++ 심화LESSON 11

Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준

난이도중급 → 심화
예상 시간70분
선수지식이전 강의

11강. Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준

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

소멸자 하나를 직접 작성한 뒤 복사와 이동의 기본 동작을 그대로 두면 자원 관리 규칙이 어긋날 수 있습니다. 반대로 모든 클래스에 다섯 특별 멤버 함수를 기계적으로 작성하면 오류와 유지보수 비용이 늘어납니다.

학습 목표​

먼저 알아야 할 핵심 개념​

특별 멤버 함수는 소멸자, 복사 생성자, 복사 대입, 이동 생성자, 이동 대입을 포함합니다. raw 자원을 직접 관리해 소멸자·복사 중 하나가 필요하다면 관련 연산 전체를 검토해야 합니다. 가장 좋은 출발점은 표준 RAII 멤버만 조합해 아무것도 직접 작성하지 않는 Rule of Zero입니다.

왜 이 문제가 위험한가​

소멸자만 직접 작성한 raw 포인터 소유 클래스는 기본 복사가 주소를 복사해 이중 해제를 만들 수 있습니다. 이동 연산에 기존 자원 정리나 원본 무효화가 빠지면 누수와 중복 소유가 생깁니다. = default도 의미를 검토한 뒤 의도를 명시할 때 사용해야 합니다.

가장 작은 예제로 시작하기​

rule_of_zero.cpp
#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;
};

코드 한 줄씩 이해하기​

  1. TaskBatch는 값 타입 멤버만 사용해 기본 복사·이동·소멸이 올바릅니다.
  2. 특별 멤버 함수를 선언하지 않은 Rule of Zero 형태입니다.
  3. 파일 로거는 하나의 파일 자원을 두 객체가 독립 값처럼 복사한다는 의미가 자연스럽지 않습니다.
  4. 복사를 delete해 잘못된 사용을 컴파일 오류로 만듭니다.
  5. 실제 멤버가 이동 가능할 때만 이동을 기본 제공해야 합니다.

실행 결과와 메모리·동작 흐름​

TaskBatch 복사본은 독립된 문자열과 vector 값을 가집니다. FileLogger 복사를 시도하면 컴파일 단계에서 막힙니다. 실행 중 이중 해제를 발견하는 것보다 잘못된 소유 의미를 컴파일할 수 없게 만드는 편이 안전합니다.

단계별 실습​

흔한 실수와 해결 방법​

언제 사용하고 언제 피할까​

값 타입은 Rule of Zero를 우선합니다. 고유 자원 핸들을 직접 감싸야 한다면 복사·이동·소멸 전체 정책을 결정합니다. 복제 의미가 도메인에 없으면 억지로 지원하지 않습니다.

게임 개발 연결​

리소스 핸들, 작업 객체, 설정 데이터는 복사 의미가 다릅니다. 클래스 이름이 아니라 실제 자원과 책임을 보고 정책을 결정합니다.

이해 점검 질문 3개​

  1. Rule of Zero가 직접 특별 멤버 함수를 작성하는 것보다 안전한 이유는 무엇인가요?
  2. 소멸자를 직접 작성했다면 복사·이동 정책도 검토해야 하는 이유는 무엇인가요?
  3. 복사 의미가 없는 타입에 = delete를 사용하면 어떤 오류를 앞당길 수 있나요?

핵심 요약​

다음 강의 연결​

12강. const 정확성에서 객체의 읽기와 수정을 API 계약으로 분리합니다.

MINI QUIZ

Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준 미니 퀴즈

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

0 / 2
  1. 문제 1“Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준”의 역할과 의존성을 판단하는 올바른 기준은 무엇인가요?
  2. 문제 2“Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준”의 작업 기준으로 ‘이동에 무조건 noexcept 누락’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

11강. Rule of Zero·Three·Five: 특별 멤버 함수 설계 기준 미완료 상태