<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hanna_.log</title>
        <link>https://velog.io/</link>
        <description>A Developer Who Thinks Why</description>
        <lastBuildDate>Tue, 29 Oct 2024 03:06:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hanna_.log</title>
            <url>https://velog.velcdn.com/images/lia_1996/profile/5fa2feb2-e146-42e1-8b62-d64b025292d8/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hanna_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lia_1996" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[ Svelte ] 스벨트 그리고 리액트]]></title>
            <link>https://velog.io/@lia_1996/Svelte-%EC%8A%A4%EB%B2%A8%ED%8A%B8-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A6%AC%EC%95%A1%ED%8A%B8</link>
            <guid>https://velog.io/@lia_1996/Svelte-%EC%8A%A4%EB%B2%A8%ED%8A%B8-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A6%AC%EC%95%A1%ED%8A%B8</guid>
            <pubDate>Tue, 29 Oct 2024 03:06:51 GMT</pubDate>
            <description><![CDATA[<br />

<h2 id="🌟-svelte란">🌟 Svelte란?</h2>
<blockquote>
<p> Svelte는 현대적인 웹 애플리케이션을 구축하기 위한 혁신적인 프레임워크로, 사용자가 작성한 코드가 <strong>빌드 과정에서 최적화</strong>되어 실행될 수 있도록 돕고, <strong>컴파일러 기반의 접근 방식</strong>을 채택하고 있어, 런타임 대신 빌드 타임에 코드를 변환하여 더 빠르고 효율적인 애플리케이션을 생성합니다.</p>
</blockquote>
<br />
<br />


<h3 id="💡-svelte의-주요-장점">💡 Svelte의 주요 장점</h3>
<ul>
<li><strong>싱글 파일 컴포넌트 (SFC)</strong><ul>
<li>Svelte는 Vue와 마찬가지로 컴포넌트 하나를 파일 하나에 담는 방식을 사용합니다.</li>
<li>HTML, CSS, JS가 모두 같은 파일에 있어 코드 의존성을 쉽게 파악할 수 있고, 모듈 관리가 편리합니다.</li>
<li>모든 코드가 하나의 파일에 있기 때문에 구조가 더 간결하고 읽기 쉽습니다.</li>
</ul>
</li>
<li><strong>컴파일러 기반 프레임워크</strong><ul>
<li>Svelte는 런타임에 동작하는 대신 컴파일 시점에 코드를 최적화 합니다.</li>
<li>가상 돔(Virtual DOM)을 사용하지 않고, 브라우저가 직접 DOM을 업데이트 합니다.</li>
<li>React나 Vue와 달리 가상 돔이 없어 실제 돔을 변경하는 과정을 단순화하고, 화면 업데이트가 더 빠릅니다.</li>
</ul>
</li>
<li><strong>뛰어난 성능</strong><ul>
<li>컴파일 단계에서 코드 최적화를 수행하기 때문에 런타임 오버헤드가 없습니다.</li>
<li>React와 같은 가상 돔 기반 프레임워크보다 더 빠르고 효율적인 성능을 보여줍니다.</li>
<li>변경 사항이 발생할 때 화면을 더 빠르게 업데이트 합니다.</li>
</ul>
</li>
<li><strong>낮은 러닝커브</strong><ul>
<li>HTML, CSS, JS의 기존 문법을 그대로 사용할 수 있어 새로운 개념을 추가로 배우지 않아도 됩니다.</li>
<li>기존 웹 기술을 이해하고 있으면 쉽게 시작할 수 있습니다.</li>
<li>예를 들어, 일반 JavaScript 변수를 선언해서 상태처럼 사용할 수 있으며, 추가적인 상태 관리 도구 없이도 반응형 데이터 처리가 가능합니다.</li>
</ul>
</li>
<li><strong>보일러플레이트 코드가 없음</strong><ul>
<li>초기 설정이 거의 필요 없고, 필요 없는 코드 없이 매우 간결하게 작성 가능합니다.</li>
<li>추가 설정이나 복잡한 구성이 필요하지 않기 때문에 프로젝트 시작이 빠르고 직관적 입니다.</li>
<li>컴포넌트 파일에 필수 요소만 작성하게 설계되어 불필요한 코드 작성량을 줄이고 관리가 쉽습니다.</li>
</ul>
</li>
<li><strong>타입스크립트 및 IDE 지원 개선</strong><ul>
<li>Svelte 5 업데이트 이후 타입스크립트와 IDE 지원이 강화되어, 프로젝트 설정 및 도구 통합이 더 수월해졌습니다.</li>
<li>개발자들이 Svelte를 사용하면서 타입스크립트를 보다 원활하게 활용할 수 있도록 지원합니다.</li>
</ul>
</li>
</ul>
<br />
<br />

<h3 id="🔴-svelte의-단점">🔴 Svelte의 단점</h3>
<ul>
<li><strong>생태계 부족</strong><ul>
<li>React나 Vue에 비해 커뮤니티와 생태계가 상대적으로 작습니다.</li>
</ul>
</li>
<li><strong>상태 관리 라이브러리가 없음</strong><ul>
<li>Svelte는 자체 <code>store</code>를 제공해 간단한 상태 관리는 가능하지만, 복잡한 상태 관리에는 외부 라이브러리나 직접적인 코드 관리가 필요합니다.</li>
</ul>
</li>
</ul>
<br />
<br />

<h3 id="🔄-svelte-vs-react-차이점">🔄 Svelte vs React 차이점</h3>
<h4 id="react의-특징">React의 특징</h4>
<ul>
<li><strong>가상 돔 사용</strong><ul>
<li>React는 가상 돔(Virtual DOM)을 활용하여 변경 사항을 효율적으로 처리합니다.</li>
<li>변경사항이 발생할 때마다 새로운 가상 돔을 생성하고, 실제 돔과 비교한 후 필요한 부분만 업데이트 합니다.</li>
</ul>
</li>
<li><strong>상태값 변경 시 컴포넌트 전체 재실행</strong><ul>
<li>React에서는 상태값이 변경되면 해당 컴포넌트가 전체 재실행 됩니다.</li>
<li>상태가 많은 컴포넌트에서는 성능 저하로 이어질 수 있습니다.</li>
</ul>
</li>
<li><strong>비효율적인 복사 과정</strong><ul>
<li>React는 불변성을 유지하기 위해 상태값이 변경될 때마다 새로운 값을 생성하고 복사하는 과정을 수행합니다.</li>
<li>이 과정은 메모리와 CPU 자원을 소모하여 성능 저하를 초래할 수 있습니다.</li>
</ul>
</li>
<li><strong>최상위 앨리먼트 제약</strong><ul>
<li>React에서는 컴포넌트가 하나의 최상위 요소를 반환해야 합니다.</li>
<li>이를 위해 <code>&lt;Fragment&gt;</code>나 <code>&lt;div&gt;</code>를 자주 사용해야 하며, 가독성 측면에서 불편함을 줄 수 있습니다.</li>
</ul>
</li>
</ul>
<h4 id="svelte의-특징">Svelte의 특징</h4>
<ul>
<li><strong>컴포넌트 전체 재실행 없음</strong><ul>
<li>Svelte에서는 상태가 변경될 때 전체 컴포넌트를 재실행하지 않습니다.</li>
<li>이로 인해 필요한 부분만 효율적으로 업데이트할 수 있음. 단, 반응성 구문 같은 몇 가지 예외가 존재합니다.</li>
</ul>
</li>
<li><strong>컴파일러 기반 상태 변경 감지</strong><ul>
<li>상태 변경을 감지하기 위해 컴파일러가 <code>=</code> 연산자를 사용합니다.</li>
<li>React처럼 상태값을 복사할 필요가 없어 코드가 간결하고 성능이 향상됩니다.</li>
</ul>
</li>
<li><strong>빌드 타임 최적화</strong><ul>
<li>빌드 타임에 최적화된 코드가 생성됩니다.</li>
<li>이로 인해 실행 시 매번 가상 돔을 생성하거나 비교할 필요 없이, 빠르게 화면을 업데이트할 수 있습니다.</li>
</ul>
</li>
<li><strong>최상위 앨리먼트 제약 없음</strong><ul>
<li>실제 DOM을 직접 생성하기 때문에, React처럼 최상위 엘리먼트를 하나만 사용해야 하는 제약이 없습니다.</li>
<li>덕분에 자유로운 구조로 HTML을 작성할 수 있습니다.</li>
</ul>
</li>
</ul>
<br />
<br />

<h3 id="🔍-상세-비교">🔍 상세 비교</h3>
<table>
<thead>
<tr>
<th><code>React</code></th>
<th><code>Svelte</code></th>
</tr>
</thead>
<tbody><tr>
<td>상태 관리를 위해 useState 훅 사용 필요</td>
<td>일반 JavaScript 변수로 상태 관리 가능</td>
</tr>
<tr>
<td>input 값 변경 시 명시적 상태 업데이트 필요</td>
<td>bind 지시자를 사용해 상태와 동기화 가능</td>
</tr>
<tr>
<td>상태값을 숫자로 변경할 때 + 연산자 필요</td>
<td>bind 지시자로 타입 변환 자동 처리</td>
</tr>
</tbody></table>
<br />
<br />

<h3 id="🌱-예시-코드-비교">🌱 예시 코드 비교</h3>
<h4 id="1-컴포넌트-구조">1. 컴포넌트 구조</h4>
<pre><code class="language-jsx">// React 예시

import React, { useState } from &#39;react&#39;;

function Counter() {
    const [count, setCount] = useState(0); // 상태를 관리하기 위해 useState 훅을 사용

    return (
        &lt;div&gt;
            &lt;h1&gt;{count}&lt;/h1&gt; {/* 현재 count 상태를 출력 */}
            &lt;button onClick={() =&gt; setCount(count + 1)}&gt;Increment&lt;/button&gt; {/* 버튼 클릭 시 count 증가 */}
        &lt;/div&gt;
    );
}

export default Counter;</code></pre>
<pre><code class="language-jsx">// Svelte 예시

&lt;script&gt;
    let count = 0; // 일반 변수로 상태를 관리
&lt;/script&gt;

&lt;h1&gt;{count}&lt;/h1&gt; {/* 현재 count 변수를 출력 */}
&lt;button on:click={() =&gt; count += 1}&gt;Increment&lt;/button&gt; {/* 버튼 클릭 시 count 증가 */}</code></pre>
<br />

<h4 id="2-props-전달">2. Props 전달</h4>
<pre><code class="language-jsx">// React 예시

import React from &#39;react&#39;;

function Greeting({ name }) {
    return &lt;h1&gt;Hello, {name}!&lt;/h1&gt;; // props로 전달받은 name을 출력
}

function App() {
    return &lt;Greeting name=&quot;Svelte&quot; /&gt;; // Greeting 컴포넌트에 &quot;Svelte&quot;라는 name 전달
}

export default App;</code></pre>
<pre><code class="language-jsx">// Svelte 예시

&lt;script&gt;
    export let name; // props로 전달받은 name을 export하여 사용
&lt;/script&gt;

&lt;h1&gt;Hello, {name}!&lt;/h1&gt; {/* props로 전달받은 name을 출력 */}

&lt;!-- 사용 예 --&gt;
&lt;Greeting name=&quot;Svelte&quot; /&gt; {/* Greeting 컴포넌트에 &quot;Svelte&quot;라는 name 전달 */}</code></pre>
<br />

<h4 id="3-이벤트-핸들링">3. 이벤트 핸들링</h4>
<pre><code class="language-jsx">// React 예시

import React from &#39;react&#39;;

function App() {
    const handleClick = () =&gt; {
        alert(&#39;Button clicked!&#39;); // 버튼 클릭 시 알림 표시
    };

    return &lt;button onClick={handleClick}&gt;Click Me&lt;/button&gt;; // 버튼 클릭 이벤트 핸들러 설정
}

export default App;</code></pre>
<pre><code class="language-jsx">// Svelte 예시

&lt;script&gt;
    function handleClick() {
        alert(&#39;Button clicked!&#39;); // 버튼 클릭 시 알림 표시
    }
&lt;/script&gt;

&lt;button on:click={handleClick}&gt;Click Me&lt;/button&gt; {/* 버튼 클릭 이벤트 핸들러 설정 */}</code></pre>
<br />

<h4 id="4-조건부-렌더링">4. 조건부 렌더링</h4>
<pre><code class="language-jsx">// React 예시

import React, { useState } from &#39;react&#39;;

function App() {
    const [isVisible, setIsVisible] = useState(false); // 상태값 isVisible을 관리

    return (
        &lt;div&gt;
            &lt;button onClick={() =&gt; setIsVisible(!isVisible)}&gt;Toggle&lt;/button&gt; {/* 버튼 클릭 시 isVisible 값 토글 */}
            {isVisible &amp;&amp; &lt;p&gt;This is visible!&lt;/p&gt;} {/* isVisible이 true일 때만 내용 표시 */}
        &lt;/div&gt;
    );
}

export default App;</code></pre>
<pre><code class="language-jsx">// Svelte 예시

&lt;script&gt;
    let isVisible = false; // 상태값 isVisible을 관리

    function toggle() {
        isVisible = !isVisible; // isVisible 값을 토글하는 함수
    }
&lt;/script&gt;

&lt;button on:click={toggle}&gt;Toggle&lt;/button&gt; {/* 버튼 클릭 시 toggle 함수 호출 */}
{#if isVisible} 
    &lt;p&gt;This is visible!&lt;/p&gt; {/* isVisible이 true일 때만 내용 표시 */}
{/if}</code></pre>
<br />

<h4 id="5-리스트-렌더링">5. 리스트 렌더링</h4>
<pre><code class="language-jsx">// React 예시

import React from &#39;react&#39;;

function App() {
    const items = [&#39;Apple&#39;, &#39;Banana&#39;, &#39;Cherry&#39;]; // 리스트 항목 배열

    return (
        &lt;ul&gt;
            {items.map((item, index) =&gt; (
                &lt;li key={index}&gt;{item}&lt;/li&gt; // 각 항목을 리스트 아이템으로 표시
            ))}
        &lt;/ul&gt;
    );
}

export default App;</code></pre>
<pre><code class="language-jsx">// Svelte 예시

&lt;script&gt;
    let items = [&#39;Apple&#39;, &#39;Banana&#39;, &#39;Cherry&#39;]; // 리스트 항목 배열
&lt;/script&gt;

&lt;ul&gt;
    {#each items as item} 
        &lt;li&gt;{item}&lt;/li&gt; {/* 각 항목을 리스트 아이템으로 표시 */}
    {/each}
&lt;/ul&gt;</code></pre>
<br />
<br />


]]></description>
        </item>
        <item>
            <title><![CDATA[[ JavaScript ] 실행 컨텍스트 (Execution Context)]]></title>
            <link>https://velog.io/@lia_1996/JavaScript-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-Execution-Context</link>
            <guid>https://velog.io/@lia_1996/JavaScript-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-Execution-Context</guid>
            <pubDate>Wed, 25 Sep 2024 05:49:43 GMT</pubDate>
            <description><![CDATA[<br />

<h2 id="🖥️-실행-컨텍스트-execution-context란">🖥️ 실행 컨텍스트 (Execution Context)란?</h2>
<blockquote>
<p> 자바스크립트 코드가 실행될 때마다 &quot;실행 컨텍스트&quot;라는 실행 환경이 생성되는데
코드가 실행되는 동안 <strong>스코프, 변수, 함수 및 this 바인딩 정보</strong>를 관리하는데 중요한 역할을 합니다. 
실행 컨텍스트는 크게 <strong>전역 컨텍스트, 함수 컨텍스트</strong>로 나뉘며, 각각 코드의 실행 환경을 설정합니다.
자바스크립트는 <strong>단일 스레드로 동작</strong>하기 때문에
실행 컨텍스트는 <strong>콜 스택(Call Stack)</strong>을 통해 순차적으로 처리됩니다.</p>
</blockquote>
<br />
<br />


<h3 id="🔍-실행-컨텍스트-종류">🔍 실행 컨텍스트 종류</h3>
<ol>
<li><strong>전역 컨텍스트</strong> : 자바스크립트 코드가 로드될 때 가장 먼저 생성되는 실행 컨텍스트이며,
전역 컨텍스트는 전역 객체인 window 또는 global을 참조하고
전역에서 선언된 변수와 함수가 이 컨텍스트에 포함됩니다.</li>
<li><strong>함수 컨텍스트</strong> : 함수가 호출될 때마다 새로운 함수 컨텍스트가 생성되고,
함수 내부의 지역 변수, 함수 인수, 그리고 내부 함수들이 함수 컨텍스트에서 관리됩니다.</li>
</ol>
<br />
<br />

<h3 id="⚙️-실행-컨텍스트-동작-방식">⚙️ 실행 컨텍스트 동작 방식</h3>
<ol>
<li><strong>평가 단계</strong> : 코드가 실행되기 전에 자바스크립트 엔진은 실행 컨텍스트를 먼저 평가하는데
이 과정에서 변수나 함수 선언이 실행 컨텍스트에 기록되며,
이를 통해 <a href="https://velog.io/@lia_1996/JavaScript-Hoisting">호이스팅(Hoisting)</a>이 일어납니다.</li>
<li><strong>실행 단계</strong> : 평가가 완료된 후, 실제 코드가 실행됩니다.
이때 변수 선언을 제외한 나머지 코드가 순차적으로 처리되며, 값이 할당되거나 함수가 호출됩니다.</li>
</ol>
<br />
<br />

<h3 id="📚-콜-스택-call-stack">📚 콜 스택 (Call Stack)</h3>
<p>실행 컨텍스트는 콜 스택이라는 구조에서 관리는데 콜 스택은
<a href="https://velog.io/@lia_1996/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%ED%81%90-Queue%EC%99%80-%EC%8A%A4%ED%83%9D-Stack">LIFO (Last In First Out)</a> 구조로 가장 마지막에 추가된 실행 컨텍스트가 먼저 실행됩니다.
함수가 호출될 때마다 새로운 실행 컨텍스트가 콜 스택에 쌓이고,
함수 실행이 완료되면 해당 컨텍스트가 스택에서 제거됩니다.
자바스크립트는 단일 스레드 기반 언어이기 때문에, 한 번에 하나의 실행 컨텍스트만 실행됩니다.</p>
<br />
<br />

<h3 id="📦-렉시컬-환경-lexical-environment">📦 렉시컬 환경 (Lexical Environment)</h3>
<p>실행 컨텍스트 내부에는 렉시컬 환경이라는 데이터 구조가 존재하는데
이 구조는 변수와 함수 같은 식별자들을 관리하며, 자바스크립트 코드의 상태를 유지합니다.
렉시컬 환경은 두 가지 주요 구성 요소로 나뉩니다.</p>
<ol>
<li><strong>환경 레코드 (Environment Record)</strong> : 현재 실행 중인 코드 블록이나 함수에서 선언된 변수와 함수들이 저장되는 공간입니다.</li>
<li><strong>외부 렉시컬 환경 참조 (Outer Lexical Environment Reference)</strong> : 해당 렉시컬 환경이 상위 스코프를 참조할 수 있도록 연결해주는 역할을 합니다.
이를 통해 상위 스코프에 있는 변수에 접근할 수 있습니다.</li>
</ol>
<br />

<h4 id="렉시컬-환경의-동작-과정">렉시컬 환경의 동작 과정</h4>
<ol>
<li><strong>식별자 생성</strong> : 함수나 변수가 선언될 때, 해당 식별자가 렉시컬 환경에 등록됩니다.</li>
<li><strong>외부 환경 참조 설정</strong> : 현재 컨텍스트가 상위 스코프에 접근할 수 있도록 외부 렉시컬 환경이 설정됩니다.</li>
</ol>
<br />
<br />

<h4 id="예시코드">예시코드</h4>
<pre><code class="language-jsx">// 코드 실행 시 생성되며, globalVariable이라는 전역 변수를 선언
let globalVariable = &quot;global variable&quot;;

function parentFunction() {
    // parentFunction 호출 시 새로운 컨텍스트가 생성되고, parentVariable이라는 지역 변수를 선언
    let parentVariable = &quot;parent variable&quot;;

    // childFunction은 parentFunction 안에 정의되어 있으며, 호출 시 새로운 컨텍스트가 생성
    function childFunction() {

        let childVariable = &quot;child variable&quot;;
        console.log(globalVariable); 
        console.log(parentVariable);  
        console.log(childVariable);  
      // childFunction 내에서 전역 변수(globalVariable), 외부 함수의 지역 변수(parentVariable), 자신의 지역 변수(childVariable)에 접근 가능
    }

    childFunction(); // childFunction 호출
}

parentFunction(); // parentFunction 호출</code></pre>
<br />
<br />

<blockquote>
<p> <strong>실행 컨텍스트</strong> : 코드 실행 환경으로, 스코프와 변수 정보를 관리
<strong>콜 스택</strong> : 실행 컨텍스트가 쌓이는 구조, 마지막에 추가된 것이 먼저 실행
<strong>렉시컬 환경</strong> : 변수와 함수 식별자를 관리하는 데이터 구조
( 변수, 함수들이 어떤 스코프를 참조할 수 있는지 등을 결정 )</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 자료 구조 ] 큐 (Queue)와 스택 (Stack)]]></title>
            <link>https://velog.io/@lia_1996/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%ED%81%90-Queue%EC%99%80-%EC%8A%A4%ED%83%9D-Stack</link>
            <guid>https://velog.io/@lia_1996/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%ED%81%90-Queue%EC%99%80-%EC%8A%A4%ED%83%9D-Stack</guid>
            <pubDate>Fri, 06 Sep 2024 08:57:55 GMT</pubDate>
            <description><![CDATA[<br />

<h2 id="🗂-자료구조data-structure란">🗂 자료구조(Data Structure)란?</h2>
<blockquote>
<p>*<em>데이터를 효율적으로 저장하고 관리하는 방법을 의미합니다. *</em>
자료구조는 크게 선형구조와 비선형구조로 나뉘는데 각각의 구조는
데이터가 어떻게 저장되고 처리되는지에 따라 성능과 사용 목적이 달라집니다.</p>
</blockquote>
<br />

<h3 id="📊-선형-구조-linear-structure">📊 선형 구조 (Linear Structure)</h3>
<pre><code>데이터가 일렬로 나열되어 있는 형태로, 
각 데이터 요소가 이전과 다음 요소와 직접적으로 연결되어 있습니다.
선형구조에서는 데이터의 순서가 매우 중요하며,
주로 순차적으로 접근하거나 처리해야 하는 경우에 사용됩니다.</code></pre><h4 id="대표적인-선형-구조">&gt;&gt; 대표적인 선형 구조</h4>
<ul>
<li><h5 id="배열array-고정된-크기의-연속된-메모리-공간에-데이터를-저장하는-구조">배열(Array): 고정된 크기의 연속된 메모리 공간에 데이터를 저장하는 구조.</h5>
</li>
<li><h5 id="연결-리스트linked-list-각-데이터가-포인터로-다음-데이터와-연결되는-방식">연결 리스트(Linked List): 각 데이터가 포인터로 다음 데이터와 연결되는 방식.</h5>
</li>
<li><h5 id="큐queue-선입선출fifo-방식으로-데이터를-처리하는-자료구조">큐(Queue): 선입선출(FIFO) 방식으로 데이터를 처리하는 자료구조.</h5>
</li>
<li><h5 id="스택stack-후입선출lifo-방식으로-데이터를-처리하는-자료구조">스택(Stack): 후입선출(LIFO) 방식으로 데이터를 처리하는 자료구조.</h5>
</li>
</ul>
<br />

<h3 id="🌳-비선형-구조-non-linear-structure">🌳 비선형 구조 (Non-linear Structure)</h3>
<pre><code>데이터들이 계층적이거나 네트워크 구조로 연결되어 있어,
각 데이터 간의 관계가 1:1이 아닌 1:다 또는 다:다로 연결됩니다. 
비선형구조에서는 특정 데이터와 그 주변 데이터 간의 관계가 중요하며, 
복잡한 데이터 구조를 효율적으로 표현하고 처리할 수 있습니다.</code></pre><h4 id="대표적인-비선형-구조">&gt;&gt; 대표적인 비선형 구조</h4>
<ul>
<li><h5 id="트리tree-계층적-구조로-루트-노드를-시작으로-각-노드가-부모-자식-관계를-가지며-여러-레벨로-나뉨">트리(Tree): 계층적 구조로, 루트 노드를 시작으로 각 노드가 부모-자식 관계를 가지며 여러 레벨로 나뉨</h5>
</li>
<li><h5 id="그래프graph-정점node과-간선edge으로-구성된-네트워크-구조로-다양한-경로를-통해-데이터가-연결">그래프(Graph): 정점(Node)과 간선(Edge)으로 구성된 네트워크 구조로, 다양한 경로를 통해 데이터가 연결</h5>
</li>
</ul>
<br />

<hr>
<br />

<h3 id="🚶♂️🚶♀️-큐-queue">🚶‍♂️🚶‍♀️ 큐 (Queue)</h3>
<p>큐는 *<em>선입선출(FIFO, First In First Out) *</em>원칙에 따라 데이터를 저장하고 처리하는 구조입니다.
즉, 먼저 들어온 데이터가 먼저 나가게 됩니다.  큐는 일상 생활에서도 흔히 볼 수 있는 구조로, 식당에서 웨이팅을 기다릴때 빈자리가 생기면 표를 뽑은 순서대로 들어가게 되는 경우를 예를 들 수 있습니다.</p>
<br />

<h4 id="큐의-동작-방식">큐의 동작 방식</h4>
<ul>
<li>입구 (Enqueue): 데이터를 큐에 추가하는 과정이며, 큐의 맨 뒤에 데이터를 추가합니다.</li>
<li>출구 (Dequeue): 큐에서 데이터를 제거하는 과정이며. 큐의 맨 앞에서 데이터를 제거합니다.</li>
</ul>
<br />

<h4 id="큐의-특징">큐의 특징</h4>
<ul>
<li>데이터를 입력한 순서대로 처리할 수 있도록 설계되어 있습니다.</li>
<li>FIFO 원칙에 따라, 큐의 앞쪽에서 데이터가 먼저 처리됩니다.</li>
<li>응용 예: 프로세스 스케줄링, 버퍼 관리 등</li>
</ul>
<br />

<h4 id="예시코드">예시코드</h4>
<pre><code class="language-jsx">
// 큐를 생성하고 초기 상태 선언
let queueData = [];


// 큐에 데이터를 추가하는 함수
const enqueue = (queue, data) =&gt; {
    // 큐의 맨 뒤에 데이터를 추가
    queue.push(data); 
};


// 큐에서 데이터를 제거하는 함수
const dequeue = (queue) =&gt; {
    // 큐가 비어있는 경우 에러 메시지를 반환
    if (queue.length === 0) {
        return { error: &#39;Queue is empty&#39; };
    }
    // 큐의 맨 앞에서 데이터를 제거하고 반환
    return queue.shift();
};


// 큐의 첫 번째 데이터를 확인하는 함수
const frontQueueData = (queue) =&gt; {
    // 큐가 비어있는 경우 에러 메시지를 반환
    if (queue.length === 0) {
        return { error: &#39;Queue is empty&#39; };
    }
    // 큐의 맨 앞 데이터를 반환
    return queue[0];
};


// 큐가 비어있는지 확인하는 함수
const isEmpty = (queue) =&gt; {
    // 큐의 길이가 0이면 true, 아니면 false를 반환
    return queue.length === 0;
};


// 큐의 크기를 확인하는 함수
const size = (queue) =&gt; {
    // 큐의 현재 길이를 반환
    return queue.length;
};


// 큐의 모든 데이터를 출력하는 함수
const printQueue = (queue) =&gt; {
    // 큐의 모든 데이터를 문자열로 변환하여 반환
    return queue.join(&#39;, &#39;);
};


// 사용 예시
enqueue(queueData, &#39;A&#39;); // 큐에 &#39;A&#39; 추가
enqueue(queueData, &#39;B&#39;); // 큐에 &#39;B&#39; 추가
console.log(printQueue(queueData)); // A, B 출력
console.log(dequeue(queueData)); // A 출력 후 큐에서 제거
console.log(printQueue(queueData)); // B 출력
console.log(frontQueueData(queueData)); // B 출력 (큐의 첫 번째 데이터)
console.log(isEmpty(queueData)); // false 출력 (큐가 비어있지 않음)
console.log(size(queueData)); // 1 출력 (큐의 크기)</code></pre>
<br />
<br />


<h3 id="📚-스택-stack">📚 스택 (Stack)</h3>
<p>스택은 <strong>후입선출(LIFO, Last In First Out)</strong> 원칙에 따라 데이터를 저장하고 처리하는 구조입니다.
즉, 마지막에 들어온 데이터가 가장 먼저 나가게 됩니다.
박스에 책을 넣을때 가장 마지막에 넣은 책이 가장 먼저 나오는 것처럼 스택도 마지막에 들어온 데이터가 먼저 처리됩니다.</p>
<br />

<h4 id="스택의-동작-방식">스택의 동작 방식</h4>
<ul>
<li>푸시 (Push): 데이터를 스택에 추가하는 과정입니다. 스택의 맨 위에 데이터를 추가합니다.</li>
<li>팝 (Pop): 스택에서 데이터를 제거하는 과정입니다. 스택의 맨 위에서 데이터를 제거합니다.</li>
</ul>
<br />

<h4 id="스택의-특징">스택의 특징</h4>
<ul>
<li>데이터가 들어온 순서와 반대로 처리됩니다.</li>
<li>LIFO 원칙에 따라, 스택의 위쪽에서 데이터가 먼저 처리됩니다.</li>
<li>응용 예: 함수 호출 스택, 재귀 호출 등</li>
</ul>
<br />

<h4 id="예시코드-1">예시코드</h4>
<pre><code class="language-jsx">
// 스택을 생성하고 초기 상태 선언
let stackData = [];


// 스택에 데이터를 추가하는 함수
const push = (stack, data) =&gt; {
    // 스택의 맨 위에 데이터를 추가
    stack.push(data); 
};


// 스택에서 데이터를 제거하는 함수
const pop = (stack) =&gt; {
    // 스택이 비어있는 경우 에러 메시지를 반환
    if (stack.length === 0) {
        return { error: &quot;Stack is empty&quot; };
    }
    // 스택의 맨 위에서 데이터를 제거하고 반환
    return stack.pop();
};


// 스택의 가장 위 데이터를 확인하는 함수
const peek = (stack) =&gt; {
    // 스택이 비어있는 경우 에러 메시지를 반환
    if (stack.length === 0) {
        return { error: &quot;Stack is empty&quot; };
    }
    // 스택의 맨 위 데이터를 반환
    return stack[stack.length - 1];
};


// 스택이 비어있는지 확인하는 함수
const isEmpty = (stack) =&gt; {
    // 스택의 길이가 0이면 true, 아니면 false를 반환
    return stack.length === 0;
};


// 스택의 크기를 확인하는 함수
const size = (stack) =&gt; {
    // 스택의 현재 길이를 반환합니다.
    return stack.length;
};


// 스택의 모든 데이터를 출력하는 함수
const printStack = (stack) =&gt; {
    // 스택의 모든 데이터를 문자열로 변환하여 반환
    return stack.join(&#39;, &#39;);
};


// 스택 사용 예시
push(stackData, 10); // 스택에 10 추가
push(stackData, 20); // 스택에 20 추가
push(stackData, 30); // 스택에 30 추가
console.log(&#39;스택 출력:&#39;, printStack(stackData)); // 스택 출력: 10, 20, 30
console.log(&#39;스택 크기:&#39;, size(stackData)); // 스택 크기: 3
console.log(&#39;스택에서 pop한 값:&#39;, pop(stackData)); // 스택에서 pop한 값: 30
console.log(&#39;스택의 최상위 값:&#39;, peek(stackData)); // 스택의 최상위 값: 20
console.log(&#39;스택이 비었는지:&#39;, isEmpty(stackData)); // 스택이 비었는지: false</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ Git ] 명령어 정리 ( 계속 수정 예정 )]]></title>
            <link>https://velog.io/@lia_1996/Git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@lia_1996/Git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 03 Sep 2024 04:40:24 GMT</pubDate>
            <description><![CDATA[<br />

<h2 id="🐱-내가-실무에서-자주-쓰는-git-명령어-정리">🐱 (내가) 실무에서 자주 쓰는 Git 명령어 정리</h2>
<blockquote>
<p> <strong>Git이란?</strong>
Git은 소스 코드의 버전 관리를 위한 분산 버전 관리 시스템(DVCS)
개발자들이 협업하여 소프트웨어를 개발할 때, Git은 코드의 변경 이력을 추적하고, 
여러 개발자가 동시에 작업할 수 있도록 지원</p>
</blockquote>
<br />
<br />

<h3 id="1-초기-설정">1. 초기 설정</h3>
<pre><code class="language-jsx">git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;your_email@example.com&quot;
git init
git remote add origin https://github.com/username/repository.git</code></pre>
<br />


<h3 id="2-브랜치-생성-및-전환">2. 브랜치 생성 및 전환</h3>
<pre><code class="language-jsx">// 새 작업 시작 시
git checkout -b 브랜치명

// 생성된 브랜치로 이동
git checkout 브랜치명</code></pre>
<br />


<h3 id="3-파일-추가-및-커밋-푸시-변경-사항-저장-및-공유">3. 파일 추가 및 커밋, 푸시 (변경 사항 저장 및 공유)</h3>
<pre><code class="language-jsx">git add .
git commit -m &quot;커밋 메시지&quot;
git push

// 새로운 브랜치에서 최초 push 시
git push -u origin 브랜치명</code></pre>
<br />


<h3 id="4-브랜치-병합-작업-완료-후-병합">4. 브랜치 병합 (작업 완료 후 병합)</h3>
<pre><code class="language-jsx">git merge 머지할 브랜치명

// merge 취소
git merge --abort

// 원격 브랜치의 최신 변경 사항을 병합
git pull origin 브랜치명</code></pre>
<br />


<h3 id="5-브랜치-삭제-필요-없는-브랜치-정리">5. 브랜치 삭제 (필요 없는 브랜치 정리)</h3>
<pre><code class="language-jsx">// 로컬 브랜치 삭제
git branch -d 브랜치명

// 원격 브랜치 삭제
git push origin --delete 브랜치명</code></pre>
<br />


<h3 id="6-커밋-취소-최근-커밋-또는-특정-커밋-취소">6. 커밋 취소 (최근 커밋 또는 특정 커밋 취소)</h3>
<pre><code class="language-jsx">// 최근 커밋 취소
git reset --soft HEAD~1 // 커밋은 삭제되지만, 변경 사항은 유지 (스테이징 상태)
git reset --hard HEAD~1 // 커밋과 변경 사항 모두 삭제 (복구 불가능)
git push origin 브랜치명 --force

// 특정 커밋 취소
git revert 커밋ID // git log로 커밋ID 확인 가능
git push origin 브랜치명</code></pre>
<br />


<h3 id="7-병합-전-빌드-파일-제외">7. 병합 전 빌드 파일 제외</h3>
<pre><code class="language-jsx">git checkout main // main 브랜치로 이동
git merge test --no-commit // test 브랜치와 병합
// ( --no-commit 옵션을 사용하여 병합 후 자동 커밋을 방지 )
git reset HEAD build/ // build 파일을 변경 사항에서 제외하기
git checkout HEAD build/ // build 디렉토리의 변경 사항을 원래 상태로 되돌리기

// 변경 사항 커밋 및 푸시
git add .
git commit -m &quot;Merged test branch into main, excluding build files&quot;
git push origin main</code></pre>
<br />

<h3 id="8-그-외">8. 그 외</h3>
<pre><code class="language-jsx">// 현재 작업 중인 변경 사항을 임시로 저장
git stash

// 저장된 변경 사항을 적용
git stash apply

// 저장된 변경 사항을 적용하고, 해당 스택에서 제거
git stash pop

// 필요 없는 stash 항목을 삭제
git stash drop

// 원격 저장소의 최신 상태를 가져옴
git fetch
</code></pre>
<br />
<br />
]]></description>
        </item>
        <item>
            <title><![CDATA[[ JavaScript ] Hoisting]]></title>
            <link>https://velog.io/@lia_1996/JavaScript-Hoisting</link>
            <guid>https://velog.io/@lia_1996/JavaScript-Hoisting</guid>
            <pubDate>Wed, 31 Jul 2024 04:58:11 GMT</pubDate>
            <description><![CDATA[<br />

<h2 id="📚-호이스팅--hoisting--이란">📚 호이스팅 ( Hoisting ) 이란?</h2>
<blockquote>
<p> 자바스크립트에서 호이스팅은 코드 실행 전에 변수와 함수 선언을 메모리에 등록하여,
코드 어디에서나 참조할 수 있게 하는 과정입니다.
<strong>사전적 정의 : 끌어올리기</strong></p>
</blockquote>
<br />
<br />

<p>우선, 호이스팅에 대해 더 자세히 설명하기 전에 먼저 자바스크립트에서의 변수 처리 과정에 대해 알아보도록 하겠습니다.</p>
<h3 id="🔍-자바스크립트-변수-처리-과정">🔍 자바스크립트 변수 처리 과정</h3>
<ul>
<li><strong>자바스크립트에서는 총 3단계에 걸쳐 변수를 생성합니다.</strong><ol>
<li>선언 단계 : 변수를 생성하고 등록</li>
<li>초기화 단계 : 변수는 undefined로 초기화</li>
<li>할당 단계 : undefined로 초기화된 변수에 실제 값을 할당</li>
</ol>
</li>
</ul>
<br />

<table>
<thead>
<tr>
<th>처리 단계</th>
<th><code>var</code></th>
<th><code>let</code></th>
<th><code>const</code></th>
</tr>
</thead>
<tbody><tr>
<td>선언</td>
<td>변수 선언과 동시에 <code>undefined</code>로 초기화됨</td>
<td>변수가 생성되고 등록됨</td>
<td>선언과 동시에 초기화 및 값 할당</td>
</tr>
<tr>
<td>초기화</td>
<td>-</td>
<td><code>undefined</code>로 초기화됨</td>
<td>-</td>
</tr>
<tr>
<td>할당</td>
<td><code>undefined</code>로 초기화된 변수에 실제 값 할당</td>
<td>초기화된 변수에 실제 값 할당</td>
<td>즉시 값을 할당해야 함</td>
</tr>
</tbody></table>
<br />

<blockquote>
<p>코드 실행 전 변수와 함수를 메모리에 저장하기 때문에 변수나 함수 선언이 코드 내 어디에 있더라도, 실제 실행 전에 메모리에 할당되어 사용자가 아무 문제 없이 해당 변수나 함수를 사용할 수 있게 됩니다.</p>
</blockquote>
<br />
<br />

<h3 id="⚙️-호이스팅-동작-방식">⚙️ 호이스팅 동작 방식</h3>
<ol>
<li>자바스크립트 parser가 함수 실행 전 해당 함수전체를 훑습니다.</li>
<li>함수 내 존재하는 변수, 함수 선언에 대한 정보를 기억하고 실행합니다.</li>
<li>유효범위는 함수 블록 {} 내에서 변수와 함수 선언을 블록의 상단으로 끌어올리는 것입니다.</li>
<li>실제 코드가 끌어올려지는 것이 아니고 자바스크립트 parser가 내부적으로 끌어올려 처리하는 것이므로 실제 메모리에서는 변화가 없습니다.</li>
</ol>
<pre><code>실제로 호이스팅은 자바스크립트에서 규범적으로 정의된 용어가 아닙니다.
위 설명과 같이 끌어올려지는 현상을 영어로 &quot;hoisting&quot;이라 하여
많은 사람들이 호이스팅이라는 명칭을 사용하게 되었습니다.</code></pre><br />
<br />

<h3 id="📦-var-선언문-호이스팅">📦 var 선언문 호이스팅</h3>
<pre><code class="language-jsx">  console.log(test); //undefined

  var test = 123;
  console.log(test); //123</code></pre>
<p>  변수 test가 선언되기 전에 참조 시 에러가 발생하지 않고 undefined가 출력됩니다.</p>
<p>  이는 코드 실행 전에 자바스크립트 내부에서 미리
  test변수를 선언하여 undefined로 초기화를 해두었기 때문입니다.</p>
<p>  따라서 var 키워드 변수는 호이스팅 과정에서 선언 및 초기화 단계가 동시에 진행됨을 알 수 있습니다.</p>
<br />
<br />

<h3 id="📦-let-const--선언문-호이스팅">📦 let, const  선언문 호이스팅</h3>
<pre><code class="language-jsx">  console.log(test); // ReferenceError: test is not defined

  let test = 123;
  console.log(test); // 123</code></pre>
<p>  같은 상황에서 let과 const의 경우 error를 발생시키는데 바로 TDZ(Temporal Dead Zone) 때문입니다.</p>
<p>  TDZ란 스코프 시작 지점에서 초기화 시작 지점까지의 영역을 의미하며,
  이 영역에 있는 변수들은 사용할 수 없습니다.
let과 const는 TDZ에 영향을 받기 때문에 할당을 하기 전에는 사용이 불가합니다.</p>
<p>  즉, let의 경우 선언 단계까지는 완료되었지만 초기화가 되지 않아 에러가 발생하는 것입니다.<br>  이는 잠재적인 버그를 줄일 수 있다는 장점이 있습니다.</p>
<br />
<br />

<h3 id="🛠️-함수선언문-호이스팅">🛠️ 함수선언문 호이스팅</h3>
<pre><code class="language-jsx">  test(); //test

  function test() {
    console.log(&quot;test&quot;);
  }</code></pre>
<p>  함수 호출이 함수선언문의 위에 있든 아래쪽에 있든 
  함수 선언문은 호이스팅 영향으로 끌어올려지기 때문에 에러가 발생하지 않습니다.</p>
<br />
<br />

<h3 id="🛠️-함수표현식-호이스팅">🛠️ 함수표현식 호이스팅</h3>
<pre><code class="language-jsx">  test(); // TypeError: test is not a function

  var test = function () {
    console.log(&quot;test&quot;);
  };

  test(); // test</code></pre>
<p>함수 표현식의 경우, 변수 선언(var test)은 호이스팅되지만,
함수의 초기화와 할당은 호이스팅되지 않습니다.
따라서 test를 호출하기 전에 test는 undefined로 초기화되며,
이 상태에서 호출하면 TypeError가 발생합니다.
이후 test에 함수가 할당된 후에 호출하면 정상적으로 &quot;test&quot;가 출력됩니다.</p>
<br />
<br />




]]></description>
        </item>
        <item>
            <title><![CDATA[[ JavaScript ] Prototype]]></title>
            <link>https://velog.io/@lia_1996/JavaScript-Prototype</link>
            <guid>https://velog.io/@lia_1996/JavaScript-Prototype</guid>
            <pubDate>Tue, 30 Jul 2024 02:45:51 GMT</pubDate>
            <description><![CDATA[<br />

<h2 id="📚-프로토타입--prototype--이란">📚 프로토타입 ( prototype ) 이란?</h2>
<blockquote>
<p><strong>자바스크립트에서 모든 객체는 프로토타입을 가지며,
프로토타입은 객체의 메서드와 속성을 정의하는 객체입니다.
객체가 생성될 때, 생성자 함수의 prototype 속성에 정의된
메서드와 속성은 생성된 객체의 프로토타입으로 설정됩니다.
이를 통해 생성된 모든 인스턴스는 이 프로토타입을 통해 메서드와 속성을 상속받습니다.</strong></p>
</blockquote>
<br />

<h3 id="🙋🏻♀️-상속이란">🙋🏻‍♀️ 상속이란?</h3>
<pre><code>자바스크립트는 프로토타입을 기반으로 상속을 구현하는데
여기서 상속이란, 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속 받아 
그대로 사용할 수 있는 것을 말하며 이를 통해 코드의 재사용성을 높이고,
유지보수가 용이해지며 불필요한 중복을 제거합니다.</code></pre><br />

<hr>
<br />

<h3 id="🛠️-프로토타입을-통한-메서드-공유">🛠️ 프로토타입을 통한 메서드 공유</h3>
<pre><code class="language-jsx">function Test(name) {
  this.name = name;
}

Test.prototype.introduce = function() {
  return `안녕하세요. ${this.name}입니다!`;
};

const test1 = new Test(&quot;JavaScript&quot;);
const test2 = new Test(&quot;React&quot;);

console.log(test1.introduce === test2.introduce); // true</code></pre>
<p>Test 생성자 함수의 prototype 프로퍼티로
프로토타입에 접근하여 공유 메서드 introduce 를 생성했습니다.
그리고 Test 생성자 함수가 생성한 모든 인스턴스는 부모 객체 역할을 하는
프로토타입 Test.prototype 으로부터 introduce 메서드를 상속받습니다.</p>
<br />
<br />

<h3 id="🔍-프로퍼티의-소유와-공유">🔍 프로퍼티의 소유와 공유</h3>
<p>name 과 같이 <strong>개별적으로 소유(인스턴스마다 고유한 값을 가지는 프로퍼티)</strong>하는 프로퍼티만
개별적으로 소유하고, 내용이 동일한 메서드는 프로토타입 상속을 통해 공유하여 사용합니다.</p>
<p>이처럼, 프로토타입은 객체 간 상속을 구현하기 위해 사용되며
부모의 역할을 하는 객체로서 다른 객체에 공유 프로퍼티, 메서드를 제공합니다.</p>
<br />
<br />

<h3 id="🔗-프로토타입-체인">🔗 프로토타입 체인</h3>
<p>  모든 객체는 프로토타입의 계층 구조인 <strong>프로토타입 체인</strong>에 묶여있습니다.</p>
<pre><code class="language-jsx">function Test(name) {
  this.name = name;
}

Test.prototype.introduce = function() {
  return `안녕하세요. ${this.name}입니다!`;
};

const test1 = new Test(&quot;JavaScript&quot;);
console.log(test1.hasOwnProperty(&quot;name&quot;)); // true
console.log(test1.hasOwnProperty(&quot;introduce&quot;)); // false
// &#39;introduce&#39;는 test1 객체의 직접적인 프로퍼티가 아니라 Test.prototype에서 상속된 메서드입니다.</code></pre>
<p>자바스크립트 엔진은 객체의 프로퍼티에 접근하려고 할 때, 해당 객체에 접근하려는 
프로퍼티가 없다면 접근자 프로퍼티가 가리키는 참조를 따라 부모 역할을 하는 프로토타입의 
프로퍼티를 순차적으로 검색하는데 이를 프로토타입 체인이라고 합니다.</p>
<br />
<br />

<blockquote>
<p>프로토타입 체인은 자바스크립트의 상속 메커니즘의 핵심이기도 합니다. 
객체가 프로퍼티를 찾을 때, 먼저 자신의 프로퍼티를 확인하고, 
없으면 프로토타입 체인을 따라 상위 프로토타입을 검색합니다. 
이 과정은 객체가 생성될 때 설정된 프로토타입 링크에 따라 이루어집니다. 
따라서, 프로토타입 체인을 이해하는 것은 자바스크립트의 객체 지향 프로그래밍을 이해하는 데 매우 중요합니다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ JavaScript ] const, let, var]]></title>
            <link>https://velog.io/@lia_1996/JavaScript-const-let-var</link>
            <guid>https://velog.io/@lia_1996/JavaScript-const-let-var</guid>
            <pubDate>Mon, 29 Jul 2024 09:30:03 GMT</pubDate>
            <description><![CDATA[<h2 id="📚-const-let-var">📚 const, let, var</h2>
<br />

<blockquote>
<p><strong><code>var</code>, <code>let</code>, <code>const</code>는 모두 자바스크립트에서 변수를 선언할 때 사용하는
키워드이며 각 키워드는 변수의 범위와 재선언 및 재할당 가능 여부 등에 차이가 있습니다.</strong></p>
</blockquote>
<br />

<h3 id="1-재할당-및-중복-선언">1. 재할당 및 중복 선언</h3>
<ul>
<li><p><strong>var ( 중복 선언 및 재할당 가능 )</strong></p>
<pre><code class="language-jsx"> var test = 1;
 console.log(test); // 1

 var test = 2;
 console.log(test); // 2

 test = 3;
 console.log(test); // 3</code></pre>
<p> 자바스크립에서는 변수를 먼저 선언 후 값을 할당하는 게 정상적입니다.</p>
<p> 하지만 var의 경우 선언 전에 값을 미리 할당할 수 있으며 출력까지도 해볼 수 있습니다.</p>
<p> 위 코드와 같이 이미 선언한 변수를 동일한 이름으로
 재선언(중복 선언) 할 수 있으며 값을 재할당하는 것 또한 가능합니다.</p>
<p> 그리고 마지막에 할당된 값이 최종 변수에 저장됩니다.</p>
<p> 추가적으로 var의 경우 변수를 유연하게 사용할 수 있지만,
 기존에 선언해둔 변수의 존재를 잊고 재선언 하는 경우 문제 발생 여지가 있을 수 있습니다.
 또한, 간단한 코드가 아닌 길고 복잡한 코드에서 같은 이름의 변수가 여러번 선언되어
 사용된다면 어떤 부분에서 값이 변경되고 문제가 발생하는지 파악하기 힘든 단점이 있습니다.</p>
</li>
</ul>
<br />

<ul>
<li><p><strong>let ( 중복선언 불가, 재할당 가능 )</strong></p>
<pre><code class="language-jsx"> let test = 1;
 console.log(test); // 1

 let test = 2;
 console.log(test);
 //Uncaught SyntaxError: Identifier &#39;title&#39; has already been declared

 test = 3;
 console.log(test); // 3</code></pre>
<p> let은 var와 달리 중복 선언 시, 해당 변수는 이미 선언되었다는  <code>SyntaxError</code>를 발생시킵니다.
 즉, 중복 선언이 불가합니다. 하지만 변수에 값을 재할당하는 것은 가능합니다.</p>
</li>
</ul>
<br />

<ul>
<li><p><strong>const ( 중복 선언 및 재할당 불가 )</strong></p>
<pre><code class="language-jsx"> const test = 1;
 console.log(test); // 1

 const test = 2;
 console.log(test);
 //Uncaught SyntaxError: Identifier &#39;title&#39; has already been declared

 test = 3;
 console.log(test);
 //Uncaught TypeError: Assignment to constant variable</code></pre>
<p> let와 const의 차이는 재할당 가능 여부입니다.</p>
<p> 재할당이 가능한 let과 달리 const의 경우 재할당 및 중복 선언이 불가합니다.</p>
<p> 그리고 const의 경우 let과 var와 달리 선언을 했을 때 할당도 같이 해주어야 합니다.
 그렇지 않으면 <code>SyntaxError</code>를 발생시킵니다.</p>
</li>
</ul>
<br />
<br />

<h3 id="2-스코프--scope-">2. 스코프 ( Scope )</h3>
<ul>
<li><p><strong>함수레벨 스코프 (Function Level Scope) with var</strong></p>
<pre><code class="language-jsx"> function functionLevelScope() {
   if (true) {
     var test = 123;
     console.log(test); //123
   }
   console.log(test);
 }

 functionLevelScope(); //123
 console.log(test); //ReferenceError: a is not defined</code></pre>
<p> 함수내에서 선언된 변수는 함수 내에서만 유효하고, 함수 내에서는 블록 내외부에
 관계없이 유효합니다. 그리고 함수 외부에서는 참조가 불가합니다.</p>
</li>
</ul>
<br />

<ul>
<li><p><strong>블록레벨 스코프 (Block Level Scope) with let, const</strong></p>
<pre><code class="language-jsx"> function blockLevelScope() {
   if (true) {
     let test = 123;
     console.log(test); //123
   }

   console.log(test); // ReferenceError: a is not defined.
 }

 console.log(test); // ReferenceError: a is not defined.</code></pre>
<p> 함수, if절 외 for, while, try/catch 등 모든 코드블록 ({..}) 내부에서 선언된 변수는 코드 블록 내부에서만 유효합니다.</p>
<p> 그리고 블록 외부에서 부터는 참조가 불가합니다.</p>
</li>
</ul>
<br />

<blockquote>
<p>결과적으로 <strong>재할당이 필요없는 상수와 객체에는 기본적으로 const</strong>를
사용하는 것이 의도치 않은 재할당을 방지해주기 때문이 안전하며,
재할당이 필요한 경우엔 한정적으로 let을 사용하는 것이 좋습니다.
단! 이때 변수의 스코프는 최대한 좁게 만드는 것이 좋습니다.</p>
</blockquote>
<br />
]]></description>
        </item>
    </channel>
</rss>