지난 장에서 우리는 if-else if-else 구조를 이용해 여러 조건 중 하나를 선택하는 방법을 배웠습니다. 학점 계산기처럼 말이죠. 이 구조는 매우 강력하지만, 만약 "메뉴 1번을 선택하면 콜라, 2번을 선택하면 사이다, 3번을 선택하면 커피..."와 같이 하나의 변수를 여러 개의 특정 값과 비교해야 할 때는 코드가 다소 길고 복잡해 보일 수 있습니다.
이런 상황을 위해 C언어는 switch 문이라는 아주 훌륭한 대안을 제공합니다. switch 문은 마치 여러 개의 문이 있는 복도에서, 손에 든 열쇠(변수)에 딱 맞는 문(case) 하나를 열고 들어가는 것과 같습니다.
1. switch 문은 언제 사용할까요?
if 문은 "점수가 90점 이상인가?" 와 같이 범위를 비교하거나 복잡한 논리 조건을 검사하는 데 적합합니다. 반면 switch 문은 "메뉴 번호가 정확히 1인가?", "입력한 문자가 정확히 'A' 인가?" 와 같이, 하나의 정수형 변수(또는 문자)가 특정 상수 값과 일치하는지 검사하는 데 특화되어 있습니다.
if-else if로 구현한 메뉴 선택
if (menu == 1) {
printf("콜라를 선택했습니다.\n");
} else if (menu == 2) {
printf("사이다를 선택했습니다.\n");
} else if (menu == 3) {
printf("커피를 선택했습니다.\n");
} else {
printf("잘못된 선택입니다.\n");
}
switch로 구현한 메뉴 선택
switch (menu) {
case 1:
printf("콜라를 선택했습니다.\n");
break;
case 2:
printf("사이다를 선택했습니다.\n");
break;
case 3:
printf("커피를 선택했습니다.\n");
break;
default:
printf("잘못된 선택입니다.\n");
break;
}
어떤가요? switch 문 버전이 "menu 변수의 값에 따라 분기한다"는 의도가 훨씬 명확하게 보이지 않나요?
2. switch 문의 기본 구조
switch 문은 switch, case, break, default 네 가지 키워드로 구성됩니다.
switch (비교할_변수) {
case 값1:
// 변수의 값이 '값1'일 때 실행될 코드
break;
case 값2:
// 변수의 값이 '값2'일 때 실행될 코드
break;
// ... 다른 case들 ...
default:
// 위의 어떤 case에도 해당하지 않을 때 실행될 코드
break;
}
switch (변수): 괄호 안에는 비교의 기준이 될 정수형 변수(int,char등)를 넣습니다.case 값:: 기준 변수와 비교할 값(상수)을 적고 콜론(:)을 찍습니다. 변수의 값이case의 값과 일치하면, 해당case아래의 코드가 실행됩니다.break;: 아주 중요합니다! 해당case의 코드 실행을 마치고switch문 전체를 빠져나가라는 명령입니다.default::if문의 마지막else와 같은 역할입니다. 위의 어떤case에도 해당하지 않을 경우 이 부분이 실행됩니다.default는 생략할 수 있습니다.
3. break의 중요성: 의도적인 폭포수(Fall-through)
switch 문에서 break를 빼먹으면 어떻게 될까요? C언어는 해당 case의 코드를 실행한 뒤 멈추지 않고, 마치 폭포수가 떨어지듯 아래에 있는 다음 case의 코드를 break를 만날 때까지 계속 실행해 버립니다. 이를 'Fall-through'라고 합니다.
break를 깜빡한 코드:
int choice = 2;
switch (choice) {
case 1:
printf("1번을 선택하셨습니다.\n");
case 2:
printf("2번을 선택하셨습니다.\n"); // choice가 2이므로 여기서부터 실행
case 3:
printf("3번을 선택하셨습니다.\n"); // break가 없어서 계속 실행!
default:
printf("프로그램 종료.\n"); // break가 없어서 계속 실행!
}
실행 결과:
2번을 선택하셨습니다.
3번을 선택하셨습니다.
프로그램 종료.
이런 의도치 않은 버그를 막기 위해, 각 case 블록의 끝에는 항상 break;를 써주는 습관을 들여야 합니다. (물론 이 fall-through 특징을 의도적으로 사용하는 고급 기법도 있습니다.)
4. [직접 해봐요!] switch로 만드는 간단한 자판기
switch 문을 연습하기에 가장 좋은 예제인 자판기 프로그램을 만들어 봅시다.
#include <stdio.h>
int main(void)
{
int choice;
printf("========= 미니 자판기 =========\n");
printf("1. 콜라 (1000원)\n");
printf("2. 사이다 (1000원)\n");
printf("3. 커피 (1500원)\n");
printf("==============================\n");
printf("메뉴를 선택하세요: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("콜라가 나왔습니다.\n");
break;
case 2:
printf("사이다가 나왔습니다.\n");
break;
case 3:
printf("커피가 나왔습니다.\n");
break;
default:
printf("잘못된 번호를 선택했습니다.\n");
break;
}
return 0;
}
이제 이 프로그램을 실행하고 1, 2, 3, 그리고 다른 숫자를 입력했을 때 각각 어떻게 동작하는지 확인해 보세요.
5. [도전! 프로그래밍] 월별 날짜 수 알려주기
switch 문과 fall-through의 특징을 활용하여, 사용자에게 월(1~12)을 입력받아 해당 월의 날짜 수를 알려주는 프로그램을 만들어 보세요. (단, 윤년은 무시하고 2월은 28일로 고정합니다.)
힌트: 31일까지 있는 달(1, 3, 5, 7, 8, 10, 12월)은 하나의 그룹으로, 30일까지 있는 달(4, 6, 9, 11월)은 또 다른 그룹으로 묶을 수 있습니다. break 없는 fall-through를 의도적으로 사용해 보세요!
/* 힌트 코드 구조
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31일까지 있습니다.\n");
break;
case 4:
case 6:
// ... 이어서 작성해보세요
}
*/
이번 장 정리
switch문은 하나의 변수를 여러 개의 특정 상수 값과 비교할 때if-else if보다 유용하고 가독성이 좋습니다.case는 비교할 값을,default는 그 외 모든 경우를 처리합니다.break는 각case의 실행을 끝내고switch문을 탈출하는 필수적인 역할을 합니다.break가 없으면 다음case로 실행이 이어지는 'fall-through' 가 발생합니다.
지금까지 우리는 if와 switch를 통해 프로그램의 흐름을 '선택'하고 '분기'하는 법을 배웠습니다. 하지만 프로그래밍의 진정한 힘은 '반복'에서 나옵니다. 다음 장부터는 지루하고 반복적인 작업을 컴퓨터에게 수백, 수천 번 시킬 수 있는 강력한 도구, '반복문'의 세계로 들어가 보겠습니다.
'C, C++ 언어' 카테고리의 다른 글
| C언어 기초 10. 반복문 while 문과 do-while 문 (0) | 2025.10.15 |
|---|---|
| C언어 기초 9. 반복문, for 문 (0) | 2025.10.14 |
| C언어 기초 7. 조건문, if 문 (0) | 2025.09.24 |
| [C언어기초] 6. 프로그램의 핵심 도구, 연산자(Operator) 완벽 정복하기 (3) | 2025.07.13 |
| [C언어기초] 5. 입출력문 (2) | 2025.07.03 |