📘 4.2.2 무한 반복 조심하기 - 끝나지 않는 위험한 함정 피하기
여러분, 안녕하세요.
어릴 때 저는 신발끈을 제대로 묶지 못해서 자주 넘어졌던 기억이 있습니다. 한 번은 끈이 계속 풀어져서, 묶고 또 묶고 해도 끝없이 다시 풀어지는 일이 있었어요. 그때 할머니가 와서 올바른 방법을 가르쳐주시며 "처음부터 제대로 하지 않으면 끝없이 반복하게 된다"고 말씀하셨죠.
프로그래밍에서도 이런 일이 생길 수 있습니다. 지난 시간에 배운 while문은 정말 유용한 도구이지만, 작은 실수 하나로 인해 끝없이 반복되는 위험한 상황에 빠질 수 있어요.
오늘은 그런 함정을 미리 알아보고, 안전하게 피하는 방법을 함께 배워보겠습니다. 마치 할머니가 신발끈 묶는 올바른 방법을 가르쳐주셨듯이 말이에요.
🧠 새로운 단어들과 친해지기
무한 반복과 관련된 개념들을 차근차근 살펴보겠습니다.
| 단어 | 설명 |
|---|---|
| 무한 반복 | 끝나지 않고 계속해서 반복되는 위험한 상황이에요. |
| 조건 변경 | 반복 조건을 바꿔주는 중요한 코드예요. |
| 탈출 조건 | 반복문에서 안전하게 빠져나올 수 있는 조건이에요. |
| 안전장치 | 무한 반복을 방지하기 위해 미리 준비해둔 보호 장치예요. |
✨ 무한 반복이 뭔지 알아보기
무한 반복은 while문에서 가장 조심해야 할 위험한 상황입니다. 이는 반복 조건이 절대 거짓이 될 수 없을 때 발생해요.
생각해보세요. 어떤 사람이 "배가 부를 때까지 계속 먹겠다"고 하면서도 계속 배고픈 상태를 유지한다면? 영원히 먹을 수밖에 없겠죠. 프로그램도 마찬가지입니다.
마치 고장난 선풍기처럼
여름날, 우리 집 선풍기가 고장났던 적이 있어요. 리모컨으로 끄려고 해도 계속 돌아가더라고요. 온도 센서가 망가져서 "아직 덥다"고 계속 판단하고 있었거든요.
정상적인 선풍기:
- 방이 더워진다 → 선풍기가 돌기 시작
- 시원해진다 → 온도 센서가 "이제 충분하다"고 감지
- 선풍기가 멈춘다
고장난 선풍기 (무한 반복):
// 위험한 코드 예시 (실제로 실행하지 마세요!)
let 방이_더운가 = true;
while (방이_더운가) {
console.log("선풍기가 돌고 있습니다...");
// 방이_더운가를 바꾸는 코드가 없음!
// 영원히 true로 유지됩니다
}
올바른 해결책:
let 방이_더운가 = true;
let 가동_시간 = 0;
while (방이_더운가 && 가동_시간 < 10) {
console.log("선풍기가 돌고 있습니다...");
가동_시간++;
if (가동_시간 >= 5) {
방이_더운가 = false; // 충분히 시원해졌다고 가정
console.log("이제 시원해졌습니다!");
}
}
console.log("선풍기가 안전하게 멈췄습니다.");
🎯 무한 반복을 조심해야 하는 이유
첫째, 컴퓨터 자원 낭비입니다. 무한 반복에 빠진 프로그램은 CPU와 메모리를 계속 사용해서 컴퓨터를 느리게 만들어요.
둘째, 사용자 경험 악화입니다. 프로그램이 응답하지 않으면 사용자는 답답하고 화가 날 거예요.
셋째, 프로그램 신뢰도 하락입니다. 한 번 문제가 생기면 다시 사용하기 꺼려지죠.
⚙️ 기본 사용법 배우기
무한 반복이 발생하는 패턴과 이를 해결하는 방법을 알아보겠습니다.
❌ 위험한 패턴들:
// 패턴 1: 조건을 바꾸는 코드가 없음
let count = 1;
while (count <= 5) {
console.log(count);
// count가 변하지 않아서 영원히 1 <= 5가 참입니다!
}
// 패턴 2: 증감 방향이 반대
let num = 10;
while (num > 0) {
console.log(num);
num++; // 10, 11, 12... 계속 커져서 0보다 항상 큽니다!
}
✅ 안전한 해결책들:
// 해결책 1: 올바른 조건 변경
let count = 1;
while (count <= 5) {
console.log(count);
count++; // 조건을 변화시키는 코드 추가
}
// 해결책 2: 올바른 증감 방향
let num = 10;
while (num > 0) {
console.log(num);
num--; // 감소시켜야 0에 도달 가능
}
🧪 직접 해보면서 배우기
실제 상황에서 무한 반복이 어떻게 발생하고 해결되는지 살펴보겠습니다.
🔹 Ex1) 숫자 세기에서 생기는 무한 반복
// ✅ 안전한 해결 코드
let number = 1;
console.log("🔢 안전한 숫자 세기를 시작합니다!");
while (number <= 3) { // 3 이하인 동안 반복합니다
console.log("숫자: " + number);
number = number + 1; // 중요! 조건을 변화시키는 코드
}
console.log("✅ 안전하게 완료되었습니다!");
console.log("💡 해결 포인트: number를 매번 1씩 증가시켜야 해요");
🔹 Ex2) 카운트다운에서의 방향 실수
// ✅ 올바른 카운트다운 코드
let countdown = 5;
console.log("🚀 올바른 카운트다운을 시작합니다!");
while (countdown > 0) { // 0보다 클 때까지 반복합니다
console.log("⏰ " + countdown + "초 남음");
countdown = countdown - 1; // 올바른 감소!
}
console.log("🎆 발사!");
console.log("💡 해결 포인트: 0에 가까워지려면 감소해야 해요");
🔹 Ex3) 안전장치가 있는 스마트한 반복문
// 🛡️ 안전장치가 있는 목표 달성 게임
console.log("🎯 안전한 목표 달성 게임을 시작합니다!");
let currentScore = 0;
let targetScore = 50;
let maxAttempts = 10; // 안전장치: 최대 10번만 시도
let attempts = 0;
while (currentScore < targetScore && attempts < maxAttempts) { // 두 조건 모두 확인
attempts = attempts + 1;
let earnedPoints = 8; // 매번 8점씩 획득합니다
currentScore = currentScore + earnedPoints;
console.log("🎮 시도 " + attempts + ": +" + earnedPoints + "점 획득!");
console.log(" 현재 점수: " + currentScore + "점");
}
if (currentScore >= targetScore) {
console.log("🏆 목표 달성! 성공!");
} else {
console.log("⏰ 최대 시도 횟수 도달");
}
console.log("💡 안전장치의 역할: 최대 시도 횟수 제한으로 이중 안전");
🧠 자주 하는 실수와 주의할 점
무한 반복을 피하기 위해 주의해야 할 몇 가지 사항들을 알아보겠습니다.
❌ 실수 1: 조건을 바꾸는 코드 빼먹기
// ❌ 가장 흔한 실수
let i = 1;
while (i <= 5) {
console.log("숫자: " + i);
// i++를 깜빡했습니다!
}
// ✅ 올바른 해결
let i = 1;
while (i <= 5) {
console.log("숫자: " + i);
i++; // 반드시 포함해야 할 코드
}
❌ 실수 2: 증감 방향과 조건 방향이 반대
// ❌ 방향이 반대인 경우
let count = 5;
while (count > 0) {
console.log(count);
count++; // 더 커져서 0에 절대 도달 불가합니다!
}
// ✅ 올바른 방향
let count = 5;
while (count > 0) {
console.log(count);
count--; // 감소해야 0에 도달 가능합니다
}
✏️ 연습문제로 개념 다지기
배운 내용을 연습해보겠습니다. 마치 의사가 환자를 진단하듯이, 우리도 코드의 문제점을 찾아서 치료해보겠어요.
Ex1) 무한 반복이 발생하는 이유를 찾고 올바르게 고쳐보자
// 문제가 있는 코드
let num = 1;
while (num <= 3) {
console.log("현재 숫자: " + num);
// 여기에 뭔가 빠졌어요!
}
// 정답:
let num = 1;
while (num <= 3) {
console.log("현재 숫자: " + num);
num++; // 이 부분이 빠져있었어요!
}
// 해설: num을 증가시키지 않으면 조건이 영원히 참이 되어 무한 반복돼요
Ex2) 안전장치가 있는 반복문을 만들어보자
// 목표: 50이 될 때까지 10씩 더하되, 최대 10번만 시도
let number = 0;
let attempts = 0;
let maxAttempts = 10;
while (number < 50 && attempts < maxAttempts) { // 두 조건으로 안전하게 보호
number = number + 10;
attempts++;
console.log("시도 " + attempts + ": " + number);
}
if (number >= 50) {
console.log("목표 달성!");
} else {
console.log("최대 시도 횟수 도달");
}
// 해설: 두 조건으로 안전하게 보호했어요
📚 복습하기 - 지난 시간에 배운 내용도 기억해요!
새로운 것을 배우면서도 이전에 배운 것들을 잊지 않는 것이 중요해요.
🔄 4.2.1 복습: while문의 기본 구조
문제: while문과 for문의 차이점을 설명해보세요!
// for문 예시
for (let i = 1; i <= 3; i++) {
console.log("for문: " + i);
}
// while문 예시
let j = 1;
while (j <= 3) {
console.log("while문: " + j);
j++;
}
정답과 설명:
- for문: 정확한 반복 횟수를 알 때 사용해요. 카운터 변수 관리가 자동이에요.
- while문: 조건이 만족될 때까지 반복할 때 사용해요. 카운터 변수를 직접 관리해야 해요.
🔄 4.1.3 복습: 반복 범위 조절
문제: 다음 for문을 while문으로 바꿔보세요!
// for문 버전
for (let i = 2; i <= 10; i += 2) {
console.log("짝수: " + i);
}
정답과 설명:
// while문 버전
let i = 2;
while (i <= 10) {
console.log("짝수: " + i);
i += 2; // 2씩 증가
}
- for문의 세 부분(초기화, 조건, 증감)을 while문으로 나누어서 작성해요!
🔄 4.1.2 복습: 카운터 변수의 중요성
문제: 무한 반복을 방지하기 위해 카운터 변수를 어떻게 관리해야 하나요?
정답과 설명:
- 올바른 초기화: 적절한 시작값 설정
- 올바른 변화: 조건과 맞는 방향으로 증가/감소
- 적절한 조건: 언젠가 거짓이 될 수 있는 조건 설정
- 안전장치: 최대 횟수 제한으로 이중 보호
이렇게 지난번에 배운 내용들도 계속 활용하면서 안전한 코딩 습관을 기르는 거예요! 😊
지금까지 무한 반복의 위험성과 이를 안전하게 방지하는 방법을 함께 알아보았습니다. 무한 반복은 작은 실수로 인해 큰 문제가 될 수 있지만, 올바른 지식과 주의깊은 습관으로 충분히 예방할 수 있어요.
마치 할머니가 신발끈 묶는 올바른 방법을 가르쳐주셨듯이, 우리도 반복문을 안전하게 사용하는 방법을 배웠습니다. 처음부터 제대로 하면 끝없이 반복하는 일은 없을 거예요.
다음 시간에는 또 다른 흥미로운 자바스크립트 이야기를 함께 나누어보겠습니다. 여러분의 학습 여정이 계속해서 안전하고 즐거우시길 바라요! 🌟
✅ 학습 완료 체크리스트
이번 시간에 배운 내용들을 모두 이해했는지 확인해보세요!
| 학습 내용 | 이해했나요? |
|---|---|
| 무한 반복의 위험성 | ✅ |
| 무한 반복 방지 방법 | ✅ |
| 안전장치 설정하기 | ✅ |
| 자주 하는 실수들 | ✅ |
| 이전 단원 복습 내용 | ✅ |
📂 마무리 정보
오늘 배운 4.2.2 내용이 여러분의 자바스크립트 지식에 잘 자리 잡았나요? 다음 시간에는 더 흥미진진한 내용으로 만나요!
기억할 점: 오늘 배운 내용을 꼭 연습해보시고, 궁금한 점이 있으면 언제든 다시 돌아와서 읽어보세요.
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
'4. 같은 일 반복하기 (반복문) > 4.2 조건이 맞는 동안 반복하기 (while)' 카테고리의 다른 글
| 4.2.1 `while`문 - 조건이 만족될 때까지 기다리기 (0) | 2025.07.01 |
|---|