
💡 1분 핵심 요약 (TL;DR)
- ✅ while문 — 조건식만으로 반복을 실행하는 문법. 무한 반복 구현에 특히 적합하다
- ✅ 무한 반복은 종료 조건(if + break)을 반드시 먼저 설계해두고 시작해야 안전하다
- ✅ for문 → while문 변환 — 초기값은 while 앞, 조건식은 괄호 안, 증감식은 논리에 맞는 위치에
- ✅ strlen()으로 문자열 길이를 확인해 비밀번호 자릿수 검사 같은 로직을 만들 수 있다
- ✅ rand() + srand(time(NULL))로 매번 다른 랜덤한 정수를 만들어 업다운 게임을 완성한다
01 for문과 while문, 뭐가 다를까
같은 반복인데 왜 두 가지 문법이 필요한 걸까요
지난 시간에 배운 for문은 몇 번 반복할지가 정해져 있는 유한한 상태에 적합한 문법이었습니다. 오늘 배울 while문은 유한한 반복도 가능하지만, 무한한 상태의 반복까지 구현할 수 있다는 점이 다릅니다. "컴퓨터가 계속 돌아가다가 버튼을 눌러야 꺼진다"처럼 언제 멈출지 미리 알 수 없는 상황에는 while문이 훨씬 자연스럽습니다.
| for문 · 초기값 · 조건식 · 증감식이 한 줄에 · 반복 횟수가 정해진 유한한 상태에 적합 · 여러 개의 데이터를 다룰 때 유리 |
while문 · 괄호 안에 조건식만 존재 · 무한한 상태의 반복도 구현 가능 · 어떤 상태에 따라 종료 여부를 판단할 때 유리 |

📖 while문 기본 구조
조건식이 참(true)이면 코드 블록을 실행하고, 다시 조건식을 검사합니다. 이 과정을 조건식이 거짓이 될 때까지 반복합니다. for문과 달리 초기값·증감식이 필수가 아니라, 오직 조건식만으로 동작합니다.
같은 로직, for문 vs while문
// for문 버전
for (int age = 0; age < 20; age++) {
printf("%d\n", age);
}
printf("성인입니다\n");
// while문 버전
int age = 0; // 초기값은 while문 앞에
while (age < 20) { // 조건식만 괄호 안에
printf("%d\n", age);
age++; // 증감식은 코드 블록 안에
}
printf("성인입니다\n");
for문에서는 한 줄에 담겨 있던 초기값·조건식·증감식이 while문에서는 세 군데로 흩어집니다. 초기값은 while문이 시작되기 전에, 조건식은 괄호 안에, 증감식은 코드 블록의 적절한 위치에 각각 넣어줘야 합니다.
02 무한 반복, 왜 브레이크가 중요할까
자동차가 빨리 달릴 수 있는 이유는 브레이크가 있어서입니다
while문의 조건식에 1처럼 항상 참인 값을 넣으면 무한 반복이 됩니다. 증감식을 빠뜨려서 조건이 영원히 거짓이 되지 않는 경우도 마찬가지입니다. 이 상태로 실행하면 프로그램이 멈추지 않고 계속 돌아가는데, 강사는 이를 "자동차가 빨리 달릴 수 있는 이유는 모터나 바퀴가 아니라 브레이크가 있기 때문"이라는 비유로 설명합니다. 안전하게 멈출 수 있어야 마음 놓고 반복시킬 수 있다는 뜻입니다.

⚠️ 실수로 무한 반복에 빠졌다면
프로그램이 멈추지 않고 계속 실행되면 Ctrl + C를 눌러 강제 종료할 수 있습니다. 다만 이건 어디까지나 비상 수단입니다. 정상적인 방법은 처음부터 if + break로 종료 조건을 코드 안에 만들어 두는 것입니다.
그래서 while문을 작성할 때는 순서를 이렇게 잡는 것이 좋습니다. ① 언제 끝날지에 대한 안전장치(종료 조건)를 먼저 구현하고, ② 그 다음에 본격적인 로직을 채워 넣는 것입니다. 아래 2배씩 곱하는 예제로 감을 잡아 보겠습니다.
1이 목표값을 넘을 때까지 몇 번 2배 했는지 세기
int total = 1;
int goal = 10000;
int count = 0;
while (total < goal) {
total = total * 2;
count++; // "곱했다"는 사실 바로 뒤에 세는 게 자연스럽다
}
printf("%d\n", total);
printf("%d\n", count);
✓ 증감식 위치는 "공식"이 아니라 "논리"로 정한다
for문에서는 증감식이 항상 맨 마지막에 있다 보니 while문에서도 무조건 마지막에 넣어야 한다고 생각하기 쉽습니다. 하지만 count는 "2를 곱했다"는 사실과 의미가 연결돼 있으므로, total을 갱신한 바로 다음 줄에 두는 것이 더 자연스러운 흐름입니다. 증감식 자리는 공식이 아니라 코드의 의미를 보고 판단해야 합니다.
03 업다운 게임에 종료 조건 추가하기
몇 번을 시도해도 못 맞추면 게임을 끝내는 안전장치
지난 시간에 만든 업다운 게임을 while(1)로 된 무한 반복으로 바꾸고, 시도 횟수를 세는 카운트를 종료 조건으로 활용해 보겠습니다. 20번 안에 못 맞추면 게임이 끝나는 구조입니다.
20번 안에 정답을 못 맞추면 종료
int input = 0;
int count = 0;
int goal = 75;
while (1) {
count++;
// 종료 조건을 메인 로직보다 먼저 배치
if (count > 20) {
printf("20번 동안 못 맞췄습니다\n");
break;
}
scanf("%d", &input);
if (input > goal) {
printf("다운\n");
} else if (input < goal) {
printf("업\n");
} else {
printf("%d번째 시도에 성공했습니다\n", count);
break;
}
}

여기서 if (count > 20) { break; } 부분을 삭제하면 어떻게 될까요? 시도 횟수 제한이 없는 무한 도전 모드가 됩니다. count는 더 이상 종료 조건이 아니라 "몇 번 도전했는지"를 기록하는 용도로만 남게 되죠. 이렇게 종료 조건을 넣고 빼는 것만으로도 게임의 난이도와 규칙을 자유롭게 조절할 수 있습니다.
04 응용 예제 — 비밀번호 자릿수 검사하기
"8자 이상 입력하세요" 같은 문구, 이렇게 만들어집니다
회원가입 화면에서 흔히 보는 "비밀번호는 8자 이상 입력하세요" 문구를 while문으로 직접 구현해 보겠습니다. 이를 위해서는 문자열의 글자 수를 세는 방법이 필요한데, <string.h> 헤더를 추가하면 strlen() 함수로 글자 길이를 바로 알아낼 수 있습니다.
📖 strlen()이란
string.h 헤더에 들어있는 함수로, 문자열의 길이(글자 수)를 정수로 돌려줍니다. 예를 들어 strlen("ABC")는 3을 반환합니다.
✅ 먼저 strlen() 자체부터 직접 찍어보기
#include <stdio.h>
#include <string.h>
int main() {
char password[20] = "";
printf("Enter Password : ");
scanf("%s", password);
// strlen -> string length
int result = strlen(password);
printf("strlen(password) = %d", result);
return 0;
}
✓ 눈여겨볼 두 가지
① char password[20] = ""; 처럼 빈 문자열로 초기화해두면 배열 안에 이전 실행의 쓰레기값이 남아있는 것을 방지할 수 있습니다.
② scanf로 배열에 값을 받을 때는 일반 변수와 달리 &를 붙이지 않습니다. 배열 이름 자체가 이미 주소값이기 때문입니다.
위 코드는 글자 수를 확인만 하는 코드입니다. 여기에 while문과 if + break를 더하면, 글자 수가 조건에 맞을 때까지 반복해서 다시 입력받는 로직으로 발전시킬 수 있습니다.
8자 미만이면 다시 입력받기
#include <stdio.h>
#include <string.h>
int main() {
char password[20] = "";
int minLength = 8;
while (1) {
printf("비밀번호를 입력하세요: ");
scanf("%s", password);
int result = strlen(password);
if (result >= minLength) {
break;
}
printf("8글자 이상으로 입력하세요\n");
}
printf("비밀번호 입력이 제대로 되었습니다\n");
return 0;
}
종료 조건을 if + break가 아니라 continue로 짤 수도 있습니다. "8자 미만이면 continue로 처음으로 돌아가고, 그 외에는 아래에서 break"하는 식입니다. 다만 강의에서는 이 방식이 흔치는 않다고 짚으며, 일반적으로는 종료 조건을 만들고 break로 빠져나오는 방식이 더 널리 쓰인다고 설명합니다.
05 rand()로 진짜 랜덤 업다운 게임 완성하기
정답이 항상 75면 재미없죠, 이제 매번 다른 숫자로
지금까지는 정답(goal)이 75로 고정돼 있었습니다. 이번엔 rand() 함수로 매번 다른 숫자가 정답이 되도록 만들어 보겠습니다. rand()를 쓰려면 <stdlib.h>가, 진짜 랜덤한 값을 만들려면 현재 시간을 활용하는 <time.h>가 필요합니다.

| ① srand(time(NULL)) 현재 시간을 시드값으로 설정 |
→ | ② rand() % 100 + 1 1~100 사이 랜덤 정수 생성 |
→ | ③ goal에 저장 매 실행마다 다른 정답 |
⚠️ srand(고정된 숫자)의 함정
srand()에 1이나 0처럼 고정된 값을 넣으면, 랜덤값처럼 보여도 실행할 때마다 똑같은 숫자가 나옵니다. 마인크래프트에서 시드값을 똑같이 넣으면 같은 지형이 만들어지는 것과 같은 원리입니다. 매번 다른 값을 얻으려면 항상 변하는 현재 시간(time(NULL))을 시드값으로 써야 합니다.
✓ 나머지 연산으로 원하는 범위 만들기
rand() % 100은 0~99를 만들어 줍니다. 여기에 +1을 더하면 1~100 범위가 되죠. 만약 200~300 사이의 값이 필요하다면, rand() % 101로 0~100을 만든 뒤 +200을 더해 최솟값을 맞춰주면 됩니다. 즉 "% 범위 + 최솟값" 공식으로 원하는 구간을 자유롭게 만들 수 있습니다.
완성된 랜덤 업다운 게임
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 현재 시간을 시드값으로 초기화
int goal = rand() % 100 + 1; // 1~100 사이 랜덤 정답
int input = 0, count = 0;
printf("게임을 시작합니다\n");
printf("1부터 100 사이의 숫자를 맞춰 보세요\n");
while (1) {
count++;
scanf("%d", &input);
if (input > goal) {
printf("다운\n");
} else if (input < goal) {
printf("업\n");
} else {
printf("%d번 만에 맞췄습니다\n", count);
break;
}
}
return 0;
}
이제 정답이 매번 바뀌기 때문에 코드 자체를 훔쳐봐도 답을 알 수 없는, 진짜 게임다운 업다운 게임이 완성됐습니다.
📌 핵심 정리
· while문 : 조건식만으로 반복하며, 무한 반복 구현에 특히 유리하다
· 초기값·증감식 위치 : 초기값은 while 앞, 증감식은 코드의 논리 흐름에 맞는 위치에 둔다
· 무한 반복의 안전장치 : if + break로 종료 조건을 먼저 만들어두고 로직을 구현하는 순서가 안전하다
· Ctrl + C : 무한 반복에 실수로 빠졌을 때 쓰는 비상 탈출 수단이지 정상적인 종료 방법은 아니다
· strlen() : string.h 헤더의 함수로, 문자열의 글자 수를 확인할 때 사용한다
· rand() / srand(time(NULL)) : 실행할 때마다 달라지는 진짜 랜덤값을 만드는 조합이다
※ 이 글은 아래 동영상으로 학습한 내용을 요약한 글입니다.
출처 동영상: https://youtu.be/JzzJyvGMnzg?si=v2s8RZP4i6g9f14J
태그 : C언어 while문 사용법for문 while문 차이무한반복 종료조건C언어 break continuestrlen 함수 사용법C언어 랜덤 함수 randsrand time 사용법업다운 게임 만들기비밀번호 자릿수 검사C언어 코딩 기초 강의
'학과 수업 노트 > C언어 기초 배우기' 카테고리의 다른 글
| 10. 함수 (0) | 2026.07.05 |
|---|---|
| 9. Switch Case문 (0) | 2026.07.03 |
| 7. 반복문 - for문 (0) | 2026.04.29 |
| 6. 조건문 - if문 (0) | 2026.04.28 |
| 5. 연산자와 우선순위 (0) | 2026.04.27 |

