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
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 일반화 프로그래밍_ <T>의 마법 (0) | 2023.06.23 |
---|---|
튜플이란? 튜플 사용법 (0) | 2023.06.23 |
[C#] Nullable 형식 (0) | 2023.06.22 |
[C#] String을 분할하는 Split 이용하기(문자열 내맘대로 분할) (0) | 2023.06.22 |
[C#] Interface(인터페이스),abstract class(추상클래스) (0) | 2023.06.22 |