상세 컨텐츠

본문 제목

[개발일지] C#으로 TRPG 개발: <오류해결> CS0103 'PRocess' 이름이 현재 컨텍스트에 없습니다

카테고리 없음

by 강자이 2024. 4. 27. 14:14

본문

오류 발생 부분 2가지

 

1) 숫자 이외의 값 또는 범위를 벗어나는 숫자를 입력할 때

오류가 발생하는 부분

// 상태를 출력하는 메서드 내부의 StartSelect 메서드 수정
        public void DisplayStatus()
        {
            Console.WriteLine("상태 보기");
            Console.WriteLine("캐릭터의 정보가 표시됩니다.");
            Console.WriteLine();
            Console.WriteLine($"Lv. {Level}");
            Console.WriteLine($"{Name} ( {Job} )");
            Console.WriteLine($"공격력 : {Attack}");
            Console.WriteLine($"방어력 : {Defense}");
            Console.WriteLine($"체 력 : {Health}");
            Console.WriteLine($"Gold : {Gold} G");
            Console.WriteLine();
            Console.WriteLine("0. 나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");
            int input = Convert.ToInt32(Console.ReadLine());
            if (input == 0)
            {
                Program.StartSelect(); // StartSelect 메서드 호출
            }
        }

 

이 부분은 사용자로부터 입력을 받아 정수로 변환하는 역할을 합니다.

그러나 사용자가 숫자 이외의 값을 입력하면 FormatException이 발생하여 프로그램이 중단될 수 있습니다.

따라서 이 코드를 보호하기 위해서는 사용자의 입력이 정수로 변환 가능한지 먼저 확인해야 합니다. 이를 위해 int.TryParse() 메서드를 사용하여 사용자의 입력이 올바른지 확인할 수 있습니다.

 

 

 

1-1) 수정된 코드

public void DisplayStatus()
{
    Console.WriteLine("상태 보기");
    Console.WriteLine("캐릭터의 정보가 표시됩니다.");
    Console.WriteLine();
    Console.WriteLine($"Lv. {Level}");
    Console.WriteLine($"{Name} ( {Job} )");
    Console.WriteLine($"공격력 : {Attack}");
    Console.WriteLine($"방어력 : {Defense}");
    Console.WriteLine($"체 력 : {Health}");
    Console.WriteLine($"Gold : {Gold} G");
    Console.WriteLine();
    Console.WriteLine("0. 나가기");
    Console.WriteLine();
    Console.WriteLine("원하시는 행동을 입력해주세요.");

    int input;
    if (!int.TryParse(Console.ReadLine(), out input))
    {
        Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.");
        return;
    }

    if (input == 0)
    {
        Program.StartSelect(); // StartSelect 메서드 호출
    }
}

 

 


 

 

2) Convert.ToInt32(Console.ReadLine())

/ 인벤토리 표시 메서드
        public void DisplayInventory()
        {
            while (true)
            {
                Console.WriteLine("인벤토리 - 장착 관리");
                Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
                Console.WriteLine();
                Console.WriteLine("[아이템 목록]");
                for (int i = 0; i < Inventory.Count; i++)
                {
                    string equippedSymbol = Inventory[i].Purchased ? "[E]" : "-";
                    Console.WriteLine($"{i + 1} {equippedSymbol} {Inventory[i].Name} | {Inventory[i].Description}");
                }
                Console.WriteLine();
                Console.WriteLine("0. 나가기");
                Console.WriteLine();
                Console.WriteLine("원하시는 행동을 입력해주세요.");
                int input;
                if (!int.TryParse(Console.ReadLine(), out input) || input < 0 || input > Inventory.Count)
                {
                    Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.");
                    continue;
                }
                if (input == 0)
                {
                    StartSelect(); // StartSelect 메서드 호출
                    return;
                }
            }
        }

 

이 경우 int.TryParse() 함수가 실패하고 false를 반환하게 되는데, 이는 입력이 잘못되었다는 것을 나타냅니다. 그럴 경우 "잘못된 입력입니다. 다시 입력해주세요."라는 메시지가 표시되고, 반복문이 다시 실행됩니다.

하지만 이 코드는 사용자가 0을 입력했을 때도 이와 같은 메시지가 나오는데, 이는 조건문 input == 0을 만족시키기 위해 int.TryParse() 함수가 실패하는 것입니다. 그 결과적으로 "잘못된 입력입니다. 다시 입력해주세요."라는 메시지가 나오고, 프로그램이 다시 반복문을 실행합니다.

해결 방법으로는 사용자가 0을 입력했을 때 이를 별도로 처리하여 int.TryParse() 함수를 호출하지 않고 바로 종료하도록 수정하는 것입니다. 코드를 아래와 같이 변경할 수 있습니다.

 

 

 

2-1) 수정된 코드

if (input < 0 || input > Inventory.Count)
{
    Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.");
    continue;
}
if (input == 0)
{
    StartSelect(); // StartSelect 메서드 호출
    return;
}

 


 

 

댓글 영역