어제 생각했던 거는 부모 클래스인 Character 클래스를 상속 받는 각 직업 클래스를 만들고, 아래의 코드와 같은 방식으로 Character 클래스의 참조변수 character로 각 직업 클래스를 참조하는 방식으로 직업 선택 기능을 작성해보고자 했다. https://velog.io/@asc98/20240926-TIL
Character character;
character = new Warrior();
하지만 각 직업 클래스의 멤버 변수를 부모 클래스에서 모두 갖고 있어서 굳이 클래스를 나눠서 할 필요가 없다고 느꼈다. 또한 업캐스팅과 다운캐스팅을 사용하면 이후 문제가 발생할 가능성이 있기 때문에 Character 클래스에서 직업을 구분해보았다.
class Character
{
public Character(string _name, int _jobTypeNum)
{
Name = _name;
Level = 1;
if (_jobTypeNum == (int)JobType.Warrior)
{
// 초기스탯 세팅
}
else if (_jobTypeNum == (int)JobType.Rogue)
{
}
else if (_jobTypeNum == (int)JobType.Archer)
{
}
else if (_jobTypeNum == (int)JobType.Mage)
{
// 초기스탯 세팅
}
}
}
Class IntroScene
{
void ChooseJob()
{
Console.WriteLine($"{name}님 환영합니다. 직업을 선택해주세요.");
while (true)
{
Console.WriteLine("원하는 직업의 숫자를 입력하세요.\n");
Console.WriteLine("[1] 전사");
Console.WriteLine("[2] 도적");
Console.WriteLine("[3] 궁수");
Console.WriteLine("[4] 마법사");
Console.Write("\n>> ");
string? input = Console.ReadLine();
int jobTypeNum;
bool isNum = int.TryParse(input, out jobTypeNum);
if (isNum)
{
if (jobTypeNum >= 1 || jobTypeNum <= 4)
{
player = new Character(name, jobTypeNum);
Console.Clear();
Console.WriteLine($"{player.Job}을/를 선택하셨습니다.");
break;
}
else
{
Console.Clear();
Console.WriteLine("잘못된 입력입니다.");
}
}
else
{
Console.Clear();
Console.WriteLine("잘못된 입력입니다.");
}
}
}
다만 직업마다 다른 기능이 많아지면 클래스 나누는 것도 생각해야한다.
업캐스팅
위에서 말한 부모 클래스 타입의 참조 변수로 자식 클래스의 인스턴스를 참조
자식 인스턴스를 부모 타입으로 형변환
다운캐스팅
부모 클래스의 인스턴스를 자식 클래스 타입으로 형변환
자식 클래스 타입의 참조 변수로 부모 클래스의 인스턴스를 참조할 수 없다.
다운캐스팅을 하려면 명시적 형변환을 해야한다.