학습(공부)하는 블로그 :: 9. Switch Case문
 

 
반응형
블로그 이미지
학습하고 공부한 것을 보고 싶을때 다시 볼려고 요약해서 정리한 블로그입니다. 좋은 정보는 서로 공유합시다. 깨비형
« 2026/7 »
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 31

Archive»


Category»

Notice»

Recent Post»

Recent Comment»

Recent Trackback»

07-19 08:27

9. Switch Case문

학과 수업 노트/C언어 기초 배우기 | 2026. 7. 3. 11:16 | Posted by 깨비형
반응형

 

💡 1분 핵심 요약 (TL;DR)

  • switch문은 표현식의 값이 case의 값과 정확히 일치할 때만 반응하는 문법이다
  • ✅ if문은 범위·조건을 폭넓게 다루고, switch문은 특정 값 몇 개를 분기할 때 가독성이 좋아진다
  • break가 없으면 해당 case부터 아래 코드가 모두 순서대로 실행된다 (폴스루)
  • ✅ case를 여러 개 이어 쓰면(case 1: case 2:) 같은 코드를 여러 값에 공유시킬 수 있다
  • ✅ switch문에 나오는 모든 예제는 if문으로도 작성 가능하다 — 오늘 배우는 건 선택지를 늘리는 것

 

 

 

01 switch문, 꼭 알아야 할까

if문으로 다 되는데 굳이 배워야 하는 이유

 

switch문으로 할 수 있는 것은 사실 if문으로도 전부 작성할 수 있습니다. for문을 while문으로 바꿔 쓸 수 있었던 것과 비슷합니다. 그래서 "switch문을 꼭 써야 하나"라는 의견이 갈리기도 하는데요, 실전에서 자주 쓰이지는 않아도 다른 사람의 코드를 읽을 때 반드시 마주치게 되는 문법이라 알아두는 것이 좋습니다.

 

📖 switch문 기본 구조
switch (표현식) { case 값1: 코드; break; case 값2: 코드; break; default: 코드; }
여기서 표현식은 참/거짓을 따지는 조건식이 아니라, 계산 결과가 어떤 으로 나오는지를 검사하는 자리입니다. n + 3처럼 값이 나오는 어떤 식도 넣을 수 있습니다.

 

switch문 기본 형태

int n = 3;

switch (n) {
    case 1:
        printf("1일 때 실행 코드\n");
        break;
    case 2:
        printf("2일 때 실행 코드\n");
        break;
    case 3:
        printf("3일 때 실행 코드\n");
        break;
    default:
        printf("기본 실행 코드\n");
}

 

▶ 실행 결과 (n = 3)

3일 때 실행 코드

 

n에 어떤 값이 들어가는지에 따라 실행 결과가 달라집니다. n이 4처럼 어떤 case에도 해당하지 않으면 default가 실행됩니다. 여기까지는 어렵지 않죠? 진짜 중요한 건 지금부터 나올 break의 역할입니다.

 

 

 

02 break가 없으면 벌어지는 일 (폴스루)

break는 반복문뿐 아니라 switch문도 탈출시킨다

 

지금까지 break는 반복문을 탈출하는 용도로만 썼습니다. switch문에서는 해당 case를 빠져나가는 용도로 쓰입니다. 만약 break를 빼먹으면, 조건이 맞은 case부터 아래에 있는 코드가 전부 순서대로 실행됩니다. 이걸 "떨어져 내려간다"는 의미로 폴스루(fall-through)라고 부릅니다.

 

 

⚠️ break를 뺐을 때 — n = 1이면 무슨 일이?

switch (n) {
    case 1:
        printf("1일 때 실행 코드\n");
    case 2:
        printf("2일 때 실행 코드\n");
    case 3:
        printf("3일 때 실행 코드\n");
    default:
        printf("기본 실행 코드\n");
}

 

▶ 실행 결과 (n = 1)

1일 때 실행 코드
2일 때 실행 코드
3일 때 실행 코드
기본 실행 코드

 

n이 1로 들어오면 case 1에서 시작해서 break가 없으니 밑으로 쭉 흘러 4줄이 전부 출력됩니다. 신기하지만 의도치 않게 이런 버그가 생기기 쉬우니, case를 끝낼 때는 break를 넣는 습관을 들이는 게 좋습니다.

 

✓ 폴스루를 역이용하기 — case 묶어 쓰기
1, 2, 3이 모두 같은 코드를 실행해야 한다면, 이 폴스루 특성을 이용해 case를 세로 혹은 가로로 나란히 이어 쓸 수 있습니다.

 

switch (n) {
    case 1: case 2: case 3:
        printf("1~3 중 하나입니다\n");
        break;
    default:
        printf("기본 실행 코드\n");
}

 

▶ 실행 결과 (n = 2)

1~3 중 하나입니다

 

⚠️ 가독성의 양날의 검
case를 나란히 묶는 건 가독성을 높여주지만, 모든 case를 다 옆으로 나열해버리면 오히려 코드가 지저분해집니다. "묶을 만한 값들만" 신중하게 묶는 게 포인트입니다.

 

 

 

03 switch vs if, 언제 뭘 써야 할까

범위를 다룰 땐 if, 특정 값 몇 개만 다룰 땐 switch

 

if문

· 범위여러 조건을 자유롭게 표현
· n이 1~3 사이인지처럼 폭넓은 판단 가능
· 조건이 복잡해질수록 코드가 길어짐
  switch문

· 정확히 일치하는 값일 때만 반응
· 1이다, 2다, 3이다처럼 특정 값 분기에 특화
· 후보 값이 적을수록 가독성이 좋아짐

 

예를 들어 if문은 if (n >= 1.0 && n <= 3.0) 처럼 실수 범위나 복잡한 조건식도 자유롭게 검사할 수 있습니다. 반면 C언어의 switch문은 case 뒤에 1, 2, 3처럼 정수(또는 문자) 상수 고정값만 올 수 있다는 차이가 있습니다. 이 차이를 기억해두면 두 문법을 언제 골라야 할지 감이 잡힙니다.

 

 

 

04 실전 예제 — 사칙연산 계산기 만들기

연산 기호 하나로 분기하는, switch문이 가장 빛나는 상황

 

연산 기호(+, -, *, /)는 딱 4가지 특정 값으로만 분기하면 되니, switch문이 진가를 발휘하는 대표적인 상황입니다. 실수 두 개와 연산 기호 하나를 "%lf %c %lf" 형식으로 한 번에 입력받아 계산기를 만들어 보겠습니다.

 

사칙연산 계산기

#include <stdio.h>

int main() {
    double n1, n2;
    char op;

    printf("계산식을 입력하세요 (예: 3 + 2): ");
    scanf("%lf %c %lf", &n1, &op, &n2);

    switch (op) {
        case '+':
            printf("%.2lf\n", n1 + n2);
            break;
        case '-':
            printf("%.2lf\n", n1 - n2);
            break;
        case '*':
        case 'x':
        case 'X':
            printf("%.2lf\n", n1 * n2);
            break;
        case '/':
            printf("%.2lf\n", n1 / n2);
            break;
        default:
            printf("잘못된 기호입니다\n");
    }

    return 0;
}

 

▶ 실행 결과 (여러 번 실행)

계산식을 입력하세요 (예: 3 + 2): 3 + 2
5.00

계산식을 입력하세요 (예: 3 + 2): 10 - 4
6.00

계산식을 입력하세요 (예: 3 + 2): 3 x 3
9.00

계산식을 입력하세요 (예: 3 + 2): 7 / 2
3.50

 

 

눈여겨볼 부분은 곱하기입니다. 사람들이 곱하기 기호로 x, X를 쓰기도 하니 case '*': case 'x': case 'X': 로 묶어주면, 3x3이나 3X3처럼 입력해도 곱셈이 정상 동작합니다. 이렇게 앞서 배운 case 묶어 쓰기가 실전에서 자연스럽게 쓰이는 예시입니다.

 

 

 

05 잠깐, scanf 버퍼 비우기 팁

입력이 자꾸 씹히는 이유, 바로 이거 때문입니다

 

scanf로 숫자를 입력받고 이어서 %c로 문자를 받으면, 이전 입력 후 남아있던 엔터(개행문자)가 먼저 읽혀서 원하는 문자를 못 받는 경우가 있습니다. 이럴 땐 표준 입력 스트림(stdin)에 남은 문자 하나를 getchar()로 읽어서 버리면 됩니다.

 

scanf("%lf", &n1);
getchar(); // 남아있는 엔터(개행문자) 하나를 비운다
scanf("%c", &op);

 

📖 버퍼에 여러 글자가 남아있을 것 같다면
한 글자가 아니라 여러 글자가 남아있을 수도 있는 상황이라면, while문으로 개행문자를 만날 때까지 계속 비워줄 수 있습니다.

while (getchar() != '\n');

반복문 뒤에 세미콜론만 찍고 중괄호를 생략한 형태입니다. 실행할 코드가 없을 때 이렇게 줄여 쓸 수 있다는 것도 함께 알아두면 좋습니다.

 

 

 

06 실전 예제 — 요일별 운동 코칭 프로그램

0~6이라는 특정 값 7개를 분기하는, 또 다른 switch 활용법

 

요일(0=일요일 ~ 6=토요일)을 입력받아 그날그날 어떤 운동을 하면 좋을지 알려주는 프로그램입니다. 요일도 정해진 값 몇 개로만 나뉘니 switch문에 잘 맞는 상황입니다.

 

요일별 운동 코칭

#include <stdio.h>

int main() {
    int day;

    printf("오늘 요일을 입력하세요 (0=일요일 ~ 6=토요일): ");
    scanf("%d", &day);

    switch (day) {
        case 0:
        case 1:
            printf("하체 운동을 해보세요\n");
            break;
        case 2:
        case 3:
            printf("상체 운동을 해보세요\n");
            break;
        case 4:
            printf("휴식도 운동이다\n");
            break;
        case 5:
            printf("가벼운 유산소를 해보세요\n");
            break;
        case 6:
            printf("전신 운동으로 마무리해보세요\n");
            break;
        default:
            printf("입력 범위를 넘었습니다\n");
    }

    return 0;
}

 

▶ 실행 결과 (여러 번 실행)

오늘 요일을 입력하세요 (0=일요일 ~ 6=토요일): 1
하체 운동을 해보세요

오늘 요일을 입력하세요 (0=일요일 ~ 6=토요일): -1
입력 범위를 넘었습니다

 

 

✓ 배치를 통일하자
case를 세로로 쌓는 스타일과 가로로 나열하는 스타일을 한 코드 안에 섞어 쓰면 가독성이 오히려 떨어집니다. 하나의 스타일로 통일하는 것이 좋습니다.

 

같은 로직을 if문으로 짜면 if (day == 0 || day == 1) 처럼 조건이 점점 길어집니다. day가 0 또는 3처럼 떨어진 값일 경우엔 더더욱 그렇습니다. 이렇게 값이 흩어져 있을 때는 switch문 쪽이 확실히 더 편합니다.

 

 

 

07 응용 예제 — 콜라츠 추측 확인해보기

아직 증명되지 않은 수학 난제를, switch와 반복문으로 직접 확인

 

📖 콜라츠 추측(Collatz conjecture)이란
어떤 자연수든, 짝수면 2로 나누고 홀수면 3을 곱한 뒤 1을 더하는 과정을 계속 반복하면 결국 1에 도달한다는 추측입니다. 아직 수학적으로 증명되지는 않았지만, 지금까지 계산해본 모든 수는 1로 수렴한다고 알려져 있습니다.

 

짝수/홀수라는 딱 두 가지 값으로만 분기하면 되니, switch문을 쓰기 좋은 상황입니다. 나머지 연산(number % 2)의 결과가 0이면 짝수, 1이면 홀수가 됩니다.

 

1이 될 때까지 반복하며 횟수 세기

int number = 99;
int count = 0;

while (number != 1) {
    int check = number % 2;

    switch (check) {
        case 0:
            number /= 2;
            break;
        case 1:
            number = number * 3 + 1;
            break;
    }

    count++;
}

printf("%d번 만에 1이 되었습니다\n", count);

 

▶ 실행 결과 (number = 99)

342번 만에 1이 되었습니다

 

99라는 숫자로 시작하면 342번 반복 후 1에 도달하는 것을 확인할 수 있습니다. number 값을 바꿔가며 여러 자연수로 직접 실험해보는 것도 재미있는 연습이 됩니다.

 

 

 

08 최종 실습 — 간단한 달력 프로그램

월을 입력하면 며칠까지 있는지 알려주는 프로그램 (윤년 제외)

 

마지막으로 switch문의 목적에 딱 맞는 예제, 달력 프로그램을 만들어 보겠습니다. 월(1~12)을 입력하면 그 달이 며칠까지 있는지 알려주는 프로그램입니다. 이번 예제는 윤년은 따지지 않습니다.

 

28일
2월
30일
4, 6, 9, 11월
31일
1, 3, 5, 7, 8, 10, 12월

 

여기서 잘못된 월(13, -1 등)이 입력되는 경우도 미리 걸러줘야 합니다. switch문 안에서 if로 감싸 처리할 수도 있지만, 그렇게 하면 코드 중첩(들여쓰기 깊이)이 깊어져 가독성이 떨어집니다. 대신 switch문에 들어가기 전에 먼저 범위를 검사하고, 벗어나면 return으로 프로그램을 바로 종료하는 방식이 더 깔끔합니다.

 

📖 return의 또 다른 역할
return은 함수의 결과값을 돌려주는 역할 외에도, 만나는 즉시 프로그램(함수)을 종료시키는 역할을 합니다. main() 함수의 맨 마지막이 아니어도, 코드 중간 어디서든 return을 만나면 그 자리에서 실행이 끝납니다.

 

간단한 달력 프로그램

#include <stdio.h>

int main() {
    int month, days;

    printf("몇 월인지 입력하세요 (1~12): ");
    scanf("%d", &month);

    // switch문에 들어가기 전에 범위부터 검사
    if (month < 1 || month > 12) {
        printf("월은 1월에서 12월까지만 입력이 가능합니다\n");
        return 0;
    }

    switch (month) {
        case 2:
            days = 28;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            days = 30;
            break;
        default:
            days = 31;
    }

    printf("%d월은 %d일까지 있습니다\n", month, days);

    return 0;
}

 

▶ 실행 결과 (여러 번 실행)

몇 월인지 입력하세요 (1~12): 4
4월은 30일까지 있습니다

몇 월인지 입력하세요 (1~12): 13
월은 1월에서 12월까지만 입력이 가능합니다

 

 

🎯 직접 도전해보기
(난이도 중) 지금은 잘못된 월을 입력하면 바로 프로그램이 종료됩니다. while문을 활용해서 제대로 된 월을 입력할 때까지 계속 재입력을 받도록 바꿔보세요. 앞서 배운 비밀번호 자릿수 검사 예제와 원리가 비슷합니다.
(난이도 상) 연도까지 입력받아서 윤년일 때 2월을 29일로 계산해주는 로직을 추가해보세요. 윤년을 판별하는 조건은 검색해서 찾아보는 것을 추천합니다.

 

 

 

📌 핵심 정리

· switch문 : 표현식의 값이 case의 값과 정확히 일치할 때만 반응하는 문법이다
· break : 반복문뿐 아니라 switch문에서도 "여기서 빠져나가라"는 의미로 쓰인다
· 폴스루 : break가 없으면 해당 case부터 아래 코드가 순서대로 전부 실행된다
· case 묶어 쓰기 : 같은 코드를 여러 값에 적용할 때 case를 나란히 이어 쓸 수 있다
· switch vs if : 범위·조건이 복잡하면 if, 특정 값 몇 개로만 분기하면 switch가 유리하다
· switch문에 나오는 모든 예제는 if문으로도 작성 가능하다 — 오늘 배운 건 코드를 읽고 쓰는 선택지를 넓힌 것이다

 

※ 이 글은 아래 동영상으로 학습한 내용을 요약한 글입니다.

 

출처 동영상: https://youtu.be/0Dp4wTDqkoc?si=lgfityGWFoGLT83n

 

 

 

태그 : C언어 switch case문switch문 사용법switch break 폴스루switch if 차이C언어 계산기 만들기scanf 버퍼 비우기콜라츠 추측 C언어C언어 달력 프로그램C언어 코딩 기초 강의getchar 함수 사용법

반응형

'학과 수업 노트 > C언어 기초 배우기' 카테고리의 다른 글

11. 배열  (0) 2026.07.12
10. 함수  (0) 2026.07.05
8. 반복문 while문과 무한반복  (0) 2026.07.02
7. 반복문 - for문  (0) 2026.04.29
6. 조건문 - if문  (0) 2026.04.28
: