주제

  • C++의 대표적인 제어문인 if / else if / elseswitch-case에 대해 깊이 있는 분석을 제공한다. 조건문은 프로그램이 "특정 조건을 만족할 때 어떤 행동을 할 것인가"를 결정하는 가장 기본적이고 핵심적인 논리 구조이며, 실전 코딩에서도 매우 자주 사용된다.

  • if, if-else, if-else if-else, 그리고 switch-case 각각의 문법 구조, 동작 원리, 가독성 차이, break 처리 유무에 따른 흐름 차이까지 설명한다.

  • 특히 중첩 조건문에서의 흐름, else if가 생성되는 방식, switch문에서 break를 생략했을 때 발생하는 fall-through 문제 등 실전에서 반드시 알고 있어야 할 개념을 예제 기반으로 정리한다.


개념

  • 분기문(제어문): 조건에 따라 코드 흐름을 나누는 구문. 프로그램이 상황에 따라 어떤 행동을 해야 할지를 제어함.
  • 조건문(Conditional Statement): if, if-else, else if, switch 등의 키워드를 통해 조건을 검사하고 분기함.
  • 중괄호 {}: 코드 블록을 정의하는 기호. 실행 범위를 명확히 구분.
  • switch은 특정 변수의 값 자체를 비교하여 분기하며, 범위 비교는 불가능함.
  • breakswitch문에서 case 실행 후 흐름을 중단하지 않으면 발생할 수 있는 fall-through 현상을 방지함.

용어정리

용어설명
if조건이 참일 때 실행되는 블록
else조건이 거짓일 때 실행되는 블록
else if여러 조건을 순차적으로 비교할 때 사용
switch변수 값을 기준으로 여러 case 중 하나 선택
caseswitch 내부의 조건 값
defaultcase와 일치하는 값이 없을 때 실행
breakcase 실행 후 흐름을 멈추고 switch문 탈출
endl출력 후 줄바꿈 및 출력 버퍼 플러시
cout콘솔 출력 객체 (표준 출력 스트림)

코드 분석

1. 기본 if

int hp = 100;

if (hp > 0) {
    cout << "살았습니다." << endl;
}
  • int hp = 100; : 변수 hp에 100이라는 값을 대입.
  • if (hp > 0) : 조건이 참이므로 "살았습니다." 출력.
  • endl : 줄바꿈 후 출력 버퍼를 플러시함.

📌 출력:

살았습니다.

2. if-else

int hp = -10;

if (hp > 0) {
    cout << "살았습니다." << endl;
} else {
    cout << "죽었습니다." << endl;
}
  • hp는 -10 → hp > 0은 거짓 → else 블록 실행.

📌 출력:

죽었습니다.

3. 중첩 if-else

int hp = 50;

if (hp <= 0) {
    cout << "몬스터를 처치했습니다." << endl;
} else {
    if (hp <= 30) {
        cout << "몬스터가 도망갔습니다!" << endl;
    } else {
        cout << "몬스터가 반격했습니다." << endl;
    }
}
  • hp = 50 → 첫 조건 hp <= 0 거짓.
  • 두 번째 조건 hp <= 30도 거짓 → 마지막 else 실행.

📌 출력:

몬스터가 반격했습니다.

4. if - else if - else

int hp = 24;

if (hp <= 0) {
    cout << "몬스터를 처치했습니다." << endl;
} else if (hp <= 30) {
    cout << "몬스터가 도망갔습니다!" << endl;
} else {
    cout << "몬스터가 반격했습니다." << endl;
}
  • hp = 24 → 첫 조건은 거짓, 두 번째 조건 참 → 해당 블록 실행.

📌 출력:

몬스터가 도망갔습니다!

5. 가위바위보 예제 - if / else if / else

int choice = 1;

if (choice == 0)
{
    cout << "가위를 냈습니다" << endl;
}
else if (choice == 1)
{
    cout << "바위를 냈습니다" << endl;
}
else
{
    cout << "보를 냈습니다" << endl;
}
  • choice = 1choice == 1 조건 참.
  • "바위를 냈습니다" 출력.

📌 출력:

바위를 냈습니다

💡 else if는 문법적으로 else { if (...) } 구조를 축약한 형태로, 중괄호 생략 시도 가능하지만, 명확한 코드 흐름을 위해 권장되지 않음.


6. switch-case

int choice = 4;

switch (choice) {
case 0:
    cout << "가위를 냈습니다." << endl;
    break;
case 1:
    cout << "바위를 냈습니다." << endl;
    break;
case 2:
    cout << "보를 냈습니다." << endl;
    break;
default:
    cout << "이상한 걸 냈습니다." << endl;
    break;
}
  • choice = 4 → case 0~2 해당 안됨 → default 실행.

📌 출력:

이상한 걸 냈습니다.

7. switch-case에서 break 누락 시 문제

int choice = 2;

switch (choice) {
case 1:
    cout << "1을 선택했습니다." << endl;
case 2:
    cout << "2를 선택했습니다." << endl;
case 3:
    cout << "3을 선택했습니다." << endl;
default:
    cout << "올바르지 않은 선택입니다." << endl;
}
  • choice = 2case 2부터 시작해 break 없으므로 이후 모두 실행됨.

📌 출력:

2를 선택했습니다.
3을 선택했습니다.
올바르지 않은 선택입니다.

핵심 요약

분류특징
if / else if / else복잡한 조건과 범위 비교 가능. 중첩 구조가 많아지면 가독성이 떨어짐.
switch-case단일 값 비교에 최적. 가독성 좋고 명확하지만, 범위 비교 불가.
else ifelse { if (...) }와 같은 구조. 중괄호 생략은 가능하지만 권장하지 않음.
breakswitch문에서 case 실행 후 빠져나오게 함. 없을 경우 fall-through 발생.
defaultcase 모두 일치하지 않을 때 실행되는 마지막 분기. 반드시 있어야 하진 않지만 예외 처리에 유용.
endl줄바꿈 + 출력 버퍼 flush. 디버깅 시 유용하게 사용.

profile
李家네_공부방

0개의 댓글