복사 생성자와 복사 대입: 객체를 복사할 때 실제로 일어나는 일
9강. 복사 생성자와 복사 대입: 객체를 복사할 때 실제로 일어나는 일
이번 강의에서 해결할 문제
Task copy = original;은 단순해 보이지만 클래스가 raw 자원을 소유하면 기본 멤버 복사가 주소만 복사할 수 있습니다. 두 객체가 같은 자원을 소유한다고 믿으면 수정이 서로 새고 파괴 시 이중 해제가 생깁니다.
학습 목표
먼저 알아야 할 핵심 개념
복사 생성자는 새 객체를 기존 객체로 초기화할 때, 복사 대입은 이미 존재하는 객체의 값을 바꿀 때 사용됩니다. std::string, std::vector 같은 값 타입 멤버는 기본 복사가 각 객체의 독립 값 의미를 유지합니다. raw 소유 포인터가 있으면 별도의 깊은 복사나 복사 금지가 필요하지만, 먼저 RAII 멤버로 바꿔 Rule of Zero를 노립니다.
왜 이 문제가 위험한가
raw 주소의 얕은 복사는 두 객체가 하나의 저장소를 가리키게 합니다. 한 객체가 정리하면 다른 객체는 댕글링이 되고 둘 다 정리하면 이중 해제입니다. 직접 복사 대입을 작성할 때 기존 자원을 먼저 지운 뒤 새 할당이 실패하면 객체가 손상될 수도 있습니다.
가장 작은 예제로 시작하기
#include <iostream>
#include <string>
#include <utility>
#include <vector>
struct Task {
std::string name;
std::vector<std::string> tags;
};
int main() {
Task original{"build", {"cpp", "debug"}};
Task copy = original; // 복사 생성
copy.name = "package";
copy.tags.push_back("release");
Task assigned{"empty", {}};
assigned = original; // 복사 대입
std::cout << original.name << ':' << original.tags.size() << '\n';
std::cout << copy.name << ':' << copy.tags.size() << '\n';
std::cout << assigned.name << ':' << assigned.tags.size() << '\n';
}
코드 한 줄씩 이해하기
Task copy = original은 새 객체를 만들어 복사 생성합니다.string과vector가 값 의미를 제공하므로copy의 변경은original을 바꾸지 않습니다.assigned는 이미 생성된 객체라operator=경로를 사용합니다.- 특별 멤버 함수를 직접 작성하지 않아도 멤버들이 안전한 복사를 제공합니다.
- 이것이 Rule of Zero로 가는 기본 형태입니다.
실행 결과와 메모리·동작 흐름
예상 출력은 build:2, package:3, build:2입니다. 세 객체는 논리적으로 독립된 문자열과 태그 목록을 가집니다. 구현 내부에서 최적화나 공유가 있더라도 공개 값 의미는 한 복사본의 수정이 다른 복사본에 새지 않아야 합니다.
단계별 실습
흔한 실수와 해결 방법
언제 사용하고 언제 피할까
설정, 작업, 좌표처럼 독립 값으로 자연스러운 타입은 복사를 지원합니다. 파일 핸들, mutex, 단일 소유 객체처럼 복사 의미가 없거나 위험한 타입은 복사를 삭제하고 이동 또는 명시적 복제 함수를 설계합니다.
게임 개발 연결
명령·설정 데이터는 값 복사가 자연스럽지만 파일, 렌더 자원, 네트워크 연결 같은 핸들은 복사 의미를 신중히 정해야 합니다.
이해 점검 질문 3개
- 복사 생성자와 복사 대입은 객체 존재 상태에서 어떻게 다른가요?
- raw 소유 포인터의 얕은 복사가 이중 해제를 만드는 흐름은 무엇인가요?
string과vector멤버만 가진 타입이 Rule of Zero를 얻는 이유는 무엇인가요?
핵심 요약
다음 강의 연결
10강. 이동 의미론에서 복사하기 비싼 자원을 새 소유자로 넘기는 과정을 살펴봅니다.
복사 생성자와 복사 대입: 객체를 복사할 때 실제로 일어나는 일 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.