C++ 프로그래밍에서 복사 생성자(Copy Constructor)와 대입 연산자(Assignment Operator)는 모두 객체를 복사하는 데 사용되지만, 동작 방식과 사용 시점에 중요한 차이가 있습니다. 이 글에서는 두 개념의 차이점을 명확하게 정리해 드립니다.
복사 생성자(Copy Constructor)란?
- 복사 생성자는 오버로드된 생성자의 한 종류입니다.
- 이미 존재하는 객체의 데이터나 값을 사용하여 새로운 객체를 초기화합니다.
- 기존 객체를 기반으로 새로운 객체를 생성할 때 사용됩니다.
- 원본 객체와 복사된 객체는 각각 서로 다른 메모리 위치에 저장됩니다.
- 클래스 내부에 복사 생성자가 정의되어 있지 않으면, 컴파일러가 자동으로 기본 복사 생성자를 제공합니다.
대입 연산자(Assignment Operator)란?
- 대입 연산자(=)는 말 그대로 연산자(operator)입니다.
- 한 객체의 값을 다른 객체에 할당하며, 이때 두 객체는 모두 이미 존재하고 있는 상태여야 합니다.
- 기존 객체를 이미 생성된 다른 객체에 대입할 필요가 있을 때 사용됩니다.
- 객체 자체는 단일 메모리 위치에 저장됩니다.
- 하지만 여러 개의 참조 변수(reference variable)가 해당 메모리 위치를 가리킬 수 있습니다.
- 대입 연산자를 오버로드하지 않으면, 컴파일러는 기본적으로 비트 단위 복사(bitwise copy)를 수행합니다.
핵심 차이점 요약
가장 큰 차이는 사용 시점입니다. 복사 생성자는 새로운 객체가 생성되는 순간 호출되어 초기화를 담당하는 반면, 대입 연산자는 이미 존재하는 두 객체 사이에서 값을 복사할 때 호출됩니다. 또한 복사 생성자는 새로운 메모리 공간을 확보하는 반면, 대입 연산자는 기존 메모리 위치를 참조한다는 점도 기억해야 합니다. 얕은 복사(shallow copy)로 인한 문제를 방지하려면, 동적 메모리를 사용하는 클래스에서는 두 함수를 모두 직접 정의하는 것이 좋습니다.