반응형
1. 복사(값)
// Copy 복사
struct Mage
{
public int hp;
public int attack;
}
구조체의 값은 스택(stack)에 할당된다.
static void KillMage(Mage mage)
{
mage.hp = 0;
}
Mage mage;
mage.hp = 100;
mage.attack = 50;
KillMage(mage);
Console.WriteLine(mage.hp);
mage의 복사값을 killMage에 보내줬기 때문에 mage.hp가 100인 것은 변하지 않는다.
Mage mage2 = mage;
mage2.hp = 0;
Console.WriteLine($"mage 값 : {mage2.hp}");
mage와 mage2는 별도의 마법사이다.
2. 참조
// Ref 참조
class Knight
{
public int hp;
public int attack;
}
클래스는 참조 형식이므로 힙(heap)영역에 할당된다.
new 연산자와 만나는 순간 heap에 실제 new Knight() 본체가 생성된다.
Knight knight 에서는 new Knight()주소를 참조한다.
static void KillKnight(Knight knight)
{
knight.hp = 0;
}
Knight knight = new Knight();
knight.hp = 100;
knight.attack = 10;
KillKnight(knight);
Console.WriteLine($"knight 값 : {knight.hp}");
knight는 함수에 가짜값이 아니라 진짜값을 보내줬기 때문에 knight.hp가 0으로 변하였다.
Knight knight2 = knight;
knight2.hp = 10;
Console.WriteLine($"knight 값 : {knight.hp}");
Console.WriteLine($"knight2 값 : {knight.hp}");
knight2 = knight이므로 같은 기사이다. 그러므로 같이 같게 나온다.
독립된 knight2를 만들고 싶으면 새롭게 만들어야 한다.
Knight knight2 = new Knight();
knight2.hp = knight.hp;
knight2.attack = knight.attack;
이렇게 매번 new를 사용해서 새롭게 만드는게 번거롭기 때문에 Deep Copy를 사용해서 복사한다.
3. Deep Copy
깊은 복사는 독립된 새로운 객체를 만드는 것이다.
class Knight
{
public int hp;
public int attack;
// 새로운 Knight를 만들어준다.
public Knight Clone()
{
Knight knight = new Knight();
knight.hp = hp;
knight.attack = attack;
return knight;
}
}
Knight knight2 = knight.Clone();
knight2.hp = 0;
knight2.attack = 10;
본 게시글은 MMORPG Part1을 수강하고 정리한 글입니다.
반응형
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# 문법 - this 키워드 (0) | 2023.04.11 |
---|---|
C# 문법 - 생성자 (0) | 2023.04.11 |
C# 문법 - 스택과 힙 (0) | 2023.04.11 |
C# 문법 - Generic, Generic Constraints, Where (0) | 2023.04.10 |
C# 문법 - Object(박싱과 언박싱) (0) | 2023.04.10 |
댓글