본문 바로가기
유니티 공부/C# 문법

C# 문법 - 복사(값)와 참조

by 코딩하는 돼징 2023. 4. 10.
반응형

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을 수강하고 정리한 글입니다.

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1/dashboard

반응형

'유니티 공부 > 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

댓글