상태를 열거형으로 구현
- 누군가가 만든 프로그램에서, 플레이어의 현재 행동이 int state 로 정의되어 있습니다.
- state변수에 1이 담겨 있으면 idle, 2가 담겨있으면 run, 3이 들어있으면 walk , 9가 담겨있으면 죽은 상태 입니다.
- 열거형을 활용하여 해당 코드를 어떻게 수정할 수 있는지 작성해주세요.
- 유저에게 콘솔 입력으로 1,2,3,9 외의 입력이 들어오면, 옳지 못한 입력이라고 출력 후, 다시 입력을 요구하는 기능을 만드세요.
- 제대로 입력이 되었다면, 예를 들어 run에 해당하는 상태가 입력되었다면 idle에서 run으로 바뀌었다는 멘트 출력
- 이미 idle 상태였는데 idle 상태가 또 입력되면 ‘이미 idle상태입니다’ 출력
- 입력 받고 다시 무한으로 계속 진행.
- 9가 입력되면 ‘죽었다는 관련 멘트’ 나오고 무한루프 종료
public enum PlayerState
{
idle = 1, run, walk, DEAD = 9
}
static void Task2()
{
int state = 1;
int input = 0;
//입력이 정수가 맞는지 판별
bool isInput = false;
//입력된 상태값이 정상인지 판별
bool isState = false;
Console.WriteLine();
Console.WriteLine($"현재 상태는 : {(PlayerState)state} 입니다.");
//입력 판별 코드
while (isState == false)
{
Console.WriteLine();
Console.Write("바꿀 상태를 정해주세요 : ");
//숫자가 맞냐? 맞으면 true
isInput = int.TryParse(Console.ReadLine(), out input);
Console.WriteLine();
if (isInput == true)
{
//상태가 인덱스에 포함된 값이냐?
isState = Enum.IsDefined(typeof(PlayerState), input);
if (isState == true)
{
state = input;
}
}
//잘못된 입력이면 다시 롤백
if (isState == false || isInput == false)
{
Console.WriteLine("옳지 못한 입력");
continue;
}
Console.WriteLine();
switch (input)
{
case (int)PlayerState.idle:
Console.WriteLine("이미 idle상태입니다");
isState = false;
break;
case (int)PlayerState.run:
Console.WriteLine("상태가 idle에서 run으로 바뀌었습니다.");
isState = false;
break;
case (int)PlayerState.walk:
Console.WriteLine("상태가 idle에서 walk으로 바뀌었습니다.");
isState = false;
break;
case (int)PlayerState.DEAD:
Console.WriteLine("YOU DIE");
isState = true;
break;
default:
isState = false;
break;
}
Console.WriteLine();
Console.WriteLine($"현재 상태는 : {(PlayerState)state} 입니다.");
}
}
이번엔 switch에 정수값을 받고 PlayerState의 자료형을 int형으로 바꾸고 비교해보았다.
역시 거꾸로해도 잘되는 코드 ㅎㅎ
enum문 요소옆에 = 숫자 입력을 해주면
그 숫자부터 시작되고
그 다음 요소들은 따로 뭔가 해주기 전까진 맨처음 부터 +1씩 늘어난다는걸 알게 되었다.
그러다가 요소에 =숫자 입력을 다시해주면 거기서부터 다시 변동되는걸 알수있다.
그래서 요소들의 인덱스 값은 1,2,3,9 이 되었고, 나머지는 없는게 되었다.
아마 for문 같은걸로 한번에 출력하기 하면 안나오지 않을까?
for 문으로 출력할수 없을거같은데? 에서 출발한 의문 풀어보고자 지금 다니는 학원 강사님께 물어보았다.
그랬더니 스마게에선 enum문 마지막에 end를 쓴다고 하신다.
그걸 토대로 강사님과 한번 짜보았다.
for (PlayerState i = PlayerState.idle; i < PlayerState.end; i++)
{
if (Enum.IsDefined(typeof(PlayerState), i))
{
Console.WriteLine(i);
}
}
두둥!
초기화를 PlayerState.idle로 해주니 시작위치를 알수있고,
그 뒤엔 enum문의 끝 PlayerState.end까지 진행하게 했다.
enum문에서 쓰는 인덱스값이 일정하게 1~n 까지 순서대로 진행은 되는데 중간 중간 빠져있을수도 있다.
나처럼 9에 DEAD를 넣고 죽음으로 처리할수도있잖은가?
그래서 쓴게 Enum.IsDefined(typeof(PlayerState), i) 이다.
이걸 쓰면 들어온 i의 값이 PlayerState의 인덱스에 포함되는가? 포함되면 true 아니면 false 가 나오는것이다.
즉 포함되는순간 출력하거나 다른곳에 입력해주면?
enum문이 요래조래 조리가 가능해지는 것이다...!
역시 코딩은 재밌는거같다.
알고있는걸 조금만 발상을 바꾸면 또다시 다른방법이 튀어나오니 ㅋㅋ..
이걸로 출력 하는순간 이제 enum문은 문자열로 변화도 가능!! 즉, 직접 스트링과 비교도 가능해 진다는 것이다.
응용이 꽤나 여러군데 써먹힐거같아 발견한게 매우 기쁘다! 아무튼 오늘도 알찼다.
끗.