Deep Copy (깊은 복사) & Shallow Copy (얕은 복사)
- ref(참조) 객체를 복사하는 경우(얕은 복사) 두 개의 객체가 하나의 값을 공유하는 현상 발생
[ 깊은 복사 ]
- struct로 선언된 mage는 기본적으로 객체 값 복사하면 deep copy
- mage2는 mage에서 초기값만 복사하여 가져왔을 뿐 서로 연관 x, 독립적인 객체
[ 얕은 복사 ]
- class로 선언된 knight는 기본적으로 객체 값 복사하면 shallow copy
- knight2는 knight 객체의 또다른 이름이 됨, 같은 변수를 동시에 공유
[ 결과 비교 ]
- mage와 knight 모두 복사본을 만들고 그 복사본의 hp를 0으로 변경
- struct인 mage와 mage2는 독립적이므로 mage2의 hp만 변동
- class인 knight는 knight2의 hp가 변하면 함께 변동
// 참조 Ref
class Knight
{
public int hp;
public int attack;
}
// 복사 Copy
struct Mage
{
public int hp;
public int attack;
}
class Program
{
static void Main(string[] args)
{
Mage mage;
mage.hp = 100;
mage.attack = 50;
Mage mage2 = mage;
mage2.hp = 0;
// mage
// hp : 100, attack : 50
// mage2
// hp : 0, attack : 50
Knight knight = new Knight();
knight.hp = 100;
knight.attack = 10;
Knight knight2 = knight;
knight2.hp = 0;
// knight
// hp : 0, attack : 10
// knight2
// hp : 0, attack : 10
}
}
Deep Copy (깊은 복사)로 문제 해결하기
- new 키워드 사용
- 객체를 독립적으로 새로 생성
- 원본을 참조하는 객체 생성 x, 또 다른 원본을 생성
class Knight
{
public int hp;
public int attack;
}
class Program
{
static void Main(string[] args)
{
Knight knight = new Knight();
knight.hp = 100;
knight.attack = 10;
Knight knight2 = new Knight();
knight2.hp = knight.hp;
knight2.attack = knight.attack;
// knight의 값만 복사
}
}
깊은 복사 수행하는 메소드 정의하여 활용
class Knight
{
public int hp;
public int attack;
// 원본의 값만 복사
public Knight Clone()
{
Knight knight = new Knight();
knight.hp = hp;
knight.attack = attack;
return knight;
}
}
class Program
{
static void Main(string[] args)
{
Knight knight = new Knight();
knight.hp = 100;
knight.attack = 10;
Knight knight2 = knight.Clone();
knight2.hp = 0;
// knight2는 knight의 값만 복사
// 서로 독립적인 객체
// knight
// hp : 100, attack : 10
// knight2
// hp : 0, attack : 10
}
}
내용 출처 : Inflearn Rookiss님 강의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1
'C#' 카테고리의 다른 글
| [길찾기 알고리즘] 1. 미로 준비 (4) 플레이어 이동 (0) | 2024.11.17 |
|---|---|
| [길찾기 알고리즘] 1. 미로 준비 (2) Side Winder 방법 (0) | 2024.11.16 |
| [길찾기 알고리즘] 1. 미로 준비 (2) Binary Tree 방법 (0) | 2024.11.15 |
| [길찾기 알고리즘] 1. 미로 준비 (1) 기본 맵 생성 (0) | 2024.11.13 |
| Nested Inheritance, base, sealed (0) | 2024.11.10 |