<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>cherr_yiju.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 07 Sep 2025 14:31:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>cherr_yiju.log</title>
            <url>https://velog.velcdn.com/images/cherr_yiju/profile/d02fde36-be8c-4e3d-afa6-0ad364ebe13c/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. cherr_yiju.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/cherr_yiju" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Hoisting]]></title>
            <link>https://velog.io/@cherr_yiju/Hoisting</link>
            <guid>https://velog.io/@cherr_yiju/Hoisting</guid>
            <pubDate>Sun, 07 Sep 2025 14:31:42 GMT</pubDate>
            <description><![CDATA[<h2 id="호이스팅">호이스팅</h2>
<hr>
<blockquote>
<p>변수, 함수 선언이 <strong><code>실행되기 전에 메모리에 먼저 올라가는 동작</code></strong>
코드가 작성된 위치와 관계없이 <strong>선언 부분이 <code>최상단으로 끌어올려진 것처럼</code> 동작</strong></p>
</blockquote>
<h3 id="왜-호이스팅이라는-것이-존재">왜 호이스팅이라는 것이 존재?</h3>
<p>자바스크립트 엔진은 코드를 위에서 아래로 단순히 한 줄씩 실행하지 않고, 먼저 <strong>실행 컨텍스트</strong>를 만들고 내부에 변수를 등록한다.</p>
<blockquote>
<p>📌 <strong>실행 컨텍스트</strong>?
자바스크립트 코드가 실행되는 환경을 추상화한 개념으로, 자바스크립트의 동작 원리를 담고 있는 핵심 개념
자바스크립트 엔진은 실행 컨텍스트를 통해 식별자와 스코프를 관리</p>
</blockquote>
<p>선언문이 코드 아래쪽에 있어도, 실행 시점에는 이미 메모리에 올라와 있어 접근이 가능</p>
<p>개발자가 보기에 “끌어올려진 것처럼 보이는 현상”이라서 <strong><em>Hoisting</em></strong>이라는 이름이 붙었다.</p>
<h3 id="다른-언어와-비교">다른 언어와 비교</h3>
<ol>
<li><p><strong>일반적인 컴파일 언어(C, Java, C# 등)</strong></p>
<ul>
<li><p>코드를 실행하기 전에 전체 소스를 먼저 컴파일</p>
</li>
<li><p>컴파일 과정에서 이미 변수와 함수, 클래스 선언을 다 파악해 놓기 때문에, 실행 시점에서는 “선언이 위에 있느냐 아래 있느냐”가 문제가 되지 않음</p>
<pre><code class="language-c">int main() {
   printf(&quot;%d\n&quot;, x); // ❌ Error: undeclared identifier
   int x = 10;
}</code></pre>
<p>선언 전에 변수를 쓰면 바로 <code>컴파일 에러</code>, 실행까지 가지도 못함</p>
</li>
</ul>
</li>
<li><p><strong>인터프리터 언어(Python, Ruby 등)</strong></p>
</li>
</ol>
<ul>
<li><p>위에서 아래로 한 줄씩 실행하기 때문에 선언이 나오기 전에는 참조할 수 없음</p>
<pre><code class="language-python">print(x)   # ❌ NameError: name &#39;x&#39; is not defined
  x = 10</code></pre>
<p> 선언이 나오기 전에는 참조하게 된다면 <code>런타임 에러</code> 발생</p>
</li>
</ul>
<ol start="3">
<li><strong>자바스크립트</strong><ul>
<li>인터프리터 언어처럼 보이지만, 사실은 실행 전에 코드를 한 번 훑어서 실행 컨텍스트 준비</li>
<li>변수와 함수 선언을 미리 등록하기 때문에, 실행 시점에 코드 순서와는 다른 결과<pre><code class="language-jsx">console.log(x); // undefined
var x = 10;</code></pre>
다른 언어라면 에러가 나야 하지만, <code>var</code> 키워드로 선언한 변수는 어떠한 값도 할당하지 않아도 <strong>“호이스팅” 덕분에</strong> <code>undefined</code>가 출력</li>
</ul>
</li>
</ol>
<h3 id="변수-호이스팅">변수 호이스팅</h3>
<p>자바스크립트 엔진은 변수 선언을 3단계에 거쳐 수행</p>
<ol>
<li><strong>선언 단계</strong> - 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.</li>
<li><strong>초기화 단계</strong> - 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 <code>undefined</code>를 할당해 초기화한다.</li>
<li><strong>할당 단계</strong> - <code>undefined</code>로 초기화된 변수에 실제 값을 할당한다.</li>
</ol>
<p><code>var</code> 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한 번에 이루어진다.</p>
<p>따라서 변수 선언문 이전에 변수에 접근하여도 <code>Environment Record</code>에 변수가 존재하기 때문에 에러가 발생하지 않고 <code>undefined</code>를 반환한다.</p>
<blockquote>
<p><strong>Environment Record?</strong></p>
<p>실행 컨텍스트의 객체 중 변수, 매개변수, 인수, 함수 선언 같은 정보를 담는 객체</p>
</blockquote>
<p><code>let</code>과 <code>const</code>는 선언 단계만 먼저 실행 컨텍스트에 등록되고 초기화 단계는 변수 선언문을 만났을 때 실행된다.</p>
<p>따라서 변수 선언문 이전에 변수에 접근하면 <code>Environment Record</code> 에 변수가 존재하지만 초기화되어 있지 않기 때문에 에러가 발생한다.</p>
<p>이 사이 구간을 TDZ(Temporal Dead Zone)라 부르며, <strong>접근 시 ReferenceError 발생</strong></p>
<blockquote>
<p><strong>TDZ(Temporal Dead Zone)?</strong></p>
<p>변수가 스코프에 선언되어 존재하지만, 아직 초기화되지 않아 접근할 수 없는 구간</p>
<p>이 구간에서 해당 변수에 접근하면 <code>ReferenceError</code>(참조 에러) 발생</p>
</blockquote>
<ul>
<li><code>var</code>: 선언과 초기화(<code>undefined</code>)까지 호이스팅됨 → 선언 전에 접근 가능하지만 <code>undefined</code> 반환</li>
<li><code>let</code>/<code>const</code>: 선언만 호이스팅됨. 초기화되기 전까지 TDZ에 묶여 있어 접근 시 ReferenceError(참조 에러)</li>
</ul>
<pre><code class="language-jsx">console.log(a); // undefined
var a = 10;

console.log(b); // ReferenceError (TDZ)
let b = 20;</code></pre>
<h3 id="함수-호이스팅">함수 호이스팅</h3>
<ul>
<li><p><strong>함수 선언문</strong></p>
<p>  전체가 호이스팅됨 (선언 + 함수 본문) → 선언 전에 호출 가능</p>
<pre><code class="language-jsx">  sayHi(); // &quot;Hi&quot;

  function sayHi() {
    console.log(&quot;Hi&quot;);
  }</code></pre>
<p>  실행 컨텍스트 생성 단계에서, 함수 선언문은 <strong>함수 객체 자체</strong>가 메모리에 저장되기 때문</p>
</li>
<li><p><strong>함수 표현식</strong> (<code>var</code>, <code>let</code>, <code>const</code>)</p>
<p>  변수 호이스팅 규칙을 따름</p>
<ul>
<li><p><code>var</code></p>
<ul>
<li>준비 단계: <code>var name</code>만 등록 + <code>undefined</code>로 초기화</li>
<li>실행 단계: 대입문 도달 시 함수 객체가 <strong>그때</strong> 들어감</li>
<li>선언 전 호출 → <strong><code>TypeError: name is not a function</code></strong> (이름은 있지만 값이 아직 <code>undefined</code>)</li>
</ul>
<pre><code class="language-jsx">greet(); // TypeError: greet is not a function
var greet = function() { console.log(&quot;Hello&quot;); };</code></pre>
</li>
<li><p><code>let</code>, <code>const</code></p>
<ul>
<li>준비 단계: 이름만 등록(TDZ)</li>
<li>실행 단계: 선언문에서 <strong>초기화 + 대입</strong></li>
<li>선언 전 접근/호출 → <strong><code>ReferenceError</code></strong> (TDZ)</li>
</ul>
<pre><code class="language-jsx">greet(); // ❌ ReferenceError
let greet = function () {
console.log(&quot;Hello&quot;);
};</code></pre>
</li>
</ul>
</li>
</ul>
<h2 id="무엇을-쓰는게-좋은가">무엇을 쓰는게 좋은가?</h2>
<hr>
<p>ECMAScript, ESLint, 코드 컨벤션을 참고하였음</p>
<h3 id="변수">변수</h3>
<ul>
<li>기본은 <code>const</code><ul>
<li>재할당 필요 없으면 무조건 <code>const</code>로 고정 → 의도 명확, 실수 줄임.</li>
</ul>
</li>
<li>필요할 때만 <code>let</code><ul>
<li>루프 카운터, 상태 갱신처럼 정말 재할당이 필요할 때만 사용.</li>
</ul>
</li>
<li><strong><code>var</code>는 금지</strong></li>
</ul>
<h3 id="함수">함수</h3>
<ul>
<li><strong>모듈/파일 상단의 재사용 유틸</strong> → <em>함수 선언문</em> 사용 권장<ul>
<li>의도적으로 “어디서든 호출 가능”하게 하고 싶을 때만.</li>
<li>테스트/유틸·순수 함수</li>
</ul>
</li>
<li><strong>그 외 대부분</strong> → <em><code>const</code> 함수 표현식(또는 화살표 함수)</em><ul>
<li>선언 순서를 지키게 되어 의존 관계가 명확.</li>
<li>블록 스코프 보장(TDZ로 선언 전 사용 방지).</li>
</ul>
</li>
<li>블록 내부의 함수 선언문은 지양</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>