
( 이미지는 나노바나나2를 사용하여 만들었습니다. )
그림을 보시면
값타입인 i는 스택 영역에 값이 바로 저장되는데
참조 타입인 j는 스택 영역에 주소값이 저장되고 힙 영역에 값이 저장됩니다.
값 타입에는 int, float, double ...이 있고
참조 타입에는 string, class, array ... 이 있습니다.
복사를 할 때, 원본 그대로 복사해 와서, 새로운 곳에 생성한다.
복사를 할 때, 원본을 그대로 가져오는 것이 아니라, 원본이 가지고 있는 주소값만 가지고 온다.
예시를 보겠습니다.
int i = 0; //깊은복사
int j = 0;
j = i;
Console.WriteLine(j);
j는 i값을 그대로 복사해서 출력합니다.
i값을 그대로 j값에 저장합니다.
Player player1 = new Player(10); //얕은복사
Player player2 = new Player(10);
player1.hp = 100;
player1 = player2;
Console.WriteLine($"{player2.hp}");
player1에 player2를 복사하게 되면 player1에 저장되는 값은 player2의 주소값이기 때문에 player1과 player2는 같은 값을 가리키게 됩니다.
그럼 얕은복사를 사용하지 않고 player1의 값을 player2로 넣어주려면 어떻게 해야할까요?
static void Cloning(Player p, Player p2)
{
p2.hp = p.hp;
}
Cloning(player3, player4);
public Player(int _hp)
{
hp = _hp;
}
Player player5 = new Player(player3);
이런 방법이 있습니다.
추가로 더 알아보자면...
//생성자 오버로딩 가능
//기존에 존재하는 클래스를 그대로 복사해서 생성가능
public Player(Player p)
{
hp = p.hp;
}
( 생성자도 오버로딩이 가능합니다! )