프로그래밍/C#

깊은 복사와 얕은 복사

gameObject 2023. 6. 23. 00:15
728x90

깊은복사 = 값을 복사해 와서 내 마음대로 사용하는것

(복사해온 값을 변경해도 원본에 영향을 주지 않는다.)

 

얕은복사 = 값을 참조해 오는것

(복사해온 값을 변경하면 원본에 영향을 준다.)

 

C++을 하며 배웠던 call by value와 call by reference와 같은 개념인것 같다.

 

다만, C#에서 Class를 하며 해당 오류를 겪을 수 있다.

Class는 태생 자체가 참조형식이다 보니 아래와 같은 코드에서 값을 잘못 예상할 수 있다.

class ShallowCopy
{
	public int num1;
    public int num2;
}



void main(str)
{
	ShallowCopy object = new ShallowCopy();
    object.num1 = 1;
    object.num2 = 2;
    
    ShallowCopy object2 = object;
    object2.num2 = 3;
    
    Console.WriteLine("{0},{1}",object.num1,object.num2);
}

나도 처음 이 예제를 받았을때 당연히 1,2가 출력될 줄 알았다.

그러나 답은 1,3이 출력된다. 왜냐하면 아까 말했던 class가 태생이 참조타입이기 때문이다.

object2는 새로 할당을 한 것이 아닌 object의 값을 참조해갔기 때문에 object2.num2를 변경하게 되면 object.num2를 변경하는 것과 같아진다.

따라서 값을 할당하기 위해서는 새로 할당하는 과정을 한번 거쳐줘야한다.

 

 

class ShallowCopy
{
	public int num1;
    public int num2;
}



void main(str)
{
	ShallowCopy object = new ShallowCopy();
    object.num1 = 1;
    object.num2 = 2;
    
    ShallowCopy object2 = new ShallowCopy();
    object2.num1 = object.num1;
    object2.num2 = object.num2;
    object2.num2 = 3;
    
    Console.WriteLine("{0},{1}",object.num1,object.num2);
    Console.WriteLine("{0},{1}",object2.num1,object2.num2);
}

이런식으로 하면 1,2 / 1,3 이런식으로 출력되게 된다.

위에서 새로 할당한 부분은 따로 클래스 함수로 만들어서 이용하면 더 보기 좋게 사용할 수 있다.

 

포인트는 Class는 참조타입이라는 점과 값타입으로 깊은복사를 위해서는 한가지 과정을 더 거쳐야 한다는 점을 잊지 말자.

728x90