Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[20260430] C# 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) 본문

Unity/Unity 초격차캠프

[20260430] C# 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)

FanJae 2026. 4. 30. 21:17

1. 얕은 복사 / Shallow Copy

- 배열이나 클래스와 같은 것을 복사할 경우, 위에서 다룬 것처럼 객체의 참조를 복사한다.

int [] a = {1,2,3};
int [] b = a;

 

- 이처럼, 객체의 참조만 복사하는 것을 얕은 복사라고 한다.

- C++ 의 경우 포인터를 소유하고 있을 때, 복사 생성자나 대입 연산자를 제대로 만들지 않을 경우, 포인터의 이중 해제(Dangling Pointer) 관련 문제가 있지만, C# 의 경우 GC(Garbage Collector)가 이를 관리하기 때문에 값을 공유하는 문제만 신경을 써도 괜찮아 보인다.


2. 깊은 복사 / Shallow Copy

- 일반적인 값 형식 자료형은 대입 시 값 자체가 복사된다. 따라서 내부에 참조형 필드가 없는 경우,에는 깊은 복사와 유사하게, 복사본을 수정해도 원본에 영향을 주지 않는다.

- C#에서도 객체의 깊은 복사 구현은 가능한 것으로 보인다. (단, 일반적으로 사용하는가에 대해서는 더 알아봐야 할 것 같다.)

1) 값 형식의 복사

- 일반적으로 값 형식 자료형의 경우 대입 연산을 진행할 경우, 복사본이 만들어지는 형태의 복사가 일어난다.

- 처음 valueType1 선언된 이후, valueType2valueType1의 값을 복사하여 넣는다.

- 이후 아래 코드가 실행되었을때 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;

- 이후 위 코드가 실행되면, deepCopyoriginal과 같은 참조값을 가리킨다.

 

- 따라서 original의 값도 5가 되는 것을 확인할 수 있다.


3. 정리

- C#에서 대입 연산을 진행할 때, 값 형식의 경우 깊은 복사(Deep Copy)가 일어난다.
- 참조 형식의 경우 참조 값만 가져오는 얕은 복사가 일어나게 된다.      
   - 이때 새로운 객체를 생성해서 내부 필드의 값을 복사해 오는 것은 가능하다.
   - 새로운 객체를 생성했다고 하더라도 대입 연산을 진행하면 얕은 복사가 일어난다.

 

Comments