앞서 논리 연산자와 참/거짓의 기준에 대해 알아보았다. 이번 글에서는 프로그램의 흐름을 제어하는 대표적인 구문인 if, else if, else 조건문과 이를 구성하는 비교 연산자, 그리고 실무에서 자주 하는 조건문 구성 시의 주의사항을 정리한다.
1. 조건문의 기본 구조: if
if 문은 말 그대로 "만약 ~라면"을 의미한다. 소괄호 () 안의 조건식이 참(0이 아닌 수)이면 중괄호 {} 내부의 코드를 실행하고, 거짓(0)이면 실행하지 않고 건너뛴다.
int hp = 0;
if (hp <= 0) {
// hp가 0 이하(참)이므로 내부 코드 실행
// "플레이어가 사망했습니다."
}
2. 조건식의 핵심: 비교 연산자
if 문의 조건식에는 두 값을 비교하여 참(1) 또는 거짓(0)을 반환하는 비교 연산자가 주로 사용된다.
| 연산자 | 기호 | 의미 | 예시 (a = 10, b = 20) | 결과 |
|---|---|---|---|---|
| 같다 | == | 두 값이 같은가? | a == b | 거짓 (0) |
| 다르다 | != | 두 값이 다른가? | a != b | 참 (1) |
| 크다 / 작다 | >, < | 초과 / 미만인가? | a < b | 참 (1) |
| 크거나 같다 / 작거나 같다 | >=, <= | 이상 / 이하인가? | a >= b | 거짓 (0) |
⚠️ 초보자가 자주 하는 실수: 대입 연산자(
=)와 비교 연산자(==)를 헷갈려if (a = 10)으로 작성하면,a에10이 대입된 후10은0이 아니므로 무조건 참(True) 으로 처리되는 버그가 발생한다.
3. 분기 처리의 확장: if - else if - else
하나의 조건뿐만 아니라 여러 상황에 따라 다른 코드를 실행해야 할 때 구문을 확장하여 사용한다.
int score = 85;
if (score >= 90) {
// 1. score가 90 이상이면 실행
// A 학점
} else if (score >= 80) {
// 2. 위 조건이 거짓이고, score가 80 이상이면 실행
// B 학점
} else {
// 3. 위의 모든 조건이 거짓일 때 실행
// F 학점
}
-
else if: 앞선 조건이 거짓일 때, 다음 조건을 순차적으로 검사한다. (원하는 만큼 추가 가능) -
else: 연결된 모든 조건이 거짓일 때 최종적으로 실행되는 블록이다. (생략 가능) -
특징: 연결된
if - else if - else구문 중 하나의 조건이라도 참이 되어 실행되면, 나머지 아래의 조건검사는 완전히 건너뛴다.
4. 주의할 점: 독립적인 if vs 연결된 else if (게임 키 입력 예시)
조건문 작성 시 가장 중요한 설계 판단 중 하나는 "조건들을 하나로 연결할 것인가, 독립적으로 나눌 것인가?"이다.
❌ 잘못된 예시: 다중 키 입력을 else if로 연결한 경우
// 이동 키 입력 처리
if (isKeyPressed('W')) {
moveUp();
} else if (isKeyPressed('A')) {
moveLeft(); // W키를 누르고 있으면 A키 입력은 완전히 무시됨 (대각선 이동 불가)
}
W 키와 A 키가 else if로 연결되어 있으면, W 키를 누르고 있는 동안에는 A 키 입력 조건을 검사조차 하지 않는다. 따라서 대각선 이동(W+A 동시 입력)이 불가능해진다.
⭕ 올바른 예시: 독립적인 if 문으로 분리한 경우
// 각각 독립된 조건문으로 분리
if (isKeyPressed('W')) {
moveUp();
}
if (isKeyPressed('A')) {
moveLeft(); // W키 입력 여부와 상관없이 A키 입력도 독립적으로 검사함 (대각선 이동 가능)
}
동시 처리가 필요한 독립적인 사건들은 별개의 if 문으로 작성해야 정상적으로 동시 입력을 처리할 수 있다.
마무리하며
-
if문은 조건식이0이 아니면 참,0이면 거짓으로 판단하여 실행을 결정한다. -
if - else if - else로 연결된 구조는 단 하나만 실행되고 나머지는 스킵된다. -
동시 처리가 필요한 개별 조건(예: 키 입력)은
else if로 묶지 말고 독립된if문으로 작성해야 한다.