Menu

C++ if-else: 예제로 보는 조건문

C++에서 if, else if, else로 판단하는 방법 - 조건, 분기 연결, 중첩, 삼항 연산자, 초기화자가 있는 if, 그리고 사람들이 자주 빠지는 함정들.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

if로 판단하기

프로그램은 끊임없이 데이터에 반응합니다. 합격이냐 불합격이냐, 재고가 있느냐 품절이냐, 유효하냐 아니냐. if 문은 C++가 조건에 따라 어떤 코드를 실행할지 고르는 방법입니다.

if는 괄호 안에 조건을 받고, 그 조건이 참일 때만 중괄호 안의 블록을 실행합니다.

조건 score >= 60이 참이므로 메시지가 출력됩니다. 닫는 중괄호 뒤의 줄은 if 바깥에 있으므로 항상 실행됩니다. score40으로 바꾸면 "passed" 줄은 완전히 건너뜁니다.

조건은 bool로 변환됩니다. >, >=, ==, != 같은 비교는 이미 bool을 내놓지만, C++는 0이 아닌 모든 숫자를 참으로, 0을 거짓으로 취급하므로 if (count)는 "count가 0이 아니면"이라는 뜻입니다. 이 암묵적 변환은 편리하지만, 아래에서 보게 될 몇 가지 전형적인 버그의 원인이기도 합니다.

else 추가하기

else는 "그렇지 않으면"의 경로를 제공합니다. 조건이 거짓일 때만 실행되는 코드입니다.

두 블록 중 정확히 하나만 실행됩니다. 둘 다 실행되는 일도, 아무것도 실행되지 않는 일도 없습니다. else는 자체 조건이 없고, 단지 if가 잡지 못한 모든 경우를 받아냅니다.

else if로 연결하기

결과가 둘보다 많을 때는 else if로 조건을 연결합니다. C++는 위에서 아래로 검사하여 조건이 참인 첫 번째 블록을 실행하고 나머지는 건너뜁니다.

순서가 중요합니다. 84는 먼저 >= 90(거짓)으로, 그다음 >= 80(참)으로 검사되므로 B에서 멈추고 아래쪽 경계는 전혀 확인하지 않습니다. 그래서 score >= 80 && score < 90도 필요 없습니다. 두 번째 분기에 도달했다는 것은 이미 score가 90 미만이었음을 보장하기 때문입니다. 가장 좁거나 우선순위가 높은 조건을 먼저 두세요.

C++에는 elif 키워드가 없다는 점에 유의하세요. else if는 말 그대로 본문이 또 다른 ifelse입니다. 중괄호 덕분에 하나의 사다리처럼 읽힐 뿐입니다.

큰 함정: = 와 ==

C와 C++에서 가장 흔한 if 문 버그는 ==(비교)를 의도한 자리에 =(대입)를 쓰는 것입니다.

x = 55x에 대입하고 전체 식이 5로 평가되며, 그것이 true로 변환되므로 분기가 항상 실행되고 x를 모르는 사이에 덮어쓰게 됩니다. 이것은 컴파일되며 대부분의 컴파일러는 경고만 냅니다. 방어책은 두 가지입니다. 경고를 켜서(-Wall) 컴파일러가 표시하도록 하고, 상수를 앞에 두는 것(if (5 == x))을 고려하세요. if (5 = x)는 컴파일러가 즉시 잡아내는 치명적 오류이기 때문입니다.

같은 함정이 bool에도 숨어 있습니다. if (ready = true)는 컴파일되고 대입하지만, if (ready == true)(또는 그냥 if (ready))는 비교합니다.

조건 결합과 중첩

조건은 &&(그리고), ||(또는), !(아님)로 결합하거나, 어떤 검사가 앞선 검사를 통과한 뒤에야 의미가 있을 때 하나의 if를 다른 if 안에 중첩합니다.

&&||는 단락 평가를 합니다. a && b에서 a가 거짓이면 C++는 b를 절대 평가하지 않습니다. 이는 잘못된 메모리 접근을 막는 데 필수적입니다. if (ptr != nullptr && ptr->ready)가 안전한 이유는 ptr이 null일 때 역참조가 건너뛰어지기 때문입니다. 가능하면 깊은 중첩보다 &&로 평탄하게 만드는 쪽을 택하세요. 평탄한 조건이 중괄호 피라미드보다 더 명확하게 읽힙니다.

겉보기와 다른 의미를 갖는 비교 연결에 주의하세요. if (0 < x < 10)은 범위를 검사하지 않습니다. 0 < xbool(0 또는 1)로 평가한 뒤 그것을 10과 비교하므로 항상 참입니다. 대신 if (0 < x && x < 10)이라고 쓰세요.

삼항 연산자

사이에서 고르기만 하면 될 때, 삼항 연산자 ?:는 간결한 한 줄짜리입니다. condition ? a : b는 "조건이 참이면 a, 아니면 b"로 읽습니다.

삼항 연산자는 대입하거나 전달하거나 곧바로 출력할 수 있는 값을 만들어 냅니다. 일반 if로는 할 수 없는 일입니다. 단순한 선택용으로만 쓰세요. 어느 한쪽 분기에 여러 문장이나 실제 로직이 필요하다면, 중첩된 삼항 연산자가 금세 수수께끼가 되는 곳에서도 완전한 if-else는 읽기 쉬운 상태를 유지합니다. (한 가지 미묘한 점: 두 분기는 공통 타입을 공유해야 하므로 예컨대 stringint를 섞지 마세요.)

초기화자가 있는 if (C++17)

C++17부터는 if 안에서 바로 변수를 선언할 수 있으며, 그 범위는 if/else로만 한정됩니다. 이렇게 하면 수명이 짧은 헬퍼가 주변 코드로 새어 나가는 것을 막습니다.

; 앞부분은 한 번 실행되고 그 결과는 조건과 else 양쪽에서 모두 보입니다. 이는 "무언가를 계산한 다음 그것을 기준으로 분기하는" 패턴에 매우 좋습니다. 또한 결과의 변환이 처음에 한 번만 일어나므로, 나중에 다시 계산하거나 실수로 오래된 값을 재사용하는 일을 피할 수 있습니다. 임시 값이 분기에만 필요할 때마다 이것을 활용하세요.

함정: 매달린 중괄호 함정

C++는 분기에 문장이 하나뿐일 때 중괄호를 생략하도록 허용하지만, 이는 미묘한 버그를 부릅니다. 들여쓰기가 거짓말을 하는 것입니다.

if (loggedIn)
    cout << "Welcome\n";
    cout << "Loading dashboard\n";   // if의 일부가 아님!

if가 제어하는 것은 첫 줄뿐이고, 두 번째 줄은 들여쓰기가 그렇게 보이게 함에도 불구하고 loggedIn과 무관하게 항상 실행됩니다. 관련된 전형적 사례는 떠도는 세미콜론입니다. if (x > 0);은 빈 본문으로 if를 끝내므로, 그 뒤를 잇는 블록이 무조건 실행됩니다. 한 줄이라도 항상 중괄호를 쓰면 이런 부류의 실수는 대부분 사라집니다.

다음: switch

if-else if 체인은 각 분기가 서로 다른 조건을 검사할 때 안성맞춤입니다. 하지만 하나의 값을 여러 고정된 가능성과 대조하는 경우 - 메뉴 선택, enum, 상태 코드 등 - 긴 else if 사다리는 반복적이고 순서를 잘못 두기 쉽습니다. switch 문은 바로 그런 상황을 위해 만들어졌으며, 그것이 다음 페이지의 내용입니다.

자주 묻는 질문

C++에서 if-else 문은 어떻게 작성하나요?

if 뒤 괄호 안에 조건을, 실행할 코드를 중괄호 안에 넣고, 조건이 거짓일 때를 위한 선택적 else 블록을 둡니다: if (score >= 60) { cout << "Pass"; } else { cout << "Fail"; }. 조건은 bool로 변환되므로 0이 아닌 모든 숫자는 참으로, 0은 거짓으로 취급됩니다.

C++ if 문에서 = 와 == 의 차이는 무엇인가요?

==는 두 값이 같은지 비교하지만, 하나짜리 =는 대입합니다. if (x = 5)라고 쓰면 5x에 대입한 뒤 5를 검사하므로(항상 참) 전형적인 버그가 됩니다. 경고만 내고 컴파일되므로 경고를 켜고, 상수를 먼저 쓰는 것(if (5 == x))을 고려하세요.

C++의 삼항 연산자란 무엇인가요?

삼항 연산자 condition ? valueIfTrue : valueIfFalse는 값을 만들어 내는 간결한 if-else입니다. 예를 들어 string label = age >= 18 ? "adult" : "minor";는 두 값 중 하나를 고릅니다. 단순한 값 선택에 쓰고, 각 분기에 실제 로직이 있을 때는 완전한 if-else를 사용하세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기