4. 같은 일 반복하기 (반복문)/4.2 조건이 맞는 동안 반복하기 (while)

4.2.2 무한 반복 조심하기 - 끝나지 않는 위험한 함정 피하기

thejavascript4kids 2025. 7. 1. 02:48

📘 4.2.2 무한 반복 조심하기 - 끝나지 않는 위험한 함정 피하기

여러분, 안녕하세요.

어릴 때 저는 신발끈을 제대로 묶지 못해서 자주 넘어졌던 기억이 있습니다. 한 번은 끈이 계속 풀어져서, 묶고 또 묶고 해도 끝없이 다시 풀어지는 일이 있었어요. 그때 할머니가 와서 올바른 방법을 가르쳐주시며 "처음부터 제대로 하지 않으면 끝없이 반복하게 된다"고 말씀하셨죠.

프로그래밍에서도 이런 일이 생길 수 있습니다. 지난 시간에 배운 while문은 정말 유용한 도구이지만, 작은 실수 하나로 인해 끝없이 반복되는 위험한 상황에 빠질 수 있어요.

오늘은 그런 함정을 미리 알아보고, 안전하게 피하는 방법을 함께 배워보겠습니다. 마치 할머니가 신발끈 묶는 올바른 방법을 가르쳐주셨듯이 말이에요.

🧠 새로운 단어들과 친해지기

무한 반복과 관련된 개념들을 차근차근 살펴보겠습니다.

단어 설명
무한 반복 끝나지 않고 계속해서 반복되는 위험한 상황이에요.
조건 변경 반복 조건을 바꿔주는 중요한 코드예요.
탈출 조건 반복문에서 안전하게 빠져나올 수 있는 조건이에요.
안전장치 무한 반복을 방지하기 위해 미리 준비해둔 보호 장치예요.

✨ 무한 반복이 뭔지 알아보기

무한 반복은 while문에서 가장 조심해야 할 위험한 상황입니다. 이는 반복 조건이 절대 거짓이 될 수 없을 때 발생해요.

생각해보세요. 어떤 사람이 "배가 부를 때까지 계속 먹겠다"고 하면서도 계속 배고픈 상태를 유지한다면? 영원히 먹을 수밖에 없겠죠. 프로그램도 마찬가지입니다.

마치 고장난 선풍기처럼

여름날, 우리 집 선풍기가 고장났던 적이 있어요. 리모컨으로 끄려고 해도 계속 돌아가더라고요. 온도 센서가 망가져서 "아직 덥다"고 계속 판단하고 있었거든요.

정상적인 선풍기:

  1. 방이 더워진다 → 선풍기가 돌기 시작
  2. 시원해진다 → 온도 센서가 "이제 충분하다"고 감지
  3. 선풍기가 멈춘다

고장난 선풍기 (무한 반복):

// 위험한 코드 예시 (실제로 실행하지 마세요!)
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 학습을 원하신다면?
이 포스팅에서 다룬 내용을 실제로 실습해보세요!
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
📝 실시간 코드 실행 📊 학습 진도 관리 👥 체계적 커리큘럼
📚 171개 체계적 학습레슨 · 📋 855개 4지선다 연습문제 · 🆓 완전 무료 · ⚡ 즉시 시작