지난 편에서는 printf와 scanf로 화면에 값을 출력하고 사용자로부터 값을 입력받는 방법을 배웠습니다. 그런데 지금까지 작성한 프로그램은 위에서 아래로 순서대로만 실행되었죠. 이번에는 “조건에 따라 다른 코드를 실행”할 수 있게 해주는 조건문, 즉 if와 switch에 대해 알아보겠습니다. 조건문을 배우고 나면 사용자의 입력값이나 계산 결과에 따라 프로그램이 스스로 판단해서 다르게 동작하도록 만들 수 있습니다.

if문, 참/거짓을 판단해서 갈림길 만들기

if문은 괄호 안의 조건식이 참(0이 아닌 값)이면 중괄호 블록을 실행하고, 거짓(0)이면 실행하지 않는 가장 기본적인 조건문입니다.

int score = 85;

if (score >= 60) {
    printf("합격입니다.\n");
}

여기에 else를 붙이면 조건이 거짓일 때 실행할 코드를 지정할 수 있고, else if를 중간에 넣으면 여러 조건을 순서대로 검사할 수 있습니다.

int score = 72;

if (score >= 90) {
    printf("A학점\n");
} else if (score >= 80) {
    printf("B학점\n");
} else if (score >= 70) {
    printf("C학점\n");
} else {
    printf("D학점\n");
}

여기서 중요한 점은 else if는 위에서부터 순서대로 검사하다가 조건이 처음 참이 되는 곳에서 멈춘다는 것입니다. 그래서 조건을 큰 값부터 작은 값 순서로 배치해야 원하는 결과가 나옵니다. 만약 순서를 뒤바꿔서 score >= 70을 맨 위에 두면, 90점을 받은 학생도 무조건 “C학점”으로 판정되어 버립니다.

switch문, 값에 따라 여러 갈래로 나누기

조건이 “특정 변수의 값이 무엇이냐”를 비교하는 경우가 많다면 switch문이 if-else보다 훨씬 깔끔합니다.

int day = 3;

switch (day) {
    case 1:
        printf("월요일\n");
        break;
    case 2:
        printf("화요일\n");
        break;
    case 3:
        printf("수요일\n");
        break;
    default:
        printf("알 수 없는 요일\n");
        break;
}

switch를 쓸 때 가장 많이 하는 실수가 break를 빼먹는 것입니다. break가 없으면 해당 case가 실행된 뒤에도 멈추지 않고 바로 아래에 있는 case까지 계속 실행되어 버립니다. 이를 “fall-through”라고 부르는데, 의도적으로 여러 case를 묶어서 같은 동작을 시키고 싶을 때 외에는 항상 break를 챙겨줘야 합니다.

예제 코드로 확인해보기

if와 switch를 함께 활용해서 간단한 성적 처리 프로그램을 만들어 보겠습니다.

#include <stdio.h>

int main(void) {
    int score;
    char grade;

    printf("점수를 입력하세요: ");
    scanf("%d", &score);

    if (score >= 90) {
        grade = 'A';
    } else if (score >= 80) {
        grade = 'B';
    } else if (score >= 70) {
        grade = 'C';
    } else {
        grade = 'F';
    }

    printf("학점: %c\n", grade);

    switch (grade) {
        case 'A':
        case 'B':
            printf("우수한 성적입니다!\n");
            break;
        case 'C':
            printf("조금만 더 노력해봐요.\n");
            break;
        default:
            printf("재수강을 고려해보세요.\n");
            break;
    }

    return 0;
}

코드 동작 설명 및 실행 결과

  • 먼저 scanf로 점수를 입력받아 if-else if 구조로 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 그 미만은 F로 분류합니다.
  • 그다음 switch (grade)에서는 case 'A': 바로 다음에 break 없이 case 'B':가 이어지는데, 이는 A와 B학점을 받은 사람에게 똑같이 “우수한 성적입니다!”를 출력하려는 의도적인 fall-through입니다.
  • 이 코드를 gcc conditionals.c -o conditionals로 컴파일하고 실행한 뒤 “85”를 입력하면 다음과 같은 결과가 나옵니다.
점수를 입력하세요: 85
학점: B
우수한 성적입니다!

만약 “65”를 입력했다면 grade는 'F'가 되고, switch문에서는 어떤 case에도 해당하지 않으므로 default 블록이 실행되어 “재수강을 고려해보세요.”가 출력됩니다.

핵심 요약

  • if-else if-else는 조건을 위에서부터 순서대로 검사하며, 조건 순서를 잘못 배치하면 의도와 다른 결과가 나올 수 있습니다.
  • switch문은 하나의 변수 값을 여러 경우와 비교할 때 if-else보다 가독성이 좋습니다.
  • switch문의 각 case에는 반드시 break를 넣어야 다음 case로 넘어가지 않으며, 의도적으로 여러 case를 묶고 싶을 때만 break를 생략합니다.
  • 조건문을 잘 활용하면 프로그램이 입력값이나 상태에 따라 다르게 동작하도록 만들 수 있습니다.

다음 편에서는 같은 코드를 여러 번 반복해서 실행하는 방법, “반복문 (for/while/do-while)”에 대해 알아보겠습니다. 오늘 배운 조건문과 결합하면 특정 조건을 만족할 때까지 반복하는 훨씬 강력한 프로그램을 만들 수 있습니다.