JavaScript 완전정복

기초 문법부터 DOM, 이벤트, 비동기, 클래스, 모듈, 자료구조와 실전 UI 구조까지 이어지는 300개 예제 교재입니다. 코드를 눈으로만 읽지 말고 값을 바꾸어 다시 실행해 보면서 학습하세요.
총 300예제10개 대단원검색·단원 필터코드 복사인쇄/PDF 대응

이 교재를 가장 효과적으로 사용하는 방법

1회독에서는 코드 → 예상 결과 → 상세 설명 순서로 읽습니다. 2회독에서는 숫자·문자열·조건을 직접 바꾸어 결과를 예측한 뒤 실행합니다. 3회독에서는 예제를 보지 않고 같은 기능을 새 코드로 다시 작성합니다. 특히 배열 메서드, DOM 이벤트, Promise/async-await는 여러 예제를 연속해서 비교하면 차이를 빠르게 이해할 수 있습니다.

중요: DOM·fetch·localStorage 예제는 브라우저 환경을 전제로 합니다. 일부 코드는 필요한 HTML 요소나 서버 API가 있어야 완전히 실행됩니다. 따라서 각 예제는 문법과 핵심 구조를 이해하는 최소 단위로 제시했습니다.

01. JavaScript 시작과 출력

예제 001

console.log()로 첫 출력

console.log()는 개발자 도구 콘솔에 값을 출력합니다.

JavaScript 코드
console.log("Hello, JavaScript!");

예상 결과

Hello, JavaScript!

상세 설명

문자열은 따옴표로 감싸며, 문장 끝의 세미콜론은 문장의 끝을 명확하게 표시합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 002

여러 값 한 번에 출력

console.log()에는 여러 값을 쉼표로 구분해 전달할 수 있습니다.

JavaScript 코드
let name = "민수";
let age = 17;
console.log(name, age);

예상 결과

민수 17

상세 설명

디버깅할 때 변수 여러 개의 현재 값을 한 줄에서 확인하기 좋습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 003

문자열 이어 붙이기

+ 연산자는 숫자 덧셈뿐 아니라 문자열 연결에도 사용됩니다.

JavaScript 코드
let language = "JavaScript";
console.log("나는 " + language + "를 공부합니다.");

예상 결과

나는 JavaScript를 공부합니다.

상세 설명

피연산자 중 하나가 문자열이면 문자열 연결이 일어날 수 있으므로 자료형을 주의합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 004

템플릿 리터럴

백틱(`) 문자열에서는 ${표현식}으로 값을 자연스럽게 삽입할 수 있습니다.

JavaScript 코드
let name = "지수";
let score = 95;
console.log(`${name}의 점수는 ${score}점입니다.`);

예상 결과

지수의 점수는 95점입니다.

상세 설명

문자열 연결을 여러 번 사용하는 것보다 읽기 쉽고 줄바꿈도 편리합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 005

alert() 이해

alert()는 브라우저에서 간단한 메시지 창을 띄웁니다.

JavaScript 코드
alert("JavaScript 학습을 시작합니다!");

예상 결과

브라우저 경고창 표시

상세 설명

학습용으로는 편리하지만 실제 서비스에서는 사용자 흐름을 막기 때문에 남용하지 않습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 006

prompt()로 입력 받기

prompt()는 사용자가 입력한 값을 문자열로 반환합니다.

JavaScript 코드
let name = prompt("이름을 입력하세요.");
console.log("안녕하세요, " + name + "님!");

예상 결과

입력값에 따라 달라짐

상세 설명

숫자를 입력받아 계산하려면 Number() 같은 형 변환이 필요합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 007

confirm()으로 참/거짓 입력

confirm()은 확인을 누르면 true, 취소를 누르면 false를 반환합니다.

JavaScript 코드
let answer = confirm("계속하시겠습니까?");
console.log(answer);

예상 결과

확인: true / 취소: false

상세 설명

조건문과 함께 사용하면 사용자의 선택에 따라 동작을 나눌 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 008

한 줄 주석

// 뒤의 내용은 한 줄 주석입니다.

JavaScript 코드
// 이 문장은 실행되지 않습니다.
console.log("실행되는 문장");

예상 결과

실행되는 문장

상세 설명

주석은 코드의 목적과 주의점을 기록하지만 너무 당연한 내용을 반복하면 오히려 가독성을 해칠 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 009

여러 줄 주석

/* ... */는 여러 줄 주석입니다.

JavaScript 코드
/*
여러 줄에 걸친
설명을 작성할 수 있습니다.
*/
console.log("주석 학습");

예상 결과

주석 학습

상세 설명

함수 설명이나 임시 메모에 사용할 수 있지만 실제 프로젝트에서는 문서화 규칙을 일관되게 정하는 것이 좋습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 010

대소문자 구분

JavaScript는 대소문자를 구분합니다.

JavaScript 코드
let score = 100;
let Score = 80;
console.log(score, Score);

예상 결과

100 80

상세 설명

score와 Score는 서로 다른 식별자이므로 변수명 규칙을 일관되게 유지하는 것이 중요합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 011

문장 여러 개 실행

코드는 기본적으로 위에서 아래 순서로 실행됩니다.

JavaScript 코드
console.log("1단계");
console.log("2단계");
console.log("3단계");

예상 결과

1단계 / 2단계 / 3단계

상세 설명

제어문이나 비동기 코드가 없다면 작성된 순서가 실행 순서가 됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 012

세미콜론의 역할

세미콜론은 문장의 끝을 나타냅니다.

JavaScript 코드
let a = 10;
let b = 20;
console.log(a + b);

예상 결과

30

상세 설명

JavaScript는 자동 세미콜론 삽입 기능이 있지만 학습 단계에서는 일관되게 쓰는 편이 이해하기 쉽습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 013

문자열 안에 따옴표 넣기

바깥 따옴표와 다른 종류의 따옴표를 안쪽에 사용할 수 있습니다.

JavaScript 코드
console.log('그는 "안녕"이라고 말했다.');

예상 결과

그는 "안녕"이라고 말했다.

상세 설명

또는 역슬래시를 사용해 따옴표를 이스케이프할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 014

이스케이프 문자

\n은 줄바꿈, \t는 탭을 뜻합니다.

JavaScript 코드
console.log("첫째 줄\n둘째 줄\t탭");

예상 결과

첫째 줄↵둘째 줄 탭

상세 설명

문자열에서 직접 표현하기 어려운 제어 문자를 역슬래시와 함께 나타냅니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 015

typeof 첫 사용

typeof 연산자는 값의 자료형을 문자열로 알려줍니다.

JavaScript 코드
console.log(typeof 123);
console.log(typeof "123");
console.log(typeof true);

예상 결과

number / string / boolean

상세 설명

디버깅이나 입력값 검증에서 유용하지만 null에는 역사적 이유로 'object'가 나오는 예외가 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 016

NaN 확인

숫자로 바꿀 수 없는 값을 Number()로 변환하면 NaN이 될 수 있습니다.

JavaScript 코드
let x = Number("abc");
console.log(x);
console.log(Number.isNaN(x));

예상 결과

NaN / true

상세 설명

NaN 자체 비교보다는 Number.isNaN()으로 검사하는 것이 안전합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 017

Infinity

JavaScript 숫자에는 양·음의 무한대를 나타내는 값이 있습니다.

JavaScript 코드
console.log(1 / 0);
console.log(-1 / 0);

예상 결과

Infinity / -Infinity

상세 설명

일반적인 계산 결과에서 Infinity가 나오면 0으로 나누기나 범위 초과를 의심해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 018

엄격 모드 소개

'use strict'는 일부 느슨한 문법을 엄격하게 검사합니다.

JavaScript 코드
"use strict";
let x = 10;
console.log(x);

예상 결과

10

상세 설명

현대의 ES 모듈과 클래스는 기본적으로 엄격 모드이지만 전통 스크립트에서는 명시할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 019

HTML에서 script 위치

script를 body 끝에 두면 앞선 HTML 요소가 먼저 만들어진 뒤 코드가 실행됩니다.

JavaScript 코드
<body>
  <h1>제목</h1>
  <script>
    console.log("body 끝에서 실행");
  </script>
</body>

예상 결과

콘솔 출력

상세 설명

외부 스크립트에는 defer를 사용하는 방식도 널리 쓰입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 020

외부 JavaScript 연결

JavaScript를 별도 .js 파일로 분리하면 구조와 유지보수가 좋아집니다.

JavaScript 코드
<!-- index.html -->
<script src="app.js" defer></script>

// app.js
console.log("외부 파일 실행");

예상 결과

외부 파일 실행

상세 설명

defer는 HTML 파싱을 막지 않고 문서 파싱 뒤에 스크립트를 실행하도록 돕습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

02. 변수·상수·자료형·연산자

예제 021

let 변수

let으로 선언한 변수는 값을 다시 대입할 수 있습니다.

JavaScript 코드
let count = 1;
count = 2;
console.log(count);

예상 결과

2

상세 설명

변경될 가능성이 있는 값을 저장할 때 let을 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 022

const 상수

const는 재대입할 수 없는 바인딩을 만듭니다.

JavaScript 코드
const PI = 3.14159;
console.log(PI);

예상 결과

3.14159

상세 설명

객체 자체가 얼어붙는 것은 아니므로 객체 내부 속성은 별도로 변경될 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 023

var와 함수 스코프

var는 블록 스코프가 아니라 함수 스코프를 가집니다.

JavaScript 코드
var x = 1;
if (true) {
  var x = 2;
}
console.log(x);

예상 결과

2

상세 설명

현대 JavaScript에서는 의도하지 않은 범위 확장을 막기 위해 보통 let/const를 우선합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 024

숫자형

정수와 실수 모두 기본적으로 number 자료형입니다.

JavaScript 코드
let n = 42;
let pi = 3.14;
console.log(typeof n, typeof pi);

예상 결과

number number

상세 설명

대부분의 일반 수치 계산은 number로 처리합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 025

BigInt

BigInt는 매우 큰 정수를 정확하게 다루기 위한 자료형입니다.

JavaScript 코드
let big = 9007199254740993n;
console.log(big + 2n);

예상 결과

9007199254740995n

상세 설명

BigInt와 일반 number를 직접 섞어 계산할 수 없으므로 변환 기준을 명확히 해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 026

문자열

문자열은 문자들의 순서 있는 값입니다.

JavaScript 코드
let s = "JavaScript";
console.log(s.length);

예상 결과

10

상세 설명

length 속성으로 UTF-16 코드 단위 기준 길이를 확인할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 027

불리언

boolean은 true와 false 두 값을 가집니다.

JavaScript 코드
let isPass = 90 >= 60;
console.log(isPass);

예상 결과

true

상세 설명

조건식의 결과나 상태 플래그를 표현할 때 가장 많이 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 028

undefined

선언만 하고 값을 넣지 않은 변수의 값은 undefined입니다.

JavaScript 코드
let data;
console.log(data);

예상 결과

undefined

상세 설명

값이 아직 정해지지 않은 상태를 뜻하는 경우가 많습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 029

null

null은 의도적으로 값이 없음을 나타낼 때 사용합니다.

JavaScript 코드
let selected = null;
console.log(selected);

예상 결과

null

상세 설명

undefined와 목적을 구분해 사용하면 상태를 더 명확하게 표현할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 030

Symbol

Symbol은 서로 겹치지 않는 고유한 값을 만들 수 있습니다.

JavaScript 코드
const id = Symbol("id");
console.log(typeof id);

예상 결과

symbol

상세 설명

객체의 충돌 가능성이 낮은 특별한 키 등에 활용됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 031

덧셈

+는 숫자 덧셈을 수행합니다.

JavaScript 코드
let a = 7, b = 3;
console.log(a + b);

예상 결과

10

상세 설명

문자열이 포함될 경우 문자열 결합으로 동작할 수 있으므로 자료형을 확인합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 032

나눗셈

/는 나눗셈 연산자입니다.

JavaScript 코드
console.log(7 / 2);

예상 결과

3.5

상세 설명

Python의 // 같은 정수 나눗셈 연산자는 없으며 필요하면 Math.floor 등을 조합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 033

나머지

%는 나눗셈의 나머지를 구합니다.

JavaScript 코드
console.log(17 % 5);

예상 결과

2

상세 설명

짝홀 판정, 주기 계산, 순환 인덱스에서 자주 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 034

거듭제곱

**는 거듭제곱 연산자입니다.

JavaScript 코드
console.log(2 ** 10);

예상 결과

1024

상세 설명

Math.pow(2, 10)과 같은 의미지만 더 간결합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 035

증가 연산자

++는 값을 1 증가시킵니다.

JavaScript 코드
let n = 5;
n++;
console.log(n);

예상 결과

6

상세 설명

전위형과 후위형은 표현식 안에서 반환값이 다르므로 단독 문장으로 쓰면 혼란을 줄일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 036

복합 대입

+=, *= 등은 연산과 대입을 합친 연산자입니다.

JavaScript 코드
let score = 80;
score += 5;
score *= 2;
console.log(score);

예상 결과

170

상세 설명

score += 5는 score = score + 5와 같은 뜻입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 037

느슨한 동등 비교

==는 비교 전에 형 변환을 수행할 수 있습니다.

JavaScript 코드
console.log(5 == "5");

예상 결과

true

상세 설명

예상하기 어려운 결과를 줄이기 위해 보통 ===를 권장합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 038

엄격한 동등 비교

===는 값과 자료형을 함께 비교합니다.

JavaScript 코드
console.log(5 === "5");

예상 결과

false

상세 설명

현대 JavaScript에서는 equality 비교의 기본 선택으로 사용하기 좋습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 039

부등 비교

!==는 값 또는 자료형이 다르면 true입니다.

JavaScript 코드
console.log(10 !== "10");

예상 결과

true

상세 설명

!=보다 암묵적 형 변환이 적어 의도가 더 분명합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 040

논리 AND

&&는 두 조건이 모두 참인지 검사합니다.

JavaScript 코드
let age = 18;
let hasTicket = true;
console.log(age >= 18 && hasTicket);

예상 결과

true

상세 설명

앞쪽 값이 falsy면 뒤 표현식을 평가하지 않는 단락 평가가 일어납니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 041

논리 OR

||는 앞 값이 falsy이면 뒤 값을 반환할 수 있습니다.

JavaScript 코드
let nickname = "";
console.log(nickname || "익명");

예상 결과

익명

상세 설명

기본값 지정에 쓰이지만 0이나 빈 문자열도 falsy라는 점을 고려합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 042

논리 NOT

!는 참과 거짓을 반전합니다.

JavaScript 코드
console.log(!true);
console.log(!!"hello");

예상 결과

false / true

상세 설명

!!값 패턴은 값을 boolean으로 바꾸는 간단한 방법입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 043

Null 병합 연산자

??는 null 또는 undefined일 때만 오른쪽 값을 사용합니다.

JavaScript 코드
let count = 0;
console.log(count ?? 10);

예상 결과

0

상세 설명

0, false, 빈 문자열을 유효한 값으로 유지하고 싶을 때 ||보다 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 044

옵셔널 체이닝

?.는 중간 값이 null/undefined일 때 오류 대신 undefined를 반환합니다.

JavaScript 코드
let user = {};
console.log(user.address?.city);

예상 결과

undefined

상세 설명

깊은 객체의 선택적 속성에 접근할 때 방어 코드를 줄일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 045

삼항 연산자

조건 ? 참일때 : 거짓일때 형태로 값을 선택합니다.

JavaScript 코드
let score = 85;
let result = score >= 60 ? "합격" : "불합격";
console.log(result);

예상 결과

합격

상세 설명

간단한 분기에는 유용하지만 중첩이 깊으면 if문이 더 읽기 쉽습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 046

문자열→숫자

Number()는 가능한 문자열을 숫자로 변환합니다.

JavaScript 코드
let a = Number("25");
console.log(a + 5);

예상 결과

30

상세 설명

사용자 입력은 문자열인 경우가 많아 계산 전에 명시적 변환이 중요합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 047

parseInt

parseInt는 문자열 앞부분의 정수 형태를 해석합니다.

JavaScript 코드
console.log(parseInt("42px", 10));

예상 결과

42

상세 설명

진법을 두 번째 인자로 명시하면 의도가 분명해집니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 048

parseFloat

parseFloat는 문자열 앞부분의 실수 형태를 읽습니다.

JavaScript 코드
console.log(parseFloat("3.14kg"));

예상 결과

3.14

상세 설명

형식 전체가 숫자인지 검증해야 하는 상황에서는 Number()와 차이를 이해해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 049

숫자→문자열

toString()은 값을 문자열 표현으로 바꿀 수 있습니다.

JavaScript 코드
let n = 123;
console.log(n.toString());

예상 결과

123

상세 설명

화면 출력, 문자열 조립, 진법 표현 등에 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 050

진법 변환

숫자의 toString(진법)은 다른 진법 문자열을 만듭니다.

JavaScript 코드
let n = 255;
console.log(n.toString(16));

예상 결과

ff

상세 설명

2진수·8진수·16진수 표현 학습에 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 051

연산자 우선순위

곱셈은 덧셈보다 먼저 계산됩니다.

JavaScript 코드
console.log(2 + 3 * 4);
console.log((2 + 3) * 4);

예상 결과

14 / 20

상세 설명

복잡한 표현식은 괄호로 의도를 명시하면 오류를 줄일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 052

전개 연산자 기초

...은 배열 요소를 펼칠 수 있습니다.

JavaScript 코드
let a = [1, 2];
let b = [...a, 3];
console.log(b);

예상 결과

[1, 2, 3]

상세 설명

복사·병합·함수 인수 전달 등 다양한 문맥에서 활용됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 053

구조 분해 기초

구조 분해 할당은 배열이나 객체에서 필요한 값을 바로 꺼냅니다.

JavaScript 코드
let [a, b] = [10, 20];
console.log(a, b);

예상 결과

10 20

상세 설명

임시 변수를 줄여 데이터를 읽는 의도를 간결하게 표현합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 054

객체 구조 분해

객체 구조 분해는 속성명과 같은 변수로 값을 추출합니다.

JavaScript 코드
let user = {name: "유진", age: 17};
let {name, age} = user;
console.log(name, age);

예상 결과

유진 17

상세 설명

함수 매개변수에서 필요한 옵션만 뽑아낼 때도 자주 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 055

단축 속성명

변수명과 속성명이 같으면 {name: name}을 {name}으로 줄일 수 있습니다.

JavaScript 코드
let name = "민준";
let age = 18;
let user = {name, age};
console.log(user);

예상 결과

{name:'민준', age:18}

상세 설명

객체 생성 코드가 간결해지고 반복이 줄어듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

03. 조건문과 반복문

예제 056

기본 if

if는 조건이 true일 때 블록을 실행합니다.

JavaScript 코드
let temp = 30;
if (temp >= 30) {
  console.log("덥습니다.");
}

예상 결과

덥습니다.

상세 설명

조건식 자체가 boolean이 아니어도 truthy/falsy 규칙으로 판단됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 057

if-else

if-else는 두 경우 중 하나를 선택합니다.

JavaScript 코드
let n = 7;
if (n % 2 === 0) console.log("짝수");
else console.log("홀수");

예상 결과

홀수

상세 설명

서로 배타적인 조건을 표현하기에 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 058

else if

else if는 여러 범위를 위에서부터 검사합니다.

JavaScript 코드
let score = 87;
if (score >= 90) console.log("A");
else if (score >= 80) console.log("B");
else console.log("C 이하");

예상 결과

B

상세 설명

범위 조건은 넓은 조건과 좁은 조건의 순서를 주의해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 059

중첩 if

if 블록 안에 또 다른 if를 둘 수 있습니다.

JavaScript 코드
let age = 19;
let member = true;
if (age >= 18) {
  if (member) console.log("입장 가능");
}

예상 결과

입장 가능

상세 설명

중첩이 깊어지면 논리 연산자나 조기 반환으로 단순화할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 060

switch

switch는 하나의 값을 여러 case와 비교합니다.

JavaScript 코드
let day = 2;
switch (day) {
  case 1: console.log("월"); break;
  case 2: console.log("화"); break;
  default: console.log("기타");
}

예상 결과

화

상세 설명

break가 없으면 다음 case까지 이어 실행되는 fall-through가 발생할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 061

truthy/falsy

빈 문자열은 falsy입니다.

JavaScript 코드
if ("") console.log("참");
else console.log("거짓");

예상 결과

거짓

상세 설명

0, -0, NaN, null, undefined, false, 빈 문자열 등이 대표적인 falsy 값입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 062

for 기본

for는 초기식·조건식·증감식을 한 곳에 모읍니다.

JavaScript 코드
for (let i = 1; i <= 5; i++) {
  console.log(i);
}

예상 결과

1 2 3 4 5

상세 설명

반복 횟수가 비교적 분명할 때 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 063

역순 for

증감식은 감소 형태로도 작성할 수 있습니다.

JavaScript 코드
for (let i = 5; i >= 1; i--) console.log(i);

예상 결과

5 4 3 2 1

상세 설명

카운트다운이나 역순 탐색에 활용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 064

2씩 증가

증감 폭은 1일 필요가 없습니다.

JavaScript 코드
for (let i = 0; i <= 10; i += 2) console.log(i);

예상 결과

0 2 4 6 8 10

상세 설명

일정 간격으로 값을 생성하거나 인덱스를 건너뛸 때 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 065

합계 구하기

누적 변수에 반복적으로 값을 더해 합계를 계산합니다.

JavaScript 코드
let sum = 0;
for (let i = 1; i <= 100; i++) sum += i;
console.log(sum);

예상 결과

5050

상세 설명

반복 알고리즘에서 accumulator 패턴의 기본 예입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 066

곱 누적

누적 곱을 이용해 팩토리얼을 계산할 수 있습니다.

JavaScript 코드
let fact = 1;
for (let i = 1; i <= 5; i++) fact *= i;
console.log(fact);

예상 결과

120

상세 설명

초기값을 0이 아니라 곱셈의 항등원 1로 잡아야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 067

while 기본

while은 조건이 참인 동안 반복합니다.

JavaScript 코드
let n = 1;
while (n <= 3) {
  console.log(n);
  n++;
}

예상 결과

1 2 3

상세 설명

증감이나 상태 변화가 빠지면 무한 반복이 생길 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 068

do-while

do-while은 조건 검사보다 본문을 먼저 실행합니다.

JavaScript 코드
let n = 5;
do {
  console.log(n);
} while (n < 3);

예상 결과

5

상세 설명

따라서 조건이 처음부터 거짓이어도 최소 한 번 실행됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 069

break

break는 가장 가까운 반복문을 즉시 종료합니다.

JavaScript 코드
for (let i = 1; i <= 10; i++) {
  if (i === 4) break;
  console.log(i);
}

예상 결과

1 2 3

상세 설명

원하는 값을 찾았을 때 탐색을 일찍 끝내 효율을 높일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 070

continue

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

JavaScript 코드
for (let i = 1; i <= 5; i++) {
  if (i === 3) continue;
  console.log(i);
}

예상 결과

1 2 4 5

상세 설명

제외 조건을 앞부분에서 처리하면 본문 중첩을 줄일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 071

구구단 2단

반복 변수로 규칙적인 출력을 만들 수 있습니다.

JavaScript 코드
for (let i = 1; i <= 9; i++) {
  console.log(`2 × ${i} = ${2*i}`);
}

예상 결과

2×1=2 ... 2×9=18

상세 설명

템플릿 리터럴과 산술 연산을 함께 연습하는 예입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 072

중첩 반복문

반복문 안에 반복문을 배치하면 2차원 순회를 표현할 수 있습니다.

JavaScript 코드
for (let r = 1; r <= 3; r++) {
  for (let c = 1; c <= 3; c++) {
    console.log(r, c);
  }
}

예상 결과

(1,1) ... (3,3)

상세 설명

표, 격자, 행렬 탐색의 기초 구조입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 073

별 삼각형

문자열 repeat()과 반복문을 조합할 수 있습니다.

JavaScript 코드
for (let i = 1; i <= 5; i++) {
  console.log("*".repeat(i));
}

예상 결과

* / ** / *** / **** / *****

상세 설명

반복 패턴을 시각적으로 이해하는 대표 예제입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 074

1~100 짝수 합

필요한 값만 생성하도록 반복 간격을 설계할 수 있습니다.

JavaScript 코드
let sum = 0;
for (let i = 2; i <= 100; i += 2) sum += i;
console.log(sum);

예상 결과

2550

상세 설명

모든 수를 돌며 if로 거르는 방법보다 의도가 명확합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 075

최대공약수 반복

유클리드 호제법은 나머지 연산을 반복해 최대공약수를 구합니다.

JavaScript 코드
let a = 48, b = 18;
while (b !== 0) {
  [a, b] = [b, a % b];
}
console.log(a);

예상 결과

6

상세 설명

구조 분해 할당을 이용하면 두 변수 갱신을 간결하게 표현할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 076

FizzBuzz 기초

조건의 우선순위가 중요한 대표 반복 문제입니다.

JavaScript 코드
for (let i = 1; i <= 15; i++) {
  if (i % 15 === 0) console.log("FizzBuzz");
  else if (i % 3 === 0) console.log("Fizz");
  else if (i % 5 === 0) console.log("Buzz");
  else console.log(i);
}

예상 결과

1, 2, Fizz, ... FizzBuzz

상세 설명

15의 배수 검사를 먼저 해야 3과 5의 공배수가 FizzBuzz로 처리됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 077

소수 판정 반복

약수는 제곱근까지만 검사해도 소수 여부를 판정할 수 있습니다.

JavaScript 코드
let n = 29;
let prime = n >= 2;
for (let d = 2; d * d <= n && prime; d++) {
  if (n % d === 0) prime = false;
}
console.log(prime);

예상 결과

true

상세 설명

d*d <= n 조건은 불필요한 반복을 줄여 효율을 개선합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 078

피보나치 반복

앞의 두 항으로 다음 항을 만드는 상태 갱신 예제입니다.

JavaScript 코드
let a = 0, b = 1;
for (let i = 0; i < 10; i++) {
  console.log(a);
  [a, b] = [b, a + b];
}

예상 결과

0 1 1 2 3 5 8 13 21 34

상세 설명

배열 구조 분해를 이용하면 임시 변수 없이 두 값을 동시에 바꿀 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 079

반복 패턴 응용 1

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 7; i++) {
  if (i % 3 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 080

반복 패턴 응용 2

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 8; i++) {
  if (i % 4 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 081

반복 패턴 응용 3

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 9; i++) {
  if (i % 2 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 082

반복 패턴 응용 4

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 10; i++) {
  if (i % 3 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 083

반복 패턴 응용 5

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 11; i++) {
  if (i % 4 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 084

반복 패턴 응용 6

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 12; i++) {
  if (i % 2 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 085

반복 패턴 응용 7

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 13; i++) {
  if (i % 3 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 086

반복 패턴 응용 8

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 14; i++) {
  if (i % 4 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 087

반복 패턴 응용 9

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 15; i++) {
  if (i % 2 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 088

반복 패턴 응용 10

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 16; i++) {
  if (i % 3 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 089

반복 패턴 응용 11

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 17; i++) {
  if (i % 4 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 090

반복 패턴 응용 12

반복문과 조건문을 결합하여 선택적으로 값을 누적합니다.

JavaScript 코드
let total = 0;
for (let i = 1; i <= 18; i++) {
  if (i % 2 === 0) total += i;
}
console.log(total);

예상 결과

조건에 맞는 수의 합

상세 설명

반복 범위, 배수 조건, 누적 변수를 바꾸면서 알고리즘의 구성 요소가 결과에 어떤 영향을 주는지 연습합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

04. 함수와 스코프

예제 091

함수 선언문

함수는 반복할 코드를 이름으로 묶습니다.

JavaScript 코드
function greet() {
  console.log("안녕하세요!");
}
greet();

예상 결과

안녕하세요!

상세 설명

선언문 형태 함수는 호출 시점보다 뒤에 정의되어 있어도 호이스팅으로 사용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 092

매개변수

매개변수는 함수가 외부 값을 받아들이는 통로입니다.

JavaScript 코드
function greet(name) {
  console.log(`안녕하세요, ${name}님!`);
}
greet("서연");

예상 결과

안녕하세요, 서연님!

상세 설명

함수를 데이터에 따라 재사용 가능하게 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 093

return

return은 함수의 계산 결과를 호출한 곳으로 돌려줍니다.

JavaScript 코드
function add(a, b) {
  return a + b;
}
let result = add(3, 4);
console.log(result);

예상 결과

7

상세 설명

return 이후 같은 블록의 코드는 실행되지 않습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 094

기본 매개변수

매개변수에 기본값을 지정할 수 있습니다.

JavaScript 코드
function power(x, n = 2) {
  return x ** n;
}
console.log(power(5));

예상 결과

25

상세 설명

인수를 생략했을 때 사용할 합리적인 기본 동작을 정의합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 095

함수 표현식

함수를 값처럼 변수에 저장할 수 있습니다.

JavaScript 코드
const add = function(a, b) {
  return a + b;
};
console.log(add(2, 5));

예상 결과

7

상세 설명

함수 표현식은 변수의 초기화 시점 이후에 호출해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 096

화살표 함수

화살표 함수는 짧은 함수 표현에 유용합니다.

JavaScript 코드
const square = x => x * x;
console.log(square(6));

예상 결과

36

상세 설명

중괄호와 return을 생략한 한 줄 표현식에서는 그 표현식 값이 자동 반환됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 097

여러 매개변수 화살표

매개변수가 둘 이상이면 괄호를 사용합니다.

JavaScript 코드
const add = (a, b) => a + b;
console.log(add(10, 20));

예상 결과

30

상세 설명

콜백 함수에서 특히 많이 사용되는 문법입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 098

콜백 함수

함수를 다른 함수의 인수로 전달할 수 있습니다.

JavaScript 코드
function runTwice(fn) {
  fn();
  fn();
}
runTwice(() => console.log("실행"));

예상 결과

실행 / 실행

상세 설명

이런 함수 인수를 콜백이라고 하며 이벤트·비동기 처리의 핵심 개념입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 099

지역 변수

let/const는 선언된 블록을 중심으로 유효 범위를 가집니다.

JavaScript 코드
function test() {
  let x = 10;
  console.log(x);
}
test();

예상 결과

10

상세 설명

함수 안에서 만든 변수는 일반적으로 함수 밖에서 직접 접근할 수 없습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 100

전역 변수 주의

전역 변수는 여러 함수가 공유할 수 있습니다.

JavaScript 코드
let count = 0;
function increase() {
  count++;
}
increase();
console.log(count);

예상 결과

1

상세 설명

편리하지만 의존성이 커지므로 가능한 한 좁은 스코프를 사용하는 것이 유지보수에 유리합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 101

클로저 기초

내부 함수는 외부 함수 실행이 끝난 뒤에도 외부 변수에 접근할 수 있습니다.

JavaScript 코드
function makeCounter() {
  let count = 0;
  return () => ++count;
}
const counter = makeCounter();
console.log(counter(), counter());

예상 결과

1 2

상세 설명

이러한 성질을 클로저라 하며 상태 은닉에 활용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 102

재귀 팩토리얼

재귀 함수는 자기 자신을 호출합니다.

JavaScript 코드
function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}
console.log(factorial(5));

예상 결과

120

상세 설명

반드시 종료 조건이 있어야 무한 호출과 스택 초과를 막을 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 103

재귀 합계

큰 문제를 더 작은 같은 형태의 문제로 줄여 해결할 수 있습니다.

JavaScript 코드
function sum(n) {
  if (n === 0) return 0;
  return n + sum(n - 1);
}
console.log(sum(5));

예상 결과

15

상세 설명

재귀식과 종료 조건의 관계를 이해하는 데 좋은 예입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 104

나머지 매개변수

...nums는 여러 인수를 하나의 배열로 모읍니다.

JavaScript 코드
function sum(...nums) {
  return nums.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3, 4));

예상 결과

10

상세 설명

인수 개수가 정해지지 않은 함수를 만들 때 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 105

함수를 반환하는 함수

함수는 반환값이 될 수도 있습니다.

JavaScript 코드
function multiplier(k) {
  return x => x * k;
}
const double = multiplier(2);
console.log(double(7));

예상 결과

14

상세 설명

고차 함수는 동작을 조립하고 재사용하는 함수형 프로그래밍의 기초입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 106

함수 응용 1

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform1(value) {
  const offset = 1;
  return value * 2 + offset;
}
console.log(transform1(3));

예상 결과

7

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 107

함수 응용 2

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform2(value) {
  const offset = 2;
  return value * 2 + offset;
}
console.log(transform2(4));

예상 결과

10

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 108

함수 응용 3

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform3(value) {
  const offset = 3;
  return value * 2 + offset;
}
console.log(transform3(5));

예상 결과

13

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 109

함수 응용 4

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform4(value) {
  const offset = 4;
  return value * 2 + offset;
}
console.log(transform4(6));

예상 결과

16

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 110

함수 응용 5

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform5(value) {
  const offset = 5;
  return value * 2 + offset;
}
console.log(transform5(7));

예상 결과

19

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 111

함수 응용 6

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform6(value) {
  const offset = 6;
  return value * 2 + offset;
}
console.log(transform6(8));

예상 결과

22

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 112

함수 응용 7

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform7(value) {
  const offset = 7;
  return value * 2 + offset;
}
console.log(transform7(9));

예상 결과

25

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 113

함수 응용 8

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform8(value) {
  const offset = 8;
  return value * 2 + offset;
}
console.log(transform8(10));

예상 결과

28

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 114

함수 응용 9

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform9(value) {
  const offset = 9;
  return value * 2 + offset;
}
console.log(transform9(11));

예상 결과

31

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 115

함수 응용 10

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform10(value) {
  const offset = 10;
  return value * 2 + offset;
}
console.log(transform10(12));

예상 결과

34

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 116

함수 응용 11

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform11(value) {
  const offset = 11;
  return value * 2 + offset;
}
console.log(transform11(13));

예상 결과

37

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 117

함수 응용 12

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform12(value) {
  const offset = 12;
  return value * 2 + offset;
}
console.log(transform12(14));

예상 결과

40

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 118

함수 응용 13

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform13(value) {
  const offset = 13;
  return value * 2 + offset;
}
console.log(transform13(15));

예상 결과

43

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 119

함수 응용 14

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform14(value) {
  const offset = 14;
  return value * 2 + offset;
}
console.log(transform14(16));

예상 결과

46

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 120

함수 응용 15

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform15(value) {
  const offset = 15;
  return value * 2 + offset;
}
console.log(transform15(17));

예상 결과

49

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 121

함수 응용 16

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform16(value) {
  const offset = 16;
  return value * 2 + offset;
}
console.log(transform16(18));

예상 결과

52

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 122

함수 응용 17

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform17(value) {
  const offset = 17;
  return value * 2 + offset;
}
console.log(transform17(19));

예상 결과

55

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 123

함수 응용 18

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform18(value) {
  const offset = 18;
  return value * 2 + offset;
}
console.log(transform18(20));

예상 결과

58

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 124

함수 응용 19

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform19(value) {
  const offset = 19;
  return value * 2 + offset;
}
console.log(transform19(21));

예상 결과

61

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 125

함수 응용 20

입력값을 매개변수로 받고 계산 결과를 반환하는 순수 함수 형태를 연습합니다.

JavaScript 코드
function transform20(value) {
  const offset = 20;
  return value * 2 + offset;
}
console.log(transform20(22));

예상 결과

64

상세 설명

같은 입력에는 같은 결과를 돌려주는 함수는 테스트하기 쉽습니다. 함수 이름, 입력, 반환식의 역할을 분리해서 읽어 보세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

05. 문자열과 배열

예제 126

문자열 인덱싱

문자열은 0부터 시작하는 인덱스로 문자에 접근할 수 있습니다.

JavaScript 코드
let s = "JavaScript";
console.log(s[0], s[4]);

예상 결과

J S

상세 설명

문자열 자체는 불변이므로 특정 문자를 직접 대입해 바꾸는 방식은 사용할 수 없습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 127

includes 문자열

includes()는 부분 문자열 포함 여부를 검사합니다.

JavaScript 코드
console.log("JavaScript".includes("Script"));

예상 결과

true

상세 설명

대소문자를 구분합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 128

slice 문자열

slice(start, end)는 start 이상 end 미만 범위를 잘라냅니다.

JavaScript 코드
console.log("JavaScript".slice(0, 4));

예상 결과

Java

상세 설명

원본 문자열은 변경되지 않습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 129

문자열 대소문자

toUpperCase(), toLowerCase()로 대소문자를 변환합니다.

JavaScript 코드
console.log("Hello".toUpperCase());
console.log("WORLD".toLowerCase());

예상 결과

HELLO / world

상세 설명

검색어 정규화 같은 작업에 자주 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 130

trim

trim()은 문자열 양끝 공백을 제거합니다.

JavaScript 코드
console.log("  hello  ".trim());

예상 결과

hello

상세 설명

사용자 입력 정리 단계에서 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 131

split

split()은 구분자를 기준으로 문자열을 배열로 나눕니다.

JavaScript 코드
console.log("a,b,c".split(","));

예상 결과

["a","b","c"]

상세 설명

CSV와 같은 간단한 구분 문자열을 처리할 때 활용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 132

replace

replace()는 일치하는 부분을 다른 문자열로 바꿉니다.

JavaScript 코드
console.log("I like Java".replace("Java", "JavaScript"));

예상 결과

I like JavaScript

상세 설명

정규표현식과 함께 사용하면 더 복잡한 치환도 가능합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 133

배열 생성

배열은 여러 값을 순서대로 저장합니다.

JavaScript 코드
let colors = ["red", "green", "blue"];
console.log(colors[1]);

예상 결과

green

상세 설명

인덱스는 0부터 시작합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 134

push

push()는 배열 끝에 요소를 추가합니다.

JavaScript 코드
let a = [1, 2];
a.push(3);
console.log(a);

예상 결과

[1,2,3]

상세 설명

원본 배열을 변경하며 새 길이를 반환합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 135

pop

pop()은 배열 끝 요소를 제거하고 반환합니다.

JavaScript 코드
let a = [1, 2, 3];
console.log(a.pop());
console.log(a);

예상 결과

3 / [1,2]

상세 설명

스택의 pop 동작과 같은 방식입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 136

unshift

unshift()는 배열 앞에 요소를 추가합니다.

JavaScript 코드
let a = [2, 3];
a.unshift(1);
console.log(a);

예상 결과

[1,2,3]

상세 설명

큰 배열에서는 뒤 요소들을 이동해야 하므로 빈번한 사용은 비용이 커질 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 137

shift

shift()는 배열 첫 요소를 제거해 반환합니다.

JavaScript 코드
let a = [1, 2, 3];
console.log(a.shift());

예상 결과

1

상세 설명

큐처럼 보일 수 있지만 대규모 큐에는 전용 자료구조 설계를 고려할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 138

배열 slice

배열 slice()는 일부 요소를 새 배열로 복사합니다.

JavaScript 코드
let a = [10,20,30,40];
console.log(a.slice(1,3));

예상 결과

[20,30]

상세 설명

원본 배열은 변경되지 않습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 139

splice

splice()는 원하는 위치에서 삭제·삽입을 수행합니다.

JavaScript 코드
let a = [1,2,3,4];
a.splice(1,2,9);
console.log(a);

예상 결과

[1,9,4]

상세 설명

원본 배열을 직접 변경하는 메서드입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 140

indexOf

indexOf()는 값의 첫 인덱스를 찾습니다.

JavaScript 코드
console.log([10,20,30].indexOf(20));

예상 결과

1

상세 설명

없으면 -1을 반환합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 141

includes 배열

배열 includes()는 특정 값 존재 여부를 boolean으로 반환합니다.

JavaScript 코드
console.log([1,2,3].includes(2));

예상 결과

true

상세 설명

존재 확인 목적에는 indexOf보다 의도가 분명합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 142

join

join()은 배열 요소를 문자열로 연결합니다.

JavaScript 코드
console.log(["2026","09","02"].join("-"));

예상 결과

2026-09-02

상세 설명

split()과 반대 방향의 변환으로 생각할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 143

for...of

for...of는 iterable의 값을 순서대로 순회합니다.

JavaScript 코드
for (const x of [10,20,30]) console.log(x);

예상 결과

10 20 30

상세 설명

배열에서 인덱스가 필요 없을 때 간결합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 144

forEach

forEach()는 각 요소에 콜백을 실행합니다.

JavaScript 코드
[1,2,3].forEach(x => console.log(x * 2));

예상 결과

2 4 6

상세 설명

반환 배열을 만들지는 않으므로 변환 목적이라면 map()이 더 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 145

map

map()은 각 요소를 변환한 새 배열을 만듭니다.

JavaScript 코드
let b = [1,2,3].map(x => x * x);
console.log(b);

예상 결과

[1,4,9]

상세 설명

원본 배열을 직접 바꾸지 않고 데이터 변환 파이프라인을 구성할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 146

filter

filter()는 조건을 만족하는 요소만 모아 새 배열을 만듭니다.

JavaScript 코드
let b = [1,2,3,4,5].filter(x => x % 2 === 0);
console.log(b);

예상 결과

[2,4]

상세 설명

선택 조건을 콜백으로 표현합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 147

reduce

reduce()는 배열을 하나의 값으로 누적합니다.

JavaScript 코드
let sum = [1,2,3,4].reduce((acc,x) => acc+x, 0);
console.log(sum);

예상 결과

10

상세 설명

합계, 객체 그룹화, 빈도 계산 등 다양한 집계에 활용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 148

find

find()는 조건을 처음 만족하는 요소를 반환합니다.

JavaScript 코드
console.log([3,7,10,12].find(x => x > 8));

예상 결과

10

상세 설명

없으면 undefined입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 149

findIndex

findIndex()는 조건을 처음 만족하는 인덱스를 반환합니다.

JavaScript 코드
console.log([3,7,10].findIndex(x => x >= 7));

예상 결과

1

상세 설명

없으면 -1입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 150

some

some()은 하나라도 조건을 만족하는지 검사합니다.

JavaScript 코드
console.log([1,3,5,8].some(x => x % 2 === 0));

예상 결과

true

상세 설명

논리적 존재(∃) 검사로 이해할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 151

every

every()는 모든 요소가 조건을 만족하는지 검사합니다.

JavaScript 코드
console.log([2,4,6].every(x => x % 2 === 0));

예상 결과

true

상세 설명

논리적 전체(∀) 검사에 해당합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 152

sort 숫자

기본 sort는 문자열 기준이므로 숫자 정렬에는 비교 함수를 전달해야 합니다.

JavaScript 코드
let a=[10,2,30,4];
a.sort((x,y)=>x-y);
console.log(a);

예상 결과

[2,4,10,30]

상세 설명

x-y가 음수면 x가 앞에 오도록 정렬됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 153

역순

reverse()는 배열 순서를 뒤집습니다.

JavaScript 코드
let a=[1,2,3];
console.log(a.reverse());

예상 결과

[3,2,1]

상세 설명

원본 배열을 변경합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 154

flat

flat(depth)은 중첩 배열을 지정 깊이만큼 평탄화합니다.

JavaScript 코드
console.log([1,[2,[3]]].flat(2));

예상 결과

[1,2,3]

상세 설명

데이터 전처리에서 중첩 구조를 단순화할 때 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 155

Array.from

Array.from()은 iterable 또는 유사 배열을 실제 배열로 바꿉니다.

JavaScript 코드
console.log(Array.from("ABC"));

예상 결과

["A","B","C"]

상세 설명

문자열, NodeList 등을 배열 메서드로 처리하려 할 때 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 156

배열 데이터 처리 응용 1

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [1, 2, 3, 4, 5];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 3);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 157

배열 데이터 처리 응용 2

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [2, 3, 4, 5, 6];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 4);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 158

배열 데이터 처리 응용 3

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [3, 4, 5, 6, 7];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 2);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 159

배열 데이터 처리 응용 4

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [4, 5, 6, 7, 8];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 3);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 160

배열 데이터 처리 응용 5

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [5, 6, 7, 8, 9];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 4);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 161

배열 데이터 처리 응용 6

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [6, 7, 8, 9, 10];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 2);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 162

배열 데이터 처리 응용 7

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [7, 8, 9, 10, 11];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 3);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 163

배열 데이터 처리 응용 8

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [8, 9, 10, 11, 12];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 4);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 164

배열 데이터 처리 응용 9

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [9, 10, 11, 12, 13];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 2);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 165

배열 데이터 처리 응용 10

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [10, 11, 12, 13, 14];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 3);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 166

배열 데이터 처리 응용 11

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [11, 12, 13, 14, 15];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 4);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 167

배열 데이터 처리 응용 12

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [12, 13, 14, 15, 16];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 2);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 168

배열 데이터 처리 응용 13

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [13, 14, 15, 16, 17];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 3);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 169

배열 데이터 처리 응용 14

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [14, 15, 16, 17, 18];
const result = data
  .filter(x => x % 2 === 0)
  .map(x => x * 4);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 170

배열 데이터 처리 응용 15

filter()와 map()을 연결하면 선택과 변환을 단계적으로 표현할 수 있습니다.

JavaScript 코드
const data = [15, 16, 17, 18, 19];
const result = data
  .filter(x => x % 2 === 1)
  .map(x => x * 2);
console.log(result);

예상 결과

조건에 따라 달라지는 새 배열

상세 설명

메서드 체이닝은 각 단계의 목적이 분명할 때 읽기 좋습니다. 중간 결과가 복잡하면 별도 변수로 나누어 디버깅하세요.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

06. 객체·Map·Set·Date·Math

예제 171

객체 생성

객체는 키와 값의 쌍으로 데이터를 묶습니다.

JavaScript 코드
const user = {name:"민지", age:17};
console.log(user.name);

예상 결과

민지

상세 설명

관련된 여러 속성을 하나의 의미 있는 단위로 표현할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 172

대괄호 속성 접근

특수문자가 있는 키나 동적 키는 대괄호로 접근합니다.

JavaScript 코드
const user={"favorite-color":"blue"};
console.log(user["favorite-color"]);

예상 결과

blue

상세 설명

변수에 속성명이 들어 있을 때도 대괄호 표기법을 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 173

속성 추가

const 객체도 내부 속성은 변경할 수 있습니다.

JavaScript 코드
const user={name:"수현"};
user.age=18;
console.log(user);

예상 결과

{name:'수현', age:18}

상세 설명

const는 변수 자체의 재대입을 막는 것이지 객체를 불변으로 만드는 것은 아닙니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 174

메서드

객체 속성의 값으로 함수를 저장하면 메서드라고 부릅니다.

JavaScript 코드
const calc={
  add(a,b){ return a+b; }
};
console.log(calc.add(2,3));

예상 결과

5

상세 설명

데이터와 관련 동작을 같은 객체에 묶을 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 175

this 기초

일반 메서드의 this는 호출 방식에 따라 결정됩니다.

JavaScript 코드
const user={
  name:"하린",
  greet(){ console.log(this.name); }
};
user.greet();

예상 결과

하린

상세 설명

user.greet()처럼 호출하면 일반적으로 this는 user를 가리킵니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 176

Object.keys

Object.keys()는 열거 가능한 자기 속성의 키 배열을 반환합니다.

JavaScript 코드
const o={a:1,b:2};
console.log(Object.keys(o));

예상 결과

["a","b"]

상세 설명

객체 순회와 검증에 자주 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 177

Object.values

Object.values()는 값 배열을 반환합니다.

JavaScript 코드
const o={a:1,b:2};
console.log(Object.values(o));

예상 결과

[1,2]

상세 설명

키가 필요 없고 값만 집계할 때 편리합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 178

Object.entries

Object.entries()는 [키, 값] 쌍 배열을 만듭니다.

JavaScript 코드
for (const [k,v] of Object.entries({a:1,b:2})) {
  console.log(k,v);
}

예상 결과

a 1 / b 2

상세 설명

구조 분해와 for...of를 조합하면 객체를 깔끔하게 순회할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 179

객체 전개 복사

객체 전개 문법으로 얕은 복사와 속성 덮어쓰기를 할 수 있습니다.

JavaScript 코드
const a={x:1,y:2};
const b={...a,y:9};
console.log(b);

예상 결과

{x:1,y:9}

상세 설명

중첩 객체까지 완전히 복제되는 것은 아닙니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 180

Object.freeze

Object.freeze()는 객체의 직접 속성 변경을 막습니다.

JavaScript 코드
const config=Object.freeze({mode:"dark"});
console.log(config.mode);

예상 결과

dark

상세 설명

얕은 동결이므로 중첩 객체에는 별도 처리가 필요합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 181

Set

Set은 중복 없는 값의 집합입니다.

JavaScript 코드
const s=new Set([1,1,2,3]);
console.log([...s]);

예상 결과

[1,2,3]

상세 설명

배열 중복 제거에 간단히 활용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 182

Set has

has()는 Set에 값이 존재하는지 빠르게 확인합니다.

JavaScript 코드
const s=new Set(["A","B"]);
console.log(s.has("B"));

예상 결과

true

상세 설명

집합의 membership 검사에 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 183

Map

Map은 다양한 자료형을 키로 사용할 수 있는 키-값 자료구조입니다.

JavaScript 코드
const m=new Map();
m.set("math",95);
console.log(m.get("math"));

예상 결과

95

상세 설명

삽입 순서가 보존되며 크기는 size로 확인합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 184

Map 순회

Map 자체가 iterable이므로 바로 for...of로 순회할 수 있습니다.

JavaScript 코드
const m=new Map([["a",1],["b",2]]);
for(const [k,v] of m) console.log(k,v);

예상 결과

a 1 / b 2

상세 설명

키와 값을 구조 분해해 받으면 간결합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 185

Math.round

Math.round()는 가장 가까운 정수로 반올림합니다.

JavaScript 코드
console.log(Math.round(3.6));

예상 결과

4

상세 설명

floor, ceil, trunc와 차이를 구분해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 186

Math.floor

Math.floor()는 작거나 같은 정수 방향으로 내림합니다.

JavaScript 코드
console.log(Math.floor(3.9));

예상 결과

3

상세 설명

음수에서는 단순 소수점 삭제와 결과가 다를 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 187

Math.max

Math.max는 여러 숫자 중 최댓값을 구합니다.

JavaScript 코드
console.log(Math.max(...[4,8,2,9]));

예상 결과

9

상세 설명

배열은 전개 연산자로 펼쳐 전달할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 188

난수

Math.random()은 [0,1) 범위의 의사난수를 반환합니다.

JavaScript 코드
console.log(Math.random());

예상 결과

0 이상 1 미만 난수

상세 설명

정수 범위로 바꾸려면 곱셈과 Math.floor를 조합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 189

1~6 주사위

난수 범위를 정수 구간으로 변환하는 기본 패턴입니다.

JavaScript 코드
const dice=Math.floor(Math.random()*6)+1;
console.log(dice);

예상 결과

1~6 중 하나

상세 설명

Math.random()*6은 0 이상 6 미만이고 floor 뒤 +1하면 1~6이 됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 190

Date 현재 시각

Date 객체는 날짜와 시각을 다룹니다.

JavaScript 코드
const now=new Date();
console.log(now.getFullYear());

예상 결과

현재 연도

상세 설명

표시 형식과 시간대 처리는 실제 서비스에서 특히 주의해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 191

날짜 ISO 문자열

toISOString()은 UTC 기준 ISO 8601 문자열을 만듭니다.

JavaScript 코드
const d=new Date("2026-09-02T12:00:00Z");
console.log(d.toISOString());

예상 결과

2026-09-02T12:00:00.000Z

상세 설명

데이터 교환과 저장에서 일관된 형식을 제공하는 데 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 192

객체 데이터 응용 1

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1001,
  name: "학생1",
  scores: [71, 76, 81]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 193

객체 데이터 응용 2

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1002,
  name: "학생2",
  scores: [72, 77, 82]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 194

객체 데이터 응용 3

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1003,
  name: "학생3",
  scores: [73, 78, 83]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 195

객체 데이터 응용 4

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1004,
  name: "학생4",
  scores: [74, 79, 84]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 196

객체 데이터 응용 5

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1005,
  name: "학생5",
  scores: [75, 80, 85]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 197

객체 데이터 응용 6

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1006,
  name: "학생6",
  scores: [76, 81, 86]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 198

객체 데이터 응용 7

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1007,
  name: "학생7",
  scores: [77, 82, 87]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 199

객체 데이터 응용 8

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1008,
  name: "학생8",
  scores: [78, 83, 88]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 200

객체 데이터 응용 9

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1009,
  name: "학생9",
  scores: [79, 84, 89]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 201

객체 데이터 응용 10

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1010,
  name: "학생10",
  scores: [80, 85, 80]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 202

객체 데이터 응용 11

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1011,
  name: "학생11",
  scores: [81, 86, 81]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 203

객체 데이터 응용 12

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1012,
  name: "학생12",
  scores: [82, 87, 82]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 204

객체 데이터 응용 13

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1013,
  name: "학생13",
  scores: [83, 88, 83]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 205

객체 데이터 응용 14

객체 안에 배열을 넣어 실제 데이터 구조에 가까운 형태를 다룹니다.

JavaScript 코드
const student = {
  id: 1014,
  name: "학생14",
  scores: [84, 89, 84]
};
const avg = student.scores.reduce((a,b)=>a+b,0) / student.scores.length;
console.log(student.name, avg.toFixed(1));

예상 결과

학생명과 평균

상세 설명

객체로 학생의 속성을 묶고 배열 메서드 reduce()로 점수를 집계합니다. toFixed(1)은 소수 첫째 자리 문자열을 만듭니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

07. DOM과 이벤트

예제 206

getElementById

getElementById()는 특정 id를 가진 요소 하나를 찾습니다.

JavaScript 코드
const title = document.getElementById("title");
console.log(title.textContent);

예상 결과

id=title 요소의 글자

상세 설명

DOM 조작은 먼저 요소를 선택하고 그 다음 속성·내용·스타일을 바꾸는 흐름으로 이해하면 쉽습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 207

querySelector

querySelector()는 CSS 선택자로 첫 요소를 찾습니다.

JavaScript 코드
const first = document.querySelector(".item");
console.log(first);

예상 결과

첫 번째 .item 요소

상세 설명

id, class, 속성, 복합 선택자 등을 동일한 방식으로 사용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 208

querySelectorAll

querySelectorAll()은 일치하는 모든 요소의 NodeList를 반환합니다.

JavaScript 코드
const items=document.querySelectorAll(".item");
console.log(items.length);

예상 결과

.item 개수

상세 설명

forEach()로 순회할 수 있으며 정적 목록이라는 점을 기억합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 209

textContent 변경

textContent는 요소 안의 텍스트를 읽거나 바꿉니다.

JavaScript 코드
document.querySelector("h1").textContent="새 제목";

예상 결과

화면의 h1 글자 변경

상세 설명

단순 텍스트를 넣을 때 innerHTML보다 안전하고 의도가 명확합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 210

innerHTML

innerHTML은 문자열을 HTML로 해석합니다.

JavaScript 코드
document.querySelector("#box").innerHTML="<b>굵은 글자</b>";

예상 결과

굵은 글자 렌더링

상세 설명

사용자 입력을 그대로 넣으면 XSS 위험이 있으므로 신뢰되지 않는 데이터에 주의합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 211

style 변경

style 속성으로 인라인 CSS를 바꿀 수 있습니다.

JavaScript 코드
const box=document.querySelector("#box");
box.style.fontSize="24px";

예상 결과

글자 크기 변경

상세 설명

여러 스타일 변경에는 classList로 클래스를 토글하는 방법이 더 유지보수에 유리할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 212

classList.add

classList는 CSS 클래스 조작을 위한 편리한 API입니다.

JavaScript 코드
document.body.classList.add("dark");

예상 결과

body에 dark 클래스 추가

상세 설명

add, remove, toggle, contains 등을 제공합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 213

classList.toggle

toggle()은 클래스의 존재 상태를 반대로 바꿉니다.

JavaScript 코드
document.querySelector("button").addEventListener("click",()=>{
  document.body.classList.toggle("dark");
});

예상 결과

클릭마다 dark 클래스 전환

상세 설명

다크 모드 같은 UI 상태 전환에 자주 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 214

요소 생성

createElement()로 DOM 요소를 새로 만들 수 있습니다.

JavaScript 코드
const p=document.createElement("p");
p.textContent="새 문단";
document.body.appendChild(p);

예상 결과

새 문단 추가

상세 설명

생성 → 내용/속성 설정 → 부모에 삽입의 순서로 이해하면 됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 215

append

append()는 노드나 문자열을 요소 끝에 추가할 수 있습니다.

JavaScript 코드
const ul=document.querySelector("ul");
const li=document.createElement("li");
li.textContent="항목";
ul.append(li);

예상 결과

목록 항목 추가

상세 설명

appendChild보다 유연한 최신 API입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 216

remove

remove()는 해당 요소를 DOM에서 제거합니다.

JavaScript 코드
document.querySelector(".ad")?.remove();

예상 결과

광고 요소 제거

상세 설명

옵셔널 체이닝을 함께 쓰면 요소가 없을 때 오류를 피할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 217

속성 읽기

getAttribute()는 HTML 속성값을 문자열로 읽습니다.

JavaScript 코드
const img=document.querySelector("img");
console.log(img.getAttribute("src"));

예상 결과

img의 src 속성값

상세 설명

DOM 프로퍼티 접근과 미묘하게 다른 경우가 있어 목적에 따라 선택합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 218

속성 설정

setAttribute()는 요소의 HTML 속성을 설정합니다.

JavaScript 코드
document.querySelector("a").setAttribute("target","_blank");

예상 결과

링크 target 변경

상세 설명

동적 UI에서 aria-* 같은 접근성 속성을 관리할 때도 사용됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 219

data 속성

dataset은 data-* 사용자 정의 속성에 접근합니다.

JavaScript 코드
const el=document.querySelector("[data-id]");
console.log(el.dataset.id);

예상 결과

data-id 값

상세 설명

DOM 요소와 관련된 작은 메타데이터를 저장하는 데 편리합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 220

click 이벤트

addEventListener()로 이벤트 발생 시 실행할 함수를 등록합니다.

JavaScript 코드
document.querySelector("button").addEventListener("click",()=>{
  console.log("클릭!");
});

예상 결과

버튼 클릭 시 클릭!

상세 설명

HTML onclick 속성보다 로직을 분리하기 쉽습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 221

event 객체

이벤트 핸들러는 이벤트 정보가 담긴 객체를 받을 수 있습니다.

JavaScript 코드
document.addEventListener("click", e => {
  console.log(e.target.tagName);
});

예상 결과

클릭한 요소의 태그명

상세 설명

target은 실제 이벤트가 시작된 요소를 가리킵니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 222

input 이벤트

input 이벤트는 입력값이 바뀔 때마다 발생합니다.

JavaScript 코드
document.querySelector("input").addEventListener("input", e => {
  console.log(e.target.value);
});

예상 결과

입력할 때 현재 값

상세 설명

실시간 검색·글자 수 표시 등에 활용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 223

change 이벤트

change는 값 변경이 확정될 때 자주 사용됩니다.

JavaScript 코드
document.querySelector("select").addEventListener("change", e => {
  console.log(e.target.value);
});

예상 결과

선택된 값

상세 설명

select, checkbox 등 폼 컨트롤 처리에 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 224

submit 이벤트

submit 이벤트에서 preventDefault()로 기본 제출 동작을 막을 수 있습니다.

JavaScript 코드
document.querySelector("form").addEventListener("submit", e => {
  e.preventDefault();
  console.log("제출 처리");
});

예상 결과

페이지 새로고침 없이 제출 처리

상세 설명

그 뒤 검증이나 fetch 요청 같은 사용자 정의 로직을 수행합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 225

키보드 이벤트

keydown은 키가 눌릴 때 발생합니다.

JavaScript 코드
document.addEventListener("keydown", e => {
  if(e.key === "Escape") console.log("닫기");
});

예상 결과

Esc 입력 시 닫기

상세 설명

e.key를 사용하면 의미 있는 키 이름으로 분기할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 226

이벤트 위임

이벤트 버블링을 이용해 부모 하나에서 자식 이벤트를 처리할 수 있습니다.

JavaScript 코드
document.querySelector("ul").addEventListener("click", e => {
  if(e.target.matches("li")) console.log(e.target.textContent);
});

예상 결과

클릭한 li 내용

상세 설명

동적으로 추가되는 많은 항목을 효율적으로 다루는 핵심 패턴입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 227

DOM 미니 기능 1

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn1");
const output = document.querySelector("#out1");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 228

DOM 미니 기능 2

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn2");
const output = document.querySelector("#out2");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 229

DOM 미니 기능 3

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn3");
const output = document.querySelector("#out3");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 230

DOM 미니 기능 4

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn4");
const output = document.querySelector("#out4");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 231

DOM 미니 기능 5

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn5");
const output = document.querySelector("#out5");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 232

DOM 미니 기능 6

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn6");
const output = document.querySelector("#out6");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 233

DOM 미니 기능 7

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn7");
const output = document.querySelector("#out7");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 234

DOM 미니 기능 8

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn8");
const output = document.querySelector("#out8");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 235

DOM 미니 기능 9

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn9");
const output = document.querySelector("#out9");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 236

DOM 미니 기능 10

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn10");
const output = document.querySelector("#out10");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 237

DOM 미니 기능 11

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn11");
const output = document.querySelector("#out11");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 238

DOM 미니 기능 12

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn12");
const output = document.querySelector("#out12");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 239

DOM 미니 기능 13

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn13");
const output = document.querySelector("#out13");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 240

DOM 미니 기능 14

DOM 선택, 이벤트 등록, data 속성, 텍스트 갱신을 한 번에 연습합니다.

JavaScript 코드
const button = document.querySelector("#btn14");
const output = document.querySelector("#out14");

button?.addEventListener("click", () => {
  const value = Number(output?.dataset.count ?? 0) + 1;
  if (output) {
    output.dataset.count = value;
    output.textContent = `클릭 횟수: ${value}`;
  }
});

예상 결과

버튼 클릭 횟수 증가

상세 설명

요소가 존재하는지 ?.와 if로 방어하고, dataset 문자열을 Number()로 바꾼 뒤 다시 화면과 상태에 반영합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

08. 예외 처리·JSON·저장소·비동기

예제 241

try-catch

try 블록의 예외를 catch에서 처리할 수 있습니다.

JavaScript 코드
try {
  JSON.parse("잘못된 JSON");
} catch (err) {
  console.log("오류 처리");
}

예상 결과

오류 처리

상세 설명

예상 가능한 실패를 사용자에게 친절하게 처리하되 모든 오류를 무조건 숨기지는 않아야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 242

throw

throw로 직접 예외를 발생시킬 수 있습니다.

JavaScript 코드
function divide(a,b){
  if(b===0) throw new Error("0으로 나눌 수 없습니다.");
  return a/b;
}

예상 결과

0 입력 시 예외

상세 설명

함수가 처리할 수 없는 잘못된 입력을 호출자에게 명확히 알릴 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 243

finally

finally는 예외 여부와 관계없이 마지막에 실행됩니다.

JavaScript 코드
try {
  console.log("작업");
} finally {
  console.log("정리");
}

예상 결과

작업 / 정리

상세 설명

리소스 정리나 공통 마무리 작업에 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 244

JSON.stringify

객체를 JSON 문자열로 직렬화합니다.

JavaScript 코드
const user={name:"민수",age:17};
console.log(JSON.stringify(user));

예상 결과

{"name":"민수","age":17}

상세 설명

네트워크 전송이나 문자열 저장 전에 구조화 데이터를 변환할 때 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 245

JSON.parse

JSON.parse()는 JSON 문자열을 JavaScript 값으로 바꿉니다.

JavaScript 코드
const text='{"x":10,"y":20}';
const obj=JSON.parse(text);
console.log(obj.x+obj.y);

예상 결과

30

상세 설명

잘못된 JSON이면 예외가 발생하므로 외부 데이터에는 오류 처리를 고려합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 246

localStorage 저장

localStorage는 브라우저에 문자열 데이터를 지속 저장합니다.

JavaScript 코드
localStorage.setItem("theme","dark");
console.log(localStorage.getItem("theme"));

예상 결과

dark

상세 설명

객체를 저장하려면 JSON.stringify/parse를 함께 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 247

localStorage 삭제

removeItem()은 특정 키를 삭제합니다.

JavaScript 코드
localStorage.removeItem("theme");

예상 결과

theme 항목 삭제

상세 설명

clear()는 모든 항목을 지우므로 범위를 주의합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 248

setTimeout

setTimeout은 지정 시간 이후 콜백 실행을 예약합니다.

JavaScript 코드
setTimeout(()=>console.log("1초 뒤"),1000);

예상 결과

약 1초 뒤 출력

상세 설명

정확히 그 시각에 실행된다는 뜻은 아니며 이벤트 루프 상황에 따라 더 늦어질 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 249

setInterval

setInterval은 일정 간격으로 반복 실행을 예약합니다.

JavaScript 코드
let count=0;
const id=setInterval(()=>{
  console.log(++count);
  if(count===3) clearInterval(id);
},1000);

예상 결과

1,2,3 후 중지

상세 설명

clearInterval로 필요 시 반드시 종료할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 250

Promise 생성

Promise는 미래의 성공 값 또는 실패 이유를 나타냅니다.

JavaScript 코드
const p=new Promise(resolve=>{
  resolve(42);
});
p.then(v=>console.log(v));

예상 결과

42

상세 설명

비동기 작업의 상태를 pending/fulfilled/rejected로 모델링합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 251

Promise reject

Promise 실패는 catch()로 처리할 수 있습니다.

JavaScript 코드
Promise.reject(new Error("실패"))
  .catch(err=>console.log(err.message));

예상 결과

실패

상세 설명

실패를 처리하지 않으면 미처리 rejection 경고가 발생할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 252

Promise chaining

then()은 값을 다음 단계로 전달하며 연쇄 처리할 수 있습니다.

JavaScript 코드
Promise.resolve(2)
  .then(x=>x*3)
  .then(x=>x+1)
  .then(console.log);

예상 결과

7

상세 설명

각 단계가 새 Promise를 반환하므로 비동기 파이프라인을 구성할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 253

async 함수

async 함수는 항상 Promise를 반환합니다.

JavaScript 코드
async function answer(){
  return 42;
}
answer().then(console.log);

예상 결과

42

상세 설명

일반 값을 return해도 fulfilled Promise로 감싸집니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 254

await

await는 Promise가 처리될 때까지 async 함수 내부 흐름을 일시 중단합니다.

JavaScript 코드
async function run(){
  const value=await Promise.resolve(10);
  console.log(value);
}
run();

예상 결과

10

상세 설명

콜백 중첩보다 동기 코드처럼 읽히는 비동기 로직을 작성할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 255

async 오류 처리

await로 기다린 Promise의 reject는 try-catch로 처리할 수 있습니다.

JavaScript 코드
async function run(){
  try {
    await Promise.reject(new Error("네트워크 오류"));
  } catch(e){
    console.log(e.message);
  }
}
run();

예상 결과

네트워크 오류

상세 설명

비동기 함수에서도 일반 예외 처리 구조와 비슷하게 읽을 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 256

fetch GET

fetch()는 HTTP 요청을 보내고 Response Promise를 반환합니다.

JavaScript 코드
async function load(){
  const res=await fetch("https://example.com/data.json");
  if(!res.ok) throw new Error(`HTTP ${res.status}`);
  const data=await res.json();
  console.log(data);
}

예상 결과

서버 응답에 따라 달라짐

상세 설명

HTTP 404/500은 자동 reject가 아니므로 res.ok를 직접 검사하는 습관이 중요합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 257

fetch POST

fetch 옵션으로 메서드·헤더·본문을 지정합니다.

JavaScript 코드
async function save(data){
  const res=await fetch("/api/items",{
    method:"POST",
    headers:{"Content-Type":"application/json"},
    body:JSON.stringify(data)
  });
  return res.json();
}

예상 결과

서버 응답 JSON

상세 설명

JSON API로 데이터를 전송하는 대표 패턴입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 258

Promise.all

Promise.all은 여러 비동기 작업을 함께 기다립니다.

JavaScript 코드
const results=await Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3)
]);
console.log(results);

예상 결과

[1,2,3]

상세 설명

하나라도 reject되면 전체가 reject되며 서로 독립적인 병렬 작업에 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 259

Promise.allSettled

allSettled는 성공과 실패를 모두 모아 결과를 돌려줍니다.

JavaScript 코드
const r=await Promise.allSettled([
  Promise.resolve("성공"),
  Promise.reject("실패")
]);
console.log(r.map(x=>x.status));

예상 결과

["fulfilled","rejected"]

상세 설명

일부 실패가 있어도 전체 작업 결과를 보고 싶을 때 사용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 260

AbortController

AbortController는 fetch 같은 취소 가능한 작업에 취소 신호를 전달합니다.

JavaScript 코드
const controller=new AbortController();
fetch("/slow", {signal: controller.signal});
controller.abort();

예상 결과

요청 취소

상세 설명

검색어가 빠르게 바뀌는 UI에서 이전 요청을 취소하는 데 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 261

비동기 흐름 응용 1

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task1() {
  console.log("시작");
  await wait(50);
  console.log("완료");
}
task1();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 262

비동기 흐름 응용 2

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task2() {
  console.log("시작");
  await wait(100);
  console.log("완료");
}
task2();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 263

비동기 흐름 응용 3

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task3() {
  console.log("시작");
  await wait(150);
  console.log("완료");
}
task3();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 264

비동기 흐름 응용 4

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task4() {
  console.log("시작");
  await wait(200);
  console.log("완료");
}
task4();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 265

비동기 흐름 응용 5

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task5() {
  console.log("시작");
  await wait(250);
  console.log("완료");
}
task5();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 266

비동기 흐름 응용 6

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task6() {
  console.log("시작");
  await wait(300);
  console.log("완료");
}
task6();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 267

비동기 흐름 응용 7

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task7() {
  console.log("시작");
  await wait(350);
  console.log("완료");
}
task7();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 268

비동기 흐름 응용 8

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task8() {
  console.log("시작");
  await wait(400);
  console.log("완료");
}
task8();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 269

비동기 흐름 응용 9

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task9() {
  console.log("시작");
  await wait(450);
  console.log("완료");
}
task9();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 270

비동기 흐름 응용 10

Promise를 반환하는 wait() 함수와 async/await를 조합해 비동기 순서를 제어합니다.

JavaScript 코드
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function task10() {
  console.log("시작");
  await wait(500);
  console.log("완료");
}
task10();

예상 결과

시작 → 잠시 후 완료

상세 설명

await는 전체 프로그램을 멈추는 것이 아니라 해당 async 함수의 나머지 실행을 나중으로 미룹니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

09. 클래스·모듈·고급 문법

예제 271

class 기초

class는 객체 생성 패턴을 읽기 좋은 문법으로 표현합니다.

JavaScript 코드
class Person {
  constructor(name){ this.name=name; }
  greet(){ return `안녕, ${this.name}`; }
}
const p=new Person("민지");
console.log(p.greet());

예상 결과

안녕, 민지

상세 설명

constructor는 new로 인스턴스를 만들 때 초기화에 사용됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 272

상속

extends로 부모 클래스의 기능을 상속받을 수 있습니다.

JavaScript 코드
class Animal { speak(){ return "소리"; } }
class Dog extends Animal { speak(){ return "멍멍"; } }
console.log(new Dog().speak());

예상 결과

멍멍

상세 설명

자식 클래스는 같은 이름 메서드를 재정의하여 다형성을 표현할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 273

super

자식 생성자에서 super()로 부모 생성자를 호출합니다.

JavaScript 코드
class A { constructor(x){this.x=x;} }
class B extends A {
  constructor(x,y){ super(x); this.y=y; }
}
console.log(new B(1,2));

예상 결과

B {x:1,y:2}

상세 설명

파생 클래스에서 this를 사용하기 전에 super()를 호출해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 274

getter

getter는 메서드 계산을 속성처럼 읽게 해 줍니다.

JavaScript 코드
class Circle {
  constructor(r){this.r=r;}
  get area(){return Math.PI*this.r**2;}
}
console.log(new Circle(2).area);

예상 결과

약 12.566

상세 설명

계산된 값이나 내부 표현을 숨기는 인터페이스에 활용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 275

static

static 메서드는 인스턴스가 아니라 클래스 자체에 속합니다.

JavaScript 코드
class MathUtil {
  static double(x){ return x*2; }
}
console.log(MathUtil.double(5));

예상 결과

10

상세 설명

개별 객체 상태가 필요 없는 도우미 동작에 적합합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 276

private field

#으로 시작하는 필드는 클래스 외부에서 직접 접근할 수 없습니다.

JavaScript 코드
class Counter {
  #count=0;
  inc(){ return ++this.#count; }
}
console.log(new Counter().inc());

예상 결과

1

상세 설명

실제 언어 수준의 캡슐화를 제공합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 277

이터레이터

Symbol.iterator를 구현하면 객체를 iterable로 만들 수 있습니다.

JavaScript 코드
const range={
  *[Symbol.iterator](){
    yield 1; yield 2; yield 3;
  }
};
console.log([...range]);

예상 결과

[1,2,3]

상세 설명

for...of, 전개 문법 등과 연결됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 278

제너레이터

function*과 yield는 실행을 중간에 멈췄다가 이어갈 수 있는 제너레이터를 만듭니다.

JavaScript 코드
function* gen(){
  yield "A";
  yield "B";
}
console.log([...gen()]);

예상 결과

["A","B"]

상세 설명

지연 시퀀스나 사용자 정의 반복자를 구현할 때 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 279

정규표현식 test

정규표현식은 문자열 패턴을 표현합니다.

JavaScript 코드
const re=/^[0-9]+$/;
console.log(re.test("12345"));

예상 결과

true

상세 설명

test()는 패턴 일치 여부를 boolean으로 반환합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 280

정규표현식 replace

g 플래그는 모든 일치 항목을 대상으로 합니다.

JavaScript 코드
console.log("a1b2c3".replace(/\d/g,"#"));

예상 결과

a#b#c#

상세 설명

정규표현식 치환은 데이터 정제에 강력하지만 복잡해지면 가독성에 주의합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 281

ES module export

export는 다른 모듈이 사용할 값을 공개합니다.

JavaScript 코드
// math.js
export function add(a,b){ return a+b; }

예상 결과

모듈에서 함수 내보내기

상세 설명

모듈은 파일 단위 의존성을 명확히 하고 전역 오염을 줄입니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 282

ES module import

import는 다른 모듈이 export한 값을 가져옵니다.

JavaScript 코드
// app.js
import { add } from "./math.js";
console.log(add(2,3));

예상 결과

5

상세 설명

브라우저에서는 <script type="module">로 모듈을 사용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 283

default export

default export는 모듈당 하나를 둘 수 있습니다.

JavaScript 코드
// user.js
export default class User {}
// app.js
import User from "./user.js";

예상 결과

기본 내보내기 가져오기

상세 설명

가져올 때 중괄호 없이 원하는 지역 이름으로 받을 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 284

동적 import

import()는 Promise를 반환하며 런타임에 모듈을 불러옵니다.

JavaScript 코드
const module = await import("./feature.js");
module.run();

예상 결과

필요 시 모듈 로딩

상세 설명

코드 분할이나 조건부 기능 로딩에 활용할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 285

Proxy

Proxy는 객체 기본 동작을 가로채 사용자 정의할 수 있습니다.

JavaScript 코드
const target={x:1};
const p=new Proxy(target,{
  get(obj,key){ return key in obj ? obj[key] : 0; }
});
console.log(p.y);

예상 결과

0

상세 설명

검증, 관찰, 가상 속성 등에 쓰이지만 남용하면 추적이 어려워질 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 286

WeakMap

WeakMap의 키는 객체이며 키 객체를 강하게 유지하지 않습니다.

JavaScript 코드
const wm=new WeakMap();
const obj={};
wm.set(obj,"private");
console.log(wm.get(obj));

예상 결과

private

상세 설명

객체에 연결된 부가 메타데이터 저장 등에 활용됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 287

깊은 복사 structuredClone

structuredClone()은 지원되는 값들을 깊게 복제합니다.

JavaScript 코드
const a={x:{y:1}};
const b=structuredClone(a);
b.x.y=9;
console.log(a.x.y);

예상 결과

1

상세 설명

JSON 직렬화 복사보다 더 많은 내장 자료형을 다룰 수 있지만 함수 등 복제 불가 값도 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 288

Intl.NumberFormat

Intl은 국제화된 숫자·날짜 형식을 제공합니다.

JavaScript 코드
const f=new Intl.NumberFormat("ko-KR");
console.log(f.format(1234567));

예상 결과

1,234,567

상세 설명

지역별 표시 규칙을 직접 문자열 조작으로 구현하는 것보다 안전합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 289

Intl.DateTimeFormat

DateTimeFormat은 지역 규칙에 맞게 날짜를 포맷합니다.

JavaScript 코드
const f=new Intl.DateTimeFormat("ko-KR",{dateStyle:"full"});
console.log(f.format(new Date("2026-09-02")));

예상 결과

한국어 날짜 형식

상세 설명

시간대 옵션까지 명시하면 국제 서비스의 날짜 표시 오류를 줄일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 290

메모이제이션

메모이제이션은 같은 입력의 계산 결과를 캐시에 저장해 재사용합니다.

JavaScript 코드
function memoize(fn){
  const cache=new Map();
  return x => {
    if(cache.has(x)) return cache.get(x);
    const v=fn(x); cache.set(x,v); return v;
  };
}
const square=memoize(x=>x*x);
console.log(square(8));

예상 결과

64

상세 설명

비싼 순수 함수 계산에서 효과적이며 캐시 크기와 입력 키 전략을 고려해야 합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

10. 실전 응용·심화 프로젝트

예제 291

디바운스 함수

디바운스는 짧은 시간에 연속 호출되는 함수의 실행 횟수를 줄입니다.

JavaScript 코드
function debounce(fn, delay){
  let timer;
  return (...args)=>{
    clearTimeout(timer);
    timer=setTimeout(()=>fn(...args),delay);
  };
}
const search=debounce(q=>console.log(q),300);

예상 결과

마지막 호출만 지연 실행

상세 설명

검색창 자동완성, resize 이벤트처럼 빈번한 이벤트 처리에 유용합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 292

스로틀 함수

스로틀은 반복 호출을 일정 빈도로 제한합니다.

JavaScript 코드
function throttle(fn, interval){
  let ready=true;
  return (...args)=>{
    if(!ready) return;
    ready=false;
    fn(...args);
    setTimeout(()=>ready=true, interval);
  };
}

예상 결과

일정 간격으로 최대 한 번 실행

상세 설명

스크롤 위치 추적처럼 지속적으로 발생하는 이벤트 부하를 줄일 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 293

간단한 스택 클래스

배열을 감싸 스택 ADT를 구현할 수 있습니다.

JavaScript 코드
class Stack {
  #data=[];
  push(x){this.#data.push(x);}
  pop(){return this.#data.pop();}
  get size(){return this.#data.length;}
}
const s=new Stack(); s.push(10); s.push(20);
console.log(s.pop(), s.size);

예상 결과

20 1

상세 설명

내부 저장소를 private field로 숨겨 사용자가 허용된 연산만 사용하도록 인터페이스를 설계합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 294

큐 구현

shift() 대신 head 인덱스를 이동하는 간단한 큐 전략입니다.

JavaScript 코드
class Queue {
  #data=[]; #head=0;
  enqueue(x){this.#data.push(x);}
  dequeue(){return this.#data[this.#head++];}
}
const q=new Queue(); q.enqueue("A"); q.enqueue("B");
console.log(q.dequeue());

예상 결과

A

상세 설명

큰 배열에서 매번 앞 요소를 실제 삭제하는 비용을 피할 수 있으며 장기 사용 시 압축 전략도 고려할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 295

괄호 검사

스택으로 여는 괄호와 닫는 괄호의 순서를 검사합니다.

JavaScript 코드
function validBrackets(text){
  const stack=[];
  const pair={")":"(", "]":"[", "}":"{"};
  for(const ch of text){
    if("([{ ".includes(ch) && ch!==" ") stack.push(ch);
    else if(ch in pair && stack.pop()!==pair[ch]) return false;
  }
  return stack.length===0;
}
console.log(validBrackets("{[()]}") );

예상 결과

true

상세 설명

닫는 괄호를 만날 때 가장 최근 여는 괄호와 짝이 맞아야 하므로 LIFO 구조가 자연스럽게 대응됩니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 296

BFS

BFS는 큐를 사용해 가까운 정점부터 탐색합니다.

JavaScript 코드
function bfs(graph,start){
  const q=[start], seen=new Set([start]);
  while(q.length){
    const v=q.shift(); console.log(v);
    for(const next of graph[v] ?? []){
      if(!seen.has(next)){seen.add(next); q.push(next);}
    }
  }
}
bfs({A:["B","C"],B:["D"],C:[],D:[]},"A");

예상 결과

A B C D

상세 설명

방문 집합을 사용해야 사이클이 있는 그래프에서 무한 반복을 피할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 297

DFS 재귀

DFS는 한 경로를 깊게 따라간 뒤 되돌아옵니다.

JavaScript 코드
function dfs(graph,v,seen=new Set()){
  if(seen.has(v)) return;
  seen.add(v); console.log(v);
  for(const next of graph[v] ?? []) dfs(graph,next,seen);
}
dfs({A:["B","C"],B:["D"],C:[],D:[]},"A");

예상 결과

A B D C

상세 설명

재귀 호출 스택이 탐색 경로를 자연스럽게 보존합니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 298

Todo 상태 관리

배열과 객체 전개를 사용해 기존 데이터를 직접 수정하지 않는 상태 갱신을 연습합니다.

JavaScript 코드
let todos=[];
function addTodo(text){
  todos=[...todos,{id:Date.now(),text,done:false}];
}
function toggleTodo(id){
  todos=todos.map(t=>t.id===id?{...t,done:!t.done}:t);
}

예상 결과

불변 방식으로 목록 갱신

상세 설명

이 방식은 변경 이력을 추적하거나 UI 프레임워크에서 상태 변화를 감지하기 쉽습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 299

간단한 API 캐시

동일한 비동기 요청을 캐시하면 중복 네트워크 호출을 줄일 수 있습니다.

JavaScript 코드
const cache=new Map();
async function getJSON(url){
  if(cache.has(url)) return cache.get(url);
  const promise=fetch(url).then(r=>{
    if(!r.ok) throw new Error(`HTTP ${r.status}`);
    return r.json();
  });
  cache.set(url,promise);
  return promise;
}

예상 결과

같은 URL 요청 Promise 재사용

상세 설명

Promise 자체를 캐시하면 동시에 들어온 같은 요청도 하나의 진행 중 작업을 공유할 수 있습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.

예제 300

종합: 검색 UI 구조

상태, 이벤트, 배열 처리, DOM 렌더링을 결합한 작은 애플리케이션 구조입니다.

JavaScript 코드
const state={items:[], query:""};
const input=document.querySelector("#search");
const list=document.querySelector("#list");

function render(){
  const q=state.query.toLowerCase();
  const filtered=state.items.filter(x=>x.name.toLowerCase().includes(q));
  list.replaceChildren(...filtered.map(x=>{
    const li=document.createElement("li");
    li.textContent=x.name;
    return li;
  }));
}

input.addEventListener("input",e=>{
  state.query=e.target.value;
  render();
});

예상 결과

입력에 따라 목록 실시간 필터링

상세 설명

데이터(state)를 바꾸고 render()가 화면을 다시 그리도록 역할을 분리하면 규모가 커져도 흐름을 추적하기 쉽습니다.

읽는 순서

① 입력·초기값 확인 → ② 핵심 연산 또는 메서드 확인 → ③ 반환값·변경된 상태 확인 → ④ 출력 결과와 연결해 해석합니다.