본문 바로가기
밑바닥부터 시작하는 게임 개발/C++

[밑바닥 C++] 6. 여러 흐름의 분기문 switch, 어디로든 튀는 goto

by KK1 2021. 8. 29.

스위치?

switch ~ case문

정수 조건에 따라 코드의 흐름을 나누는 문법입니다.

int Condition

switch(Condition) // 정수 조건
{
    case 0: 
    	// Condition이 0일 때 코드 실행
    	break;
    case 1:
    	// Condition이 1일 때 코드 실행
    	break;
    case 2:
    	// Condition이 2일 때 코드 실행
    	break;
    default: // if문의 else와 비슷한 역할
    	// Condition중 위값들과 일치하는 내용이 없을 때 코드 실행
    	break;
}

 

예제) 가위바위보에 스위치문 적용하기

이전 if문에서 만든 가위바위보를 switch문을 통하여 업그레이드 해보겠습니다.

// 1은 가위, 2는 바위, 3은 보 
int Player = 0; // 플레이어는 0 초기화 
int Enemy = 1; // 적은 현재 가위만 낼 줄 안다. 
cout << "(1) 가위 (2) 바위 (3) 보" << endl; 
cin >> Player;

switch(Player)
{
    case 1: // 가위
    	cout << "무승부!!!" << endl;
    	break;
    case 2: // 바위
    	cout << "플레이어 승리!!!" << endl;
    	break;
    case 3: // 보
    	cout << "플레이어 패배ㅠㅠ" << endl;
    	break;
    default:
    	cout << "잘못 된 입력을 하였습니다" << endl;
        break;
}

Player의 값에 따라 switch문 분기를 타는 코드를 작성하였습니다.

 

switch문을 작성할 때 주의 사항도 알아보겠습니다.

 

break문을 빼먹는 경우

1의 값인 case의 분기의 코드를 실행 후 break문이 없는 경우 2의 값인 분기의 코드까지 실행됩니다. 

switch(Player)
{
    case 1: 
    	// 코드 실행
    	cout << "무승부!!!" << endl;
    case 2:
    	// case가 1인 경우에도 분기 완료후 여기도 코드 실행
    	cout << "플레이어 승리!!!" << endl;
    	break;
    case 3: // 보
    	cout << "플레이어 패배ㅠㅠ" << endl;
    	break;
    default:
    	cout << "잘못 된 입력을 하였습니다" << endl;
        break;
}

break문은 해당 switch문을 빠져나가기 위한 문법입니다.

 

case문 내부에서 변수 선언

switch(Condition)
{
    case 1: 
    	int NumA = 1; // 사용 불가능. 에러 발생.
    	cout << Num << endl;
        break;
    case 2:
    {
    	int NumB = 2; // 사용 가능.
        cout << Num << endl;
    	break;
    }
    default:
        break;
}

case문 내부에서는 기본적으로 변수를 선언할 수 없습니다. 

그 이유는 switch 문 내부에서 case 1인 경우 NumA는 초기화가 되지만 case 2의 NumB는 초기화를 건너뛰는 상황이 발생하기 때문입니다. 

변수 선언이 필요하다면 코드 블럭 { } 으로 case문 내부를 감싼 다음 코드를 작성하시면 됩니다.


goto문

프로그래머 사이에서는 절대 사용하지 말아야할 코드로 불리는 문법입니다.

지정한 위치로 코드의 흐름을 넘길 수 있는 문법입니다.

사용하지 말라고 해서 무조건 사용하지 않는 것은 아니고 필요하다면 사용할 수도 있습니다. (조직마다 다름)

가위바위보 예제를 통하여 바로 알아보겠습니다.

 

예제) 가위바위보에서 goto문 사용하기

// 1은 가위, 2는 바위, 3은 보 
int Player = 0; // 플레이어는 0 초기화 
int Enemy = 1; // 적은 현재 가위만 낼 줄 안다. 
cout << "(1) 가위 (2) 바위 (3) 보" << endl; 

Replay: // 위치 기록
cin >> Player;

switch(Player)
{
    case 1: // 가위
    	cout << "무승부!!!" << endl;
    	break;
    case 2: // 바위
    	cout << "플레이어 승리!!!" << endl;
    	break;
    case 3: // 보
    	cout << "플레이어 패배ㅠㅠ" << endl;
    	break;
    default:
    	cout << "잘못 된 입력을 하였습니다" << endl;
        goto Replay; // Replay로 기록해둔 위치로 이동합니다.
        break;
}

위 코드에서 Replay: 라는 위치를 기록해두었고 Player가 잘못 된 입력을 하는 경우 goto 문을 통하여 Replay라는 위치에 현재 코드의 진행 상황을 이동시켜주는 예제입니다.

현재 배운 문법 중 게임을 반복하고 싶을 때 활용할 수 있는 문법입니다. 다른 방법으로 게임 상황을 유지할 것이지만 프로그래밍에 정답은 없다고 다양한 방법을 보여주기 위한 예제였습니다.


이전편

[밑바닥부터 시작하는 게임 개발/C++] - [밑바닥 C++] 5. 가위바위보 게임으로 알아보는 분기문(if)

 

다음편

[밑바닥부터 시작하는 게임 개발/C++] - [밑바닥 C++] 7. 가위바위보도 삼세판! 반복문

반응형

댓글