C++에서 객체를 초기화하는 방식 중 대표적인 것이 복사 초기화(Copy Initialization)와 직접 초기화(Direct Initialization)입니다. 복사 초기화는 복사 생성자(copy constructor)의 개념을 활용합니다. 생성자는 객체를 초기화하기 위해 사용되는 특수한 멤버 함수로, 필요하다면 개발자가 직접 복사 생성자를 정의하여 다른 객체의 값을 복사해 현재 객체를 초기화할 수 있습니다. 반면 직접 초기화는 대입 연산자(assignment operation)를 이용해 수행할 수 있습니다.
두 초기화 방식의 가장 큰 차이는 메모리 처리 방식에 있습니다. 복사 초기화는 새로운 객체를 위해 별도의 메모리 블록을 생성하지만, 직접 초기화는 새로운 메모리 공간을 만들지 않고 참조 변수가 기존 메모리 블록을 가리키도록 합니다.
복사 생성자(복사 초기화) 문법
classname(const classname &obj) {
// 생성자 본문
}복사 생성자는 같은 클래스 타입의 객체에 대한 const 참조를 매개변수로 받습니다. 이를 통해 기존 객체의 멤버 값들을 새로운 객체에 그대로 복사할 수 있습니다.
직접 초기화(대입 연산자) 문법
classname Ob1, Ob2; Ob2 = Ob1;
위 코드는 먼저 두 객체를 선언한 뒤, 대입 연산자를 사용해 Ob1의 값을 Ob2에 대입하는 예시입니다.
그럼 복사 초기화와 직접 초기화의 세부적인 차이점을 표를 통해 살펴보겠습니다.
| 복사 초기화 | 직접 초기화 |
|---|---|
| 기본적으로 오버로드된 생성자입니다. | 대입 연산자를 사용하여 수행할 수 있습니다. |
| 새로운 객체를 이미 존재하는 객체로 초기화합니다. | 이미 존재하는 두 객체 사이에 한 객체의 값을 다른 객체에 대입합니다. |
| 기존 객체를 바탕으로 새로운 객체를 생성할 때 사용됩니다. | 기존 객체의 값을 다른 객체에 대입하고자 할 때 사용됩니다. |
| 두 객체는 각각 별개의 메모리 위치를 사용합니다. | 하나의 메모리 위치를 사용하며, 서로 다른 참조 변수들이 같은 위치를 가리킵니다. |
| 클래스에 복사 생성자가 정의되어 있지 않으면 컴파일러가 자동으로 하나를 제공합니다. | 대입 연산자가 오버로드되지 않았다면 비트 단위 복사(bitwise copy)가 수행됩니다. |
참고: 표준 C++ 용어와의 차이
엄밀히 말하면 표준 C++에서 '직접 초기화(direct initialization)'는 classname Ob2(Ob1);처럼 괄호와 인수를 사용하는 초기화 구문을 의미하며, Ob2 = Ob1;과 같은 대입은 '복사 대입(copy assignment)'으로 분류됩니다. 또한 classname Ob2 = Ob1; 형태가 표준 용어에서 말하는 '복사 초기화'에 해당합니다. 이 글은 원문의 맥락에 따라 대입 연산자를 활용한 방식을 '직접 초기화'로 지칭하여 두 개념을 비교하고 있습니다.