JavaScript 조건문과 반복문: 변수 값의 흐름부터 추적하기

··설명 약 8분·작성: 해비·블로그 소개

JavaScript 조건문과 반복문에서 변수 값의 흐름을 어떻게 추적하나요?

조건문은 실행할 코드를 고르고 반복문은 항목을 차례로 처리합니다. 매 반복의 입력값·분기·누적 값을 적으면 어떤 항목이 건너뛰어지고 무엇이 합계에 반영되는지 따라갈 수 있습니다.

적용 조건·범위: 조건의 순서는 중요합니다. 앞에서 이미 참이 된 분기가 있으면 뒤의 분기는 실행되지 않습니다.

공식 문서 참고: MDN: 조건 분기와 truthy·falsy 평가 · MDN: for·while·for...of와 break·continue

독립 실습: 반복마다 값의 흐름 기록하기

JavaScript 조건문과 반복문: 변수 값의 흐름부터 추적하기 · 독립 실습

조건과 반복문의 분기별 출력 결과를 읽고 입력값을 바꿀 때를 예측하세요.

예제 크게 보기 (새 탭)

TaskFlow ZIP 없이 아래 코드를 브라우저 Console에 붙여넣거나 flow.js로 저장하세요. 파일로 저장했다면 다음 명령으로 실행합니다.

node flow.js
const tasks = [
  { title: '가계부 정리', completed: false, priority: 2 },
  { title: '메일 확인', completed: true, priority: 3 },
  { title: '운동하기', completed: false, priority: 3 },
];

let pendingHigh = 0;

for (const task of tasks) {
  if (task.completed) continue;
  if (task.priority >= 3) pendingHigh += 1;
  console.log(task.title + ': ' + pendingHigh);
}

console.log('미완료 중요 작업: ' + pendingHigh);

예상 출력은 다음과 같습니다.

가계부 정리: 0
운동하기: 1
미완료 중요 작업: 1

첫 작업은 미완료이지만 중요도 2라 카운트가 그대로입니다. 두 번째 작업은 완료 상태라 continue가 아래 코드를 건너뛰고, 세 번째 작업에서 1이 됩니다.

스스로 확인: 첫 작업의 priority를 3으로 바꾸면 각 출력은 어떻게 달라질까요? 순서대로 ‘가계부 정리: 1’, ‘운동하기: 2’, ‘미완료 중요 작업: 2’입니다. 완료된 메일은 계속 출력되지 않습니다. 결과가 다르면 매 반복에서 completed, priority, pendingHigh 값을 한 줄씩 적어 보세요.

조건식은 결국 true 또는 false를 만듭니다

const completed = false;


console.log(completed === true);
console.log(completed === false);

조건문 안에는 복잡한 문장이 들어가는 것처럼 보여도 최종 판단 값은 boolean입니다.

const priority = 3;


if (priority >= 3) {
  console.log('중요 작업');
}

===와 !==를 기본 비교 연산자로 사용하면 숫자와 문자열이 자동 변환되는 상황을 줄일 수 있습니다.

여러 조건을 조합하기

const completed = false;
const priority = 3;


if (!completed && priority >= 3) {
  console.log('아직 끝나지 않은 중요 작업');
}

&&는 양쪽 조건이 모두 참이어야 하고 ||는 하나 이상 참이면 됩니다. !는 boolean 의미를 반대로 만듭니다.

if / else if / else

const status = 'pending';


if (status === 'completed') {
  console.log('완료');
} else if (status === 'pending') {
  console.log('진행 중');
} else {
  console.log('알 수 없는 상태');
}

조건의 순서는 중요합니다. 앞에서 이미 참이 된 분기가 있으면 뒤의 분기는 실행되지 않습니다.

배열을 순회할 때 for...of

const titles = [
  'JavaScript 공부',
  '운동',
  '블로그 정리',
];


for (const title of titles) {
  console.log(title);
}

배열의 각 값이 필요하다면 for...of가 읽기 쉽습니다. 인덱스 자체가 필요하면 일반 for가 적합할 수 있습니다.

for (let index = 0; index < titles.length; index += 1) {
  console.log(index, titles[index]);
}
같은 동작을 반복하는 도장에 비유한 일러스트입니다. 반복문은 배열의 각 항목에 같은 처리를 적용합니다.
개념 설명용 일러스트. 같은 동작을 반복하는 도장에 비유한 일러스트입니다. 반복문은 배열의 각 항목에 같은 처리를 적용합니다. 이미지 원본 열기

while은 종료 조건을 더 주의합니다

let count = 0;


while (count < 3) {
  console.log(count);
  count += 1;
}

count += 1이 없다면 조건이 계속 참으로 남아 무한 반복이 될 수 있습니다.

break와 continue

continue는 이번 반복만 건너뛰고 다음 반복으로 이동합니다.

const numbers = [1, 2, 3, 4, 5];


for (const number of numbers) {
  if (number % 2 === 0) {
    continue;
  }


  console.log(number);
}

break는 반복문 자체를 종료합니다.

truthy/falsy는 값의 존재 여부와 같지 않습니다

JavaScript는 조건식에서 일부 값을 false처럼 판단합니다.

Boolean('');
Boolean(0);
Boolean(null);
Boolean(undefined);
Boolean(false);

모두 false입니다. 하지만 0은 유효한 숫자일 수 있습니다. 따라서 단순히 if (value)만 보고 값이 잘못되었다고 판단하면 안 됩니다.

값의 흐름을 직접 적어보기

반복문이 어렵다면 실행 순서를 표로 적습니다.

시작 completedCount = 0
1번째 task.completed = false → 변화 없음
2번째 task.completed = true  → completedCount = 1
3번째 task.completed = true  → completedCount = 2
종료 completedCount = 2

디버깅할 때도 같은 방식으로 각 반복의 입력과 결과를 Console에 출력하면 오류 지점을 찾기 쉽습니다.

자주 발생하는 오류

=와 ===를 혼동합니다

=는 대입이고 ===는 비교입니다.

배열 길이까지 순회합니다

for (let i = 0; i <= tasks.length; i += 1) {
  console.log(tasks[i]);
}

마지막 반복에서 tasks[tasks.length]는 존재하지 않아 undefined가 됩니다. 인덱스는 i < tasks.length까지입니다.

while 종료 조건이 바뀌지 않습니다

반복 내부에서 조건에 영향을 주는 값이 실제로 변경되는지 확인합니다.

학습 완료 체크리스트

  • 조건식이 boolean 결과를 만든다는 점을 이해했습니다.
  • if / else if / else를 사용할 수 있습니다.
  • for와 for...of의 차이를 설명할 수 있습니다.
  • 무한 반복의 원인을 찾을 수 있습니다.
  • 반복 중 변수 값을 순서대로 추적할 수 있습니다.

독립 실습은 여기서 마칠 수 있습니다. 아래 선택 실습은 TaskFlow 프로젝트 파일로 진행합니다.

선택 실습: 할 일 앱에 적용하기

TaskFlow는 작업을 추가·완료·삭제하는 할 일 앱입니다. 이 선택 실습에서는 JavaScript로 화면에 동작을 붙입니다.

index.html 과 style.css 는 이전 체크포인트와 동일하며 이번 단계의 JavaScript 전체 코드는 다음과 같습니다.

선택: 연재 프로젝트와 전체 자료

연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.

TaskFlow 프로젝트 적용

JavaScript 조건문과 반복문: 변수 값의 흐름부터 추적하기 · 단계별 TaskFlow

TaskFlow JavaScript 2단계입니다. 기존 서비스 화면과 실제 콘솔 출력을 확인하세요.

예제 크게 보기 (새 탭)

변경 설명과 부분 예제를 읽은 뒤, 시작·완료 파일과 적용 순서에서 필요한 선언·import·화면 연결을 포함한 전체 파일을 확인하세요. 이번 단계의 변경 이유와 적용 위치도 함께 확인합니다.

시작본과 이번 변경

JavaScript 시작 가이드: DevTools와 Node.js로 첫 코드 실행하기의 완료 체크포인트를 시작본으로 사용합니다.

js/app.js를 아래 작업 배열·반복 코드로 바꾸고 index.html의 모듈 연결은 유지합니다. Console에서 전체 3·완료 1·미완료 2와 각 작업의 상태를 대조하세요.

연속 프로젝트 선수 조건

1회차에서 브라우저 또는 Node.js에서 JavaScript 파일을 실행할 수 있으면 됩니다. Node.js 설치 과정은 여기서 다시 반복하지 않습니다.

이전 체크포인트

javascript-step-01-runtime

이번 단계에서는 DOM을 건드리지 않습니다. 먼저 TaskFlow가 다룰 데이터 계약을 고정합니다.

이번 회차 변경 코드와 전체본 연결

index.html과 style.css는 이전 체크포인트와 동일하며 이번 단계의 JavaScript 전체 코드는 다음과 같습니다.

전체 파일·코드 보기

js/app.js 전체 코드

const tasks = [
  { id: '1', title: 'JavaScript 과정 정리', completed: false },
  { id: '2', title: 'TaskFlow 화면 확인', completed: true },
  { id: '3', title: '다음 글 읽기', completed: false },
];


let completedCount = 0;
let pendingCount = 0;


for (const task of tasks) {
  if (task.completed) {
    completedCount += 1;
  } else {
    pendingCount += 1;
  }


  const status = task.completed ? '완료' : '미완료';
  console.log(`[${status}] ${task.title}`);
}


console.log(`전체: ${tasks.length}`);
console.log(`완료: ${completedCount}`);
console.log(`미완료: ${pendingCount}`);

기대 결과

[미완료] JavaScript 과정 정리
[완료] TaskFlow 화면 확인
[미완료] 다음 글 읽기
전체: 3
완료: 1
미완료: 2

여기서 중요한 것은 데이터 이름입니다.

tasks
task
id
title
completed

이 이름은 이후 회차에서도 그대로 사용합니다.

중간부터 시작하는 전체 파일과 적용 순서

이번 글 시작 ZIP · 이번 글 완료 ZIP

시작 ZIP은 직전 프로젝트 단계 javascript-step-01-runtime의 실제 완료 파일입니다. 프로젝트 순서를 이어가는 기준이며 사이트의 기술 읽기 순서와는 구분합니다.

  1. 시작 ZIP을 새 폴더에 풉니다. 이 폴더가 작업 루트이며 기존 체크포인트 파일을 별도로 찾을 필요가 없습니다.
  2. js/app.js를 작업 배열과 반복문 전체 파일로 교체합니다.
  3. 아래 변경 파일을 같은 상대 경로에 추가하거나 전체 교체합니다. 표시하지 않은 파일과 images는 시작본 그대로 유지합니다. package-lock.json은 완료 ZIP에 있는 파일을 함께 적용합니다.
  4. 작업 루트에서 명령을 실행하고 예상 결과를 확인합니다. 완료 ZIP은 직접 적용한 결과를 비교하는 기준입니다.

추가·교체 파일

  • CHANGES.md — 전체 교체
  • README.md — 전체 교체
  • js/app.js — 전체 교체

실행과 확인

npm start
npm test

개발 서버는 실행 상태로 두고 다른 터미널에서 검사 명령을 실행하세요. Node.js 24.18.0에서 검증했습니다. JavaScript는 http://127.0.0.1:4173, TypeScript는 Vite 실행 출력의 주소로 접속합니다.

예상 결과: 초기 3개 작업과 전체 3·완료 1·미완료 2가 출력됩니다.

실제 검증: JavaScript 모듈·DOM·경계값 실행 검사 통과. 시작 ZIP에 이 글의 변경 파일만 적용한 결과와 완료 ZIP의 모든 파일 내용이 일치했습니다. 브라우저 화면 배치·실제 기기·외부 CDN 가용성은 이 검사에 포함하지 않았습니다.

이 절의 전체 파일은 ZIP과 일치합니다. 위쪽 원문의 짧은 예제나 생략 표시가 있는 부분 코드는 개념·변경 위치 설명용입니다. 서버 저장과 인증은 제공하지 않으며 JSON fixture는 로컬 읽기 실습용입니다.

복사할 변경 파일 전체 코드

js/app.js — 전체 파일

const tasks = [
  { id: '1', title: 'JavaScript 과정 정리', completed: false },
  { id: '2', title: 'TaskFlow 화면 확인', completed: true },
  { id: '3', title: '다음 글 읽기', completed: false },
];


let completedCount = 0;
let pendingCount = 0;


for (const task of tasks) {
  if (task.completed) {
    completedCount += 1;
  } else {
    pendingCount += 1;
  }


  const status = task.completed ? '완료' : '미완료';
  console.log(`[${status}] ${task.title}`);
}


console.log(`전체: ${tasks.length}`);
console.log(`완료: ${completedCount}`);
console.log(`미완료: ${pendingCount}`);

완료 체크포인트

javascript-step-02-control-flow

다음 학습

다음 글에서는 한 파일에 있는 로직을 함수와 객체로 나누고, ES Module의 import / export로 파일 책임을 분리합니다.

다음 글: JavaScript 함수와 객체, import export로 모듈 나누기

글 소개·학습 준비·전체 목차
조건문과 반복문: 값의 흐름 이해

JavaScript · 2 / 15 · 필수 학습 · 조건문과 반복문

조건문과 반복문은 각 항목의 값을 읽고, 조건에 따라 건너뛰거나 누적 값을 바꾼 뒤 다음 항목으로 이동합니다. 한 번의 반복마다 입력값·분기·누적 값·출력을 적으면 결과가 왜 그렇게 나왔는지 추적할 수 있습니다.

이번 글에서는 변수, 비교, 조건문, 반복문을 따로 외우기보다 하나의 작업 목록을 순회하면서 값의 흐름을 추적합니다.

이번 글에서 배우는 내용

  • const와 let
  • 비교 연산자와 논리 연산자
  • if / else if / else
  • for와 for...of
  • while, break, continue
  • truthy/falsy
  • 반복 중 값의 변화 추적

먼저 알아야 할 내용

브라우저 Console 또는 Node.js에서 코드를 실행할 수 있으면 됩니다. 처음 실행한다면 JavaScript 시작 가이드: DevTools와 Node.js로 첫 코드 실행하기부터 확인하세요. 실행 환경이 준비됐다면 이 글에서 조건문과 반복문을 시작합니다.

목차

이 글이 도움이 되었나요?

조회 중

읽음 기록

읽음 — / 전체 15개 · 필수 14개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기