티스토리 뷰

반응형

2021.10.10 - [코딩 공부/C 언어] - [C언어 기초] if ~ else와 else if

 

[C언어 기초] if ~ else와 else if

2021.10.05 - [코딩 공부/C 언어] - [C언어 기초] 조건문 if [C언어 기초] 조건문 if 2021.04.16 - [코딩 공부/C 언어] - C 언어 기초 : 연산자 3 - 비트 연산자 C 언어 기초 : 연산자 3 - 비트 연산자 2021.04.14..

hgu-can.tistory.com

 

2021.10.05 - [코딩 공부/C 언어] - [C언어 기초] 조건문 if

 

[C언어 기초] 조건문 if

2021.04.16 - [코딩 공부/C 언어] - C 언어 기초 : 연산자 3 - 비트 연산자 C 언어 기초 : 연산자 3 - 비트 연산자 2021.04.14 - [코딩 공부/C 언어] - C 언어 기초 : 연산자 1 C 언어 기초 : 연산자 1 2021.02.07..

hgu-can.tistory.com

 

저번 시간까지 조건문 if 에 대해서 알아봤습니다. 

이번 시간에는 또다른 조건문인 switch에 대해서 알아보려고 해요. 

if와 비슷하게 동작하지만 사용 방식과 제한 사항에서 약간 차이가 있습니다. 

 

 

1. switch

 

switch ( 변수명 )
{
case 값 :
	실행문장
	break;
case 값 : 
	실행문장
	break;
case 값 :
	실행문장
	break;
}
다음문장;

 

switch는 위와 같은 형태를 가지고 있어요. 

 

if가 if (condition1)    <- 1번 조건 확인 

else if (condition2)   <- 그 다음 조건 확인 

else if (condition3)   <- 그 다음 조건 확인

else {....}   <- 그 외 

이런 식으로 괄호 속의 조건을 하나하나 확인하면서 실행했다면

 

switch는 switch (변수명) 에 쓴 조건만 검사한 후 

변수가 현재 가진 값의 case로 바로 이동해서 구문을 실행합니다. 

그렇기 때문에 if문에 비해 동작 속도가 빠르지만,

c/c++에서는 정수형 변수만 사용이 가능합니다. (c# 가면 문자열도 사용 가능)

그리고 대소관계를 비교하는 조건도 쓸 수 없습니다. 


종합하자면 switch는 조건을 확인할 정수형 변수가 정해져 있어서 

여러 조건들을 일일이 확인할 필요 없이 해당 번호 case로 빠르게 이동해서 구문을 실행하고 싶은 상황에서 주로 사용합니다. 

 

가장 대표적인 예를 들자면 메뉴를 선택할 때 입니다. 

1. 게임 시작

2. 설정

3. 게임 종료

 

위에서 어떤 번호를 선택하느냐에 따라서 해야 할 동작이 달라집니다. 

 

 

int select;
scanf("%d", &select);

if (1 == select)
{
	//게임 시작
}
else if (2 == select)
{
	//설정
}
else if (3 == select)
{
	//게임 종료
}

 

메뉴 선택문을 if문을 이용해서 쓴다면 위와 같이 쓸 수 있습니다. 

하지만 if는 맨 위에 있는 조건을 확인한 다음 맞지 않으면 다음 else if 조건으로 가서 확인하고 맞지 않으면 그 다음 else if 조건으로 내려가서 확인하고 ... 를 반복하며 맞는 조건을 찾을 때까지 내려가기 때문에 위와 같이 쓴다면 맨 처음 if (1 == select) 부터 조건을 하나하나 확인하면서 밑으로 내려갑니다.

그렇기 때문에 사용자가 3번을 입력했다면 다소 불필요한 연산을 수행하게 됩니다. 

3번을 입력받았다면 바로 3번으로 가서 해당 구문을 수행해도 되잖아요?

이 때 swith를 사용하면 바로 3번으로 가기 때문에 if에 비해서 훨씬 빠른 동작을 할 수 있습니다. 

 

 

int select;
scanf("%d", &select);

switch (select)
{
    case 1:
    	//게임 시작
        break;
    case 2:
    	//설정
        break;
    case 3:
    	//게임 종료
        break;
}

 

swtich를 이용해서 메뉴 선택문을 작성한다면 위와 같이 쓸 수 있습니다. 

이렇게 쓴다면 컴퓨터는 select에 어떤 숫자가 입력되었는지 확인한 후 바로 해당하는 case로 이동합니다. 

사용자가 3번을 입력했다면 case1, 2번은 확인하지 않고 바로 case 3으로 이동하는 것이죠!

 

 

#include<stdio.h>

void main()
{
	int Num;
	printf("정수 입력 : ");
	scanf("%d", &Num);
	switch (Num)
	{
	case 1:
		printf("1입력\n");
		break;
	case 2:
		printf("2입력\n");
		break;
	default:
		printf("1,2를 제외한 나머지 입력\n");
		break;
	}
}

 

이제 비주얼 스튜디오를 켜서 위 코드를 적고 실행해 봅시다. 

공부하는 동안에는 복붙하지 말고 직접 타이핑 해 주세요. 

 

 

 

실행해서 조건에 따라 숫자를 입력해보면 의도한 대로 동작하는 것을 볼 수 있습니다. 

scanf로 입력받은 정수값에 따라서 이동한 case에서 실행해야 할 구문을 실행했습니다. 

여기서 맨 마지막 default는 어떤 case에도 속하지 않을 때 실행합니다. 

if ~ else문에서 else와 같은 역할을 합니다. 

default는 생략 가능합니다. 

 

 

#include<stdio.h>

void main()
{
	float Fnum;
	printf("실수 입력 : ");
	scanf("%f", &Fnum);
	switch (Fnum)
	{
	case 1.1:
		printf("1.1입력\n");
		break;
	case 2.2:
		printf("2.2입력\n");
		break;
	default:
		printf("1,2를 제외한 나머지 입력\n");
		break;
	}
}

 

이번엔 이렇게 수정해 봅시다. 

 

 

 

아까 switch에 조건으로 넣을 수 있는 변수는 정수값만 가능하다고 했었잖아요?

실수형 변수를 넣었더니 빨간줄이 생기면서 실행이 불가능한 것을 볼 수 있습니다. 

switch를 쓸 때엔 1, 2, 3, ... 과 같이 딱 나누어 떨어지는 정수만 쓸 수 있다는 걸 기억해 주세요!

 

 

#include<stdio.h>

void main()
{
	char Ch;
	printf("단일문자 입력 : ");
	scanf("%c", &Ch);
	switch (Ch)
	{
	case 'a':
		printf("a입력\n");
		break;
	case 'A':
		printf("A입력\n");
		break;
	}
}

 

이번엔 이렇게 써 봅시다. 

빨간줄이 안 뜰 것입니다. 

실행도 해 볼까요?

 

 

 

잘 되네용 ㅋㅋ

예전에 컴퓨터는 문자는 숫자로 저장한다고 했던 것을 기억하시나요?

컴퓨터는 문자를 아스키 코드상의 숫자로 치환된 값으로 저장하죠. 

그래서 char형 변수 또한 컴퓨터한텐 숫자나 다름없기 때문에 switch가 동작을 하는 것입니다. 

 

 

#include<stdio.h>

void main()
{
	char Ch;
	printf("단일문자 입력 : ");
	scanf("%c", &Ch);
	switch (Ch)
	{
	case 'a':
	case 'A':
		printf("A입력\n");
		break;
	}
}

 

이번엔 코드를 이렇게 수정해 봅시다. 

 

 

 

아까처럼 똑같이 a를 입력했는데 A를 입력했을 때 실행할 문장을 실행하는 것을 볼 수 있습니다. 

 

아까 전의 코드와 지금의 코드에서 달라진 점이 무엇일까요?

수정하면서 눈치채셨겠지만 

 

case 'a':
case 'A':
	printf("A입력\n");
	break;

 

이 부분에서 case 'a': 뒤의 break; 가 사라졌어요. 

 

switch에서 break의 역할은 자동차의 브레이크와 같은 역할을 합니다. 

코드를 쭉 실행하다가 break;를 만나면 멈추고 switch문을 종료합니다. 

하지만 지금 코드에선 case 'a': 뒤에 break;가 없기 때문에 break;를 만날 때까지 가다 보니까

case 'A': 뒤의 break;까지 오게 된 것입니다. 

그래서 소문자 a를 입력했는데도 대문자 A를 입력했을 때의 실행문장까지 실행한 것이죠. 

 

switch를 쓸 때엔 이 점을 유의해서 사용하시면 됩니다. 

잘 쓴 거 같은데 엉뚱한 조건이 실행되면 break;를 각 case마다 썼는지 안 썼는지 확인해 보세요. 

 


 

#include<stdio.h>
#include<Windows.h> //system("cls"),system("pause")를 사용하기 위한 헤더파일 

void main()
{
	int Data, Select;
	while (1) //참(1)일 동안 계속 반복해서 동작해라는 뜻
	{
		system("cls"); //콘솔 화면에 출력된 내용을 모두 지워주는 함수
		printf("======Menu======\n");
		printf("1.데이터 입력\n");
		printf("2.데이터 출력\n");
		printf("3.종료\n");
		printf("================\n");
		scanf("%d", &Select);
		switch (Select)
		{
		case 1:
			printf("데이터 입력 : ");
			scanf("%d", &Data);
			break;
		case 2:
			printf("데이터 = %d", Data);
			system("pause"); //새로운 입력을 받기 전 까지 코드 실행을 멈춰주는 함수
			break;
		case 3:
			return;
		}
	}
}

 

이번엔 이렇게 작성해 봅시다. 

중간에 while (1) 반복문이 있는데

반복문은 바로 다음 챕터에서 배울 것이니까 지금은 이런게 있구나 하고 넘어가시면 됩니다. 

 

 

 

실행된 프로그램을 작동시켜보면 종료 메뉴를 선택하기 전 까지는 무한히 반복하며 동작하는 것을 볼 수 있습니다. 

 

 

system("cls"); //화면을 비워주는 함수

 

그렇기 때문에 system("cls");를 사용했습니다. 

여기서 system("cls");는 현재 콘솔창에 출력 되어있던 내용을 모두 지워주는 함수입니다. 

만약 system("cls");를 사용해서 출력된 내용을 지워주지 않는다면

앞전에 출력된 내용들이 계속 남아있을 것입니다. 

굉장히 지저분해 보이겠죠?

궁금하면 system("cls"); 문장 맨 앞에 // 를 써서 주석처리를 한 뒤 다시 실행해 보세요. 

 

 

system("pause"); //새로운 입력을 받기 전 까지 코드 실행을 멈추는 함수

 

그리고 case 2: 를 보시면 맨 마지막에 system("pause"); 라는 문장이 있는 것을 보실 수 있어요. 

 

 

 

2번을 선택하면 위와 같은 문장이 출력되면서 프로그램이 멈춰있는 것을 보실 수 있습니다. 

 

만약 system("pause");를 쓰지 않으면 case 2는 바로 종료될 것이고 무슨 데이터를 입력했는지 보여주는 문장을 순식간에 사라질 것입니다. 

system("pause");를 주석처리하고 다시 실행시켜서 2번 메뉴를 선택해보시면 무슨 말인지 금방 아실 수 있을거에요. 

하지만 우리가 무슨 데이터를 입력했는지 좀 여유롭게 확인하고 싶잖아요...

그래서 system("pause");를 삽입해서 코드 진행을 잠깐 멈춰줬습니다. 

 

 

case 3:
	return;

 

마지막으로 case 3을 보시면 break; 대신에 return;을 쓴 것을 보실 수 있습니다. 

영어 단어 return은 보통 돌아간다는 뜻으로 사용되지만

컴퓨터의 함수에서는 값을 반환한다는 뜻으로 사용됩니다. 

왜 굳이 반환한다는 뜻으로 쓰냐 궁금하실텐데...

조금 더 가면 함수에 대해서 배울 거에요. 

그 때 자세히 알 수 있으니까 지금은 그렇구나 정도로 넘어가시면 됩니다. 

 

어쨌든 지금은 코드 속의 함수에서 return;은 종료와 비슷한 의미로 사용된다고 보시면 됩니다. 

그래서 3번을 선택하면 지금 반복문이 종료되면서 프로그램이 종료되는 것입니다. 

 

아직 배우지 않은 반복문과 return; 개념이 나와서 조금 어려우실텐데 

바로 다음 포스트부터 반복문과 함수, return에 관해서 배울거니까 너무 걱정하지 마세요~!

 

 

#include<stdio.h>
#include<Windows.h> //system("cls"),system("pause")

void main()
{
	int Data, Select;
	int Flag = 0;
	while (1)
	{
		system("cls");
		printf("======Menu======\n");
		printf("1.데이터 입력\n");
		printf("2.데이터 출력\n");
		printf("3.종료\n");
		printf("================\n");
		scanf("%d", &Select);
		switch (Select)
		{
		case 1:
			printf("데이터 입력 : ");
			scanf("%d", &Data);
			Flag = 1;
			break;
		case 2:
			if (Flag == 0)
				printf("데이터가 존재하지 않습니다.");
			else if (Flag == 1)
				printf("데이터 = %d", Data);
			system("pause");
			break;
		case 3:
			return;
		}
	}
}

 

마지막으로 이렇게 코드를 수정하고 실행해 봅시다. 

 

 

 

바뀐 조건에 따라 아까와는 다른 내용을 출력하는 것을 보실 수 있습니다. 

여기서 1번을 선택해서 데이터를 입력한 후 2번을 선택하면 아까 입력했던 데이터를 출력하겠죠. 

 


오늘은 조건문 switch에 대해서 알아봤어요. 

전 처음에 혼자 공부할 때 참 어려웠던 것이 조건문이었는데 여러분은 어떠실 지 모르겠네요. 

switch의 조건에 제약사항이 있다 보니

if에 비해서는 쓰는 빈도가 적긴 하지만 if에 비해서 깔끔한 코드 작성이 가능하고 

동작 시간을 단축시킬 수 있는 장점이 있기 때문에 알아두시면 좋습니다. 

 

사실 if와 switch의 실행 속도에서 생기는 시간 차이는 정말 찰나의 시간이기 때문에

두 연산이 각각 끝나는 데 걸리는 시간이 눈에 띄게 다르다고 체감할 수 있는 것은 아닙니다. 

하지만 게임을 만든다 치면 사소한 연산도 최대한 줄여주는 것이 최적화에 도움이 되기 때문에

if와 switch 중 아무거나 사용해도 상관없는 상황이라면,

switch를 사용해 불필요한 연산을 최대한~~ 줄여주는 것이 좋습니다. 

 

 

혹시 이해되지 않거나 궁금한 점이 있으시면 언제든 댓글로 달아주세요. 

다음 포스트에서는 오늘 잠깐 봤던 반복문에 대해서 알아볼 거에요. 

그럼 예습복습 열심히 하시고 다음 포스트에서 만나요~~!!

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함