C++의 대표적인 제어문인 if / else if / else와 switch-case에 대해 깊이 있는 분석을 제공한다. 조건문은 프로그램이 "특정 조건을 만족할 때 어떤 행동을 할 것인가"를 결정하는 가장 기본적이고 핵심적인 논리 구조이며, 실전 코딩에서도 매우 자주 사용된다.
if, if-else, if-else if-else, 그리고 switch-case 각각의 문법 구조, 동작 원리, 가독성 차이, break 처리 유무에 따른 흐름 차이까지 설명한다.
특히 중첩 조건문에서의 흐름, else if가 생성되는 방식, switch문에서 break를 생략했을 때 발생하는 fall-through 문제 등 실전에서 반드시 알고 있어야 할 개념을 예제 기반으로 정리한다.
if, if-else, else if, switch 등의 키워드를 통해 조건을 검사하고 분기함.{}: 코드 블록을 정의하는 기호. 실행 범위를 명확히 구분.switch문은 특정 변수의 값 자체를 비교하여 분기하며, 범위 비교는 불가능함.break는 switch문에서 case 실행 후 흐름을 중단하지 않으면 발생할 수 있는 fall-through 현상을 방지함.| 용어 | 설명 |
|---|---|
if | 조건이 참일 때 실행되는 블록 |
else | 조건이 거짓일 때 실행되는 블록 |
else if | 여러 조건을 순차적으로 비교할 때 사용 |
switch | 변수 값을 기준으로 여러 case 중 하나 선택 |
case | switch 내부의 조건 값 |
default | case와 일치하는 값이 없을 때 실행 |
break | case 실행 후 흐름을 멈추고 switch문 탈출 |
endl | 출력 후 줄바꿈 및 출력 버퍼 플러시 |
cout | 콘솔 출력 객체 (표준 출력 스트림) |
if문int hp = 100;
if (hp > 0) {
cout << "살았습니다." << endl;
}
int hp = 100; : 변수 hp에 100이라는 값을 대입.if (hp > 0) : 조건이 참이므로 "살았습니다." 출력.endl : 줄바꿈 후 출력 버퍼를 플러시함.📌 출력:
살았습니다.
if-else문int hp = -10;
if (hp > 0) {
cout << "살았습니다." << endl;
} else {
cout << "죽었습니다." << endl;
}
hp는 -10 → hp > 0은 거짓 → else 블록 실행.📌 출력:
죽었습니다.
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 실행.📌 출력:
몬스터가 반격했습니다.
if - else if - else문int hp = 24;
if (hp <= 0) {
cout << "몬스터를 처치했습니다." << endl;
} else if (hp <= 30) {
cout << "몬스터가 도망갔습니다!" << endl;
} else {
cout << "몬스터가 반격했습니다." << endl;
}
hp = 24 → 첫 조건은 거짓, 두 번째 조건 참 → 해당 블록 실행.📌 출력:
몬스터가 도망갔습니다!
if / else if / elseint choice = 1;
if (choice == 0)
{
cout << "가위를 냈습니다" << endl;
}
else if (choice == 1)
{
cout << "바위를 냈습니다" << endl;
}
else
{
cout << "보를 냈습니다" << endl;
}
choice = 1 → choice == 1 조건 참."바위를 냈습니다" 출력.📌 출력:
바위를 냈습니다
💡
else if는 문법적으로else { if (...) }구조를 축약한 형태로, 중괄호 생략 시도 가능하지만, 명확한 코드 흐름을 위해 권장되지 않음.
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 실행.📌 출력:
이상한 걸 냈습니다.
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 = 2 → case 2부터 시작해 break 없으므로 이후 모두 실행됨.📌 출력:
2를 선택했습니다.
3을 선택했습니다.
올바르지 않은 선택입니다.
| 분류 | 특징 |
|---|---|
if / else if / else | 복잡한 조건과 범위 비교 가능. 중첩 구조가 많아지면 가독성이 떨어짐. |
switch-case | 단일 값 비교에 최적. 가독성 좋고 명확하지만, 범위 비교 불가. |
else if | else { if (...) }와 같은 구조. 중괄호 생략은 가능하지만 권장하지 않음. |
break | switch문에서 case 실행 후 빠져나오게 함. 없을 경우 fall-through 발생. |
default | case 모두 일치하지 않을 때 실행되는 마지막 분기. 반드시 있어야 하진 않지만 예외 처리에 유용. |
endl | 줄바꿈 + 출력 버퍼 flush. 디버깅 시 유용하게 사용. |