[Rookiss C++] 열거형

황교선·2023년 3월 17일
0

cpp

목록 보기
7/19

열거형을 설명하기 전에 우선 const int로 정의한 세 가지 상수를 이용한 가위바위보 프로그램을 적어보았다.

#include <iostream>
using namespace std;

const int SCISSORS = 1;
const int ROCK = 2;
const int PAPER = 3;

int main() 
{
    srand(time(0)); // 현재 시간 값을 시드로 하여 랜덤 값이 나오도록 함
		// 랜덤값이 좀 더 랜덤이 되게끔 만들어주는 코드이므로 이해할 필요는 없음

    int userInput; // 유저의 입력을 받아 저장할 변수 userInput
    int computerInput; // 랜덤 값 저장하여 유저의 값이랑 비교할 변수 computerInput

    do 
    {
        cin >> userInput;
        computerInput = rand() % 3 + 1; // rand()로 나오는 값은 0 ~ 32767
        // 나온 랜덤값을 나머지 연산자를 통해 0, 1, 2로 제한하고 + 1을 해주면 1, 2, 3 중 하나가 출력됨

        if (userInput == ROCK) // 유저의 인풋이 바위이면서
        {
            if (computerInput == ROCK) // 컴퓨터의 랜덤값이 바위면
            {
                cout << "draw" << endl; // 비겼다를 출력
            }
            else if (computerInput == SCISSORS) // 컴퓨터의 랜덤값이 가위면
            {
                cout << "win" << endl;  // 이겼다를 출력
            }
            else if (computerInput == PAPER) // 컴퓨터의 랜덤값이 보면
            {
                cout << "lose" << endl; // 졌다를 출력
            }
            // 마지막은 else if 가 아닌 else로 하여도 되지만, 혹시 모를 컴퓨터의 다른 값이나 가독성 면에서 마지막 조건이 PAPER 라는 것을 확실히 보여주기 위해 else if 사용
        }
        else if (userInput == SCISSORS) // 이하 위와 동일한 논리로 흐름
        {
            if (computerInput == ROCK)
            {
                cout << "lose" << endl;
            }
            else if (computerInput == SCISSORS)
            {
                cout << "draw" << endl;
            }
            else if (computerInput == PAPER)
            {
                cout << "win" << endl;
            }
        }
        else if (userInput == PAPER)
        {
            if (computerInput == ROCK)
            {
                cout << "win" << endl;
            }
            else if (computerInput == SCISSORS)
            {
                cout << "lose" << endl;
            }
            else if (computerInput == PAPER)
            {
                cout << "draw" << endl;
            }
        }
    } while (0 < userInput && userInput < 4); // 유저의 인풋이 1~3 사이일 때만 반복
}

const int 로 가위, 바위, 보에 대한 세 가지 값을 정의하여 사용했다. 코드 내 ROCK, SCISSORS, PAPER라는 변수 이름을 통해 가독성이 좋아서 나쁘지 않다. 하지만 프로그램을 좀 더 흥미진진하게 만들기 위해 가위, 바위, 보 중 둘을 이기는 값을 추가한다거나, 양 손을 사용해 하나 빼기 룰을 추가하는 등 비교해야하는 값이 늘 때, const int를 또 정의하고 기존의 값을 바꿔야하는 상황이 발생할 수 있다. 그럴 때 열거형(enum)을 사용하면 좋다.

enum

열거형은 열거자라고 하는 명명된 정수 상수 집합으로 구성된 사용자 정의 형식

  • 메모리에 할당되지 않으므로 메모리를 아낄 수 있음
  • 해당 열거형 자료형 변수가 정의된 경우에 메모리가 할당됨
  • 보통 식별자는 대문자로 시작하고 열거자는 종종 모두 대문자로 이름을 지음
  • 열거자에 값을 지정하지 않아도 차례대로 0부터 1, 2, 3…이 할당됨
  • 열거자에 값을 지정하면 그 다음 열거자는 이전 열거자의 + 1 값을 가짐
enum 식별자
{
		열거자1, // 열거자1의 값은 0
		열거자2, // 열거자2의 값은 1
		열거자3 = 5, // 열거자3의 값은 5
		열거자4, // 열거자4의 값은 6
		열거자5, // 열거자5의 값은 7
}

위에 가위바위보 프로그램을 enum으로 대체하여 만든 프로그램

#include <iostream>
using namespace std;

enum RSP
{
    ROCK,
    SCISSORS,
    PAPER
};

int main() 
{
    srand(time(0)); // 현재 시간 값을 시드로 하여 랜덤 값이 나오도록 함
    // 랜덤값이 좀 더 랜덤이 되게끔 만들어주는 코드이므로 이해할 필요는 없음

    RSP userInput; // 유저의 입력을 받아 저장할 변수 userInput
    RSP computerInput; // 랜덤 값 저장하여 유저의 값이랑 비교할 변수 computerInput

    do 
    {
        int input;
        cin >> input; // 정수값을 입력받아
        userInput = (RSP)input; // 유저인풋으로 형변환하여 넣어줌
        computerInput = (RSP)(rand() % 3); // rand()로 나오는 값은 0 ~ 32767
        // 나온 랜덤값을 나머지 연산자를 통해 0, 1, 2로 제한함

        if (userInput == ROCK) // 유저의 인풋이 바위이면서
        {
            if (computerInput == ROCK) // 컴퓨터의 랜덤값이 바위면
            {
                cout << "draw" << endl; // 비겼다를 출력
            }
            else if (computerInput == SCISSORS) // 컴퓨터의 랜덤값이 가위면
            {
                cout << "win" << endl;  // 이겼다를 출력
            }
            else if (computerInput == PAPER) // 컴퓨터의 랜덤값이 보면
            {
                cout << "lose" << endl; // 졌다를 출력
            }
            // 마지막은 else if 가 아닌 else로 하여도 되지만, 혹시 모를 컴퓨터의 다른 값이나 가독성 면에서 마지막 조건이 PAPER 라는 것을 확실히 보여주기 위해 else if 사용
        }
        else if (userInput == SCISSORS) // 이하 위와 동일한 논리로 흐름
        {
            if (computerInput == ROCK)
            {
                cout << "lose" << endl;
            }
            else if (computerInput == SCISSORS)
            {
                cout << "draw" << endl;
            }
            else if (computerInput == PAPER)
            {
                cout << "win" << endl;
            }
        }
        else if (userInput == PAPER)
        {
            if (computerInput == ROCK)
            {
                cout << "win" << endl;
            }
            else if (computerInput == SCISSORS)
            {
                cout << "lose" << endl;
            }
            else if (computerInput == PAPER)
            {
                cout << "draw" << endl;
            }
        }
    } while (0 <= (int)userInput && (int)userInput < 3); // 유저의 인풋이 0~2 사이일 때만 반복
}

기존과 달라진 점은 do while 문의 조건식이 0 ~ 2의 값일 때만으로 바뀌었고, enum 타입에 입력 값을 넣어주기 위해 정수형 변수 input을 만든 것이다.


참고한 글

profile
성장과 성공, 그 사이 어딘가

0개의 댓글