C# 프로그래밍 - 팀프로젝트 TextRPG#2

Sungchan Ahn(안성찬)·2024년 9월 27일

내일배움캠프

목록 보기
33/104

문제점 - 캐릭터 직업 선택

어제 생각했던 거는 부모 클래스인 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("잘못된 입력입니다.");
         }
     }
}

다만 직업마다 다른 기능이 많아지면 클래스 나누는 것도 생각해야한다.

업캐스팅과 다운캐스팅

  • 업캐스팅
    위에서 말한 부모 클래스 타입의 참조 변수로 자식 클래스의 인스턴스를 참조
    자식 인스턴스를 부모 타입으로 형변환

    • 부모 클래스 타입의 참조 변수가 자식클래스의 인스턴스를 참조했을 때, 부모 타입의 참조 변수는 부모 클래스의 인스턴스가 차지하는 메모리 공간을 인식하기 때문에 자식 클래스의 인스턴스가 차지하는 메모리(보통 부모 클래스보다 할당된 메모리 공간이 더 넓음)를 모두 확인할 수 없다.
  • 다운캐스팅
    부모 클래스의 인스턴스를 자식 클래스 타입으로 형변환
    자식 클래스 타입의 참조 변수로 부모 클래스의 인스턴스를 참조할 수 없다.
    다운캐스팅을 하려면 명시적 형변환을 해야한다.

    • 업캐스팅과는 반대로 부모 클래스의 인스턴스가 차지하는 메모리를 벗어나는 경우가 생길 수 있다.
profile
게임 개발 기록

0개의 댓글