열거형을 설명하기 전에 우선 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 식별자
{
열거자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을 만든 것이다.
참고한 글