알콜 이슈가 있긴 하지만 철마는 달리고 싶다.
앞전에 만들었던 TextRPG는 절차(Procedure) 지향 즉 새로운 기능이 필요하면 함수를 생성하여 구현하는 방법의 대표적인 예제였다. 직관적이지만 유지 보수가 어렵고 함수 호출 순서가 굉장히 중요해지기 때문에 여러 문제를 야기한다. class를 설명하기 위한 강의로 보인다.
class Knight
{
public int hp;
public int atk;
public void Move()
{
Console.WriteLine("Knight move");
}
public void Attack()
{
Console.WriteLine("Knight attack");
}
}
class Program
{
static void Main(string[] args)
{
Knight knight = new Knight();
knight.hp = 100;
knight.atk = 10;
knight.Move();
knight.Attack();
}
}
class 사용의 기본적인 예제
// reference
class Knight
{
public int hp;
public int atk;
// 깊은 복사
public Knight Clone()
{
Knight knight2 = new Knight();
knight2.hp = hp;
knight2.atk = atk;
return knight2;
}
public void Move()
{
Console.WriteLine("Knight move");
}
public void Attack()
{
Console.WriteLine("Knight attack");
}
}
// copy
struct Mage
{
public int hp;
public int atk;
}
class Program
{
static void KillMage(Mage mage)
{
mage.hp = 0;
}
static void KillKnight(Knight knight)
{
knight.hp = 0;
}
static void Main(string[] args)
{
Mage mage;
mage.hp = 100;
mage.atk = 10;
Mage mage2 = mage;
mage2.hp = 0;
// KillMage(mage);
// mage.hp는 여전히 100이다.
Knight knight = new Knight();
knight.hp = 100;
knight.atk = 10;
// KillKnight(knight);
// knight.hp는 0이 되었다.
//Knight knight2 = new Knight();
//knight2.hp = 0;
// 따로 초기화를 해주어야 원본과 다른 객체가 된다.
Knight knight2 = knight.Clone();
knight2.hp = 0;
// 마찬가지로 깊은 복사를 통해 원본과 다른 객체가 된다.
}
}
구조체와 class의 차이점을 알려주는 예제이다. 구조체는 데이터를 복사하여 사용하므로 원본은 바뀌지 않는다. 그러나 class는 ref문처럼 원본을 참조하여 사용하기 때문에 값이 바뀌게 된다. 충분히 이해한 상태에서 상황에 맞게 사용하면 강력한 기능이 될 것이다.