{"componentChunkName":"component---src-templates-blog-post-js","path":"/javascript/최신-JavaScript-ES2020부터-ES2024까지-모던-개발자를-위한-완벽-가이드/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"00ccb841-caf8-5b82-b842-24ccf3ebd740","excerpt":"최신 JavaScript - ES2020부터 ES2024까지, 모던 개발자를 위한 완벽 가이드 ES6(ES2015) 이후 JavaScript는 매년 새로운 기능을 추가하며 빠르게 발전하고 있다. ES2020부터 ES2024까지…","html":"<h1 id=\"최신-javascript---es2020부터-es2024까지-모던-개발자를-위한-완벽-가이드\" style=\"position:relative;\"><a href=\"#%EC%B5%9C%EC%8B%A0-javascript---es2020%EB%B6%80%ED%84%B0-es2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C\" aria-label=\"최신 javascript   es2020부터 es2024까지 모던 개발자를 위한 완벽 가이드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>최신 JavaScript - ES2020부터 ES2024까지, 모던 개발자를 위한 완벽 가이드</h1>\n<p>ES6(ES2015) 이후 JavaScript는 매년 새로운 기능을 추가하며 빠르게 발전하고 있다. ES2020부터 ES2024까지 5년간 추가된 기능들은 개발 경험을 크게 개선했으며, 더 안전하고 표현력 있는 코드를 작성할 수 있게 해주었다. 이 글은 최신 JavaScript 기능들을 실전 예제와 함께 체계적으로 정리한다.</p>\n<h2 id=\"1-es2020-es11---비동기와-옵셔널의-시대\" style=\"position:relative;\"><a href=\"#1-es2020-es11---%EB%B9%84%EB%8F%99%EA%B8%B0%EC%99%80-%EC%98%B5%EC%85%94%EB%84%90%EC%9D%98-%EC%8B%9C%EB%8C%80\" aria-label=\"1 es2020 es11   비동기와 옵셔널의 시대 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. ES2020 (ES11) - 비동기와 옵셔널의 시대</h2>\n<h3 id=\"1-1-optional-chaining-\" style=\"position:relative;\"><a href=\"#1-1-optional-chaining-\" aria-label=\"1 1 optional chaining  permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. Optional Chaining (?.)</h3>\n<p>중첩된 객체 속성에 안전하게 접근할 수 있는 연산자다. <code class=\"language-text\">null</code>이나 <code class=\"language-text\">undefined</code>일 때 에러 대신 <code class=\"language-text\">undefined</code>를 반환한다.</p>\n<p><strong>기존 방식의 문제점</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// ❌ 에러 발생 가능</span>\n<span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">profile</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">address</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Seoul'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// address가 없으면 에러 발생</span>\n<span class=\"token keyword\">const</span> city <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>profile<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">.</span>city<span class=\"token punctuation\">;</span> <span class=\"token comment\">// TypeError: Cannot read property 'city' of undefined</span>\n\n<span class=\"token comment\">// 기존 해결 방법</span>\n<span class=\"token keyword\">const</span> city <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>profile <span class=\"token operator\">&amp;&amp;</span> user<span class=\"token punctuation\">.</span>profile<span class=\"token punctuation\">.</span>address <span class=\"token operator\">&amp;&amp;</span> user<span class=\"token punctuation\">.</span>profile<span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">.</span>city<span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Optional Chaining 사용</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// ✅ 안전한 접근</span>\n<span class=\"token keyword\">const</span> city <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>profile<span class=\"token operator\">?.</span>address<span class=\"token operator\">?.</span>city<span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined (에러 없음)</span>\n\n<span class=\"token comment\">// 함수 호출에도 사용 가능</span>\n<span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>profile<span class=\"token operator\">?.</span>getName<span class=\"token operator\">?.</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 함수가 없으면 undefined</span>\n\n<span class=\"token comment\">// 배열에도 사용 가능</span>\n<span class=\"token keyword\">const</span> firstItem <span class=\"token operator\">=</span> arr<span class=\"token operator\">?.</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// arr이 null/undefined면 undefined</span>\n\n<span class=\"token comment\">// 옵셔널 체이닝과 기본값 결합</span>\n<span class=\"token keyword\">const</span> city <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>profile<span class=\"token operator\">?.</span>address<span class=\"token operator\">?.</span>city <span class=\"token operator\">??</span> <span class=\"token string\">'Unknown'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>실전 활용</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// API 응답 처리</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">fetchUserData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">userId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>userId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 안전하게 중첩 데이터 접근</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>profile<span class=\"token operator\">?.</span>name <span class=\"token operator\">??</span> <span class=\"token string\">'Anonymous'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>contact<span class=\"token operator\">?.</span>email<span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">avatar</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>profile<span class=\"token operator\">?.</span>images<span class=\"token operator\">?.</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">?.</span>url\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// DOM 조작</span>\n<span class=\"token keyword\">const</span> title <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.article'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">?.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.title'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">?.</span>textContent<span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-2-nullish-coalescing-\" style=\"position:relative;\"><a href=\"#1-2-nullish-coalescing-\" aria-label=\"1 2 nullish coalescing  permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. Nullish Coalescing (??)</h3>\n<p>왼쪽 피연산자가 <code class=\"language-text\">null</code> 또는 <code class=\"language-text\">undefined</code>일 때만 오른쪽 값을 반환한다. <code class=\"language-text\">||</code> 연산자와 달리 falsy 값(<code class=\"language-text\">0</code>, <code class=\"language-text\">''</code>, <code class=\"language-text\">false</code>)을 유지한다.</p>\n<p><strong>기존 방식의 문제점</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// ❌ 0이나 빈 문자열도 기본값으로 대체됨</span>\n<span class=\"token keyword\">const</span> count <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>count <span class=\"token operator\">||</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// count가 0이면 10이 됨 (의도하지 않은 동작)</span>\n<span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>name <span class=\"token operator\">||</span> <span class=\"token string\">'Anonymous'</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// name이 ''이면 'Anonymous'가 됨</span></code></pre></div>\n<p><strong>Nullish Coalescing 사용</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// ✅ null/undefined만 기본값으로 대체</span>\n<span class=\"token keyword\">const</span> count <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>count <span class=\"token operator\">??</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// count가 0이면 0 유지</span>\n<span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> user<span class=\"token punctuation\">.</span>name <span class=\"token operator\">??</span> <span class=\"token string\">'Anonymous'</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// name이 ''이면 '' 유지</span>\n\n<span class=\"token comment\">// 옵셔널 체이닝과 함께 사용</span>\n<span class=\"token keyword\">const</span> city <span class=\"token operator\">=</span> user<span class=\"token operator\">?.</span>address<span class=\"token operator\">?.</span>city <span class=\"token operator\">??</span> <span class=\"token string\">'Unknown'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> age <span class=\"token operator\">=</span> user<span class=\"token operator\">?.</span>profile<span class=\"token operator\">?.</span>age <span class=\"token operator\">??</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>실전 활용</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 설정값 처리</span>\n<span class=\"token keyword\">const</span> config <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">timeout</span><span class=\"token operator\">:</span> options<span class=\"token punctuation\">.</span>timeout <span class=\"token operator\">??</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">retries</span><span class=\"token operator\">:</span> options<span class=\"token punctuation\">.</span>retries <span class=\"token operator\">??</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">debug</span><span class=\"token operator\">:</span> options<span class=\"token punctuation\">.</span>debug <span class=\"token operator\">??</span> <span class=\"token boolean\">false</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 함수 매개변수 기본값</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">createUser</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> age <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> name <span class=\"token operator\">??</span> <span class=\"token string\">'Anonymous'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">age</span><span class=\"token operator\">:</span> age <span class=\"token operator\">??</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">active</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// API 응답 처리</span>\n<span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">??</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-3-bigint\" style=\"position:relative;\"><a href=\"#1-3-bigint\" aria-label=\"1 3 bigint permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-3. BigInt</h3>\n<p>임의 정밀도 정수를 표현하는 새로운 원시 타입이다. <code class=\"language-text\">Number.MAX_SAFE_INTEGER</code> (2^53 - 1)를 초과하는 정수를 안전하게 다룰 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// BigInt 생성</span>\n<span class=\"token keyword\">const</span> bigNumber <span class=\"token operator\">=</span> <span class=\"token number\">9007199254740991n</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 리터럴에 n 추가</span>\n<span class=\"token keyword\">const</span> bigNumber2 <span class=\"token operator\">=</span> <span class=\"token function\">BigInt</span><span class=\"token punctuation\">(</span><span class=\"token number\">9007199254740991</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> bigNumber3 <span class=\"token operator\">=</span> <span class=\"token function\">BigInt</span><span class=\"token punctuation\">(</span><span class=\"token string\">'9007199254740991'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 연산</span>\n<span class=\"token keyword\">const</span> a <span class=\"token operator\">=</span> <span class=\"token number\">10n</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> b <span class=\"token operator\">=</span> <span class=\"token number\">20n</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 30n</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">*</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 200n</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">/</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 0n (정수 나눗셈)</span>\n\n<span class=\"token comment\">// Number와 비교 (타입 변환 필요)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token number\">10n</span> <span class=\"token operator\">===</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false (타입이 다름)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token number\">10n</span> <span class=\"token operator\">==</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true (값 비교)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token number\">10n</span> <span class=\"token operator\">+</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// TypeError: Cannot mix BigInt and number</span>\n\n<span class=\"token comment\">// 실전 활용: ID, 타임스탬프 등</span>\n<span class=\"token keyword\">const</span> userId <span class=\"token operator\">=</span> <span class=\"token function\">BigInt</span><span class=\"token punctuation\">(</span><span class=\"token string\">'9223372036854775807'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> timestamp <span class=\"token operator\">=</span> <span class=\"token function\">BigInt</span><span class=\"token punctuation\">(</span>Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"1-4-dynamic-import\" style=\"position:relative;\"><a href=\"#1-4-dynamic-import\" aria-label=\"1 4 dynamic import permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-4. Dynamic Import</h3>\n<p>런타임에 모듈을 동적으로 불러올 수 있다. 코드 스플리팅과 조건부 로딩에 유용하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 정적 import (기존)</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> utils <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./utils.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 동적 import</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">loadModule</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>condition<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> utils <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./utils.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    utils<span class=\"token punctuation\">.</span><span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 실전 활용: 라우트 기반 코드 스플리팅</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">loadRoute</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">route</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>route<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">case</span> <span class=\"token string\">'/dashboard'</span><span class=\"token operator\">:</span>\n      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> Dashboard <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./components/Dashboard.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> Dashboard<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">case</span> <span class=\"token string\">'/settings'</span><span class=\"token operator\">:</span>\n      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> Settings <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./components/Settings.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> Settings<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> Home <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./components/Home.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> Home<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 조건부 기능 로딩</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>isPremium<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> PremiumFeatures <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./premium.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  PremiumFeatures<span class=\"token punctuation\">.</span><span class=\"token function\">enable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"1-5-promiseallsettled\" style=\"position:relative;\"><a href=\"#1-5-promiseallsettled\" aria-label=\"1 5 promiseallsettled permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-5. Promise.allSettled()</h3>\n<p>모든 Promise가 완료될 때까지 기다린다. <code class=\"language-text\">Promise.all()</code>과 달리 일부가 실패해도 모든 결과를 반환한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Promise.all() - 하나라도 실패하면 전체 실패</span>\n<span class=\"token keyword\">const</span> promises <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/user'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/posts'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/comments'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> results <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span>promises<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 하나라도 실패하면 여기로</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Promise.allSettled() - 모든 결과 반환</span>\n<span class=\"token keyword\">const</span> results <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">allSettled</span><span class=\"token punctuation\">(</span>promises<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nresults<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'fulfilled'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Promise </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>index<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> succeeded:</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Promise </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>index<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> failed:</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">.</span>reason<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 실전 활용: 여러 API 호출</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">loadUserData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">userId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>user<span class=\"token punctuation\">,</span> posts<span class=\"token punctuation\">,</span> comments<span class=\"token punctuation\">,</span> likes<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">allSettled</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>userId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>userId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/posts</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>userId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/comments</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>userId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/likes</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">user</span><span class=\"token operator\">:</span> user<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'fulfilled'</span> <span class=\"token operator\">?</span> user<span class=\"token punctuation\">.</span>value <span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">posts</span><span class=\"token operator\">:</span> posts<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'fulfilled'</span> <span class=\"token operator\">?</span> posts<span class=\"token punctuation\">.</span>value <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">comments</span><span class=\"token operator\">:</span> comments<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'fulfilled'</span> <span class=\"token operator\">?</span> comments<span class=\"token punctuation\">.</span>value <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">likes</span><span class=\"token operator\">:</span> likes<span class=\"token punctuation\">.</span>status <span class=\"token operator\">===</span> <span class=\"token string\">'fulfilled'</span> <span class=\"token operator\">?</span> likes<span class=\"token punctuation\">.</span>value <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"1-6-globalthis\" style=\"position:relative;\"><a href=\"#1-6-globalthis\" aria-label=\"1 6 globalthis permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-6. globalThis</h3>\n<p>모든 JavaScript 환경에서 전역 객체를 참조하는 표준 방법이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 환경별 전역 객체</span>\n<span class=\"token comment\">// 브라우저: window</span>\n<span class=\"token comment\">// Node.js: global</span>\n<span class=\"token comment\">// Web Worker: self</span>\n\n<span class=\"token comment\">// 기존 방식 (환경 체크 필요)</span>\n<span class=\"token keyword\">const</span> global <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> window <span class=\"token operator\">!==</span> <span class=\"token string\">'undefined'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> window<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> global <span class=\"token operator\">!==</span> <span class=\"token string\">'undefined'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> global<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> self <span class=\"token operator\">!==</span> <span class=\"token string\">'undefined'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Unable to locate global object'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2020: globalThis 사용</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>globalThis<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 모든 환경에서 작동</span>\n\n<span class=\"token comment\">// 실전 활용</span>\nglobalThis<span class=\"token punctuation\">.</span>myGlobalVar <span class=\"token operator\">=</span> <span class=\"token string\">'Hello'</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>globalThis<span class=\"token punctuation\">.</span>myGlobalVar<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"2-es2021-es12---편의성-향상\" style=\"position:relative;\"><a href=\"#2-es2021-es12---%ED%8E%B8%EC%9D%98%EC%84%B1-%ED%96%A5%EC%83%81\" aria-label=\"2 es2021 es12   편의성 향상 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. ES2021 (ES12) - 편의성 향상</h2>\n<h3 id=\"2-1-stringprototypereplaceall\" style=\"position:relative;\"><a href=\"#2-1-stringprototypereplaceall\" aria-label=\"2 1 stringprototypereplaceall permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. String.prototype.replaceAll()</h3>\n<p>문자열의 모든 일치 항목을 한 번에 교체한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">const</span> text <span class=\"token operator\">=</span> <span class=\"token string\">'Hello World World'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> replaced <span class=\"token operator\">=</span> text<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">World</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">g</span></span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Universe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 정규식 필요</span>\n<span class=\"token comment\">// 또는</span>\n<span class=\"token keyword\">const</span> replaced2 <span class=\"token operator\">=</span> text<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">'World'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Universe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 복잡함</span>\n\n<span class=\"token comment\">// ES2021: replaceAll()</span>\n<span class=\"token keyword\">const</span> replaced3 <span class=\"token operator\">=</span> text<span class=\"token punctuation\">.</span><span class=\"token function\">replaceAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">'World'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Universe'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 'Hello Universe Universe'</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">sanitizeInput</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">input</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> input\n    <span class=\"token punctuation\">.</span><span class=\"token function\">replaceAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">'&lt;'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'&amp;lt;'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">replaceAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">'>'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'&amp;gt;'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">replaceAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">'\"'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'&amp;quot;'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">replaceAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"'\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'&amp;#x27;'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"2-2-promiseany\" style=\"position:relative;\"><a href=\"#2-2-promiseany\" aria-label=\"2 2 promiseany permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. Promise.any()</h3>\n<p>여러 Promise 중 하나라도 성공하면 그 결과를 반환한다. 모두 실패하면 AggregateError를 던진다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 여러 서버에서 데이터 가져오기</span>\n<span class=\"token keyword\">const</span> servers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token string\">'https://api1.example.com/data'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'https://api2.example.com/data'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'https://api3.example.com/data'</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 첫 번째로 성공한 응답 사용</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> fastest <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">any</span><span class=\"token punctuation\">(</span>\n    servers<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span> <span class=\"token operator\">=></span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Fastest response:'</span><span class=\"token punctuation\">,</span> fastest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 모든 요청 실패</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'All requests failed:'</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">.</span>errors<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 실전 활용: 폴백 전략</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">fetchWithFallback</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">urls</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">any</span><span class=\"token punctuation\">(</span>\n      urls<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span> <span class=\"token operator\">=></span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>r<span class=\"token punctuation\">.</span>ok<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">HTTP </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>r<span class=\"token punctuation\">.</span>status<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'All fallback URLs failed'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"2-3-논리-할당-연산자-logical-assignment-operators\" style=\"position:relative;\"><a href=\"#2-3-%EB%85%BC%EB%A6%AC-%ED%95%A0%EB%8B%B9-%EC%97%B0%EC%82%B0%EC%9E%90-logical-assignment-operators\" aria-label=\"2 3 논리 할당 연산자 logical assignment operators permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-3. 논리 할당 연산자 (Logical Assignment Operators)</h3>\n<p>논리 연산자와 할당을 결합한 축약 문법이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// &amp;&amp;= (Logical AND assignment)</span>\n<span class=\"token keyword\">let</span> user <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'John'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\nuser<span class=\"token punctuation\">.</span>name <span class=\"token operator\">&amp;&amp;=</span> user<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// user.name이 truthy면 할당</span>\n<span class=\"token comment\">// 동일: user.name = user.name &amp;&amp; user.name.toUpperCase();</span>\n\n<span class=\"token comment\">// ||= (Logical OR assignment)</span>\n<span class=\"token keyword\">let</span> config <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\nconfig<span class=\"token punctuation\">.</span>timeout <span class=\"token operator\">||=</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// config.timeout이 falsy면 5000 할당</span>\n<span class=\"token comment\">// 동일: config.timeout = config.timeout || 5000;</span>\n\n<span class=\"token comment\">// ??= (Nullish coalescing assignment)</span>\n<span class=\"token keyword\">let</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\noptions<span class=\"token punctuation\">.</span>retries <span class=\"token operator\">??=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// options.retries가 null/undefined면 3 할당</span>\n<span class=\"token comment\">// 동일: options.retries = options.retries ?? 3;</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">initConfig</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">userConfig</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> config <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  config<span class=\"token punctuation\">.</span>apiUrl <span class=\"token operator\">||=</span> <span class=\"token string\">'https://api.example.com'</span><span class=\"token punctuation\">;</span>\n  config<span class=\"token punctuation\">.</span>timeout <span class=\"token operator\">??=</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">;</span>\n  config<span class=\"token punctuation\">.</span>retries <span class=\"token operator\">??=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n  config<span class=\"token punctuation\">.</span>debug <span class=\"token operator\">&amp;&amp;=</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NODE_ENV</span> <span class=\"token operator\">===</span> <span class=\"token string\">'development'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>config<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>userConfig <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"2-4-숫자-구분자-numeric-separators\" style=\"position:relative;\"><a href=\"#2-4-%EC%88%AB%EC%9E%90-%EA%B5%AC%EB%B6%84%EC%9E%90-numeric-separators\" aria-label=\"2 4 숫자 구분자 numeric separators permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-4. 숫자 구분자 (Numeric Separators)</h3>\n<p>큰 숫자를 읽기 쉽게 만들기 위한 구분자다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">const</span> billion <span class=\"token operator\">=</span> <span class=\"token number\">1000000000</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 읽기 어려움</span>\n<span class=\"token keyword\">const</span> hex <span class=\"token operator\">=</span> <span class=\"token number\">0xDEADBEEF</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2021: 숫자 구분자</span>\n<span class=\"token keyword\">const</span> billion <span class=\"token operator\">=</span> <span class=\"token number\">1_000_000_000</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 읽기 쉬움</span>\n<span class=\"token keyword\">const</span> hex <span class=\"token operator\">=</span> <span class=\"token number\">0xDEAD_BEEF</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> binary <span class=\"token operator\">=</span> <span class=\"token number\">0b1010_0001_1000_0101</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> pi <span class=\"token operator\">=</span> <span class=\"token number\">3.14159_26535_89793</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">const</span> <span class=\"token constant\">MAX_SAFE_INTEGER</span> <span class=\"token operator\">=</span> <span class=\"token number\">9_007_199_254_740_991</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> creditCard <span class=\"token operator\">=</span> <span class=\"token number\">1234_5678_9012_3456</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> fileSize <span class=\"token operator\">=</span> <span class=\"token number\">1_048_576</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1MB</span></code></pre></div>\n<h3 id=\"2-5-weakref\" style=\"position:relative;\"><a href=\"#2-5-weakref\" aria-label=\"2 5 weakref permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-5. WeakRef</h3>\n<p>객체에 대한 약한 참조를 생성한다. 가비지 컬렉션을 방해하지 않으면서 객체를 참조할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// WeakRef 생성</span>\n<span class=\"token keyword\">let</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">data</span><span class=\"token operator\">:</span> <span class=\"token string\">'important'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> weakRef <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakRef</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 참조된 객체 접근</span>\n<span class=\"token keyword\">let</span> target <span class=\"token operator\">=</span> weakRef<span class=\"token punctuation\">.</span><span class=\"token function\">deref</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 'important'</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 원본 객체 삭제</span>\nobj <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 가비지 컬렉션 후</span>\ntarget <span class=\"token operator\">=</span> weakRef<span class=\"token punctuation\">.</span><span class=\"token function\">deref</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined (가비지 컬렉션됨)</span>\n\n<span class=\"token comment\">// 실전 활용: 캐시 구현</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Cache</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">set</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakRef</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">get</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> ref <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>ref<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">const</span> value <span class=\"token operator\">=</span> ref<span class=\"token punctuation\">.</span><span class=\"token function\">deref</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// 가비지 컬렉션됨 - 캐시에서 제거</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> value<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"2-6-finalizationregistry\" style=\"position:relative;\"><a href=\"#2-6-finalizationregistry\" aria-label=\"2 6 finalizationregistry permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-6. FinalizationRegistry</h3>\n<p>객체가 가비지 컬렉션될 때 콜백을 실행할 수 있게 해준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// FinalizationRegistry 생성</span>\n<span class=\"token keyword\">const</span> registry <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FinalizationRegistry</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">heldValue</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Object with value </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>heldValue<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> was garbage collected</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 객체 등록</span>\n<span class=\"token keyword\">let</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">data</span><span class=\"token operator\">:</span> <span class=\"token string\">'test'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\nregistry<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> <span class=\"token string\">'some-value'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 객체 삭제</span>\nobj <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 가비지 컬렉션 후 콜백 실행</span>\n\n<span class=\"token comment\">// 실전 활용: 리소스 정리</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ResourceManager</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>registry <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FinalizationRegistry</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resourceId</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">cleanup</span><span class=\"token punctuation\">(</span>resourceId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resource</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">generateId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>resources<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> resource<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>registry<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span>resource<span class=\"token punctuation\">,</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> id<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">cleanup</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Cleaning up resource </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// 리소스 정리 로직</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"3-es2022-es13---클래스와-모듈-강화\" style=\"position:relative;\"><a href=\"#3-es2022-es13---%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EB%AA%A8%EB%93%88-%EA%B0%95%ED%99%94\" aria-label=\"3 es2022 es13   클래스와 모듈 강화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. ES2022 (ES13) - 클래스와 모듈 강화</h2>\n<h3 id=\"3-1-top-level-await\" style=\"position:relative;\"><a href=\"#3-1-top-level-await\" aria-label=\"3 1 top level await permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. Top-level await</h3>\n<p>모듈의 최상위 레벨에서 <code class=\"language-text\">await</code>를 사용할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식: async 함수 필요</span>\n<span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> json <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> data<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2022: Top-level await</span>\n<span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> json <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> data<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 실전 활용: 모듈 초기화</span>\n<span class=\"token comment\">// config.js</span>\n<span class=\"token keyword\">const</span> config <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/api/config'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> r<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> config<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">import</span> config <span class=\"token keyword\">from</span> <span class=\"token string\">'./config.js'</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 이미 로드된 설정 사용 가능</span></code></pre></div>\n<h3 id=\"3-2-private-fields-\" style=\"position:relative;\"><a href=\"#3-2-private-fields-\" aria-label=\"3 2 private fields  permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. Private Fields (#)</h3>\n<p>클래스의 private 필드와 메서드를 선언할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식: 네이밍 컨벤션 (실제로는 private 아님)</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span> <span class=\"token comment\">// _ 접두사 (컨벤션일 뿐)</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>_name<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 외부에서 접근 가능</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ES2022: 진짜 private 필드</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  #name<span class=\"token punctuation\">;</span> <span class=\"token comment\">// private 필드</span>\n  #age<span class=\"token punctuation\">;</span> <span class=\"token comment\">// private 필드</span>\n  \n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> age</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#name<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 클래스 내부에서만 접근 가능</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">#validateAge</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">age</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// private 메서드</span>\n    <span class=\"token keyword\">return</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">150</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">setAge</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">age</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">#validateAge</span><span class=\"token punctuation\">(</span>age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">User</span><span class=\"token punctuation\">(</span><span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">30</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>#name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// SyntaxError: Private field '#name' must be declared in an enclosing class</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 'John'</span>\n\n<span class=\"token comment\">// 실전 활용: 캡슐화</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">BankAccount</span> <span class=\"token punctuation\">{</span>\n  #balance <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  #transactionHistory <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token function\">deposit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">amount</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>amount <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#balance <span class=\"token operator\">+=</span> amount<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#transactionHistory<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'deposit'</span><span class=\"token punctuation\">,</span> amount <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">amount</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>amount <span class=\"token operator\">></span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> amount <span class=\"token operator\">&lt;=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#balance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#balance <span class=\"token operator\">-=</span> amount<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#transactionHistory<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'withdraw'</span><span class=\"token punctuation\">,</span> amount <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> amount<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">getBalance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#balance<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">getHistory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#transactionHistory<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 복사본 반환</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-3-static-fields-and-methods\" style=\"position:relative;\"><a href=\"#3-3-static-fields-and-methods\" aria-label=\"3 3 static fields and methods permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-3. Static Fields and Methods</h3>\n<p>클래스의 static 필드와 메서드를 더 명확하게 선언할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">MathUtils</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> <span class=\"token constant\">PI</span> <span class=\"token operator\">=</span> <span class=\"token number\">3.14159</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 일부 환경에서만 지원</span>\n  <span class=\"token keyword\">static</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ES2022: 명시적 static 필드</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">MathUtils</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> <span class=\"token constant\">PI</span> <span class=\"token operator\">=</span> <span class=\"token number\">3.14159</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">static</span> <span class=\"token constant\">E</span> <span class=\"token operator\">=</span> <span class=\"token number\">2.71828</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">static</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">static</span> <span class=\"token function\">#privateStaticMethod</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// private static 메서드</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'secret'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 실전 활용: 싱글톤 패턴</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">DatabaseConnection</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> #instance <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">static</span> <span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#instance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#instance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">DatabaseConnection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#instance<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>DatabaseConnection<span class=\"token punctuation\">.</span>#instance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Use getInstance() instead'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-4-class-fields\" style=\"position:relative;\"><a href=\"#3-4-class-fields\" aria-label=\"3 4 class fields permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-4. Class Fields</h3>\n<p>클래스 필드를 생성자 밖에서 선언할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> email</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> email<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>createdAt <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ES2022: 클래스 필드</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token punctuation\">;</span>\n  email<span class=\"token punctuation\">;</span>\n  createdAt <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 기본값 설정 가능</span>\n  \n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> email</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> email<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Counter</span> <span class=\"token punctuation\">{</span>\n  count <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 인스턴스 필드</span>\n  <span class=\"token keyword\">static</span> total <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// static 필드</span>\n  \n  <span class=\"token function\">increment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>count<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n    Counter<span class=\"token punctuation\">.</span>total<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-5-errorcause\" style=\"position:relative;\"><a href=\"#3-5-errorcause\" aria-label=\"3 5 errorcause permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-5. Error.cause</h3>\n<p>에러 체인을 만들 수 있게 해준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">fetchData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed to fetch data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 원본 에러 정보 손실</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ES2022: Error.cause</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">fetchData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed to fetch data'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">cause</span><span class=\"token operator\">:</span> error <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 원본 에러 정보 보존</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 실전 활용: 에러 체이닝</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">processUserData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">userId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetchUser</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">processUser</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed to process user data'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">cause</span><span class=\"token operator\">:</span> error<span class=\"token punctuation\">,</span>\n      userId\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 에러 처리</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">processUserData</span><span class=\"token punctuation\">(</span><span class=\"token number\">123</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 'Failed to process user data'</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">.</span>cause<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 원본 에러</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-6-arrayat\" style=\"position:relative;\"><a href=\"#3-6-arrayat\" aria-label=\"3 6 arrayat permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-6. Array.at()</h3>\n<p>배열의 인덱스로 양수와 음수를 모두 사용할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">const</span> last <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>arr<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 마지막 요소</span>\n<span class=\"token keyword\">const</span> secondLast <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>arr<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 뒤에서 두 번째</span>\n\n<span class=\"token comment\">// ES2022: Array.at()</span>\n<span class=\"token keyword\">const</span> last <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 5</span>\n<span class=\"token keyword\">const</span> secondLast <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 4</span>\n<span class=\"token keyword\">const</span> first <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">getLastItem</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">array</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> array<span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">??</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">getNthFromEnd</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">array<span class=\"token punctuation\">,</span> n</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> array<span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-7-objecthasown\" style=\"position:relative;\"><a href=\"#3-7-objecthasown\" aria-label=\"3 7 objecthasown permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-7. Object.hasOwn()</h3>\n<p><code class=\"language-text\">Object.prototype.hasOwnProperty()</code>의 안전한 대안이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식의 문제</span>\n<span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nobj<span class=\"token punctuation\">.</span><span class=\"token function\">hasOwnProperty</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prop'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// TypeError: obj.hasOwnProperty is not a function</span>\n\n<span class=\"token comment\">// 해결 방법</span>\n<span class=\"token class-name\">Object</span><span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span><span class=\"token function\">hasOwnProperty</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> <span class=\"token string\">'prop'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2022: Object.hasOwn()</span>\nObject<span class=\"token punctuation\">.</span><span class=\"token function\">hasOwn</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> <span class=\"token string\">'prop'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 안전하게 사용 가능</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">hasProperty</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj<span class=\"token punctuation\">,</span> prop</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">hasOwn</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> prop<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 객체 순회</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> key <span class=\"token keyword\">in</span> obj<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Object<span class=\"token punctuation\">.</span><span class=\"token function\">hasOwn</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> obj<span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"4-es2023-es14---배열과-정렬-개선\" style=\"position:relative;\"><a href=\"#4-es2023-es14---%EB%B0%B0%EC%97%B4%EA%B3%BC-%EC%A0%95%EB%A0%AC-%EA%B0%9C%EC%84%A0\" aria-label=\"4 es2023 es14   배열과 정렬 개선 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. ES2023 (ES14) - 배열과 정렬 개선</h2>\n<h3 id=\"4-1-arrayfindlast--arrayfindlastindex\" style=\"position:relative;\"><a href=\"#4-1-arrayfindlast--arrayfindlastindex\" aria-label=\"4 1 arrayfindlast  arrayfindlastindex permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. Array.findLast() / Array.findLastIndex()</h3>\n<p>배열을 뒤에서부터 검색한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">const</span> lastEven <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">reverse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2023: findLast()</span>\n<span class=\"token keyword\">const</span> lastEven <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">findLast</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 2</span>\n<span class=\"token keyword\">const</span> lastIndex <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">findLastIndex</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 7</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">findLastError</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">logs</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> logs<span class=\"token punctuation\">.</span><span class=\"token function\">findLast</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">log</span> <span class=\"token operator\">=></span> log<span class=\"token punctuation\">.</span>level <span class=\"token operator\">===</span> <span class=\"token string\">'error'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">findLastValidItem</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">items</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> items<span class=\"token punctuation\">.</span><span class=\"token function\">findLast</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> item<span class=\"token punctuation\">.</span>isValid<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"4-2-arraytosorted--arraytoreversed--arraytospliced\" style=\"position:relative;\"><a href=\"#4-2-arraytosorted--arraytoreversed--arraytospliced\" aria-label=\"4 2 arraytosorted  arraytoreversed  arraytospliced permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. Array.toSorted() / Array.toReversed() / Array.toSpliced()</h3>\n<p>배열을 변경하지 않고 새 배열을 반환한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 기존 방식: 원본 변경</span>\n<span class=\"token keyword\">const</span> sorted <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>numbers<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 복사본 생성 필요</span>\n<span class=\"token keyword\">const</span> reversed <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>numbers<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">reverse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 복사본 생성 필요</span>\n\n<span class=\"token comment\">// ES2023: 불변 메서드</span>\n<span class=\"token keyword\">const</span> sorted <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">toSorted</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [1, 1, 3, 4, 5]</span>\n<span class=\"token keyword\">const</span> reversed <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">toReversed</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [5, 1, 4, 1, 3]</span>\n<span class=\"token keyword\">const</span> spliced <span class=\"token operator\">=</span> numbers<span class=\"token punctuation\">.</span><span class=\"token function\">toSpliced</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [3, 9, 9, 1, 5]</span>\n\n<span class=\"token comment\">// 원본은 변경되지 않음</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [3, 1, 4, 1, 5]</span>\n\n<span class=\"token comment\">// 실전 활용: 함수형 프로그래밍</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">processData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> data\n    <span class=\"token punctuation\">.</span><span class=\"token function\">toSorted</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> a<span class=\"token punctuation\">.</span>value <span class=\"token operator\">-</span> b<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">toReversed</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> item<span class=\"token punctuation\">.</span>active<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"4-3-arraywith\" style=\"position:relative;\"><a href=\"#4-3-arraywith\" aria-label=\"4 3 arraywith permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-3. Array.with()</h3>\n<p>특정 인덱스의 값을 변경한 새 배열을 반환한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">const</span> newArr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>arr<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\nnewArr<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">99</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2023: Array.with()</span>\n<span class=\"token keyword\">const</span> newArr <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">.</span><span class=\"token function\">with</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">99</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [1, 2, 99, 4, 5]</span>\n\n<span class=\"token comment\">// 원본은 변경되지 않음</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [1, 2, 3, 4, 5]</span>\n\n<span class=\"token comment\">// 실전 활용: 불변 업데이트</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">updateItem</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">items<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">,</span> updates</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> items<span class=\"token punctuation\">.</span><span class=\"token function\">with</span><span class=\"token punctuation\">(</span>index<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>items<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>updates <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// React 상태 업데이트</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>items<span class=\"token punctuation\">,</span> setItems<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">setItems</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">items</span> <span class=\"token operator\">=></span> items<span class=\"token punctuation\">.</span><span class=\"token function\">with</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">99</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"5-es2024-es15---최신-기능\" style=\"position:relative;\"><a href=\"#5-es2024-es15---%EC%B5%9C%EC%8B%A0-%EA%B8%B0%EB%8A%A5\" aria-label=\"5 es2024 es15   최신 기능 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. ES2024 (ES15) - 최신 기능</h2>\n<h3 id=\"5-1-promisewithresolvers\" style=\"position:relative;\"><a href=\"#5-1-promisewithresolvers\" aria-label=\"5 1 promisewithresolvers permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. Promise.withResolvers()</h3>\n<p>Promise의 resolve와 reject를 외부에서 제어할 수 있게 해준다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">createPromise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> resolve<span class=\"token punctuation\">,</span> reject<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> promise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res<span class=\"token punctuation\">,</span> rej</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    resolve <span class=\"token operator\">=</span> res<span class=\"token punctuation\">;</span>\n    reject <span class=\"token operator\">=</span> rej<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> promise<span class=\"token punctuation\">,</span> resolve<span class=\"token punctuation\">,</span> reject <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ES2024: Promise.withResolvers()</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> promise<span class=\"token punctuation\">,</span> resolve<span class=\"token punctuation\">,</span> reject <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">withResolvers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 실전 활용: 이벤트 기반 Promise</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">EventEmitter</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pending <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">waitFor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> promise<span class=\"token punctuation\">,</span> resolve <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">withResolvers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pending<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pending<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pending<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> promise<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token function\">emit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event<span class=\"token punctuation\">,</span> data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> resolvers <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pending<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>resolvers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      resolvers<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=></span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pending<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"5-2-arraygroupby--arraygroupbytomap\" style=\"position:relative;\"><a href=\"#5-2-arraygroupby--arraygroupbytomap\" aria-label=\"5 2 arraygroupby  arraygroupbytomap permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-2. Array.groupBy() / Array.groupByToMap()</h3>\n<p>배열을 그룹화한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> users <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">role</span><span class=\"token operator\">:</span> <span class=\"token string\">'admin'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">role</span><span class=\"token operator\">:</span> <span class=\"token string\">'user'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Bob'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">role</span><span class=\"token operator\">:</span> <span class=\"token string\">'admin'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Alice'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">role</span><span class=\"token operator\">:</span> <span class=\"token string\">'user'</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES2024: Array.groupBy()</span>\n<span class=\"token keyword\">const</span> grouped <span class=\"token operator\">=</span> users<span class=\"token punctuation\">.</span><span class=\"token function\">groupBy</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> user<span class=\"token punctuation\">.</span>role<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// {</span>\n<span class=\"token comment\">//   admin: [{ name: 'John', role: 'admin' }, { name: 'Bob', role: 'admin' }],</span>\n<span class=\"token comment\">//   user: [{ name: 'Jane', role: 'user' }, { name: 'Alice', role: 'user' }]</span>\n<span class=\"token comment\">// }</span>\n\n<span class=\"token comment\">// Array.groupByToMap()</span>\n<span class=\"token keyword\">const</span> groupedMap <span class=\"token operator\">=</span> users<span class=\"token punctuation\">.</span><span class=\"token function\">groupByToMap</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> user<span class=\"token punctuation\">.</span>role<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Map {</span>\n<span class=\"token comment\">//   'admin' => [...],</span>\n<span class=\"token comment\">//   'user' => [...]</span>\n<span class=\"token comment\">// }</span>\n\n<span class=\"token comment\">// 실전 활용</span>\n<span class=\"token keyword\">const</span> orders <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">status</span><span class=\"token operator\">:</span> <span class=\"token string\">'pending'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">amount</span><span class=\"token operator\">:</span> <span class=\"token number\">100</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">status</span><span class=\"token operator\">:</span> <span class=\"token string\">'completed'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">amount</span><span class=\"token operator\">:</span> <span class=\"token number\">200</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">status</span><span class=\"token operator\">:</span> <span class=\"token string\">'pending'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">amount</span><span class=\"token operator\">:</span> <span class=\"token number\">150</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> byStatus <span class=\"token operator\">=</span> orders<span class=\"token punctuation\">.</span><span class=\"token function\">groupBy</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">order</span> <span class=\"token operator\">=></span> order<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> totalByStatus <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span>byStatus<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span>status<span class=\"token punctuation\">,</span> orders<span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  status<span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">total</span><span class=\"token operator\">:</span> orders<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">sum<span class=\"token punctuation\">,</span> o</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> sum <span class=\"token operator\">+</span> o<span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"6-실전-활용-패턴\" style=\"position:relative;\"><a href=\"#6-%EC%8B%A4%EC%A0%84-%ED%99%9C%EC%9A%A9-%ED%8C%A8%ED%84%B4\" aria-label=\"6 실전 활용 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. 실전 활용 패턴</h2>\n<h3 id=\"6-1-안전한-데이터-접근-패턴\" style=\"position:relative;\"><a href=\"#6-1-%EC%95%88%EC%A0%84%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%91%EA%B7%BC-%ED%8C%A8%ED%84%B4\" aria-label=\"6 1 안전한 데이터 접근 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. 안전한 데이터 접근 패턴</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// API 응답 처리</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">fetchUserProfile</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">userId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>userId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> data <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>profile<span class=\"token operator\">?.</span>name <span class=\"token operator\">??</span> <span class=\"token string\">'Anonymous'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>contact<span class=\"token operator\">?.</span>email <span class=\"token operator\">??</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">avatar</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>profile<span class=\"token operator\">?.</span>images<span class=\"token operator\">?.</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">?.</span>url<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">settings</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">theme</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>preferences<span class=\"token operator\">?.</span>theme <span class=\"token operator\">??</span> <span class=\"token string\">'light'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">notifications</span><span class=\"token operator\">:</span> data<span class=\"token operator\">?.</span>user<span class=\"token operator\">?.</span>preferences<span class=\"token operator\">?.</span>notifications <span class=\"token operator\">??</span> <span class=\"token boolean\">true</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed to fetch user profile:'</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'User profile fetch failed'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">cause</span><span class=\"token operator\">:</span> error <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"6-2-모던-클래스-설계\" style=\"position:relative;\"><a href=\"#6-2-%EB%AA%A8%EB%8D%98-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%A4%EA%B3%84\" aria-label=\"6 2 모던 클래스 설계 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. 모던 클래스 설계</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ApiClient</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> #defaultConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">timeout</span><span class=\"token operator\">:</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">retries</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  \n  #baseUrl<span class=\"token punctuation\">;</span>\n  #config<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">baseUrl<span class=\"token punctuation\">,</span> config <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#baseUrl <span class=\"token operator\">=</span> baseUrl<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#config <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>ApiClient<span class=\"token punctuation\">.</span>#defaultConfig<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>config <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  async <span class=\"token function\">#request</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">endpoint<span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> url <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#baseUrl<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>endpoint<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> config <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token operator\">...</span>options<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">signal</span><span class=\"token operator\">:</span> AbortSignal<span class=\"token punctuation\">.</span><span class=\"token function\">timeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#config<span class=\"token punctuation\">.</span>timeout<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#config<span class=\"token punctuation\">.</span>retries<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>response<span class=\"token punctuation\">.</span>ok<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">HTTP </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>response<span class=\"token punctuation\">.</span>status<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">cause</span><span class=\"token operator\">:</span> response <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">===</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>#config<span class=\"token punctuation\">.</span>retries <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> error<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">await</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span> <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">async</span> <span class=\"token function\">get</span><span class=\"token punctuation\">(</span>endpoint<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">#request</span><span class=\"token punctuation\">(</span>endpoint<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">'GET'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">async</span> <span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">endpoint<span class=\"token punctuation\">,</span> data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">#request</span><span class=\"token punctuation\">(</span>endpoint<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">'POST'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">'Content-Type'</span><span class=\"token operator\">:</span> <span class=\"token string\">'application/json'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">body</span><span class=\"token operator\">:</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"6-3-함수형-프로그래밍-패턴\" style=\"position:relative;\"><a href=\"#6-3-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%ED%84%B4\" aria-label=\"6 3 함수형 프로그래밍 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-3. 함수형 프로그래밍 패턴</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 불변 데이터 처리</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">processUsers</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">users</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> users\n    <span class=\"token punctuation\">.</span><span class=\"token function\">toSorted</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> a<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">localeCompare</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> user<span class=\"token punctuation\">.</span>active<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token operator\">...</span>user<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">displayName</span><span class=\"token operator\">:</span> user<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">initials</span><span class=\"token operator\">:</span> user<span class=\"token punctuation\">.</span>name\n        <span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">' '</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n<span class=\"token punctuation\">.</span><span class=\"token function\">at</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">groupBy</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> user<span class=\"token punctuation\">.</span>role<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 에러 처리 체이닝</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">processData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> validated <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">validateData</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> processed <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">processValidated</span><span class=\"token punctuation\">(</span>validated<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">saveProcessed</span><span class=\"token punctuation\">(</span>processed<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Data processing failed'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">cause</span><span class=\"token operator\">:</span> error <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"7-브라우저-호환성-및-폴리필\" style=\"position:relative;\"><a href=\"#7-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%ED%98%B8%ED%99%98%EC%84%B1-%EB%B0%8F-%ED%8F%B4%EB%A6%AC%ED%95%84\" aria-label=\"7 브라우저 호환성 및 폴리필 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. 브라우저 호환성 및 폴리필</h2>\n<h3 id=\"7-1-주요-기능-호환성\" style=\"position:relative;\"><a href=\"#7-1-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-%ED%98%B8%ED%99%98%EC%84%B1\" aria-label=\"7 1 주요 기능 호환성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. 주요 기능 호환성</h3>\n<ul>\n<li><strong>ES2020</strong>: 대부분의 모던 브라우저 지원</li>\n<li><strong>ES2021</strong>: 대부분의 모던 브라우저 지원</li>\n<li><strong>ES2022</strong>: 최신 브라우저 지원 (Chrome 94+, Firefox 93+, Safari 15.4+)</li>\n<li><strong>ES2023</strong>: 최신 브라우저 지원</li>\n<li><strong>ES2024</strong>: 일부 기능은 아직 실험적</li>\n</ul>\n<h3 id=\"7-2-폴리필-사용\" style=\"position:relative;\"><a href=\"#7-2-%ED%8F%B4%EB%A6%AC%ED%95%84-%EC%82%AC%EC%9A%A9\" aria-label=\"7 2 폴리필 사용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-2. 폴리필 사용</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// core-js 사용 예시</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'core-js/stable'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'regenerator-runtime/runtime'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 또는 특정 기능만</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'core-js/features/promise/all-settled'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">'core-js/features/array/at'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"7-3-babel-설정\" style=\"position:relative;\"><a href=\"#7-3-babel-%EC%84%A4%EC%A0%95\" aria-label=\"7 3 babel 설정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-3. Babel 설정</h3>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"presets\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">\"@babel/preset-env\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"targets\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"browsers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"> 1%\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"last 2 versions\"</span><span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"8-결론\" style=\"position:relative;\"><a href=\"#8-%EA%B2%B0%EB%A1%A0\" aria-label=\"8 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 결론</h2>\n<p>ES2020부터 ES2024까지 추가된 기능들은 JavaScript 개발을 더 안전하고 표현력 있게 만들어주었다. Optional Chaining과 Nullish Coalescing은 null/undefined 처리를 간소화했고, Top-level await는 모듈 시스템을 강화했으며, Private fields는 진정한 캡슐화를 가능하게 했다.</p>\n<p>이러한 기능들을 적절히 활용하면:</p>\n<ul>\n<li><strong>더 안전한 코드</strong>: Optional Chaining, Nullish Coalescing</li>\n<li><strong>더 명확한 코드</strong>: Private fields, Class fields</li>\n<li><strong>더 효율적인 코드</strong>: Array.at(), findLast()</li>\n<li><strong>더 모던한 코드</strong>: Top-level await, Promise.withResolvers()</li>\n</ul>\n<p>모던 JavaScript 개발자라면 이러한 기능들을 숙지하고 적절히 활용하여 더 나은 코드를 작성해야 한다. 하지만 브라우저 호환성을 고려하여 필요한 경우 폴리필이나 트랜스파일러를 사용하는 것도 잊지 말자.</p>\n<p>JavaScript는 계속 발전하고 있다. 최신 기능을 따라가며 더 나은 개발 경험을 만들어가자.</p>\n<hr>\n<h2 id=\"참고-자료-및-면책-조항\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C-%EB%B0%8F-%EB%A9%B4%EC%B1%85-%EC%A1%B0%ED%95%AD\" aria-label=\"참고 자료 및 면책 조항 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료 및 면책 조항</h2>\n<p>이 글은 공개된 ECMAScript 표준 사양, 공식 문서, 그리고 공개된 기술 자료를 바탕으로 작성되었습니다.</p>\n<p><strong>면책 조항</strong>: 이 글에 포함된 내용은 교육 및 정보 제공 목적으로 작성되었습니다. 코드 예제는 표준적인 패턴과 공개된 문서를 기반으로 작성되었으며, 교육 목적으로 제공됩니다. 실제 프로덕션 환경에서 사용 시에는 적절한 테스트와 검증이 필요합니다.</p>\n<p><strong>참고 자료</strong>:</p>\n<ul>\n<li>ECMAScript 표준 사양: ECMA International 공식 문서 (<a href=\"https://tc39.es/ecma262/\">https://tc39.es/ecma262/</a>)</li>\n<li>MDN Web Docs: JavaScript 기능 문서 (<a href=\"https://developer.mozilla.org/\">https://developer.mozilla.org/</a>)</li>\n<li>TC39 프로세스: JavaScript 기능 제안 및 표준화 과정</li>\n<li>브라우저 호환성: Can I Use (<a href=\"https://caniuse.com/\">https://caniuse.com/</a>)</li>\n<li>예제 코드: 표준 사양 및 공개된 문서를 기반으로 작성</li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#%EC%B5%9C%EC%8B%A0-javascript---es2020%EB%B6%80%ED%84%B0-es2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C\">최신 JavaScript - ES2020부터 ES2024까지, 모던 개발자를 위한 완벽 가이드</a></p>\n<ul>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-es2020-es11---%EB%B9%84%EB%8F%99%EA%B8%B0%EC%99%80-%EC%98%B5%EC%85%94%EB%84%90%EC%9D%98-%EC%8B%9C%EB%8C%80\">1. ES2020 (ES11) - 비동기와 옵셔널의 시대</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-1-optional-chaining-\">1-1. Optional Chaining (?.)</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-2-nullish-coalescing-\">1-2. Nullish Coalescing (??)</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-3-bigint\">1-3. BigInt</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-4-dynamic-import\">1-4. Dynamic Import</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-5-promiseallsettled\">1-5. Promise.allSettled()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#1-6-globalthis\">1-6. globalThis</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-es2021-es12---%ED%8E%B8%EC%9D%98%EC%84%B1-%ED%96%A5%EC%83%81\">2. ES2021 (ES12) - 편의성 향상</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-1-stringprototypereplaceall\">2-1. String.prototype.replaceAll()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-2-promiseany\">2-2. Promise.any()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-3-%EB%85%BC%EB%A6%AC-%ED%95%A0%EB%8B%B9-%EC%97%B0%EC%82%B0%EC%9E%90-logical-assignment-operators\">2-3. 논리 할당 연산자 (Logical Assignment Operators)</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-4-%EC%88%AB%EC%9E%90-%EA%B5%AC%EB%B6%84%EC%9E%90-numeric-separators\">2-4. 숫자 구분자 (Numeric Separators)</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-5-weakref\">2-5. WeakRef</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#2-6-finalizationregistry\">2-6. FinalizationRegistry</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-es2022-es13---%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EB%AA%A8%EB%93%88-%EA%B0%95%ED%99%94\">3. ES2022 (ES13) - 클래스와 모듈 강화</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-1-top-level-await\">3-1. Top-level await</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-2-private-fields-\">3-2. Private Fields (#)</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-3-static-fields-and-methods\">3-3. Static Fields and Methods</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-4-class-fields\">3-4. Class Fields</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-5-errorcause\">3-5. Error.cause</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-6-arrayat\">3-6. Array.at()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#3-7-objecthasown\">3-7. Object.hasOwn()</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-es2023-es14---%EB%B0%B0%EC%97%B4%EA%B3%BC-%EC%A0%95%EB%A0%AC-%EA%B0%9C%EC%84%A0\">4. ES2023 (ES14) - 배열과 정렬 개선</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-1-arrayfindlast--arrayfindlastindex\">4-1. Array.findLast() / Array.findLastIndex()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-2-arraytosorted--arraytoreversed--arraytospliced\">4-2. Array.toSorted() / Array.toReversed() / Array.toSpliced()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#4-3-arraywith\">4-3. Array.with()</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-es2024-es15---%EC%B5%9C%EC%8B%A0-%EA%B8%B0%EB%8A%A5\">5. ES2024 (ES15) - 최신 기능</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-1-promisewithresolvers\">5-1. Promise.withResolvers()</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#5-2-arraygroupby--arraygroupbytomap\">5-2. Array.groupBy() / Array.groupByToMap()</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-%EC%8B%A4%EC%A0%84-%ED%99%9C%EC%9A%A9-%ED%8C%A8%ED%84%B4\">6. 실전 활용 패턴</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-1-%EC%95%88%EC%A0%84%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%91%EA%B7%BC-%ED%8C%A8%ED%84%B4\">6-1. 안전한 데이터 접근 패턴</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-2-%EB%AA%A8%EB%8D%98-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%A4%EA%B3%84\">6-2. 모던 클래스 설계</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#6-3-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%ED%84%B4\">6-3. 함수형 프로그래밍 패턴</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%ED%98%B8%ED%99%98%EC%84%B1-%EB%B0%8F-%ED%8F%B4%EB%A6%AC%ED%95%84\">7. 브라우저 호환성 및 폴리필</a></p>\n<ul>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-1-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-%ED%98%B8%ED%99%98%EC%84%B1\">7-1. 주요 기능 호환성</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-2-%ED%8F%B4%EB%A6%AC%ED%95%84-%EC%82%AC%EC%9A%A9\">7-2. 폴리필 사용</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#7-3-babel-%EC%84%A4%EC%A0%95\">7-3. Babel 설정</a></li>\n</ul>\n</li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#8-%EA%B2%B0%EB%A1%A0\">8. 결론</a></li>\n<li><a href=\"/javascript/%EC%B5%9C%EC%8B%A0-JavaScript-ES2020%EB%B6%80%ED%84%B0-ES2024%EA%B9%8C%EC%A7%80-%EB%AA%A8%EB%8D%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C-%EB%B0%8F-%EB%A9%B4%EC%B1%85-%EC%A1%B0%ED%95%AD\">참고 자료 및 면책 조항</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":619},"fields":{"slug":"/javascript/최신-JavaScript-ES2020부터-ES2024까지-모던-개발자를-위한-완벽-가이드/","image":null,"faq":[]},"frontmatter":{"title":"최신 JavaScript - ES2020부터 ES2024까지, 모던 개발자를 위한 완벽 가이드","date":"2025년 11월 24일","dateISO":"2025-11-24T00:00:00.000Z","updatedISO":null,"category":"javascript","description":"ES2020부터 ES2024까지 추가된 최신 JavaScript 기능을 실전 예제와 함께 설명합니다. Optional Chaining, Nullish Coalescing, Top-level await, Private fields, Pattern Matching, Records & Tuples 등 모던 JavaScript의 모든 것을 다룹니다.","tags":["JavaScript","ES2020","ES2021","ES2022","ES2023","ES2024","ECMAScript","모던 JavaScript","Optional Chaining","Nullish Coalescing","Top-level await","Private Fields"]}}},"pageContext":{"slug":"/javascript/최신-JavaScript-ES2020부터-ES2024까지-모던-개발자를-위한-완벽-가이드/","previous":{"fields":{"slug":"/ai/혼합현실-Mixed-Reality-현실과-가상의-완벽한-융합/"},"frontmatter":{"title":"혼합현실 (Mixed Reality) - 현실과 가상의 완벽한 융합, 차세대 컴퓨팅 플랫폼","tags":["혼합현실","Mixed Reality","MR","공간 컴퓨팅","홀로그램","HoloLens","Magic Leap","현실-가상 융합","Spatial Computing","증강현실","가상현실"]}},"next":{"fields":{"slug":"/ai/마인드업로드-시리즈-Part-2-뇌-구조-매핑-기술/"},"frontmatter":{"title":"마인드업로드 시리즈 Part 2 - 뇌 구조 매핑 기술, Connectome을 향한 여정","tags":["마인드업로드","Mind Upload","Connectome","뇌 매핑","전자 현미경","신경 이미징","뉴런 추적","Brain Mapping","신경 연결체","EM 이미징","초고해상도 현미경"]}}}},"staticQueryHashes":["213619243","3262363727"]}