I'm FanJae.
[20260430] C# 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) 본문
1. 얕은 복사 / Shallow Copy
- 배열이나 클래스와 같은 것을 복사할 경우, 위에서 다룬 것처럼 객체의 참조를 복사한다.
int [] a = {1,2,3};
int [] b = a;

- 이처럼, 객체의 참조만 복사하는 것을 얕은 복사라고 한다.
- C++ 의 경우 포인터를 소유하고 있을 때, 복사 생성자나 대입 연산자를 제대로 만들지 않을 경우, 포인터의 이중 해제(Dangling Pointer) 관련 문제가 있지만, C# 의 경우 GC(Garbage Collector)가 이를 관리하기 때문에 값을 공유하는 문제만 신경을 써도 괜찮아 보인다.
2. 깊은 복사 / Shallow Copy
- 일반적인 값 형식 자료형은 대입 시 값 자체가 복사된다. 따라서 내부에 참조형 필드가 없는 경우,에는 깊은 복사와 유사하게, 복사본을 수정해도 원본에 영향을 주지 않는다.
- C#에서도 객체의 깊은 복사 구현은 가능한 것으로 보인다. (단, 일반적으로 사용하는가에 대해서는 더 알아봐야 할 것 같다.)
1) 값 형식의 복사
- 일반적으로 값 형식 자료형의 경우 대입 연산을 진행할 경우, 복사본이 만들어지는 형태의 복사가 일어난다.
- 처음 valueType1 선언된 이후, valueType2 에 valueType1의 값을 복사하여 넣는다.

- 이후 아래 코드가 실행되었을때 2번째 이미지와 같은 동작이 일어난다.
valueType2.value = 20; // 값을 대입해도 원본에는 영향이 없음
2) 객체의 깊은 복사
① 객체의 얇은 복사
class RefType
{
public int value;
}
static void Main()
{
RefType original = new RefType() { value = 1 };
RefType shallowCopy = original;
}
- 예제는 얕은 복사가 일어난다. shallowCopy가 original 의 참조값을 받아온다.

- 두 개가 바라보고 있는 객체가 동일해지는 형태가 되는 것이다.
② 객체의 깊은 복사 (클래스의 필드 값 복사)
class RefType
{
public int value;
}
static void Main()
{
RefType original = new RefType() { value = 1 };
RefType deepCopy = new RefType();
deepCopy.value = original.value;
}
- 예제에서는 깊은 복사가 일어난다. deepCopy 에 새로운 인스턴스를 생성했기 때문이다.
deepCopy.value = original.value;

- 이처럼, original과 depCopy가 서로 독립적인 참조를 가리키고 있다.
③ 객체의 깊은 복사 관련 유의사항
class RefType
{
public int value;
}
static void Main()
{
RefType original = new RefType() { value = 3 };
RefType deepCopy = new RefType();
deepCopy = original;
deepCopy.value = 5;
Console.WriteLine(original.value); // 5
}
- deepCopy에 객체를 생성한 이후, 대입 연산을 진행한다고 하더라도 original 의 복사본이 전달되는 것이 아닌 참조가 전달되는 것에 유의해야한다.
- deepCopy = original 이 일어나는 순간 아래와 같은 형태로 바뀌게 되는 것이다.

deepCopy.value = 5;
- 이후 위 코드가 실행되면, deepCopy는 original과 같은 참조값을 가리킨다.

- 따라서 original의 값도 5가 되는 것을 확인할 수 있다.
3. 정리
- C#에서 대입 연산을 진행할 때, 값 형식의 경우 깊은 복사(Deep Copy)가 일어난다.
- 참조 형식의 경우 참조 값만 가져오는 얕은 복사가 일어나게 된다.
- 이때 새로운 객체를 생성해서 내부 필드의 값을 복사해 오는 것은 가능하다.
- 새로운 객체를 생성했다고 하더라도 대입 연산을 진행하면 얕은 복사가 일어난다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [C# 리마인드] 콘솔 스네이크 게임 만들기 (0) | 2026.05.03 |
|---|---|
| [C#] 콘솔 월남뽕 게임 만들기 (1) | 2026.05.01 |
| [20260430] 클래스(Class) (0) | 2026.04.30 |
| [20260429] 구조체(struct)와 클래스(class)의 차이점 (C#) (0) | 2026.04.29 |
| [20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum) (0) | 2026.04.29 |