<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>도토리정의 기술개발 블라블라</title>
        <link>https://velog.io/</link>
        <description>화이팅!</description>
        <lastBuildDate>Mon, 17 Feb 2025 14:40:48 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>도토리정의 기술개발 블라블라</title>
            <url>https://velog.velcdn.com/images/seolleung_ee/profile/c0b5c99e-d0e8-4a48-a924-e594c99820db/image.PNG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 도토리정의 기술개발 블라블라. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/seolleung_ee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[DOM 특징, 조작, 이벤트 전파 이해하기]]></title>
            <link>https://velog.io/@seolleung_ee/DOM-%ED%8A%B9%EC%A7%95-%EC%A1%B0%EC%9E%91-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%ED%8C%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@seolleung_ee/DOM-%ED%8A%B9%EC%A7%95-%EC%A1%B0%EC%9E%91-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%ED%8C%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 17 Feb 2025 14:40:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/aca907d8-7ac7-4748-88d9-b06e5c9b779f/image.png" alt=""></p>
<h2 id="dom의-기본-개념">DOM의 기본 개념</h2>
<ul>
<li>DOM은 HTML 문서의 구조화된 표현(Structured representation)입니다</li>
<li>웹 페이지와 JavaScript 코드 사이의 인터페이스 역할을 합니다</li>
<li>브라우저가 HTML을 로드할 때 자동으로 DOM 트리를 생성합니다</li>
<li>DOM은 프로그래밍 언어와 독립적이며, 플랫폼/언어 중립적입니다</li>
<li>DOM은 문서를 논리 트리로 표현하며, 각 노드는 객체로 취급됩니다</li>
</ul>
<h2 id="dom의-주요-특징">DOM의 주요 특징</h2>
<ol>
<li><p><strong>트리 구조</strong></p>
<ul>
<li>Document: DOM 트리의 진입점</li>
<li>Element nodes: HTML 요소들</li>
<li>Text nodes: 텍스트 컨텐츠</li>
<li>Attribute nodes: 요소의 속성들</li>
</ul>
</li>
<li><p><strong>DOM과 JavaScript의 관계</strong></p>
<ul>
<li>DOM은 JavaScript의 일부가 아닙니다.</li>
<li>Web API의 일부로, JavaScript에서 접근 가능한 인터페이스를 제공합니다.</li>
</ul>
</li>
</ol>
<h2 id="dom-조작의-비용">DOM 조작의 비용</h2>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/38900350-3aba-48f0-8216-f5caadcb7409/image.jpg" alt=""></p>
<ul>
<li><strong>리플로우(Reflow)</strong>: DOM 요소의 크기나 위치가 변경될 때 발생<ul>
<li>변경된 요소와 그 자식, 부모 요소들의 위치와 크기를 재계산</li>
<li>레이아웃 단계를 다시 수행하므로 매우 비용이 큼</li>
</ul>
</li>
<li><strong>리페인트(Repaint)</strong>: 가시성이나 색상 등 스타일 변경 시 발생<ul>
<li>리플로우보다는 비용이 적지만, 여전히 부하가 발생</li>
</ul>
</li>
</ul>
<h2 id="이벤트-전파-메커니즘">이벤트 전파 메커니즘</h2>
<ul>
<li><strong>캡처링 단계(Capturing Phase)</strong>:<ul>
<li>이벤트가 최상위 요소에서 시작하여 타겟 요소까지 내려오는 단계</li>
<li><code>addEventListener</code>의 세 번째 인자를 <code>true</code>로 설정하여 캡처링 이벤트 감지</li>
</ul>
</li>
</ul>
<pre><code class="language-javascript">element.addEventListener(&quot;click&quot;, handler, true);</code></pre>
<ul>
<li><strong>버블링 단계(Bubbling Phase)</strong>:<ul>
<li>이벤트가 타겟 요소에서 시작하여 최상위 요소까지 올라가는 단계</li>
<li>대부분의 이벤트 핸들링이 이 단계에서 발생</li>
<li><code>event.stopPropagation()</code>으로 버블링 중단 가능</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/dec86991-fff0-4919-86c5-b67b71290905/image.svg" alt=""></p>
<p>이벤트 전파는 HTML의 계층 구조를 따라 진행됩니다.</p>
<pre><code class="language-html">&lt;div class=&quot;grandparent&quot;&gt;
  &lt;div class=&quot;parent&quot;&gt;
    &lt;button class=&quot;child&quot;&gt;클릭하세요&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-javascript">// 각 요소에 이벤트 리스너 추가
const grandparent = document.querySelector(&quot;.grandparent&quot;);
const parent = document.querySelector(&quot;.parent&quot;);
const child = document.querySelector(&quot;.child&quot;);

// 캡처링 단계 이벤트 리스너
grandparent.addEventListener(
  &quot;click&quot;,
  (e) =&gt; {
    console.log(&quot;캡처링 - Grandparent&quot;);
  },
  true
);

parent.addEventListener(
  &quot;click&quot;,
  (e) =&gt; {
    console.log(&quot;캡처링 - Parent&quot;);
  },
  true
);

child.addEventListener(
  &quot;click&quot;,
  (e) =&gt; {
    console.log(&quot;캡처링 - Child&quot;);
  },
  true
);

// 버블링 단계 이벤트 리스너
grandparent.addEventListener(&quot;click&quot;, (e) =&gt; {
  console.log(&quot;버블링 - Grandparent&quot;);
});

parent.addEventListener(&quot;click&quot;, (e) =&gt; {
  console.log(&quot;버블링 - Parent&quot;);
});

child.addEventListener(&quot;click&quot;, (e) =&gt; {
  console.log(&quot;버블링 - Child&quot;);
});</code></pre>
<p>버튼 클릭 시 콘솔 출력 순서:</p>
<pre><code>캡처링 - Grandparent
캡처링 - Parent
캡처링 - Child
버블링 - Child
버블링 - Parent
버블링 - Grandparent</code></pre><ul>
<li><strong>캡처링 단계</strong>: 이벤트가 최상위 요소(grandparent)에서 시작하여 아래로 전파</li>
<li><strong>타겟 단계</strong>: 실제 클릭된 요소(child)에 도달</li>
<li><strong>버블링 단계</strong>: 다시 아래에서 위로 전파</li>
</ul>
<p>실제 활용 예시:</p>
<pre><code class="language-javascript">// 이벤트 위임(Event Delegation) 패턴
document.querySelector(&quot;ul&quot;).addEventListener(&quot;click&quot;, function (e) {
  if (e.target.tagName === &quot;LI&quot;) {
    // li 요소가 클릭되었을 때만 처리
    console.log(&quot;리스트 아이템 클릭:&quot;, e.target.textContent);
  }
});</code></pre>
<h2 id="guess-my-number-게임-구현">Guess My Number 게임 구현</h2>
<h3 id="게임-로직">게임 로직</h3>
<ol>
<li>1부터 20 사이의 랜덤 숫자 생성</li>
<li>사용자 입력값과 랜덤 숫자 비교</li>
<li>점수 시스템 구현 (초기 점수: 20)</li>
<li>최고 점수 기록 유지</li>
</ol>
<h3 id="주요-기능">주요 기능</h3>
<pre><code class="language-javascript">// 1. 상태 관리 변수 정의
let secretNumber = Math.trunc(Math.random() * 20) + 1;
let score = 20;
let highscore = 0;

// 2. DOM 요소 선택 - 모든 필요한 요소 선택
const numberEl = document.querySelector(&quot;.number&quot;);
const guessEl = document.querySelector(&quot;.guess&quot;);
const messageEl = document.querySelector(&quot;.message&quot;);
const scoreEl = document.querySelector(&quot;.score&quot;);
const highscoreEl = document.querySelector(&quot;.highscore&quot;);

// 3. 메시지 표시 함수 추가 (코드 재사용성 향상)
const displayMessage = function (message) {
  messageEl.textContent = message;
};

// 4. 클릭 이벤트 핸들러 구현
document.querySelector(&quot;.check&quot;).addEventListener(&quot;click&quot;, function () {
  const guess = Number(guessEl.value);

  // 가이드라인의 게임 로직을 실제 구현
  // 4.1 입력값 검증
  if (!guess) {
    displayMessage(&quot;⛔ 숫자를 입력하세요!&quot;);
  }
  // 4.2 정답 확인
  else if (guess === secretNumber) {
    displayMessage(&quot;🎉 정답입니다!&quot;);
    numberEl.textContent = secretNumber;
    document.body.style.backgroundColor = &quot;#60b347&quot;;
    numberEl.style.width = &quot;30rem&quot;;

    // 최고 점수 업데이트
    if (score &gt; highscore) {
      highscore = score;
      highscoreEl.textContent = highscore;
    }
  }
  // 4.3 오답 처리
  else if (guess !== secretNumber) {
    if (score &gt; 1) {
      displayMessage(
        guess &gt; secretNumber ? &quot;📈 너무 높아요!&quot; : &quot;📉 너무 낮아요!&quot;
      );
      score--;
      scoreEl.textContent = score;
    } else {
      displayMessage(&quot;💥 게임 오버!&quot;);
      scoreEl.textContent = 0;
    }
  }
});</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[엔터티의 개념과 속성, 인스턴스 그리고 도메인]]></title>
            <link>https://velog.io/@seolleung_ee/%EC%97%94%ED%84%B0%ED%8B%B0%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%86%8D%EC%84%B1-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%8F%84%EB%A9%94%EC%9D%B8</link>
            <guid>https://velog.io/@seolleung_ee/%EC%97%94%ED%84%B0%ED%8B%B0%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%86%8D%EC%84%B1-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%8F%84%EB%A9%94%EC%9D%B8</guid>
            <pubDate>Wed, 12 Feb 2025 14:42:09 GMT</pubDate>
            <description><![CDATA[<h2 id="엔터티의-정의">엔터티의 정의</h2>
<ul>
<li>데이터베이스의 구성요소 중 독립적으로 식별가능한 객체(대상)</li>
<li>업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 실체 또는 객체</li>
</ul>
<h2 id="엔터티의-특징">엔터티의 특징</h2>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/1c32c36f-225b-40c8-8c08-85ac20f4add0/image.jpeg" alt=""></p>
<ul>
<li><p>반드시 업무에서 필요하고 관리할 가치가 있는 정보여야 한다. (최소한의 정보로 구성)</p>
</li>
<li><p>엔터티는 식별이 가능하도록 유일한 식별자를 가져야 한다. (e.g. 사번, 학번 등)</p>
</li>
<li><p>영속적으로 존재하는 인스턴스가 두 개 이상인 집합을 이루어야 한다.</p>
<ul>
<li>인스턴스 : 엔터티로 정의된 구조에 맞춰 실제 디스크에 저장된 데이터</li>
</ul>
</li>
<li><p>반드시 업무 프로세스에 사용되어야 한다.</p>
</li>
<li><p>반드시 엔터티의 하위 요소로 속성이 포함되어야 한다. (속성, attribute, 엔터티를 이루는 기본 요소)</p>
</li>
<li><p>엔터티는 다른 엔터티와 최소한 1개 이상의 관계가 있어야 한다.</p>
<ul>
<li>단, 통계성 엔터티와 코드성 엔터티의 경우 관계 생략이 가능하다</li>
</ul>
</li>
</ul>
<h2 id="속성을-부르는-두-영어-단어">속성을 부르는 두 영어 단어</h2>
<ul>
<li>attribute : 엔터티를 이루는 구성 요소</li>
<li>property : 그 객체의 특성</li>
</ul>
<h2 id="인스턴스">인스턴스</h2>
<p>엔터티로 정의된 구조에 맞춰 실제 디스크에 저장된 데이터</p>
<h2 id="엔터티-테이블-relation">엔터티, 테이블, Relation</h2>
<p>셋 다 같은 말이나 엔터티는 논리적 데이터 모델링에서 쓰는 용어
테이블은 물리적 데이터 모델링에서 쓰는 용어</p>
<h2 id="속성의-개념-정의">속성의 개념, 정의</h2>
<ul>
<li><p>엔터티의 하위요소로, 엔터티에 대한 자세하고 구체적인 정보를 나타낸 것</p>
</li>
<li><p>의미상으로 분리되지 않는 최소의 데이터 단위 (Atomic)</p>
</li>
<li><p>속성의 개수에는 제한이 없지만, 처리하고자 하는 업무 프로세스에 꼭 필요한 것 위주로 최소화 필요</p>
</li>
</ul>
<h2 id="속성값">속성값</h2>
<ul>
<li><p>속성이 가질 수 있는 특정값</p>
</li>
<li><p>하나의 엔터티 인스턴스에서 각각의 속성은 하나의 속성값만을 지님</p>
</li>
</ul>
<h2 id="엔터티-속성-인스턴스">엔터티, 속성, 인스턴스</h2>
<ul>
<li><p>한 개의 엔터티는 두 개 이상의 인스턴스를 가진다. (인스턴스의 집합)</p>
</li>
<li><p>한 개의 엔터티는 두 개 이상의 속성을 가진다.</p>
</li>
<li><p>한 개의 속성은 한 개의 속성값을 가진다.</p>
</li>
<li><p>속성은 정규화 이론에 따라 주식별자에 함수적 종속성을 가져야 한다.</p>
<ul>
<li>주식별자가 변경될 때마다 속성값도 달라짐 : 함수적 종속성을 가짐 (결정자와 종속자)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/88dc2c2c-a2e7-4b5f-8a2c-c45e6a91b5e4/image.jpeg" alt=""></p>
<h2 id="속성의-분류">속성의 분류</h2>
<h3 id="특성에-따른-분류-시험에-잘나옴">특성에 따른 분류 (시험에 잘나옴)</h3>
<h4 id="1-기본-속성-basic-attribute">1. 기본 속성 (Basic Attribute)</h4>
<ul>
<li>엔터티가 원래 본래부터 가지고 있어야 하는 속성</li>
<li>엔터티가 만들어지면서부터 기본으로 가지고 있을 법한 속성</li>
<li>업무 분석을 통해 바로 정의가 가능한 속성이기도 함</li>
</ul>
<h4 id="2-설계-속성-designed-attribute">2. 설계 속성 (Designed Attribute)</h4>
<ul>
<li>원래 존재하는 속성은 아니였지만 시스템을 구축하면서 설계하면서 필요하게 되어 도출된 속성</li>
<li>엔터티가 본래부터 가지고 있던 속성은 아니지만 설계시 필요하다고 판단되어짐</li>
</ul>
<h4 id="3-파생-속성-derived-attribute">3. 파생 속성 (Derived Attribute)</h4>
<ul>
<li>다른 속성으로부터 계산되거나 변형되어 생성되는 속성</li>
<li>기본 속성에서 2차적으로 도출된 속성 (특정 규칙에 의해서)</li>
</ul>
<h3 id="엔터티-구성-방식에-따른-분류">엔터티 구성 방식에 따른 분류</h3>
<ul>
<li>PK (Primary Key) 속성</li>
<li>FK (Foreign Key) 속성</li>
<li>일반 속성</li>
</ul>
<h2 id="도메인-domain">도메인 (Domain)</h2>
<ul>
<li>속성이 가질 수 있는 값의 범위 (값의 데이터 타입과 크기 등의 조건) 를 정의한 것</li>
<li>도메인이 지정된 속성은 해당 도메인의 데이터 타입, 크기, 제약사항 등을 따른다.</li>
<li>예: 주소 속성의 도메인은 VARCHAR(255)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript  for, while 그리고 고차함수 정리]]></title>
            <link>https://velog.io/@seolleung_ee/Javascript-for-while-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@seolleung_ee/Javascript-for-while-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 11 Feb 2025 13:44:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/2f38502b-6b13-417a-a659-43c626faafa9/image.jpg" alt=""></p>
<h2 id="for-반복문">for 반복문</h2>
<p>for 반복문은 JavaScript에서 가장 기본적이고 널리 사용되는 반복문입니다. 초기값, 조건식, 증감식으로 구성되며, 조건이 참인 동안 코드 블록을 반복 실행합니다.</p>
<pre><code class="language-javascript">// 기본 for문 예시
for (let i = 1; i &lt;= 5; i++) {
  console.log(`${i}번째 실행`);
}

// 배열 순회하기
const fruits = [&quot;사과&quot;, &quot;바나나&quot;, &quot;오렌지&quot;];
for (let i = 0; i &lt; fruits.length; i++) {
  console.log(fruits[i]);
}</code></pre>
<h2 id="break와-continue">break와 continue</h2>
<p>반복문을 제어하는 두 가지 중요한 키워드가 있습니다:</p>
<ul>
<li><code>break</code>: 반복문을 즉시 종료</li>
<li><code>continue</code>: 현재 반복을 건너뛰고 다음 반복으로 진행</li>
</ul>
<pre><code class="language-javascript">const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// continue로 짝수만 출력하기
for (let i = 0; i &lt; numbers.length; i++) {
  if (numbers[i] % 2 !== 0) continue;
  console.log(numbers[i]); // 2, 4, 6, 8, 10
}

// break로 원하는 값을 찾으면 종료하기
for (let i = 0; i &lt; numbers.length; i++) {
  if (numbers[i] === 5) break;
  console.log(numbers[i]); // 1, 2, 3, 4
}</code></pre>
<h2 id="다양한-반복문-패턴">다양한 반복문 패턴</h2>
<h3 id="역순-순회">역순 순회</h3>
<pre><code class="language-javascript">const numbers = [1, 2, 3, 4, 5];
for (let i = numbers.length - 1; i &gt;= 0; i--) {
  console.log(numbers[i]); // 5, 4, 3, 2, 1
}</code></pre>
<h3 id="중첩-반복문">중첩 반복문</h3>
<pre><code class="language-javascript">// 구구단 출력
for (let i = 2; i &lt;= 9; i++) {
  for (let j = 1; j &lt;= 9; j++) {
    console.log(`${i} x ${j} = ${i * j}`);
  }
}</code></pre>
<h2 id="while-반복문">while 반복문</h2>
<p>while문은 조건식만으로 반복을 제어합니다. 반복 횟수가 불명확할 때 유용합니다.</p>
<pre><code class="language-javascript">// 기본 while문
let count = 1;
while (count &lt;= 5) {
  console.log(`${count}번째 실행`);
  count++;
}

// 실전 예시: 주사위 게임
let dice = Math.floor(Math.random() * 6) + 1;
while (dice !== 6) {
  console.log(`주사위: ${dice}`);
  dice = Math.floor(Math.random() * 6) + 1;
}
console.log(&quot;6이 나왔습니다!&quot;);</code></pre>
<h2 id="모던-javascript의-배열-고차함수">모던 JavaScript의 배열 고차함수</h2>
<p>최신 JavaScript에서는 배열을 더 우아하게 다룰 수 있는 다양한 메서드를 제공합니다.</p>
<pre><code class="language-javascript">const numbers = [1, 2, 3, 4, 5];
const users = [
  { id: 1, name: &quot;김철수&quot;, age: 25 },
  { id: 2, name: &quot;이영희&quot;, age: 28 },
  { id: 3, name: &quot;박지성&quot;, age: 32 },
];

// map: 배열 변환
const doubled = numbers.map((num) =&gt; num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

// filter: 조건부 필터링
const adults = users.filter((user) =&gt; user.age &gt;= 30);

// find: 조건에 맞는 첫 번째 요소 찾기
const user = users.find((user) =&gt; user.age &gt; 30);

// reduce: 값 누적하기
const sum = numbers.reduce((acc, cur) =&gt; acc + cur, 0);

// forEach: 단순 반복
users.forEach((user) =&gt; {
  console.log(`${user.name}님은 ${user.age}세입니다.`);
});

// some과 every: 조건 검사
const hasAdult = users.some((user) =&gt; user.age &gt;= 30);
const allAdults = users.every((user) =&gt; user.age &gt;= 20);</code></pre>
<h3 id="메서드-체이닝">메서드 체이닝</h3>
<p>고차함수들은 체이닝을 통해 복잡한 데이터 처리를 간단히 표현할 수 있습니다.</p>
<pre><code class="language-javascript">// 30세 이상 사용자의 이름만 추출하기
const adultNames = users
  .filter((user) =&gt; user.age &gt;= 30)
  .map((user) =&gt; user.name);
console.log(adultNames); // [&#39;박지성&#39;]</code></pre>
<h3 id="고차함수의-장점">고차함수의 장점</h3>
<ul>
<li>코드가 더 선언적이고 이해하기 쉬워집니다</li>
<li>메서드 체이닝으로 복잡한 로직을 단순화할 수 있습니다</li>
<li>불변성을 유지하여 예측 가능한 코드를 작성할 수 있습니다</li>
</ul>
<h2 id="lodash-vs-내장-배열-메서드">Lodash vs 내장 배열 메서드</h2>
<p>실무에서 Lodash를 쓸지 내장 메서드를 쓸지 항상 고민되는데요. 제가 실제 개발하면서 느낀 장단점을 정리해봤습니다.</p>
<pre><code class="language-javascript">const _ = require(&quot;lodash&quot;);

// 테스트용 더미 데이터
const users = [
  { id: 1, name: &quot;김철수&quot;, age: 25, active: true },
  { id: 2, name: &quot;이영희&quot;, age: 28, active: false },
  { id: 3, name: &quot;박지성&quot;, age: 32, active: true },
];

const numbers = [1, 2, 3, null, 4, undefined, 5];
const obj = { a: 1, b: 2 };

// 1. null/undefined 처리
// Lodash가 null/undefined 처리에 안전
console.log(_.map(numbers, (n) =&gt; n * 2)); // [2, 4, 6, 0, 8, 0, 10]
console.log(numbers.map((n) =&gt; n * 2)); // [2, 4, 6, 0, 8, NaN, 10] - NaN 주의!

// 2. 객체 다루기
// Lodash는 한 줄로 끝나는데
console.log(_.map(obj, (value, key) =&gt; `${key}: ${value}`)); // [&quot;a: 1&quot;, &quot;b: 2&quot;]
// 내장 메서드는 이렇게 해야 됨
console.log(Object.entries(obj).map(([k, v]) =&gt; `${k}: ${v}`));

// 3. 빈 값 체크할 때
// Lodash는 그냥 isEmpty 하나로 다 됨
console.log(_.isEmpty([])); // true
console.log(_.isEmpty({})); // true
console.log(_.isEmpty(&quot;&quot;)); // true
console.log(_.isEmpty(null)); // true

// 내장 메서드는 타입마다 다르게 체크해야 힘
console.log([].length === 0); // 배열
console.log(Object.keys({}).length === 0); // 객체

// 4. 중첩 객체 다룰 때
// Lodash의 get은 진짜 편함
const deepObj = { a: { b: { c: 3 } } };
console.log(_.get(deepObj, &quot;a.b.c&quot;)); // 3
console.log(_.get(deepObj, &quot;a.b.d&quot;, 0)); // 없으면 기본값 반환

// 옵셔널 체이닝으로 어느 정도 커버되긴 함
console.log(deepObj?.a?.b?.c); // 3</code></pre>
<h3 id="lodash-쓰면-좋은-경우">Lodash 쓰면 좋은 경우</h3>
<ol>
<li><p><strong>데이터가 불안정할 때</strong></p>
<ul>
<li>null/undefined 알아서 처리해줌</li>
<li>타입 에러로 안정성 확보</li>
</ul>
</li>
<li><p><strong>복잡한 데이터 다룰 때</strong></p>
<ul>
<li>중첩 객체? <code>_.get</code>으로 끝</li>
<li>정렬, 그룹핑도 한 줄로 가능</li>
<li>함수형으로 깔끔하게 처리 가능</li>
</ul>
</li>
<li><p><strong>IE 등 레거시 브라우저 지원할 때</strong></p>
<ul>
<li>브라우저 호환성 걱정 없음</li>
<li>동작도 일관적</li>
</ul>
</li>
</ol>
<h3 id="내장-메서드-쓰면-좋은-경우">내장 메서드 쓰면 좋은 경우</h3>
<ol>
<li><p><strong>간단한 배열 작업</strong></p>
<ul>
<li>map, filter 정도면 충분</li>
<li>성능도 좀 더 좋음 (큰 차이는 아닌 듯)</li>
</ul>
</li>
<li><p><strong>번들 사이즈 신경쓸 때</strong></p>
<ul>
<li>Lodash는 크기가 좀 있음</li>
</ul>
</li>
<li><p><strong>모던 자바스크립트 쓸 수 있을 때</strong></p>
<ul>
<li>옵셔널 체이닝</li>
<li>null 병합</li>
<li>스프레드 연산자</li>
</ul>
</li>
</ol>
<h3 id="실무에서는-이렇게">실무에서는 이렇게</h3>
<pre><code class="language-javascript">// 이렇게 필요한 것만 가져다 쓰세요
import { map, isEmpty } from &quot;lodash&quot;;

// 이렇게 통째로 임포트하면 번들 사이즈 커져요
import _ from &quot;lodash&quot;; // 안티패턴

// 간단한 건 그냥 내장 메서드로
const simpleArray = [1, 2, 3, 4, 5];
const doubled = simpleArray.map((x) =&gt; x * 2);

// 복잡한 건 Lodash가 편해요
const complexData = [{ user: { details: { age: 25 } } }];
const ages = _.map(complexData, &quot;user.details.age&quot;);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 모델링의 개념과 특징, 유의사항, 모델링과 스키마의 3단계]]></title>
            <link>https://velog.io/@seolleung_ee/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%ED%8A%B9%EC%A7%95-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD-%EB%AA%A8%EB%8D%B8%EB%A7%81%EA%B3%BC-%EC%8A%A4%ED%82%A4%EB%A7%88%EC%9D%98-3%EB%8B%A8%EA%B3%84</link>
            <guid>https://velog.io/@seolleung_ee/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%ED%8A%B9%EC%A7%95-%EC%9C%A0%EC%9D%98%EC%82%AC%ED%95%AD-%EB%AA%A8%EB%8D%B8%EB%A7%81%EA%B3%BC-%EC%8A%A4%ED%82%A4%EB%A7%88%EC%9D%98-3%EB%8B%A8%EA%B3%84</guid>
            <pubDate>Mon, 10 Feb 2025 14:02:10 GMT</pubDate>
            <description><![CDATA[<h2 id="모델링-modeling-">모델링 (Modeling) :</h2>
<h3 id="모델링의-정의">모델링의 정의</h3>
<ul>
<li><p>실물에 대한 상대적인 개념, 실물이 아님, 실물을 간략하게 표현한 것, 실물을 축소한 것</p>
</li>
<li><p>실물이 될 구성 요소를 분해하여 이 중 꼭 필요한 요소만 가지고 표현한 것</p>
</li>
<li><p>구축하고자 하는 정보시스템에 맞게, 현실세계의 데이터를 약속된 표기법으로 표현한 것</p>
<ul>
<li>그림, 기호, 수식 등이 약속된 표기법에 해당</li>
</ul>
</li>
<li><p>업무의 흐름 또는 업무의 대상을 가시화, 명세화</p>
</li>
<li><p>정보시스템을 구축하기 위한 분석과 설계 과정의 일환</p>
</li>
</ul>
<h3 id="모델링의-종류">모델링의 종류</h3>
<table>
<thead>
<tr>
<th>유형</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>정보시스템 모델링</td>
<td>- 정보 모델링<br>- 데이터 모델링<br>- 프로세스 모델링</td>
</tr>
<tr>
<td>수리 모델링</td>
<td></td>
</tr>
<tr>
<td>통계 (확률) 모델링</td>
<td></td>
</tr>
<tr>
<td>회로 모델링</td>
<td></td>
</tr>
</tbody></table>
<ul>
<li><p>데이터 모델링</p>
<ul>
<li>복잡한 데이터를 컴퓨터 저장 구조로 변환하는 과정</li>
<li>정보 시스템 구축을 위해 데이터 관점에서 업무를 분석하고, 현실의 데이터를 약속된 표기법으로 표현하는 과정</li>
</ul>
</li>
</ul>
<h3 id="모델링의-특징">모델링의 특징</h3>
<table>
<thead>
<tr>
<th>특징</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>추상화</strong></td>
<td>특정 표기법에 의해 중요한 요소만 간략히 표현</td>
</tr>
<tr>
<td><strong>단순화</strong></td>
<td>특정한 약속에 따라 쉽게 이해할 수 있게 표현</td>
</tr>
<tr>
<td><strong>명확화</strong></td>
<td>누구나 이해하기 쉽도록 애매함을 제거</td>
</tr>
</tbody></table>
<ul>
<li><p>추상화 : 특정 표기법에 의해 중요한 요소만 간략히 표현 (특징을 추려서 표현)</p>
</li>
<li><p>단순화 : 특정한 약속 (특정 표기법)에 따라 쉽게 이해할 수 있게 단순화</p>
</li>
<li><p>명확화 : 누구나 이해하기 쉽도록 애매함을 제거, 명확하게 현상을 기술하여 모델링을 본 사람들이 똑같은 방향으로 이해할 수 있게 명확화</p>
</li>
</ul>
<h3 id="데이터-모델링-시-유의점">데이터 모델링 시 유의점</h3>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/500218d5-76d5-4f38-90a1-1f72c0dbe55f/image.jpeg" alt=""></p>
<ul>
<li><p>중복 최소화 :</p>
<ul>
<li>여러 위치에 같은 정보를 저장하지 않게</li>
</ul>
</li>
<li><p>비유연성 최소화 :</p>
<ul>
<li>데이터를 정의하는 부분 + 데이터를 사용, 처리하는 프로세스 이 둘이 묶여 있는 것을 분리</li>
<li>업무 변화가 있을 때마다 데이터 모델링을 수정해야 한다면 데이터와 프로세스가 서로 종속적이여서 유연성이 떨어지므로 이를 최소화하고 유연성을 높이는 것이 중요</li>
</ul>
</li>
<li><p>비일관성 최소화 :</p>
<ul>
<li>분명 같은 데이터인데 테이블A 에는 &quot;철수&quot; 가 저장되어 있고 테이블 B 에는 &quot;철구&quot; 가 저장되어 있음</li>
<li>정규화 요함 (엔터티를 쪼개는 행위)</li>
</ul>
</li>
</ul>
<h3 id="데이터-모델링의-3단계">데이터 모델링의 3단계</h3>
<table>
<thead>
<tr>
<th>단계</th>
<th>특징</th>
<th>주요 내용</th>
</tr>
</thead>
<tbody><tr>
<td><strong>개념적 데이터 모델링</strong></td>
<td>가장 높은 추상화 수준</td>
<td>- 전사적 차원의 모델링<br>- EA 수립<br>- 엔터티와 속성 도출</td>
</tr>
<tr>
<td><strong>논리적 데이터 모델링</strong></td>
<td>시스템 구축 중심</td>
<td>- 키, 속성, 관계 표현<br>- 정규화<br>- 식별자 도출</td>
</tr>
<tr>
<td><strong>물리적 데이터 모델링</strong></td>
<td>실제 구현 중심</td>
<td>- DBMS 특성 반영<br>- 성능 최적화<br>- 반정규화 고려</td>
</tr>
</tbody></table>
<h4 id="1-개념적-데이터-모델링">1. 개념적 데이터 모델링</h4>
<ul>
<li>추상화 수준이 가장 높고 업무 중심적이며 포괄적인 수준의 모델링 진행</li>
<li>전사적 차원의 모델링, EA (Enterprise Architecture) 수립</li>
<li>개념적 데이터 모델링을 통해 엔터티와 속성 도출</li>
</ul>
<h4 id="2-논리적-데이터-모델링">2. 논리적 데이터 모델링</h4>
<ul>
<li>시스템 구축을 위한 키 (Key), 속성, 관계 등을 정확하게 표현하며, 높은 재사용성을 가짐</li>
<li>정규화를 통해 중복 데이터를 최소화</li>
<li>속성을 통해 식별자를 도출하고 엔터티 간의 관계를 정의</li>
</ul>
<h4 id="3-물리적-데이터-모델링">3. 물리적 데이터 모델링</h4>
<ul>
<li>성능, 저장 등 물리적인 성격을 고려하여 실제 데이터베이스 구성을 설계</li>
<li>특정 DBMS 에 맞추어 구현이 가능한 수준에서 모델링 진행</li>
<li>DBMS 의 성능, 보안, 가용성 등을 고려해 설계</li>
<li>물리적 데이터에서는 성능을 중시하므로 &quot;반정규화&quot; 를 한다.</li>
</ul>
<h3 id="데이터-독립성과-3단계-스키마">데이터 독립성과 3단계 스키마</h3>
<table>
<thead>
<tr>
<th>스키마 단계</th>
<th>관점</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td><strong>외부 스키마</strong></td>
<td>사용자 관점</td>
<td>- 다중 사용자 뷰 제공<br>- Sub/View 스키마</td>
</tr>
<tr>
<td><strong>개념 스키마</strong></td>
<td>설계자 관점</td>
<td>- 통합된 뷰 제공<br>- 전체 DB 구조 정의</td>
</tr>
<tr>
<td><strong>내부 스키마</strong></td>
<td>개발자 관점</td>
<td>- 물리적 뷰 제공<br>- 실제 저장 구조 정의</td>
</tr>
</tbody></table>
<p>스키마는 구조이다.</p>
<h4 id="1-외부-스키마-external-schema">1. 외부 스키마 (External Schema)</h4>
<ul>
<li>사용자나 응용프로그래머가 개인의 관점에서 필요로 하는 데이터베이스의 논리적 구조</li>
<li>전체 데이터베이스의 한 논리적인 부분으로 볼 수 있음</li>
<li>여러 개의 사용자 뷰를 가질 수 있음</li>
<li>Sub Schema 또는 User View라고도 함</li>
</ul>
<h4 id="2-개념-스키마-conceptual-schema">2. 개념 스키마 (Conceptual Schema)</h4>
<ul>
<li>조직체 전체의 관점에서 데이터베이스의 논리적 구조를 정의</li>
<li>모든 응용프로그램이나 사용자들이 필요로 하는 데이터를 통합한 조직 전체의 데이터베이스 구조</li>
<li>개체 간의 관계, 제약조건, 접근권한, 보안정책, 무결성 규정에 관한 명세를 포함</li>
<li>단 하나만 존재</li>
</ul>
<h4 id="3-내부-스키마-internal-schema">3. 내부 스키마 (Internal Schema)</h4>
<ul>
<li>물리적 저장장치의 입장에서 본 데이터베이스 구조</li>
<li>실제로 데이터베이스에 저장될 레코드의 형식을 정의</li>
<li>저장 데이터 항목의 표현방법, 내부 레코드의 물리적 순서 등을 나타냄</li>
<li>시스템 프로그래머나 DBA가 보는 관점</li>
</ul>
<h3 id="논리적-독립성과-물리적-독립성">논리적 독립성과 물리적 독립성</h3>
<blockquote>
<p>안쪽 스키마의 내용이 바뀌여도 바깥쪽 스키마에 영향을 끼치지 않는 것이 핵심
시스템의 의존성을 낮춘다는 의미와도 비슷, 각 계층별 의존성을 낮춤</p>
</blockquote>
<table>
<thead>
<tr>
<th>독립성 유형</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>논리적 독립성</strong></td>
<td>개념 스키마가 변경되어도 외부 스키마 영향 없음</td>
</tr>
<tr>
<td><strong>물리적 독립성</strong></td>
<td>내부 스키마가 변경되어도 외부/개념 스키마 영향 없음</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/575a21a7-5e39-4095-a544-bbd1f2e5821e/image.jpeg" alt=""></p>
<h4 id="1-논리적-독립성">1. 논리적 독립성</h4>
<ul>
<li>개념 스키마 (안쪽) 가 변경되어도 외부 스키마에는 영향을 미치지 않도록 지원하는 것</li>
<li>논리적 구조가 변경되어도 응용프로그램에는 영향이 없음</li>
</ul>
<h4 id="2-물리적-독립성">2. 물리적 독립성</h4>
<ul>
<li>내부 스키마 (안쪽) 가 변경되어도 외부 및 개념 스키마에 영향을 미치지 않도록 지원하는 것</li>
<li>저장 장치의 구조 변경이 응용 프로그램과 개념 스키마에 영향을 주지 않음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript의 배열과 객체 그리고 메서드]]></title>
            <link>https://velog.io/@seolleung_ee/JavaScript%EC%9D%98-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EA%B0%9D%EC%B2%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@seolleung_ee/JavaScript%EC%9D%98-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EA%B0%9D%EC%B2%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Sun, 09 Feb 2025 14:46:44 GMT</pubDate>
            <description><![CDATA[<h1 id="javascript의-배열과-객체">JavaScript의 배열과 객체</h1>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/03c3b00c-2923-40a5-9da8-af4d3888be9e/image.jpg" alt=""></p>
<h2 id="원시-자료형과의-차이">원시 자료형과의 차이</h2>
<blockquote>
<p>💡 <strong>핵심 개념</strong>: 원시 자료형은 값을 직접 저장하고, 배열/객체는 주소값을 저장합니다.</p>
</blockquote>
<pre><code class="language-javascript">// 원시 자료형 예시
let a = 1;
let b = a; // 값 복사
b = 2;
console.log(a); // 1 (영향 없음)

// 참조형 예시
let arr1 = [1, 2, 3];
let arr2 = arr1; // 주소 복사
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4] (arr1도 변경됨!)</code></pre>
<h2 id="배열-array">배열 (Array)</h2>
<p>배열은 데이터를 순서대로 저장하는 자료구조입니다.</p>
<h3 id="배열-만들기">배열 만들기</h3>
<pre><code class="language-javascript">// 1. 배열 리터럴 (가장 일반적)
const fruits = [&quot;사과&quot;, &quot;바나나&quot;, &quot;오렌지&quot;];

// 2. Array 생성자
const numbers = new Array(1, 2, 3);

// 3. Array.from()
const chars = Array.from(&quot;hello&quot;); // [&#39;h&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;]</code></pre>
<h3 id="배열-다루기">배열 다루기</h3>
<pre><code class="language-javascript">const arr = [&quot;첫번째&quot;, &quot;두번째&quot;, &quot;세번째&quot;];

// 읽기
console.log(arr[0]); // &quot;첫번째&quot;

// 수정
arr[1] = &quot;새로운 두번째&quot;;

// 추가
arr.push(&quot;마지막에 추가&quot;); // 끝에 추가
arr.unshift(&quot;맨 앞에 추가&quot;); // 앞에 추가

// 삭제
arr.pop(); // 마지막 요소 삭제
arr.shift(); // 첫 요소 삭제</code></pre>
<h2 id="객체-object">객체 (Object)</h2>
<p>객체는 관련된 데이터를 키-값 쌍으로 저장합니다.</p>
<h3 id="기본-객체-만들기">기본 객체 만들기</h3>
<pre><code class="language-javascript">const person = {
  name: &quot;김코딩&quot;,
  age: 25,
  isStudent: true,
};</code></pre>
<h3 id="객체-속성-접근하기-🔑">객체 속성 접근하기 🔑</h3>
<h4 id="1-점-표기법-dot-notation">1. 점 표기법 (Dot Notation)</h4>
<pre><code class="language-javascript">console.log(person.name); // &quot;김코딩&quot;</code></pre>
<ul>
<li>✅ <strong>사용할 수 있는 경우</strong>:<ul>
<li>유효한 JavaScript 식별자인 속성 이름</li>
<li>문자로 시작하고</li>
<li>문자, 숫자, <code>_</code>, <code>$</code>만 포함</li>
</ul>
</li>
</ul>
<h4 id="2-대괄호-표기법-bracket-notation">2. 대괄호 표기법 (Bracket Notation)</h4>
<pre><code class="language-javascript">const user = {
  // 특수문자를 포함한 속성 이름
  &quot;user-id&quot;: &quot;abc123&quot;,
  // 공백을 포함한 속성 이름
  &quot;favorite color&quot;: &quot;blue&quot;,
  // 숫자로 시작하는 속성 이름
  123: &quot;number key&quot;,
  // 일반적인 속성 이름 (이것도 대괄호로 접근 가능)
  name: &quot;Kim&quot;,
};

// 특수문자가 있는 경우
console.log(user[&quot;user-id&quot;]); // &quot;abc123&quot;

// 공백이 있는 경우
console.log(user[&quot;favorite color&quot;]); // &quot;blue&quot;

// 숫자로 시작하는 경우
console.log(user[&quot;123&quot;]); // &quot;number key&quot;

// 변수를 사용하여 접근할 때
const propertyName = &quot;name&quot;;
console.log(user[propertyName]); // &quot;Kim&quot;

// ❌ 점 표기법으로는 접근 불가능
// console.log(user.user-id); // 에러: undefined - id
// console.log(user.favorite color); // 문법 에러
// console.log(user.123); // 문법 에러</code></pre>
<h4 id="속성-이름-규칙-정리-📝">속성 이름 규칙 정리 📝</h4>
<ol>
<li><strong>모든 문자열</strong>은 속성 이름으로 사용 가능</li>
<li><strong>점 표기법</strong>은 유효한 식별자인 경우만 사용 가능</li>
<li><strong>대괄호 표기법</strong>은 모든 경우에 사용 가능</li>
<li>가능하면 <strong>점 표기법</strong>을 사용하는 것이 가독성에 좋음</li>
<li>특수한 경우에만 <strong>대괄호 표기법</strong> 사용 권장</li>
</ol>
<h3 id="this-키워드-이해하기-🎯">this 키워드 이해하기 🎯</h3>
<p><code>this</code>는 &quot;현재 객체&quot;를 가리키는 특별한 키워드입니다.</p>
<pre><code class="language-javascript">const counter = {
  count: 0,

  // 일반 함수: this가 counter를 가리킴
  increase() {
    this.count += 1;
  },

  // ⚠️ 화살표 함수: this가 다르게 동작
  decreaseArrow: () =&gt; {
    this.count -= 1; // 주의! 여기서 this는 counter가 아닐 수 있음
  },
};

counter.increase();
console.log(counter.count); // 1</code></pre>
<h4 id="this-사용-시-주의사항">this 사용 시 주의사항</h4>
<ol>
<li>일반 함수에서는 <code>this</code>가 해당 객체를 가리킴</li>
<li>화살표 함수에서는 <code>this</code>가 외부 스코프의 <code>this</code>를 가리킴</li>
<li>메서드는 가능하면 일반 함수로 정의하는 것이 안전</li>
</ol>
<h3 id="객체에-메서드-추가하기-🛠️">객체에 메서드 추가하기 🛠️</h3>
<p>객체에 함수를 추가하는 방법에는 세 가지가 있습니다:</p>
<pre><code class="language-javascript">const calculator = {
  // 1. 메서드 축약 표현 (권장)
  add(a, b) {
    return a + b;
  },

  // 2. 함수 표현식
  subtract: function (a, b) {
    return a - b;
  },

  // 3. 화살표 함수
  multiply: (a, b) =&gt; a * b,
};

console.log(calculator.add(2, 3)); // 5
console.log(calculator.subtract(5, 2)); // 3
console.log(calculator.multiply(4, 2)); // 8</code></pre>
<h4 id="메서드-정의-시-주의사항-⚠️">메서드 정의 시 주의사항 ⚠️</h4>
<ol>
<li><p><strong>메서드 축약 표현</strong> (추천)</p>
<ul>
<li>함수 표현식보다는 좀 더 깔끔한 문법</li>
<li><code>this</code> 바인딩이 올바르게 동작</li>
</ul>
</li>
<li><p><strong>함수 표현식</strong></p>
<ul>
<li>전통적인 방식</li>
<li><code>this</code> 바인딩이 올바르게 동작</li>
<li>더 긴 문법</li>
</ul>
</li>
<li><p><strong>화살표 함수</strong></p>
<ul>
<li>간결한 문법</li>
<li>⚠️ <code>this</code> 바인딩이 다르게 동작</li>
<li>객체의 메서드로는 권장하지 않음</li>
</ul>
</li>
</ol>
<h3 id="화살표-함수와-this-이해하기-쉽게-설명하기-🎯">화살표 함수와 this 이해하기 쉽게 설명하기 🎯</h3>
<h4 id="일반-함수의-this">일반 함수의 this</h4>
<p>일반 함수에서 <code>this</code>는 &quot;누가 이 함수를 실행했는지&quot;를 가리킵니다. 마치 &quot;나를 부른 사람&quot;을 가리키는 것과 같습니다.</p>
<pre><code class="language-javascript">const house = {
  owner: &quot;Kim&quot;,

  // 일반 함수
  greet() {
    console.log(`Hello! This is ${this.owner}&#39;s house!`);
  },
};

house.greet(); // &quot;Hello! This is Kim&#39;s house!&quot;
// &#39;house&#39;가 greet을 호출했으므로, this는 &#39;house&#39;를 가리킴</code></pre>
<h4 id="화살표-함수의-this">화살표 함수의 this</h4>
<p>화살표 함수는 자신만의 <code>this</code>를 가지지 않고, 함수가 정의될 때 둘러싸고 있는 스코프의 <code>this</code>를 그대로 사용합니다.</p>
<pre><code class="language-javascript">// 전역 스코프에서 객체를 정의할 때
const school = {
  student: &quot;Park&quot;,

  // 이 화살표 함수는 전역 스코프에서 정의됨
  introduce: () =&gt; {
    console.log(`Hello! I am ${this.student}!`);
    // 여기서 this는 전역 객체(window)를 가리킴
  },
};

// 반면, 일반 함수 내부에서 화살표 함수를 정의하면 다르게 동작
const classroom = {
  teacher: &quot;Kim&quot;,
  students: [&quot;Park&quot;, &quot;Lee&quot;],

  // 일반 함수
  startClass() {
    // 이 화살표 함수는 startClass 함수 내부에서 정의됨
    this.students.forEach((student) =&gt; {
      console.log(`${this.teacher} is teaching ${student}`);
      // 여기서 this는 classroom을 가리킴 (startClass의 this를 그대로 사용)
    });
  },
};

classroom.startClass();
// &quot;Kim is teaching Park&quot;
// &quot;Kim is teaching Lee&quot;</code></pre>
<h4 id="왜-이렇게-동작할까요-🤔">왜 이렇게 동작할까요? 🤔</h4>
<ol>
<li><strong>객체 리터럴은 새로운 스코프를 만들지 않습니다</strong></li>
</ol>
<pre><code class="language-javascript">const obj = {
  name: &quot;Kim&quot;,
  // 이 화살표 함수는 객체 안에 있지만,
  // 실제로는 전역 스코프에서 정의됨
  sayHi: () =&gt; {
    console.log(this.name); // undefined
  },
};</code></pre>
<ol start="2">
<li><strong>함수는 새로운 스코프를 만듭니다</strong></li>
</ol>
<pre><code class="language-javascript">const obj = {
  name: &quot;Kim&quot;,
  // 일반 함수는 새로운 스코프를 만듦
  sayHi() {
    // 이 화살표 함수는 sayHi 함수 스코프 안에서 정의됨
    const arrow = () =&gt; {
      console.log(this.name); // &quot;Kim&quot;
    };
    arrow();
  },
};</code></pre>
<h4 id="정리하면-📝">정리하면 📝</h4>
<ul>
<li>화살표 함수는 자신이 <strong>실제로 정의된 스코프</strong>의 <code>this</code>를 사용</li>
<li>객체 리터럴은 새로운 스코프를 만들지 않음</li>
<li>따라서 객체의 메서드로 직접 화살표 함수를 사용하면, <code>this</code>는 전역 객체를 가리킴</li>
<li>하지만 일반 함수 안에서 화살표 함수를 사용하면, 그 함수의 <code>this</code>를 그대로 사용할 수 있음</li>
</ul>
<h2 id="배열-vs-객체-비교">배열 vs 객체 비교</h2>
<table>
<thead>
<tr>
<th>특징</th>
<th>배열</th>
<th>객체</th>
</tr>
</thead>
<tbody><tr>
<td>접근 방식</td>
<td>숫자 인덱스</td>
<td>키(문자열)</td>
</tr>
<tr>
<td>순서</td>
<td>순서 있음</td>
<td>순서 없음</td>
</tr>
<tr>
<td>용도</td>
<td>비슷한 데이터 모음</td>
<td>관련 데이터/동작 그룹화</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 함수 선언식, 표현식 그리고 화살표 함수]]></title>
            <link>https://velog.io/@seolleung_ee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8%EC%8B%9D-%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@seolleung_ee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8%EC%8B%9D-%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sat, 08 Feb 2025 14:45:24 GMT</pubDate>
            <description><![CDATA[<h1 id="자바스크립트-함수-정의-방식">자바스크립트 함수 정의 방식</h1>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/33af7db2-8624-4ec8-8588-082f3a0cfd66/image.jpeg" alt=""></p>
<h2 id="1-함수-선언식-function-declaration">1. 함수 선언식 (Function Declaration)</h2>
<p>가장 기본적이고 일반적인 함수 만드는 방법입니다.</p>
<pre><code class="language-javascript">function greet(name) {
  return `Hello ${name}!`;
}

// 호이스팅 예시 - 함수 선언 전에도 호출 가능
console.log(greet(&quot;John&quot;)); // &quot;Hello John!&quot; 출력</code></pre>
<p>특징:</p>
<ul>
<li>어디서든 사용 가능 (코드 위치 상관없이)</li>
<li>이해하기 쉽고 읽기 쉬움</li>
</ul>
<h2 id="2-함수-표현식-function-expression">2. 함수 표현식 (Function Expression)</h2>
<p>함수를 변수에 담아서 사용하는 방법입니다.</p>
<pre><code class="language-javascript">const multiply = function (a, b) {
  return a * b;
};

// 반드시 함수를 선언한 후에 사용해야 함
console.log(multiply(2, 3)); // 6 출력</code></pre>
<p>특징:</p>
<ul>
<li>변수에 할당되므로 유연하게 사용 가능</li>
<li>다른 함수의 인자로 전달할 때 유용</li>
</ul>
<h2 id="3-화살표-함수-arrow-function">3. 화살표 함수 (Arrow Function)</h2>
<p>더 짧게 쓸 수 있는 최신 (ES6) 함수 작성 방법입니다.</p>
<pre><code class="language-javascript">const add = (a, b) =&gt; a + b;

// 여러 줄 코드가 필요할 때
const calculate = (a, b) =&gt; {
  const sum = a + b;
  return sum * 2;
};</code></pre>
<p>특징:</p>
<ul>
<li>코드가 짧고 간단함</li>
<li>한 줄 코드는 return 생략 가능</li>
</ul>
<h2 id="주요-차이점-설명">주요 차이점 설명</h2>
<h3 id="1-호이스팅-hoisting">1. 호이스팅 (Hoisting)</h3>
<p>호이스팅은 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 것처럼 동작하는 특성입니다.</p>
<pre><code class="language-javascript">// 함수 선언식: 선언과 동시에 초기화되어 사용 가능
console.log(greeting(&quot;John&quot;)); // &quot;Hello John!&quot; 출력
function greeting(name) {
  return `Hello ${name}!`;
}

// 함수 표현식: 선언 전에 사용 불가
console.log(multiply(2, 3)); // ReferenceError
const multiply = function (a, b) {
  return a * b;
};</code></pre>
<h3 id="2-사용하기-좋은-상황">2. 사용하기 좋은 상황</h3>
<p>함수의 선언은 보통 개발자의 취향을 따르는데 아래와 같이 사용하는 경우가 많습니다.</p>
<h4 id="1-일반적인-함수는-함수-선언식으로-작성">1. 일반적인 함수는 함수 선언식으로 작성</h4>
<pre><code class="language-javascript">function processData(data) {
  return data * 2;
}</code></pre>
<h4 id="2-간단한-계산이나-배열-작업은-화살표-함수">2. 간단한 계산이나 배열 작업은 화살표 함수</h4>
<pre><code class="language-javascript">const numbers = [1, 2, 3];
const doubled = numbers.map((num) =&gt; num * 2);</code></pre>
<h4 id="3-변수에-저장하거나-다른-함수에-전달할-때는-함수-표현식">3. 변수에 저장하거나 다른 함수에 전달할 때는 함수 표현식</h4>
<pre><code class="language-javascript">const handleClick = function (event) {
  console.log(&quot;버튼이 클릭되었습니다&quot;);
};</code></pre>
<h4 id="4-리액트-컴포넌트는-함수-선언식-또는-화살표-함수-표현식">4. 리액트 컴포넌트는 함수 선언식 또는 화살표 함수 표현식</h4>
<pre><code class="language-javascript">// 1. 함수 선언식 - 가독성이 좋고 직관적
function Button({ onClick, children }) {
  return &lt;button onClick={onClick}&gt;{children}&lt;/button&gt;;
}

// 2. 화살표 함수 표현식 - 간단한 컴포넌트에 적합
const Icon = ({ name, size }) =&gt; (
  &lt;span className={`icon-${name} size-${size}`} /&gt;
);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Babel 과 Webpack 에 대해서]]></title>
            <link>https://velog.io/@seolleung_ee/Babel-%EA%B3%BC-Webpack-%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</link>
            <guid>https://velog.io/@seolleung_ee/Babel-%EA%B3%BC-Webpack-%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</guid>
            <pubDate>Thu, 06 Feb 2025 15:14:56 GMT</pubDate>
            <description><![CDATA[<h1 id="프론트엔드-개발의-핵심-도구-babel-과-webpack">프론트엔드 개발의 핵심 도구: Babel 과 Webpack</h1>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/3b63566a-9730-4d1d-84b6-4cbd31067317/image.png" alt=""></p>
<h2 id="1-바벨babel이란">1. 바벨(Babel)이란?</h2>
<h3 id="11-바벨의-역할-쉽게-이해하기">1.1 바벨의 역할 쉽게 이해하기</h3>
<p>바벨은 최신 자바스크립트 코드를 구버전의 코드로 변환해주는 도구입니다.</p>
<p>마치 번역기처럼 최신 자바스크립트를 구버전 브라우저도 이해할 수 있게 번역해줍니다.</p>
<p>예를 들어:</p>
<pre><code class="language-javascript">// 우리가 작성한 최신 코드
const message = `안녕하세요 ${name}님!`;
const numbers = [...[1, 2, 3]];

// 바벨이 변환한 코드 (IE에서도 동작하는 버전)
var message = &quot;안녕하세요 &quot; + name + &quot;님!&quot;;
var numbers = [].concat([1, 2, 3]);</code></pre>
<h3 id="12-바벨이-필요한-이유">1.2 바벨이 필요한 이유</h3>
<ol>
<li><p><strong>브라우저 호환성</strong></p>
<ul>
<li>모든 브라우저가 최신 자바스크립트 기능을 지원하지는 않음</li>
<li>IE나 구버전 브라우저에서도 최신 코드가 동작하게 해줌</li>
</ul>
</li>
<li><p><strong>리액트 코드 변환</strong></p>
</li>
</ol>
<pre><code class="language-javascript">// 우리가 작성한 JSX 코드
function Welcome() {
  return (
    &lt;div&gt;
      &lt;h1&gt;안녕하세요!&lt;/h1&gt;
    &lt;/div&gt;
  );
}

// 바벨이 변환한 일반 자바스크립트 코드
function Welcome() {
  return React.createElement(
    &quot;div&quot;,
    null,
    React.createElement(&quot;h1&quot;, null, &quot;안녕하세요!&quot;)
  );
}</code></pre>
<blockquote>
<p><strong>쉽게 이해하기</strong></p>
<p>바벨은 마치 외국어 번역기와 같습니다:</p>
<ul>
<li>우리(개발자)는 최신 문법으로 편하게 코드를 작성</li>
<li>바벨이 이를 구버전 브라우저가 이해할 수 있는 언어로 번역</li>
<li>덕분에 우리는 최신 문법을 걱정 없이 사용할 수 있음</li>
</ul>
</blockquote>
<h2 id="2-웹팩webpack이란">2. 웹팩(Webpack)이란?</h2>
<h3 id="21-웹팩의-역할-쉽게-이해하기">2.1 웹팩의 역할 쉽게 이해하기</h3>
<p>웹팩은 모듈 번들러입니다. 쉽게 말해 여러 개의 파일을 하나로 합쳐주는 도구입니다. 마치 여러 개의 레고 블록을 하나로 조립하는 것과 같습니다.</p>
<blockquote>
<p><strong>모듈이란?</strong></p>
<p>모듈은 쉽게 말해 하나의 독립된 파일입니다. 예를 들면:</p>
<ul>
<li>버튼을 담당하는 파일 (button.js)</li>
<li>메뉴를 담당하는 파일 (menu.js)</li>
<li>로그인을 담당하는 파일 (login.js)</li>
</ul>
<p>이렇게 기능별로 파일을 나누면:</p>
<ul>
<li>코드 관리가 쉬워짐</li>
<li>다른 프로젝트에서 재사용하기 쉬움</li>
<li>팀원들과 협업하기 좋음</li>
</ul>
</blockquote>
<p>예를 들어:</p>
<pre><code class="language-javascript">// button.js (버튼 모듈)
export function Button() {
  return &quot;멋진 버튼&quot;;
}

// menu.js (메뉴 모듈)
export function Menu() {
  return &quot;메뉴 목록&quot;;
}

// app.js (메인 파일)
import { Button } from &quot;./button&quot;;
import { Menu } from &quot;./menu&quot;;

// 웹팩이 이 파일들을 하나의 bundle.js로 합쳐줍니다
// 브라우저는 bundle.js 파일 하나만 다운받으면 됩니다</code></pre>
<blockquote>
<p><strong>쉽게 이해하기</strong></p>
<p>웹팩은 마치 도서 편집자와 같습니다:</p>
<ul>
<li>여러 작가가 쓴 원고(모듈들)를 받아서</li>
<li>하나의 책(bundle.js)으로 만들어줌</li>
<li>덕분에 독자(브라우저)는 한 권의 책만 읽으면 됨</li>
</ul>
</blockquote>
<h3 id="22-웹팩이-필요한-이유">2.2 웹팩이 필요한 이유</h3>
<ol>
<li><p><strong>파일 관리가 쉬워집니다</strong></p>
<ul>
<li>여러 개의 작은 파일로 나눠서 개발</li>
<li>웹팩이 알아서 하나로 합쳐줌</li>
</ul>
</li>
<li><p><strong>성능이 좋아집니다</strong></p>
<ul>
<li>여러 파일을 한 번에 다운로드</li>
<li>필요한 코드만 불러올 수 있음</li>
</ul>
</li>
<li><p><strong>모듈 시스템을 사용할 수 있습니다</strong></p>
</li>
</ol>
<pre><code class="language-javascript">// math.js
export const add = (a, b) =&gt; a + b;
export const subtract = (a, b) =&gt; a - b;

// app.js
import { add } from &quot;./math&quot;; // add 함수만 가져와서 사용
console.log(add(2, 3)); // 5</code></pre>
<h3 id="23-웹팩의-주요-기능">2.3 웹팩의 주요 기능</h3>
<ol>
<li><p><strong>파일 합치기</strong></p>
<ul>
<li>여러 자바스크립트 파일을 하나로 합침</li>
<li>CSS, 이미지 등도 관리 가능</li>
</ul>
</li>
<li><p><strong>자동 새로고침</strong></p>
</li>
</ol>
<pre><code class="language-javascript">// 개발 중에 코드를 수정하면
function Button() {
  return &lt;button&gt;클릭!&lt;/button&gt;;
}

// 코드를 수정했을 때
function Button() {
  return &lt;button style={{ color: &quot;blue&quot; }}&gt;클릭!&lt;/button&gt;;
}

// 페이지가 자동으로 새로고침 됨</code></pre>
<ol start="3">
<li><strong>코드 최적화</strong></li>
</ol>
<pre><code class="language-javascript">// 큰 컴포넌트는 필요할 때만 불러오기
const BigComponent = React.lazy(() =&gt; import(&quot;./BigComponent&quot;));

function App() {
  return (
    &lt;Suspense fallback={&lt;Loading /&gt;}&gt;
      &lt;BigComponent /&gt; {/* 이 컴포넌트는 필요할 때만 다운로드 됨 */}
    &lt;/Suspense&gt;
  );
}</code></pre>
<blockquote>
<p><strong>쉽게 이해하기</strong></p>
<p>코드 최적화는 마치 책을 여러 권으로 나누는 것과 같습니다:</p>
<ul>
<li>처음에는 목차와 첫 장만 받아옴</li>
<li>다른 장들은 필요할 때 받아옴</li>
<li>덕분에 처음 시작할 때 모든 내용을 한번에 받지 않아도 됨</li>
</ul>
</blockquote>
<h2 id="3-실무에서-자주-사용하는-방법">3. 실무에서 자주 사용하는 방법</h2>
<h3 id="31-웹팩-직접-설정하기">3.1 웹팩 직접 설정하기</h3>
<ol>
<li><strong>기본 설정 파일 만들기</strong></li>
</ol>
<pre><code class="language-javascript">// webpack.config.js
const path = require(&quot;path&quot;);

module.exports = {
  // 시작점: 웹팩이 파일을 읽기 시작하는 위치
  entry: &quot;./src/index.js&quot;,

  // 결과물: 하나로 합쳐진 파일이 저장되는 위치
  output: {
    path: path.resolve(__dirname, &quot;dist&quot;),
    filename: &quot;bundle.js&quot;,
  },

  // 규칙: 파일 종류별로 어떻게 처리할지 설정
  module: {
    rules: [
      {
        // .js로 끝나는 파일은
        test: /\.js$/,
        exclude: /node_modules/, // 이 폴더 제외
        use: {
          loader: &quot;babel-loader&quot;, // 바벨로 처리
        },
      },
      {
        // .css로 끝나는 파일은
        test: /\.css$/,
        use: [&quot;style-loader&quot;, &quot;css-loader&quot;], // CSS 처리
      },
    ],
  },
};</code></pre>
<ol start="2">
<li><strong>필요한 패키지 설치하기</strong></li>
</ol>
<pre><code class="language-bash"># 웹팩 관련 패키지
npm install webpack webpack-cli --save-dev

# 로더 패키지들
npm install babel-loader css-loader style-loader --save-dev</code></pre>
<ol start="3">
<li><strong>package.json에 명령어 추가</strong></li>
</ol>
<pre><code class="language-json">{
  &quot;scripts&quot;: {
    &quot;build&quot;: &quot;webpack --mode production&quot;,
    &quot;start&quot;: &quot;webpack serve --mode development&quot;
  }
}</code></pre>
<blockquote>
<p><strong>쉽게 이해하기</strong></p>
<p>웹팩 설정은 마치 공장 설비를 설정하는 것과 같습니다:</p>
<ul>
<li>entry: 원료가 들어오는 입구</li>
<li>output: 완성품이 나가는 출구</li>
<li>rules: 원료를 어떻게 가공할지 정하는 규칙</li>
<li>loaders: 각각의 가공 기계</li>
</ul>
</blockquote>
<h3 id="32-create-react-app-사용하기">3.2 Create React App 사용하기</h3>
<p>Create React App을 사용하면 바벨과 웹팩이 자동으로 설정됩니다.</p>
<pre><code class="language-bash"># 프로젝트 생성
npx create-react-app my-app

# 개발 서버 시작
npm start

# 배포용 파일 만들기
npm run build</code></pre>
<h3 id="33-nextjs-사용하기">3.3 Next.js 사용하기</h3>
<p>Next.js도 바벨과 웹팩이 미리 설정되어 있습니다.</p>
<pre><code class="language-bash"># 프로젝트 생성
npx create-next-app my-app

# 개발 서버 시작
npm run dev

# 배포용 파일 만들기
npm run build</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[switch - case 문을 사용할 때 주의해야 할 점]]></title>
            <link>https://velog.io/@seolleung_ee/switch-case-%EB%AC%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%B4%EC%95%BC-%ED%95%A0-%EC%A0%90</link>
            <guid>https://velog.io/@seolleung_ee/switch-case-%EB%AC%B8%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%B4%EC%95%BC-%ED%95%A0-%EC%A0%90</guid>
            <pubDate>Wed, 05 Feb 2025 13:43:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/0845c96d-2146-4aa9-987b-697c69c18943/image.png" alt=""></p>
<h3 id="1-엄격한-동등-비교">1. <strong>엄격한 동등 비교</strong>:</h3>
<ul>
<li><p><code>switch</code> 문은 <code>===</code> (엄격한 동등 비교)를 사용하여 비교합니다. 즉, 타입이 다르면 일치하지 않는 것으로 간주됩니다.</p>
</li>
<li><p>따라서, 비교할 값의 타입을 항상 확인해야 합니다.</p>
</li>
</ul>
<pre><code class="language-javascript">const value = &quot;5&quot;;
switch (value) {
  case 5: // 이 경우는 false
    console.log(&quot;일치합니다.&quot;);
    break;
  default:
    console.log(&quot;일치하지 않습니다.&quot;);
}</code></pre>
<h3 id="2-break-문-사용">2. <strong>break 문 사용</strong>:</h3>
<ul>
<li><p>각 <code>case</code> 블록의 끝에 <code>break</code> 문을 추가하지 않으면, 다음 <code>case</code> 블록으로 계속 실행됩니다.</p>
</li>
<li><p>이를 &quot;fall-through&quot;라고 하며, 의도하지 않은 동작을 초래할 수 있습니다.</p>
</li>
<li><p><strong>return 사용</strong>: <code>switch</code> 문이 함수 내에 있을 경우, <code>break</code> 대신 <code>return</code>을 사용할 수 있습니다.<code>return</code>을 사용하면 해당 함수의 실행을 종료하고 값을 반환합니다. 이 경우, <code>switch</code> 문이 끝나면 더 이상 실행되지 않습니다.</p>
</li>
</ul>
<pre><code class="language-javascript">function getFruitColor(fruit) {
  switch (fruit) {
    case &quot;apple&quot;:
      return &quot;빨간색입니다.&quot;; // return 사용
    case &quot;banana&quot;:
      return &quot;노란색입니다.&quot;; // return 사용
    default:
      return &quot;알 수 없는 과일입니다.&quot;; // return 사용
  }
}
console.log(getFruitColor(&quot;apple&quot;)); // &#39;빨간색입니다.&#39;</code></pre>
<h3 id="3-default-문-사용">3. <strong>default 문 사용</strong>:</h3>
<ul>
<li>모든 <code>case</code>에 해당하지 않는 경우를 처리하기 위해 <code>default</code> 문을 사용하는 것이 좋습니다. 이는 예기치 않은 입력에 대한 처리를 도와줍니다.</li>
</ul>
<pre><code class="language-javascript">const color = &quot;purple&quot;;
switch (color) {
  case &quot;red&quot;:
    console.log(&quot;빨간색입니다.&quot;);
    break;
  case &quot;blue&quot;:
    console.log(&quot;파란색입니다.&quot;);
    break;
  default:
    console.log(&quot;알 수 없는 색상입니다.&quot;); // 이 메시지가 출력됩니다.
}</code></pre>
<h3 id="4-복잡한-조건-피하기">4. <strong>복잡한 조건 피하기</strong>:</h3>
<ul>
<li><code>switch</code> 문은 단일 값에 대한 비교에 적합합니다. 복잡한 조건을 처리해야 할 경우, <code>if - else</code> 문을 사용하는 것이 더 나을 수 있습니다.</li>
</ul>
<h3 id="5-문자열과-숫자-혼용-주의">5. <strong>문자열과 숫자 혼용 주의</strong>:</h3>
<ul>
<li><p><code>switch</code> 문에서 문자열과 숫자를 혼용하여 사용할 경우, 타입이 다르기 때문에 일치하지 않을 수 있습니다.</p>
</li>
<li><p>항상 타입을 일치시키는 것이 중요합니다.</p>
</li>
<li><p><strong>예시</strong>:</p>
</li>
</ul>
<pre><code class="language-javascript">const input = &quot;10&quot;; // 문자열
switch (input) {
  case 10: // 숫자
    console.log(&quot;숫자 10입니다.&quot;); // 이 메시지는 출력되지 않습니다.
    break;
  case &quot;10&quot;: // 문자열
    console.log(&#39;문자열 &quot;10&quot;입니다.&#39;); // 이 메시지가 출력됩니다.
    break;
  default:
    console.log(&quot;알 수 없는 값입니다.&quot;);
}</code></pre>
<h3 id="6-각-case에서-동일한-변수명-사용-주의">6. <strong>각 case에서 동일한 변수명 사용 주의</strong>:</h3>
<ul>
<li><p><code>switch</code> 문 내의 각 <code>case</code>에서 동일한 변수명을 선언하면, 변수의 스코프가 <code>switch</code> 문 전체로 확장됩니다. 이로 인해 변수명이 충돌하게 되어 에러가 발생할 수 있습니다.</p>
</li>
<li><p>각 <code>case</code>는 독립적인 블록이 아니기 때문에, 같은 이름의 변수를 여러 번 선언할 수 없습니다.</p>
</li>
<li><p><strong>예시</strong>:</p>
</li>
</ul>
<pre><code class="language-javascript">switch (fruit) {
  case &quot;apple&quot;:
    let color = &quot;red&quot;; // 첫 번째 case에서 color 선언
    console.log(color);
    break;
  case &quot;banana&quot;:
    let color = &quot;yellow&quot;; // 두 번째 case에서 color 선언 (에러 발생)
    console.log(color);
    break;
  default:
    console.log(&quot;알 수 없는 과일입니다.&quot;);
}</code></pre>
<h3 id="7-렉시컬-스코프lexical-scoping">7. <strong>렉시컬 스코프(Lexical Scoping)</strong>:</h3>
<ul>
<li><p><strong>렉시컬 스코프란?</strong>: 렉시컬 스코프는 변수가 정의된 위치에 따라 그 변수가 유효한 범위를 결정하는 개념입니다. 즉, 함수가 선언된 위치에 따라 그 함수 내에서 접근할 수 있는 변수의 범위가 정해집니다.</p>
</li>
<li><p><code>case</code>와 <code>default</code> 절은 레이블과 같아서, 제어 흐름이 점프할 수 있는 가능한 위치를 나타냅니다. 그러나 이들은 자체적으로 렉시컬 스코프를 생성하지 않습니다. 예를 들어:</p>
</li>
</ul>
<pre><code class="language-javascript">const action = &quot;say_hello&quot;;
switch (action) {
  case &quot;say_hello&quot;:
    const message = &quot;hello&quot;;
    console.log(message);
    break;
  case &quot;say_hi&quot;:
    const message = &quot;hi&quot;; // 에러 발생
    console.log(message);
    break;
  default:
    console.log(&quot;Empty action received.&quot;);
}</code></pre>
<p>이 예제는 &quot;Uncaught SyntaxError: Identifier &#39;message&#39; has already been declared&quot;라는 에러를 출력합니다.</p>
<p>이는 첫 번째 <code>const message = &#39;hello&#39;;</code>가 두 번째 <code>const message = &#39;hi&#39;;</code> 선언과 충돌하기 때문입니다.</p>
<p>이는 두 <code>const</code> 선언이 <code>switch</code> 본문에서 생성된 동일한 블록 스코프 내에 있기 때문입니다.</p>
<ul>
<li><strong>해결 방법</strong>: <code>case</code> 절에서 <code>let</code> 또는 <code>const</code> 선언이 필요할 경우, 블록으로 감싸야 합니다.</li>
</ul>
<pre><code class="language-javascript">const action = &quot;say_hello&quot;;
switch (action) {
  case &quot;say_hello&quot;: {
    const message = &quot;hello&quot;;
    console.log(message);
    break;
  }
  case &quot;say_hi&quot;: {
    const message = &quot;hi&quot;;
    console.log(message);
    break;
  }
  default: {
    console.log(&quot;Empty action received.&quot;);
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Type Conversion과 Type Coercion 에 대해]]></title>
            <link>https://velog.io/@seolleung_ee/Type-Conversion%EA%B3%BC-Type-Coercion-%EC%97%90-%EB%8C%80%ED%95%B4</link>
            <guid>https://velog.io/@seolleung_ee/Type-Conversion%EA%B3%BC-Type-Coercion-%EC%97%90-%EB%8C%80%ED%95%B4</guid>
            <pubDate>Tue, 04 Feb 2025 15:19:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/dc254c76-72cf-4e2f-a6af-2cfb0647ea7c/image.jpeg" alt=""></p>
<h2 id="type-conversion과-type-coercion의-차이">Type Conversion과 Type Coercion의 차이</h2>
<p>자바스크립트에서 데이터 타입을 다룰 때 <code>type conversion</code>과 <code>type coercion</code>이라는 두 가지 개념이 있습니다. 이 두 용어는 비슷하게 들리지만, 서로 다른 의미를 가집니다.</p>
<h3 id="type-conversion-타입-변환">Type Conversion (타입 변환)</h3>
<ul>
<li><p><strong>정의</strong>: 명시적으로 데이터 타입을 변환하는 과정입니다. 프로그래머가 의도적으로 변환을 수행합니다.</p>
</li>
<li><p><strong>예시</strong>:</p>
<ul>
<li><p><code>String()</code> 함수를 사용하여 숫자를 문자열로 변환:</p>
<pre><code class="language-javascript">const num = 123;
const str = String(num); // &#39;123&#39;
console.log(typeof str); // &#39;string&#39;</code></pre>
</li>
<li><p><code>Number()</code> 함수를 사용하여 문자열을 숫자로 변환:</p>
<pre><code class="language-javascript">const strNum = &quot;456&quot;;
const numConverted = Number(strNum); // 456
console.log(typeof numConverted); // &#39;number&#39;</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="type-coercion-타입-강제-변환">Type Coercion (타입 강제 변환)</h3>
<ul>
<li><p><strong>정의</strong>: 자바스크립트 엔진이 자동으로 데이터 타입을 변환하는 과정입니다. 프로그래머가 의도하지 않더라도 발생할 수 있습니다.</p>
</li>
<li><p><strong>예시</strong>:</p>
<ul>
<li><p>문자열과 숫자를 더할 때, 숫자가 문자열로 변환됩니다:</p>
<pre><code class="language-javascript">const result = 5 + &quot;5&quot;; // &#39;55&#39;
console.log(result); // &#39;55&#39;</code></pre>
</li>
<li><p>비교 연산에서 타입이 자동으로 변환됩니다:</p>
<pre><code class="language-javascript">console.log(5 == &quot;5&quot;); // true
// &#39;5&#39;가 숫자 5로 변환되어 비교됩니다.</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="요약">요약</h3>
<ul>
<li><p><strong>Type Conversion</strong>: 프로그래머가 명시적으로 타입을 변환하는 것입니다.</p>
</li>
<li><p><strong>Type Coercion</strong>: 자바스크립트가 자동으로 타입을 변환하는 것입니다.</p>
</li>
</ul>
<p>이 두 개념을 이해하는 것은 자바스크립트에서 데이터 타입을 효과적으로 다루는 데 중요합니다.</p>
<h2 id="type-coercion과-버그">Type Coercion과 버그</h2>
<p><code>Type Coercion</code>은 자바스크립트에서 자동으로 데이터 타입을 변환하는 과정으로, 때때로 예기치 않은 결과를 초래할 수 있습니다.</p>
<p>이러한 자동 변환은 코드의 가독성을 떨어뜨리고, 버그를 양산할 수 있는 원인이 됩니다. 따라서 <code>Type Coercion</code>을 이해하는 것이 중요합니다.</p>
<h3 id="type-coercion으로-인한-버그-예시">Type Coercion으로 인한 버그 예시</h3>
<ol>
<li><p><strong>비교 연산에서의 문제</strong>:</p>
<ul>
<li><code>==</code> 연산자는 타입을 강제로 변환하여 비교합니다. 이로 인해 의도하지 않은 결과가 발생할 수 있습니다.</li>
</ul>
<pre><code class="language-javascript">console.log(0 == &quot;0&quot;); // true
console.log(false == &quot;&quot;); // true
console.log(null == undefined); // true</code></pre>
<p>이러한 결과는 코드의 의도를 명확히 이해하지 못하게 만들 수 있습니다.</p>
</li>
<li><p><strong>문자열과 숫자의 결합</strong>:</p>
<ul>
<li>숫자와 문자열을 더할 때, 숫자가 문자열로 변환되어 예기치 않은 결과를 초래할 수 있습니다.</li>
</ul>
<pre><code class="language-javascript">const a = 5;
const b = &quot;10&quot;;
const result = a + b; // &#39;510&#39;
console.log(result); // &#39;510&#39;</code></pre>
<p>이 경우, 숫자 5가 문자열로 변환되어 문자열 결합이 이루어집니다.</p>
</li>
</ol>
<h3 id="결론">결론</h3>
<p><code>Type Coercion</code>은 자바스크립트의 유연성을 제공하지만, 동시에 버그를 양산할 수 있는 잠재적인 원인이 됩니다.</p>
<p>따라서, <code>===</code> (엄격한 동등 비교 연산자)를 사용하여 타입 변환을 피하고, 명시적인 타입 변환을 통해 코드를 작성하는 것이 좋습니다.</p>
<p>이를 통해 코드의 가독성을 높이고, 예기치 않은 동작을 방지할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 데이터 타입, 변수 선언 키워드 (let, const and var)]]></title>
            <link>https://velog.io/@seolleung_ee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%ED%82%A4%EC%9B%8C%EB%93%9C-let-const-and-var</link>
            <guid>https://velog.io/@seolleung_ee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%ED%82%A4%EC%9B%8C%EB%93%9C-let-const-and-var</guid>
            <pubDate>Tue, 04 Feb 2025 15:07:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/48e6864e-0241-44f0-820e-7959bebad46b/image.png" alt=""></p>
<h2 id="데이터-타입">데이터 타입</h2>
<p>모든 값 (values)은 object 또는 primitive 자료형입니다.</p>
<p>여기서는 원시 자료형에 대해 알아보겠습니다.</p>
<p>7가지 원시 자료형</p>
<ul>
<li><p><strong>number</strong>: 숫자 값을 나타내며, 정수와 부동 소수점 숫자를 포함합니다.</p>
<ul>
<li>예: <code>42</code> // 정수</li>
<li>예: <code>3.14</code> // 부동 소수점 숫자</li>
</ul>
</li>
<li><p><strong>string</strong>: 문자들의 집합으로, 텍스트 데이터를 표현합니다.</p>
<ul>
<li>예: <code>&quot;안녕하세요&quot;</code> // 문자열</li>
<li>예: <code>&#39;JavaScript&#39;</code> // 문자열</li>
</ul>
</li>
<li><p><strong>boolean</strong>: 참(true) 또는 거짓(false) 값을 나타냅니다.</p>
<ul>
<li>예: <code>true</code> // 참</li>
<li>예: <code>false</code> // 거짓</li>
</ul>
</li>
<li><p><strong>undefined</strong>: 값이 할당되지 않은 변수를 나타내며, &#39;빈 값&#39;으로 간주됩니다.</p>
<ul>
<li>예: <code>let x; // x는 undefined</code></li>
</ul>
</li>
<li><p><strong>null</strong>: 의도적으로 &#39;빈 값&#39;을 나타내기 위해 사용됩니다.</p>
<ul>
<li>예: <code>let y = null; // y는 null</code></li>
</ul>
</li>
<li><p><strong>symbol</strong>: 고유하고 변경할 수 없는 값으로, 주로 객체의 프로퍼티 키로 사용됩니다.</p>
<ul>
<li>예: <code>const sym = Symbol(&#39;description&#39;); // 심볼 생성</code></li>
</ul>
</li>
<li><p><strong>bigInt</strong>: 매우 큰 정수를 나타내기 위해 사용되며, 일반 number 타입이 표현할 수 있는 범위를 초과하는 값을 다룰 수 있습니다.</p>
<ul>
<li>예: <code>const bigIntValue = 1234567890123456789012345678901234567890n; // 큰 정수</code></li>
</ul>
</li>
</ul>
<h2 id="동적-타이핑">동적 타이핑</h2>
<ul>
<li><p><strong>정의</strong>: 자바스크립트는 동적 타이핑 언어로, 변수의 타입이 실행 중에 결정됩니다.</p>
</li>
<li><p><strong>특징</strong>:</p>
<ul>
<li>변수에 다양한 데이터 유형을 할당할 수 있습니다.</li>
<li>같은 변수에 다른 타입의 값을 재할당할 수 있습니다.</li>
</ul>
</li>
<li><p><strong>장점</strong>: 유연한 코드 작성이 가능하여 개발 속도가 빨라집니다.</p>
</li>
<li><p><strong>단점</strong>: 타입 오류를 사전에 방지하기 어려워, 런타임에서 버그가 발생할 수 있습니다.</p>
</li>
<li><p><strong>비유</strong>: 동적 타이핑은 마치 상자에 책을 넣었다가 다시 꺼내고 다른 물건을 넣는 것과 같습니다.</p>
</li>
</ul>
<h2 id="undefined와-null의-차이">undefined와 null의 차이</h2>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/7fc38099-60aa-4af0-8fb6-f4c5b6d9d94d/image.png" alt=""></p>
<ul>
<li><p><strong>undefined</strong>:</p>
<ul>
<li>변수가 선언되었지만 값이 할당되지 않은 상태를 나타냅니다.</li>
<li>자바스크립트에서 자동으로 할당되는 값으로, 메모리에 존재하지만 값이 없기 때문에 크기가 작습니다.</li>
<li>예: <code>let x; // x는 undefined</code></li>
</ul>
</li>
<li><p><strong>null</strong>:</p>
<ul>
<li>개발자가 의도적으로 &#39;빈 값&#39;을 할당한 상태를 나타냅니다.</li>
<li>객체를 가리키는 포인터로, 메모리에 주소값을 할당받아 존재하지만 값은 없습니다.</li>
<li>예: <code>let y = null; // y는 null</code></li>
</ul>
</li>
</ul>
<h3 id="메모리-측면에서의-차이">메모리 측면에서의 차이</h3>
<ul>
<li><code>undefined</code>는 메모리에서 크기가 작고, 값이 없음을 나타내는 상태입니다.</li>
<li><code>null</code>은 빈 객체를 가리키는 포인터로, 메모리에서 크기가 더 큽니다.</li>
</ul>
<h3 id="typeof-null"><code>typeof null</code></h3>
<ul>
<li><code>typeof null</code>이 <code>object</code>인 이유는 자바스크립트의 역사적 유산으로, null이 객체로 잘못 분류되었기 때문입니다.</li>
<li>이는 자바스크립트의 타입 시스템에서 발생한 버그로 여겨집니다.</li>
</ul>
<h3 id="요약">요약</h3>
<ul>
<li><code>undefined</code>는 변수의 초기화가 이루어지지 않은 상태이며, <code>null</code>은 개발자가 의도적으로 빈 값을 할당한 상태로 이해할 수 있습니다.</li>
</ul>
<hr>
<h2 id="let-const-and-var">let, const, and var</h2>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/609486f0-fe7f-4070-95a0-ea5674e34cb5/image.png" alt=""></p>
<h3 id="기본-개념">기본 개념</h3>
<ul>
<li><p><strong>let</strong>:</p>
<ul>
<li>변수를 선언할 때 사용하며, 블록 스코프를 따릅니다.</li>
<li>같은 블록 내에서 동일한 이름으로 변수를 재선언할 수 없습니다.</li>
<li>예:<pre><code class="language-javascript">let x = 10;
if (true) {
  let x = 20; // 다른 블록에서의 x
  console.log(x); // 20
}
console.log(x); // 10</code></pre>
</li>
</ul>
</li>
<li><p><strong>const</strong>:</p>
<ul>
<li>상수를 선언할 때 사용하며, 블록 스코프를 따릅니다.</li>
<li>선언과 동시에 초기화해야 하며, 재할당이 불가능합니다.</li>
<li>객체나 배열의 경우, 내부 요소는 변경할 수 있습니다.</li>
<li>예:<pre><code class="language-javascript">const y = 30;
// y = 40; // 오류 발생
const arr = [1, 2, 3];
arr.push(4); // 가능
console.log(arr); // [1, 2, 3, 4]</code></pre>
</li>
</ul>
</li>
<li><p><strong>var</strong>:</p>
<ul>
<li>변수를 선언할 때 사용하며, 함수 스코프를 따릅니다.</li>
<li>블록 내에서 선언하더라도 함수 전체에서 접근 가능합니다.</li>
<li>같은 이름으로 변수를 재선언할 수 있습니다.</li>
<li>예:<pre><code class="language-javascript">var z = 50;
if (true) {
  var z = 60; // 같은 함수 내에서의 z
  console.log(z); // 60
}
console.log(z); // 60</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="특징-및-차이점">특징 및 차이점</h3>
<table>
<thead>
<tr>
<th>특징</th>
<th>let</th>
<th>const</th>
<th>var</th>
</tr>
</thead>
<tbody><tr>
<td>스코프</td>
<td>블록 스코프</td>
<td>블록 스코프</td>
<td>함수 스코프</td>
</tr>
<tr>
<td>재선언 가능성</td>
<td>불가능</td>
<td>불가능</td>
<td>가능</td>
</tr>
<tr>
<td>초기화</td>
<td>선택적</td>
<td>필수</td>
<td>선택적</td>
</tr>
<tr>
<td>호이스팅</td>
<td>가능 (초기화 전 접근 불가)</td>
<td>가능 (초기화 전 접근 불가)</td>
<td>가능 (초기화 전 접근 가능)</td>
</tr>
</tbody></table>
<h3 id="스코프">스코프</h3>
<ul>
<li><p><strong>블록 스코프</strong>: <code>let</code>과 <code>const</code>는 블록 내에서만 유효하며, 블록이 끝나면 변수도 소멸됩니다. 이는 코드의 가독성을 높이고, 변수의 충돌을 방지하는 데 도움이 됩니다.</p>
</li>
<li><p><strong>함수 스코프</strong>: <code>var</code>는 함수 내에서만 유효하며, 함수가 종료되면 변수도 소멸됩니다. 블록 내에서 선언하더라도 함수 전체에서 접근할 수 있어, 예기치 않은 동작을 초래할 수 있습니다.</p>
</li>
</ul>
<h3 id="결론">결론</h3>
<ul>
<li><p><code>const</code>를 기본으로 사용하고, 값이 변경될 가능성이 있는 경우에만 <code>let</code>을 사용하라고 권장합니다. <code>var</code>는 사용을 피하는 것이 좋습니다.</p>
</li>
<li><p>스코프의 이해는 변수를 효과적으로 관리하고, 코드의 예측 가능성을 높이는 데 중요합니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript 변수에 값을 할당할 때의 과정 및 호이스팅]]></title>
            <link>https://velog.io/@seolleung_ee/JavaScript-%EB%B3%80%EC%88%98%EC%97%90-%EA%B0%92%EC%9D%84-%ED%95%A0%EB%8B%B9%ED%95%A0-%EB%95%8C%EC%9D%98-%EA%B3%BC%EC%A0%95-%EB%B0%8F-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85</link>
            <guid>https://velog.io/@seolleung_ee/JavaScript-%EB%B3%80%EC%88%98%EC%97%90-%EA%B0%92%EC%9D%84-%ED%95%A0%EB%8B%B9%ED%95%A0-%EB%95%8C%EC%9D%98-%EA%B3%BC%EC%A0%95-%EB%B0%8F-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85</guid>
            <pubDate>Mon, 03 Feb 2025 14:53:26 GMT</pubDate>
            <description><![CDATA[<h2 id="1-변수-선언">1. 변수 선언</h2>
<p>변수를 선언할 때, JavaScript 엔진은 해당 변수를 메모리에 생성합니다. 이때 변수는 기본적으로 <code>undefined</code>로 초기화됩니다. 즉, 변수를 선언하는 순간에는 값이 할당되지 않았기 때문에 <code>undefined</code> 상태가 됩니다.</p>
<h3 id="예시">예시</h3>
<pre><code class="language-javascript">let myVariable; // 변수 선언
console.log(myVariable); // undefined</code></pre>
<p>위의 코드에서 <code>myVariable</code>을 선언했지만, 값이 할당되지 않았기 때문에 <code>undefined</code>가 출력됩니다.</p>
<h2 id="2-값-할당">2. 값 할당</h2>
<p>변수를 선언한 후, 값을 할당할 수 있습니다. 이때 변수는 새로운 값을 저장하게 되며, 이전의 <code>undefined</code> 상태에서 해당 값으로 변경됩니다.</p>
<h3 id="예시-1">예시</h3>
<pre><code class="language-javascript">myVariable = 10; // 값 할당
console.log(myVariable); // 10</code></pre>
<p>위의 코드에서 <code>myVariable</code>에 <code>10</code>이라는 값을 할당하면, 이제 <code>myVariable</code>은 <code>10</code>이라는 값을 가지게 됩니다.</p>
<h2 id="3-변수-호이스팅-hoisting">3. 변수 호이스팅 (Hoisting)</h2>
<p>JavaScript에서는 변수 선언이 코드의 최상단으로 끌어올려지는 현상을 <strong>호이스팅</strong>이라고 합니다.</p>
<p>이로 인해 변수를 선언하기 전에 해당 변수를 참조할 수 있습니다. 그러나 변수의 값은 호이스팅되지 않으며, 초기화는 여전히 선언된 위치에서 이루어집니다.</p>
<h3 id="호이스팅의-예시">호이스팅의 예시</h3>
<pre><code class="language-javascript">console.log(myVariable); // undefined
var myVariable = 10;
console.log(myVariable); // 10</code></pre>
<p>위의 코드에서 <code>console.log(myVariable);</code>가 변수 선언 이전에 호출되었지만, <code>undefined</code>가 출력됩니다. 이는 JavaScript 엔진이 다음과 같이 해석하기 때문입니다:</p>
<pre><code class="language-javascript">var myVariable; // 호이스팅: 변수 선언이 최상단으로 끌어올려짐
console.log(myVariable); // undefined
myVariable = 10; // 값 할당</code></pre>
<h3 id="let과-const의-호이스팅"><code>let</code>과 <code>const</code>의 호이스팅</h3>
<p><code>let</code>과 <code>const</code>로 선언된 변수도 호이스팅이 발생하지만, 이들 변수는 <strong>일시적 사각지대(Temporal Dead Zone, TDZ)</strong>에 존재합니다. 즉, 변수 선언 이전에 해당 변수를 참조하려고 하면 <code>ReferenceError</code>가 발생합니다.</p>
<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/13b878d6-d974-4200-b94a-054710fb96b7/image.jpg" alt=""></p>
<h3 id="예시-2">예시</h3>
<pre><code class="language-javascript">console.log(myLet); // ReferenceError: Cannot access &#39;myLet&#39; before initialization
let myLet = 20;

console.log(myConst); // ReferenceError: Cannot access &#39;myConst&#39; before initialization
const myConst = 30;</code></pre>
<p>위의 코드에서 <code>myLet</code>과 <code>myConst</code>는 선언 이전에 접근하려고 할 때 오류가 발생합니다. 이는 <code>let</code>과 <code>const</code>가 선언된 위치에서만 사용할 수 있기 때문입니다.</p>
<p>선언된 변수 전 줄까지가 바로 일시적 사각지대에 해당됩니다.</p>
<h2 id="4-변수의-상태-변화">4. 변수의 상태 변화</h2>
<p>변수에 값을 할당한 후, 해당 변수는 새로운 값을 참조하게 됩니다. 이때 변수의 타입은 할당된 값에 따라 결정됩니다. JavaScript는 동적 타이핑 언어이기 때문에, 변수의 타입은 값에 따라 변경될 수 있습니다.</p>
<h3 id="예시-3">예시</h3>
<pre><code class="language-javascript">myVariable = &#39;Hello&#39;; // 문자열 할당
console.log(myVariable); // &#39;Hello&#39;

myVariable = true; // 불리언 할당
console.log(myVariable); // true</code></pre>
<h2 id="5-요약">5. 요약</h2>
<ol>
<li><p><strong>변수 선언</strong>: 변수를 선언하면 메모리에 생성되고, 기본적으로 <code>undefined</code>로 초기화됩니다.</p>
</li>
<li><p><strong>값 할당</strong>: 값을 할당하면 변수는 해당 값을 참조하게 되며, 이전의 <code>undefined</code> 상태에서 새로운 값으로 변경됩니다.</p>
</li>
<li><p><strong>호이스팅</strong>: 변수 선언이 최상단으로 끌어올려지며, 초기화는 선언된 위치에서 이루어집니다. 이로 인해 선언 이전에 변수를 참조하면 <code>undefined</code>가 출력됩니다. <code>let</code>과 <code>const</code>는 호이스팅이 발생하지만, 일시적 사각지대(TDZ)가 존재하여 선언 이전에 접근하면 <code>ReferenceError</code>가 발생합니다.</p>
</li>
<li><p><strong>상태 변화</strong>: 변수는 동적 타이핑 언어인 JavaScript에서 할당된 값에 따라 타입이 변경될 수 있습니다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript 개요 - 특성,  코드 작성 방법,  값과 변수]]></title>
            <link>https://velog.io/@seolleung_ee/JavaScript-%EA%B0%9C%EC%9A%94-%ED%8A%B9%EC%84%B1-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EA%B0%92%EA%B3%BC-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@seolleung_ee/JavaScript-%EA%B0%9C%EC%9A%94-%ED%8A%B9%EC%84%B1-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95-%EA%B0%92%EA%B3%BC-%EB%B3%80%EC%88%98</guid>
            <pubDate>Mon, 03 Feb 2025 12:51:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/seolleung_ee/post/e33fc41b-47c6-4be6-b1ed-361cc7757fdd/image.png" alt=""></p>
<h2 id="javascript의-특성">JavaScript의 특성</h2>
<h3 id="1-high-level-고급-언어-">1. <strong>High-level (고급 언어)</strong> :</h3>
<ul>
<li><p>JavaScript는 고급 프로그래밍 언어로, 개발자가 복잡한 세부 사항에 대해 걱정할 필요가 없습니다. 예를 들어, 메모리 관리와 같은 저수준의 작업은 JavaScript 엔진이 자동으로 처리합니다. </p>
</li>
<li><p><strong>고수준 언어 vs 저수준 언어</strong> :</p>
<ul>
<li><p><strong>고수준 언어</strong>: 개발자가 쉽게 이해하고 사용할 수 있는 구문을 제공하며, 메모리 관리와 같은 복잡한 세부 사항을 추상화합니다. 예: Python, JavaScript.</p>
</li>
<li><p><strong>저수준 언어</strong>: 하드웨어와 가까운 수준에서 작동하며, 메모리 관리와 같은 세부 사항을 직접 다뤄야 합니다. 예: C, 어셈블리 언어.</p>
</li>
<li><p><strong>예시</strong>: C 언어에서 메모리를 직접 할당하고 해제해야 하는 반면, JavaScript에서는 <code>let a = [];</code>와 같이 배열을 선언하면 메모리가 자동으로 관리됩니다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="2-object-oriented-객체-지향-">2. <strong>Object-oriented (객체 지향)</strong> :</h3>
<ul>
<li><p>JavaScript는 객체 지향 프로그래밍(OOP) 패러다임을 지원합니다. 이는 데이터와 그 데이터를 조작하는 함수를 객체라는 단위로 묶어 관리할 수 있음을 의미합니다. </p>
</li>
<li><p><strong>프로토타입 기반</strong> : JavaScript는 클래스 기반이 아닌 프로토타입 기반의 객체 지향 언어입니다.
이는 객체가 다른 객체를 상속할 수 있도록 하며, 새로운 객체를 생성할 때 기존 객체를 기반으로 할 수 있습니다. </p>
</li>
<li><p><strong>예시</strong> :</p>
<pre><code class="language-javascript">function Person(name) {
  this.name = name;
}
Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const john = new Person(&#39;John&#39;);
john.greet(); // Hello, my name is John</code></pre>
</li>
</ul>
<h3 id="3-multi-paradigm-다양한-패러다임-지원-">3. <strong>Multi-paradigm (다양한 패러다임 지원)</strong> :</h3>
<ul>
<li><p>JavaScript는 여러 프로그래밍 패러다임을 지원합니다.
즉, 객체 지향 프로그래밍 뿐만 아니라 함수형 프로그래밍, 명령형 프로그래밍 등 다양한 스타일로 코드를 작성할 수 있습니다. </p>
</li>
<li><p><strong>예시 코드</strong> :</p>
<pre><code class="language-javascript">// 함수형 프로그래밍 예시
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num =&gt; num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

// 객체 지향 프로그래밍 예시
class Animal {
constructor(name) {
  this.name = name;
}
speak() {
  console.log(`${this.name} makes a noise.`);
}
}

const dog = new Animal(&#39;Dog&#39;);
dog.speak(); // Dog makes a noise.</code></pre>
</li>
</ul>
<h2 id="javascript-코드-작성-방법">JavaScript 코드 작성 방법</h2>
<p>JavaScript 코드를 작성하는 방법에는 여러 가지가 있으며, 각 방법은 특정 상황에 따라 유용하게 사용될 수 있습니다. 아래는 HTML 문서에서 JavaScript를 작성하는 주요 방법들입니다.</p>
<h3 id="1-인라인-스크립트">1. 인라인 스크립트</h3>
<p>HTML 요소 내에서 직접 JavaScript 코드를 작성할 수 있습니다. 이 방법은 간단한 스크립트나 이벤트 핸들러에 유용합니다.</p>
<pre><code class="language-html">&lt;button onclick=&quot;alert(&#39;Hello, World!&#39;)&quot;&gt;Click Me&lt;/button&gt;</code></pre>
<h3 id="2-script-태그를-사용한-내부-스크립트">2. <code>&lt;script&gt;</code> 태그를 사용한 내부 스크립트</h3>
<p>HTML 문서의 <code>&lt;head&gt;</code> 또는 <code>&lt;body&gt;</code> 섹션에 <code>&lt;script&gt;</code> 태그를 사용하여 JavaScript 코드를 작성할 수 있습니다. 이 방법은 문서 내에서 직접 스크립트를 작성할 수 있게 해줍니다.</p>
<pre><code class="language-html">&lt;script&gt;
  console.log(&#39;Hello from internal script!&#39;);
&lt;/script&gt;</code></pre>
<h3 id="3-외부-javascript-파일">3. 외부 JavaScript 파일</h3>
<p>JavaScript 코드를 별도의 파일에 작성하고, HTML 문서에서 <code>&lt;script&gt;</code> 태그를 사용하여 링크할 수 있습니다. 이 방법은 코드의 재사용성과 유지보수성을 높여줍니다.</p>
<pre><code class="language-html">&lt;script src=&quot;script.js&quot;&gt;&lt;/script&gt;</code></pre>
<h4 id="외부-파일-예시-scriptjs">외부 파일 예시 (script.js)</h4>
<pre><code class="language-javascript">console.log(&#39;Hello from external script!&#39;);</code></pre>
<h3 id="스크립트-위치-body-태그-끝에-작성하는-이유">스크립트 위치: <code>&lt;body&gt;</code> 태그 끝에 작성하는 이유</h3>
<p>JavaScript 파일을 <code>&lt;body&gt;</code> 태그의 끝에 작성하는 이유는 페이지의 모든 HTML 요소가 로드된 후에 스크립트가 실행되도록 하기 위함입니다.</p>
<p>이렇게 하면 DOM 요소에 접근할 때 해당 요소가 이미 존재하므로, 스크립트가 오류 없이 정상적으로 작동할 수 있습니다.</p>
<p>만약 <code>&lt;head&gt;</code> 섹션에 스크립트를 작성하면, HTML 요소가 로드되기 전에 스크립트가 실행되어 DOM 요소를 찾지 못해 오류가 발생할 수 있습니다.</p>
<p>따라서, 일반적으로 다음과 같은 구조를 따릅니다 :</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;h1&gt;JavaScript Fundamentals – Part 1&lt;/h1&gt;
  &lt;script src=&quot;script.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre>
<p>이렇게 하면 페이지가 로드된 후에 JavaScript 코드가 실행되어, 모든 요소에 안전하게 접근할 수 있습니다.</p>
<h2 id="javascript의-값과-변수">JavaScript의 값과 변수</h2>
<p>JavaScript에서 변수는 데이터를 저장하는 공간입니다. 변수를 사용하면 프로그램에서 값을 쉽게 관리하고 조작할 수 있습니다. 변수에 값을 할당하는 과정을 상자에 라벨을 붙이는 것에 비유할 수 있습니다.</p>
<h3 id="값과-변수의-비유">값과 변수의 비유</h3>
<ul>
<li><strong>상자</strong>: 변수는 데이터를 저장하는 상자와 같습니다.</li>
<li><strong>라벨</strong>: 변수 이름은 상자에 붙이는 라벨로, 상자가 어떤 데이터를 담고 있는지를 나타냅니다.</li>
<li><strong>값</strong>: 상자 안에 들어 있는 데이터가 바로 값입니다.</li>
</ul>
<p>예를 들어, 다음과 같은 코드가 있다고 가정해 보겠습니다:</p>
<pre><code class="language-javascript">let age = 25; // &#39;age&#39;라는 라벨이 붙은 상자에 25라는 값이 저장됨</code></pre>
<p>여기서 <code>age</code>는 상자의 라벨이고, <code>25</code>는 상자 안에 들어 있는 값입니다. 이처럼 변수를 사용하면 나중에 <code>age</code>라는 라벨을 통해 언제든지 25라는 값을 참조할 수 있습니다.</p>
<h3 id="변수-이름-규칙-컨벤션">변수 이름 규칙 (컨벤션)</h3>
<p>변수 이름을 정할 때는 몇 가지 규칙과 컨벤션이 있습니다:</p>
<ol>
<li><p><strong>영문자, 숫자, 언더스코어(_), 달러 기호($)</strong>: 변수 이름은 영문자, 숫자, 언더스코어, 달러 기호를 사용할 수 있습니다. 그러나 숫자로 시작할 수는 없습니다.</p>
<ul>
<li>올바른 예: <code>myVariable</code>, <code>age_1</code>, <code>$price</code></li>
<li>잘못된 예: <code>1stVariable</code>, <code>@name</code></li>
</ul>
</li>
<li><p><strong>대소문자 구분</strong>: JavaScript는 대소문자를 구분합니다. 즉, <code>myVariable</code>과 <code>myvariable</code>은 서로 다른 변수입니다.</p>
</li>
<li><p><strong>의미 있는 이름</strong>: 변수 이름은 그 변수가 어떤 값을 담고 있는지를 잘 나타내야 합니다. 예를 들어, <code>age</code>는 나이를 나타내는 변수로 적절하지만, <code>x</code>는 의미가 불분명합니다.</p>
</li>
<li><p><strong>예약어 사용 금지</strong>: JavaScript의 예약어(예: <code>if</code>, <code>for</code>, <code>function</code> 등)는 변수 이름으로 사용할 수 없습니다.</p>
</li>
</ol>
<h3 id="사용할-수-없는-변수-이름">사용할 수 없는 변수 이름</h3>
<ul>
<li><strong>예약어</strong>: JavaScript에서 미리 정의된 키워드나 예약어는 변수 이름으로 사용할 수 없습니다.</li>
<li><strong>특수 문자</strong>: 공백이나 특수 문자는 변수 이름에 포함될 수 없습니다. 예를 들어, <code>my variable</code>이나 <code>my-variable!</code>는 유효하지 않습니다.</li>
</ul>
<p>이러한 규칙을 따르면, 코드의 가독성을 높이고, 다른 개발자와의 협업 시 혼란을 줄일 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[바닐라JS - Datatype 의 정렬 with Object.]]></title>
            <link>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-Datatype-%EC%9D%98-%EC%A0%95%EB%A0%AC-with-Object</link>
            <guid>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-Datatype-%EC%9D%98-%EC%A0%95%EB%A0%AC-with-Object</guid>
            <pubDate>Tue, 04 Aug 2020 06:12:05 GMT</pubDate>
            <description><![CDATA[<h2 id="object">object</h2>
<p>한 주의 요일을 리스트 array 로 뽑지만 만약에 <strong>&quot;내 개인정보를 저장한다고 한다면&quot;</strong>, 어떻게 할까?</p>
<pre><code class="language-js">const myInfo = [&quot;dolphin&quot;, 12, &quot;male&quot;, true]</code></pre>
<p>이렇게 배열로 내 정보를 저장한다면 대체 &quot;dolphin&quot; 은 무엇이고 12는 나이인지 뭔지 알 수가 없다.</p>
<p>그래서 이 때 object 를 쓰는데, array 와 다른 점은 object 는 각 value 에 이름 (변수) 을 줄 수 있다.</p>
<p>배열의 형태가 bracket 을 사용했다면 object 는 curly bracket 을 사용한다.
(이건 마치 파이썬의 dictionary 형태 비슷..한거)</p>
<p>object 는 label 을 내가 저장하고 싶은 데이터에 줄 수 있다.</p>
<pre><code class="language-js">const myInfo = {
  name : &quot;dolphin&quot;,
  age : 12,
  gender : &quot;Male&quot;,
  isWorking : ture,
  favFood : [&quot;김치&quot;, &quot;미역국&quot;, &quot;된장찌개&quot;],
  device : 
  [{brand:&#39;apple&#39;, 
  modelname:&#39;macbookpro&#39;}, 
  {brand:&#39;samsung&#39;, 
  modelname:&#39;galaxyflip2&#39;}]
};</code></pre>
<p>원하는 값에 접근하기 위해서는 다음과 같은 방법을 사용한다.</p>
<pre><code class="language-js">console.log(myInfo.device[1].brand);</code></pre>
<p>object 에 들어가 있는 값을 수정할 수 있다.</p>
<pre><code class="language-js">myInfo.age = 25;</code></pre>
<p>object 에 키와 밸류를 추가할 수도 있다. 그러면 출력시 마지막에 위치하게 된다.</p>
<pre><code class="language-js">myInfo.friend = &quot;gorae&quot;;</code></pre>
<p><strong><em>중요한 점은 object 에서 myInfo 의 내부에 있는 값은 바꿀 수 있었지만 myInfo 자체를 바꾸는 것은 (update) 불가능했다. 그 이유는 const, 상수로 선언된 object 이기 때문이다.</em></strong></p>
<p>이처럼 object 안에 array 를 넣을 수 있고, object 내의 array 내에 object 를 넣을 수 있다.</p>
<p>그리고 object 안에 object 를 아래와 같이 넣을 수 있다.</p>
<pre><code class="language-js">const doubleCurly = {
  people1 : {name:&quot;nico&quot;,age:24},
  people2 : {name:&quot;minji&quot;,age:19}
};
console.log(doubleCurly);</code></pre>
<p>다음과 같이 출력된다.</p>
<pre><code class="language-js">{ people1: { name: &#39;nico&#39;, age: 24 },
  people2: { name: &#39;minji&#39;, age: 19 } }</code></pre>
<p>people1 의 name 에도 접근할 수 있게 되었다.</p>
<pre><code class="language-js">console.log(doubleCurly.people1.name);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[바닐라JS - Datatype 의 정렬 with Array.]]></title>
            <link>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-Datatype-%EC%9D%98-%EC%A0%95%EB%A0%AC-with-Array</link>
            <guid>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-Datatype-%EC%9D%98-%EC%A0%95%EB%A0%AC-with-Array</guid>
            <pubDate>Tue, 04 Aug 2020 05:46:40 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트의 데이터타입을 정렬하는 방법에는 array 와 object 가 있는데 일단 array 를 먼저 확인해 본다.</p>
<h2 id="1-변수명-camelcase">1. 변수명, camelCase.</h2>
<p>변수명 중간에 스페이스 (공간) 가 필요한 곳에는 스페이스를 넣을 수 없으니 대문자를 넣는다.
다른 기호들은 허용되지 않는다.</p>
<h2 id="2-일주일의-각-요일을-출력해-보기">2. 일주일의 각 요일을 출력해 보기</h2>
<pre><code class="language-js">const mon = &quot;Mon&quot;;
const tue = &quot;Tue&quot;;
const wed = &quot;Wed&quot;;
const thu = &quot;Thu&quot;;
const fri = &quot;Fri&quot;;
const sat = &quot;Sat&quot;;
const sun = &quot;Sun&quot;;

console.log(mon,tue,wed,thu,fri,sat,sun);</code></pre>
<p>나름 무식? 하게 했어도 원하는 결과물은 볼 수는 있긴 하다.
하지만 좋지 않은 예시이다.</p>
<h2 id="3-배열-array">3. 배열 (array)</h2>
<pre><code class="language-js">const daysOfWeek = [&quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;, &quot;Sat&quot;, &quot;Sun&quot;,
                    {name:&quot;mook&quot;},[&quot;공휴일&quot;,&quot;국경일&quot;]];

console.log(daysOfWeek);
console.log(daysOfWeek[2]);</code></pre>
<p>아래와 같이 출력된다.</p>
<pre><code>[ &#39;Mon&#39;,
  &#39;Tue&#39;,
  &#39;Wed&#39;,
  &#39;Thu&#39;,
  &#39;Fri&#39;,
  &#39;Sat&#39;,
  &#39;Sun&#39;,
  { name: &#39;mook&#39; },
  [ &#39;공휴일&#39;, &#39;국경일&#39; ] ]

Wed</code></pre><p>배열(list) 안에는 booltype, object, array, string, let, const 그 무엇도 저장이 가능하다.</p>
<p>배열 내에서 각 요소에 접근하기 위해서는 위의 코드처럼 <strong><em>console.log(daysOfWeek[2]);</em></strong> 이렇게 표시하는데 컴퓨터는 앞에서부터 0부터 세기 시작한다는 것을 기억하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[바닐라JS - Datatype]]></title>
            <link>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-Datatype</link>
            <guid>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-Datatype</guid>
            <pubDate>Tue, 04 Aug 2020 05:34:08 GMT</pubDate>
            <description><![CDATA[<h2 id="1-string-문자열">1. string (문자열)</h2>
<pre><code class="language-js">
const myName = Nicolas;
// js 에서 Nicolas 라는 변수를 찾으려 드는데 없어서 error 발생.

const myName = &quot;Nicolas&quot;;
const emoji = &quot;🥰&quot;;

console.log(myName);</code></pre>
<p>&quot;&quot; (큰따옴표) 나 &#39;&#39; (작은따옴표) 의 결과는 같다.
문자열은 반드시 따옴표를 사이에 넣어 줘야 한다.
따옴표 내의 숫자는 숫자가 아닌 문자열이다.</p>
<h2 id="2-boolean-불타입">2. boolean (불타입)</h2>
<pre><code class="language-js">const isHandsome = true;</code></pre>
<h2 id="3-number---float">3. number - float</h2>
<pre><code class="language-js">
const floatNumber = 55.1;

console.log(floatNumber)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[바닐라JS - 상수]]></title>
            <link>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-%EC%83%81%EC%88%98</link>
            <guid>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-%EC%83%81%EC%88%98</guid>
            <pubDate>Tue, 04 Aug 2020 05:24:09 GMT</pubDate>
            <description><![CDATA[<h2 id="1-const">1. const</h2>
<p>가끔은 이 변수의 값이 말 그대로 변수가 아니기를, 변하지 않기를 바랄 때 어떻게 할까?
변수를 선언하는 것 (let) 대신 상수 (const) 를 선언한다.</p>
<p>임의의 자바스크립트 1000줄 코드에서 info 라는 변수에 100을 넣어 생성 및 초기화 그리고 사용하다가 어느 시점에 info = 99 로 업데이트 해서 써버렸다.</p>
<p>이러면 어디에서 잘못되었는지 찾기가 쉽지 않다고 한다.</p>
<p>그래서 let 대신 const 를 쓰는데 constant, 상수는 stable, 안정적이며 변하지 않는다.</p>
<p>아래 예시로 이해할 수 있다.</p>
<pre><code class="language-js">const a = 221;
const b = a - 5;

// 위에 상수를 선언해 놓고 a 는 4라고 슬그머치 업데이트를 시도.
a = 4;
console.log(b, a);

// 여지없이 콘솔에 에러 메시지를 확인할 수 있다.
TypeError: Assignment to constant variable. at /script.js:4:3

// 상수에는 어떤 대입을 할 수 없다.</code></pre>
<h2 id="2-var">2. var</h2>
<p>let 과 같은 역할을 하는데 이제는 var 을 사용하지 않고 let과 const만 쓰인다.</p>
<p>참고하면 좋을 링크
<a href="https://ko.javascript.info/var">https://ko.javascript.info/var</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[바닐라JS - 변수]]></title>
            <link>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@seolleung_ee/%EB%B0%94%EB%8B%90%EB%9D%BCJS-%EB%B3%80%EC%88%98</guid>
            <pubDate>Tue, 04 Aug 2020 05:07:47 GMT</pubDate>
            <description><![CDATA[<h2 id="1-자바스크립트-코드-한-줄line--expressions">1. 자바스크립트 코드 한 줄(Line) = &#39;expressions&#39;</h2>
<pre><code class="language-js">a = 221
b = a - 5

console.log(b)</code></pre>
<p>모든 instruction 은 각기 다른 라인에 있다.
각각의 라인들을 &#39;expressions&#39; 라고 부르도록 한다.</p>
<p>한 expression 이 끝났음을 선언하는 법은 끝에 semi-colon 을 (;) 넣어주는 것이다.</p>
<pre><code class="language-js">a = 221;
b = a - 5;

console.log(b,a);</code></pre>
<h2 id="2-변수-let의-create-initialize-use">2. 변수 let의 Create, Initialize, Use</h2>
<p>변수는 다음 세 과정을 거친다</p>
<ol>
<li>Create (변수를 생성하고)</li>
<li>Initialize (변수에 값을 넣어 초기화하고)</li>
<li>Use (변수를 사용 또는 업데이트하기)</li>
</ol>
<p>위의 코드를 다시 확인해보면,</p>
<pre><code class="language-js">// 1. 변수 a를 생성하고
// 2. 그 a를 221로 초기화시켰다.
let a = 221;

// 여기에는 let a - 5 라고 쓰지 않았다. 위에서 생성 및 초기화된 변수 a 를 &quot;사용&quot;하고 있다.
let b = a - 5;

console.log(b,a);</code></pre>
<p>변수를 초기화하기 전에 &quot;let&quot; 이라는 단어를 넣어야 하는 것이 규칙이라고 한다.
변수를 초기화 하거나 생성할 때에는 변수 앞에 let 을 넣어주지만, 이미 생성 및 초기화 된 변수를 &quot;사용&quot; 하거나 &quot;업데이트&quot; 할 때는 참조만 하면 되므로 let 을 넣을 필요가 없다.</p>
<p>아래는 변수를 업데이트 하는 과정이다.</p>
<pre><code class="language-js">let a = 221;
let b = a - 5;
a = 4;
// 여기에는 let a 라고 쓰지 않았다. 위에서 생성 및 초기화된 변수 a 를 &quot;업데이트&quot;하고 있다.
console.log(b, a);</code></pre>
<p>b는 216, a는 기존 221 에서 4로 업데이트 되었다.</p>
<p>자바스크립트도 위에서 아래로 코드가 읽어져 내려가는 형태이다.</p>
]]></description>
        </item>
    </channel>
</rss>