본문 바로가기
프로그래밍/C&C++

[C++]복사 생성자 이해하기: 이론부터 실전까지

by wyatti 2023. 7. 6.

C++ 복사 생성자에 대한 깊이 있는 이해를 제공합니다. 복사 생성자의 이론부터 실제 예제까지 단계별로 설명하여 C++ 프로그래밍에 대한 당신의 이해를 향상시킵니다.
C++ 복사 생성자 이해하기: 이론부터 실전까지

안녕하세요, 코드와 함께 세상을 바꾸는 프로그래머 여러분! 오늘은 C++ 프로그래밍의 핵심 개념 중 하나인 '복사 생성자'에 대해 알아보겠습니다. 복사 생성자는 객체 지향 프로그래밍에서 중요한 역할을 하며, 잘 이해하고 사용하면 프로그램의 성능과 안정성을 크게 향상시킬 수 있습니다.

 

 

복사 생성자란?

복사 생성자는 클래스의 객체를 생성할 때, 동일한 클래스의 다른 객체를 복사하는 생성자를 의미합니다. 기본적으로, C++ 컴파일러는 모든 클래스에 대해 기본 복사 생성자를 제공합니다. 그러나 이 기본 복사 생성자는 '얕은 복사'를 수행하며, 이는 동적으로 할당된 메모리가 있는 클래스에 대해 문제를 일으킬 수 있습니다. 그래서 때로는 복사 생성자를 직접 정의해야 합니다.

// 복사 생성자의 일반적인 형태
ClassName(const ClassName &old_obj);

 

 

 

얕은 복사 vs 깊은 복사

얕은 복사는 모든 멤버 변수를 비트 단위로 복사하는 것을 의미합니다. 이는 기본 데이터 타입에 대해 잘 작동하지만, 포인터 변수에 대해서는 문제를 일으킵니다. 깊은 복사는 포인터 변수에 대해 메모리를 새로 할당하고, 원본 객체의 값을 복사하여 이 문제를 해결합니다.

// 얕은 복사 예제
class ShallowCopy {
    int *ptr; // 포인터 변수
public:
    // 생성자
    ShallowCopy(int &p) {
        ptr = new int;
        *ptr = p;
    }

    // 복사 생성자 - 기본적인 복사 생성자를 사용
    // 이 경우에는 '얕은 복사'를 수행합니다.
    ShallowCopy(const ShallowCopy &s) {
        this->ptr = s.ptr;
    }
    ...
};

// 깊은 복사 예제
class DeepCopy {
    int *ptr; // 포인터 변수
public:
    // 생성자
    DeepCopy(int &p) {
        ptr = new int;
        *ptr = p;
    }

    // 복사 생성자 - 직접 정의한 복사 생성자입니다.
    // 이 경우에는 '깊은 복사'를 수행합니다.
    DeepCopy(const DeepCopy &d) {
        this->ptr = new int;
        *(this->ptr) = *(d.ptr);
    }
    ...
};

 

 

복사 생성자를 사용하는 경우

  • 함수의 인자로 객체가 값으로 전달될 때
  • 함수에서 객체를 값으로 반환할 때
  • 객체를 직접 초기화할 때

아래에 예제를 준비했습니다.

class Example {
    int x, y;

public:
    // 생성자
    Example(int x1, int y1) {
        x = x1;
        y = y1;
    }

    // 복사 생성자
    Example(const Example &e) {
        x = e.x;
        y = e.y;
    }

    // 데이터를 출력하는 함수
    void display() {
        cout << "x = " << x << ", y = " << y << endl;
    }
};

// 1. 함수의 인자로 객체가 값으로 전달될 때
void func(Example e) {
    e.display();
}

Example e1(10, 15); // 객체 생성
func(e1); // 복사 생성자 호출

// 2. 함수에서 객체를 값으로 반환할 때
Example func2() {
    Example e2(20, 25);
    return e2; // 복사 생성자 호출
}

Example e3 = func2(); // 복사 생성자 호출

// 3. 객체를 직접 초기화할 때
Example e4 = e1; // 복사 생성자 호출

 

 

정리

복사 생성자는 객체 지향 프로그래밍에서 중요한 기능입니다. C++의 기본 복사 생성자는 '얕은 복사'를 수행하므로, 동적으로 할당된 메모리가 있는 클래스에서는 '깊은 복사'를 수행하는 복사 생성자를 직접 정의해야 할 수 있습니다. 또한 복사 생성자는 함수의 인자로 객체가 값으로 전달될 때, 함수에서 객체를 값으로 반환할 때, 객체를 직접 초기화할 때 호출됩니다.

이렇게 복사 생성자에 대한 이해는 객체 지향 프로그래밍의 기본 원칙을 이해하고, 프로그램의 성능과 안정성을 향상시키는 데 중요한 역할을 합니다. 이 포스트가 여러분의 C++ 학습에 도움이 되길 바랍니다. 다음 포스트에서는 더 깊이 있는 주제를 다루도록 하겠습니다. 감사합니다!

댓글