<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://nj0428.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nj0428.github.io/" rel="alternate" type="text/html" /><updated>2025-06-16T23:59:40+09:00</updated><id>https://nj0428.github.io/feed.xml</id><title type="html">NAK 노트</title><subtitle>NAK 노트 입니다.</subtitle><author><name>NAK</name></author><entry><title type="html">정규 표현식(Regex) – 자바스크립트 RegExp 객체 활용법</title><link href="https://nj0428.github.io/javascript/javaScript26/" rel="alternate" type="text/html" title="정규 표현식(Regex) – 자바스크립트 RegExp 객체 활용법" /><published>2025-06-15T00:00:00+09:00</published><updated>2025-06-15T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript26</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript26/"><![CDATA[<h2 id="regexp-기본-개념">RegExp 기본 개념</h2>

<ul>
  <li><strong>정규 표현식(Regular Expression)</strong> : 문자열에서 <strong>검색·일치·추출·치환</strong> 패턴을 정의</li>
  <li>JavaScript에 내장된 <strong><code class="language-plaintext highlighter-rouge">RegExp</code> 객체</strong>로 작성·조작 가능</li>
</ul>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">pattern</span> <span class="o">=</span> <span class="sr">/abc/i</span><span class="p">;</span> <span class="c1">// 리터럴 방식 (대소문자 무시)</span>
<span class="kd">const</span> <span class="nx">pattern2</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="dl">"</span><span class="s2">abc</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">i</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// 생성자 방식</span>
</code></pre></div></div>

<hr />

<h2 id="regexp-객체-생성-방법">RegExp 객체 생성 방법</h2>

<h3 id="리터럴-방식-">리터럴 방식 🔸</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello</span><span class="se">\d</span><span class="sr">+/gi</span><span class="p">;</span> <span class="c1">// 숫자 포함 hello 전역·대소문자 무시</span>
</code></pre></div></div>

<h3 id="생성자-방식-">생성자 방식 🔸</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">regex</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="dl">"</span><span class="s2">hello</span><span class="se">\\</span><span class="s2">d+</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">gi</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<blockquote>
  <p>플래그 g(global), i(ignore case), m(multiline) 등 조합 가능</p>
</blockquote>

<hr />

<h2 id="핵심-메서드-exec-vs-test">핵심 메서드: <code class="language-plaintext highlighter-rouge">exec()</code> vs <code class="language-plaintext highlighter-rouge">test()</code></h2>

<table>
  <thead>
    <tr>
      <th>메서드</th>
      <th>반환</th>
      <th>용도</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">exec(str)</code></td>
      <td><strong>일치 배열</strong> 또는 <code class="language-plaintext highlighter-rouge">null</code></td>
      <td>캡처 결과 필요할 때</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">test(str)</code></td>
      <td><code class="language-plaintext highlighter-rouge">true</code> / <code class="language-plaintext highlighter-rouge">false</code></td>
      <td>일치 여부만 필요할 때</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">str</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">abbcdefabgh</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">hit</span> <span class="o">=</span> <span class="sr">/ab+/</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span> <span class="c1">// ["abb"]</span>
<span class="kd">const</span> <span class="nx">exist</span> <span class="o">=</span> <span class="sr">/ab+/</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span> <span class="c1">// true</span>
</code></pre></div></div>

<hr />

<h2 id="자주-쓰는-정규식-플래그">자주 쓰는 정규식 플래그</h2>

<table>
  <thead>
    <tr>
      <th>플래그</th>
      <th>설명</th>
      <th>프로퍼티</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">g</code></td>
      <td>전역 검색</td>
      <td><code class="language-plaintext highlighter-rouge">regex.global</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">i</code></td>
      <td>대·소문자 무시</td>
      <td><code class="language-plaintext highlighter-rouge">regex.ignoreCase</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">m</code></td>
      <td>여러 줄 검색</td>
      <td><code class="language-plaintext highlighter-rouge">regex.multiline</code></td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">r</span> <span class="o">=</span> <span class="sr">/abc/gi</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">r</span><span class="p">.</span><span class="nx">source</span><span class="p">);</span> <span class="c1">// "abc"</span>
</code></pre></div></div>

<hr />

<h2 id="패턴-구성-요소-">패턴 구성 요소 🌐</h2>

<table>
  <thead>
    <tr>
      <th>패턴</th>
      <th>의미</th>
      <th>예시</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">.</code></td>
      <td>임의의 한 글자</td>
      <td><code class="language-plaintext highlighter-rouge">/h.t/</code> → hat, h5t</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">*</code></td>
      <td>앞 문자가 0회 이상</td>
      <td><code class="language-plaintext highlighter-rouge">/go*gle/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">+</code></td>
      <td>앞 문자가 1회 이상</td>
      <td><code class="language-plaintext highlighter-rouge">/lo+l/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">?</code></td>
      <td>앞 문자가 0 또는 1회</td>
      <td><code class="language-plaintext highlighter-rouge">/colou?r/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">^</code> <code class="language-plaintext highlighter-rouge">$</code></td>
      <td>문자열 시작·끝</td>
      <td><code class="language-plaintext highlighter-rouge">/^Hi$/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">[abc]</code></td>
      <td>a 또는 b 또는 c</td>
      <td><code class="language-plaintext highlighter-rouge">/[aeiou]/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">\d</code></td>
      <td>숫자(0-9)</td>
      <td><code class="language-plaintext highlighter-rouge">/\d{4}/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">\w</code></td>
      <td>단어 문자</td>
      <td><code class="language-plaintext highlighter-rouge">/\w+/</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">\s</code></td>
      <td>공백 문자</td>
      <td><code class="language-plaintext highlighter-rouge">/\s+/</code></td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="기타-유용-메서드">기타 유용 메서드</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/abc/i</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">regex</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span> <span class="c1">// "/abc/i"</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">flags</code>·<code class="language-plaintext highlighter-rouge">source</code> 프로퍼티로 플래그·패턴 확인</li>
</ul>

<hr />

<h2 id="실전-예시-">실전 예시 🔧</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 1) 이메일 검증</span>
<span class="kd">const</span> <span class="nx">email</span> <span class="o">=</span> <span class="sr">/^</span><span class="se">[\w</span><span class="sr">.-</span><span class="se">]</span><span class="sr">+@</span><span class="se">[\w</span><span class="sr">.-</span><span class="se">]</span><span class="sr">+</span><span class="se">\.\w</span><span class="sr">+$/</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">email</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="dl">"</span><span class="s2">user@test.com</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// true</span>

<span class="c1">// 2) 하이라이트 치환</span>
<span class="kd">const</span> <span class="nx">txt</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">The rain in Spain</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">txt</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/ain/g</span><span class="p">,</span> <span class="dl">"</span><span class="s2">&lt;b&gt;$&amp;&lt;/b&gt;</span><span class="dl">"</span><span class="p">));</span>
<span class="c1">// The r&lt;b&gt;ain&lt;/b&gt; in Sp&lt;b&gt;ain&lt;/b&gt;</span>
</code></pre></div></div>

<hr />

<h2 id="질문-정리">질문 정리</h2>

<h3 id="q1-왜-new-regexp-보다-리터럴-방식을-많이-쓰나요">Q1. 왜 <code class="language-plaintext highlighter-rouge">new RegExp()</code> 보다 리터럴 방식을 많이 쓰나요?</h3>

<p>리터럴은 <strong>가독성</strong>이 높고, 스크립트 로드 시 정규식이 바로 컴파일됩니다.</p>

<h3 id="q2-플래그를-동적으로-변경하려면">Q2. 플래그를 동적으로 변경하려면?</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">src</span> <span class="o">=</span> <span class="sr">/abc/i</span><span class="p">.</span><span class="nx">source</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">dynamic</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="nx">src</span><span class="p">,</span> <span class="dl">"</span><span class="s2">gi</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// 기존 패턴 재사용</span>
</code></pre></div></div>

<h3 id="q3-exec-반환-배열에서-인덱스원본문자열을-알고-싶어요">Q3. <code class="language-plaintext highlighter-rouge">exec</code> 반환 배열에서 인덱스·원본문자열을 알고 싶어요!</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="sr">/ab+/</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="dl">"</span><span class="s2">xxabbbxx</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">index</span><span class="p">);</span> <span class="c1">// 2 (매치 시작 위치)</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">input</span><span class="p">);</span> <span class="c1">// "xxabbbxx"</span>
</code></pre></div></div>

<hr />

<p><strong>정리</strong></p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">exec()</code></strong> → 일치 <strong>값</strong> 반환, <strong><code class="language-plaintext highlighter-rouge">test()</code></strong> → 일치 <strong>여부</strong> 반환</li>
  <li>플래그로 전역·대소문자·멀티라인 검색을 제어</li>
  <li>정규식은 <strong>검증·파싱·치환</strong> 등 문자열 처리에 필수!</li>
</ul>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[RegExp 기본 개념]]></summary></entry><entry><title type="html">자바스크립트 예외 처리 &amp;amp; Strict 모드 정리</title><link href="https://nj0428.github.io/javascript/javaScript25/" rel="alternate" type="text/html" title="자바스크립트 예외 처리 &amp;amp; Strict 모드 정리" /><published>2025-06-14T00:00:00+09:00</published><updated>2025-06-14T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript25</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript25/"><![CDATA[<h2 id="-예외란">✅ 예외란?</h2>

<ul>
  <li><strong>예외(Exception)</strong>: 코드 실행 중 발생하는 <strong>런타임 오류</strong></li>
  <li><strong>오류(Error)</strong>: 문법적인 잘못으로 발생하는 <strong>컴파일 단계 오류</strong> (try/catch로 잡히지 않음)</li>
</ul>

<hr />

<h2 id="-예외-발생시키기-throw">📌 예외 발생시키기: <code class="language-plaintext highlighter-rouge">throw</code></h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">throw</span> <span class="dl">"</span><span class="s2">예외 메시지</span><span class="dl">"</span><span class="p">;</span>
<span class="k">throw</span> <span class="mi">404</span><span class="p">;</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">에러 객체 예외 발생!</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<blockquote>
  <p>문자열, 숫자, Error 객체 모두 예외로 던질 수 있습니다.</p>
</blockquote>

<hr />

<h2 id="-예외-처리-구문-try--catch--finally">📌 예외 처리 구문: <code class="language-plaintext highlighter-rouge">try / catch / finally</code></h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span> <span class="p">{</span>
  <span class="c1">// 예외 발생 가능 코드</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">error</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span> <span class="c1">// 예: "Error"</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span> <span class="c1">// 상세 메시지</span>
<span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">항상 실행됩니다.</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>구성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">try</code></td>
      <td>예외 발생 가능 코드 블록</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">catch</code></td>
      <td>예외 발생 시 실행</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">finally</code></td>
      <td>예외 여부와 관계없이 항상 실행 (선택적)</td>
    </tr>
  </tbody>
</table>

<p>✅ 조합 가능: <code class="language-plaintext highlighter-rouge">try/catch</code>, <code class="language-plaintext highlighter-rouge">try/finally</code>, <code class="language-plaintext highlighter-rouge">try/catch/finally</code></p>

<hr />

<h2 id="-error-객체">📌 Error 객체</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span> <span class="p">{</span>
  <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">사용자 정의 예외!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span> <span class="c1">// Error</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span> <span class="c1">// 사용자 정의 예외!</span>
<span class="p">}</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>프로퍼티</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">name</code></td>
      <td>예외의 이름 (기본값: <code class="language-plaintext highlighter-rouge">"Error"</code>)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">message</code></td>
      <td>예외 메시지 내용</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-strict-모드">🚫 Strict 모드</h2>

<h3 id="-정의">✅ 정의</h3>

<p><code class="language-plaintext highlighter-rouge">"use strict"</code> 선언을 통해 자바스크립트 실행을 더 <strong>엄격한 모드(strict mode)</strong>로 전환</p>

<p>→ <strong>버그를 조기에 잡고</strong>, 암시적인 동작을 금지합니다.</p>

<h3 id="-선언-위치">📌 선언 위치</h3>

<ul>
  <li><strong>전체 스크립트 상단</strong></li>
</ul>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="dl">"</span><span class="s2">use strict</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<ul>
  <li><strong>함수 내에서만 적용</strong></li>
</ul>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">doStrict</span><span class="p">()</span> <span class="p">{</span>
  <span class="dl">"</span><span class="s2">use strict</span><span class="dl">"</span><span class="p">;</span>
  <span class="c1">// 엄격 모드로 동작</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="-strict-모드의-주요-제약">🚨 Strict 모드의 주요 제약</h2>

<table>
  <thead>
    <tr>
      <th>대상</th>
      <th>제한 내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>변수</td>
      <td>선언 없이 사용 ❌ (<code class="language-plaintext highlighter-rouge">x = 10</code> → 오류)</td>
    </tr>
    <tr>
      <td>함수</td>
      <td>중복 매개변수 ❌, 블록 내 선언 제한</td>
    </tr>
    <tr>
      <td>객체</td>
      <td>읽기 전용 프로퍼티 수정 ❌</td>
    </tr>
    <tr>
      <td>예약어</td>
      <td><code class="language-plaintext highlighter-rouge">eval</code>, <code class="language-plaintext highlighter-rouge">with</code> 등 사용 ❌</td>
    </tr>
    <tr>
      <td>this</td>
      <td>전역에서 <code class="language-plaintext highlighter-rouge">this</code>는 <code class="language-plaintext highlighter-rouge">undefined</code></td>
    </tr>
    <tr>
      <td>delete</td>
      <td>변수, 함수 삭제 불가</td>
    </tr>
  </tbody>
</table>

<h3 id="-예시">📌 예시</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="dl">"</span><span class="s2">use strict</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// ReferenceError: x is not defined</span>
</code></pre></div></div>

<hr />

<h2 id="-브라우저-지원">🧪 브라우저 지원</h2>

<table>
  <thead>
    <tr>
      <th>브라우저</th>
      <th>지원 버전</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>IE</td>
      <td>10 이상</td>
    </tr>
    <tr>
      <td>Chrome</td>
      <td>13 이상</td>
    </tr>
    <tr>
      <td>Firefox</td>
      <td>4 이상</td>
    </tr>
    <tr>
      <td>Safari</td>
      <td>5.1 이상</td>
    </tr>
    <tr>
      <td>Opera</td>
      <td>12 이상</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-실전-팁-요약">✅ 실전 팁 요약</h2>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>권장 방식</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>예외 발생 예상</td>
      <td><code class="language-plaintext highlighter-rouge">try / catch</code>로 안전 처리</td>
    </tr>
    <tr>
      <td>사용자 예외 발생</td>
      <td><code class="language-plaintext highlighter-rouge">throw new Error("...")</code> 사용</td>
    </tr>
    <tr>
      <td>예외 디버깅</td>
      <td><code class="language-plaintext highlighter-rouge">error.name</code>, <code class="language-plaintext highlighter-rouge">error.message</code> 활용</td>
    </tr>
    <tr>
      <td>코드 안정성 확보</td>
      <td><code class="language-plaintext highlighter-rouge">"use strict"</code> 도입 (최상단 선언 권장)</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="질문-정리">질문 정리</h2>

<p><strong>Q1. try 없이 throw만 쓰면 어떻게 되나요?</strong></p>

<p>A: 프로그램이 즉시 중단되고 콘솔에 오류 메시지가 출력됩니다.</p>

<p><strong>Q2. catch 블록의 에러 객체 이름은 반드시 <code class="language-plaintext highlighter-rouge">error</code>여야 하나요?</strong></p>

<p>A: 아니요. <code class="language-plaintext highlighter-rouge">catch (e)</code>처럼 어떤 이름도 사용 가능하지만 <code class="language-plaintext highlighter-rouge">error</code>, <code class="language-plaintext highlighter-rouge">err</code>, <code class="language-plaintext highlighter-rouge">e</code>가 관례입니다.</p>

<p><strong>Q3. finally는 꼭 써야 하나요?</strong></p>

<p>A: 선택 사항이지만, 리소스 정리 작업에는 매우 유용합니다 (예: 파일 닫기, 로딩 제거 등).</p>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[✅ 예외란?]]></summary></entry><entry><title type="html">자바스크립트 location, history, screen, navigator 객체 정리</title><link href="https://nj0428.github.io/javascript/javaScript24/" rel="alternate" type="text/html" title="자바스크립트 location, history, screen, navigator 객체 정리" /><published>2025-06-13T00:00:00+09:00</published><updated>2025-06-13T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript24</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript24/"><![CDATA[<h2 id="-1-location-객체--현재-url-정보--페이지-이동">📌 1. location 객체 – <strong>현재 URL 정보 &amp; 페이지 이동</strong></h2>

<h3 id="-주요-프로퍼티">✅ 주요 프로퍼티</h3>

<table>
  <thead>
    <tr>
      <th>속성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">href</code></td>
      <td>전체 URL 주소</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">hostname</code></td>
      <td>도메인 이름 (예: <code class="language-plaintext highlighter-rouge">www.example.com</code>)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">pathname</code></td>
      <td>파일 경로 (<code class="language-plaintext highlighter-rouge">/about/index.html</code>)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">hash</code></td>
      <td><code class="language-plaintext highlighter-rouge">#</code> 이후 문자열</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">search</code></td>
      <td>쿼리 문자열 (<code class="language-plaintext highlighter-rouge">?key=value</code>)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">port</code></td>
      <td>포트 번호 (예: 443, 8080)</td>
    </tr>
  </tbody>
</table>

<h3 id="-주요-메소드">✅ 주요 메소드</h3>

<table>
  <thead>
    <tr>
      <th>메소드</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">assign(url)</code></td>
      <td>새 페이지로 이동 (뒤로 가기 가능)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">replace(url)</code></td>
      <td>새 페이지로 이동 (기록 덮어쓰기)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">reload()</code></td>
      <td>페이지 새로 고침 (F5 효과)</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">location</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">https://example.com</span><span class="dl">"</span><span class="p">;</span> <span class="c1">// 이동</span>
<span class="nx">location</span><span class="p">.</span><span class="nx">reload</span><span class="p">();</span> <span class="c1">// 새로고침</span>
</code></pre></div></div>

<hr />

<h2 id="-2-history-객체--브라우저-방문-기록-제어">🔙 2. history 객체 – <strong>브라우저 방문 기록 제어</strong></h2>

<h3 id="-주요-메소드-및-프로퍼티">✅ 주요 메소드 및 프로퍼티</h3>

<table>
  <thead>
    <tr>
      <th>메소드/속성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">length</code></td>
      <td>방문한 페이지 수</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">back()</code></td>
      <td>이전 페이지로 이동</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">forward()</code></td>
      <td>다음 페이지로 이동</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">go(n)</code></td>
      <td>n만큼 앞(+) 또는 뒤(-)로 이동</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">history</span><span class="p">.</span><span class="nx">go</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="c1">// 이전 페이지</span>
<span class="nx">history</span><span class="p">.</span><span class="nx">forward</span><span class="p">();</span> <span class="c1">// 다음 페이지</span>
</code></pre></div></div>

<hr />

<h2 id="️-3-screen-객체--모니터-정보">🖥️ 3. screen 객체 – <strong>모니터 정보</strong></h2>

<table>
  <thead>
    <tr>
      <th>속성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">width</code> / <code class="language-plaintext highlighter-rouge">height</code></td>
      <td>전체 해상도 (픽셀 단위)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">availWidth</code> / <code class="language-plaintext highlighter-rouge">availHeight</code></td>
      <td>실제 사용 가능한 영역 (작업표시줄 제외)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">colorDepth</code></td>
      <td>색상당 비트 수 (보통 24)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">pixelDepth</code></td>
      <td>픽셀당 비트 수 (보통 colorDepth와 동일)</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">height</span><span class="p">);</span> <span class="c1">// 1920 x 1080</span>
</code></pre></div></div>

<hr />

<h2 id="-4-navigator-객체--브라우저os-정보">🌐 4. navigator 객체 – <strong>브라우저/OS 정보</strong></h2>

<table>
  <thead>
    <tr>
      <th>속성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">appName</code></td>
      <td>브라우저 이름 (대부분 “Netscape”)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">appVersion</code></td>
      <td>브라우저 버전</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">userAgent</code></td>
      <td>상세 브라우저 정보 문자열</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">platform</code></td>
      <td>운영체제 정보 (Windows, Mac 등)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">language</code></td>
      <td>기본 언어 코드 (예: “ko”, “en-US”)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cookieEnabled</code></td>
      <td>쿠키 허용 여부 (true/false)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">javaEnabled()</code></td>
      <td>자바 애플릿 사용 가능 여부 (비표준)</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">navigator</span><span class="p">.</span><span class="nx">language</span><span class="p">);</span> <span class="c1">// "ko"</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">navigator</span><span class="p">.</span><span class="nx">cookieEnabled</span><span class="p">);</span> <span class="c1">// true or false</span>
</code></pre></div></div>

<hr />

<h2 id="-종합-예제-현재-상태-출력">✅ 종합 예제: 현재 상태 출력</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;script&gt;</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">▶ 현재 URL: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">location</span><span class="p">.</span><span class="nx">href</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">▶ 호스트: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">location</span><span class="p">.</span><span class="nx">hostname</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">▶ 경로: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">location</span><span class="p">.</span><span class="nx">pathname</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span>
    <span class="dl">"</span><span class="s2">▶ 스크린 해상도: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">width</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">x</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">height</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span>
  <span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">▶ OS: </span><span class="dl">"</span> <span class="o">+</span> <span class="nb">navigator</span><span class="p">.</span><span class="nx">platform</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">▶ 언어: </span><span class="dl">"</span> <span class="o">+</span> <span class="nb">navigator</span><span class="p">.</span><span class="nx">language</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span>
    <span class="dl">"</span><span class="s2">▶ 쿠키 가능: </span><span class="dl">"</span> <span class="o">+</span> <span class="p">(</span><span class="nb">navigator</span><span class="p">.</span><span class="nx">cookieEnabled</span> <span class="p">?</span> <span class="dl">"</span><span class="s2">Yes</span><span class="dl">"</span> <span class="p">:</span> <span class="dl">"</span><span class="s2">No</span><span class="dl">"</span><span class="p">)</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">&lt;br&gt;</span><span class="dl">"</span>
  <span class="p">);</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>

<hr />

<h2 id="️-주의-사항">⚠️ 주의 사항</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">navigator.appName</code>, <code class="language-plaintext highlighter-rouge">appVersion</code> 등은 <strong>구식/신뢰도 낮음</strong></li>
  <li>*기능 감지(feature detection)**가 더 안전한 접근 방식</li>
  <li>일부 브라우저는 속성 제한 또는 팝업 차단, 쿠키 차단 설정으로 정확한 정보 제공이 제한될 수 있음</li>
</ul>

<hr />

<h2 id="질문-정리">질문 정리</h2>

<p><strong>Q1. location.href와 assign()의 차이는?</strong></p>

<p>A: <code class="language-plaintext highlighter-rouge">href = "url"</code>은 즉시 이동하며 히스토리에 남습니다. <code class="language-plaintext highlighter-rouge">assign()</code>도 동일. 반면, <code class="language-plaintext highlighter-rouge">replace()</code>는 기록을 덮어씁니다.</p>

<p><strong>Q2. navigator.userAgent로 브라우저 구분해도 되나요?</strong></p>

<p>A: 기본적으로는 가능하지만, <strong>변조 가능성</strong>이 높아 권장하지 않습니다.</p>

<p><strong>Q3. 새 창 팝업이 안 열려요!</strong></p>

<p>A: <strong>팝업 차단기</strong>가 작동 중일 수 있습니다. 사용자의 명시적 이벤트(예: 클릭)로만 열리는 경우가 많습니다.</p>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[📌 1. location 객체 – 현재 URL 정보 &amp; 페이지 이동]]></summary></entry><entry><title type="html">자바스크립트 Window 객체 정리</title><link href="https://nj0428.github.io/javascript/javaScript23/" rel="alternate" type="text/html" title="자바스크립트 Window 객체 정리" /><published>2025-06-12T00:00:00+09:00</published><updated>2025-06-12T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript23</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript23/"><![CDATA[<h2 id="-1-window-객체란">✅ 1. Window 객체란?</h2>

<ul>
  <li><strong>브라우저 창 전체를 대표하는 자바스크립트 객체</strong></li>
  <li>window는 <strong>전역 객체</strong>이기 때문에 생략 가능</li>
  <li>모든 전역 함수, 변수는 window의 속성이 됨</li>
</ul>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">);</span> <span class="c1">// 창 너비 확인</span>
<span class="nx">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hello!</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// window.alert()와 동일</span>
</code></pre></div></div>

<hr />

<h2 id="-2-브라우저-창-크기-얻기">✅ 2. 브라우저 창 크기 얻기</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span>
  <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span> <span class="o">||</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">.</span><span class="nx">clientWidth</span> <span class="o">||</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">clientWidth</span><span class="p">;</span>

<span class="kd">var</span> <span class="nx">height</span> <span class="o">=</span>
  <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span> <span class="o">||</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">.</span><span class="nx">clientHeight</span> <span class="o">||</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">clientHeight</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">너비:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="dl">"</span><span class="s2">높이:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">height</span><span class="p">);</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">innerWidth</code>, <code class="language-plaintext highlighter-rouge">innerHeight</code>: 브라우저 뷰포트 크기</li>
  <li>구형 브라우저 대응을 위해 <code class="language-plaintext highlighter-rouge">clientWidth</code>도 함께 사용</li>
</ul>

<hr />

<h2 id="-3-새-창-열기--windowopen">✅ 3. 새 창 열기 – <code class="language-plaintext highlighter-rouge">window.open()</code></h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">newWindow</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span>
  <span class="dl">"</span><span class="s2">https://example.com</span><span class="dl">"</span><span class="p">,</span>
  <span class="dl">"</span><span class="s2">팝업창이름</span><span class="dl">"</span><span class="p">,</span>
  <span class="dl">"</span><span class="s2">width=400,height=300,scrollbars=yes,resizable=yes</span><span class="dl">"</span>
<span class="p">);</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>옵션 속성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>width, height</td>
      <td>창 너비와 높이</td>
    </tr>
    <tr>
      <td>left, top</td>
      <td>화면 위치 지정</td>
    </tr>
    <tr>
      <td>resizable</td>
      <td>창 크기 조절 허용 여부</td>
    </tr>
    <tr>
      <td>scrollbars</td>
      <td>스크롤 바 표시 여부</td>
    </tr>
    <tr>
      <td>menubar</td>
      <td>메뉴바 표시 여부</td>
    </tr>
    <tr>
      <td>location</td>
      <td>주소 표시줄 표시 여부</td>
    </tr>
    <tr>
      <td>status</td>
      <td>상태 표시줄 표시 여부</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-4-새-창-닫기--windowclose">✅ 4. 새 창 닫기 – <code class="language-plaintext highlighter-rouge">window.close()</code></h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">newWindow</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
</code></pre></div></div>

<ul>
  <li><strong>단, 스크립트로 연 창에만 닫기 가능</strong></li>
  <li>사용자가 직접 연 창은 닫을 수 없음</li>
</ul>

<hr />

<h2 id="-5-브라우저-위치-정보">✅ 5. 브라우저 위치 정보</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">screenX</span><span class="p">);</span> <span class="c1">// 창의 왼쪽 위치</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">screenY</span><span class="p">);</span> <span class="c1">// 창의 위쪽 위치</span>
</code></pre></div></div>

<hr />

<h2 id="-6-전역-함수--window-메서드">✅ 6. 전역 함수 = window 메서드</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">window</span><span class="p">.</span><span class="nx">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">안녕!</span><span class="dl">"</span><span class="p">);</span>      <span class="c1">// alert("안녕!")와 동일</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">setTimeout</span><span class="p">(...);</span>     <span class="c1">// setTimeout(...), 생략 가능</span>
</code></pre></div></div>

<hr />

<h2 id="-7-연결된-객체들">✅ 7. 연결된 객체들</h2>

<table>
  <thead>
    <tr>
      <th>객체명</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">window.document</code></td>
      <td>현재 문서(DOM 객체)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">window.location</code></td>
      <td>현재 URL, 페이지 이동 등</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">window.history</code></td>
      <td>브라우저 방문 기록 제어</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">window.navigator</code></td>
      <td>브라우저 정보 및 시스템 환경 정보</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">window.screen</code></td>
      <td>화면 해상도 정보 등</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-실습-예제-팝업-창-열고-닫기">✅ 실습 예제: 팝업 창 열고 닫기</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;button</span> <span class="na">onclick=</span><span class="s">"openPopup()"</span><span class="nt">&gt;</span>팝업 열기<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;button</span> <span class="na">onclick=</span><span class="s">"closePopup()"</span><span class="nt">&gt;</span>팝업 닫기<span class="nt">&lt;/button&gt;</span>

<span class="nt">&lt;script&gt;</span>
  <span class="kd">let</span> <span class="nx">popup</span><span class="p">;</span>

  <span class="kd">function</span> <span class="nx">openPopup</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">popup</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://example.com</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">팝업</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">width=500,height=400</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="kd">function</span> <span class="nx">closePopup</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nx">popup</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">popup</span><span class="p">.</span><span class="nx">closed</span><span class="p">)</span> <span class="nx">popup</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
  <span class="p">}</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[✅ 1. Window 객체란?]]></summary></entry><entry><title type="html">자바스크립트 이벤트 정리</title><link href="https://nj0428.github.io/javascript/javaScript22/" rel="alternate" type="text/html" title="자바스크립트 이벤트 정리" /><published>2025-06-11T00:00:00+09:00</published><updated>2025-06-11T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript22</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript22/"><![CDATA[<h2 id="1️⃣-이벤트란">1️⃣ 이벤트란?</h2>

<ul>
  <li><strong>이벤트(Event)</strong>: 사용자가 발생시키는 행동 (ex. 클릭, 키보드 입력, 마우스 이동 등)</li>
  <li><strong>이벤트 리스너(Event Listener)</strong>: 해당 이벤트에 반응해 실행되는 자바스크립트 코드</li>
</ul>

<hr />

<h2 id="2️⃣-이벤트-등록-방법">2️⃣ 이벤트 등록 방법</h2>

<h3 id="-a-인라인-방식-html-내부에-작성--비추천">✅ A. 인라인 방식 (HTML 내부에 작성 – ❌비추천)</h3>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;p</span> <span class="na">onclick=</span><span class="s">"alert('클릭됨')"</span><span class="nt">&gt;</span>클릭<span class="nt">&lt;/p&gt;</span>
</code></pre></div></div>

<h3 id="-b-속성-방식-js에서-onclick-사용">✅ B. 속성 방식 (JS에서 <code class="language-plaintext highlighter-rouge">.onclick</code> 사용)</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">element</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
  <span class="nx">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">클릭됨</span><span class="dl">"</span><span class="p">);</span>
<span class="p">};</span>
</code></pre></div></div>

<ul>
  <li>단점: <strong>이벤트 1개만 등록 가능</strong></li>
</ul>

<h3 id="-c-addeventlistener-방식--가장-추천">✅ C. <code class="language-plaintext highlighter-rouge">addEventListener()</code> 방식 ← <strong>가장 추천</strong></h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
  <span class="nx">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">클릭됨</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<ul>
  <li>장점:
    <ul>
      <li>여러 이벤트 리스너 등록 가능</li>
      <li>이벤트 전파 방식 설정 가능 (세 번째 인자)</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="3️⃣-이벤트-객체-event">3️⃣ 이벤트 객체 (event)</h2>

<p>이벤트 핸들러에 자동으로 전달되는 객체로, 다양한 정보를 포함합니다.</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span><span class="p">);</span> <span class="c1">// "click"</span>
  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">);</span> <span class="c1">// 클릭된 대상 요소</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="4️⃣-이벤트-전파-propagation">4️⃣ 이벤트 전파 (Propagation)</h2>

<p>이벤트는 두 단계로 전달됩니다:</p>

<table>
  <thead>
    <tr>
      <th>단계</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Capturing</td>
      <td>부모 → 자식 (true)</td>
    </tr>
    <tr>
      <td>Bubbling(기본)</td>
      <td>자식 → 부모 (false 또는 생략)</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handler</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// 캡처링</span>
<span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handler</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="c1">// 버블링</span>
</code></pre></div></div>

<hr />

<h2 id="5️⃣-기본-동작--전파-차단">5️⃣ 기본 동작 &amp; 전파 차단</h2>

<h3 id="-기본-동작-막기-form-전송-a-링크-이동-등-방지">✅ 기본 동작 막기 (form 전송, a 링크 이동 등 방지)</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</code></pre></div></div>

<h3 id="-이벤트-전파-중단-부모에게-전달-안-됨">✅ 이벤트 전파 중단 (부모에게 전달 안 됨)</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">event</span><span class="p">.</span><span class="nx">stopPropagation</span><span class="p">();</span>
</code></pre></div></div>

<hr />

<h2 id="6️⃣-이벤트-제거">6️⃣ 이벤트 제거</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">element</span><span class="p">.</span><span class="nx">removeEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handlerFunction</span><span class="p">);</span>
</code></pre></div></div>

<ul>
  <li><strong>주의</strong>: 익명 함수는 제거 불가
반드시 참조 가능한 함수여야 함</li>
</ul>

<hr />

<h2 id="-실전-예제">✅ 실전 예제</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">"btn"</span><span class="nt">&gt;</span>눌러보세요<span class="nt">&lt;/button&gt;</span>
<span class="nt">&lt;p</span> <span class="na">id=</span><span class="s">"text"</span><span class="nt">&gt;</span>여기에 출력됩니다.<span class="nt">&lt;/p&gt;</span>

<span class="nt">&lt;script&gt;</span>
  <span class="kd">const</span> <span class="nx">btn</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">btn</span><span class="dl">"</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">text</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">text</span><span class="dl">"</span><span class="p">);</span>

  <span class="kd">function</span> <span class="nx">handleClick</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">text</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`이벤트 타입: </span><span class="p">${</span><span class="nx">event</span><span class="p">.</span><span class="nx">type</span><span class="p">}</span><span class="s2">, 대상: </span><span class="p">${</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">tagName</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nx">btn</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handleClick</span><span class="p">);</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>

<hr />

<h2 id="-기억-포인트-요약">🧠 기억 포인트 요약</h2>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>이벤트</td>
      <td>사용자 상호작용 ex. 클릭, 입력 등</td>
    </tr>
    <tr>
      <td>리스너 등록</td>
      <td><code class="language-plaintext highlighter-rouge">addEventListener("click", fn)</code> 권장</td>
    </tr>
    <tr>
      <td>이벤트 객체</td>
      <td><code class="language-plaintext highlighter-rouge">event.type</code>, <code class="language-plaintext highlighter-rouge">event.target</code> 등</td>
    </tr>
    <tr>
      <td>전파 단계</td>
      <td><code class="language-plaintext highlighter-rouge">true</code> → Capturing, <code class="language-plaintext highlighter-rouge">false</code> → Bubbling</td>
    </tr>
    <tr>
      <td>동작 중단</td>
      <td><code class="language-plaintext highlighter-rouge">preventDefault()</code>, <code class="language-plaintext highlighter-rouge">stopPropagation()</code></td>
    </tr>
    <tr>
      <td>이벤트 해제</td>
      <td><code class="language-plaintext highlighter-rouge">removeEventListener()</code> ← 참조 함수 필수</td>
    </tr>
  </tbody>
</table>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[1️⃣ 이벤트란?]]></summary></entry><entry><title type="html">자바스크립트 노드 조작 정리</title><link href="https://nj0428.github.io/javascript/javaScript21/" rel="alternate" type="text/html" title="자바스크립트 노드 조작 정리" /><published>2025-06-10T00:00:00+09:00</published><updated>2025-06-10T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript21</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript21/"><![CDATA[<p>HTML 문서에서 자바스크립트를 통해 태그, 텍스트, 속성을 직접 <strong>추가/수정/삭제/교체</strong>할 수 있습니다. 이를 DOM 노드 조작이라 하며, 웹페이지를 동적으로 만들 때 핵심입니다.</p>

<hr />

<h2 id="️-1-텍스트-내용-바꾸기-텍스트-노드-직접-접근">✏️ 1. 텍스트 내용 바꾸기 (텍스트 노드 직접 접근)</h2>

<h3 id="-전체-텍스트-변경---nodevalue">✅ 전체 텍스트 변경 - <code class="language-plaintext highlighter-rouge">nodeValue</code></h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">p</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">text</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">p</span><span class="p">.</span><span class="nx">firstChild</span><span class="p">.</span><span class="nx">nodeValue</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">내용이 바뀌었어요!</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<p>📌 <code class="language-plaintext highlighter-rouge">innerHTML</code>이 아닌 <code class="language-plaintext highlighter-rouge">firstChild.nodeValue</code>를 통해 텍스트 노드에 직접 접근해야 함</p>

<hr />

<h2 id="️-2-속성값-변경--setattribute">⚙️ 2. 속성값 변경 – <code class="language-plaintext highlighter-rouge">setAttribute()</code></h2>

<h3 id="-속성-추가-또는-수정">✅ 속성 추가 또는 수정</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">p</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="dl">"</span><span class="s2">p</span><span class="dl">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span>
<span class="nx">p</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">class</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">highlight</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<p>📌 기존에 없으면 생성, 있으면 덮어씀</p>

<hr />

<h2 id="-3-요소-바꾸기--replacechild">🔁 3. 요소 바꾸기 – <code class="language-plaintext highlighter-rouge">replaceChild()</code></h2>

<h3 id="-기존-요소를-새-요소로-교체">✅ 기존 요소를 새 요소로 교체</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">parent</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">container</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">oldItem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">item1</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">newItem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">div</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">newItem</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">새로운 항목</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">parent</span><span class="p">.</span><span class="nx">replaceChild</span><span class="p">(</span><span class="nx">newItem</span><span class="p">,</span> <span class="nx">oldItem</span><span class="p">);</span>
</code></pre></div></div>

<p>📌 <code class="language-plaintext highlighter-rouge">replaceChild(새노드, 교체할노드)</code></p>

<hr />

<h2 id="-4-텍스트-일부만-바꾸기--replacedata">🔤 4. 텍스트 일부만 바꾸기 – <code class="language-plaintext highlighter-rouge">replaceData()</code></h2>

<h3 id="-텍스트-노드-일부-문자열-교체">✅ 텍스트 노드 일부 문자열 교체</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">textNode</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">text</span><span class="dl">"</span><span class="p">).</span><span class="nx">firstChild</span><span class="p">;</span>
<span class="nx">textNode</span><span class="p">.</span><span class="nx">replaceData</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="dl">"</span><span class="s2">밤</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// index 3부터 2글자 → "밤"으로 교체</span>
</code></pre></div></div>

<p>📌 <code class="language-plaintext highlighter-rouge">replaceData(시작인덱스, 길이, 새문자열)</code></p>

<hr />

<h2 id="-핵심-요약표">✅ 핵심 요약표</h2>

<table>
  <thead>
    <tr>
      <th>기능</th>
      <th>방법</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>텍스트 전체 변경</td>
      <td><code class="language-plaintext highlighter-rouge">firstChild.nodeValue = ...</code></td>
      <td>텍스트 노드 값 전체 바꾸기</td>
    </tr>
    <tr>
      <td>텍스트 일부 변경</td>
      <td><code class="language-plaintext highlighter-rouge">replaceData(start, length, text)</code></td>
      <td>일부 텍스트 치환</td>
    </tr>
    <tr>
      <td>속성 추가/변경</td>
      <td><code class="language-plaintext highlighter-rouge">setAttribute("속성", "값")</code></td>
      <td>class, id 등 추가/수정</td>
    </tr>
    <tr>
      <td>요소 교체</td>
      <td><code class="language-plaintext highlighter-rouge">replaceChild(새노드, 기존노드)</code></td>
      <td>태그 자체를 새 요소로 교체</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-실용-예제--버튼-클릭-시-텍스트-변경">💡 실용 예제 – 버튼 클릭 시 텍스트 변경</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;p</span> <span class="na">id=</span><span class="s">"greeting"</span><span class="nt">&gt;</span>안녕하세요!<span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;button</span> <span class="na">onclick=</span><span class="s">"changeText()"</span><span class="nt">&gt;</span>변경<span class="nt">&lt;/button&gt;</span>

<span class="nt">&lt;script&gt;</span>
  <span class="kd">function</span> <span class="nx">changeText</span><span class="p">()</span> <span class="p">{</span>
    <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">greeting</span><span class="dl">"</span><span class="p">).</span><span class="nx">firstChild</span><span class="p">.</span><span class="nx">nodeValue</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">반가워요!</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[HTML 문서에서 자바스크립트를 통해 태그, 텍스트, 속성을 직접 추가/수정/삭제/교체할 수 있습니다. 이를 DOM 노드 조작이라 하며, 웹페이지를 동적으로 만들 때 핵심입니다.]]></summary></entry><entry><title type="html">자바스크립트 DOM 노드 관리 정리</title><link href="https://nj0428.github.io/javascript/javaScript20/" rel="alternate" type="text/html" title="자바스크립트 DOM 노드 관리 정리" /><published>2025-06-09T00:00:00+09:00</published><updated>2025-06-09T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript20</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript20/"><![CDATA[<p><strong>노드 관리(Node Manipulation)</strong>란 자바스크립트를 이용해 웹페이지의 HTML 구조를 <strong>실시간으로 생성, 수정, 삭제, 복제</strong>하는 기술입니다. 인터랙티브한 웹 기능 구현의 핵심입니다.</p>

<hr />

<h2 id="-1-노드-추가">✅ 1. 노드 추가</h2>

<h3 id="-appendchild-마지막-자식으로-추가">🔹 <code class="language-plaintext highlighter-rouge">appendChild()</code>: 마지막 자식으로 추가</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">parent</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">newItem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">newItem</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">새 항목</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">parent</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">newItem</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="-insertbefore-특정-자식-앞에-삽입">🔹 <code class="language-plaintext highlighter-rouge">insertBefore()</code>: 특정 자식 앞에 삽입</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">parent</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">newItem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">beforeItem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">target</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">parent</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="nx">newItem</span><span class="p">,</span> <span class="nx">beforeItem</span><span class="p">);</span>
</code></pre></div></div>

<p>📌 <code class="language-plaintext highlighter-rouge">insertBefore(노드, null)</code> 은 <code class="language-plaintext highlighter-rouge">appendChild()</code>와 동일한 효과입니다.</p>

<h3 id="-insertdataoffset-text-텍스트-노드-안에-삽입">🔹 <code class="language-plaintext highlighter-rouge">insertData(offset, text)</code>: 텍스트 노드 안에 삽입</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">textNode</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">text</span><span class="dl">"</span><span class="p">).</span><span class="nx">firstChild</span><span class="p">;</span>
<span class="nx">textNode</span><span class="p">.</span><span class="nx">insertData</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="dl">"</span><span class="s2"> 나른한</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="-2-노드-생성">✅ 2. 노드 생성</h2>

<h3 id="-createelement-새-html-요소-생성">🔹 <code class="language-plaintext highlighter-rouge">createElement()</code>: 새 HTML 요소 생성</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">para</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">p</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">para</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">새 문단입니다.</span><span class="dl">"</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">para</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="-createtextnode-텍스트-노드-생성">🔹 <code class="language-plaintext highlighter-rouge">createTextNode()</code>: 텍스트 노드 생성</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">text</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createTextNode</span><span class="p">(</span><span class="dl">"</span><span class="s2">텍스트만!</span><span class="dl">"</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">box</span><span class="dl">"</span><span class="p">).</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="-createattribute-속성-노드-생성-후-삽입">🔹 <code class="language-plaintext highlighter-rouge">createAttribute()</code>: 속성 노드 생성 후 삽입</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">attr</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">style</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">attr</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">color: red</span><span class="dl">"</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">).</span><span class="nx">setAttributeNode</span><span class="p">(</span><span class="nx">attr</span><span class="p">);</span>
</code></pre></div></div>

<p>📌 실제로는 다음 방식이 더 일반적입니다:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">el</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">style</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">color: red</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="-3-노드-제거">✅ 3. 노드 제거</h2>

<h3 id="-removechild-자식-노드-제거">🔹 <code class="language-plaintext highlighter-rouge">removeChild()</code>: 자식 노드 제거</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">list</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">item</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">item</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">list</span><span class="p">.</span><span class="nx">removeChild</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="-removeattribute-속성-제거">🔹 <code class="language-plaintext highlighter-rouge">removeAttribute()</code>: 속성 제거</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">).</span><span class="nx">removeAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">style</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="-4-노드-복제">✅ 4. 노드 복제</h2>

<h3 id="-clonenodetrue--false-노드-복사">🔹 <code class="language-plaintext highlighter-rouge">cloneNode(true | false)</code>: 노드 복사</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">origin</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">item</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">copy</span> <span class="o">=</span> <span class="nx">origin</span><span class="p">.</span><span class="nx">cloneNode</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span> <span class="c1">// true: 자식까지 복제</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">).</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">copy</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="-실전-예제-버튼-클릭-시-항목-추가">🧠 실전 예제: 버튼 클릭 시 항목 추가</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">"fruits"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;li&gt;</span>🍎 사과<span class="nt">&lt;/li&gt;</span>
<span class="nt">&lt;/ul&gt;</span>
<span class="nt">&lt;button</span> <span class="na">onclick=</span><span class="s">"addFruit()"</span><span class="nt">&gt;</span>추가<span class="nt">&lt;/button&gt;</span>

<span class="nt">&lt;script&gt;</span>
  <span class="kd">function</span> <span class="nx">addFruit</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">let</span> <span class="nx">ul</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">fruits</span><span class="dl">"</span><span class="p">);</span>
    <span class="kd">let</span> <span class="nx">li</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
    <span class="nx">li</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">🍌 바나나</span><span class="dl">"</span><span class="p">;</span>
    <span class="nx">ul</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">li</span><span class="p">);</span>
  <span class="p">}</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>

<hr />

<h2 id="-기능별-메소드-요약표">📋 기능별 메소드 요약표</h2>

<table>
  <thead>
    <tr>
      <th>목적</th>
      <th>메소드</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>추가</strong></td>
      <td><code class="language-plaintext highlighter-rouge">appendChild()</code></td>
      <td>마지막 자식으로 추가</td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">insertBefore()</code></td>
      <td>특정 자식 앞에 삽입</td>
    </tr>
    <tr>
      <td><strong>생성</strong></td>
      <td><code class="language-plaintext highlighter-rouge">createElement()</code></td>
      <td>새 HTML 요소 생성</td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">createTextNode()</code></td>
      <td>텍스트 노드 생성</td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">createAttribute()</code></td>
      <td>속성 노드 생성 후 부착</td>
    </tr>
    <tr>
      <td><strong>수정</strong></td>
      <td><code class="language-plaintext highlighter-rouge">insertData()</code></td>
      <td>텍스트 노드에 문자열 삽입</td>
    </tr>
    <tr>
      <td><strong>삭제</strong></td>
      <td><code class="language-plaintext highlighter-rouge">removeChild()</code></td>
      <td>특정 자식 노드 제거</td>
    </tr>
    <tr>
      <td> </td>
      <td><code class="language-plaintext highlighter-rouge">removeAttribute()</code></td>
      <td>특정 속성 제거</td>
    </tr>
    <tr>
      <td><strong>복제</strong></td>
      <td><code class="language-plaintext highlighter-rouge">cloneNode(true     | false)</code></td>
      <td> </td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-마무리-요약">✅ 마무리 요약</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">createElement()</code> + <code class="language-plaintext highlighter-rouge">appendChild()</code>는 동적 UI의 핵심입니다.</li>
  <li><code class="language-plaintext highlighter-rouge">insertBefore()</code>는 원하는 위치 조작에 유용합니다.</li>
  <li>노드 제거는 반드시 부모에서 자식을 기준으로 해야 합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">cloneNode()</code>를 활용하면 템플릿 반복도 쉽게 구현할 수 있습니다.</li>
</ul>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[노드 관리(Node Manipulation)란 자바스크립트를 이용해 웹페이지의 HTML 구조를 실시간으로 생성, 수정, 삭제, 복제하는 기술입니다. 인터랙티브한 웹 기능 구현의 핵심입니다.]]></summary></entry><entry><title type="html">자바스크립트 DOM 노드 접근 정리</title><link href="https://nj0428.github.io/javascript/javaScript19/" rel="alternate" type="text/html" title="자바스크립트 DOM 노드 접근 정리" /><published>2025-06-08T00:00:00+09:00</published><updated>2025-06-08T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript19</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript19/"><![CDATA[<p>DOM 노드에 대한 이해는 <strong>정밀한 DOM 조작</strong>의 핵심입니다. 이 글에서는 노드(Node)의 개념부터, <code class="language-plaintext highlighter-rouge">nodeType</code> 검사로 <strong>공백/텍스트 노드 문제 해결</strong>까지 한눈에 정리해드립니다.</p>

<hr />

<h2 id="-노드-접근이란">✅ 노드 접근이란?</h2>

<ul>
  <li><strong>노드(Node)</strong>: HTML의 모든 구성 요소 (<code class="language-plaintext highlighter-rouge">요소</code>, <code class="language-plaintext highlighter-rouge">텍스트</code>, <code class="language-plaintext highlighter-rouge">속성</code>, <code class="language-plaintext highlighter-rouge">주석</code> 등)</li>
  <li><strong>DOM 조작의 대상 = 노드</strong></li>
  <li>노드 간 <strong>계층적 관계</strong>를 통해 원하는 위치 탐색 가능</li>
</ul>

<hr />

<h2 id="1️⃣-노드-선택-방법">1️⃣ 노드 선택 방법</h2>

<h3 id="-a-태그-이름으로-선택">🔸 A. 태그 이름으로 선택</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">items</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">items</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">red</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<ul>
  <li>반환: <code class="language-plaintext highlighter-rouge">HTMLCollection</code> → 인덱스로 접근 가능</li>
</ul>

<h3 id="-b-노드-간-관계로-접근">🔸 B. 노드 간 관계로 접근</h3>

<table>
  <thead>
    <tr>
      <th>속성</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">parentNode</code></td>
      <td>부모 노드</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">childNodes</code></td>
      <td>모든 자식 노드 (텍스트 포함)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">children</code></td>
      <td>요소 노드만 포함 (추천)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">firstChild</code> / <code class="language-plaintext highlighter-rouge">lastChild</code></td>
      <td>첫/마지막 자식 노드</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">nextSibling</code> / <code class="language-plaintext highlighter-rouge">previousSibling</code></td>
      <td>형제 노드 접근</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">firstNode</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">).</span><span class="nx">firstChild</span><span class="p">;</span>
</code></pre></div></div>

<blockquote>
  <p>⚠️ 줄바꿈(\n)은 #text 노드로 인식될 수 있으므로 주의</p>
</blockquote>

<hr />

<h2 id="2️⃣-노드-정보-확인">2️⃣ 노드 정보 확인</h2>

<h3 id="-a-nodename">🔸 A. <code class="language-plaintext highlighter-rouge">nodeName</code></h3>

<p>노드의 <strong>이름(태그명/타입명)</strong> 반환 (읽기 전용)</p>

<table>
  <thead>
    <tr>
      <th>노드</th>
      <th>nodeName</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>문서 노드</td>
      <td><code class="language-plaintext highlighter-rouge">#document</code></td>
    </tr>
    <tr>
      <td>요소 노드</td>
      <td><code class="language-plaintext highlighter-rouge">"DIV"</code> 등 대문자</td>
    </tr>
    <tr>
      <td>텍스트 노드</td>
      <td><code class="language-plaintext highlighter-rouge">#text</code></td>
    </tr>
    <tr>
      <td>주석 노드</td>
      <td><code class="language-plaintext highlighter-rouge">#comment</code></td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">nodeName</span><span class="p">);</span> <span class="c1">// "BODY"</span>
</code></pre></div></div>

<h3 id="-b-nodevalue">🔸 B. <code class="language-plaintext highlighter-rouge">nodeValue</code></h3>

<table>
  <thead>
    <tr>
      <th>노드</th>
      <th>nodeValue</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>요소 노드</td>
      <td><code class="language-plaintext highlighter-rouge">null</code></td>
    </tr>
    <tr>
      <td>텍스트 노드</td>
      <td>텍스트 문자열</td>
    </tr>
    <tr>
      <td>속성 노드</td>
      <td>속성 값</td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">txt</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">).</span><span class="nx">firstChild</span><span class="p">.</span><span class="nx">nodeValue</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="-c-nodetype">🔸 C. <code class="language-plaintext highlighter-rouge">nodeType</code></h3>

<table>
  <thead>
    <tr>
      <th>노드</th>
      <th>코드</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>요소</td>
      <td><code class="language-plaintext highlighter-rouge">1</code></td>
    </tr>
    <tr>
      <td>속성</td>
      <td><code class="language-plaintext highlighter-rouge">2</code></td>
    </tr>
    <tr>
      <td>텍스트</td>
      <td><code class="language-plaintext highlighter-rouge">3</code></td>
    </tr>
    <tr>
      <td>주석</td>
      <td><code class="language-plaintext highlighter-rouge">8</code></td>
    </tr>
    <tr>
      <td>문서</td>
      <td><code class="language-plaintext highlighter-rouge">9</code></td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">type</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">).</span><span class="nx">firstChild</span><span class="p">.</span><span class="nx">nodeType</span><span class="p">;</span>
</code></pre></div></div>

<hr />

<h2 id="3️⃣-공백--줄바꿈-문제-해결">3️⃣ 공백 / 줄바꿈 문제 해결</h2>

<p><strong>문제</strong>: HTML 코드에 줄바꿈이 있으면 <code class="language-plaintext highlighter-rouge">firstChild</code>, <code class="language-plaintext highlighter-rouge">lastChild</code>가 <strong>텍스트 노드(#text)</strong>가 됨</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">"list"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;li&gt;</span>1<span class="nt">&lt;/li&gt;</span>
  <span class="nt">&lt;li&gt;</span>2<span class="nt">&lt;/li&gt;</span>
<span class="nt">&lt;/ul&gt;</span>
</code></pre></div></div>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">ul</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ul</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">);</span> <span class="c1">// #text일 수 있음!</span>
</code></pre></div></div>

<h3 id="-해결-nodetype-체크">✅ 해결: nodeType 체크</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">findLastElementChild</span><span class="p">(</span><span class="nx">parent</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">let</span> <span class="nx">node</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">;</span>
  <span class="k">while</span> <span class="p">(</span><span class="nx">node</span> <span class="o">&amp;&amp;</span> <span class="nx">node</span><span class="p">.</span><span class="nx">nodeType</span> <span class="o">!==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">node</span> <span class="o">=</span> <span class="nx">node</span><span class="p">.</span><span class="nx">previousSibling</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="nx">node</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="-실전-예시">🧠 실전 예시</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">&lt;</span><span class="nt">ul</span> <span class="na">id</span><span class="p">=</span><span class="s">"fruits"</span><span class="p">&gt;</span>
  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>🍎 사과<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>🍌 바나나<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
  <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>🍇 포도<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</code></pre></div></div>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">list</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">fruits</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">node</span> <span class="o">=</span> <span class="nx">list</span><span class="p">.</span><span class="nx">lastChild</span><span class="p">;</span>

<span class="k">while</span> <span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">nodeType</span> <span class="o">!==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">node</span> <span class="o">=</span> <span class="nx">node</span><span class="p">.</span><span class="nx">previousSibling</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">textContent</span><span class="p">);</span> <span class="c1">// "🍇 포도"</span>
</code></pre></div></div>

<hr />

<h2 id="-핵심-요약표">✅ 핵심 요약표</h2>

<table>
  <thead>
    <tr>
      <th>목적</th>
      <th>속성/메서드</th>
      <th>설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>노드 이름</td>
      <td><code class="language-plaintext highlighter-rouge">nodeName</code></td>
      <td><code class="language-plaintext highlighter-rouge">DIV</code>, <code class="language-plaintext highlighter-rouge">#text</code> 등</td>
    </tr>
    <tr>
      <td>노드 값</td>
      <td><code class="language-plaintext highlighter-rouge">nodeValue</code></td>
      <td>텍스트 노드 내용 등</td>
    </tr>
    <tr>
      <td>노드 타입</td>
      <td><code class="language-plaintext highlighter-rouge">nodeType</code></td>
      <td>숫자로 반환 (1: 요소, 3: 텍스트 등)</td>
    </tr>
    <tr>
      <td>부모/자식</td>
      <td><code class="language-plaintext highlighter-rouge">parentNode</code>, <code class="language-plaintext highlighter-rouge">childNodes</code>, <code class="language-plaintext highlighter-rouge">children</code></td>
      <td>트리 탐색</td>
    </tr>
    <tr>
      <td>형제 탐색</td>
      <td><code class="language-plaintext highlighter-rouge">nextSibling</code>, <code class="language-plaintext highlighter-rouge">previousSibling</code></td>
      <td>공백도 포함됨</td>
    </tr>
    <tr>
      <td>요소만 탐색</td>
      <td><code class="language-plaintext highlighter-rouge">children</code>, <code class="language-plaintext highlighter-rouge">Element</code> 전용 속성</td>
      <td><code class="language-plaintext highlighter-rouge">nodeType === 1</code> 검사</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="질문-정리">질문 정리</h2>

<table>
  <thead>
    <tr>
      <th>질문</th>
      <th>답변</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">firstChild</code>가 왜 텍스트일까요?</td>
      <td>줄바꿈/공백은 텍스트 노드입니다</td>
    </tr>
    <tr>
      <td>텍스트 노드 건너뛰려면?</td>
      <td><code class="language-plaintext highlighter-rouge">nodeType === 1</code> 조건으로 검사하세요</td>
    </tr>
    <tr>
      <td>텍스트만 접근하려면?</td>
      <td><code class="language-plaintext highlighter-rouge">el.firstChild.nodeValue</code></td>
    </tr>
    <tr>
      <td>요소만 반복하려면?</td>
      <td><code class="language-plaintext highlighter-rouge">el.children</code>, <code class="language-plaintext highlighter-rouge">for...of</code>, <code class="language-plaintext highlighter-rouge">forEach</code> 사용</td>
    </tr>
  </tbody>
</table>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[DOM 노드에 대한 이해는 정밀한 DOM 조작의 핵심입니다. 이 글에서는 노드(Node)의 개념부터, nodeType 검사로 공백/텍스트 노드 문제 해결까지 한눈에 정리해드립니다.]]></summary></entry><entry><title type="html">DOM 요소 선택 방법 요약</title><link href="https://nj0428.github.io/javascript/javaScript18/" rel="alternate" type="text/html" title="DOM 요소 선택 방법 요약" /><published>2025-06-07T00:00:00+09:00</published><updated>2025-06-07T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript18</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript18/"><![CDATA[<table>
  <thead>
    <tr>
      <th>방법</th>
      <th>메소드</th>
      <th>반환</th>
      <th>사용 예시</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>태그명</td>
      <td><code class="language-plaintext highlighter-rouge">getElementsByTagName("p")</code></td>
      <td>HTMLCollection</td>
      <td>반복 필요</td>
    </tr>
    <tr>
      <td>아이디</td>
      <td><code class="language-plaintext highlighter-rouge">getElementById("id")</code></td>
      <td>단일 요소</td>
      <td>가장 빠름</td>
    </tr>
    <tr>
      <td>클래스명</td>
      <td><code class="language-plaintext highlighter-rouge">getElementsByClassName("item")</code></td>
      <td>HTMLCollection</td>
      <td> </td>
    </tr>
    <tr>
      <td>name 속성</td>
      <td><code class="language-plaintext highlighter-rouge">getElementsByName("email")</code></td>
      <td>NodeList</td>
      <td> </td>
    </tr>
    <tr>
      <td>CSS 선택자 (1개)</td>
      <td><code class="language-plaintext highlighter-rouge">querySelector(".box")</code></td>
      <td>단일 요소</td>
      <td>추천 방식</td>
    </tr>
    <tr>
      <td>CSS 선택자 (전체)</td>
      <td><code class="language-plaintext highlighter-rouge">querySelectorAll("ul li")</code></td>
      <td>NodeList</td>
      <td>반복문 사용 필요</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>추천: querySelector / querySelectorAll</p>

  <p>→ CSS 선택자를 그대로 사용하므로 가독성 · 유연성 최고입니다.</p>
</blockquote>

<hr />

<h2 id="️-자주-쓰는-dom-조작-예제">✍️ 자주 쓰는 DOM 조작 예제</h2>

<h3 id="-요소-선택--스타일-변경">① 요소 선택 + 스타일 변경</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">items</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">li.odd</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">items</span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">item</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">item</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">red</span><span class="dl">"</span><span class="p">;</span>
<span class="p">});</span>
</code></pre></div></div>

<h3 id="-innerhtml-vs-textcontent-차이">② innerHTML vs textContent 차이</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">el</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">&lt;b&gt;굵게!&lt;/b&gt;</span><span class="dl">"</span><span class="p">;</span> <span class="c1">// 태그 포함 (HTML 삽입)</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">&lt;b&gt;굵게!&lt;/b&gt;</span><span class="dl">"</span><span class="p">;</span> <span class="c1">// 그대로 출력 (태그 무효)</span>
</code></pre></div></div>

<h3 id="-속성-변경-예제">③ 속성 변경 예제</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">link</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">link</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">link</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">https://naver.com</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">link</span><span class="p">.</span><span class="nx">target</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">_blank</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="-이벤트--스타일-변경">④ 이벤트 + 스타일 변경</h3>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">box</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseenter</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">box</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">yellow</span><span class="dl">"</span><span class="p">;</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="️-주의할-점">⚠️ 주의할 점</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">getElementsBy...</code>, <code class="language-plaintext highlighter-rouge">querySelectorAll()</code> → <strong>반복 처리(forEach)</strong> 필요</li>
  <li><code class="language-plaintext highlighter-rouge">innerHTML</code> 사용 시 → <strong>스크립트 삽입 취약점(XSS)</strong> 주의</li>
  <li>스타일 조작은 많은 경우 CSS 클래스 토글이 더 좋음</li>
</ul>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">box</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">active</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">toggle</span><span class="p">(</span><span class="dl">"</span><span class="s2">dark-mode</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="-실무-팁-모음">🧠 실무 팁 모음</h2>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>추천 방식</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>요소를 찾고 반복 적용할 때</td>
      <td><code class="language-plaintext highlighter-rouge">querySelectorAll()</code> + <code class="language-plaintext highlighter-rouge">forEach()</code></td>
    </tr>
    <tr>
      <td>기존 내용을 유지하며 새 HTML 삽입</td>
      <td><code class="language-plaintext highlighter-rouge">insertAdjacentHTML("beforeend", "...")</code></td>
    </tr>
    <tr>
      <td>속성 있는지 체크</td>
      <td><code class="language-plaintext highlighter-rouge">el.hasAttribute("src")</code></td>
    </tr>
    <tr>
      <td>요소 삭제</td>
      <td><code class="language-plaintext highlighter-rouge">el.remove()</code> 또는 <code class="language-plaintext highlighter-rouge">parent.removeChild(el)</code></td>
    </tr>
    <tr>
      <td>CSS 토글</td>
      <td><code class="language-plaintext highlighter-rouge">el.classList.toggle("on")</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">style</code> 직접보다 클래스 조작 권장</td>
      <td>유지보수성과 일관성 ↑</td>
    </tr>
  </tbody>
</table>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[방법 메소드 반환 사용 예시 태그명 getElementsByTagName("p") HTMLCollection 반복 필요 아이디 getElementById("id") 단일 요소 가장 빠름 클래스명 getElementsByClassName("item") HTMLCollection   name 속성 getElementsByName("email") NodeList   CSS 선택자 (1개) querySelector(".box") 단일 요소 추천 방식 CSS 선택자 (전체) querySelectorAll("ul li") NodeList 반복문 사용 필요]]></summary></entry><entry><title type="html">자바스크립트 배열 메소드 정리</title><link href="https://nj0428.github.io/javascript/javaScript17/" rel="alternate" type="text/html" title="자바스크립트 배열 메소드 정리" /><published>2025-06-06T00:00:00+09:00</published><updated>2025-06-06T00:00:00+09:00</updated><id>https://nj0428.github.io/javascript/javaScript17</id><content type="html" xml:base="https://nj0428.github.io/javascript/javaScript17/"><![CDATA[<p>배열은 <strong>자바스크립트 배열 메소드</strong>(Array.prototype method)를 잘 활용하면 <em>자료 처리·변환·탐색</em> 속도가 극적으로 빨라집니다. 이번 글에서는 <strong>원본 변경형·비변경형·반복형</strong> 3가지 카테고리로 나눠, 가장 자주 쓰는 메소드와 예시 코드를 한눈에 살펴보겠습니다.</p>

<hr />

<h2 id="1-배열-메소드-분류-기준">1. 배열 메소드 분류 기준</h2>

<table>
  <thead>
    <tr>
      <th>분류</th>
      <th>특징</th>
      <th>대표 메소드</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>변경형</strong></td>
      <td><strong>원본 배열</strong>을 직접 수정</td>
      <td><code class="language-plaintext highlighter-rouge">push</code>, <code class="language-plaintext highlighter-rouge">pop</code>, <code class="language-plaintext highlighter-rouge">splice</code>, <code class="language-plaintext highlighter-rouge">sort</code>, <code class="language-plaintext highlighter-rouge">fill</code></td>
    </tr>
    <tr>
      <td><strong>비변경형</strong></td>
      <td>결과만 새로 반환, 원본 유지</td>
      <td><code class="language-plaintext highlighter-rouge">slice</code>, <code class="language-plaintext highlighter-rouge">concat</code>, <code class="language-plaintext highlighter-rouge">join</code>, <code class="language-plaintext highlighter-rouge">indexOf</code></td>
    </tr>
    <tr>
      <td><strong>반복형</strong></td>
      <td>콜백·반복자 기반 순회</td>
      <td><code class="language-plaintext highlighter-rouge">forEach</code>, <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">filter</code>, <code class="language-plaintext highlighter-rouge">reduce</code>, <code class="language-plaintext highlighter-rouge">entries</code></td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>Tip</p>

  <p>숫자 정렬 시 <code class="language-plaintext highlighter-rouge">sort((a, b) =&gt; a - b)</code> 형태의 콜백을 꼭 넣어야 올바른 오름차순이 됩니다.</p>
</blockquote>

<hr />

<h2 id="2-원본-배열을-변경하는-메소드-">2. 원본 배열을 <strong>변경</strong>하는 메소드 🧨</h2>

<table>
  <thead>
    <tr>
      <th>메소드</th>
      <th>기능</th>
      <th>간단 예시</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">push()</code> / <code class="language-plaintext highlighter-rouge">pop()</code></td>
      <td>뒤 추가 / 뒤 제거</td>
      <td><code class="language-plaintext highlighter-rouge">arr.push(1)</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">unshift()</code> / <code class="language-plaintext highlighter-rouge">shift()</code></td>
      <td>앞 추가 / 앞 제거</td>
      <td><code class="language-plaintext highlighter-rouge">arr.unshift(0)</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">reverse()</code></td>
      <td>요소 순서 뒤집기</td>
      <td><code class="language-plaintext highlighter-rouge">arr.reverse()</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sort()</code></td>
      <td>정렬(기본: 문자열)</td>
      <td><code class="language-plaintext highlighter-rouge">arr.sort()</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">splice(시작, 개수, ...추가)</code></td>
      <td>잘라내기 &amp; 끼워넣기</td>
      <td><code class="language-plaintext highlighter-rouge">arr.splice(2,1,"X")</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">fill(value, 시작?, 끝?)</code></td>
      <td>구간 값 채우기</td>
      <td><code class="language-plaintext highlighter-rouge">arr.fill(0)</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">copyWithin(대상, 시작, 끝?)</code></td>
      <td>내부 요소 복사</td>
      <td><code class="language-plaintext highlighter-rouge">arr.copyWithin(1,0,2)</code></td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">];</span>
<span class="nx">nums</span><span class="p">.</span><span class="nx">sort</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// [1, 2, 3]</span>
</code></pre></div></div>

<hr />

<h2 id="3-원본을-변경하지-않는-메소드-">3. 원본을 <strong>변경하지 않는</strong> 메소드 🧪</h2>

<table>
  <thead>
    <tr>
      <th>메소드</th>
      <th>기능</th>
      <th>간단 예시</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">slice(시작, 끝)</code></td>
      <td>부분 배열 추출</td>
      <td><code class="language-plaintext highlighter-rouge">arr.slice(1,3)</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">concat(...arrs)</code></td>
      <td>배열 병합</td>
      <td><code class="language-plaintext highlighter-rouge">arr.concat([4,5])</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">join(sep)</code></td>
      <td>문자열 변환</td>
      <td><code class="language-plaintext highlighter-rouge">arr.join(",")</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">toString()</code></td>
      <td>쉼표 문자열</td>
      <td><code class="language-plaintext highlighter-rouge">arr.toString()</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">indexOf</code>, <code class="language-plaintext highlighter-rouge">lastIndexOf</code></td>
      <td>값 위치 찾기</td>
      <td><code class="language-plaintext highlighter-rouge">arr.indexOf("x")</code></td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>slice vs splice</p>

  <ul>
    <li><code class="language-plaintext highlighter-rouge">slice</code> → <strong>비변경형</strong> (원본 보존)</li>
    <li><code class="language-plaintext highlighter-rouge">splice</code> → <strong>변경형</strong> (원본 잘라서 붙이기)</li>
  </ul>
</blockquote>

<hr />

<h2 id="4-반복하면서-참조하는-메소드-">4. <strong>반복</strong>하면서 참조하는 메소드 🔁</h2>

<h3 id="4-1-콜백-기반">4-1 콜백 기반</h3>

<table>
  <thead>
    <tr>
      <th>메소드</th>
      <th>반환</th>
      <th>용도</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">forEach</code></td>
      <td>없음</td>
      <td>단순 반복 (break 불가)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">map</code></td>
      <td><strong>새 배열</strong></td>
      <td>요소 변환</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">filter</code></td>
      <td><strong>새 배열</strong></td>
      <td>조건 추출</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">reduce</code> / <code class="language-plaintext highlighter-rouge">reduceRight</code></td>
      <td>누계값</td>
      <td>합계·평균·객체 변환</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">every</code> / <code class="language-plaintext highlighter-rouge">some</code></td>
      <td>불리언</td>
      <td>전체·부분 조건 검사</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">find</code> / <code class="language-plaintext highlighter-rouge">findIndex</code></td>
      <td>값 / 인덱스</td>
      <td>첫 매칭 찾기</td>
    </tr>
  </tbody>
</table>

<h3 id="4-2-반복자iterator-기반-es6">4-2 반복자(Iterator) 기반 (ES6+)</h3>

<table>
  <thead>
    <tr>
      <th>메소드</th>
      <th>반복 대상</th>
      <th>for-of 사용 예</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">entries()</code></td>
      <td><code class="language-plaintext highlighter-rouge">[인덱스, 값]</code></td>
      <td><code class="language-plaintext highlighter-rouge">for (const [i,v] of arr.entries())</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">keys()</code></td>
      <td>인덱스</td>
      <td><code class="language-plaintext highlighter-rouge">for (const i of arr.keys())</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">values()</code></td>
      <td>값</td>
      <td><code class="language-plaintext highlighter-rouge">for (const v of arr.values())</code></td>
    </tr>
  </tbody>
</table>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">squared</span> <span class="o">=</span> <span class="nx">numbers</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">**</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// [1, 4, 9, 16, 25]</span>
<span class="kd">const</span> <span class="nx">even</span> <span class="o">=</span> <span class="nx">numbers</span><span class="p">.</span><span class="nx">filter</span><span class="p">((</span><span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">%</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// [1,3,5] → 홀수</span>
<span class="kd">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">numbers</span><span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// 15</span>
</code></pre></div></div>

<hr />

<h2 id="5-실전-코드-스니펫">5. 실전 코드 스니펫</h2>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>

<span class="c1">// ① push / pop</span>
<span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span> <span class="c1">// [1,2,3,4,5,6]</span>
<span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> <span class="c1">// [1,2,3,4,5]</span>

<span class="c1">// ② splice로 특정 위치 값 교체</span>
<span class="nx">arr</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">99</span><span class="p">);</span> <span class="c1">// [1,2,99,4,5]</span>

<span class="c1">// ③ find &amp; findIndex</span>
<span class="kd">const</span> <span class="nx">firstBig</span> <span class="o">=</span> <span class="nx">arr</span><span class="p">.</span><span class="nx">find</span><span class="p">((</span><span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// 4</span>
<span class="kd">const</span> <span class="nx">idxBig</span> <span class="o">=</span> <span class="nx">arr</span><span class="p">.</span><span class="nx">findIndex</span><span class="p">((</span><span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// 3</span>

<span class="c1">// ④ copyWithin으로 내부 복사</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">].</span><span class="nx">copyWithin</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// [1,2,1,2]</span>
</code></pre></div></div>

<hr />

<h2 id="6-가장-많이-쓰는-top-10-메소드-">6. 가장 많이 쓰는 TOP 10 메소드 ✅</h2>

<table>
  <thead>
    <tr>
      <th>카테고리</th>
      <th>메소드</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>요소 추가/제거</td>
      <td><code class="language-plaintext highlighter-rouge">push</code>, <code class="language-plaintext highlighter-rouge">pop</code>, <code class="language-plaintext highlighter-rouge">shift</code>, <code class="language-plaintext highlighter-rouge">unshift</code></td>
    </tr>
    <tr>
      <td>값 찾기</td>
      <td><code class="language-plaintext highlighter-rouge">find</code>, <code class="language-plaintext highlighter-rouge">indexOf</code></td>
    </tr>
    <tr>
      <td>반복 처리</td>
      <td><code class="language-plaintext highlighter-rouge">forEach</code>, <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">filter</code></td>
    </tr>
    <tr>
      <td>누적 계산</td>
      <td><code class="language-plaintext highlighter-rouge">reduce</code></td>
    </tr>
    <tr>
      <td>정렬/뒤집기</td>
      <td><code class="language-plaintext highlighter-rouge">sort</code>, <code class="language-plaintext highlighter-rouge">reverse</code></td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="질문-정리">질문 정리</h2>

<h3 id="q1-foreach에서-break-하려면">Q1. <code class="language-plaintext highlighter-rouge">forEach</code>에서 <code class="language-plaintext highlighter-rouge">break</code> 하려면?</h3>

<p><code class="language-plaintext highlighter-rouge">forEach</code>는 멈출 수 없습니다. <code class="language-plaintext highlighter-rouge">for…of</code> 또는 <code class="language-plaintext highlighter-rouge">some</code> / <code class="language-plaintext highlighter-rouge">every</code>로 대체하세요.</p>

<h3 id="q2-숫자-배열-정렬이-이상해요">Q2. 숫자 배열 정렬이 이상해요!</h3>

<p>문자열 기준 정렬되기 때문입니다. <strong><code class="language-plaintext highlighter-rouge">arr.sort((a,b)=&gt;a-b)</code></strong> 콜백으로 숫자 비교를 지정하세요.</p>

<h3 id="q3-reduce-초깃값을-생략하면">Q3. <code class="language-plaintext highlighter-rouge">reduce</code> 초깃값을 생략하면?</h3>

<p>배열 첫 요소가 초기 누적값이 됩니다. 빈 배열이면 <strong>TypeError</strong>가 발생하니 주의!</p>

<h3 id="q4-splice20x-는-무슨-뜻">Q4. <code class="language-plaintext highlighter-rouge">splice(2,0,"x")</code> 는 무슨 뜻?</h3>

<p>2번 인덱스 위치에서 <strong>삭제 0개</strong> + <code class="language-plaintext highlighter-rouge">"x"</code> 삽입 → 요소 추가 기능.</p>

<h3 id="q5-불변-업데이트를-권장하는-이유는">Q5. 불변 업데이트를 권장하는 이유는?</h3>

<p><strong>React</strong>·<strong>Vue</strong> 상태 관리에서 변경형 메소드(push 등)를 쓰면 감지가 어렵습니다. <code class="language-plaintext highlighter-rouge">slice</code>, <code class="language-plaintext highlighter-rouge">concat</code>, 스프레드(<code class="language-plaintext highlighter-rouge">[...]</code>) 로 새 배열을 만들어 주세요.</p>]]></content><author><name>NAK</name></author><category term="javaScript" /><summary type="html"><![CDATA[배열은 자바스크립트 배열 메소드(Array.prototype method)를 잘 활용하면 자료 처리·변환·탐색 속도가 극적으로 빨라집니다. 이번 글에서는 원본 변경형·비변경형·반복형 3가지 카테고리로 나눠, 가장 자주 쓰는 메소드와 예시 코드를 한눈에 살펴보겠습니다.]]></summary></entry></feed>