[C++] 얕은 복사 vs 깊은 복사

2025. 6. 12. 20:46·C++

1. 얕은 복사

얕은 복사(Shallow Copy)는 클래스 내의 포인터 멤버를 복사할 때, 포인터가 가리키는 데이터가 아니라 포인터가 저장하고 있는 주소값만 복사하는 것을 의미한다.

즉, 두 객체가 동일한 동적 메모리 영역을 가리키게 된다. 얕은 복사를 수행한 후 원본 객체가 메모리를 해제하면, 복사된 객체의 포인터는 해제된 메모리 영역을 가리키게 된다. 따라서 dangling pointer가 발생할 가능성이 존재한다.

아래 그림은 얕은 복사 시, 객체 내 멤버 변수 중 포인터가 어떻게 변하는지를 나타낸 그림과 코드이다.

얕은 복사

#include <iostream>
using namespace std;

int main() {
    // 포인터 A가 동적 메모리를 할당하고 값을 30으로 설정
    int* A = new int(30);

    // 포인터 B가 A가 가리키는 메모리를 공유
    int* B = A;

    cout << "A의 값: " << *A << endl; // 출력: 30
    cout << "B의 값: " << *B << endl; // 출력: 30

    // A가 동적 메모리를 해제
    delete A;

    // 이제 B는 Dangling Pointer(해제된 메모리를 가리키는 포인터)
    // 이 시점에서 B를 통해 접근하면 Undefined Behavior 발생
    cout << "B의 값 (dangling): " << *B << endl; // 위험: 정의되지 않은 동작

    return 0;
}

 

2. 깊은 복사

깊은 복사(Deep Copy)는 클래스의 포인터 멤버가 가리키는 동적 데이터를 새롭게 할당된 독립적인 메모리 영역에 복제하는 것을 의미한다. 

따라서 원본 객체와 복사된 객체는 서로 독립적인 메모리 공간을 소유하며, dangling pointer가 발생하지 않는다.

아래 그림은 깊은 복사 시, 객체 내 멤버 변수 중 포인터가 어떻게 변하는지를 나타낸 그림과 코드이다.

#include <iostream>
using namespace std;

int main() {
    // 포인터 A가 동적 메모리를 할당하고 값을 30으로 설정
    int* A = new int(30);

    // 포인터 B가 A가 가리키는 값을 복사 (깊은 복사)
    int* B = new int(*A);

    cout << "A의 값: " << *A << endl; // 출력: 30
    cout << "B의 값: " << *B << endl; // 출력: 30

    // A가 동적 메모리를 해제
    delete A;

    // B는 여전히 독립적으로 자신의 메모리를 관리
    cout << "B의 값 (깊은 복사 후): " << *B << endl; // 출력: 30

    // B의 메모리도 해제
    delete B;

    return 0;
}

'C++' 카테고리의 다른 글

[C++] 콘솔 텍스트에 색상을 적용시키는 2가지 방법  (0) 2025.06.25
[C++] System() 함수 - "cls" , "pause"  (0) 2025.06.13
[C++] 스마트 포인터(Smart Pointer) 개념 정리  (0) 2025.06.12
[C++] 헤더파일 중복방지 #Pragma once vs #ifndef ~ endif  (0) 2025.06.10
[C++] 깔끔한 코드 작성법 - 헤더파일과 소스파일을 나누는 이유  (0) 2025.06.05
'C++' 카테고리의 다른 글
  • [C++] 콘솔 텍스트에 색상을 적용시키는 2가지 방법
  • [C++] System() 함수 - "cls" , "pause"
  • [C++] 스마트 포인터(Smart Pointer) 개념 정리
  • [C++] 헤더파일 중복방지 #Pragma once vs #ifndef ~ endif
_Bin_
_Bin_
  • _Bin_
    빈코드 (이전중)
    _Bin_
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 전체보기 (75)
      • C++ (8)
      • Unreal Engine (11)
      • Algorithm (6)
      • 컴퓨터지식(CS) (3)
      • 코딩테스트 (45)
      • 팀프로젝트 (1)
      • 기술면접 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    내일배움캠프
    AVL Tree
    프로그래머스
    CS
    Red-Black Tree
    코딩테스트
    SOLID원칙
    class
    struct
    프로그래밍
    Algorithm
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
_Bin_
[C++] 얕은 복사 vs 깊은 복사
글쓰기상단으로

티스토리툴바