<?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>Tue, 17 Mar 2026 02:36: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/heosigi_0221/profile/7eddfc0e-4a61-4234-a30e-c90e74fe9645/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 😎. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/heosigi_0221" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[네트워크 계층 프로토콜]]></title>
            <link>https://velog.io/@heosigi_0221/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C</link>
            <guid>https://velog.io/@heosigi_0221/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C</guid>
            <pubDate>Tue, 17 Mar 2026 02:36:48 GMT</pubDate>
            <description><![CDATA[<p>네트워크의 핵심이라고 볼 수 있는
네트워크 계층 프로토콜(IP, ARP, RARP, IMCP, IGMP)과 
주요 기술(라우팅, NAT)의 개념과 특징을 알아보고, 
정보처리기사 시험에 대비해서 공부하려고 한다.</p>
<h1 id="1-네트워크-계층-주요-기술">1. 네트워크 계층 주요 기술</h1>
<p>네트워크 계층은 데이터가 최종 목적지까지 정확하게 
도달할 수 있도록 경로를 설정(Routing)하고, 
논리적인 주소(IP 주소)를 관리하는 역할을 담당한다.</p>
<table>
<thead>
<tr>
<th align="left">기술/프로토콜</th>
<th align="left">주요 기능</th>
<th align="left">특징</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>IP</strong></td>
<td align="left">데이터그램의 주소 지정 및 경로 설정</td>
<td align="left">비연결성, 비신뢰성</td>
</tr>
<tr>
<td align="left"><strong>ARP</strong></td>
<td align="left">논리 주소(IP)를 물리 주소(MAC)로 변환</td>
<td align="left">동적, 브로드캐스트 기반 요청</td>
</tr>
<tr>
<td align="left"><strong>RARP</strong></td>
<td align="left">물리 주소(MAC)를 논리 주소(IP)로 변환</td>
<td align="left">ARP의 역 기능, 부팅 시 IP 주소 할당에 사용</td>
</tr>
<tr>
<td align="left"><strong>ICMP</strong></td>
<td align="left">오류 보고 및 네트워크 상태 진단</td>
<td align="left">IP에 의존하여 동작, 제어 메시지 전송</td>
</tr>
<tr>
<td align="left"><strong>IGMP</strong></td>
<td align="left">멀티캐스트 그룹 관리</td>
<td align="left">특정 그룹에만 데이터 전송, 대역폭 효율화</td>
</tr>
<tr>
<td align="left"><strong>라우팅 프로토콜</strong></td>
<td align="left">최적의 데이터 전송 경로 탐색</td>
<td align="left">RIP, OSPF, BGP</td>
</tr>
<tr>
<td align="left"><strong>NAT</strong></td>
<td align="left">사설 IP 주소를 공인 IP 주소로 변환</td>
<td align="left">IP 주소 절약, 내부 네트워크 보안 강화</td>
</tr>
</tbody></table>
<h1 id="2-ip-internet-protocol">2. IP (Internet Protocol)</h1>
<p>IP는 송신 측과 수신 측간의 데이터 전송을 위한 주소 지정 및 
경로 설정을 담당하는 핵심 프로토콜이다.</p>
<p>데이터를 <strong>패킷(Packet)</strong> 또는 <strong>데이터그램(Datagram)</strong> 단위로 캡슐화하여
전송하지만, 신뢰성을 보장하지는 않는다.</p>
<ul>
<li><strong>비연결성 (Connectionless)</strong> : 데이터를 전송하기 전에 연결을 설정하지 않는다.</li>
<li><strong>비신뢰성 (Unreliable)</strong> : 패킷의 도착 순서나 전송 여부를 보장하지 않으며,
오류 제어 기능이 없다.
(신뢰성은 상위 계층인 TCP에서 담당)</li>
</ul>
<hr>
<h1 id="3-arp-address-resolution-protocol">3. ARP (Address Resolution Protocol)</h1>
<p>ARP는 호스트의 IP 주소를 해당 호스트의 물리적인 
네트워크 주소(MAC 주소)로 변환해주는 프로토콜이다.
로컬 네트워크(LAN) 내에서 통신하기 위해 필수적이다.</p>
<ol>
<li><strong>요청</strong> : 송신 측은 특정 IP 주소에 해당하는 MAC 주소를 
찾기 위해 네트워크 전체에 ARP 요청 메시지를 브로드캐스트 한다.</li>
<li><strong>응답</strong> : 해당 IP 주소를 사용하는 장비는 자신의 MAC 주소를 
담아 ARP 응답 메시지를 유니캐스트로 송신 측에 보낸다.</li>
<li><strong>캐시</strong> : 송신 측은 응답받은 MAC 주소를 ARP 캐시에 
일정 시간 동안 저장하여 불필요한 요청을 줄인다.</li>
</ol>
<hr>
<h1 id="4-rarp-reverse-address-resolution-protocol">4. RARP (Reverse Address Resolution Protocol)</h1>
<p>RARP는 ARP와 반대로, 물리 주소(MAC 주소)는 알지만 IP 주소를 
모르는 경우에 사용하는 프로토콜이다.
주로 디스크가 없는 워크스테이션이나 프린터 등이
부팅 시 자신의 IP 주소를 할당받기 위해 사용합니다.</p>
<blockquote>
<p>RARP는 오래된 기술이며, 현재는 <strong>DHCP(Dynamic Host Connfiguration Protocol - 응용계층 프로토콜)</strong>가 이 기능을 대체하여 IP 주소 할당 및 관리를 더욱 효율적으로 수행한다.</p>
</blockquote>
<hr>
<h1 id="5-icmp-internet-control-message-protocol">5. ICMP (Internet Control Message Protocol)</h1>
<p><strong>ICMP</strong>는 IP 패킷을 처리할 때 발생하는 문제를 보고하거나, 
네트워크 상태를 진단하기 위한 제어 메시지를 전송하는 프로토콜이다. 
IP는 오류 보고 기능이 없기 때문에 ICMP가 이를 보완한다.</p>
<ul>
<li>주요 메시지 유형 : <ul>
<li><strong>Echo Request / Reply</strong> : 네트워크 연결 상태를 확인 (<code>ping</code> 명령어)</li>
<li><strong>Destination Unreachable</strong> : 목적지에 도달할 수 없음</li>
<li><strong>Time Exceeded</strong> : 패킷의 TTL(Time To Live)이 0이 되어 패킷이 폐기됨</li>
<li><strong>Redirect</strong> : 더 나은 경로를 알려줌</li>
</ul>
</li>
</ul>
<hr>
<h1 id="6-igmp-internet-group-management-protocol">6. IGMP (Internet Group Management Protocol)</h1>
<p><strong>IGMP</strong>는 호스트가 멀티캐스트 그룹에 가입하거나 
탈퇴할 때 사용하는 프로토콜이다.
멀티캐스트는 특정 그룹에 속한 다수의 호스트에게만 
데이터를 한 번에 전송하는
방식으로, IPTV나 온라인 게임 등에서 효율적인
데이터 전송을 위해 사용된다.</p>
<ul>
<li>라우터는 IGMP를 통해서 어떤 호스트가 어떤 멀티캐스트 그룹에 속해 있는지 파악하고,
해당 그룹으로 향하는 트래픽만 선택적으로 전달한다.</li>
</ul>
<hr>
<h1 id="7-nat-network-address-translation">7. NAT (Network Address Translation)</h1>
<p> <strong>NAT</strong>는 사설 IP 주소를 사용하는 내부 네트워크의 장치들이 
인터넷에 접속할 때, 사설 IP 주소를 공인 IP 주소로 변환해주는 기술이다.
IPv4 주소 고갈 문제를 해결하고 내부 네트워크를
외부로부터 보호하는 역할을 한다.</p>
<ul>
<li><strong>동작 방식</strong> : 내부 장치가 외부로 패킷을 보낼 때, NAT 장비(주로 라우터)는 
출발지 사설 IP 주소를 자신의 공인 IP 주소로 변경하여 전송한다.
외부에서 응답이 오면, 다시 해당 사설 IP 주소로
변환하여 내부 장치에 전달한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[일급 함수?]]></title>
            <link>https://velog.io/@heosigi_0221/%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@heosigi_0221/%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Mon, 16 Mar 2026 13:08:25 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트-&gt;함수에 대해서 설명하는 중에
일급 함수(객체)라는 말에 대해서 용어를 정리한 것이 있다.</p>
<p>하지만, 용어만 간단하게 설명만 하고 
넘어간 거 같아서 일급 객체가 대체 어떤 것인지 
코드로 직접 보면서 공부하려고 한다.</p>
<p>먼저, 들어가기 전에 개념을 한번 보고 알아보도록 하자</p>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/aebabdb8-7c50-4af3-95d7-55e2cbb6ab15/image.png" alt=""></p>
<p>위 이미지는 MDN 문서에서 참고한 내용이다. 
<strong>&quot;함수를 마치 변수처럼 다룬다&quot;</strong>
라는 것이 일급 함수(객체)라고 한다는데 대체 이게 무슨 말인지 
처음에 공부할 때 많이 헷갈리고 머리를 붙잡았던 적이 있었다.</p>
<p>하지만, 개념만 보면 크게 와닿기가 쉽지가 않으므로 코드와 함께 본다면
우리가 말하는 일급 객체가 무슨 의미인지 깨닫기 쉬울 것이다.</p>
<p>먼저, 우리가 프로그래밍을 할 때, 함수를 선언하는 방법을 보고자 한다.</p>
<p>총 2가지 방식의 함수 선언이 있는데,</p>
<ul>
<li>함수 표현식</li>
<li>함수 선언문</li>
</ul>
<p>위와 같이 있는데, 각각의 형식의 코드를 살펴보도록 하자</p>
<pre><code>// 함수 표현식
var sumNumbers = function(a, b) {
    return a + b;
}

// 함수 선언문
function sumNumbers(a, b) {
    return a + b;
}</code></pre><p>위와 같이 두 함수는 동일하게
두 개의 숫자를 넘겨 받아 합을 받환하는 역할을 하고 있다.</p>
<p>근데 여기서, <strong>함수 표현식</strong>을 보게 되면 의아해할 수도 있다.</p>
<p><strong>&quot;함수를 저렇게도 정의할 수 있는거야? 🤨&quot;</strong></p>
<p>라고 느낄 수 있을텐데,
이와 같이 함수를 선언할 수 있는 이유는 </p>
<p>자바스크립트에서는 <strong>함수도 변수나 인자로 취급을 할 수 있기 때문</strong>이다.</p>
<p>즉, 함수가 이름을 가지더라도 변수 이름을 사용해
함수를 호출할 수가 있는 것이다.</p>
<p>또 다른 예시를 한번 보도록 하자</p>
<pre><code>function sayHello() {
    return &quot;Hello, &quot;;
}

function greeting(helloMessage, name) {
    console.log(helloMessage() + name);
}

// `sayHello`를 전달인자로 `greeting` 함수에 전달
greeting(sayHello, &quot;JavaScript!&quot;);

// 출력값 : Hello, JavaScript!</code></pre><p>위와 코드와 같이 함수에 인자를 전달해서 사용할 수 있게 된다.</p>
<p><code>sayHello()</code> 함수를 <code>greeting()</code>함수에 전달인자로 전달하는데,
이것은 함수를 값으로서 어떻게 다루는지 설명하게 된다.</p>
<p>여기서 참고할 것은, 다른 함수에 전달인자로 
전달하는 함수를 <strong>콜백 함수</strong>라고 하는데, <code>sayHello()</code>는 콜백 함수이다.</p>
<pre><code>function sayHello() {
    return () =&gt; {
        console.log(&quot;Hello!&quot;);
    };
}</code></pre><p>위 방법은 함수를 반환하는 코드인데,
다른 함수로부터 함수를 반환하는 코드이다. </p>
<p>JavaScript에서 함수들은 값들로서 다루어질 수 있기 때문에 
함수를 반환할 수 있다.</p>
<p>함수를 반환하거나 다른 함수들을
전달인자로서 사용하는 함수를 <strong>&quot;고차 함수&quot;</strong>라고 불린다.</p>
<p>결론은 계속 반복해서 설명한 게
<strong>함수는 값</strong>이라는 걸 말한 것이다.
함수도 값처럼 할당하고 선언할 수 있는 의미이다. </p>
<p>위 글을 이해하고 맨 처음 위에서 MDN에서 말한
<strong>&quot;함수를 마치 변수처럼 다룬다&quot;</strong>
라는 말이 왜 그렇게 말하고 있는 것인지 알게 될 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[라우팅 프로토콜]]></title>
            <link>https://velog.io/@heosigi_0221/%EB%9D%BC%EC%9A%B0%ED%8C%85-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C</link>
            <guid>https://velog.io/@heosigi_0221/%EB%9D%BC%EC%9A%B0%ED%8C%85-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C</guid>
            <pubDate>Sat, 14 Mar 2026 12:23:01 GMT</pubDate>
            <description><![CDATA[<p>네트워크 계층의 라우팅 프로토콜에 대해서
정리를 위해 작성하려고 한다.</p>
<p>정적 라우팅과 동적 라우팅의 차이점 그리고,
내부 라우팅 프로토콜(IGP)과
외부 라우팅 프로토콜(EGP)의 구분,
자율 시스템(AS)의 개념을 바탕으로 
RIP, OSPF, BGP의 특징과 알고리즘을 상세히
다루고자 한다.</p>
<h1 id="1-라우팅-프로토콜">1. 라우팅 프로토콜</h1>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/4a5e67d5-ba81-41b5-a90d-9ca52d839d0c/image.png" alt=""></p>
<p>위 그림에서 위-아래 방향으로 차례로 설명해보자면,</p>
<ol>
<li><p>네트워크 계층(OSI 3계층)에서 시작하여
<img src="https://velog.velcdn.com/images/heosigi_0221/post/be773964-f73f-4939-9ead-102ace995868/image.png" alt=""></p>
</li>
<li><p>라우팅 프로토콜이 정적 라우팅과 동적 라우팅
으로 분류가 되고</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/f55402e8-c587-4448-83f7-506263bb4891/image.png" alt=""></p>
<ol start="3">
<li><p>동적 라우팅이 다시 내부 라우팅 프로토콜(IGP)과
외부 라우팅 프로토콜(EGP)로 나뉘게 되며
<img src="https://velog.velcdn.com/images/heosigi_0221/post/f7c04dfa-1f21-4d5e-8128-dcea1a6d245f/image.png" alt=""></p>
</li>
<li><p>IGP는 RIP과 OSPF가 포함이 되고
<img src="https://velog.velcdn.com/images/heosigi_0221/post/f45090a8-64aa-42d5-9bf8-af1d060d7e6a/image.png" alt=""></p>
</li>
</ol>
<ol start="5">
<li>EGP에는 BGP가 포함이 된다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/ab4dad16-6752-45cf-ad75-130ad2cd0216/image.png" alt=""></p>
<h2 id="1-1-라우팅-프로토콜-요약">1-1. 라우팅 프로토콜 요약</h2>
<table>
<thead>
<tr>
<th align="left">라우팅, 프로토콜 종류</th>
<th align="left">핵심 키워드</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>정적 라우팅</strong></td>
<td align="left">고정된 경로 사용</td>
</tr>
<tr>
<td align="left"><strong>동적 라우팅</strong></td>
<td align="left">동적으로 경로 변경</td>
</tr>
<tr>
<td align="left"><strong>내부 라우팅 프로토콜(IGP)</strong></td>
<td align="left">같은 네트워크 내</td>
</tr>
<tr>
<td align="left"><strong>외부 라우팅 프로토콜(EGP)</strong></td>
<td align="left">다른 네트워크 간</td>
</tr>
<tr>
<td align="left"><strong>RIP</strong></td>
<td align="left">홉(hop) 수 사용</td>
</tr>
<tr>
<td align="left"><strong>OSPF</strong></td>
<td align="left">경로 비용 사용, 링크 상태 알고리즘, AS를 지역으로 나눔</td>
</tr>
<tr>
<td align="left"><strong>BGP</strong></td>
<td align="left">경로 벡터 알고리즘 사용, 초기 전체 라우팅 테이블 교환</td>
</tr>
</tbody></table>
<hr>
<h1 id="2-정적-라우팅-vs-동적-라우팅">2. 정적 라우팅 VS. 동적 라우팅</h1>
<h2 id="2-1-정적-라우팅">2-1. 정적 라우팅</h2>
<p>Router 설정 시, 미리 경로를 정의하고 
고정된 경로를 사용하는 방식이다.</p>
<h2 id="2-2-동적-라우팅">2-2. 동적 라우팅</h2>
<p>Router 설정 시, 경로를 자동으로 계산하고,
동적으로 경로를 변경하는 방식이다.</p>
<hr>
<h1 id="3-내부-라우팅-프로토콜igp-vs-외부-라우팅-프로토콜egp">3. 내부 라우팅 프로토콜(IGP) VS. 외부 라우팅 프로토콜(EGP)</h1>
<h2 id="3-1-igp">3-1. IGP</h2>
<p>같은 네트워크 내에서 사용되는 라우팅 프로토콜</p>
<h2 id="3-2-egp">3-2. EGP</h2>
<p>다른 네트워크 간에 사용되는 라우팅 프로토콜</p>
<blockquote>
<h4 id="같은-네트워크와-다른-네트워크의-구분-기준">같은 네트워크와 다른 네트워크의 구분 기준?</h4>
<p><strong>자율 시스템(AS, Autonomous System)</strong>
가장 중요한 구분 기준은 자율 시스템(AS)이다.<br /></p>
</blockquote>
<ol>
<li>같은 네트워크 (같은 AS)</li>
</ol>
<ul>
<li>하나의 조직이나 기관이 관리하는 
네트워크 영역</li>
</ul>
<ol start="2">
<li>다른 네트워크 (다른 AS)</li>
</ol>
<ul>
<li>서로 다른 조직이나 기관이 관리하는
네트워크 영역<h4 id="관리-주체-기준">관리 주체 기준?</h4>
</li>
</ul>
<ol>
<li>같은 네트워크<ul>
<li>동일한 네트워크 관리자나 조직이 제어하는 영역</li>
</ul>
</li>
<li>다른 네트워크 </li>
</ol>
<ul>
<li>서로 다른 관리 주체가 운영하는 네트워크<h4 id="구체적인-예시">구체적인 예시?</h4>
</li>
</ul>
<ol>
<li>같은 네트워크 (IGP 사용)</li>
</ol>
<ul>
<li>한 회사에서 내부의 여러 부서 네트워크</li>
<li>대학교 캠퍼스 내의 각 건물별 네트워크</li>
</ul>
<ol start="2">
<li>다른 네트워크 (EGP 사용)</li>
</ol>
<ul>
<li>KT와 SKT 같은 서로 다른 통신사 네트워크</li>
<li>한국과 미국의 인터넷 연결</li>
<li>서로다른 ISP(인터넷 서비스 제공업체)
간 연결<h4 id="as-번호로-구분">AS 번호로 구분?</h4>
각 자율 시스템은 고유한 AS 번호를 가진다.</li>
<li>AS 1 ~ AS 65535 : 공인 AS 번호</li>
<li>Ex : KT(AS 4766), SKT(AS 9318), 구글(AS 15169)</li>
</ul>
<h1 id="4-내부-라우팅-프로토콜igp">4. 내부 라우팅 프로토콜(IGP)</h1>
<h2 id="4-1-rip">4-1. RIP</h2>
<ul>
<li>거리 벡터 알고리즘- 벨만 포드 알고리즘 사용</li>
<li>각 라우터가 인접 라우터로부터 거리 정보를 받아
라우팅 테이블 업데이트</li>
<li>홉 카운트를 기준으로 최대 15홉까지 지원</li>
</ul>
<h2 id="4-2-ospf">4-2. OSPF</h2>
<ul>
<li>링크 상태 알고리즘 - 다익스트라 알고리즘 사용</li>
<li>각 라우터가 전체 네트워크 토폴로지를 파악한 후
최단 경로 계산</li>
<li>경로 비용(COST)을 기준으로 최적 경로 선택</li>
<li>대규모 네트워크에 적합하며 빠른 수렴 특성</li>
</ul>
<blockquote>
<h3 id="ospf-경로-비용-계산">OSPF 경로 비용 계산</h3>
</blockquote>
<h4 id="비용-고려-요소">비용 고려 요소</h4>
<ul>
<li>대역폭 : 링크의 전송 속도 (가장 중요!)</li>
<li>지연시간 : 패킷 전송 지연</li>
<li>신뢰성 : 링크의 안정성</li>
<li>로드 : 현재 링크 사용률</li>
<li>MTU : 최대 전송 단위<h4 id="경로-선택-원리">경로 선택 원리</h4>
</li>
<li>여러 경로 중 <strong>총 비용이 가장 낮은경로</strong>
를 선택</li>
<li>각 링크의 비용을 합산하여 전체 경로
비용 계산</li>
<li>동일한 목적지에 대해 여러 경로가 있을 때
비용이 낮은 경로 우선 선택</li>
</ul>
<hr>
<h1 id="5-외부-라우팅-프로토콜egp">5. 외부 라우팅 프로토콜(EGP)</h1>
<h2 id="5-1-bgp">5-1. BGP</h2>
<ul>
<li>경로 벡터 알고리즘 사용</li>
<li>목적지까지의 전체 AS 경로 정보를 교환</li>
<li>인터넷 백본에서 사용되는 핵심 프로토콜</li>
</ul>
<hr>
<h1 id="6-라우팅-알고리즘-비교">6. 라우팅 알고리즘 비교</h1>
<h2 id="6-1-거리벡터-vs-링크-상태-vs-경로-벡터">6-1. 거리벡터 vs. 링크 상태 vs. 경로 벡터</h2>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">거리 벡터</th>
<th align="left">링크 상태</th>
<th align="left">경로 벡터</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>대표 프로토콜</strong></td>
<td align="left">RIP</td>
<td align="left">OSPF</td>
<td align="left">BGP</td>
</tr>
<tr>
<td align="left"><strong>최단 경로 계산</strong></td>
<td align="left">홉 수 사용</td>
<td align="left">경로 비용 사용</td>
<td align="left">경로 벡터 사용</td>
</tr>
<tr>
<td align="left"><strong>교환 정보</strong></td>
<td align="left">거리(홉 수)</td>
<td align="left">전체 토폴로지</td>
<td align="left">전체 경로</td>
</tr>
<tr>
<td align="left"><strong>알고리즘</strong></td>
<td align="left">벨만-포드</td>
<td align="left">다익스트라</td>
<td align="left">경로 벡터</td>
</tr>
<tr>
<td align="left"><strong>사용 범위</strong></td>
<td align="left">소규모 네트워크</td>
<td align="left">대규모 네트워크</td>
<td align="left">AS 간 연결</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[패킷 교환과 서킷 교환]]></title>
            <link>https://velog.io/@heosigi_0221/%ED%8C%A8%ED%82%B7-%EA%B5%90%ED%99%98%EA%B3%BC-%EC%84%9C%ED%82%B7-%EA%B5%90%ED%99%98</link>
            <guid>https://velog.io/@heosigi_0221/%ED%8C%A8%ED%82%B7-%EA%B5%90%ED%99%98%EA%B3%BC-%EC%84%9C%ED%82%B7-%EA%B5%90%ED%99%98</guid>
            <pubDate>Sat, 14 Mar 2026 11:53:27 GMT</pubDate>
            <description><![CDATA[<p>정보처리기사 실기를 준비하면서 정리를 위해
네트워크에서 데이터를 전송하는 두 가지 
주요 방식인 패킷 교환과 서킷 교환의 
특징과 차이점에 대해서 작성해보고자 한다.</p>
<p>패킷 교환 방식의 데이터그램과 가상회선 방식,
그리고 비연결형과 연결형 통신의 차이점을
비교 분석 해보려고 한다.</p>
<table>
<thead>
<tr>
<th align="left">용어</th>
<th align="left">키워드</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>가상 회선 (Virtual Circuit)</strong></td>
<td align="left">논리적인 통신 경로를 미리 설정, 연결형 교환 방식, 목적지와 미리 연결</td>
</tr>
<tr>
<td align="left"><strong>데이터그램 (Datagram)</strong></td>
<td align="left">비연결형 교환 방식, 순서에 무관하게 독립적으로 전송, 헤더를 붙여 개별 전달</td>
</tr>
<tr>
<td align="left"><strong>패킷 교환 방식 (Packet Switching)</strong></td>
<td align="left">전송단위는 패킷, 네트워크 계층에서 처리, 회선 효율성 높음</td>
</tr>
<tr>
<td align="left"><strong>서킷 교환 방식 (Circuit Switching)</strong></td>
<td align="left">전송단위는 비트 스트림, 전용 회선 설정, 일정한 대역폭 보장, 실시간 전송 적합</td>
</tr>
</tbody></table>
<p>패킷 교환 방식 : 전송단위는 패킷
서킷 교환 방식 : 전송단위는 연속적인 비트 스트림</p>
<hr>
<h1 id="1-서킷-교환-방식">1. 서킷 교환 방식</h1>
<ul>
<li>전송 단위 : 연속적인 비트 스트림</li>
<li>연결 방식 : 통신 전에 송신자와 수신자 간에 전용 회선을 설정</li>
<li>동작 계층 : 물리 계층(1계층-비트 단위)과 데이터 링크(2계층-프레임단위)에서 회선을 설정하고 관리</li>
<li>특징 : 한번 회선이 설정되면 통신이 끝날 때까지 해당 회선을 독점적으로 사용</li>
<li>장점 : 일정한 대역폭 보장, 지연 시간 필요</li>
<li>예시 : 전통적인 전화 시스템(PSTN)</li>
</ul>
<hr>
<h1 id="2-패킷-교환-방식">2. 패킷 교환 방식</h1>
<ul>
<li>전송 단위 : 패킷</li>
<li>연결 방식 : 데이터를 패킷 단위로 나누어 각각 독립적으로 전송</li>
<li>동작 계층 : 네트워크 계층(3계층)에서 패킷을 처리하고 라우팅</li>
<li>특징 : 각 패킷이 서로 다른 경로를 통해 전송될 수 있음</li>
<li>장점 : 회선 효율성 좋음, 다중 사용자 지원</li>
<li>단점 : 패킷 손실 가능성, 지연 시간 변동</li>
</ul>
<hr>
<blockquote>
<h3 id="데이터그램--가상회선">데이터그램 &amp; 가상회선</h3>
</blockquote>
<ol>
<li>데이터그램 방식 <ul>
<li>독립적인 패킷을 헤더와 함께 
전송하는 방식</li>
<li>비연결형 교환 방식</li>
</ul>
</li>
<li>가상회선 방식<ul>
<li>논리적인 회선을 설정하고 패킷을 
전송하는 방식</li>
<li>연결형 교환 방식</li>
</ul>
</li>
</ol>
<h1 id="3-비연결형-vs-연결형">3. 비연결형 VS. 연결형</h1>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">비연결형 (데이터그램)</th>
<th align="left">연결형 (가상회선)</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>연결 설정</strong></td>
<td align="left">불필요</td>
<td align="left">필요</td>
</tr>
<tr>
<td align="left"><strong>패킷 독립성</strong></td>
<td align="left">독립적</td>
<td align="left">종속적</td>
</tr>
<tr>
<td align="left"><strong>경로 결정</strong></td>
<td align="left">패킷마다 다름</td>
<td align="left">고정 경로</td>
</tr>
<tr>
<td align="left"><strong>순서 보장</strong></td>
<td align="left">보장 안됨</td>
<td align="left">보장됨</td>
</tr>
<tr>
<td align="left"><strong>대표 프로토콜</strong></td>
<td align="left">IP, UDP</td>
<td align="left">ATM, X.25</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[메모리 구조]]></title>
            <link>https://velog.io/@heosigi_0221/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@heosigi_0221/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Thu, 26 Feb 2026 02:06:43 GMT</pubDate>
            <description><![CDATA[<h1 id="프로그램-메모리-구조">프로그램 메모리 구조</h1>
<p>정보처리기사 실기를 공부하다보면 꼭 알아야 하는,
메모리 구조에 대해서 알아보려고 한다. 
스택(Stack), 힙(Heap)의 차이, 컴파일 시점과 메모리 할당 차이를 
이해하면 동적 메모리 할당과 Garbage Collection을 쉽게 이해할 수가 있다.</p>
<p>아래는 C언어를 기준으로 정리한 핵심 정리표이다. </p>
<table>
<thead>
<tr>
<th align="left">영역</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>코드 영역 (Code)</strong></td>
<td align="left">실행할 프로그램 코드가 저장됩니다.</td>
</tr>
<tr>
<td align="left"><strong>데이터 영역 (Data)</strong></td>
<td align="left">전역 변수와 <code>static</code> 변수가 저장됩니다.</td>
</tr>
<tr>
<td align="left"><strong>힙 영역 (Heap)</strong></td>
<td align="left"><code>malloc()</code>으로 할당한 메모리가 저장됩니다.</td>
</tr>
<tr>
<td align="left"><strong>스택 영역 (Stack)</strong></td>
<td align="left">지역 변수와 함수 호출 정보가 저장됩니다.</td>
</tr>
</tbody></table>
<h1 id="1-프로그램-메모리-구조">1. 프로그램 메모리 구조</h1>
<p>C 프로그램이 실행되면 운영체제가 메모리를
4개의 영역으로 나누어 할당한다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/aa460f72-91d6-4f2e-b944-2359e77abb86/image.png" alt="">
메모리는 코드, 데이터, 힙, 스택 영역으로 나뉜다.
힙은 위-&gt;아래, 스택은 아래-&gt;위로 자란다.</p>
<p>힙과 스택은 메모리의 빈 공간을 서로 마주보며 자란다.
힙은 아래로, 스택은 위로 확장을 하다가 만나게 되면
메모리 부족(Out of Memory)이 발생한다.</p>
<table>
<thead>
<tr>
<th align="left">영역</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>코드 영역 (Code)</strong></td>
<td align="left">실행할 프로그램 코드가 저장됩니다.</td>
</tr>
<tr>
<td align="left"><strong>데이터 영역 (Data)</strong></td>
<td align="left">전역 변수와 <code>static</code> 변수가 저장됩니다.</td>
</tr>
<tr>
<td align="left"><strong>힙 영역 (Heap)</strong></td>
<td align="left"><code>malloc()</code>으로 할당한 메모리가 저장됩니다.</td>
</tr>
<tr>
<td align="left"><strong>스택 영역 (Stack)</strong></td>
<td align="left">지역 변수와 함수 호출 정보가 저장됩니다.</td>
</tr>
</tbody></table>
<blockquote>
<h3 id="왜-이런-순서일까">왜 이런 순서일까?</h3>
</blockquote>
<ul>
<li><strong>코드/데이터 영역이 낮은 주소에 있는 이유</strong> : 프로그램 시작 시 가장 먼저 로드되고, <strong>크기가 고정</strong>되어 있어서 미리 자리를 잡아둔다.</li>
<li><strong>힙과 스택이 양 끝에서 자라는 이유</strong> : <strong>둘 다 크기가 가변적</strong>이므로, 빈 공간을 최대한 활용하기 위해 반대 방향으로 자란다.</li>
</ul>
<h1 id="2-스택stack-영역">2. 스택(Stack) 영역</h1>
<p>스택은 함수 호출 정보와 지역 변수를 관리하는 영역이다.</p>
<p>함수 호출 정보와 지역 변수가 무엇인지 모를 수 있으니,
아래에 내용을 정리해놓았다.</p>
<p><strong>함수 호출 정보</strong> : <strong>함수가 호출될 때 스택에 쌓이는 데이터</strong>를 말한다. 
매개변수, 지역 변수, 그리고 함수 실행이 끝난 뒤 
돌아갈 위치(리턴 주소)가 하나의 스택 프레임(Stack Frame)으로 
묶여 저장되고 함수가 종료되면 해당 프레임이 스택에서 제거된다.</p>
<p><strong>지역 변수</strong> : <strong>함수(메서드) 안에서 선언된 변수</strong>이다. 
함수가 호출될 때 생성되고, 함수가 종료되면 자동으로 사라지고 
함수 바깥에서는 접근할 수 없다.</p>
<h2 id="1-스택의-특징">1. 스택의 특징</h2>
<ul>
<li><p>LIFO(Last In First Out, 후입선출) : 나중에 들어온 데이터가 먼저 나간다.</p>
</li>
<li><p>자동 할당/해제 : 함수가 호출되면 할당, 종료되면 자동 해제</p>
</li>
<li><p>크기 고정 : 컴파일 시점에 크기가 결정된다.</p>
<pre><code>void func() {
  int a = 10;         // 스택에 할당
   int arr = [5];    // 스택에 20바이트 할당    
} // 함수 종료 시 a, arr 자동 해제</code></pre><h2 id="2-스택-오버플로우">2. 스택 오버플로우</h2>
<p>스택 크기는 제한되어 있어서, 너무 큰 배열을 선언하거나 
재귀 호출이 너무 깊으면 스택 <strong>오버플로우(Stack Overflow)</strong>가 발생한다. 
스택 메모리가 한계를 넘으면 운영체제가 프로그램을 강제 종료시킨다.</p>
</li>
</ul>
<pre><code>// 스택 오버플로우 가능
int arr[1000000]; // 약 4MB - 스택 한계 초과 가능

// 재귀가 너무 깊으면 스택 오버플로우
void infinite() {
    intfinite(); // 무한 재귀 - 스택 오버플로우
}</code></pre><h1 id="3-데이터data-영역">3. 데이터(Data) 영역</h1>
<p>데이터 영역은 프로그램이 시작될 때 할당되고, 종료될 때 해제되는 영역이다. 
<strong>전역변수와 static 변수</strong>가 이 영역에 저장된다.</p>
<pre><code>int global = 10;  // 전역 변수 → 데이터 영역

void func() {
    static int count = 0;  // static 변수 → 데이터 영역
    count++;
}</code></pre><p>static 변수는 함수 안에 선언되어 있지만, 
데이터 영역에 저장 되어 함수가 종료되어도 값이 유지된다.</p>
<h1 id="4-힙heap-영역">4. 힙(Heap) 영역</h1>
<p>힙은 프로그래머가 직접 관리하는 동적 메모리 영역이다.</p>
<h2 id="1-힙의-특징">1. 힙의 특징</h2>
<ul>
<li>런타임 할당 : 프로그램 실행 중에 크기 결정 가능</li>
<li>수동 관리 : malloc( )으로 할당, free( )로 해제</li>
<li>유연한 크기 : 큰 데이터도 저장 가능</li>
</ul>
<pre><code>// 수동으로 관리하기 위해, stdlib.h가 필요하다.
#include &lt;stdlib.h&gt;

void func() {
    // 힙에 할당 - 실행 중에 크기 결정 가능
    int *p = (int*)malloc(sizeof(int) * 1000000);

    // 사용 ...

    free(p);  // 수동으로 해제해야 함
}</code></pre><h2 id="2-메모리-누수">2. 메모리 누수</h2>
<p>free( )를 호출하지 않으면 메모리 누수(Memory Leak)가 발생한다.</p>
<p>메모리 누수란? malloc( )으로 할당받은 메모리를 
free( )로 반환하지 않아서, 더 이상 사용하지 않는 메모리가 
힙에 계속 쌓이는 현상이다.</p>
<pre><code>void leak() {
    int *p = (int*)malloc(sizeof(int) * 100);  // 400바이트 할당
    // free(p)를 호출하지 않고 함수 종료
    // → p가 가리키던 400바이트는 힙에 남아있지만
    //   p 자체는 스택에서 사라져서 접근 불가능
}

int main() {
    for (int i = 0; i &lt; 1000; i++) {
        leak();  // 호출할 때마다 400바이트씩 누적
    }
    // → 총 400KB의 메모리가 힙에 쌓이지만 사용할 수 없음
}</code></pre><h3 id="왜-문제가-되는-것인가">왜 문제가 되는 것인가?</h3>
<table>
<thead>
<tr>
<th align="left">상황</th>
<th align="left">결과</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>단발성 프로그램</strong></td>
<td align="left">종료 시 OS가 모든 메모리를 회수하므로 큰 문제가 없다.</td>
</tr>
<tr>
<td align="left"><strong>장시간 실행 (서버, 게임 등)</strong></td>
<td align="left">메모리가 계속 쌓여서 시스템이 느려지거나 다운될 수 있다.</td>
</tr>
</tbody></table>
<p>메모리 누수 방지 : malloc( ) 호출 횟수와 free( ) 호출 횟수가 항상 일치해야 한다.</p>
<pre><code>void safe() {
    int *p = (int*)malloc(sizeof(int) * 100);
    // 사용 ...
    free(p);  // 반드시 해제
    p = NULL; // 해제 후 NULL로 초기화 (권장)
}</code></pre><h2 id="스택과-힙-비교">스택과 힙 비교</h2>
<p>스택(Stack) - 자동으로 관리
힙(Heap) - malloc/free로 수동으로 관리</p>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">스택 (Stack)</th>
<th align="left">힙 (Heap)</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>할당 방식</strong></td>
<td align="left">자동</td>
<td align="left"><code>malloc()</code></td>
</tr>
<tr>
<td align="left"><strong>해제 방식</strong></td>
<td align="left">자동 (함수 종료 시)</td>
<td align="left"><code>free()</code> 호출</td>
</tr>
<tr>
<td align="left"><strong>크기 결정</strong></td>
<td align="left">컴파일 시</td>
<td align="left">런타임 시</td>
</tr>
<tr>
<td align="left"><strong>속도</strong></td>
<td align="left">빠름</td>
<td align="left">느림</td>
</tr>
<tr>
<td align="left"><strong>크기 제한</strong></td>
<td align="left">작음 (보통 1 ~ 8MB)</td>
<td align="left">큼 (시스템 메모리 전체)</td>
</tr>
<tr>
<td align="left"><strong>사용 예</strong></td>
<td align="left">지역 변수, 배열</td>
<td align="left">동적 배열, 연결 리스트</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[동적 메모리 할당 (malloc, free)]]></title>
            <link>https://velog.io/@heosigi_0221/C%EC%96%B8%EC%96%B4-%EB%8F%99%EC%A0%81-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9-malloc-free</link>
            <guid>https://velog.io/@heosigi_0221/C%EC%96%B8%EC%96%B4-%EB%8F%99%EC%A0%81-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9-malloc-free</guid>
            <pubDate>Tue, 24 Feb 2026 05:25:37 GMT</pubDate>
            <description><![CDATA[<p>C언어에서 동적 메모리 할당의 기본 개념, malloc()과 free() 함수 사용법을 알아보려고 한다. </p>
<p>정보처리기사 실기에서 자주 출제되는 동적 메모리 할당 문제를 풀기 위해서 핵심 개념을 아래에 표로 정리를 했다.</p>
<h1 id="동적-메모리-할당-핵심-정리">동적 메모리 할당 핵심 정리</h1>
<table>
<thead>
<tr>
<th align="left">개념</th>
<th align="left">설명</th>
<th align="left">예시</th>
</tr>
</thead>
<tbody><tr>
<td align="left">malloc()</td>
<td align="left">힙 메모리에서 지정한 크기만큼 할당</td>
<td align="left">malloc(sizeof(int))</td>
</tr>
<tr>
<td align="left">sizeof()</td>
<td align="left">자료형의 크기(바이트)를 반환</td>
<td align="left">sizeof(int)=4</td>
</tr>
<tr>
<td align="left">형변환()</td>
<td align="left">malloc 반환값을 원하는 포인터 타입으로 변환</td>
<td align="left">(int*)malloc(...)</td>
</tr>
<tr>
<td align="left">free()</td>
<td align="left">할당된 메모리를 해제</td>
<td align="left">free(p);</td>
</tr>
</tbody></table>
<h1 id="1-동적-메모리-할당이란">1. 동적 메모리 할당이란?</h1>
<p>동적 메모리 할당은 프로그램 실행 중에 필요한 만큼
메모리를 할당받는 방법이라고 볼 수 있다.</p>
<p>일반 변수는 스택(Stack)에 지정되고 크기가 컴파일 시점에 결정된다.
반면 동적 메모리는 힙(Heap)에 저장되고 런타임에 크기를 결정할 수 있다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/0b04909f-3ce3-45f4-b6b2-8f0275d9394a/image.png" alt=""></p>
</blockquote>
<ul>
<li>프로그램이 실행하면 운영체제는 해당 프로그램을 위해 메모리 공간을 할당해준다.</li>
<li>메모리 구조는 4가지의 영역으로 나뉘게 되는데</li>
<li><em>CODE 영역, DATA 영역, HEAP 영역, STACK 영역*</em> 등으로 나뉘게 된다.</li>
</ul>
<p>일반 변수는 스택(Stack)에 저장되고, 크기가 컴파일 시점에 결정된다.
반면 동적 메모리는 힙(Heap)에 저장되고 런타임에 크기를 결정할 수 있다.</p>
<p>스택은 크기가 고정되어 있지만, 힙은 malloc( )으로 필요한 만큼 할당받을 수 있다.</p>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">스택 메모리</th>
<th align="left">힙 메모리</th>
</tr>
</thead>
<tbody><tr>
<td align="left">할당 시점</td>
<td align="left">컴파일 시</td>
<td align="left">실행 시</td>
</tr>
<tr>
<td align="left">크기 결정</td>
<td align="left">고정</td>
<td align="left">가변</td>
</tr>
<tr>
<td align="left">해제</td>
<td align="left">자동 (함수 종료 시)</td>
<td align="left">수동(free 호출)</td>
</tr>
<tr>
<td align="left">예시</td>
<td align="left">int arr[10];</td>
<td align="left">malloc(sizeof(int)*10)</td>
</tr>
</tbody></table>
<h1 id="2-malloc-함수">2. malloc() 함수</h1>
<p>  <strong>malloc( )</strong>은 Memory Allocation의 약자로,
  힙 메모리에서 지정한 바이트만큼 공간을 할당한다. 사용하려면 <strong>#include&lt;stdlib.h&gt;</strong>가 필요하다.</p>
<pre><code>  #include &lt;stdlib.h&gt; // malloc, free 사용 시 필요
  int *p = (int*)malloc(sizeof(int)); // int 1개 크기 할당 크기 할당</code></pre><blockquote>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/657a3bf3-ecc0-4a65-84c9-68468ee3b235/image.png" alt="">
  <p align="center">malloc은 요청한 크기만큼 힙에서 메모리를 할당하고, 그 주소를 반환한다. </p></p>
</blockquote>
<h2 id="1-malloc-사용-패턴">1. malloc() 사용 패턴</h2>
<pre><code>포인터 = (자료형*)malloc(sizeof(자료형));

// 예시
int *p = (int*)malloc(sizeof(int)); // int 1개
int *arr = (int*)malloc(sizeof(int) * 10) // int 10개 (배열)</code></pre><h2 id="2-sizeof-연산자">2. sizeof() 연산자</h2>
<p> <strong>sizeof( )</strong>는 자료형이나 변수의 크기를 바이트 단위로 반환한다.</p>
<table>
<thead>
<tr>
<th align="left">자료형</th>
<th align="left">sizeof() 결과</th>
</tr>
</thead>
<tbody><tr>
<td align="left">char</td>
<td align="left">1바이트</td>
</tr>
<tr>
<td align="left">int</td>
<td align="left">4바이트</td>
</tr>
<tr>
<td align="left">float</td>
<td align="left">4바이트</td>
</tr>
<tr>
<td align="left">double</td>
<td align="left">8바이트</td>
</tr>
<tr>
<td align="left">포인터</td>
<td align="left">4 또는 8바이트(시스템에 따라)</td>
</tr>
</tbody></table>
<pre><code>// 구조체의 크기도 계산 가능
struct node {
    char c;
    struct node* p;
};

malloc(sizeof(struct node)); // 구조체 1개 크기 할당</code></pre><h2 id="3-형변환-casting">3. 형변환 (casting)</h2>
<p>malloc()은 void 타입으로 반환하므로,
사용하려는 포인터 타입으로 형변환해야 한다.</p>
<pre><code>// void*를 int*로 형변환
int *p = (int*)malloc(sizeof(int));

// void*를 struct node*로 형변환
struct node *n = (struct node*)malloc(sizeof(struct node));

// 이중 포인터로 형변환 (2차원 배열용)
int **arr = (int**)malloc(sizeof(int*) * rows);</code></pre><p>여기서 형 변환을 꼭 잊지 말아야 한다.
malloc의 반환값을 형변환하지 않으면 경고가 발생할 수 있다.
(int*), (char*), (struct node*)등 알맞은 타입으로 변환해야 한다.</p>
<h1 id="3-free-함수">3. free() 함수</h1>
<p><strong>free()</strong>는 malloc()으로 할당한 메모리를 해제한다.
해제하지 않으면 메모리 누수(Memory Leak)가 발생한다.</p>
<pre><code>int *p = (int*)malloc(sizeof(int));
*p = 100;

// 사용 완료 후 해제
free(p);
p = NULL;  // 해제 후 NULL로 초기화 (권장)</code></pre><p>free() 후에 포인터를 사용하면 안된다.
해제된 메모리를 다시 사용하게 된다면 오류가 발생하므로
free() 후에는 포인터를 NULL로 초기화해야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴파일과 런타임]]></title>
            <link>https://velog.io/@heosigi_0221/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%9F%B0%ED%83%80%EC%9E%84-pvjcms5h</link>
            <guid>https://velog.io/@heosigi_0221/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EB%9F%B0%ED%83%80%EC%9E%84-pvjcms5h</guid>
            <pubDate>Mon, 23 Feb 2026 06:56:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/d80277c9-b545-49cd-a0c4-c735c8b94971/image.png" alt=""></p>
<h1 id="1-컴파일과-런타임의-차이">1. 컴파일과 런타임의 차이</h1>
<p>정보처리기사 실기를 공부하게 되면서 기초이면서 꼭 알아야 하는,
컴파일과 런타임에  있어서 어떠한 차이가 있는지 간단하게 작성하고자 한다.</p>
<p>여기서 공부하고자 하는 컴파일 시점과 런타임의 시점은 
C, Java, Python은 공통 개념으로 메모리 구조와 동적 메모리 할당을 
이해하기 위한 배경 지식이라고 볼 수 있다.</p>
<p>아래 표는 컴파일과 런타임의 각각 시점을 핵심으로 정리한 내용이다.</p>
<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>malloc 크기, 사용자 입력</td>
</tr>
<tr>
<td>오류</td>
<td>문법 오류, 타입 오류</td>
<td>0으로 나누기, 널 포인터 접근</td>
</tr>
</tbody></table>
<h1 id="2-컴파일이란">2. 컴파일이란?</h1>
<p>컴파일(Compile)은 사람이 작성한 소스 코드를 
컴퓨터가 이해할 수 있는 기계어로 변환하는 과정이다.</p>
<pre><code>// hello.c
# include &lt;stdio.h&gt;
int main() { 
    printf(&quot;Hello, worild!\n&quot;);
    return 0;
}</code></pre><p>위 코드를 컴파일을 하면,
실행 가능한 파일이 생성된다.</p>
<pre><code>gcc hello.c -o hello // 컴파일
./hello              // 실행</code></pre><h1 id="3-런타임이란">3. 런타임이란?</h1>
<p>런타임(Runtime)은 프로그램이 실제로
실행되는 시점을 의미한다.</p>
<table>
<thead>
<tr>
<th>단계</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>1. 작성</td>
<td>소스 코드 작성 (.c 파일)</td>
</tr>
<tr>
<td>2. 컴파일</td>
<td>소스 코드 ➡️ 실행 파일 변환</td>
</tr>
<tr>
<td>3. 런타임</td>
<td>실행 파일을 실행하는 시점</td>
</tr>
</tbody></table>
<p>런타임에는 <strong>사용자 입력을 받거나, 파일을 읽거나, 네트워크 통신</strong>을 하는 등
실행 중에만 알 수 있는 일들이 발생한다.</p>
<pre><code>int n;
scanf(&quot;%d&quot;, &amp;n); // 런타임에 사용자가 입력한 값으로 n이 결정</code></pre><h1 id="4-컴파일-시점에-결정되는-것">4. 컴파일 시점에 결정되는 것?</h1>
<p>컴파일러가 코드를 분석할 때 미리 알 수 있는 것들이다.</p>
<h2 id="1-배열-크기">1. 배열 크기</h2>
<pre><code>int arr[10]; // 컴파일 시 40바이트로 결정(int 4바이트 * 10)</code></pre><p>배열 크기는 컴파일 시점에 <strong>상수</strong>로 지정해야 한다.</p>
<pre><code>int n = 10;
int arr[n]; // 컴파일 오류 가능 (C89 표준) 
            // C99 이후에는 VLA로 허용되나 권장하지 않음</code></pre><h2 id="2-지역-변수-크기">2. 지역 변수 크기</h2>
<pre><code>void func() {
    int a;            // 4바이트 - 컴파일 시 결정
    double b;        // 8바이트 - 컴파일 시 결정
    char str[100];    // 100바이트 - 컴파일 시 결정
}</code></pre><p>함수 호출 시 스택에 얼마만큼의 공간이 필요한지
컴파일러가 미리 계산한다.</p>
<h2 id="3-자료형-크기">3. 자료형 크기</h2>
<pre><code>sizeof(int);    // 4 - 컴파일 시 결정
sizeof(double); // 8 - 컴파일 시 결정
sizeof(char);    // 1 - 컴파일 시 결정</code></pre><p><strong>sizeof</strong> 연산자의 결과값은 컴파일 시점에 확정된다.</p>
<h1 id="5-런타임에-결정되는-것">5. 런타임에 결정되는 것?</h1>
<p>프로그래밍 실행 중에만 알 수 있는 것들이다.</p>
<h2 id="1-malloc-크기">1. malloc 크기</h2>
<pre><code>int n;
printf(&quot;배열 크기를 입력하세요: &quot;);
scanf(&quot;%d&quot;, &amp;n);

// 런타임에서 n의 값에 따라 메모리 크기가 결정
int *arr = (int*)malloc(sizeof(int) * n);</code></pre><p>동적 메모리 할당은 런타임에 크기를 결정할 수 있는 대표적인 방법이다.</p>
<h2 id="2-사용자-입력">2. 사용자 입력</h2>
<pre><code>char name[50];
printf(&quot;이름을 입력하세요: &quot;);
scanf(&quot;%s&quot;, name); // 런타임에 사용자가 입력</code></pre><h2 id="3-조건문-결과">3. 조건문 결과</h2>
<pre><code>int x = rand() % 100; // 런타임에 난수 생성

if (x &gt; 50) { 
    printf(&quot;큰 수&quot;); // 실행될 지는 런타임에 결정
} else { 
    printf(&quot;작은 수&quot;);
}</code></pre><h2 id="4-파일-내용">4. 파일 내용</h2>
<pre><code>FILE *fp = fopen(&quot;data.txt&quot;, &quot;r&quot;);
// 파일 내용은 런타임에만 알 수 있음</code></pre><h1 id="6-컴파일과-런타임의-차이">6. 컴파일과 런타임의 차이?</h1>
<h2 id="컴파일-에러-vs-런타임-에러">컴파일 에러 vs. 런타임 에러</h2>
<h2 id="1-컴파일-에러">1. 컴파일 에러</h2>
<p>컴파일 에러는 컴파일 과정에서 발견되는 오류이다.
프로그램이 아예 실행 파일로 만들어지지 않는다.</p>
<pre><code>// 문법 오류 - 컴파일 에러
int a = 10        // 세미콜론 누락
printf(&quot;%d&quot;, a);

// 타입 오류 - 컴파일 에러
int *p = &quot;hello&quot;;    // int* 에 문자열 대입 시도</code></pre><table>
<thead>
<tr>
<th>컴파일 에러 종류</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td>문법 오류</td>
<td>세미콜론 누락, 괄호 불일치</td>
</tr>
<tr>
<td>타입 불일치</td>
<td>int에 char* 대입</td>
</tr>
<tr>
<td>선언되지 않은 변수</td>
<td>prinft (오타)</td>
</tr>
<tr>
<td>잘못된 연산</td>
<td>10 + &quot;hello&quot;</td>
</tr>
</tbody></table>
<h2 id="2-런타임-에러">2. 런타임 에러</h2>
<p>런타임 에러는 프로그램 실행 중에 발생하는 오류이다. 
컴파일은 성공했지만 실행 중에 문제가 생긴다.</p>
<pre><code>// 0으로 나누기 - 런타임 에러
int a = 10;
int b = 0;
int c = a / b;  // 실행 시 오류

// 널 포인터 접근 - 런타임 에러
int *p = NULL;
*p = 100;       // 실행 시 오류

// 배열 범위 초과 - 런타임 에러 (또는 예기치 않은 동작)
int arr[5];
arr[100] = 10;  // 위험한 접근</code></pre><table>
<thead>
<tr>
<th>런타임 에러 종류</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td>0으로 나누기</td>
<td>a / 0</td>
</tr>
<tr>
<td>널 포인터 역참조</td>
<td>*NULL</td>
</tr>
<tr>
<td>배열 범위 초과</td>
<td>arr[1000] (크기가 10인 배열)</td>
</tr>
<tr>
<td>스택 오버플로우</td>
<td>무한 재귀 호출</td>
</tr>
<tr>
<td>메모리 부족</td>
<td>너무 큰 malloc</td>
</tr>
</tbody></table>
<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>malloc, 동적 배열</td>
</tr>
<tr>
<td>오류 발견</td>
<td>문법, 타입 오류</td>
<td>논리 오류, 예외 상황</td>
</tr>
<tr>
<td>오류 시</td>
<td>실행 파일 생성 안됨</td>
<td>프로그램 비정상 종료</td>
</tr>
</tbody></table>
<p>위 개념을 이해해야 이후에 메모리 구조에서의
스택과 힙의 차이, 동적 메모리 할당에서 malloc이
필요한 이유를 더 잘 이해할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래밍 언어?]]></title>
            <link>https://velog.io/@heosigi_0221/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%96%B8%EC%96%B4</link>
            <guid>https://velog.io/@heosigi_0221/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%96%B8%EC%96%B4</guid>
            <pubDate>Sun, 01 Feb 2026 07:25:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/ae2966d7-e20c-4a2e-8863-63d6d7b926b0/image.png" alt=""></p>
<h1 id="프로그래밍-언어">프로그래밍 언어?</h1>
<p>프로그래밍 언어란 즉,
<strong>사람이 컴퓨터와 소통하는 방식</strong></p>
<p>JavaScript는 <strong>수 많은 프로그래밍 언어들 중 하나</strong>이다.</p>
<p>각 프로그래밍 언어는 <u>컴퓨터에게 무엇을 해야하는지</u> 
알려주는 일련의 규칙과 명령이 있다.</p>
<p>만약에 프로그래밍 언어가 없다면, 컴퓨터는 우리가 말하는 명령을
이해하지 못하고 어떠한 작업도 수행할 수 없다.</p>
<h1 id="머신-코드">머신 코드?</h1>
<p>컴퓨터는 영어, 한국어, 스페인어, 일본어 등
어떠한 언어도 구사하지 못한다.</p>
<p>그래서 영어 단어를 머신 코드(Machine Code)로 
<strong>&quot;컴파일(Compile)&quot;</strong>해야 한다.</p>
<p>머신 코드는 컴퓨터가 <u>직접적으로 이해할 수 있는
유일한 언어</u>이다.</p>
<p>하지만, 머신 코드를 학습한다는 것은 거의 불가능에 가깝다.</p>
<p>머신 코드를 작성할 수 있다고 해도
다른 사람들은 읽기가 어렵고 중앙 처리 장치(CPU) 모델마다 
다른 머신 코드가 필요하기 때문이다.</p>
<pre><code>// 프로그래밍 언어
x = 10 + 2
y = x + 4</code></pre><pre><code>// 머신 코드
// 컴퓨터 메모리 내에서 작동하는 작은 명령어로 구성
001001 11101 11101 111111...
001000 00001 00000 000000...</code></pre><p>머신 코드에 대해서 이해가 아직 잘 안될수도 있다.
아래에 내용을 더 작성해두었으므로, 참고하면 좋다</p>
<blockquote>
<h2 id="머신-코드가-무엇이길래">&quot;머신 코드&quot;가 무엇이길래?</h2>
<p>머신 코드는 컴퓨터가 직접 알아들을 수 있는
&quot;기계의 언어&quot;라고 생각하면 된다.</p>
<p>컴퓨터 안에는 전기가 흐르거나(1), 흐르지 않거나(0)
두가지 상태로 컴퓨터는 오직 0과 1로만 
이해할 수 있다.</p>
<p>예시 : 🍔 햄버거 주문을 한다면?
어떤 사람이 &quot;치즈버거 하나만 주세요&quot;라고 말한다.
하지만 컴퓨터는 &quot;011010&quot;으로 말해야 이해한다.</p>
<ul>
<li>🍔 햄버거 종류 : 01</li>
<li>치즈 추가 여부 : 1</li>
<li>소스 종류 : 10</li>
<li>포장 여부 : 0 
이러한 숫자가 머신 코드이고, 이 코드는
컴퓨터는 &quot;치즈버거 포장 없이&quot;로 해석한다.</li>
</ul>
</blockquote>
<p>하지만, 문제는 머신 코드를 이해하고 사용하는 것은
무척이나 어려운 일이라고 볼 수 있다.</p>
<p>그래서 사람들이 만든 것이 바로
&quot;프로그래밍 언어&quot;이다.</p>
<blockquote>
<p>사람 -&gt; 프로그래밍 언어 -&gt; 머신 러닝 -&gt; 컴퓨터</p>
</blockquote>
<p>사람 언어 그리고 머신 코드를
아래와 같이 표로 정리하면 다음과 같다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>😎 사람 언어</td>
<td>한국어, 영어 - 사람은 편하지만, 컴퓨터는 모름</td>
</tr>
<tr>
<td>🤖 머신 코드</td>
<td>0과 1 - 컴퓨터만 이해함, 사람은 이해하기 어려움</td>
</tr>
</tbody></table>
<h1 id="프로세서">프로세서</h1>
<p>머신 코드(ex: 011010)는 컴퓨터가 
이해할 수 있는 언어라면?
머신 언어를 처리하는 컴퓨터의 두뇌는
&quot;프로세서(Processor)&quot;이다.</p>
<p>프로세스는 작은 칩(Chip)으로 컴퓨터와 다른 장치에
상주하는 기계와도 같다.
이건 입력(Input)을 받은 후에 무언가로
나가는 출력(Output)을 한다.</p>
<p>컴퓨터 (또는 프로세서)는 제조사마다 다르며,
모든 프로세스가 같은 언어를 사용하는 것은 아니다.</p>
<ul>
<li>Apple -&gt; M4</li>
<li>Qualcomm -&gt; X Elite</li>
<li>Intel -&gt; Lunar Lake</li>
<li>AMD -&gt; Ryzen </li>
</ul>
<h1 id="저수준-언어">저수준 언어</h1>
<p>사람은 머신 코드에 사용되는 이진수(Binary number)
를 사용하는 것에 능숙하지 않다.
어떤 사람이 0과 1로 이루어진 언어를 쓰고 싶고
싶어하지 않을 것이다.
<s>(쓰는 사람도 있을수도 있다..)</s></p>
<p>그래서 모든 컴퓨터 프로그래밍 언어는
머신 코드에 가깝다.</p>
<p>어셈블리(Assembly)언어는 머신 코드에
가장 가까운 것으로 알려져 있다.
어셈블리 언어는 저수준(Low-level)언어로
머신 코드에 가깝다.</p>
<blockquote>
<p>10110000 0110001 // 머신 코드
MOV AL, 61 // 어셈블리 언어</p>
</blockquote>
<p>머신 코드보다는 사람이 조금 더 이해할 수는 있다.
그래도 여전이 어렵고 명령어가 매우 많이 필요하다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>😎 사람 언어</td>
<td>한국어, 영어 - 사람은 편하지만, 컴퓨터는 모름</td>
</tr>
<tr>
<td>💻 <strong>저수준 언어</strong></td>
<td><strong>컴퓨터가 이해할 수 있고, 사람도 조금은 읽기 쉬움</strong></td>
</tr>
<tr>
<td>🤖 머신 코드</td>
<td>0과 1 - 컴퓨터만 이해함, 사람은 이해하기 어려움</td>
</tr>
</tbody></table>
<h1 id="고수준-언어">고수준 언어</h1>
<p>컴퓨터의 중앙 처리 장치(CPU)에서 멀어질수록
하드웨어에 대한 고민이 줄어든다.</p>
<p>고수준(High-level)언어는 사람이 이해하기 쉽고
사용하기 용이하다.</p>
<p>다만, CPU 수준에서 최적화되지 않아
머신 코드에 비해 느리다.</p>
<p>하지만, 체감상 성능 이슈는 잘 느끼지 못한다.
오늘날 고수준 언어를 머신 코드로 변경하는 
컴파일러 및 트랜스파일러 성능이 워낙 강력해서
결과적으로 고수준 언어를 사용하는 것이 
프로그래머에게 효과적이라고 볼 수 있다.</p>
<p>JavaScript는 고수준 언어 중 하나의 언어로,
사람이 이해하기 쉽고 작성하기 용이하다.</p>
<p>JavaScript 코드는 머신 코드로 변환되어 
컴퓨터에서 프로세싱(처리)된다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>😎 사람 언어</td>
<td>한국어, 영어 - 사람은 편하지만, 컴퓨터는 모름</td>
</tr>
<tr>
<td>💡 <strong>고수준 언어</strong></td>
<td><strong>사람이 쓰기 아주 쉬운 언어, 컴퓨터는 번역해서 이해함</strong></td>
</tr>
<tr>
<td>💻 저수준 언어</td>
<td>컴퓨터가 이해할 수 있고, 사람도 조금은 읽기 쉬움</td>
</tr>
<tr>
<td>🤖 머신 코드</td>
<td>0과 1 - 컴퓨터만 이해함, 사람은 이해하기 어려움</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[실행 컨텍스트?]]></title>
            <link>https://velog.io/@heosigi_0221/%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Excution-Context</link>
            <guid>https://velog.io/@heosigi_0221/%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Excution-Context</guid>
            <pubDate>Tue, 20 Jan 2026 07:36:13 GMT</pubDate>
            <description><![CDATA[<h2 id="1-들어가며">1. 들어가며</h2>
<p>자바스크립트를 공부를 하게 될 때, 
무조건 꼭 마주치게 되는 파트가 실행 컨텍스트이다.</p>
<p>자바스크립트를 사용하는 개발자라면, 
실행 컨텍스트라는 개념에 대해서 잘 알고 있는 것이 중요하다. 
이 개념을 이해하는 것은 단순한 지식으로 남는 것이 아닌, 
실제 개발하는 과정에서 큰 도움을 주기 때문이다.</p>
<p>코드를 디버깅을 할 때 상황을 보면, 
<strong>왜 이 변수는 이 값이 되는 것인지? **
**왜 이 함수는 바로 여기서 호출되었는지?</strong>
와 같은 궁금증이 생기는 상황이 있다.</p>
<p>이러한 궁금증들을 이해하기 위해서는,
실행 컨텍스트에 대해 알게 되면 의문점들을 
훨씬 더 쉽게 해결할 수 있게 된다.</p>
<p><strong>변수의 스코프(Scope), 호이스팅(Hoisting), 함수 호출 방식</strong> 등을 이해하면, 
코드의 흐름을 좀 더 명확하게 파악하는데 큰 도움이 된다.</p>
<p>또한 코드를 작성할 때 이점이 있다.
<strong>어떻게 코드가 실행되는지, 메모리에 어떻게 할당되는지</strong> 등등 
이러한 것들을 아는 것은 효율적이고 클린한 코드를 
작성하는 데에 있어서 도움이 된다. 
이는 웹 애플리케이션의 전반적인 성능 향상으로 이어진다.</p>
<p>마지막으로 다른 프로그래밍 기술을 익히는 데에도 
실행 컨텍스트의 이해는 필수적이라고 볼 수 있다. 
<strong>클로저(Closure), 콜백(Callback), 프로미스(Promise)</strong> 등 
자바스크립트 고급 개념들을 모두 실행 컨텍스트와 밀접하게 연결되어 있다.</p>
<p>결론적으로 해당 개념들을 제대로 파악하고 싶다면, 
실행 컨텍스트를 잘 이해하는 것은 필수적이라고 볼 수 있다.</p>
<h2 id="2-실행-컨텍스트">2. 실행 컨텍스트</h2>
<p>자바스크립트는 <strong>싱글 스레드 인터프리터 언어</strong>로, 
각 브라우저는 자체 자바스크립트 엔진을 사용하여 코드를 스캔하고 해석한다. 
이 과정에서 중요한 역할을 하는 것이 <strong>실행 컨텍스트(Excution Context)</strong>인데, 
실행 컨텍스트는 코드의 변환과 실행을 담당하는 환경으로, 
실행할 코드에 필요한 모든 정보를 담은 객체라고 할 수 있다.</p>
<p>쉽게 말해서 자바스크립트 엔진이 코드를 실행할 때,
<strong>1. 지금 어떤 변수들이 있는지
2. 이 함수는 어디에서 호출되었는지 
3. this는 무엇인지</strong>
관리하는 일종의 <strong>실행 공간</strong> 이라고 이해하면 편하다.</p>
<p>자세하게 말해보자면, 실행할 코드에
전달할 정보를 담고 있는 객체는 아래와 같이 볼 수 있다.</p>
<blockquote>
<ol>
<li>변수 - 전역변수, 지역변수, 매개변수, 객체의 프로퍼티<ol start="2">
<li>함수 (Function)</li>
<li>호이스팅 (Hoisting)</li>
<li>클로저 (Closure)</li>
<li>스코프 (Scope)</li>
<li>This</li>
</ol>
</li>
</ol>
</blockquote>
<p>이러한 방법으로 자바스크립트는 해당 스크립트 코드에 있는 
실행 컨텍스트에 관한 정보들을 수집한다.</p>
<p>모아진 실행 컨텍스트들을 콜 스택에 쌓아 올린 후, 
실행하여 코드의 실행환경 순서를 보장하게 된다.</p>
<h2 id="3-실행-가능한-코드-종류">3. 실행 가능한 코드 종류</h2>
<p>실행 가능한 코드에 제공할 환경 정보를 모아놓은 객체라고 볼 수 있는데,</p>
<p>여기서 말하는 실행 가능한 코드는 아래와 같이 존재한다.</p>
<blockquote>
<p>전역 코드(Global Code) : 모든 영역에 존재하는 코드
 Eval 코드 : eval 함수로 실행되는 코드
 함수 코드(Function Code) : 함수 내에 존재하는 코드</p>
</blockquote>
<h2 id="4-콜-스택call-stack">4. 콜 스택(Call Stack)</h2>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/41743da1-070f-457a-97d8-2d640123397c/image.png" alt=""></p>
<ol>
<li>전역 컨텍스트가 생성되어 콜 스택에 PUSH 된다.</li>
<li><strong>second()</strong> 함수를 호출하면, 해당 함수의 새 실행 컨텍스트가 
생성되어 콜 스택의 최상단에 PUSH 된다.</li>
<li><strong>second</strong> 내부에서 <strong>first()</strong>를 호출하면, <strong>first</strong>의 실행 컨텍스트도 
콜 스택의 최상단에 PUSH 된다.</li>
<li>이후 <strong>second</strong>의 실행 컨텍스트도 스택에 POP되며, 
마지막으로 전역 컨텍스트가 남는다.</li>
<li>최종적으로 전역 컨텍스트도 스택에서 POP되며 프로그램의 실행이 종료된다.</li>
</ol>
<p>사진처럼 자바스크립트 엔진은 생성된 컨텍스트들을 
스택(Stack)이라는 구조로 관리하게 된다. 
이러한 구조를 <strong>콜 스택(Call Stack)</strong> 이라고 불리는데, 
위 사진을 아래 내용으로 순서대로 말하자면 이렇게 된다.</p>
<blockquote>
<ol>
<li>전역 코드를 실행하며 <strong>전역 컨텍스트</strong>를 스택에 쌓는다.</li>
<li>함수 호출 시, 해당 함수의 함수 컨텍스트를 생성하여 스택 맨 위에 <strong>추가(PUSH)</strong>한다.</li>
<li>함수 실행이 끝나면 해당 컨텍스트를 <strong>제거(POP)</strong>한다.</li>
</ol>
</blockquote>
<p>위 콜 스택 이미지를 아래와 같이 코드로 작성하면,</p>
<pre><code>var a = &quot;a&quot;;

function first() {
 console.log(&quot;This is first&quot;);
}

function second() {
 first();
}

second();</code></pre><p>해당 코드와 이미지는 처음에 자바스크립트가 실행되고 
콜스택에 어떤 식으로 컨텍스트들이 담기고, 
작동하게 되는지에 대한 예시이다.</p>
<p>전역 컨텍스트는 코드 내부에서 별도의 실행 명령이 없어도 
브라우저에서 자동으로 실행하므로, 자바스크립트 파일이 열리는 순간 
전역 컨텍스트가 활성화된다고 이해할 수 있다. </p>
<blockquote>
<p>⁉️ <strong><em>참고해주세요!</em></strong>
<strong>전역 컨텍스트(Global Context)</strong>의 경우,
브라우저 환경 = <strong>Window 객체</strong>로 표현된다. 
Node.js 환경 = <strong>Global 객체</strong>로 표현된다.</p>
</blockquote>
<p>실행 컨텍스트가 생성되는 경우
즉, Call Stack에 실행 컨텍스트가 쌓이게 되는 기준은 아래와 같다.</p>
<blockquote>
</blockquote>
<ul>
<li>전역 공간(Global EC) -&gt; 자동생성</li>
<li>일반 함수 실행</li>
<li>eval 함수 실행</li>
<li>Block 생성</li>
</ul>
<h2 id="5-실행-컨텍스트-내부-구조">5. 실행 컨텍스트 내부 구조</h2>
<p> <img src="https://velog.velcdn.com/images/heosigi_0221/post/4bdb761d-d660-47a8-a8b1-5ad21dec0357/image.png" alt=""></p>
<p>하나의 실행 컨텍스트는 크게 3가지로,
구성이 되어 아래와 같이 생성된다.</p>
<h3 id="5-1-variable-environment-변수-환경">5-1. Variable Environment (변수 환경)</h3>
<p> 실행에 필요한 여러 정보들을 담을 객체를 생성한다. </p>
<p> <strong>Variavble Environment</strong>는 아래와 같이 정보를 담는 객체이다.</p>
<blockquote>
</blockquote>
<ol>
<li>변수(Variable)</li>
<li>매개변수(Parameter), 인수(Arguments)</li>
<li>함수 선언(함수 표현식X)</li>
</ol>
<p>이 환경은 <strong>environmentRecord</strong>와 <strong>outerEnvironmentReference</strong>로 구성된다.</p>
<blockquote>
<ul>
<li><strong>environmentRecord</strong>
실행 컨텍스트 내에서 선언된 변수와  함수 선언들의 실제 값을 저장한다.</li>
</ul>
</blockquote>
<ul>
<li><strong>outerEnvironmentReference</strong>
외부 환경에 대한 참조를 유지한다. 
이 참조는 현재 컨텍스트가 위치한 코드의 외부 스코프, 
즉 부모 스코프에 대한 정보를 가진다.</li>
</ul>
<p>실행 컨텍스트가 최초 생성될 때,
<strong>Variable Environment</strong>에 이 정보들이 저장되고, 
이후 <strong>Lexical Environment</strong>를 형성하기 위해 복사된다.</p>
<p><strong>Variable Environment</strong>는 초기화 시점의 상태를 스냅샷으로 유지하며, 
후에는 참조만 제공한다. 이는 실행 컨텍스트의 초기 상태를 추적할 때 유용하다.</p>
<h3 id="5-2-lexical-environment-렉시컬-환경">5-2. Lexical EnvironMent (렉시컬 환경)</h3>
<p><strong>Variable Environment</strong>와 마찬가지로, 
<strong>Lexical Environment</strong>도 <strong>environmentRecord</strong>와 <strong>outerEnvironmenReference</strong>로 구성된다.</p>
<p><strong>Lexical Environment</strong>에서의 <strong>environmentRecord</strong>에서는 
실행 중에 코드 내에서 발생하는 변화를 실시간으로 반영한다. 
이는 블록 내의 변수 할당이나 함수 표현식과 같은 동적인 활동을 포함한다.</p>
<p><strong>outerEnvironmentReference</strong>는 
<strong>Lexical Environment</strong>의 외부 스코프에 대한 참조를 제공한다. 
이는 현재 컨텍스트가 어떤 외부 스코프와 연결되어 있는지를 나타낸다.</p>
<p><strong>Lexical Environment</strong>는 코드 실행 중, 발생하는 동적인 활동을 
반영함으로써 <strong>Variable Environment</strong>와 차별화가 된다. 
이를 통해 실행 컨텍스트의 실시간 상태를 보다 정확하게 반영하게 된다.</p>
<blockquote>
<h3 id="environment-구성">Environment 구성</h3>
</blockquote>
<h3 id="📦-environmentrecord환경-레코드">📦 environmentRecord(환경 레코드)</h3>
<ul>
<li>함수 내의 코드가 실행되기 전, 현재 컨텍스트에 관련된 
모든 식별자 정보(매개변수의 이름, 함수 선언, 변수명 등)가 여기에 저장된다.</li>
<li>이 과정을 통해 JavaScript 엔진은 코드 실행 전에 
해당 환경의 식별자들을 인지하게 되며, 
이것이 바로 <strong>호이스팅(Hoisting)</strong>이다. 
호이스팅은 코드에서 선언들을 먼저 처리하고,
나중에 할당을 수행하는 JavaScript의 동작을 추상화한 개념이다.
<strong>함수 선언문</strong>은 전체가 호이스팅되지만, 
<strong>함수 표현식</strong>은 이름만 호이스팅되고 함수 본문은
실행 흐름이 해당 위치에 도달했을 때 처리가 된다.<h3 id="📄-outerenvironmentreference외부-환경-참조">📄 outerEnvironmentReference(외부 환경 참조)</h3>
</li>
<li>이는 현재 실행 컨텍스트의 <strong>상위 스코프</strong>를 참조한다.</li>
<li>다시 말해서, 현재 <strong>environmentRecord</strong> 외부에 있는 <strong>LexicalEnvironment</strong>를 참조하는 것으로, 
이를 통해 <strong>해당 실행 컨텍스트를 생성한 함수의 외부 환경에 접근</strong>할 수 있다.</li>
<li>코드에서 변수를 찾을 때 현재 컨텍스트에서 <strong>LexicalEnvironment</strong>를 먼저 탐색하고, 
그곳에서 찾지 못하면 <strong>outerEnvironmentReference</strong>를 통해 상위 스코프를 검색한다.
이 검색은 전역 컨텍스트의 <strong>LexicalEnvironment</strong>에 도달할 때까지 계속되며, 
결국 해당 변수를 찾지 못하면 <strong>undefined</strong>를 반환한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/5b7cb498-7d26-4d61-ae40-2a398be8ce81/image.png" alt=""></p>
<h3 id="5-3-this-binging-this-바인딩">5-3. this binging (this 바인딩)</h3>
<p>🔗 바인딩이란?</p>
<ul>
<li>프로그래밍에서 바인딩은, 
<strong>식별자(ex : 변수, 함수 이름)</strong>를 그들이 대표하는 값과 연결하는 과정을 의미한다. 예를 들어, 변수 선언은 변수 이름을 메모리 상의 주소와 연결한다.</li>
</ul>
<p><strong>this 바인딩</strong>은 특별한 경우로, <strong>this</strong>라는 식별자와
그것을 가리키는 객체를 연결한다.</p>
<p>❓Lexical Scope와의 차이</p>
<ul>
<li>함수의 <strong>Lexical Scope</strong>는 그 함수가 정의된 위치에 따라 결정되는 반면, <strong>this 바인딩</strong>은 함수가 어떻게 호출되는지에 따라 달라진다. </li>
<li>즉, <strong>this 바인딩</strong>은 함수의 선언 위치와 상관없이,
오로지 <strong>어디서 어떻게 함수를 호출하느냐에 따라</strong>
결정된다고 보면 된다.</li>
</ul>
<blockquote>
<p>📢 함수를 호출하는 방법과 this 바인딩
<strong>1. 일반 함수 호출 (기본 바인딩) **
 함수가 일반적인 방식으로 호출 될 때, 
 this는 전역객체(브라우저는 window, Node.js에서는 global)를 가리킨다. 
 단 &#39;strict mode&#39;에서는 this가 undefined가 된다.
** 2. 메서드 호출 (암시적 바인딩)</strong>
 객체의 메서드로서 함수가 호출되면, 
 this는 그 메서드를 호출한 객체를 가리킨다. 
 예를 들어 obj.method()에서 this는 obj를 가리킨다.
 <strong>3.  Function.prototype.apply/call/bind 
 메서드에 의한 간접 호출(명시적 바인딩)</strong>
 이러한 메서드를 사용하면, 개발자가 명시적으로 
 this를 바인딩할 객체를 지정할 수 있다. 
 이 경우, this는 지정된 객체를 가리킨다.
 <strong>4. 생성자 함수 호출 (new 바인딩)</strong>
 <strong>new</strong> 키워드를 사용하여 함수를 생성자로 호출하면,
 <strong>this</strong>는 새로운 객체를 가리킨다.</p>
</blockquote>
<ul>
<li>🚫** 예외 사항** : <strong>&#39;strict mode&#39;</strong>에서는 <strong>this</strong> 바인딩이 다르게 작동한다. 
일반 함수에서 <strong>this</strong>는 <strong>undefined</strong>로 설정된다.</li>
<li>💡 <strong>실용적인 예시</strong> : 코드 예시를 통해 각 호출 방식에서 
this가 어떻게 바인딩되는지 실제로 보여줄 수 있다. 
이를 통해 <strong>this</strong> 바인딩의 개념을 더 명확히 이해할 수 있다.</li>
</ul>
<pre><code>  // 1. 일반 함수 호출
// &#39;this&#39;는 기본적으로 전역 객체를 가리킴 (브라우저에서는 window, Node.js에서는 global)
// &#39;strict mode&#39;에서는 &#39;this&#39;가 undefined로 설정됨
const first = function () {
  console.log(this);
};
first(); // window 또는 undefined (&#39;strict mode&#39;에 따라 달라짐)

// 2. 메서드 호출
// &#39;this&#39;는 메서드를 호출한 객체를 가리킴
const obj = { first };
obj.first(); // { first: ƒ first() }

// 3. call을 사용한 호출
// &#39;this&#39;는 call의 첫 번째 인자로 명시적으로 지정된 객체를 가리킴
first.call({ a: &quot;kim&quot; }); // { a: &#39;kim&#39; }

// 4. 생성자 함수 호출
// &#39;this&#39;는 새로 생성된 인스턴스를 가리킴
new first(); // first {}

// 5. 화살표 함수
// 화살표 함수는 &#39;this&#39;를 자체적으로 바인딩하지 않고, 정의된 상위 스코프의 &#39;this&#39;를 사용함
const arrowFunc = () =&gt; {
  console.log(this);
};
arrowFunc(); // 상위 스코프의 &#39;this&#39; (일반적으로 전역 객체 또는 &#39;strict mode&#39;에서는 undefined)
</code></pre><ul>
<li>화살표 함수는 자신의 this를 생성하지 않고, 정의된 스코프의 <strong>this</strong>를 사용한다. 이는 화살표 함수가 어휘적으로 주변 스코프(Lexical Scope)를 상속받는다는 것을 의미한다.</li>
</ul>
<p><strong>&#39;this&#39; 바인딩의 우선순위</strong></p>
<ol>
<li><strong>new 바인딩</strong> : <strong>new</strong> 키워드로 호출된 생성자 함수에서 <strong>this</strong>는 새로 생성된 인스턴스를 가리킨다.</li>
<li><strong>명시적 바인딩</strong> : <strong>call, apply, bind</strong>를 사용할 때 <strong>this</strong>는 명시적으로 지정된 객체를 가리킨다.</li>
<li><strong>암시적 바인딩</strong> : 객체의 메서드로 함수가 호출되면, <strong>this</strong>는 그 객체를 가리킨다.</li>
<li><strong>기본 바인딩</strong> : &#39;strict mode&#39;에서는 <strong>this</strong>가 <strong>undefined</strong>가 되며
&#39;non-strict mode&#39;에서는 전역 객체를 가리키게 된다.  </li>
</ol>
<h2 id="📚-참고자료">📚 참고자료</h2>
<ol>
<li>[변수의 유효범위와 클로저 - Javascript.info] 
(<a href="https://ko.javascript.info/closure">https://ko.javascript.info/closure</a>)<ol start="2">
<li>[스코프 - poiemaweb]
(<a href="https://poiemaweb.com/js-scope">https://poiemaweb.com/js-scope</a>)</li>
</ol>
</li>
<li>[실행 컨텍스트의 구성 - heycoding]
(<a href="https://heycoding.tistory.com/86?ref=nextree.io#1.2.%20%EC%8B%A4%ED%96%89%20%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98%20%EA%B5%AC%EC%84%B1">https://heycoding.tistory.com/86?ref=nextree.io#1.2.%20%EC%8B%A4%ED%96%89%20%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98%20%EA%B5%AC%EC%84%B1</a>)</li>
<li>[execution_context - gamguma]
(<a href="https://gamguma.dev/post/2022/04/js_execution_context?ref=nextree.io">https://gamguma.dev/post/2022/04/js_execution_context?ref=nextree.io</a>)</li>
<li>모던 자바스크립트 - Deep Dive, 이웅모</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[조건문?]]></title>
            <link>https://velog.io/@heosigi_0221/%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@heosigi_0221/%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Fri, 21 Nov 2025 01:59:10 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/71bc18e8-6480-4ec7-93da-66db98ea77a1/image.png" alt=""></p>
<p>우리는 사회라는 공간 안에서 규칙을 지키면서 살아가고 있다.
만약에 규칙이 존재하지 않는다면 사고나 혼란이 발생하게 될 수 있다.
이 중, 많은 예시 중에 익숙한 예시를 말해보라고 하면 신호등이 있다.</p>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/caeec479-a3ea-458e-8a15-f75254b587aa/image.png" alt=""></p>
<p>신호등이 빨간색이면🔴 멈추는 의미, 
신호등이 초록색이면🟢 걸어가라는 의미이다.
마치 이것이 맞다면 가고, 아니라면 가지 않는 것처럼 
<strong>조건에 따라 다른 행동을 취하게 하는 조건문과 같은 것</strong>이다.</p>
<p>자바스크립트에서 사용하는 조건문에 대해 알아보도록 하자</p>
<h2 id="1-if--else문">1. if ... else문</h2>
<p>자바스크립트에 조건문이라고 하면 빠질래야 빠질 수가 없는
if...else문이 대표적이다.</p>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/616706dd-defa-46fd-a35d-3167711e09a0/image.png" alt=""></p>
<p>if...else문은 특정상황에서 프로그램 작동을 조건부로 제어를 한다.</p>
<p>그러면 위에 설명한 예시로 신호등을 조건문으로 아래에 만든다고 하면,</p>
<pre><code>let isLightRed = true

if (isLightRed) {
    console.log(&#39;신호등 앞에 멈춰!&#39;)
} else {
    console.log(&#39;신호등 건너!&#39;)
}</code></pre><p align="center">
<img src="https://velog.velcdn.com/images/heosigi_0221/post/334d2cf4-d01b-40d4-b0db-78546ebb17e1/image.png" width="60%" height="60%">
</p>

<h2 id="2-참-거짓-평가">2. 참, 거짓 평가</h2>
<p>모든 조건은 표현식이라서, 참(Truthy) 또는 거짓(Falsey)인지 평가한다.
JavaScript에서 값이 거짓으로 평가되는 경우는 6가지가 존재한다.</p>
<p><strong>1. false
2. undefined
3. null 
4. 0
5. &quot;&quot;(빈 문자열)
6. NaN</strong>
(<strong>Not a Number</strong>,
숫자 데이터 유형에 정의되지 않거나 표현할 수 없는 값을 
나타내는 오류값, 쉽게 말해 숫자가 아니란 의미이다.)</p>
<h2 id="3-불리언-타입-변경">3. 불리언 타입 변경</h2>
<p>JavaScript가 제공하는 Boolean() 함수를 사용한다면,
전달된 표현식을 불리언 타입으로 변경이 가능하다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/0e46578d-066b-465d-88a4-c1faf3281a36/image.png" alt="">
위 사진 외에 나머지 값은 모두 참(Truthy)으로 평가된다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/92eb0dae-6dea-4c30-9898-ba3f47758ff0/image.png" alt=""></p>
<blockquote>
<p><strong>자동 타입 변경</strong>
조건문 내부에서 평가되는 표현식은 자동으로 불리언(Boolean)
타입으로 변경이 된다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/c727a910-26eb-4d06-97c8-525f021febfa/image.png" alt=""></p>
</blockquote>
<h2 id="4-비교-연산자">4. 비교 연산자</h2>
<p>비교 연산자는 4가지 유형이 존재한다.</p>
<p><strong>1. 보다 크다(&gt;) / 크거나 같다(&gt;=)
2. 보다 작다(&lt;) / 작거나 같다(&lt;=)
3. 동일(==) / 완전히 동일(===)
4. 다름(!=) / 완전히 다름(!==)</strong></p>
<p>처음 1번과 2번의 유형은 숫자를 비교하는 데에 사용한다.</p>
<pre><code>24 &gt; 23 // True
24 &gt; 24 // False
24 &gt;= 24 // True

24 &lt; 25 // True
24 &lt; 24 // False
24 &lt;= 24 // True</code></pre><p>3번과 4번의 유형은 각 항을 비교하여 같거나, 다른 지를
평가할 때, 사용한다.</p>
<pre><code>24 === 24 // True
24 !== 24 // False</code></pre><p>여기서, 주의해야할 점이 있는데 동일(==), 완전히 동일(===)과
다름(!=), 완전히 다름(!==)은 비교에 차이가 있다.</p>
<pre><code>&#39;24&#39; === 24 // False
&#39;24&#39; == 24 // True

&#39;24&#39; !== 24 // True
&#39;24&#39; != 24 // False</code></pre><p>문자열과 숫자를 === 연산자로 비교하게 되면 거짓으로 평가된다.
그러면 의문을 가지는 점이 왜 이런 결과로 평가되는지 갖게된다.</p>
<p>차이점을 한번 살펴보도록 하자</p>
<h2 id="5-느슨한-vs-엄격한-비교">5. 느슨한 VS. 엄격한 비교</h2>
<p>JavaScript는 <strong>느슨한 타입(loosely-typed)</strong> 언어이다.
다시 말해서, 변수를 선언할 때 변수에 어떤 타입의 값이
들어가는지를 신경쓰지 않는다는 말이 된다.</p>
<p>변수에 할탕된 값의 타입이 변경이 되면 문제가 안되나?
싶겠지만, 변경되도 문제가 되지 않는다.</p>
<pre><code>let 학생 = &#39;전공 과목&#39; // String
학생 = 404 // String -&gt; Number
학생 = false // Number -&gt; Boolean</code></pre><h3 id="5-1-느슨한-비교">5-1. 느슨한 비교</h3>
<p>변수에 할당된 값의 타입은 유동적으로 변경될 수가 있다.
그래서 비교할 때도 자동으로 변경이 된다.</p>
<p>예를 들어서, 문자열 &#39;24&#39;와 숫자 24를 비교할 때
두 값의 타입은 다르다.</p>
<p>하지만, JavaScript가 타입을 자동 변환을 해서
두 수가 동일하다고 판단하게 된다. 
(모든 타입을 숫자로 자동 변환을 시도함)</p>
<p>그래서 아래와 같이 예측한 결과와 다르게 평가가 이루어진다.</p>
<pre><code>&#39;24&#39; == 24 // True ?? (&#39;24&#39; -&gt; 24)

&#39;24&#39; != 24 // False ?? (&#39;24&#39; -&gt; 24)</code></pre><p><img src="https://velog.velcdn.com/images/heosigi_0221/post/8ed63523-9e4b-476a-8a0d-feeff335a2fa/image.png" alt=""></p>
<p>불리언 값도 숫자로 자동 변환한다.
JavaScript의 불리언 값을 숫자로 변경할 경우,
true는 1을, false는 0으로 변경된다.</p>
<p>그래서 아래와 같이 예측한 결과와 다르게 평가가 이루어진다.</p>
<pre><code>0 == false // True ?? (false -&gt; 0)
1 == true // True ?? (true -&gt; 1)</code></pre><p><img src="https://velog.velcdn.com/images/heosigi_0221/post/1d31deff-9a2e-4201-a79c-76d8be9bd8a5/image.png" alt=""></p>
<h3 id="5-2-엄격한-비교">5-2. 엄격한 비교</h3>
<p>느슨한 비교와 달리, 엄격한 비교를 수행할 경우에는
JavaScript는 다음 두 가지 사항을 확인한다.</p>
<p><strong>1. 변수에 할당된 값의 타입(Type)
2. 변수 값(Value)</strong></p>
<p>===, !== 연산자를 사용하면 JavaScript가 타입을
자동 변환하지 않는다.</p>
<p>그래서 아래와 같이 우리가 기대한 평가가 이루어진다.</p>
<pre><code>&#39;24&#39; === 24 // False

&#39;24&#39; !== 24 // True</code></pre><p><img src="https://velog.velcdn.com/images/heosigi_0221/post/ab4d1058-7565-47e3-ad8a-1416dc83e9d3/image.png" alt=""></p>
<h2 id="6-else-if-문">6. else if 문</h2>
<p>조건을 하나만 사용할 때는 if...else문 만으로 사용해도 되지만,
조건이 하나가 아니라 여러 개가 있는 경우에는
if, else 외에도 else if문을 사용해 비교하여 처리할 수 있다.</p>
<p>예를 들어서 신호등의 예시로 다시 돌아가보자면
신호등 색상에 따라서 다른 처리가 필요한 상황을 보도록 하자</p>
<p>일반적으로 우리가 알고 있는 신호등 색상은,
&quot;빨강&quot;, &quot;초록&quot;,  &quot;노랑&quot;으로 이루어져 있다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/dc327d75-31b2-42b1-bb95-3df11c01993b/image.png" alt="">
위 사진처럼 신호등 색상의 조건으로 3가지 상황을
수행할 수가 있다.</p>
<ol>
<li>신호등 색상이 &quot;빨강&quot;일 때 처리</li>
<li>신호등 색상이 &quot;초록&quot;일 때 처리</li>
<li>신호등 색상이 &quot;빨강&quot;, &quot;초록&quot;이 아닐 때 처리</li>
</ol>
<p>이러한 조건 처리를 if, else, else if문을 사용하여
다음 아래와 같이 코드를 작성할 수 있게 된다.</p>
<pre><code>let lightColor = &#39;노란색&#39;

if (lightColor == &#39;빨간색&#39;) {
  console.log(&#39;신호등 앞에서 멈춰!&#39;)
} 
else if (lightColor == &#39;초록색&#39;) {
    console.log(&#39;신호등 건너!&#39;)
}
else {
  console.log(&#39;신호등을 빠르게 건너!&#39;)
}</code></pre><h2 id="7-조건부-연산자-">7. 조건부 연산자 &quot;?&quot;</h2>
<p>조건에 따라 다른 값을 변수에 할당해줘야 하는 경우도 있다.</p>
<pre><code>let accessAllowed;
let age = prompt(&#39;나이를 입력해 주세요 : &#39;, &#39;&#39;);

if (age &gt; 18) {
  accessAllowed = true;
} else {
  accessAllowed = false;
}

console.log(accessAllowed);</code></pre><p>물음표(question mark)라고 불리는 &quot;조건부 연산자&quot;를 사용하면
위와 같이 작성한 코드를 짧고 간결하게 작성 가능하다.</p>
<p>조건부 연산자는 물음표?로 표시해주면 된다.
피연산자가 3개면 조건무 연산자를 &quot;삼항 연산자&quot;라고
부르는 사람들도 있다. 참고로, JavaScript에서
피연산자를 3개나 받는 연산자는 조건부 연산자가 유일하다.</p>
<pre><code>let result = condition ? value1 : value2;</code></pre><p>다시, 그러면 위에 예시를 들은 코드를 간결하게 만들면
아래 코드와 같이 작성해도 동일하게 작동한다.</p>
<pre><code>let accessAllowed = age &gt; 18 ? true : false;</code></pre><h3 id="71-다중-">7.1 다중 &#39;?&#39;</h3>
<p>여러 개 조건이 존재한다면 다중으로 else if를 쓸 수 있는데,
물음표 연산자도 혹시 될까? 라고 한다면
물음표 연산자도 여러 개로 연결해서 사용 가능하다.</p>
<pre><code>let age = prompt(&#39;나이를 입력해주세요.&#39;, 18);

let message = (age &lt; 3) ? &#39;안녕 아기야🐥&#39; :
  (age &lt; 18) ? &#39;안녕!🖐️&#39; :
  (age &lt; 100) ? &#39;환영합니다!😎&#39; :
  &#39;나이가 아주 많으시거나, 나이가 아닌 값을 입력 하셨군요!👀&#39;;

console.log( message );</code></pre><p>만약 위 코드를 if...else문으로 작성해본다면,</p>
<pre><code>if (age &lt; 3) {
  message = &#39;안녕 아기야🐥&#39;;
} else if (age &lt; 18) {
  message = &#39;안녕!🖐️&#39;;
} else if (age &lt; 100) {
  message = &#39;환영합니다!😎&#39;;
} else {
  message = &#39;나이가 아주 많으시거나, 나이가 아닌 값을 입력 하셨군요!👀&#39;;
}</code></pre><h3 id="72-부적절한-">7.2 부적절한 &#39;?&#39;</h3>
<p>if문을 사용할 때보다 코드길이를 줄일 수 있기 때문에,
물음표?를 if문 대용으로 쓰는게 매력적으로 느낄 수가 있다.
하지만 코드를 아래처럼 사용한다면, 가독성이 떨어질 수 있다.</p>
<pre><code>let company = prompt(&#39;자바스크립트는 어떤 회사가 만들었을까요?&#39;, &#39;&#39;);
(company == &#39;Netscape&#39;) ?
   console.log(&#39;정답입니다!✅&#39;) : console.log(&#39;오답입니다!❌&#39;);</code></pre><p>아래는 if를 사용하여 변형한 코드이다. 
어떤 코드가 더 가독성이 좋은지 비교해보면 좋다.</p>
<pre><code>let company = prompt(&#39;자바스크립트는 어떤 회사가 만들었을까요?&#39;, &#39;&#39;);

if (company == &#39;Netscape&#39;) {
  console.log(&#39;정답입니다!✅&#39;);
} else {
  console.log(&#39;오답입니다!❌&#39;);
}</code></pre><p>코드를 읽을 때 우리의 눈은 수직으로 움직인다.
수평으로 길게 늘어진 코드보단 여러 줄로 나뉘어서
작성된 코드 블록이 더 읽기 쉽다.</p>
<p>물음표 연산자&#39;?&#39;는 조건에 따라 반환 값을 달리하려는
목적으로 만들어졌다. </p>
<p>이러한 목적에 부합하는 곳에 물음표 연산자를 사용하면 된다.
여러 분기로 만들어 처리해야 할 때는 if문을 사용한다.</p>
<h3 id="출처">출처</h3>
<p>야무쌤 자바스크립트 강의</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[객체?]]></title>
            <link>https://velog.io/@heosigi_0221/%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@heosigi_0221/%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Tue, 18 Nov 2025 13:39:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/96a09f8f-1908-4ac1-b11a-16dd3a347011/image.png" alt="">
객체(object)는 JavaScript에서 매우 중요하다고 볼 수 있는 타입이다.
<strong>자바스크립트를 이루고 있는 거의 모든 것이 객체</strong>이다.</p>
<p>변수에 기억할 수 있는 데이터 타입은 <strong>기본(원시)타입</strong>, <strong>객체 타입</strong> 두 가지뿐이다.</p>
<h2 id="1-원시-기본타입">1. 원시, 기본타입?</h2>
<p><strong>원시 타입(primitive type)</strong> :  변경 불가능한 값(immutable value)
<strong>객체 타입(object / reference type)</strong> : 변경 가능한 값(mutable value)</p>
<p>원시 값을 변수에 할당하면 변수에는 <strong>실제 값이 저장</strong>된다.
객체를 변수에 할당하면 변수에는 <strong>참조 값이 저장</strong>된다.</p>
<p>여기서 변수는, 확보된 메모리 공간이다.</p>
<p>원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원본 값이 복사되어 전달된다.
이를 <strong>값에 의한 전달(pass of value)</strong>라고 한다.</p>
<p>객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다.
이를 <strong>참조에 의한 전달(reference of value)</strong>라고 한다.</p>
<h2 id="2-객체는-무엇인가">2. 객체는 무엇인가?</h2>
<p><strong>키(Key)와 값(Value)의 쌍을 포함하는 데이터</strong>라고 부른다.</p>
<p>중괄호( { } )안에 키-값을 쌍으로 작성하여 객체 생성할 수 있다.
중괄호 안에는 &#39;키key&#39;와 &#39;값(value)&#39;를 쌍으로 구성된,
프로퍼티(property)를 여러 개 넣을 수 있는데,
여러 키-값 쌍을 넣고 싶다면 각 쌍을 쉼표(,)로 구분해야 한다.
<strong>키(Key) = 문자형</strong>,
<strong>값(Value) = 모든 자료형 허용</strong></p>
<pre><code>let user = {     // 객체
  name: &quot;John&quot;,  // 키: &quot;name&quot;,  값: &quot;John&quot;
  age: 30        // 키: &quot;age&quot;, 값: 30
};</code></pre><p>객체 user에는 프로퍼티가 두 개 있다..</p>
<ol>
<li><strong>첫 번째 프로퍼티</strong> – &quot;name&quot;(이름)과 &quot;John&quot;(값)</li>
<li><strong>두 번째 프로퍼티</strong> – &quot;age&quot;(이름)과 30(값)</li>
</ol>
<p>프로퍼티 키는 <strong>&#39;프로퍼티 이름&#39;</strong>이라고도 불린다.
쉽게 말하면 <strong>객체의 키(Key) = 속성(property)</strong>라고 불린다.</p>
<p>서랍장을 생각하면 편하다.
서랍장 안에 파일은 프로퍼티, 파일 각각 붙어있는
이름표는 객체의 키 라고 생각하면 된다. 
복잡한 서랍장 안에서, 이름표를 보고 원하는 파일을
쉽게 찾아서 볼 수 있듯이, 객체에서는 키를 이용하여 
프로퍼티를 쉽게 찾을 수가 있다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/b498ff23-b65e-43de-9948-2f99bef0c9ed/image.png" alt=""></p>
<p>빈 객체(빈 서랍장)를 만드는 방법은 두 가지가 있다.</p>
<pre><code>1. let user = new Object(); // &#39;객체 생성자&#39; 문법
2. let user = {}; // &#39;객체 리터럴&#39; 문법</code></pre><h2 id="3-객체-속성-값-읽기">3. 객체 속성 값 읽기</h2>
<p>객체의 키(Key)는 &#39;<strong>속성(property)</strong>&#39;이라 불린다고 위에 알려준 바 있다.</p>
<table>
<thead>
<tr>
<th align="center">JavaScript 속성(Property)</th>
<th align="center">HTML 속성(attribute)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">JavaScript 객체로 존재</td>
<td align="center">HTML 태그 안에 정의</td>
</tr>
<tr>
<td align="center">브라우저에서 실시간으로 변화 가능</td>
<td align="center">HTML 코드에 선언된 고정된 값</td>
</tr>
<tr>
<td align="center">화면과 작동에 영향을 미침</td>
<td align="center">HTML 자체 변경에 영향을 미침</td>
</tr>
<tr>
<td align="center">동기화 이후 개별적으로 작동됌</td>
<td align="center">초기에만 JS 속성과 동기화됌</td>
</tr>
</tbody></table>
<p>속성 값을 가져오는 방법은 두 가지 메서드를 사용해볼 수 있다.</p>
<h3 id="3-1-점-표기법dot-notation">3-1 점 표기법(dot notation)</h3>
<p>점(.) 표기법을 이용하여 사용한다.</p>
<pre><code>const 속성_값 = 객체.속성_이름</code></pre><p>점 표기법(dot notation)을 이용하면 프로퍼티 값을 읽는 것도 가능하다.</p>
<pre><code>// 프로퍼티 값 얻기
1. alert( user.name ); // John
2. alert( user.age ); // 30</code></pre><p>일반적으로는 점 표기법을 사용한다.
점 표기법이 적합하지 않은 특별한 경우에만 대괄호 표기법을 사용한다.
아래는 특별한 경우를 작성한 내용이다.
<strong>1. 속성 이름이 따옴표로 묶인 경우
2. 변수로 속성을 읽어야 할 경우</strong></p>
<p>객체의 study 속성 값을 가져오려면 아래와 같이 작성해야 한다.</p>
<pre><code>const study = user.study
console.log(study) // &#39;자바스크립트 공부&#39;</code></pre><h3 id="3-2-대괄호-표기법---">3-2 대괄호 표기법( [ ] )</h3>
<p>객체의 속성 이름을 문자열로 쓰고 대괄호 ( [ ] )로 묶어서 사용한다.</p>
<pre><code>const study = user[&#39;study&#39;]
console.log(study) // &#39;자바스크립트 공부&#39;</code></pre><p>마지막 프로퍼티 끝은 쉼표로 끝날 수 있다.</p>
<pre><code>let user = {
  name: &quot;John&quot;,
  age: 30,
}</code></pre><p>위와 같은 쉼표를 &#39;trailing(길게 늘어지는)&#39; 또는 &#39;hanging(매달리는)&#39; 쉼표라 불린다.
이렇게 끝에 쉼표를 붙이면 모든 프로퍼티가 유사한 형태를 보이기 때문에,
프로퍼티를 추가, 삭제, 이동하는게 쉬워진다.</p>
<h2 id="4-객체-속성-삭제">4. 객체 속성 삭제</h2>
<p>&#39;delete&#39; 키워드를 사용하여 키-값 쌍을 삭제할 수 있다.
삭제하려면 &#39;delete&#39;를 쓰고, 그 뒤에 점이나 대괄호로 속성을 지정한다.</p>
<pre><code>delete 객체.속성_이름
delete 객체[&#39;속성 이름&#39;]</code></pre><blockquote>
<p><strong>const(상수) 객체는 수정될 수 있다?</strong>
const user = {
    name : &quot;John&quot;<br>};
user.name = &quot;Shawn&quot;; ✅
console.log(user.name) // Shawn
위와 같이 작성된다고 하면 ✅로 표시한 줄에서 오류가 발생할 것
이라고 생각하겠지만, 그렇지 않다. 
const는 user=...를 전체적으로 설정하려고 할 때만 오류를 발생한다.</p>
</blockquote>
<h2 id="5-객체의-메서드">5. 객체의 메서드</h2>
<p>객체의 JavaScript의 모든 데이터 타입을 속성으로 포함할 수 있다.
함수 또한 포함이 가능하다.</p>
<p>전에 설명하였듯이, 함수를 값으로 쓰일 수 있으므로
포함하는 속성을 &quot;메서드(Method)&quot;라고 불린다.</p>
<pre><code>const user = {
  getStudy: function() {
      // user의 메서드(함수)
  }  
}</code></pre><p>객체의 속성인 메서드는 함수 타입이므로 함수처럼 사용(호출)이 가능하다.</p>
<pre><code>// 1. 점 표기법
user.getStudy()

// 2. 대괄호 표기법
user[&#39;getStudy&#39;]()</code></pre><h2 id="6-함수의-타입">6. 함수의 타입</h2>
<p>앞서 배운 함수(Function) 또한 객체 타입(Object type)이다.
JavaScript 함수는 객체 타입이므로, 객체처럼 속성을 가질 수 있다.</p>
<pre><code>// 함수 선언
function cache() {}

// 함수 객체의 속성 설정
cache.data = &#39;캐싱 데이터&#39;

console.log(cache.data) // &#39;캐싱 데이터&#39;</code></pre><h3 id="🚨-함수는-값으로-취급">🚨 함수는 값으로 취급!</h3>
<p>전에 일급 함수에 대해 간단하게 설명했는데,
여기서 자세하게 다뤄보도록 하겠다.</p>
<p>간혹 <strong>일급 객체 또는 고차 함수</strong>라는 표현을 들어본 적이 있을 수 있다.</p>
<blockquote>
<p><strong>어려운 용어를 사용하는 심리?</strong>
사람은 실제보다 더 놀랍게 보이도록 만들고, 어렵고 이해하기
쉽지 않은 용어를 사용하는 걸 좋아한다.</p>
</blockquote>
<ul>
<li>어려운 용어를 사용하면 전문적으로 보인다.</li>
<li>&quot;여기에 나는 분야가 뛰어나&quot; 라는 무의식적 메시지를 전달하는 경우가 있다.</li>
<li>특정 집단(ex: 개발자, 디자인 등)에서 전문 용어로 쓰는 것은
소속감을 보여주는 방법이다.</li>
</ul>
<p>하지만 이러한 두 표현(일급, 고차)가 &#39;<strong>JavaScript 함수는 값으로 취급</strong>&#39;
된다는 의미를 말하는 용어들이다.</p>
<h3 id="6-1-인수로-함수-전달-가능">6-1 인수로 함수 전달 가능</h3>
<p><strong>함수는 값으로 취급</strong>되므로,
<strong>다른 함수에 인수(argument)</strong>로 전달될 수 있다.</p>
<pre><code>greeting(sayHello, &#39;🌈 자바스크립트&#39;) // &#39;안녕! 자바스크립트&#39;

function sayHello() {
  return &#39;안녕! &#39;
}

function greeting(helloMessage, name) {
  console.log(helloMessage() + name)
}</code></pre><h3 id="6-2-함수에서-함수를-반환">6-2 함수에서 함수를 반환</h3>
<p>JavaScript에서 <strong>함수는 값으로 취급</strong>되므로,
<strong>함수에서 함수를 반환</strong>할 수도 있다.</p>
<pre><code>const greeting = sayHello()
greenting(&#39;🌈 자바스크립트&#39;) // &#39;안녕! 🌈 자바스크립트&#39;

function sayHello() {
  return (name) =&gt; {
    console.log(&#39;안녕! &#39; + name)
  }
}</code></pre><blockquote>
<p><strong>일급 객체(함수), 고차함수</strong>
프로그래밍 언어에서 <strong>함수가 다른 값처럼 취급</strong>될 때 &quot;<strong>일급 함수</strong>&quot;를 가진다 말한다.
일급 함수를 가진 언어에서 함수는 다른 함수에 인수로 전달될 수 있고, 
값으로 반환도 가능하다. 뿐만 아니라, 변수에 값으로 할당될 수도 있다. 
이처럼 함수를 반환하거나, <strong>함수를 인수로 사용하는 함수</strong>를 &quot;<strong>고차 함수</strong>&quot;라고 한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[화살표 함수 표현식?]]></title>
            <link>https://velog.io/@heosigi_0221/%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9D</link>
            <guid>https://velog.io/@heosigi_0221/%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9D</guid>
            <pubDate>Wed, 12 Nov 2025 14:35:11 GMT</pubDate>
            <description><![CDATA[<p>전에 배운 함수 파트에서 설명을 할려고 했지만, 
내용이 많이 길어져서 나누게 되었다.</p>
<p>화살표 함수에 대해서 알아보도록 하자</p>
<h2 id="1-화살표-함수">1. 화살표 함수?</h2>
<p>ES6에서 도입된 화살표 함수는, function 키워드 대신에
화살표(fat arrow, =&gt;)를 사용해 좀 더 간략한 방법으로
함수를 선언을 할 수가 있다. </p>
<p>함수 코드를 더 짧고 깔끔하게 만들고,
구조가 단순해서 실수를 할 여지를 줄일 수 있다.</p>
<p>그래서 화살표 함수 표현식이 인기가 많다.</p>
<pre><code>const 화살표_함수_표현식 = (매개변수1, 매개변수2) =&gt; { 
    // ...
}</code></pre><p>위 함수에서 봤듯이 화살표 함수는 뚱뚱한 화살표 모양을 사용한다.</p>
<p>처음엔 화살표 함수 표현식이 어렵게 느껴질 수도 있다. 하지만,
전에 말한 함수 파트에서 말했듯이 화살표 함수 또한 표현식일 뿐이다.</p>
<p>함수 표현식과 화살표 함수 표현식을 더 보자면 이해하기 쉬울 것이다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/3f411450-9de9-49ac-8e9f-b2a9303e1e81/image.png" alt=""></p>
<pre><code>// 함수 표현식
const sum = function(x, y) {
    return x + y
}

// 화살표 함수 표현식
const add = (x, y) =&gt; {
    return x + y
}</code></pre><p>함수 표현식을 화살표 함수 표현식로 변환할 때 차이점이 있다.</p>
<ol>
<li>function 키워드 제거</li>
<li>함수의 (), {} 사이에 =&gt; 추가</li>
</ol>
<h2 id="2-화살표-함수-요인">2. 화살표 함수 요인</h2>
<p>화살표 함수 표현식에 구문은 두 가지의 요인으로 인해 달라질 수 있다.</p>
<ol>
<li>매개변수 개수</li>
<li>암묵적 반환</li>
</ol>
<h3 id="요인1-매개변수-개수">요인1. 매개변수 개수</h3>
<h4 id="매개변수-없음">매개변수 없음</h4>
<p>화살표 함수 표현식에 매개변수가 없을 경우, 
소괄호(())를 밑줄(_)로 변경할 수 있다.</p>
<pre><code>const 매개변수_없음 = () =&gt; {
  // ...
}

const 매개변수가_없지만_밑줄로_표현 = _ =&gt; {
  // ...
}</code></pre><p>여기서 밑줄(_)은 유효한 &quot;매개변수 이름&quot;일 뿐이지,
암묵적으로는 아무 값도 받지 않음을 나타낸다.</p>
<h4 id="매개변수-1개">매개변수 1개</h4>
<p>화살표 함수 표현식의 매개변수가 한 개인 경우, 
( (소괄호) )를 생략할 수 있다.</p>
<pre><code>const 매개변수_1개_괄호_포함 = (매개변수1) =&gt; {
  // ...
}

const 매개변수_1개_괄호_생략 = 매개변수1 =&gt; {
  // ...
}</code></pre><h4 id="매개변수-2개-이상">매개변수 2개 이상</h4>
<p>( (소괄호) )를 생략할 수 없다.</p>
<pre><code>const 매개변수_2개_이상_괄호_반드시_포함 = (매개변수1, 매개변수2) =&gt; {
  // ...
}</code></pre><h3 id="요인2-암묵적-반환">요인2. 암묵적 반환</h3>
<p>화살표 함수 표현식은 아래 조건 2가지가 충족될 때,
자동으로 반환문을 생성한다.</p>
<ol>
<li>함수에 한 줄의 코드만 작성한다.</li>
<li>해당 코드 줄을 중괄호( { } )로 묶지 않는다.</li>
</ol>
<p>암묵적으로 반환 기능을 사용하면,
세 줄의 코드를 단 한 줄로 줄일 수가 있다.</p>
<pre><code>const add = function(x, y) {
  return x + y
}</code></pre><pre><code>const add = (x, y) =&gt; x + y</code></pre><blockquote>
<p><strong>화살표 함수 VS. 일반 함수?</strong>
화살표 함수는 등장 이후에 큰 인기를 많이 얻었다.
그러나 그 열풍은 오늘날에 다소 사그라 들었는데,
현재 화살표 함수 표현식과 일반 함수 표현식을 사용하는 방법에 대해
간단한 기준은 아래와 같다.</p>
</blockquote>
<ul>
<li>함수를 선언할 때 -&gt; 함수 선언 사용</li>
<li>익명 함수가 필요한 경우 -&gt; 화살표 함수 표현식 사용
익명함수가 유용하게 사용되는 경우는 &quot;콜백(callback)&quot;이다.
익명함수에 대해서는 추후에 조금씩 배워나갈 것이다.</li>
</ul>
<h2 id="결론">결론</h2>
<ul>
<li>function 키워드 대신에, =&gt; 사용</li>
<li>매개변수의 개수에 따라 소괄호가 생략 또는 필수이다.</li>
<li>중괄호( { } )가 없을 땐, 자동으로 값이 반환(암묵적 반환)</li>
<li>객체 반환 시, ( { } ) 괄호로 감싸기</li>
<li>함수 선언 또는 화살표 함수 표현식은 방법에 따라 사용한다.
(함수 선언 -&gt; 일반함수 / 익명함수(콜백) -&gt; 화살표 함수)</li>
</ul>
<p>화살표 함수는 본문이 한 줄인 함수를 작성할 때 유용하다.
본문이 한 줄이 아니라면, 다른 방법으로 화살표 함수를 작성해야 한다.</p>
<ol>
<li><strong>중괄호 없이 작성</strong> :<strong>(...args) =&gt; expression</strong> - 화상표 오른쪽에 표현식을 둔다.
함수는 이 표현식을 평가하고, 평가 결과를 반환한다.</li>
<li><strong>중괄호와 함께 작성</strong>: <strong>(...args) =&gt; { body }</strong> - 본문이 여러 줄로 구성되었다면,
중괄호를 사용해야 한다. 다만 이 경우는 반드시 <strong>return</strong> 지시자를 사용해 
반환값을 명기해줘야 한다.</li>
</ol>
<h3 id="출처">출처</h3>
<p>야무쌤 자바스크립트 강의
<a href="https://poiemaweb.com/es6-arrow-function">모던자바스크립트 - 화살표 함수</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[함수?]]></title>
            <link>https://velog.io/@heosigi_0221/%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@heosigi_0221/%ED%95%A8%EC%88%98</guid>
            <pubDate>Sat, 08 Nov 2025 12:35:44 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트하면, 함수(function)가 빠질 수 없는 부분이다.
가장 중요한 핵심 개념이다.</p>
<h2 id="1-함수function">1. 함수(Function)</h2>
<p>중학교 때 처음 들어봤을 것이다.
함수의 정의는 두 집합 또는 변수의 관계를 성립하는 개념을 <strong>함수(function = 기능)</strong>라고 말한다.</p>
<p>그리고, <strong>&quot;어떤 입력 값이 주어지면 결과를 내는 상자&quot;</strong>라고 말할 수 있다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/86abda06-f081-4a99-8686-c2ed26bc144d/image.gif" alt=""></p>
<p>함수를 왜 사용해? 라고 물어본다면,
이는 <strong>코드의 재사용성</strong>이라는 측면에서 매우 유용하기 때문이다.</p>
<p>동일한 작업을 반복적으로 수행을 해야한다면, 
같은 코드를 굳이 여러 번 작성하는 것이 아니라
<strong>정의된 함수를 재사용하는 것</strong>이 효율적이다.</p>
<p>수학에서 말하는 함수는, 입력(Input)을 받아서 출력(Output)을 내보내는
일련의 과정을 정의한 것이다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/c35de36a-1184-4f53-bdb1-d38f8ab0d5ef/image.png" alt=""></p>
<p>예시를 들자면, f(x, y) = x + y라는 함수를 정의하고 이 함수에
두 개의 입력 2, 5를 전달을 하면 함수는 정의된 일련의 과정,
즉 x + y를 실행하여 7을 출력하게 된다.</p>
<p>이처럼 함수는 마치 재료를 투입받아 제품을 생산하는 기계와
같다고 말할 수 있다.</p>
<h2 id="2-함수-구문">2. 함수 구문</h2>
<p>JavaScript 함수는 다음 구문으로 정의한다.</p>
<pre><code>function 함수이름(매개변수) {
    // 함수 내부에 코드 작성
}</code></pre><p>function 키워드는 JavaScript 엔진에 함수를 선언한다는 것을 알려준다.
함수 이름은 사용자가 임의로 정의할 수 있고, 
의미있는 이름을 작성하는 것이 좋다.</p>
<blockquote>
<p><strong>함수 이름 규칙?</strong>
함수 이름 작성 규칙은 이름 작성 규칙과 유사하다.</p>
</blockquote>
<ol>
<li>한 단어로 구성되어야 하고, 공백은 허용하지 않는다.</li>
<li>알파벳(a-z, A-Z), 숫자(0-9), 특수문자(_,$) 조합으로 구성된다.</li>
<li>변수와 마찬가지로, 숫자로 시작하는 함수 이름은 허용되지 않는다.</li>
<li>예약 키워드를 사용할 수 없다.</li>
</ol>
<h2 id="3-매개변수">3. 매개변수</h2>
<p>매개변수(Parameters)는 선택 사항이다.
매개변수는 함수에 선언할 변수를 쉼표(,)로 구분하여 나열한 것이다.
매개변수는 함수를 사용할 때 값을 지정할 수 있다.</p>
<h2 id="4-함수-사용">4. 함수 사용</h2>
<p>함수를 선언한 후에 함수 이름 뒤에 소괄호( () )를 붙여서
함수를 사용(호출 또는 선언)할 수 있다.</p>
<pre><code>// 함수 선언
function sayHello() {
    console.log(&#39;안녕! JavaScript&#39;)
}

// 함수 사용
seyHello() // `안녕! JavaScript&#39;</code></pre><h2 id="5-반환문">5. 반환문</h2>
<p>함수는 return 키워드를 사용해 <strong>&quot;반환문(return statement)&quot;</strong>을
설정할 수 있다.</p>
<pre><code>function 함수이름(매개변수) {
    return 반환값
}</code></pre><p>JavaScript 엔진은 함수가 사용될 때 return 키워드를 확인하면
실행을 중단하고 값을 반환한다.</p>
<pre><code>function add(x, y) {
// 함수를 사용하면 반환되는 값
return x + y
// 이 코드는 무시된다
console.log(&#39;x + y = &#39;, x + y)
}

add(9, 11) // 20</code></pre><p>생성된 함수를 호출하기 위해 함수 이름과 동일한 이름의
식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당한다.</p>
<p>함수 선언문을 의사 코드로 표현하면 다음과 같다.</p>
<pre><code>let add = function(x, y) {
    return x + y
}

console.log(add(2, 5)) // 7</code></pre><p>함수는 함수 이름으로 호출하는 것이 아니라,
<strong>함수 객체를 가르키는 식별자로 호출</strong>한다.</p>
<blockquote>
<p><strong>함수의 암묵적 반환 값?</strong>
명시적으로 return을 사용해 값을 반환하지 않으면, 
undefined가 암묵적으로 반환된다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/1c9d9f74-2297-4d02-8a77-2af0921fdb36/image.png" alt=""></p>
</blockquote>
<h3 id="5-1-함수-정의">5-1. 함수 정의</h3>
<p>함수 정의란 함수를 호출하기 이전에 인수를 전달받을 매개변수와 실행할 문들,
그리고 반환할 값을 지정하는 것을 말한다.
그 중, 4가지 함수 정의 방식이 있다.</p>
<pre><code>1. 함수 선언문
function add(x, y) {
    return x + y;
} 

2. 함수 표현식(익명 또는 무명함수)
let add = function(x, y) {
    return x + y
}

3. Function 생성 함수 
let add = new Function(&#39;x&#39;, &#39;y&#39;, &#39;return x+y&#39;)

4. 화살표 함수(ES6)
let add(x, y) =&gt; x + y;</code></pre><h2 id="6-매개변수와-인수">6. 매개변수와 인수</h2>
<p>함수는 매개변수를 받을 수 있는데, 
매개변수란 <strong>&quot;함수에 선언하려는 변수&quot;</strong>를 말한다.</p>
<p>각 매개변수는 쉼표(,)로 구분해야 한다.</p>
<pre><code>function 함수이름(매개변수1, 매개변수2) {
    // 함수 내부에 코드 작성
}</code></pre><p>매개변수는 함수 내부에서 사용될 수 있다.
<strong>(매개변수 = 함수 내부의 지역 변수)</strong></p>
<pre><code>function 함수이름(매개변수1, 매개변수2) {
    console.log(&#39;첫번째 매개변수 값 = &#39;, 매개변수1)
    console.log(&#39;두번째 매개변수 값 = &#39;, 매개변수2)
}</code></pre><p>매개변수는 사용하기 전에 값을 지정해야 한다.
따라서, 함수를 사용할 때 <strong>인수(arguments)</strong>라고 불리는 값을 전달할 수 있다.</p>
<pre><code>함수이름(&#39;값1&#39;,&#39;값2&#39;)</code></pre><p>전달된 각 인수는 함수의 매개변수 순서에 맞춰 값이 할당된다.</p>
<pre><code>function 함수이름(매개변수1, 매개변수2) {
    console.log(&#39;첫번째 매개변수 값 = &#39;, 매개변수1)
    console.log(&#39;두번째 매개변수 값 = &#39;, 매개변수2)
}

&gt; 함수이름(&#39;값1&#39;,&#39;값2&#39;)
// 첫번째 매개변수 값 = 값1
// 두번째 매개변수 값 = 값2</code></pre><h2 id="7-표현식">7. 표현식</h2>
<p>JavaScript에서 표현식(expression)은 전달되기 전에
평가되어야 하는 값으로 정의된다.</p>
<pre><code>12 + 9
add(92, 73)</code></pre><p>예시를 들자면,</p>
<pre><code>function sum(num1, num2) {
    return num1 + num2
}

const result = sum(5, 10)
console.log(result) // 15</code></pre><p>숫자를 함수에 전달하면 즉시 사용할 수 있다.</p>
<p>표현식(ex: 21 + 13)을 전달할 때,
<strong>해당 표현식은 함수에 전달되기 전에 먼저 평가</strong>된다.</p>
<pre><code>const result = sum(21 + 11, 10)
console.log(result)

// JavaScript 엔진 내부 처리 과정
// [단계 1] 표현식 평가 21 + 11 - 결과 값: 32
// [단계 2] sum(32, 10) 함수 호출 - 결과 값: 42</code></pre><p>함수를 호출해 반환 값을 다른 함수에 전달하는 경우, 
값을 사용하기 전에 먼저 함수를 평가된다.</p>
<pre><code>function multiply(num1, num2) {
  return num1 * num2
}

const result = sum(multiply(21, 11), 10)
console.log(result)

// JavaScript 엔진 내부 처리 과정
// [단계 1] multiply(21, 11) 함수 호출 - 결과 값: 231
// [단계 2] sum(231, 10) 함수 호출 - 결과 값: 241</code></pre><blockquote>
<p><strong>일급객체가 무슨 말이야?</strong>
자바스크립트 함수를 배우다 보면, 
일급 객체라는 말이 매우 생소해서 무슨 말인지 
이해가 안될 수 있는데, 아래를 보면 조금이나마 
이해가 될 수 있다.
<em>1. 자바스크립트는 함수를 값처럼 변수에 
할당할 수 있다.</em>
<em>2. 프로퍼티(속성)값이 될 수도 있고 배열의 
요소가 될 수 있다.</em>
이처럼 값의 성질을 갖는 객체를 <strong>&quot;일급 객체&quot;</strong>라 불린다.
쉽게 말해서, 함수가 일급 객체라 함은 
<strong>함수를 값처럼 자유롭게 사용할 수 있다는 의미</strong>로 
불리는 것이다.</p>
</blockquote>
<h2 id="8-호이스팅">8. 호이스팅</h2>
<p>function 키워드를 사용해 함수를 선언하면
현재 코드 영역(Scope)의 맨 위로 끌어올려진다.</p>
<p>이와 같은 현상을 <strong>&quot;호이스팅(Hoisting)&quot;</strong>이라 불린다.</p>
<p>영역(또는 범위)에 대해 추후 설명을 할 예정이다.
여기서 호이스팅의 단순화를 위해서,
<strong>&quot;모든 함수 선언을 파일 맨 위로 옮긴다&quot;</strong>라고
의미로 이해해도 좋다.</p>
<p>사용자가 작성한 코드</p>
<pre><code>sayHello()

function sayHello() {
  console.log(&#39;안녕! JavaScrpit&#39;)
}</code></pre><p>JavaScript 엔진에서 처리된 코드</p>
<pre><code>// JavaScript 엔진이 코드를 처리할 때,
// 함수 선언은 파일 맨 위로 끌어올려집니다.
function sayHello() {
  console.log(&#39;안녕! JavaScrpit&#39;)
}

sayHello()</code></pre><blockquote>
<p><strong>JavaScript 코드 실행흐름의 이해</strong>
일반적으로 코드는 위-&gt;아래 방향으로 읽으며 실행된다.
하지만, JavaScript 엔진은 선언된 함수를 코드 맨 위로
끌어올려서 컴퓨터의 메모리에 먼저 기억을 해둔다.</p>
</blockquote>
<p>함수 호이스팅은 JavaScript 엔진에서 작성된 코드 순서를
바꾸므로, 처음에 하게 되면 혼란스러울 수 있다.</p>
<p>하지만, 이러한 함수 호이스팅은 매우 유용하고
코드를 더 읽기 쉽게 만들어준다.</p>
<p>함수들을 파일 맨 아래 몰아놔도 문제가 없이
작동하기 때문이다. 코드가 읽기 쉬워지는 이유는
코드를 작성할 때, 중요한 흐름을 위해 깔끔하게 작성하고
처리를 위한 함수 선언은 파일 끝에 모아둘 수 있기에
읽기 쉽고 깔끔해진다.</p>
<pre><code>// 코드 흐름 먼저 작성
startGame()
movePlayer()
endGame()

// ...

// 함수들은 파일 맨 끝에 배치
function startGame() { 
    // ...
}

function movePlayer() {
    // ...
}

function endGame() {
  // ...
}</code></pre><p>위 코드는 JavaScript 엔진에서 호이스팅하여 코드를 아래와 같이 변경한 후 처리한다.</p>
<pre><code>// JavaScript 엔진에 의해 함수 선언이 끌어올려집니다.
function startGame() { 
    // ...
}

function movePlayer() {
    // ...
}

function endGame() {
  // ...
}

startGame()
movePlayer()
endGame()</code></pre><blockquote>
<p><strong>컴퓨터 CPU와 Memory</strong>
CPU와 메모리는 컴퓨터 관련하면 자주 나오는 용어이다.
입력 장치가 2진 데이터를 CPU에 보내게 되면,
CPU는 해당 데이터를 즉시 메모리에 저장하게 되어서
저장해서 처리하기 쉽게 만들어준다.
ex: 2+4 결과 요청 -&gt; 2와 4를 각각 2진수로 변환 후,
0010, 0100 이라는 2진 데이터로 변경되어 처리되고,
CPU는 해당 데이터를 메모리에 저장한다.
쉽게 말해, CPU는 두뇌 담당 = 계산 및 명령 처리하고, 
메모리는 기억 담당 = 데이터와 명령어를 기억한다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/a82c8ac0-58f8-4c6f-886e-41ac8b53822d/image.png" alt=""></p>
</blockquote>
<p>여기서 호이스팅의 주의점을 말해보자면,
함수 표현식은 함수 선언과 달리, 호이스팅이 되지 않으므로,
각별히 주의를 해야 한다.</p>
<pre><code>sayHello()

// ⚠️ 함수 표현식은 파일 맨위로 끌어 올려지지 않는다.
const sayHello = function() {
  console.log(&#39;안녕! JavaScrpit&#39;)
}</code></pre><p><img src="https://velog.velcdn.com/images/heosigi_0221/post/5eff9761-7361-4c28-9c12-a3b708e76f10/image.png" alt=""></p>
<p>이러한 특징은 나중에 배울 예정인,
<strong>&quot;화살표(Arrow) 함수&quot;</strong>에서도 동일하므로
중요한 개념이다. 
다음에 다시 자세히 알아볼 예정이다.</p>
<h3 id="출처">출처</h3>
<p>야무쌤 자바스크립트 강의
<a href="https://poiemaweb.com/js-function">poiemaweb - 함수</a>
<a href="https://ko.javascript.info/function-basics">javascript.info - funtcion</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[변수?]]></title>
            <link>https://velog.io/@heosigi_0221/%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@heosigi_0221/%EB%B3%80%EC%88%98</guid>
            <pubDate>Sat, 08 Nov 2025 12:26:20 GMT</pubDate>
            <description><![CDATA[<h1 id="1-변수variables란">1. 변수(Variables)란?</h1>
<p>애플리케이션은 데이터를 다룬다.
아무리 복잡한 애플리케이션이라 해도, 데이터를 입력(Input)을 받아 처리하고, 그 결과를 출력(Output)하는 것이 전부이다. </p>
<p>변수는 프로그래밍 언어에서 데이터를 관리하기 위한 핵심 개념이다.</p>
<p>예시로 아래와 같이 자바스크립트 코드가 있다면,</p>
<pre><code>10 + 20</code></pre><p><strong>사람</strong>은 위 식을 계산한다고 하면, </p>
<ol>
<li>10, 20, + 기호를 일단 알아야 하고 식의 의미 또한 해석 
할 수 있어야 한다.</li>
<li>10과 20을 + 기호의 덧셈을 하기 위해 두뇌에 기억한다.
그리고 10과 20을 더한 결과인 30도 기억한다.</li>
</ol>
<p><strong>컴퓨터</strong>에서 위 식을 계산한다고 하면,</p>
<ol>
<li>자바스크립트를 해석하고 실행하는 자바스크립트 엔진도
사람과 유사하게 위 자바스크립트 코드를 실행한다.</li>
<li>코드를 계산(또는 평가)하려면 먼저 10, 20, +라는 
기호(리터럴과 연산자)의 의미를 알고 있어야 한다.</li>
<li>10 + 20 이라는 식(표현식)의 이미도 해석(파싱)할 수 있어야 한다.</li>
</ol>
<p>자바스크립트 엔진이 10+20 이라는 식의 의미를 해석하려면 
+연산을 수행하기 하기 전, 좌변과 우변의 숫자 값,
즉 <strong>피연산자(operand)를 기억</strong>한다. 
<img src="https://velog.velcdn.com/images/heosigi_0221/post/0277e106-5e13-473b-ac42-549f88f176c8/image.png" alt=""></p>
<p><strong>사람</strong>은 계산과 기억 모두 두뇌에서 하지만 컴퓨터는 연산과 기억을
수행하는 부품이 나뉘어져 있다.</p>
<p><strong>컴퓨터</strong>는 CPU를 사용해서 연산하고, 메모리를 사용해서 데이터를 기억한다.</p>
<blockquote>
<p><strong>메모리가 무엇이길래?</strong>
메모리는(Memory)는 데이터를 저장할 수 있는 셀(Memoru Cell)의 집합체이다.
메모리 셀 하나의 크기 = 1Byte(8Bit)이다. 컴퓨터는 메모리 셀의 크기,
즉 1바이트 단위로 데이터를 저장하거나 읽어들인다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/9604754e-3986-4372-adfe-9394f409d31d/image.png" alt=""></p>
</blockquote>
<p>각 셀은, 고유의 메모리 주소(Memory Address)를 갖는다.</p>
<p>컴퓨터는 모든 데이터를 2진수로 처리한다. 따라서 메모리에 저장되는
데이터는 데이터의 종류(숫자, 텍스트, 이미지, 동영상 등)와 상관없이
모두 2진수로 저장이 된다.</p>
<p><strong>정리하자면?</strong>
<strong>변수</strong>는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체
그 메모리 공간을 식별하기 위해 붙인 이름을 뜻한다.</p>
<p>쉽게 말해 프로그래밍 언어에서 값을 저장하고 참조하는 메커니즘으로,
<strong>값의 위치를 가르키는 상징적인 이름</strong>이다.</p>
<h2 id="2-변수-선언">2. 변수 선언</h2>
<p> JavaScript에서는 let 키워드를 사용해 변수를 선언할 수 있다.</p>
<pre><code> // let 변수 이름 = 값
 let initialValue = 4

 // 한글로 작성한 변수 이름
 let 초기로_가지고_있는_값 = 4</code></pre><p>변수 선언 시, 작성 해야 할 부분은 아래와 같다.</p>
<ol>
<li>키워드 <strong>let</strong></li>
<li>변수 이름 <strong>variableName</strong></li>
<li>할당(대입) 연산자 <strong>=</strong> </li>
<li>값 <strong>4</strong></li>
</ol>
<h2 id="3-변수-이름">3. 변수 이름</h2>
<p> 변수는 의미있는 코드를 사용하기 위해 사용된다.
 그러므로 변수 이름은 의미있게 작성해야 한다.</p>
<p>initialValue는 변수 이름이다. 
다음 규칙을 따르는 이름을 의미있게 지을 수 있다.</p>
<ol>
<li>변수 이름은 연결된 한 단어로 작성되어야 한다.</li>
<li>알파벳(a-z, A-Z), 숫자(0-9), 그리고 _, $ 등의 기호로 구성되야 한다.</li>
<li>변수 이름을 숫자로 시작하면 안된다. 규칙 위반이라 오류가 발생한다.</li>
<li>변수 이름으로 예약어(Reserved words)는 사용할 수 없다</li>
</ol>
<h2 id="4-값value">4. 값(Value)</h2>
<p>값(value)은 변수에 기억하는 값이다.
기본형(문자열, 숫자 등)이거나 객체형(배열, 함수 등)일 수 있다.
변수 값을 할당하지 않을 경우 기본값은, <strong>undefined</strong>가 된다.</p>
<h2 id="5-할당대입-연산자">5. 할당(대입) 연산자</h2>
<p>JavaScript에서 등호(=) 기호는 수학에서처럼 작동하지 않는다.
이 점에서 헷갈릴 수 있으니, 아래를 보고 기억하자</p>
<pre><code>// 수학에서 x는 7이다. (같다)
x = 7

// 자바스크립트에서 변수 x에 7을 할당(대입)한다.
let x = 7</code></pre><p>JavaScript에서 등호(=)기호는 할당(assignment)를 의미한다.</p>
<pre><code>let initialValue = 4
console.log(initialValue) // 4, 변수에 기억된 값을 출력한다.</code></pre><h2 id="6-평가">6. 평가</h2>
<p>변수는 <strong>단 하나의 값만 기억</strong>을 할 수 있다.
오른쪽에서 계산해야 하는 방정식이 있을 경우, 변수에 할당하기 전에
먼저 계산을 해야한다.
<strong>평가가 필요한 방정식</strong>을 JavaScript에서는 &quot;<strong>표현식(expression)</strong>&quot;
이라고 불린다.</p>
<blockquote>
<p><strong>방정식이란?</strong>
방정식은 알 수 없는 값이 포함된 수식을 등호(=)를 사용해 표현한 식을 뜻함
즉, 어떤 값을 찾기 위한 수학적인 문장이다.</p>
</blockquote>
<h2 id="7-var-변수와-const-상수">7. Var 변수와 Const 상수</h2>
<p>var 키워드를 사용한 변수는 2015년 이전에 변수를 작성할 때 사용되었다.
오늘날에는 사용이 권장되지 않는다. </p>
<p>이유는, var 변수의 범위는 let 변수의 범위와 다른데, 현 시점에서는
아직 어렵게 느껴질 수 있다.</p>
<p>향후에 스코프(Scope), 호이스팅(Hoisting) 등을 공부할 때
다시 보도록 한다.</p>
<pre><code>var initialValue = 4
var applesToValue = 27

var totalValue = initialValue + applesToValue</code></pre><p>JavaScript에서 변수를 선언할 때 사용되는 키워드는,
let, var, const 이렇게 3가지로 이용하여 변수를 선언해서 사용한다.</p>
<p>3개 키워드를 모두 변수를 선언하지만,
그 중 const 키워드는 상수(constant)를 선언할 때 사용된다.</p>
<pre><code>const initialValue = 4
const applesToValue = 27

const totalValue = initialValue + applesToValue</code></pre><blockquote>
<p>const VS. let
변수를 선언할 때, const를 사용하면 상수(변하지 않는 수)가 되므로,
새 값을 할당할 수 없다. 
변수 let 키워드를 사용해 변수를 선언하면 새로운 값을 할당 가능하다.</p>
</blockquote>
<p><strong>let은 &quot;변수&quot;</strong>, <strong>const는 &quot;상수&quot;</strong>를 선언할 때 각각 사용한다.
const를 사용한 변수는 다른 값으로 다시 할당되지 않는 것을 보장하므로
처음 할당된 값 이외의 다른 값으로 대체되어야 하지 않을 때 유용하다.</p>
<h3 id="결론">결론</h3>
<ul>
<li>변수란 데이터의 값 위치를 가르키는 상징적인 이름이다.</li>
<li>변수를 사용하면 의미있는 코드를 작성할 수 있다.</li>
<li>변수는 데이터 값을 기억하는데 사용된다.</li>
<li>등호(=) 기호는 할당(같음을 의미하지 않음!)을 의미한다.</li>
<li>변수 이름에 예약어(Reserved words)를 사용될 수 없다.</li>
<li>var 키워드는 더 이상 사용하지 않는걸 권장한다.</li>
<li>변수는 let으로 선언, 상수는 const로 선언한다.</li>
</ul>
<h2 id="출처">출처</h2>
<p><a href="https://poiemaweb.com/js-data-type-variable">모던자바스크립트 - 변수</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 타입?]]></title>
            <link>https://velog.io/@heosigi_0221/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@heosigi_0221/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Sat, 08 Nov 2025 09:56:29 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터-타입원시">데이터 타입(원시)</h1>
<p>자바스크립트에서는 7가지의 기본 데이터 타입이 존재한다.
이러한 데이터 타입을 &#39;<strong>원시(Primitives) 데이터 타입</strong>&#39; 이라고 한다.</p>
<p>아래와 같이 데이터 타입은 다음과 같다.</p>
<ol>
<li>String(문자)</li>
<li>Number(숫자)</li>
<li>Boolean(참/거짓)</li>
<li>Null(널)</li>
<li>Undefined(언디파인드)</li>
<li>Symbol(심볼)</li>
<li>Binint(빅인트)</li>
</ol>
<h2 id="1-string">1. String</h2>
<p> <strong>JavaScript에서 문자열은 텍스트 데이터</strong>를 나타내고,
 문자열은 따옴표로 묶어서 만들 수 있다.</p>
<pre><code> &#39;JavaScript가 너무 재밌어요.&#39;</code></pre><p>문자열을 만들려면, 작은 따옴표(&#39;) 또는 큰 따옴표(&quot;)를 사용할 수 있고,
앞/뒤 쌍은 항상 동일해야 한다.</p>
<pre><code> &quot;JavaScript 문자열은 작은 따옴표나 큰 따옴표로 묶고, 앞뒤 쌍이 동일해야 합니다.&quot;</code></pre><p>문자열을 추가 연결할 수도 이는데 + 연산자를 사용해서 더할 수 있다.
+로 연결하면 두 문자열이 하나로 합쳐진다.</p>
<pre><code> console.log(&#39;내가 좋아하는 건&#39; + &#39; 고기입니다.&#39; // &quot;내가 좋아하는 건 고기입니다.&quot;
 console.log(&#39;1&#39;+&#39;1&#39;) // &#39;11&#39;</code></pre><h2 id="2-number">2. Number</h2>
<p> <strong>숫자(Number)는 숫자 데이터</strong>를 나타낸다.
 JavaScript에서 숫자를 숫자 형태로 직접 작성하여 숫자를 만들 수 있다.</p>
<pre><code> 1076840
 1_076_840</code></pre><p>콘솔 패널엔 숫자는 파란색으로 표시 된다. (문자는 빨간색으로 표시됌)</p>
<pre><code> console.log(1076840)
 console.log(1_076_840)</code></pre><p>여기서, Number 정수의 안전 범위가 있는데,
JavaScript에서 <strong>Number 타입은 64비트 부동소수점 형식(IEEE 754)</strong>로
표현이 된다.
JavaScript에서 정수는 안전한 범위 안에서만 정확하게 표현된다.</p>
<pre><code> Number.MIN_SAFE_INTEGER // -9007199254740991 (약 9,000조)
 Number.MAX_SAFE_INTEGER // 9007199254740991</code></pre><h2 id="3-boolean">3. Boolean</h2>
<p> 불리언(Boolean)은 참과 거짓으로 값이 나뉜다.
 쉽게 말하자면, 스위치에 있는 ON/OFF를 예시로 들 수 있다.
 <strong>스위치는 &quot;ON&quot;(True) 또는 &quot;OFF&quot;(False)</strong>만 가능하다.</p>
<p>불리언(Boolean)은 조건 처리를 하는 명령문에 많이 사용하게 된다.</p>
<h2 id="4-undefined">4. Undefined</h2>
<p> 값을 직역하면, &quot;<strong>정의되지 않았다</strong>&quot; 이다.
 하지만 <strong>JavaScript에서는 변수(Variable)의 기본 값(default value)</strong>이다.
 이 값은 향후에 변수를 배울 때 다시 살펴볼 예정이다.</p>
<h2 id="5-null">5. Null</h2>
<p> 값을 직역하면, &quot;<strong>비어있다</strong>&quot; 이다.
 이것 또한 향후에 같이 살펴볼 예정이다.</p>
<h2 id="6-symbol">6. Symbol</h2>
<p> 심볼(Symbol)은 ECMAScript 2015 (ES 6)에 새롭게 추가된 기본 타입이다.
 특별한 상황을 제외하고는 심볼을 직접 사용할 일은 거의 없다.</p>
<pre><code>  Symbol(&#39;Heosigi&#39;) // Symbol(Heosigi)</code></pre><h2 id="7-bigint">7. Bigint</h2>
<p>  Bigint는 &quot;Biginteger&quot; 개념에서 유래한 이름이다.
  JavaScript에서 <strong>Number 타입에서 정확히 표현할 수 없는 매우 큰 정수를 생성</strong>할 수가 있다.</p>
<p>  매우 큰 정수를 다뤄야 할 특별한 경우가 아니면 
  일반적으로 필요하지 않다.</p>
<pre><code>  BigInt(2 ** 53 - 1) // 9007199254740991n
   1000n // 1000n</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 엔진?]]></title>
            <link>https://velog.io/@heosigi_0221/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%94%EC%A7%84</link>
            <guid>https://velog.io/@heosigi_0221/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%94%EC%A7%84</guid>
            <pubDate>Sat, 01 Nov 2025 12:07:12 GMT</pubDate>
            <description><![CDATA[<h2 id="1-엔진이란">1. 엔진이란?</h2>
<blockquote>
<p><strong>JavaScript 코드를 실행하는 프로그램</strong>
대부분의 웹 브라우저는 JavaScript 엔진이 내장되있기 때문에, 
동적 기능을 처리한다.</p>
</blockquote>
<p>이 엔진은 JavaScript 코드를 읽고 분석한 다음,
실행 가능한 머신 코드로 변환한다.</p>
<h3 id="브라우저--서버-환경마다-엔진은-다르게-구현이-된다"><strong>브라우저 / 서버 환경</strong>마다 엔진은 다르게 구현이 된다.</h3>
<ul>
<li>Chrome / Node.js, Edge, Opera, Brave -&gt; V8 엔진 사용</li>
<li>Mozilla -&gt; SpiderMonkey 엔진 사용</li>
<li>Safari -&gt; JavaScriptCore 엔진 사용</li>
<li>Edge(구버전) -&gt; Chakra 엔진 사용</li>
</ul>
<p>위와 같이 동일한 JavaScript 코드도 엔진에 따라</p>
<p>내부에서 처리하는 방식이 다르게 쓰인다는 것이 보인다.</p>
<h3 id="엔진은-그러면-어떻게-작동하게-될까">엔진은 그러면 어떻게 작동하게 될까?</h3>
<p>기본 원리는 아래와 같이 간단하게 작성을 해보자면,
<strong>1. 엔진(브라우저라면 내장 엔진)이 스크립트를 읽음(파싱)
2. 읽어 들인 스크립트를 기계어로 변환(컴파일)
3. 기계어로 전환된 코드가 실행 -&gt; 기계어로 변환되었기 때문에 
실행 속도가 빠름</strong></p>
<blockquote>
<p>자바스크립트 대표적인 엔진의 예시는 Google V8 엔진이다.
Chrome과 Node.js에서 사용하는데 아래의 사진은
엔진의 간단한 구조 그림이다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/76508695-4932-4dae-b3f8-43839490d0f9/image.png" alt="">
엔진의 주요 구성요소는,</p>
</blockquote>
<ul>
<li>Memory Heap : 메모리 할당이 일어나는 곳</li>
<li>Call Stack : 코드 실행에 따라 호출 스택이 쌓이는 곳</li>
</ul>
<h3 id="런타임">런타임</h3>
<blockquote>
<p>DOM, Ajax, setTimeout 과 같이 브라우저에서 제공하는 API를,
<strong>Web API</strong> 라고 불린다. 단순히 하나의 엔진만 구성되어 있지 않다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/9ee54c4a-3a01-4a50-a1bb-f3afbf594922/image.png" alt="">
아래쪽에 이벤트 루프와 콜백 큐도 존재하는데, 
이는 Web API 의 호출을 제어하기 위함이다.</p>
</blockquote>
<p>모든 자바스크립트 개발자들이 setTimeout 과 같은 브라우저 내장 API를 사용한다.
하지만, 이 API를 자바스크립트 엔진은 제공하지 않는다.</p>
<h3 id="호출-스택call-stack">호출 스택(Call Stack)</h3>
<blockquote>
<p>자바스크립트는 기본적으로 싱글 스레드 기반 언어이다. 즉, 이 말은 
호출 스택이 하나를 의미한다는 말 -&gt; <strong>한 번에 하나씩 작업을 처리함</strong>
<img src="https://velog.velcdn.com/images/heosigi_0221/post/96f5ec68-0f73-4cf6-9fbe-22c47bfa9566/image.png" alt=""></p>
</blockquote>
<p>호출 스택은 기본적으로 우리가 프로그램 상 어디에 있는지 기록하는 자료구조이다.
만약에 함수를 실행한다면, 해당 함수는 호출 스택의 가장 상단에 위치한다.
함수 실행이 끝날 때(Return값이 반환될 때), 해당 함수를 호출 스택에 제거하고,
그것이, 스택의 역할이다.</p>
<h2 id="2-결론">2. 결론</h2>
<p><strong>JavaScript 엔진은 JavaScript 코드를 실행을 도와주는 프로그램이고,
브라우저 또는 서버 환경마다 같은 코드일지라도, 
내부에서 처리하는 방식이 달라질 수 있다.</strong></p>
<h3 id="출처">출처</h3>
<p><a href="https://joshua1988.github.io/web-development/translation/javascript/how-js-works-inside-engine/">자바스크립트 동작 원리</a>
<a href="https://ko.javascript.info/intro">자바스크립트 엔진 동작 - JAVASCRIPT.INFO</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트란?]]></title>
            <link>https://velog.io/@heosigi_0221/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@heosigi_0221/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Sat, 01 Nov 2025 11:38:34 GMT</pubDate>
            <description><![CDATA[<h2 id="1-자바스크립트란-무엇인가">1. 자바스크립트란 무엇인가?</h2>
<p>초창기의 웹은 정적인 페이지로 구성되어 있었다.
HTML로 문서를 작성하고, CSS로 디자인하는 방법밖에 
존재하지 않았던 웹사이트에 불과하였지만,</p>
<p>Javascript의 등장 이후로 중요한 언어 중 하나로 거듭나게 되었다.</p>
<p>웹의 부상은, Javascript를 우리가 상상하지 못할 만큼 끌어올렸다 
해도 과언이 아니다.</p>
<p><img src="https://velog.velcdn.com/images/heosigi_0221/post/e6492051-d83c-4a24-a6ed-16021b6e657d/image.png" alt=""> 이분이 자바스크립트의 최초 개발자, 
&quot;브랜드 아이크(Brendan Eich)&quot; 이다. 
아마 JavaScript가 없었더라면, 웹페이지는 심심한 화면으로만 보였을 것이다.</p>
<p>조금 풀어 쓰면 이렇게 말할 수 있다.</p>
<blockquote>
<p><strong>웹페이지를 생동감을 불어넣기 위해서 만들어진 프로그래밍 언어</strong></p>
</blockquote>
<p>자바스크립트로 작성한 프로그램을 스크립트(script)라고 부른다.</p>
<p>스크립트는 웹페이지 HTML안에서도 작성이 가능한데,
웹페이지를 불러올 때 스크립트가 자동으로 실행된다.</p>
<h2 id="2-근데-왜-자바-스크립트인가">2. 근데 왜 &quot;<strong>자바</strong>&quot; 스크립트인가?</h2>
<p>처음에 만들어질 때는 &quot;<strong>LiveScript</strong>&quot;라는 이름으로 불렸었다.
그때 당시에 자바의 인기가 아주 높은 상황이었는데, 
자바의 &quot;동생&quot; 격인 언어로 홍보하면 도움이 될 것이라는 
의사결정을 내리고 이름을 바꿨다고 한다.</p>
<p>이름은 자바에서 차용해 왔지만 사람들이 착각할 수도 있는 부분이,
&quot;<em>엄연히 자바스크립트는 자바와는 독자적인 언어</em> &quot; 이다.</p>
<p>꾸준한 발전을 거듭하게 되면서 ECMAScript라는 고유한 명세를 갖춘 
독립적인 언어가 되었고, 자바스크립트는 자바와 아무런 연관이 없다.</p>
<p>자바스크립트가 이토록 오랫동안 사랑받을 수 있는 이유는,</p>
<blockquote>
<p><strong>친숙한 Java 스타일 문법 덕분에 진입 장벽이 낮았고, 
초보자와 디자이너도 쉽게 배울 수 있었다.</strong></p>
</blockquote>
<p>이러한 이유로 빠르게 퍼져나가게 되었고
이토록 자바스크립트는 오랫동안 많은 개발자들이 사용하고,
꾸준하게 아직까지도 생존할 수 있었던 이유 중에 하나라고 말할 수 있다.</p>
<h2 id="3-자바스크립트만의-강점">3. 자바스크립트만의 강점</h2>
<p>자바스크립트만의 강점으로는 세가지로 나눌 수 있다.</p>
<p><strong>1. HTML/CSS와 완전히 통합을 할 수 있다.
2. 간단한 일은 간단하게 처리할 수 있게 한다.
3. 모든 주요 브라우저에서 지원하고, 기본 언어로 사용된다.</strong></p>
<p>위 3가지 모두를 지원하는 브라우저 연관 기술은
오직 자바스크립트 하나 뿐이다.</p>
<p>이러한 특징으로 자바스크립트는 브라우저 인터페이스를 만들 때,
가장 널리 사용되고 있다.</p>
<p>이 외에도 자바스크립트를 이용하여 서버나 모바일 앱 등을
만드는 것도 가능하다.</p>
<h2 id="4-자바스크립트-특징">4. 자바스크립트 특징</h2>
<p><strong>1. 자바스크립트는 웹 브라우저에서 동작할 수 있는 
유일한 프로그래밍 언어이다.</strong>
자바스크립트는 기본 문법에서 자바, C와 유사하고 
기존의 프로그래밍 언어에서 많은 영향을 받았다.</p>
<p><strong>2. 개발자 별도의 컴파일 작업을 수행하지 않는 인터프리터 언어이다.</strong>
대부분 모던 자바스크립트 엔진은 인터프리터와 컴파일러의 장점을 
결합하여 비교적 처리 속도가 느린 인터프리터의 단점을 해결했다.</p>
<p>인터프리터는 소스코드를 즉시 실행하고, 컴파일러는 빠르게 동작하는
머신 코드를 생성하고 최적한다. </p>
<p>이를 통하여 컴파일 단계에는 추가적인 시간이 필요함에도 불구하고
보다 빠른 코드 실행이 가능하다.</p>
<p><strong>3. 자바스크립트는 명령형, 함수형, 프로토타입 기반의 객체지향 프로그래밍의 멀티 페러다임 프로그래밍 언어이다.</strong>
자바스크립트는 객체지향 프로그래밍 능력을 가지고 있다.
근데 여기서 오해할 수 있는 부분이 있는데, 
클래스 또는 상속, 정보 은닉을 위한 키워드 private가 없어서 
객체지향 언어가 아니라고 오해를 가장 많이 받는 언어이다.</p>
<p>자바스크립트는 클래스 기반 객체지향 언어보다 효율적이고, 
강력한 프로토타입 기반의 객체지향 언어이다.</p>
<blockquote>
<p><strong>프로토타입이 무슨 뜻이야?</strong>
객체가 다른 객체로부터 메서드와 프로퍼티(속성)을 상속받기 위해,
사용하는 연결고리 즉, 쉽게 말해 객체의 &quot;원형(원본)&quot;이다.
객체 지향 프로그래밍에서 상속을 구현하는 방식이다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/8ac59b18-3a58-4150-98df-fe7239258ab3/image.png" alt="">
_&lt;출처 : 요즘IT, 작가&gt;_</p>
</blockquote>
<p>프로토타입에 대해서 더 남겨보자면,
<strong>1. 프로토타입(Prototype)</strong></p>
<ul>
<li>객체의 원형</li>
<li>객체가 다른 객체로 메서드/속성(property)를 
상속받기 위해 사용하는 연결고리</li>
</ul>
<blockquote>
<p>❓프로토타입이 왜 필요하지?
만약 프로토타입이 없다면, 객체마다 필요한 메서드를 
전부 복사해서 가지고 있어야 한다.
ex: 1만개의 배열을 생성 한다면, 
각각 배열이 map, filter, forEach 메서드를
개별적으로 보관해야되고, 이러한 점은 메모리 낭비가 
매우 심할 뿐 아니라 버그 수정 시에 유지보수도 어렵게 만든다.</p>
</blockquote>
<p><strong>2. 프로토타입 체인(Prototype chain)</strong></p>
<ul>
<li>객체 간 연결된 상속 경로</li>
<li>객체에서 특정 속성(property)를 찾을 때 탐색하기 위한 탐색 경로</li>
</ul>
<p>모든 객체가 자신의 &#39;부모&#39; 역할을 하는 프로토타입 객체와 연결되어
객체의 속성과 메서드를 상속받아 사용할 수 있게 해준다.</p>
<p>만약, 객체에 속성이 없을 땐 프로토타입 체인을 따라서
상위 객체에서 속성을 찾아가는 방식으로 동작을 한다.
<img src="https://velog.velcdn.com/images/heosigi_0221/post/6de91b9e-352e-4e3b-bbb7-64283d851252/image.png" alt="">
(위 사진은 체인의 구조를 나타낸 이미지)
_&lt;출처 - 요즘 IT 작가&gt;_</p>
<h3 id="출처">출처</h3>
<p>야무쌤 자바스크립트 강의
<a href="https://poiemaweb.com/js-introduction">poiemaweb - introduction</a>
<a href="https://yozm.wishket.com/magazine/detail/3372/">요즘IT - 자바스크립트 프로토타입</a></p>
]]></description>
        </item>
    </channel>
</rss>