void KillObjectTest() { //기사와 마법사를 생성하고, 생성한 기사와 마법사를 새로운 변수에 대입하여 하나 더 만든 뒤, 이름만 달리해 준다. C05_Knight knight = new C05_Knight(); knight.name = "기사 1"; knight.hp = 100; knight.power = 10; C05_Knight knight2 = knight; knight2.name = "기사 2"; C05_Mage mage = new C05_Mage(); mage.name = "마법사 1"; mage.hp = 50; mage.power = 20; C05_Mage mage2 = mage; mage2.name = "마법사 2"; //첫 번째 기사와 마법사를 죽인다. KillKnight(knight); KillMage(mage); //그 후 출력해보면, 기사는 두 번째 기사가 죽어있고 첫번째와 두번째 기사의 정보가 동일하다. //Class는 대입할 때 메모리 주소(포인터)를 대입하므로, 기사2는 기존에 생성된 기사1을 가리키는 값일 뿐이다. 따라서 기사1과 기사2는 하나의 객체를 가리킨다. //KillKnight에서 Class 변수를 가져가 변경했으니, 이는 기사1과 기사2가 가리키는 주소에 위치한 값을 실제로 변경했다. 따라서 hp도 0이 되었다. Debug.Log($"죽은 기사는 {knight.name} (체력: {knight.hp})이며, 살아있는 기사는 {knight2.name} (체력: {knight2.hp}) 입니다."); //반면 마법사는 mage와 mgae2가 선언될 때 각각 별개의 메모리 공간을 갖는다. //둘은 다른 객체이므로 마법사 1의 정보 변경(사망)은 마법사 2에게 영향을 주지 않을 뿐더러, mage의 값을 복사해서 가져간 KillMage의 영향도 받지 않아서 원본의 hp도 그대로다. Debug.Log($"죽은 마법사는 {mage.name} (체력: {mage.hp})이며, 살아있는 마법사는 {mage2.name} (체력: {mage2.hp}) 입니다."); }
void KillMage(C05_Mage mage) { mage.hp = 0; Debug.Log($"{mage.name} 사망 (체력: {mage.hp})"); }