본문으로 건너뛰기

안동민 개발노트

본문 시작

조건문 if, else if, else

if·else if·else가 bool 조건에 따라 실행 경로를 고르는 방식을 익히고 중첩 조건을 명확하게 구성합니다.

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

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

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

이 장에서는 C++의 가장 기본적인 조건문인 if, else if, else 문을 다룹니다.

먼저 조건문을 조건식이 만든 true 또는 false 값으로 실행 경로를 고르는 장치로 봅니다.


조건문이란 무엇인가?

조건문을 읽을 때는 조건식이 어떤 bool 값을 만들고, 그 값에 따라 어느 블록이 실행되는지 먼저 확인합니다.

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

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

C++의 if 조건은 그 값이 문맥상 bool로 변환된 뒤 true 또는 false 경로를 고릅니다. 기본 제공 관계 연산자와 논리 연산자는 결과로 bool 값을 직접 만듭니다.

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


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

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

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

if 문 형식
if (조건) {
    // 조건이 true일 때 실행할 코드
}
  • 조건: true 또는 false로 평가되는 표현식입니다. 관계 연산자나 논리 연산자를 사용하여 작성합니다.
  • { } (중괄호): 조건이 참일 때 실행될 복합문(compound statement)을 나타냅니다. 여러 문장을 포함할 수 있습니다. 하위 문장이 정확히 하나의 statement라면 중괄호 없이 쓸 수 있지만, 일반적으로는 명확성을 위해 항상 중괄호를 사용하는 것이 좋습니다. 물리적인 코드 줄 수는 이 문법 기준이 아닙니다.
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~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 { // 입력 전제에서 6 또는 7인 경우 (주말)
        std::cout << "오늘은 주말입니다!" << std::endl;
    }

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

아래 다이어그램은 점수 88을 넣었을 때 조건을 위에서부터 평가하고, 첫 번째로 참인 B 블록만 실행한 뒤 나머지 분기를 건너뛰는 흐름을 보여 줍니다.

C++ if·else if·else 체인이 각 조건을 bool로 해석해 위에서부터 검사하고, 점수 88에서 grade >= 80이 첫 true가 되어 B 블록만 실행한 뒤 나머지 분기를 건너뛰는 흐름

IF / ELSE IF / ELSE

각 조건은 bool로 해석되며, 위에서 내려가 첫 번째 true의 블록 하나만 실행합니다.

점수 88이 B 블록을 선택하는 else if 평가 흐름 grade가 88일 때 grade가 90 이상인지 검사하면 false라 다음 조건으로 내려가고, 80 이상 조건이 true라 B 블록을 실행한 뒤 아래 조건과 else를 건너뛴다. 어떤 조건도 true가 아니면 다음 else if를 계속 검사하고 선택적인 else에 도착한다. true 88: false true false 실행 후 입력 점수 grade = 88 grade >= 90? 첫 조건 A 블록 실행 true면 체인 종료 grade >= 80? 앞 조건이 false일 때만 검사 B 블록 실행 88은 여기서 선택 다음 조건 계속 모두 false면 else(있을 때) 나머지 분기 skip 다음 문장으로 이동
grade = 88 위에서부터 평가
  1. grade >= 90은 false

    A 블록을 건너뛰고 다음 else if 조건으로 내려갑니다.

  2. grade >= 80은 true

    B 블록만 실행하고 이 체인의 조건 검사를 끝냅니다.

첫 true를 찾음

선택된 블록을 실행하고 아래 else ifelse를 건너뜁니다.

아직 모두 false

다음 조건을 계속 검사하며, 끝까지 true가 없으면 존재하는 else를 실행합니다.

기본 제공 관계·논리 표현식은 bool을 만들고, 그 밖의 허용되는 조건 표현식도 문맥상 bool로 변환된 뒤 분기를 결정합니다.

중첩 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 뒤의 하위 문장이 정확히 하나의 statement라면 중괄호 {} 없이 작성할 수 있습니다. 하나의 statement는 여러 줄에 걸칠 수 있고, 반대로 한 줄에도 여러 statement를 쓸 수 있으므로 줄 수로 판단하지 않습니다.

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

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

만약 나중에 두 번째 statement를 추가하면 중괄호가 없어서 의도와 다르게 동작할 수 있습니다.

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

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


조건 순서와 경계값 점검

범위가 겹치는 조건은 더 구체적인 조건부터 배치해야 합니다. 예를 들어 학점 조건에서 grade >= 60을 먼저 두면 90점도 그 블록에서 멈추므로 뒤의 grade >= 90에는 도달하지 못합니다.

또한 대표값만 확인하지 말고 각 경계와 그 바로 아래 값을 함께 넣어 봅니다. 9089, 6059를 비교하면 >=의 포함 범위와 else 도달 여부를 확인할 수 있습니다. else는 모든 조건이 거짓일 때 실행할 기본 동작이 필요한 경우에만 둡니다.

C++ 점수 조건문에서 90·89·60·59가 도착해야 할 첫 분기를 확인하고, 조건 순서·else 경로·중괄호·중첩 깊이를 함께 점검하는 표

BRANCH REVIEW

대표값 하나만 보지 말고 경계의 바로 위·아래를 넣어 비교 연산자와 조건 순서를 함께 검증합니다.

내림차순 점수 조건에서 각 경계 입력이 도착해야 할 첫 분기
입력 처음 true가 되는 조건 실행 결과
90 >= 90 A 블록
89 grade >= 80 B 블록
60 grade >= 60 D 블록
59 모든 조건이 false else의 F 블록
90
첫 true는 grade >= 90, 실행 결과는 A 블록입니다.
89
첫 true는 grade >= 80, 실행 결과는 B 블록입니다.
60
첫 true는 grade >= 60, 실행 결과는 D 블록입니다.
59
모든 조건이 false이므로 else의 F 블록을 실행합니다.

포함 관계가 있으면 구체적인 조건부터

grade >= 60을 먼저 두면 90점도 그 블록에서 멈춰 아래의 grade >= 90에는 도달하지 못합니다.

else는 선택 사항

모든 조건이 false일 때 수행할 기본 동작이 있을 때 둡니다. 입력 유효성 검사는 별도 조건으로 표현해야 합니다.

한 문장이어도 중괄호 유지

나중에 문장을 추가해도 블록의 범위가 달라지지 않도록 {}로 의도를 고정합니다.

중첩이 깊으면 의도를 분리

관련 조건을 &&·||로 명확히 묶거나 함수·조기 반환으로 나누어 각 분기의 역할을 드러냅니다.

경계 테스트는 >=>의 차이, 넓은 조건이 세부 조건을 가리는 문제, 기본 경로의 누락을 빠르게 드러냅니다.

if 문은 단순한 분기 문법이지만, 조건 순서·경계값·블록 범위를 명확히 하지 않으면 쉽게 오류가 생깁니다.