icon
4장 : 제어문

조건문 if, else if, else

대부분의 프로그램은 단순히 순서대로 명령을 실행하는 것이 아니라 특정 조건에 따라 다른 동작을 수행해야 합니다.

예를 들어 "만약 시험 점수가 60점 이상이면 '합격'이라고 출력하고, 그렇지 않으면 '불합격'이라고 출력"하는 것과 같이 말이죠.

이처럼 프로그램의 실행 흐름을 조건에 따라 변경하는 문법을 조건문(Conditional Statements) 이라고 합니다.

이 장에서는 C++의 가장 기본적인 조건문인 if, else if, else 문에 대해 자세히 알아보겠습니다.


조건문이란 무엇인가?

조건문은 프로그램이 특정 조건을 평가하고, 그 조건이 참(true) 인지 거짓(false) 인지에 따라 다른 코드 블록을 실행하도록 합니다.

이는 프로그램에 '지능'을 부여하여 다양한 상황에 유연하게 대처할 수 있게 합니다.

C++에서 조건의 결과는 항상 bool 타입의 값(true 또는 false)으로 평가됩니다.

bool 값을 만들기 위해 지난 내용에서 학습한 관계 연산자(==, !=, <, >, <=, >=)와 논리 연산자(&&, ||, !)가 주로 사용됩니다.


if 문: 가장 기본적인 조건 판단

if 문은 가장 간단한 형태의 조건문입니다.

주어진 조건이 참일 경우에만 특정 코드 블록을 실행합니다.

if 문 형식
if (조건) {
    // 조건이 true일 때 실행할 코드
}
  • 조건: true 또는 false로 평가되는 표현식입니다. 관계 연산자나 논리 연산자를 사용하여 작성합니다.
  • { } (중괄호): 조건이 참일 때 실행될 코드 블록(Statement Block)을 나타냅니다. 여러 줄의 코드를 포함할 수 있습니다. 만약 한 줄의 코드만 실행할 경우에는 중괄호를 생략할 수 있지만, 일반적으로는 명확성을 위해 항상 중괄호를 사용하는 것이 좋습니다.
if 문 예시
#include <iostream>

int main() {
    int score = 75;

    if (score >= 60) { // score가 60보다 크거나 같은가? (true)
        std::cout << "합격입니다!" << std::endl;
    }

    int temperature = 20;
    if (temperature < 0) { // temperature가 0보다 작은가? (false)
        std::cout << "날씨가 매우 춥습니다." << std::endl;
    }
    // 이 코드는 실행되지 않습니다.

    return 0;
}

if-else 문: 양자택일 조건 판단

if-else 문은 조건이 참일 때와 거짓일 때 각각 다른 코드 블록을 실행해야 할 경우에 사용됩니다.

if-else 문 형식
if (조건) {
    // 조건이 true일 때 실행할 코드
} else {
    // 조건이 false일 때 실행할 코드
}
  • else 키워드는 if 문의 조건이 false로 평가되었을 때 실행될 코드 블록을 정의합니다.
if-else 문 예시
#include <iostream>
#include <string>

int main() {
    int age = 17;

    if (age >= 18) { // age가 18보다 크거나 같은가? (false)
        std::cout << "성인입니다. 투표할 수 있습니다." << std::endl;
    } else {
        std::cout << "미성년자입니다. 투표할 수 없습니다." << std::endl; // 이 코드가 실행됩니다.
    }

    double balance = 500.0;
    double withdrawAmount = 700.0;

    if (withdrawAmount <= balance) {
        balance -= withdrawAmount;
        std::cout << "출금 성공! 남은 잔액: " << balance << std::endl;
    } else {
        std::cout << "잔액이 부족합니다. 현재 잔액: " << balance << std::endl; // 이 코드가 실행됩니다.
    }

    return 0;
}

if-else if-else 문: 다중 조건 판단

여러 개의 조건을 순차적으로 확인하고, 각 조건에 따라 다른 동작을 수행해야 할 때 if-else if-else 문을 사용합니다.

else if 블록은 이전의 if 또는 else if 조건이 모두 거짓일 때만 평가됩니다.

if-else if-else 문 형식
if (조건1) {
    // 조건1이 true일 때 실행할 코드
} else if (조건2) {
    // 조건1이 false이고, 조건2가 true일 때 실행할 코드
} else if (조건3) {
    // 조건1, 조건2가 false이고, 조건3이 true일 때 실행할 코드
} else {
    // 위의 모든 조건이 false일 때 실행할 코드 (선택 사항)
}
  • else if 블록은 여러 개를 추가할 수 있습니다.
  • else 블록은 모든 ifelse if 조건이 거짓일 때 실행되며, 선택 사항입니다. 즉, 특정 조건에만 반응하고 아무 조건에도 해당하지 않을 때는 아무것도 하지 않아도 된다면 else를 생략할 수 있습니다.
if-else if-else 문 예시
#include <iostream>
#include <string>

int main() {
    int grade = 88; // 학생 점수

    if (grade >= 90) {
        std::cout << "학점: A" << std::endl;
    } else if (grade >= 80) { // grade가 90 미만이고 80 이상인가? (88은 이 조건에 해당)
        std::cout << "학점: B" << std::endl; // 이 코드가 실행됩니다.
    } else if (grade >= 70) {
        std::cout << "학점: C" << std::endl;
    } else if (grade >= 60) {
        std::cout << "학점: D" << std::endl;
    } else {
        std::cout << "학점: F" << std::endl;
    }

    // 다른 예시: 요일 판별
    int dayOfWeek = 3; // 1:월, 2:화, ..., 7:일

    if (dayOfWeek == 1) {
        std::cout << "오늘은 월요일입니다." << std::endl;
    } else if (dayOfWeek == 2) {
        std::cout << "오늘은 화요일입니다." << std::endl;
    } else if (dayOfWeek == 3) { // 이 조건에 해당
        std::cout << "오늘은 수요일입니다." << std::endl; // 이 코드가 실행됩니다.
    } else if (dayOfWeek == 4) {
        std::cout << "오늘은 목요일입니다." << std::endl;
    } else if (dayOfWeek == 5) {
        std::cout << "오늘은 금요일입니다." << std::endl;
    } else { // 1~5가 아닌 경우 (주말)
        std::cout << "오늘은 주말입니다!" << std::endl;
    }

    return 0;
}
  • else if 체인은 위에서부터 아래로 순차적으로 조건을 검사합니다.
  • 하나의 조건이라도 참으로 평가되면, 해당 블록이 실행되고 나머지 else ifelse 블록은 건너뛰게 됩니다. 따라서 조건의 순서가 중요합니다. (예: grade >= 60grade >= 90보다 먼저 두면 의도치 않은 결과가 나올 수 있습니다.)

중첩 if 문 (Nested if Statements)

하나의 if 또는 else 블록 안에 다른 if 문을 포함하는 것을 중첩 if이라고 합니다.

더 복잡한 조건 논리를 표현할 때 사용됩니다.

중첩 if 문 예시
#include <iostream>

int main() {
    bool isAdmin = true;
    int userLevel = 5;

    if (isAdmin) { // 첫 번째 조건: 관리자인가? (true)
        std::cout << "관리자 계정입니다." << std::endl;
        if (userLevel >= 5) { // 중첩 조건: 사용자 레벨이 5 이상인가? (true)
            std::cout << "최고 관리자 권한을 가집니다." << std::endl; // 이 코드가 실행됩니다.
        } else {
            std::cout << "일반 관리자 권한을 가집니다." << std::endl;
        }
    } else {
        std::cout << "일반 사용자 계정입니다." << std::endl;
    }

    return 0;
}

중첩 if 문은 코드의 들여쓰기를 통해 가독성을 유지하는 것이 중요합니다.

너무 깊게 중첩되면 코드를 이해하기 어려워지므로, 논리 연산자(&&, ||)를 사용하여 조건을 결합하거나, 함수로 분리하는 등의 방법으로 복잡도를 줄이는 것을 고려해야 합니다.


if 문과 괄호 {}의 중요성

if, else if, else 문 다음에 오는 코드 블록이 한 줄일 경우에는 중괄호 {}를 생략할 수 있습니다.

중괄호 생략 예시
if (score >= 60)
    std::cout << "합격입니다!" << std::endl; // 한 줄이므로 중괄호 생략 가능
else
    std::cout << "불합격입니다!" << std::endl; // 한 줄이므로 중괄호 생략 가능

그러나 이는 실수를 유발하기 쉽습니다.

만약 나중에 한 줄을 추가하게 되면 중괄호가 없어서 의도와 다르게 동작할 수 있습니다.

중괄호 생략의 위험성
if (score >= 60)
    std::cout << "합격입니다!" << std::endl;
    std::cout << "축하합니다!" << std::endl; // 이 줄은 if 문에 속하지 않고 항상 실행됨!

따라서 코드의 명확성과 잠재적인 오류 방지를 위해 if, else if, else 다음에 항상 중괄호를 사용하는 것을 강력히 권장합니다.