5. 조건문

header


1. 조건문이란?

프로그램은 기본적으로 위에서 아래로 순차적으로 실행됩니다. 하지만 특정 조건에 따라 실행 흐름을 바꾸고 싶을 때가 있습니다. 이때 사용하는 것이 조건문입니다.

조건문 = 실행 흐름을 제어하는 문장
조건이 참(True)이면 실행하고, 거짓(False)이면 건너뜁니다.

조건문의 종류:

  • if문: 조건이 참일 때만 실행
  • if-else문: 조건에 따라 두 갈래로 분기
  • if-else if-else문: 여러 조건을 순차적으로 검사
  • switch문: 값에 따라 여러 갈래로 분기

2. if문

if문은 가장 기본적인 조건문으로, 조건이 참일 때만 코드를 실행합니다.

기본 형태

if (조건)
{
    // 조건이 참일 때 실행할 코드
}

조건이 참(1)이면 중괄호 안의 코드를 실행하고, 거짓(0)이면 건너뜁니다.

실습 1

#include <stdio.h>

int main() {
    int age = 20;

    if (age >= 18) {
        printf("성인입니다.\n");
    }

    if (age < 18) {
        printf("미성년자입니다.\n");
    }

    return 0;
}
실행 결과 보기
성인입니다.
  • 06행: age >= 18이 참이므로 실행됩니다.
  • 10행: age < 18이 거짓이므로 실행되지 않습니다.

중괄호 생략

실행할 문장이 하나뿐이면 중괄호를 생략할 수 있습니다.

if (score >= 60)
    printf("합격\n");  // 한 줄이면 중괄호 생략 가능
💡 권장사항
중괄호를 생략할 수 있지만, 가독성과 유지보수를 위해 항상 중괄호를 사용하는 것이 좋습니다.

3. if-else문

if-else문은 조건이 참일 때와 거짓일 때 각각 다른 코드를 실행합니다.

기본 형태

if (조건)
{
    // 조건이 참일 때 실행
}
else
{
    // 조건이 거짓일 때 실행
}

실습 2

#include <stdio.h>

int main() {
    int number = 7;

    if (number % 2 == 0) {
        printf("%d는 짝수입니다.\n", number);
    }
    else {
        printf("%d는 홀수입니다.\n", number);
    }

    return 0;
}
실행 결과 보기
7는 홀수입니다.

7을 2로 나눈 나머지는 1이므로 조건이 거짓입니다. 따라서 else 블록이 실행됩니다.


4. if-else if-else문

여러 조건을 순차적으로 검사할 때 사용합니다.

기본 형태

if (조건1)
{
    // 조건1이 참일 때 실행
}
else if (조건2)
{
    // 조건1은 거짓, 조건2가 참일 때 실행
}
else if (조건3)
{
    // 조건1, 2는 거짓, 조건3이 참일 때 실행
}
else
{
    // 모든 조건이 거짓일 때 실행
}
⚠️ 중요
조건을 위에서부터 순차적으로 검사하며, 첫 번째로 참인 조건만 실행됩니다. 나머지 조건은 검사하지 않습니다.

실습 3

#include <stdio.h>

int main() {
    int score = 85;

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

    return 0;
}
실행 결과 보기
학점: B
  • score >= 90 → 거짓 → 다음 조건으로
  • score >= 80 → 참 → "학점: B" 출력 후 조건문 종료
  • 나머지 조건은 검사하지 않음

else 생략 가능

모든 조건이 거짓일 때 아무것도 실행하지 않으려면 else를 생략할 수 있습니다.

if (num == 1)
    printf("일\n");
else if (num == 2)
    printf("이\n");
else if (num == 3)
    printf("삼\n");
// else 생략: 1, 2, 3이 아니면 아무것도 출력 안 함

5. 중첩 if문

if문 안에 또 다른 if문을 포함할 수 있습니다. 이를 중첩 if문이라고 합니다.

기본 형태

if (조건1)
{
    if (조건2)
    {
        // 조건1과 조건2가 모두 참일 때 실행
    }
}

실습 4

#include <stdio.h>

int main() {
    int age = 25;
    int hasLicense = 1;  // 1: 면허 있음, 0: 면허 없음

    if (age >= 18) {
        printf("성인입니다.\n");

        if (hasLicense == 1) {
            printf("운전 가능합니다.\n");
        }
        else {
            printf("면허가 필요합니다.\n");
        }
    }
    else {
        printf("미성년자는 운전할 수 없습니다.\n");
    }

    return 0;
}
실행 결과 보기
성인입니다.
운전 가능합니다.
  • 첫 번째 if: age >= 18 → 참
  • 중첩된 if: hasLicense == 1 → 참
  • 두 조건을 모두 만족하므로 "운전 가능합니다." 출력
💡 팁
중첩이 깊어질수록 코드가 복잡해집니다. 가능하면 논리 연산자(&&, ||)로 조건을 합치는 것이 좋습니다.

논리 연산자로 개선:

// 중첩 if문
if (age >= 18) {
    if (hasLicense == 1) {
        printf("운전 가능\n");
    }
}

// 논리 연산자 사용 (더 간결)
if (age >= 18 && hasLicense == 1) {
    printf("운전 가능\n");
}

6. switch문

switch문은 하나의 변수나 식의 값에 따라 여러 갈래로 분기할 때 사용합니다.

기본 형태

switch (변수 또는 )
{
    case 1:
        // 변수가 값1과 같을 때 실행
        break;

    case 2:
        // 변수가 값2와 같을 때 실행
        break;

    case 3:
        // 변수가 값3과 같을 때 실행
        break;

    default:
        // 어떤 case에도 해당하지 않을 때 실행
        break;
}
switch문의 특징
• 정수형 값(int, char 등)만 사용 가능
• 각 case는 break로 구분
• default는 생략 가능 (선택사항)

실습 5

#include <stdio.h>

int main() {
    int menu;

    printf("메뉴를 선택하세요 (1-3): ");
    scanf("%d", &menu);

    switch (menu) {
        case 1:
            printf("아메리카노를 주문하셨습니다.\n");
            break;

        case 2:
            printf("카페라떼를 주문하셨습니다.\n");
            break;

        case 3:
            printf("카푸치노를 주문하셨습니다.\n");
            break;

        default:
            printf("잘못된 선택입니다.\n");
            break;
    }

    return 0;
}
실행 결과 보기
메뉴를 선택하세요 (1-3): 2
카페라떼를 주문하셨습니다.

7. break의 역할

break는 switch문을 즉시 종료합니다. break가 없으면 다음 case도 계속 실행됩니다.

break가 있을 때

int num = 2;

switch (num) {
    case 1:
        printf("일\n");
        break;  // switch 종료
    case 2:
        printf("이\n");
        break;  // switch 종료
    case 3:
        printf("삼\n");
        break;  // switch 종료
}
// 출력: 이

break가 없을 때 (Fall-through)

int num = 2;

switch (num) {
    case 1:
        printf("일\n");
        // break 없음
    case 2:
        printf("이\n");
        // break 없음
    case 3:
        printf("삼\n");
        // break 없음
}
// 출력: 이
//       삼
⚠️ 주의
break를 빼먹으면 의도하지 않은 동작이 발생합니다. 각 case 끝에 break를 잊지 마세요!

break 생략을 활용하기

때로는 의도적으로 break를 생략하여 여러 case를 묶을 수 있습니다.

#include <stdio.h>

int main() {
    int day;

    printf("요일을 숫자로 입력 (1-7): ");
    scanf("%d", &day);

    switch (day) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("평일입니다.\n");
            break;

        case 6:
        case 7:
            printf("주말입니다.\n");
            break;

        default:
            printf("잘못된 입력입니다.\n");
            break;
    }

    return 0;
}

8. if문 vs switch문

언제 if문을 사용하나요?

  • 범위 조건을 검사할 때 (score >= 90)
  • 비교 연산자가 필요할 때 (age < 18)
  • 복잡한 조건식이 필요할 때 (age >= 18 && hasLicense)
  • 실수형 값을 비교할 때

언제 switch문을 사용하나요?

  • 하나의 변수가 여러 고정된 값과 비교될 때
  • 정수형 또는 문자형 값만 다룰 때
  • 메뉴 선택, 요일 구분 등 명확한 경우의 수가 있을 때

비교 예시:

// if문으로 메뉴 선택
if (menu == 1)
    printf("아메리카노\n");
else if (menu == 2)
    printf("카페라떼\n");
else if (menu == 3)
    printf("카푸치노\n");

// switch문으로 메뉴 선택 (더 깔끔)
switch (menu) {
    case 1: printf("아메리카노\n"); break;
    case 2: printf("카페라떼\n"); break;
    case 3: printf("카푸치노\n"); break;
}

9. 종합 실습

문제 1 - 절댓값 구하기 (기초)

문제 1

다음 코드의 실행 결과는?

조건문
num이 음수이므로 부호를 반전시킵니다.
#include <stdio.h>

int main() {
    int num = -15;

    if (num < 0) {
        num = -num;
    }

    printf("%d", num);

    return 0;
}

문제 2 - 학점 계산 (기초)

문제 2

점수가 75일 때 출력되는 학점은?

조건문
75는 70 이상이므로 세 번째 조건에 해당합니다.
#include <stdio.h>

int main() {
    int score = 75;

    if (score >= 90)
        printf("A");
    else if (score >= 80)
        printf("B");
    else if (score >= 70)
        printf("C");
    else
        printf("D");

    return 0;
}

문제 3 - switch문 (중급)

문제 3

다음 코드에서 num이 2일 때 출력 결과는?

조건문
case 2에 break가 없으므로 case 3도 실행됩니다.
#include <stdio.h>

int main() {
    int num = 2;

    switch (num) {
        case 1:
            printf("A");
        case 2:
            printf("B");
        case 3:
            printf("C");
            break;
        default:
            printf("D");
    }

    return 0;
}

문제 4 - 중첩 if문 (중급)

문제 4

다음 코드의 실행 결과는?

조건문
x > 5는 참, y > 15도 참입니다.
#include <stdio.h>

int main() {
    int x = 10, y = 20;

    if (x > 5) {
        if (y > 15) {
            printf("A");
        }
        else {
            printf("B");
        }
    }
    else {
        printf("C");
    }

    return 0;
}

문제 5 - 윤년 판별 (고급)

문제 5

2024년은 윤년인가요? (1: 윤년, 0: 평년)

// 윤년 조건:
// 1. 4로 나누어떨어지고
// 2. 100으로 나누어떨어지지 않거나
// 3. 400으로 나누어떨어지면 윤년

int year = 2024;
int isLeap;

if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    isLeap = 1;
else
    isLeap = 0;
조건문
2024는 4로 나누어떨어지고, 100으로 나누어떨어지지 않습니다.

핵심 요약

1. if문
• 조건이 참일 때만 실행
• 형태: if (조건) { 실행문 }

2. if-else문
• 참/거짓에 따라 두 갈래 분기
• 형태: if (조건) { ... } else { ... }

3. if-else if-else문
• 여러 조건을 순차 검사
• 첫 번째로 참인 조건만 실행

4. 중첩 if문
• if문 안에 if문 포함
• 논리 연산자로 대체 가능

5. switch문
• 값에 따라 여러 갈래 분기
• 정수형/문자형만 사용 가능
• 각 case 끝에 break 필요

6. break
• switch문 즉시 종료
• 빼먹으면 다음 case도 실행됨

7. if vs switch
• 범위 비교 → if문
• 고정된 값 비교 → switch문