연습 - if 문을 사용하여 의사 결정 논리 만들기

완료됨

대부분의 애플리케이션에는 많은 수의 실행 경로가 포함되어 있습니다. 예를 들어 애플리케이션은 사용자가 선택한 메뉴 옵션에 따라 다른 실행 경로를 구현할 수 있습니다. 개발자는 서로 다른 실행 경로를 구현하는 코드를 코드 분기라고 합니다.

가장 널리 사용되는 코드 분기 문은 if 문입니다. if 문은 괄호 세트로 묶인 부울 식을 사용합니다. 식이 true이면 if 문 다음의 코드가 실행됩니다. 그렇지 않으면 .NET 런타임에서 코드를 무시하고 실행하지 않습니다.

이 연습에서는 게임을 만들어 if 문 작성을 연습합니다. 먼저 게임의 규칙을 정의한 다음 코드로 구현합니다.

Random.Next() 메서드를 사용하여 6면 주사위 세 개를 굴리는 것을 시뮬레이션합니다. 롤링된 값을 평가하여 점수를 계산합니다. 점수가 임의의 합계보다 크면 사용자에게 승리 메시지를 표시합니다. 점수가 컷오프보다 낮으면 사용자에게 손실된 메시지가 표시됩니다.

  • 두 개의 주사위가 동일한 값이 나오면 2점을 더블 롤링에 대한 보너스로 받습니다.
  • 세 개의 주사위가 모두 동일한 값이 나오면 6점을 트리플 롤링에 대한 보너스로 받습니다.
  • 세 주사위의 합계에 보너스 점수를 더하여 15 이상이면 게임에서 승리하고, 그렇지 않으면 패배합니다.

if 문에 대해 자세히 알아보면 규칙을 구체화합니다.

중요

이 연습에서는 System.Random 클래스를 광범위하게 사용합니다. Random.Next()의 작동 방식을 다시 확인해야 하는 경우 “C#을 사용하여 .NET 클래스 라이브러리의 메서드 호출”이라는 제목의 Microsoft Learn 모듈을 참조할 수 있습니다.

코딩 환경 준비

이 모듈에는 샘플 코드를 빌드하고 실행하는 과정을 안내하는 작업이 포함되어 있습니다. Visual Studio Code를 개발 환경으로 사용하여 이러한 활동을 완료하는 것이 좋습니다. 이러한 활동에 Visual Studio Code를 사용하면 전 세계 전문가가 사용하는 개발자 환경에서 코드를 더 편안하게 작성하고 실행하는 데 도움이 됩니다.

  1. Visual Studio Code를 엽니다.

    Windows 시작 메뉴(또는 다른 OS의 해당 리소스)를 사용하여 Visual Studio Code를 열 수 있습니다.

  2. Visual Studio Code의 파일 메뉴에서 폴더 열기를 선택합니다.

  3. 폴더 열기 대화 상자에서 Windows 바탕 화면 폴더로 이동합니다.

    코드 프로젝트를 유지하는 다른 폴더 위치가 있는 경우 해당 폴더 위치를 대신 사용할 수 있습니다. 이 학습에서는 쉽게 기억하고 찾을 수 있는 위치를 사용하는 것이 중요합니다.

  4. 폴더 열기 대화 상자에서 폴더 선택을 선택합니다.

    작성자를 신뢰하는지 묻는 보안 대화 상자가 표시되면 를 선택합니다.

  5. Visual Studio Code 터미널 메뉴에서 새 터미널을 선택합니다.

    터미널 패널의 명령 프롬프트에 현재 폴더의 폴더 경로가 표시됩니다. 예를 들면 다음과 같습니다.

    C:\Users\someuser\Desktop>
    

    참고

    샌드박스 또는 호스트된 환경이 아닌 자체 PC에서 작업하고 이 C# 시리즈에서 다른 Microsoft Learn 모듈을 완료한 경우 이미 코드 샘플용 프로젝트 폴더를 만들었을 수 있습니다. 이 경우 TestProject 폴더에 콘솔 앱을 만드는 데 사용되는 다음 단계를 건너뛸 수 있습니다.

  6. 터미널 명령 프롬프트에서 지정된 폴더에 새 콘솔 애플리케이션을 만들려면 dotnet new console -o ./CsharpProjects/TestProject를 입력한 다음 Enter 키를 누릅니다.

    이 .NET CLI 명령은 .NET 프로그램 템플릿을 사용하여 지정된 폴더 위치에 새 C# 콘솔 애플리케이션 프로젝트를 만듭니다. 이 명령은 CsharpProjects 및 TestProject 폴더를 만들고 TestProject를 .csproj 파일의 이름으로 사용합니다.

  7. 탐색기 패널에서 CsharpProjects 폴더를 확장합니다.

    TestProject 폴더와 두 개의 파일, 즉 Program.cs라는 C# 프로그램 파일과 TestProject.csproj라는 C# 프로젝트 파일이 표시됩니다.

  8. 탐색기 패널의 편집기 패널에서 코드 파일을 보려면 Program.cs를 선택합니다.

  9. 기존 코드 줄을 삭제합니다.

    이 모듈 중에 이 C# 콘솔 프로젝트를 사용하여 코드 샘플을 만들고, 빌드하고, 실행합니다.

  10. 터미널 패널을 닫습니다.

세 개의 난수를 생성하여 출력에 표시하는 코드 작성

  1. Visual Studio Code에서 빈 Program.cs 파일이 열려 있는지 확인합니다.

  2. 이 연습에 대한 초기 코드를 만들려면 다음을 입력합니다.

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    
  3. 입력한 코드를 검토해 보세요.

    시작하려면 System.Random 클래스의 새 인스턴스를 만들고 dice라는 변수에 개체에 대한 참조를 저장합니다. 그런 다음 dice 개체의 Random.Next() 메서드를 세 번 호출하여 가능한 값을 16 사이로 제한하는 하한과 상한(상한은 배타적임)을 모두 제공합니다. 세 개의 난수를 roll1, roll2, roll3 변수에 각각 저장합니다.

    다음으로, 세 개의 주사위 롤을 합산하고 값을 total이라는 정수 변수에 저장합니다.

    마지막으로 WriteLine() 메서드를 사용하여 문자열 보간을 통해 세 가지 값을 표시합니다.

    코드를 실행하면 다음과 같은 메시지가 표시됩니다(숫자는 다를 수 있음).

    Dice roll: 4 + 5 + 2 = 11
    
    

    이 첫 번째 작업은 설정 작업이었습니다. 이제 코드에 결정 논리를 추가하여 게임을 더 흥미롭게 만들 수 있습니다.

총 변수 값에 따라 다른 메시지를 표시하는 if 문 추가

  1. Visual Studio Code 편집기의 코드 파일 아래쪽에서 커서를 찾은 다음, 빈 코드 줄을 만듭니다.

  2. 첫 번째 게임 기능을 만들려면 다음 if 문을 입력합니다.

    if (total > 14)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    

    승/패 시나리오를 처리하는 두 if 문이 사용됩니다. 첫 번째 if 문을 검사해 보세요.

    if 문은 다음 세 부분으로 구성됩니다.

    • if 키워드
    • 괄호 () 사이의 부울 식
    • 중괄호 { }로 정의되는 코드 블록

    런타임에 total > 14 부울 식을 평가합니다. 이 문이 true인 경우, 즉 total 값이 14보다 큰 경우 실행 흐름이 코드 블록에 정의된 코드로 계속됩니다. 즉, 중괄호 안의 코드를 실행합니다.

    하지만 부울 식이 false인 경우, 즉 total 값이 14보다 크지 않으면 실행 흐름이 코드 블록을 건너뜁니다. 즉, 중괄호 안의 코드가 실행되지 않습니다.

    마지막으로 두 번째 if 문은 사용자가 패한 경우에 표시되는 메시지를 제어합니다. 다음 단원에서는 if 문의 변형을 사용하여 이 두 문을 의도를 명확히 표현하는 단일 문으로 줄입니다.

부울 식이란?

부울 식은 부울 값 true 또는 false를 반환하는 코드입니다. 가장 간단한 부울 식은 truefalse 값입니다. 또는 부울 식이 true 또는 false 값을 반환하는 메서드의 결과일 수 있습니다. 예를 들어 다음은 string.Contains() 메서드를 사용하여 문자열에 다른 문자열이 포함되어 있는지를 평가하는 간단한 코드 예제입니다.

string message = "The quick brown fox jumps over the lazy dog.";
bool result = message.Contains("dog");
Console.WriteLine(result);

if (message.Contains("fox"))
{
    Console.WriteLine("What does the fox say?");
}

message.Contains("fox")true 또는 if 값을 반환하므로 부울 식에 해당하고 false 문에서 사용될 수 있습니다.

두 값을 비교하는 연산자를 사용하여 다른 간단한 부울 식을 만들 수 있습니다. 연산자는 다음과 같습니다.

  • ==(“같음” 연산자): 같은지를 테스트합니다.
  • >(“보다 큼” 연산자): 왼쪽의 값이 오른쪽의 값보다 큰지를 테스트합니다.
  • <(“보다 작음” 연산자): 왼쪽의 값이 오른쪽의 값보다 작은지를 테스트합니다.
  • >=(“크거나 같음” 연산자)
  • <=(“작거나 같음” 연산자)
  • 기타

참고

Microsoft Learn의 C# 학습 시리즈는 전체 모듈을 부울 식에 적용합니다. 부울 식을 구성하는 데 사용할 수 있는 많은 연산자가 있지만 이 모듈에서는 몇 가지 기본 사항에 대해서만 살펴봅니다. 부울 식에 대한 자세한 내용은 “C#에서 부울 식을 평가하여 의사 결정 내리기”라는 제목의 Microsoft Learn 모듈을 참조하세요.

이 예제에서는 부울 식 total > 14를 평가했습니다. 하지만 부울 식 total >= 15를 선택할 수도 있습니다. 이 경우 두 식이 동일합니다. 게임 규칙에 “세 개의 주사위와 보너스의 합이 15 이상이면 게임에서 승리합니다.”라고 명시되어 있으므로 >= 15를 구현해야 합니다. 이는 연습의 다음 단계에서 변경할 예정입니다.

코드 블록이란?

코드 블록은 여는 중괄호와 닫는 중괄호 기호 { }로 정의되는 하나 이상의 코드 줄 모음입니다. 소프트웨어 시스템에서 단일 목적의 전체 코드 단위를 나타냅니다. 이 경우 런타임에 부울 식이 true이면 코드 블록의 모든 코드 줄이 실행됩니다. 반대로, 부울 식이 false이면 코드 블록의 모든 코드 줄이 무시됩니다.

코드 블록에 다른 코드 블록이 포함될 수도 있습니다. 실제로 한 코드 블록이 애플리케이션의 다른 코드 블록 내에서 “중첩”되는 것이 일반적입니다. 이 모듈의 뒷부분에서 다른 코드 블록 내에 하나의 if 문을 만들 때 고유한 코드 블록을 중첩하기 시작합니다.

참고

Microsoft Learn의 C# 학습 시리즈는 전체 모듈을 코드 블록 이해하는 데 사용합니다. 코드 블록은 코드 구성 및 구조를 이해하고 데 핵심적인 역할을 하며 변수 범위의 경계를 정의합니다. 모듈 [Control variable scope and logic using code blocks in C#](TBD)을 참조하세요.

더블 보너스를 구현하는 다른 if 문 추가

이제 다음 규칙을 구현할 수 있습니다. “두 개의 주사위가 동일한 값이 나오면 2점을 더블 롤링에 대한 보너스로 받습니다.” 이전 단계의 코드를 다음 코드 목록과 일치하도록 수정합니다.

  1. Visual Studio Code 편집기에서 첫 번째 if 문 위의 빈 코드 줄에서 커서를 찾습니다.

  2. “더블” 게임 기능을 만들려면 다음 if 문을 입력합니다.

    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    

    여기서는 세 개의 부울 식을 결합하여 단일 코드 줄에서 하나의 복합 부울 식을 만듭니다. 이를 복합 조건이라고도 합니다. 두 개의 수직선 문자로 구분된 세 개의 내부 괄호 세트를 결합하는 하나의 외부 괄호 세트를 사용합니다.

    이중 파이프 문자 ||논리 OR 연산자이며, 기본적으로 "전체 부울 식이 true가 되려면 왼쪽의 식 또는 오른쪽의 식이 true여야 합니다." 두 부울 식이 모두 false이면 전체 부울 식이 false가 됩니다. 평가를 세 번째 부울 식으로 확장할 수 있도록 두 논리 OR 연산자를 사용합니다.

    먼저 (roll1 == roll2)를 평가합니다. true이면 전체 식이 true입니다. false인 경우에는 (roll2 == roll3)을 평가합니다. true이면 전체 식이 true입니다. false인 경우에는 (roll1 == roll3)을 평가합니다. true이면 전체 식이 true입니다. false이면 전체 식이 false입니다.

    복합 부울 식이 true이면 다음 코드 블록을 실행합니다. 이번에는 두 줄의 코드가 있습니다. 첫 번째 코드 줄은 사용자에게 메시지를 인쇄합니다. 두 번째 코드 줄은 total 값을 2씩 증가시킵니다.

  3. 코드의 가독성을 향상하려면 다음과 같이 두 번째 if 문을 업데이트합니다.

    if (total >= 15)
    

    이제 승리 롤을 평가하는 데 사용되는 식에서 >= 연산자를 사용하고 있습니다. >= 연산자는 “크거나 같음”을 의미합니다. 따라서 total14가 아닌 15의 값과 비교할 수 있습니다. 이러한 변경 내용을 통해 승리 롤을 평가하는 데 사용하는 식은 이제 손실 롤에 대해 평가하는 식과 유사합니다. 이렇게 하면 코드를 더 쉽게 읽고 이해할 수 있습니다. 정수 값을 처리하므로 새 식 (total >= 15)는 이전에 작성한 (total > 14)와 동일하게 작동합니다.

  4. 이 코드를 검토하는 데 몇 분 정도가 걸립니다.

    코드는 다음과 일치해야 합니다.

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }    
    

    승패 롤을 평가하는 데 사용되는 식 간의 맞춤이 향상되었습니다.

트리플 보너스를 구현하는 다른 if 문 추가

이제 다음 규칙을 구현할 수 있습니다. “세 개의 주사위가 모두 동일한 값이 나오면 6점을 트리플 롤링에 대한 보너스로 받습니다.” 이전 단계의 코드를 다음 코드 목록과 일치하도록 수정합니다.

  1. Visual Studio Code 편집기에서 “더블” if 문의 코드 블록 아래에 빈 코드 줄을 만듭니다.

  2. “트리플” 게임 기능을 만들려면 다음 if 문을 입력합니다.

    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    

    여기서는 두 개의 부울 식을 결합하여 단일 코드 줄에서 하나의 복합 부울 식을 만듭니다. 두 개의 앰퍼샌드 문자로 구분된 두 개의 내부 괄호 세트를 결합하는 하나의 외부 괄호 세트를 사용합니다.

    이중 앰퍼샌드 문자 &&논리 AND 연산자이며, 기본적으로 "두 식이 모두 true인 경우에만 전체 식이 true입니다." 이 경우 roll1roll2와 같고 roll2roll3과 같을 경우 추론에 따라 roll1roll3과 같아야 합니다. 즉, 사용자가 세 번 모두 동일한 값을 던진 것입니다.

  3. Visual Studio Code 파일 메뉴에서 저장을 클릭합니다.

  4. 이 코드를 검토하는 데 몇 분 정도가 걸립니다.

    코드가 다음과 일치하는지 확인합니다.

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    
  5. 탐색기 패널에서 TestProject 폴더 위치에서 터미널을 열려면 TestProject를 마우스 오른쪽 단추로 클릭한 다음 통합 터미널에서 열기를 선택합니다.

    터미널 패널이 열려 있어야 하고 터미널이 TestProject 폴더 위치에 열려 있음을 보여 주는 명령 프롬프트를 포함해야 합니다.

  6. 터미널 명령 프롬프트에서 코드를 실행하려면 dotnet run을 입력한 다음, Enter 키를 누릅니다.

    참고

    “실행할 프로젝트를 찾을 수 없습니다.”라는 메시지가 표시되면 터미널 명령 프롬프트에 예상되는 TestProject 폴더 위치가 표시되는지 확인합니다. 예: C:\Users\someuser\Desktop\csharpprojects\TestProject>

    다음 결과 중 하나와 유사한 출력이 표시되어야 합니다.

    Dice roll: 3 + 6 + 1 = 10
    Sorry, you lose.
    
    

    또는 다음과 같습니다.

    Dice roll: 1 + 4 + 4 = 9
    You rolled doubles! +2 bonus to total!
    Sorry, you lose.
    
    

    또는 다음과 같습니다.

    Dice roll: 5 + 6 + 4 = 15
    You win!
    
    

    운이 좋으면 다음과 같이 표시됩니다.

    Dice roll: 6 + 6 + 6 = 18
    You rolled doubles! +2 bonus to total!
    You rolled triples! +6 bonus to total!
    You win!
    
    

    잠시만요. 플레이어에게 트리플 보너스와 더블 보너스를 모두 보상해야 하나요? 결국, 트리플 롤은 더블도 롤링했음을 의미합니다. 이상적으로, 보너스는 누적되지 않아야 합니다. 두 개의 별도 보너스 조건이 있어야 합니다. 수정해야 하는 논리의 버그입니다.

논리의 문제 및 코드 개선 기회

이것은 좋은 출발점이고 if 문, 부울 식, 코드 블록, 논리 OR, AND 연산자 등에 대해 자세히 알아보았지만 개선할 점이 많이 있습니다. 다음 단원에서 수행할 예정입니다.

요약

  • if 문을 사용하여 코드 논리를 분기합니다. if 결정 문은 해당 부울 식이 true이면 코드 블록에서 코드를 실행합니다. 그렇지 않으면 런타임에 코드 블록을 건너뛰고 코드 블록 뒤의 다음 코드 줄을 계속 진행합니다.
  • 부울 식은 부울 값을 반환하는 식입니다.
  • 부울 연산자는 왼쪽과 오른쪽의 두 값이 같은지 등을 비교합니다.
  • 코드 블록은 중괄호 { }로 정의됩니다. 단일 단위로 처리되어야 하는 코드 줄을 수집합니다.
  • 논리 AND 연산자 &&는 두 하위 식이 모두 true이면 전체 식이 true가 되도록 두 식을 집계합니다.
  • 논리 OR 연산자 ||는 하위 식 중 하나가 true이면 전체 식이 true가 되도록 두 식을 집계합니다.

지식 점검

1.

코드 블록이란?

2.

부울 문 또는 식이란 무엇인가요?