공부/기타

복사 생성자와 이동 생성자의 개념 및 차이점

셩잇님 2023. 2. 1. 15:33
반응형

 

 

1. 복사 생성자의 개념

복사 생성자는 객체의 새 인스턴스를 기존 인스턴스의 복사본으로 만드는 객체 지향 프로그래밍의 특수 생성자입니다. 같은 클래스의 객체를 인자로 받아 같은 속성을 가진 새로운 객체를 생성하는 생성자입니다. 복사 생성자의 목적은 기존 객체의 복사본으로 새 객체를 만드는 방법을 제공하는 것입니다. 이는 기존 객체와 동일한 데이터를 사용하지만 메모리에서 다른 참조를 사용하여 새 객체를 생성하려는 경우에 유용합니다.

C#에서는 동일한 클래스의 인스턴스를 인수로 사용하는 생성자를 정의하고 해당 인스턴스의 데이터를 새 인스턴스로 복사하여 복사 생성자를 만들 수 있습니다. 다음은 C# 언어에서 복사 생성자의 예제입니다.

class Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    public Point(Point point)
    {
        X = point.X;
        Y = point.Y;
    }
}

Point p1 = new Point(1, 2);
Point p2 = new Point(p1);

Console.WriteLine("p1: ({0}, {1})", p1.X, p1.Y);
Console.WriteLine("p2: ({0}, {1})", p2.X, p2.Y);

 

위 예제에서 Point에는 두 개의 생성자가 있습니다. 첫 번째 생성자는 두 개의 정수를 인수로 사용하고 두 번째 생성자는 Point의 인스턴스를 인수로 사용하여 동일한 데이터를 인수로 사용하여 Point의 새 인스턴스를 만듭니다.

 

2. 이동 생성자의 개념

이동 생성자는 객체 소유권을 한 인스턴스에서 다른 인스턴스로 이전하는 C++ 프로그래밍의 특수 생성자입니다. 원본 객체의 리소스를 복사하는 대신 "도용"하여 rvalue(임시 객체)에서 객체를 구성하는 데 사용됩니다. 이동 생성자를 사용하면 기존 객체에서 새 객체를 만들 수 있지만 객체 데이터의 새 복사본을 만드는 대신 원래 객체의 데이터 소유권을 새 객체로 이전합니다. 결과적으로 구성 시간이 빨라지고 메모리 사용량을 줄이는 데 도움이 될 수 있습니다.

이동 생성자는 const 참조나 포인터가 아닌 rvalue 참조를 인수로 사용하는 생성자로 정의됩니다. 일반적으로 인수를 rvalue 참조로 캐스팅하기 위해 std::move 호출로 정의됩니다. 다음은 C++ 언어에서의 이동 생성자 예입니다.

#include <iostream>
#include <utility>

class Point
{
public:
    int X;
    int Y;

    Point(int x, int y) : X(x), Y(y) {}

    Point(Point&& other)
    {
        X = other.X;
        Y = other.Y;
        other.X = 0;
        other.Y = 0;
    }
};

int main()
{
    Point p1(1, 2);
    Point p2(std::move(p1));

    std::cout << "p1: (" << p1.X << ", " << p1.Y << ")" << std::endl;
    std::cout << "p2: (" << p2.X << ", " << p2.Y << ")" << std::endl;

    return 0;
}

 

이 예제에서 이동 생성자는 Point(Point&& other)로 정의됩니다. 생성자의 인수 유형에 있는 && 구문은 rvalue 참조를 사용하고 std::move 호출이 p1을 rvalue로 캐스팅하여 이동 생성자에 전달할 수 있음을 나타냅니다. 이동 생성자가 호출되면 p1 데이터의 소유권을 p2로 이전하여 p1을 정의되지 않은 상태로 둡니다.

 

3. 복사 생성자와 이동 생성자의 차이점

복사 생성자와 이동 생성자의 차이점은 새 객체를 만들 때 원래 객체의 데이터를 처리하는 방법에 있습니다.

복사 생성자 :
1. 복사 생성자는 원래 객체 데이터의 별도 복사본을 사용하여 새 객체를 만듭니다.
2. 원본 객체의 전체 복사본을 만드는 데 사용됩니다. 즉, 새 객체에 대한 변경 사항이 원래 객체에 영향을 주지 않습니다.
3. 복사 생성자는 객체가 값으로 전달되거나 새 객체에 할당될 때 호출됩니다.
4. 원래 객체에서 새 객체로 모든 데이터를 복사해야 하므로 속도가 느릴 수 있습니다.


이동 생성자 :
1. 이동 생성자는 원래 객체 데이터의 소유권을 새 객체로 이전합니다.
2. 임시 또는 rvalue 객체에서 새 객체를 만드는 데 사용됩니다.
3. 이동 생성자는 객체가 rvalue 참조로 전달되거나 RVO(반환 값 최적화)가 사용될 때 호출됩니다.
4. 데이터를 복사하지 않고 대신 원본 객체에서 데이터를 훔치기 때문에 복사 생성자보다 빠릅니다.

 

4. 결론

일반적으로 복사 생성자는 원래 객체 데이터의 별도 복사본으로 새 객체를 만들려는 경우에 사용되는 반면, 이동 생성자는 원래 객체 데이터의 소유권을 새 객체로 이전하려는 경우에 사용됩니다. 복사 생성자와 이동 생성자 간의 선택은 특정 사용 사례와 원하는 동작에 따라 다릅니다.

 

 

 

반응형