C#

[C#] 얕은 복사와 깊은 복사 - 설명 및 예제 코드

Prooni 2024. 10. 5. 16:20

안녕하세요~

오늘은 C#에서 얕은 복사깊은 복사에 대해 공부해요!

 

뭔가 단어로만 보면 얕게 깊게 복사한다는 건가??

하는 생각이 드는데 맞는 부분이 있답니다 (?!?!)

 

코딩할 때 객체를 복사해야할 때가 있어요.

그런데 복사를 할때 원본자체를 넘겨줄지

원본의 복사본을 새롭게 생성할지에 따라 의미가 다르답니다

 

먼저 원본자체를 넘겨주는 경우가 바로 얕은 복사에요!

얕은 복사는 원본이 있는 위치를 복사한답니다~

자 위치를 복사한다는 것은 곧 참조한다는 것이죠!!

따라서 얕은 복사참조 타입을 복사할때 일어나요!

 

MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;

MyClass target = source;
target.MyField2 = 30;

Console.WriteLine($"{source.MyField1} {source.MyField2}");
Console.WriteLine($"{target.MyField1} {target.MyField2}");

 

C#에서 class는 힙에 할당되는 참조 타입이에요.

위 코드에서는 MyClass라는 클래스의 인스턴스 "source"를 생성하고

source의 필드값을 각각 10, 20으로 설정했어요

 

그리고 나서 새로운 인스턴스 target을 생성하고 동시에 source를 저장해줬어요

 이 부분이 바로 얕은 복사가 일어나는 코드에요~

 

클래스는 참조타입인데 참조타입을 복사했기 때문에

target은 source의 위치를 복사한거에요!

 즉 원본은 힙에 하나만 있고 이것을 가리키는 화살표가 target, source로 두개인거죠!

그렇다면 target이 필드값 MyField2를 30으로 변경한다면

source의 MyField2값은 어떻게 될까요?

 

같은 위치를 가리키고 있기 때문에 target에서 MyField2의 값을 바꾸면

원본자체가 바뀌는 것이에요

따라서 source의 MyField2값도 30으로 변경된답니다!!

 

즉 얕은 복사의 경우 복사본이 값을 변경하면 원본도 변경된다는 것이에요!

 

그럼 깊은 복사는 어떨까요?

아래 코드에서는 target을 선언할때 source를 저장하지 않고 새롭게 MyClass를 생성했어요

new 연산자를 사용하여 새롭게 힙 메모리에 할당된것이에요

얕은 복사와는 다르게 하나의 원본을 함께 사용하지 않고 새롭게 복사본을 하나 만드는거에요!

C#에는 아쉽게도 이렇게 직접 새로운 메모리 공간을 할당한 후

필드값 하나하나를 복사해주는 코드를 직접 써줘야 깊은 복사가 가능하답니다 ㅜㅜ

MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;

MyClass target = new MyClass();
target.MyField1 = source.MyField1;
target.MyField2 = source.MyField2;

target.MyField2 = 30;

Console.WriteLine($"{source.MyField1} {source.MyField2}");
Console.WriteLine($"{target.MyField1} {target.MyField2}");

 

그럼 여기서 target의 MyField2 값을 30으로 변경하면

source의 MyField2 값은 어떻게 될까요?

 

깊은 복사의 경우 target은 source와는 별개의 독립된 메모리 공간을 가지기 때문에

source의 필드값에는 전혀 영향을 주지 못해요!

반대의 경우도 마찬가지구요!!

 

 

 

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

[C#] 배열  (0) 2024.10.07
[C#] 프로퍼티  (1) 2024.10.06
[C#] ref out 키워드 의미 및 예시 코드  (4) 2024.10.03
[C#] 박싱과 언박싱  (0) 2024.10.01
[C#] 값 타입 참조 타입 정리  (2) 2024.10.01