언어/C언어

[C/C++] switch ~ case 문의 활용방법 - 흔한 실수까지

REAKWON 2022. 3. 29. 17:22

switch ~ case

switch ~ case 문법은 if문과 비슷하지만 약간은 다른 문법인데요. if 문은 괄호안에 조건식에 따라서 비교를 하고 조건식이 꽤나 복잡해질 수 있습니다. 이럴때 가독성이 조금 떨어지게 되지요. 하지만 switch case 문은 보다 명료하고 간단하게 조건에 따라 실행하는 case들이 나눠지기 때문에 가독성이 뛰어나다는 장점이 있죠. 이제 switch ~ case를 어떻게 사용하는가, 그리고 흔하게 할 수 있는 실수들은 무엇인가에 대해서 설명해보려고 합니다. 

1. 기본 사용법

switch case의 기본 템플릿은 아래와 같습니다.

switch : switch안에는 정수형으로 이 정수의 데이터를 가지고 case 옆의 데이터와 비교하게 됩니다.

case n : 실제 수행 부분입니다. swtich에 전달한 정수형 인자와 일치하면 그 case문을 실행하게 되는거죠.

default : case에 모두 포함되지 않을 경우 default 안쪽의 코드가 실행됩니다. default는 생략할 수도 있습니다.

 

switch(정수형){
case 1: 
//...//
break;
case 2:
//...//
break;
case 3:
//...//
break;
//...//
default:
//...//
}

 

아래는 switch ~ case를 이용한 간단한 예제입니다. 

#include <stdio.h>

void create_new_game() {
	printf("새로운 게임 만들기\n");
}

void continue_game() {
	printf("지난 게임 계속\n");
}
void game_setting() {
	printf("게임 설정\n");
}
void exit_game() {
	printf("게임 종료\n");
}
void main() {

	int selection;
	printf("1. 새게임\n");
	printf("2. 계속\n");
	printf("3. 설정\n");
	printf("4. 종료\n");

	scanf("%d", &selection);
	switch (selection) {
	case 1: 
		create_new_game();
		break;
	case 2:
		continue_game();
		break;
	case 3:
		game_setting();
		break;
	case 4:
		exit_game();
		break;
	default:
		printf("없는 옵션입니다\n");
	}
}

 

switch안에는 정수형 인자를 넣어야한다고는 했지만, 문자도 가능합니다. 문자도 내부적으로 정수로 처리하게 되니까요. 

void main() {

	char selection;
	printf("a. 새게임\n");
	printf("b. 계속\n");
	printf("c. 설정\n");
	printf("d. 종료\n");

	scanf("%c", &selection);
	switch (selection) {
	case 'a': 
		create_new_game();
		break;
	case 'b':
		continue_game();
		break;
	case 'c':
		game_setting();
		break;
	case 'd':
		exit_game();
		break;
	default:
		printf("없는 옵션입니다\n");
	}
}

 

 

단, 문자열의 경우에는 사용할 수 없습니다.

 

2. break가 없는 경우

case 마지막에 break를 항상 입력하는 것을 볼 수가 있죠? 왜 그렇게 될까요? 위 코드에서 break만 없애서 실행을 해보도록 하겠습니다.

void main() {

	char selection;
	printf("a. 새게임\n");
	printf("b. 계속\n");
	printf("c. 설정\n");
	printf("d. 종료\n");

	scanf("%c", &selection);
	switch (selection) {
	case 'a': 
		create_new_game();
	case 'b':
		continue_game();
		
	case 'c':
		game_setting();
	case 'd':
		exit_game();
	default:
		printf("없는 옵션입니다\n");
	}
}

 

저는 b를 선택하였음에도 b 이후 모든 case가 동작하게 됩니다. break라는 것은 곧 멈추라는 의미로 break가 없으면 선택 case 이후의 모든 case를 수행하게 됩니다. 

 

3. case안에서 변수 선언

case안에서 특정 변수를 선언하고 코드를 짜보도록 합시다. 코드를 아래처럼 바꿔서 실행해봅시다.

#include <stdio.h>

void create_new_game(char *new_game_name) {
	printf("새로운 게임 만들기 :%s\n",new_game_name);
}
//... 생략 ...//
void main() {

	char selection;
	printf("a. 새게임\n");
	printf("b. 계속\n");
	printf("c. 설정\n");
	printf("d. 종료\n");

	scanf("%c", &selection);
	switch (selection) {
	case 'a': 
		char new_game_name[32];
		printf("새로운 게임 이름:");
		scanf("%s", new_game_name);
		create_new_game(new_game_name);
		break;
        //... 생략 ...//
	}
}

그리고 비주얼 스튜디오를 보면 빨간줄이 딱 떠있을 겁니다.

 

"선언에는 레이블을 사용할 수 없습니다." 

그러나 그냥 실행해도 문제없이 실행됨을 알 수 있는데, 이건 컴파일러에 따라서 그냥 실행할수 있게 해주는 경우입니다. 그렇지 않은 경우 아래와 같은 오류가 발생하며 컴파일이 안되는 경우가 있죠.

다음은 리눅스에서 위와 완전히 동일한 코드를 gcc를 이용하여 컴파일한 경우입니다. 같은 에러가 발생하면서 컴파일이 안되는 경우를 볼 수가 있죠?

 error: a label can only be part of a statement and a declaration is not a statement

 

해결방법은 매우 간단합니다. 중괄호로 case를 묶으면 에러가 발생하지 않습니다. 간단하죠?

 

이상으로 너무나 사용하기 쉬운 switch ~ case 문법에 대해서 알아보았습니다. 마지막에 대한 switch ~ case에 대한 실수는 많이 발생할 수 있으니, 알아두시면 인터넷 서치없이 바로 해결 가능합니다.

반응형