04. 상수와 열거형(하드코딩 교정) — 웹툰PD 지망생 : 정민재
04. 상수와 열거형(하드코딩 교정)
●/섹션 2. 코드의 흐름 제어

04. 상수와 열거형(하드코딩 교정)

728x90

 

using System;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //0:가위 1:바위 2:보

            Random rand = new Random();

            //ai가 고르는 0 ~ 2사이의 랜덤 값
            int aiChoice = rand.Next(0, 3);

            int choice = Convert.ToInt32(Console.ReadLine());

            switch (choice)
            {
                case 0:
                    Console.WriteLine("당신의 선택은 가위입니다");
                    break;
                case 1:
                    Console.WriteLine("당신의 선택은 바위입니다.");
                    break;
                case 2:
                    Console.WriteLine("당신의 선택은 보입니다.");
                    break;
            }

            switch (aiChoice)
            {
                case 0:
                    Console.WriteLine("컴퓨터의 선택은 가위입니다");
                    break;
                case 1:
                    Console.WriteLine("컴퓨터의 선택은 바위입니다.");
                    break;
                case 2:
                    Console.WriteLine("컴퓨터의 선택은 보입니다.");
                    break;
            }

            if (choice == aiChoice)
            {
                Console.WriteLine("무승부입니다.");
            }
            else if (choice == 0 && aiChoice == 2)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == 1 && aiChoice == 0)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == 2 && aiChoice == 1)
            {
                Console.WriteLine("승리입니다.");
            }
            else
            {
                Console.WriteLine("패배입니다.");
            }
        }
    }
}

 

0, 1, 2가 굉장히 보기가 싫다.

 

 

승리 하는 부분이 자꾸 헷갈렸던 이유가

 

로직을 바로 짜지 못하고 위로 계속 왔다갔다 한 것 때문임.

 

 

프로그래밍이 커지면 커질수록 강제로, 인위적으로 숫자를 받아놓는건

 

절대로 해서는 안될 일이다. 이건 하드코딩이다.

 

 

코드를 개선해보자...!

 

 

< 하드코딩 교정 - 상수화 >

using System;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //0:가위 1:바위 2:보

            int SCISSORS = 0;
            int ROCK = 1;
            int PAPER = 2;

            Random rand = new Random();

            //ai가 고르는 0 ~ 2사이의 랜덤 값
            int aiChoice = rand.Next(0, 3);

            int choice = Convert.ToInt32(Console.ReadLine());

            switch (choice)
            {
                case SCISSORS:  //빨간줄
                    Console.WriteLine("당신의 선택은 가위입니다");
                    break;
                case ROCK:      //빨간줄
                    Console.WriteLine("당신의 선택은 바위입니다.");
                    break;
                case PAPER:     //빨간줄
                    Console.WriteLine("당신의 선택은 보입니다.");
                    break;
            }

            switch (aiChoice)
            {
                case SCISSORS:  //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 가위입니다");
                    break;
                case ROCK:      //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 바위입니다.");
                    break;
                case PAPER:     //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 보입니다.");
                    break;
            }

            if (choice == aiChoice)
            {
                Console.WriteLine("무승부입니다.");
            }
            else if (choice == SCISSORS && aiChoice == PAPER)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == ROCK && aiChoice == SCISSORS)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == PAPER && aiChoice == ROCK)
            {
                Console.WriteLine("승리입니다.");
            }
            else
            {
                Console.WriteLine("패배입니다.");
            }
        }
    }
}

0, 1, 2가 남발하던 코드에서

 

이제 눈으로 읽히는 코드로 개선되었다. 하지만,

 

switch 부분에서만 ROCK, SCISSORS, PAPER 부분이 빨간줄이 뜬다.

 

if문과 switch문은 다르기 때문이다.

 

 

using System;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //0:가위 1:바위 2:보

            const int SCISSORS = 0;     //const : 상수라는 의미. 상수로 변환했기 때문에 switch문에서 쓸 수 있다.
            const int ROCK = 1;         //        switch문에서 변수를 상수화 해서 써먹을려면 필수인 문법.
            const int PAPER = 2;        //        이 설정값은 상수화 되었기에, 다시 아래에서 바꿀 수 없다.

            Random rand = new Random();

            //ai가 고르는 0 ~ 2사이의 랜덤 값
            int aiChoice = rand.Next(0, 3);

            int choice = Convert.ToInt32(Console.ReadLine());

            switch (choice)
            {
                case SCISSORS:  //빨간줄
                    Console.WriteLine("당신의 선택은 가위입니다");
                    break;
                case ROCK:      //빨간줄
                    Console.WriteLine("당신의 선택은 바위입니다.");
                    break;
                case PAPER:     //빨간줄
                    Console.WriteLine("당신의 선택은 보입니다.");
                    break;
            }

            switch (aiChoice)
            {
                case SCISSORS:  //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 가위입니다");
                    break;
                case ROCK:      //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 바위입니다.");
                    break;
                case PAPER:     //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 보입니다.");
                    break;
            }

            if (choice == aiChoice)
            {
                Console.WriteLine("무승부입니다.");
            }
            else if (choice == SCISSORS && aiChoice == PAPER)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == ROCK && aiChoice == SCISSORS)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == PAPER && aiChoice == ROCK)
            {
                Console.WriteLine("승리입니다.");
            }
            else
            {
                Console.WriteLine("패배입니다.");
            }
        }
    }
}

 

const를 써서 결국 switch문을 완성하였다.

 

 

< 하드코딩 교정 - 열거형 >

using System;

namespace Csharp
{
    class Program
    {
        enum Choice
        {
            SCISSORS,       //0
            ROCK,           //1
            PAPER           //2
        }
        static void Main(string[] args)
        {
            //0:가위 1:바위 2:보
                        
            Random rand = new Random();

            //ai가 고르는 0 ~ 2사이의 랜덤 값
            int aiChoice = rand.Next(0, 3);

            int choice = Convert.ToInt32(Console.ReadLine());

            switch (choice)
            {
                case (int)Choice.SCISSORS:  //빨간줄
                    Console.WriteLine("당신의 선택은 가위입니다");
                    break;
                case (int)Choice.ROCK:      //빨간줄
                    Console.WriteLine("당신의 선택은 바위입니다.");
                    break;
                case (int)Choice.PAPER:     //빨간줄
                    Console.WriteLine("당신의 선택은 보입니다.");
                    break;
            }

            switch (aiChoice)
            {
                case (int)Choice.SCISSORS:  //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 가위입니다");
                    break;
                case (int)Choice.ROCK:      //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 바위입니다.");
                    break;
                case (int)Choice.PAPER:     //빨간줄
                    Console.WriteLine("컴퓨터의 선택은 보입니다.");
                    break;
            }

            if (choice == aiChoice)
            {
                Console.WriteLine("무승부입니다.");
            }
            else if (choice == (int)Choice.SCISSORS && aiChoice == (int)Choice.PAPER)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == (int)Choice.ROCK && aiChoice == (int)Choice.SCISSORS)
            {
                Console.WriteLine("승리입니다.");
            }
            else if (choice == (int)Choice.PAPER && aiChoice == (int)Choice.ROCK)
            {
                Console.WriteLine("승리입니다.");
            }
            else
            {
                Console.WriteLine("패배입니다.");
            }
        }
    }
}

switch문에서

 

(상수변환)열거형함수 이름.변수

 

을 하면 코드가 에러없이 실행된다.

728x90

' > 섹션 2. 코드의 흐름 제어' 카테고리의 다른 글

08. 함수(ref)  (0) 2021.07.10
07.break, continue(흐름 제어)  (0) 2021.07.10
06. for  (0) 2021.07.10
05. while  (0) 2021.07.10
03. 가위-바위-보 게임  (0) 2021.07.10