[2-8] switch()문

switch문은 수식의 결괏값과 일치하는 곳으로 분기하는 다중 결정 구문입니다. 형식은 다음과 같습니다.

switch (수식) {
    case 상수 : 문장
    .
    .
    .
    case 상수 : 문장
    default : 문장
}

일반적으로 문장의 끝에 break; 키워드를 사용합니다. break;는 해당 블록을 빠져나가는 지시어입니다.

0~9값을 입력하면 “is number”를 출력하는 예제를 살펴보겠습니다.

#include <stdio.h>

int main(void) {
	char c;
	
	c = getchar();
	
	switch(c){
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	printf("%c is number\n",c);
      break;
	default:
	printf("%c is not number\n",c);
	}
	
	return 0;
}

a를 입력했을 때 결과는 다음과 같습니다.

[출력]

a is not number

3를 입력했을 때 결과는 다음과 같습니다.

[출력]

3 is number

아래 두 예제는 모두 같은 기능을 합니다.

[예제 1]

#include <stdio.h>
 
int main(void) {
	char c;
	c = getchar();
 
	switch(c){
	case '1':
                 printf("hello 1");
                 break;
	case '2':
                 printf("hello 2");
                 break;
	case '3':
                 printf("hello 3");
                 break;
	default:
                 printf("bye");
                 break;
	}
 
	return 0;
}

[예제 2]

#include <stdio.h>
 
int main(void) {
	char c;
	c = getchar();
 
	switch(c){
 	case '1':
 	case '2':
 	case '3':
                 printf("hello %c", c);
                 break;
	default:
                 printf("bye");

	}
 
	return 0;
}

그런데 switch()에 들어갈 수식은 정수이어야 합니다. 0.123이나 ‘hello world’는 수식으로 들어갈 수 없습니다. 꼭 수식으로 정수 하나만 들어갈 필요는 없습니다. 수식의 결과가 정수이면 상관이 없습니다. 따라서 long, int, unsigned int, char 형은 사용할 수 있습니다. 하지만 float과 doble 형은 수를 표현하는 자료형이지만 사용할 수 없습니다. 정수형 자료가 아니기 때문입니다.

앞에서 다룬 예제를 long형으로 변환해보겠습니다.

#include <stdio.h>

int main(void) {
	long i;
	
	scanf("%l", &i);
	
	switch(i){
	case 0:
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
	case 6:
	case 7:
	case 8:
	case 9:
	printf("%i is number\n", i);
	break;
	default:
	printf("%i is not number\n", i);
	}
	
	return 0;
}

예상대로 잘 동작합니다.

switch(i)

대신

switch(i + i)

흑은

switch(i + 3)

같은 수식으로 변환해도 잘 동작합니다.

switch() 수식으로 올 수 있는 경우는 다음과 같습니다.

컴퓨터가 정수로 인식하는 모든 것

예를 들어 다음과 같은 경우가 있습니다.

  • 정수 자체
  • 정수형 자료 (in, long, short, char)
  • 연산 결과가 정수값인 수식

이상 관우였습니다.

제갈량은 동남풍 : char형은 정말로 정수형 자료형일까?

char형 문자형 자료일 것 같은데요? 이상합니다. 왜 정수형 자료형이라고 할까요? 궁금하시죠? 제갈량이 그 궁금증을 풀어드리겠습니다!

char형이냐 int형이냐는 사람의 관점입니다. 컴퓨터 입장에서는 char형도 8비트짜리 수일 뿐입니다. 아스키 코드 기억나시죠? 7비트로 문자를 표현하는 방식이요. 아직도 컴퓨터는 이 아스키표를 사용해 문자 하나를 char형으로 표현합니다.

처음 다룬 예제에서는 switch( )에 사용된 수식이 char형이었습니다. 이 예제를 약간 변경해서 정수형 자료로 정말로 컴퓨터가 인식하고 처리하는지 확인해볼게요!

다음 예제는 처음 예제에서 case부분은 0’~’9’ 대신 아스키표로 숫자 0을 뜻하는 48부터 9를 뜻하는 57까지로 대체했습니다.

int main(void) {
	char c;
	int i;
	
	scanf("%d", &i);
	
	c = (char)i;
	printf("i = %d, c = %c\n", i, c);
	
	switch(c){
	case 48 :  // 숫자 0의 아스키 코드값
	case 49 :
	case 50 :
	case 51 :
	case 52 :
	case 53 :
	case 54 :
	case 55 :
	case 56 :
	case 57 :
	printf("%c is number\n",c);
    break;
	default:
	printf("%c is not number\n",c);
	}
	
	return 0;
}

숫자를 입력하고 char형인 c로 강제 대입시켜 결과를 출력하는 예제입니다.

숫자 0을 뜻하는 48을 입력한 결과는 다음과 같습니다.

i = 48, c = 0
0 is number

숫자 9를 뜻하는 57을 입력한 결과는 다음과 같습니다.

i = 57, c = 9
9 is number

숫자 65를 입력한 결과입니다.

i = 65, c = A
A is not number

switch()문의 수식으로 char형 변수 c가 입력되었음에도 case문에서 오류 없이 제대로 비교가 되었습니다!

즉 입력된 수식 c를 정수로 인식했기 때문입니다.

이로써 컴퓨터가 char형을 정수형 자료로 인식하고 있다는 것을 확인할 수 있습니다.