객체 복사를 막는 방법

mingu Lee·2025년 12월 4일

CS

목록 보기
9/21

객체 복사를 막는 방법


1. 복사 생성자와 복사 대입 연산자를 delete 처리

C++11 이후 가장 표준적이고 명확한 방법이다.

class MyClass
{
public:
    MyClass() = default;

    MyClass(const MyClass&) = delete;            // 복사 생성 금지
    MyClass& operator=(const MyClass&) = delete; // 복사 대입 금지
};

2. 복사 생성자/대입 연산자를 private으로 선언하고 정의하지 않기 (구식 방법)


C++11 이전 방식이며, 외부에서 복사가 불가능하지만 내부 friend 함수는 접근 가능하다.

class MyClass
{
private:
    MyClass(const MyClass&);
    MyClass& operator=(const MyClass&);
};

3. 객체를 아예 이동 전용으로 만들기 (move-only 타입)


스마트 포인터(unique_ptr) 방식처럼 복사는 막고 이동만 허용하는 패턴이다.

class MyClass
{
public:
    MyClass() = default;

    MyClass(const MyClass&) = delete;
    MyClass& operator=(const MyClass&) = delete;

    MyClass(MyClass&&) noexcept = default;           // 이동 허용
    MyClass& operator=(MyClass&&) noexcept = default;
};

리소스를 소유하는 클래스에서 자주 사용된다.

4. Singleton 패턴처럼 생성자를 private으로 숨기기


이 경우 내부에서 복사가 발생할 가능성이 있으므로 복사 자체는 delete를 같이 선언하여 막는 것이 필수이다.

class Singleton
{
private:
    Singleton() {}
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

왜 객체 복사를 막는가?


1. 리소스의 중복 소유를 막기 위해


파일 핸들, 소켓, 스레드 핸들, 메모리 버퍼 등은 하나의 객체만 소유해야 안전하게 관리된다.

예를 들어, 파일 핸들을 두 객체가 동시에 close 하는 경우 이중 해제의 위험이 존재하기 때문이다.

2. RAII 기반 클래스에서 리소스 누수 방지


unique_ptr 같은 move-only 객체가 대표적이다.

  • 복사를 하면 같은 포인터를 두 객체가 소유하게 되어 위험
  • 그래서 이동만 허용하고 복사는 금지

3. 복사 비용이 매우 큰 객체의 무분별한 복사 방지


  • 대규모 메모리 버퍼
  • 게임 엔진의 리소스(메시, 텍스처 관리 객체)
  • 네트워크/IO 관련 heavy 객체

이런 객체가 실수로 복사되면 성능에 큰 문제가 생긴다.

4. 객체의 논리적 의미가 '복사가 불가능한 경우'


  • 싱글톤: 복사되면 싱글톤이 아님
  • 뮤텍스: 복사 불가능
  • 파일 스트림
  • std::thread: thread는 복사 불가능, 이동만 가능

이런 클래스는 복사 자체가 개념적으로 틀리다.

profile
Github: https://github.com/dlalsrn

0개의 댓글