4편에서 연산자와 형 변환으로 값을 계산하고 비교하는 방법을 익혔다면, 이제는 그 비교 결과를 바탕으로 프로그램이 다른 길로 가도록 만들어야 합니다. C에서 조건문은 "지금 어떤 상황인가"를 판단하고, 반복문은 "같은 작업을 몇 번 더 할 것인가"를 결정합니다. 이번 글에서는 if, else, for, while을 중심으로 흐름 제어의 기본을 익힙니다.
이번 글에서 새로 나오는 용어
- 조건식 (Condition Expression):
score > 80처럼 참인지 거짓인지 물어보는 식 - 분기 (Branch):
if문 때문에 코드가 두 갈래 이상으로 나뉘는 흐름 - 반복문 (Loop): 같은 코드를 여러 번 실행하는 구문
- 무한 루프 (Infinite Loop): 종료 조건이 없어 반복이 끝나지 않는 상태
핵심 개념
학습 메모
- 소요 시간: 45~60분
- 준비물: 변수 선언, 비교 연산자 기초,
printf출력 경험- 학습 목표: 조건문과 반복문으로 분기와 반복 패턴 작성하기
조건문은 값의 상태를 보고 다른 코드를 실행하게 만들고, 반복문은 같은 동작을 여러 번 수행하게 만듭니다. 이 둘을 합치면 대부분의 기본 프로그램 흐름을 만들 수 있습니다. 예를 들어 "점수가 80점 이상이면 합격 메시지 출력, 아니면 다시 공부 메시지 출력" 같은 흐름이 바로 조건문입니다.
이번 글에서는 아래 다섯 가지를 중심으로 봅니다.
if,else if,else로 상황별 분기 만들기- 비교 연산자와 논리 연산자로 조건식 구성하기
for반복문으로 정해진 횟수만큼 반복하기while반복문으로 조건이 참인 동안 반복하기break,continue로 반복 흐름 조절하기
코드로 따라하기
if로 조건 나누기
가장 기본적인 조건문은 if입니다. 조건식이 참이면 중괄호 안의 코드가 실행됩니다.
#include <stdio.h>
int main(void) {
int score = 88;
if (score >= 80) {
printf("합격권입니다.\n");
}
return 0;
}
여기서 score >= 80이 조건식입니다. 조건식이 참이면 printf가 실행되고, 거짓이면 중괄호 안은 건너뜁니다.
C에서는 조건식을 true, false라는 말로 설명하더라도, 실제로는 0이면 거짓, 0이 아닌 값이면 참처럼 다루는 경우가 많습니다. 그래서 if (score > 80)처럼 비교 결과를 조건으로 쓸 수도 있고, 나중에는 if (score)처럼 값 자체를 조건으로 쓰는 코드도 만나게 됩니다. 다만 지금은 비교식으로 먼저 익히고, 값 자체를 조건으로 쓰는 형태는 "나중에 보게 될 확장 표현" 정도로만 기억해도 충분합니다.
if, else if, else로 분기하기
상황이 둘 이상이면 else if, else를 이어 붙여 분기를 만들 수 있습니다.
#include <stdio.h>
int main(void) {
int score = 72;
if (score >= 90) {
printf("A 구간입니다.\n");
} else if (score >= 80) {
printf("B 구간입니다.\n");
} else if (score >= 70) {
printf("C 구간입니다.\n");
} else {
printf("추가 학습이 필요합니다.\n");
}
return 0;
}
조건문은 위에서 아래로 차례대로 검사하고, 처음으로 참이 된 블록만 실행합니다. 그래서 범위 조건을 쓸 때는 순서가 중요합니다.
비교 연산자와 논리 연산자
조건식은 비교 연산자와 논리 연산자를 조합해 만듭니다.
==: 같다!=: 다르다>: 크다<: 작다>=: 크거나 같다<=: 작거나 같다&&: 그리고||: 또는!: 아니다
#include <stdio.h>
int main(void) {
int age = 17;
int has_id = 1;
if (age >= 17 && has_id == 1) {
printf("입장 가능합니다.\n");
} else {
printf("입장할 수 없습니다.\n");
}
return 0;
}
입문 단계에서는 1을 참, 0을 거짓처럼 사용하는 예제를 자주 보게 됩니다. C에서는 조건식 결과를 이렇게 0과 0이 아닌 값으로 다루는 경우가 많기 때문입니다. 지금은 "0이면 거짓, 1은 참" 정도로 먼저 익히고, 이후에는 "0이 아닌 다른 값도 참으로 해석될 수 있다"까지 확장해 이해하면 됩니다.
=와 ==를 구분하기
처음 배울 때 가장 자주 하는 실수는 =와 ==를 헷갈리는 것입니다.
=: 값을 대입한다==: 두 값이 같은지 비교한다
int score = 80; // 대입
if (score == 80) {
// 비교
}
조건문 안에서 =를 잘못 쓰면 의도와 다른 동작이 나올 수 있으므로, 비교할 때는 항상 ==인지 다시 확인하는 습관이 중요합니다.
int score = 50;
if (score = 80) {
printf("항상 실행될 수 있는 위험한 코드\n");
}
이 코드는 score에 80을 대입한 뒤, 그 값 80을 조건식으로 판단합니다. 80은 0이 아니므로 참처럼 처리되어 블록이 실행됩니다. 그래서 비교하려는 상황에서는 =가 아니라 ==를 써야 합니다. 실제 작업에서는 컴파일 경고를 잘 보는 습관도 이런 실수를 줄이는 데 큰 도움이 됩니다.
for 반복문으로 여러 번 실행하기
반복 횟수가 비교적 분명할 때는 for 문이 가장 편합니다.
#include <stdio.h>
int main(void) {
int i;
for (i = 1; i <= 5; i++) {
printf("%d번째 출력\n", i);
}
return 0;
}
for (시작값; 조건식; 변화식) 구조로 읽으면 이해하기 쉽습니다.
- 시작값: 반복을 어디서 시작할지
- 조건식: 언제까지 반복할지
- 변화식: 반복이 한 번 끝날 때마다 무엇을 바꿀지
예를 들어 위 코드는 i를 1에서 시작해, i <= 5인 동안 반복하고, 한 번 돌 때마다 i++로 1씩 증가시킵니다. i++는 i = i + 1을 짧게 쓴 형태라고 생각해도 좋습니다.
실행 순서를 한 줄로 적어 보면 더 분명합니다.
i = 1 설정 -> i <= 5 확인 -> 본문 실행 -> i++ -> 다시 i <= 5 확인
while 반복문으로 조건 중심 반복하기
반복 횟수보다 "조건이 참인 동안 계속 실행"이 더 중요할 때는 while을 사용합니다.
#include <stdio.h>
int main(void) {
int countdown = 3;
while (countdown > 0) {
printf("%d\n", countdown);
countdown--;
}
printf("시작!\n");
return 0;
}
while을 쓸 때는 조건을 거짓으로 바꾸는 코드가 반복문 안에 꼭 들어 있어야 합니다. 그렇지 않으면 무한 루프가 됩니다.
break와 continue
반복문 안에서는 흐름을 더 세밀하게 조절할 수도 있습니다.
break: 반복 전체를 바로 끝낸다continue: 이번 한 번만 건너뛰고 다음 반복으로 넘어간다
처음에는 둘을 따로 기억하는 것이 좋습니다. continue는 "이번 차례만 건너뛴다", break는 "반복 자체를 끝낸다"에 가깝습니다.
#include <stdio.h>
int main(void) {
int i;
for (i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
if (i == 5) {
break;
}
printf("i = %d\n", i);
}
return 0;
}
이 코드는 i == 3일 때는 출력하지 않고, i == 5가 되면 반복 전체를 끝냅니다. 실행 순서를 직접 적어 보면서 따라가면 더 쉽게 이해할 수 있습니다. 나중에 중첩 반복문을 배우면 break가 "가장 안쪽 반복문 하나"에만 적용된다는 점도 함께 보게 됩니다.
실전 예시: 경고 점수 세기
조건문과 반복문을 함께 쓰면 여러 값 중 특정 조건에 해당하는 것만 골라낼 수 있습니다.
#include <stdio.h>
int main(void) {
int scores[5] = {95, 61, 48, 82, 55};
int i;
int warning_count = 0;
for (i = 0; i < 5; i++) {
if (scores[i] < 60) {
warning_count++;
printf("경고 대상 점수: %d\n", scores[i]);
}
}
printf("총 경고 인원: %d\n", warning_count);
return 0;
}
여기서는 길이가 5인 점수 묶음에서 첫 번째부터 다섯 번째까지 하나씩 확인하면서, 60점 미만일 때만 카운트를 올립니다. 아직 배열을 깊게 배우기 전이므로, 지금은 scores[i]를 "i번째 점수" 정도로만 읽어도 충분합니다. 이 예제의 핵심은 배열 자체보다도 "여러 값을 반복해서 검사하며 조건에 맞는 것만 고른다"는 흐름입니다.
왜 중요한가
조건문과 반복문은 프로그램의 뼈대입니다. 변수만 있으면 값을 담을 수는 있지만, 언제 다른 메시지를 보여 줄지, 어떤 계산을 몇 번 반복할지, 어느 시점에서 멈출지는 조건문과 반복문이 결정합니다.
이번 글에서 꼭 남겨야 할 핵심은 다섯 가지입니다.
- 조건문은 값의 상태에 따라 다른 코드를 실행하게 만든다.
- 반복문은 같은 작업을 여러 번 수행하게 만든다.
for는 횟수가 비교적 분명할 때,while은 조건 중심일 때 자주 쓴다.break,continue로 반복 흐름을 더 세밀하게 조절할 수 있다.=와==를 헷갈리지 않는 습관이 매우 중요하다.
이 흐름 제어 감각이 잡히면 다음 편에서 함수를 만들 때도 "어떤 조건과 반복을 하나의 기능으로 묶을지"를 더 자연스럽게 판단할 수 있습니다.
CodeSandbox로 이어서 실습하기
아래 샌드박스는 CodeSandbox의 Universal starter입니다. C는 터미널에서 직접 컴파일하고 다시 실행하는 흐름이 중요하니, 이번 글의 코드를 파일로 만들고 빌드-실행 사이클을 다시 따라가 보세요.
💬 댓글
이 글에 대한 의견을 남겨주세요