<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyun.log</title>
        <link>https://velog.io/</link>
        <description>:^)</description>
        <lastBuildDate>Tue, 15 Apr 2025 18:11:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyun.log</title>
            <url>https://velog.velcdn.com/images/bae_hyeona/profile/23e4e70c-2bdc-4828-8fec-782ce71ceaba/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bae_hyeona" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[컴퓨터구조] ISA]]></title>
            <link>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-ISA</link>
            <guid>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-ISA</guid>
            <pubDate>Tue, 15 Apr 2025 18:11:18 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-isa">📌 ISA</h2>
<p>: 명령어 집합 구조(Instruction Set Architecture, ISA)
: CPU가 해석하는 명령어의 집합</p>
</br>

<hr>
<h3 id="✔️-마이크로-아키텍쳐">✔️ 마이크로 아키텍쳐</h3>
<p>: how to implement an architecture in hardware
: CPU의 하드웨어적 설계
: ISA를 효율적으로 처리할 수 있도록 CPU의 회로를 설계하는 분야</p>
<blockquote>
<p>⭐️ <strong>아키텍쳐</strong>
: programmer’s view of computer
: Defined by instructions &amp; operand locations</p>
</blockquote>
</br>

<hr>
<h3 id="✔️-마이크로프로세서">✔️ 마이크로프로세서</h3>
<p>: 제어장치, 연산장치, 레지스터가 하나의 대규목 집적회로 (IC칩)에 내장된 것
: 개인용 컴퓨터(PC)에서 중앙처리장치로 사용</p>
<p>설계 방식에 따라 RISC, CISC로 구분(<a href="https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C">참고</a>)</p>
<ol>
<li><strong>RISC(reduced instruction set computer)</strong></li>
</ol>
<ul>
<li>장점 : 명령어의 개수가 적어 처리 속도가 빠름</li>
<li>단점 : 명령어의 개수가 적기 때문에 레지스터가 많고 프로그래밍이 복잡함</li>
<li>쓰임새 : 전력 소모가 적고 처리 속도가 빨라야 하는 곳
  (보통 스마트폰 또는 임베디드 기기)</li>
</ul>
<ol start="2">
<li><strong>CISC(complicated instruction set computer)</strong></li>
</ol>
<ul>
<li>장점 : 명령어의 개수가 많아 레지스터가 적고 프로그래밍이 RISC의 비해 쉬움</li>
<li>단점 : 명령어의 개수가 많아 처리 속도가 느림</li>
<li>쓰임새 : 고사양 작업을 필요로 하는 곳
  (보통 개인용 PC)</li>
</ul>
</br>

<table>
<thead>
<tr>
<th align="center">구분</th>
<th align="center">CPU 예시</th>
</tr>
</thead>
<tbody><tr>
<td align="center">RISC</td>
<td align="center">ARM, MIPS, SPARC</td>
</tr>
<tr>
<td align="center">CISC</td>
<td align="center">Intel x86, AMD Ryzen 등</td>
</tr>
</tbody></table>
</br>

<h4 id="cpu-아키텍처">[CPU 아키텍처]</h4>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/7bdb99bc-93b7-411b-952d-3c3602eb5d4a/image.png" alt=""></p>
</br>

<hr>
<h3 id="✔️-종류">✔️ 종류</h3>
<p>: x86, AMD64(x86-64), ARM, MIPS, AVR 등
: 컴퓨터마다 필요한 연산 능력과 컴퓨팅 환경이 다르기 때문에 다양한 ISA가 개발되고 사용됨</p>
<h4 id="1-arm">1. ARM</h4>
<p>: RISC
: Developed in the 1980’s by Advanced RISC Machines – now called ARM Holdings
: &#39;32-bit architecture&#39;라고도 부름</p>
<ul>
<li>16개의 레지스터를 가지고 있음</li>
<li><blockquote>
<p>레지스터는 메모리보다 더 빠름</p>
</blockquote>
</li>
<li>각 레지스터는 32비트</li>
</ul>
<blockquote>
<p>2011년에 출시된 ARMv8-A 아키텍처는 새로운 32비트 고정 길이 명령어 세트로 64비트 주소 공간과 64비트 산술에 대한 지원을 추가함. 보통 ARM AArch64라고 불림</p>
</blockquote>
</br>

<p><strong>[Arm Register Set]</strong>
<img src="https://velog.velcdn.com/images/bae_hyeona/post/42eb6482-b585-4ff2-b1a1-4996593c18b3/image.png" alt=""></p>
<h4 id="2-x86">2. x86</h4>
<p>: intel에서 개발
: CISC</p>
 </br>

<table>
<thead>
<tr>
<th align="center">항목</th>
<th align="center">ARM (RISC)</th>
<th align="center">x86 (CISC)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">명령어 수</td>
<td align="center">적음</td>
<td align="center">많음</td>
</tr>
<tr>
<td align="center">전력 소비</td>
<td align="center">낮음</td>
<td align="center">높음</td>
</tr>
<tr>
<td align="center">성능 최적화</td>
<td align="center">모바일, IoT</td>
<td align="center">PC, 서버</td>
</tr>
<tr>
<td align="center">명령어 길이</td>
<td align="center">고정</td>
<td align="center">가변</td>
</tr>
<tr>
<td align="center">대표 기기</td>
<td align="center">스마트폰, 라즈베리파이</td>
<td align="center">데스크탑, 노트북</td>
</tr>
</tbody></table>
</br>

<hr>
<h2 id="📌-architecture-design-principles">📌 Architecture Design Principles</h2>
<p>CPU 아키텍처는 단순히 성능만을 고려해서 만드는 것이 아니라, 설계 시 다음과 같은 원칙들을 기반으로 만들어진다.</p>
<ol>
<li><strong>규칙성은 설계를 단순하게 만든다 (Regularity supports design simplicity)</strong>
• 명령어 형식이 일관되고, 항상 같은 개수의 오퍼랜드(피연산자)를 사용하면 하드웨어 설계가 쉬워진다.<blockquote>
<pre><code>ARM 아키텍처의 명령어는 대부분 2개의 소스 + 1개의 목적지 구조로 고정되어 있음</code></pre><pre><code>덧셈: ADD R0, R1, R2 (R1 + R2 → R0)</code></pre></blockquote>
</li>
</ol>
</br>

<ol start="2">
<li><strong>자주 쓰이는 경우를 빠르게 처리하라 (Make the common case fast)</strong>
• 일상적으로 많이 쓰이는 연산(예: 덧셈, 조건 분기 등)은 하드웨어에서 빠르게 실행되도록 최적화하고, 드물게 쓰이는 복잡한 명령은 단순한 명령들의 조합으로 처리한다.<blockquote>
<pre><code>ARM은 복잡한 문자열 처리 명령은 따로 없지만,</code></pre><p> 기본적인 load/store, branch, add 명령어만으로도 대부분의 프로그램을 구현할 수 있음</p>
<pre><code>드물게 쓰이는 기능은 소프트웨어나 명령어 조합으로 구현.</code></pre></blockquote>
</li>
</ol>
</br>

<ol start="3">
<li><strong>작을수록 빠르다 (Smaller is faster)</strong>
• 레지스터, 캐시, 회로 등은 작을수록 접근 시간이 짧고 속도도 빨라진다.<blockquote>
<pre><code>ARM은 필요한 최소한의 레지스터(예: 16개)만 제공하여 하드웨어를 작고 효율적으로 유지</code></pre><pre><code>전력 소모도 줄고, 모바일 환경에 적합함.</code></pre></blockquote>
</li>
</ol>
</br>

<ol start="4">
<li><strong>좋은 설계는 좋은 타협에서 나온다 (Good design demands good compromises)</strong>
• 단순성과 성능, 유연성과 전력 소비 등 여러 요소 간의 균형을 잘 맞추는 것이 중요하다.</li>
</ol>
<blockquote>
<pre><code>ARM은 처리 속도와 전력 효율 사이에서 최적의 균형을 맞추기 위해 복잡한 명령은 줄이고, 하드웨어를 간소화함</code></pre></blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[컴퓨터구조] 레지스터(Register)]]></title>
            <link>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0Register</link>
            <guid>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0Register</guid>
            <pubDate>Sun, 16 Mar 2025 09:34:06 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-레지스터register">📌 레지스터(Register)</h2>
<p>: 명령어를 실행하기 위해 필요한 데이터와 상태, 명령어를 저장하는 기억 소자
: CPU 내부에 존재하며, 기억 장치 중 가장 빠르며 용량이 작음
: 데이터 레지스터와 제어용 레지스터로 구분</p>
</br>

<h3 id="✔️-데이터-레지스터">✔️ 데이터 레지스터</h3>
<p>: CPU가 명령어를 처리하는 과정에서 임시로 처리할 데이터를 저장하거나 메모리의 주소를 저장할 목적으로 사용
: 데이터 레지스터(Data Register), 주소 레지스터(Address Register), 범용 레지스터(General Register)로 구분</p>
<h4 id="1-주소-레지스터">1) 주소 레지스터</h4>
<blockquote>
<p><strong>(1) 스택 포인터(SP, Stack Pointer)</strong>
: CPU는 현재 실행하고 있는 프로그램의 메모리 영역을 스택으로 관리
: SP는 현재 스택 영역에서 가장 마지막 부분(가장 최근에 저장된)을 가르킴</p>
</blockquote>
<blockquote>
<p><strong>(2) 베이스 포인터(BP, Base Potiner)</strong>
: BP는 스택 영역에서 각 메모리 영역의 경계선을 가르킴
: 즉, 서브루틴 호출 시에 Caller의 SP는 BP가 됨
: 서브루틴의 실행이 완료되면 BP는 다시 SP가 됨</p>
</blockquote>
<blockquote>
<p><strong>(3) 인덱스 레지스터(IX, Index Register)</strong>
: 배열에 순차적으로 접근하기 위한 레지스터</p>
</blockquote>
</br>

<h3 id="✔️-제어용-레지스터">✔️ 제어용 레지스터</h3>
<p>: CPU가 프로그램의 실행 흐름을 제어하거나 상태를 저장하기 위해 사용되는 레지스터</p>
<h4 id="1-프로그램-카운터pc-program-counter">1) 프로그램 카운터(PC, Program Counter)</h4>
<p>: 다음에 실행할 명령어의 주소 저장</p>
<h4 id="2-명령어-레지스터ir-instruction-register">2) 명령어 레지스터(IR, Instruction Register)</h4>
<p>: 현재 실행중인 명령어 저장</p>
<h4 id="3-메모리-주소-레지스터mar-memory-address-register">3) 메모리 주소 레지스터(MAR, Memory Address Register)</h4>
<p>: 액세스할 메모리의 주소 저장
: 주소 버스에 연결</p>
<h4 id="4-메모리-버퍼-레지스터mbr-memory-buffer-register">4) 메모리 버퍼 레지스터(MBR, Memory Buffer Register)</h4>
<p>: 메모리에 접근 시에 해당 주소에 저장/적재할 데이터를 임시 저장
: 데이터 버스에 연결</p>
<h4 id="5-상태-레지스터sr-status-register">5) 상태 레지스터(SR, Status Register)</h4>
<p>: 조건 혹은 이벤트를 검사해 프로그램의 흐름을 제어
: 각 비트에 플래그 값을 가짐</p>
<blockquote>
<p><strong>(1) 조건 플래그(Conditional Flags)</strong>
: 연산 결과를 나타냄</p>
</blockquote>
<ul>
<li><strong>부호 플래그(S)</strong>
: 산술 연산 결과의 부호비트 저장</li>
<li><strong>제로 플래그(Z)</strong>
: 연산 결과가 0인지 표시</li>
<li><strong>자리 올림수 플래그(C)</strong>
: 자리 올림수 발생 시 표시</li>
<li><strong>패리티 비트(P)</strong>
: 패리티 체크를 통해 연산 결과의 유효성 체크</li>
<li><strong>오버플로우(OV)</strong>
: 오버플로우 발생 여부</li>
</ul>
<blockquote>
<p><strong>(2) 제어 플래그(Control Flags)</strong>
: CPU를 제어하기 위한 것</p>
</blockquote>
<ul>
<li><strong>인터럽트 플래그(IE)</strong>
: CPU가 외부 인터럽트의 요청을 수락할지에 대한 여부</li>
<li><strong>관리자 모드 플래그(SV)</strong>
: 해당 명령어가 관리자 모드에서 실행되고 있는지에 대한 여부</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] Bit, Byete, Nibble]]></title>
            <link>https://velog.io/@bae_hyeona/CS-Bits-Byetes-Nibbles</link>
            <guid>https://velog.io/@bae_hyeona/CS-Bits-Byetes-Nibbles</guid>
            <pubDate>Sun, 16 Mar 2025 08:54:59 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-bit">📌 Bit</h2>
<p>: 2진 기수법 표기의 기본 단위 / 2진 숫자
: 2진 기수법에서의 모든 수는 0과 1로 표기하는데, 이 0 또는 1이 각각 하나의 비트가 됨</p>
<ul>
<li><strong>msb</strong>: most significant bit</li>
<li><strong>lsb</strong>: least significant bit</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/fdef5d75-d39f-43a3-8605-c0950780b009/image.png" alt=""></p>
<h2 id="📌-byte">📌 Byte</h2>
<p>: 정보량의 최소 단위인 bit(0과 1)의 집합으로 구성된 기본 단위
: 컴퓨터에 의한 데이터 처리, 저장, 전송의 기본적인 단위로 많이 사용됨</p>
<blockquote>
<p>8bit = 1byte</p>
</blockquote>
<ul>
<li><strong>MSB (Most Significant Byte)</strong></li>
<li><strong>LSB (Least Significant Byte)</strong></li>
<li>각 hex digit은 한 개의 nibble을 나타냄 (4 bits)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/b49844f7-9510-4410-9149-7d5cf8eef9b6/image.png" alt=""></p>
<h2 id="📌-nibble">📌 Nibble</h2>
<p>: 1바이트의 절반, 즉 4비트를 하나의 단위로 한 것</p>
<blockquote>
<p>4 bit = 1 nibble</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/37c861cc-fba1-4419-9908-1f31b5237653/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] BCD]]></title>
            <link>https://velog.io/@bae_hyeona/CS-BCD</link>
            <guid>https://velog.io/@bae_hyeona/CS-BCD</guid>
            <pubDate>Sun, 16 Mar 2025 08:47:01 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/e7697517-ab46-44bd-88e5-417f1333456a/image.png" alt=""></p>
<h2 id="📌-binary-coded-decimal-bcd">📌 Binary Coded Decimal (BCD)</h2>
<p>: 십진수를 위한 가장 간단하고 직관적인 이진 코드
: 이진수와 동일한 2의 거듭제곱을 사용하지만 0에서 9까지 처음 10개의 값만 인코딩 함</p>
<blockquote>
<ul>
<li><strong>BCD 코드</strong> : 8, 4, 2, 1 코드
ex) 1001 (9) = 1000 (8) + 0001 (1)</li>
</ul>
</blockquote>
<blockquote>
<p>십진수를 이진수로 변환(conversion)하는 것과 코딩(coding)하는 것은 다름!!
• <strong>conversion</strong> : 1310 = 11012 
• <strong>coding</strong> : 13 &lt;-&gt; 0001|0011 </p>
</blockquote>
</br>

<hr>
<h2 id="📌-hexadecimal-numbers">📌 Hexadecimal Numbers</h2>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/ba52f0bd-1c01-4539-83cd-79acae11a29a/image.png" alt=""></p>
<ul>
<li><p><strong>16진수를 2진수로 변환 (Hexadecimal to binary conversion)</strong></p>
<blockquote>
<p> $$4AF_{16}$$ ( = 0x4AF) = 0100 1010 $$1111_{2}$$</p>
</blockquote>
</li>
<li><p><strong>16진수를 10진수로 변환 (Hexadecimal to decimal conversion)</strong></p>
<blockquote>
<p>$$4AF_{16}$$ (0x4AF) = 
– 4 × $$16^2$$ + A × $$16^1$$ + F × $$16^0$$
– 4 × $$16^2$$ + 10 × $$16^1$$ + 15 × $$16^0$$ = $$1199_{10}$$</p>
</blockquote>
</li>
</ul>
</br>

<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[컴퓨터구조] 컴퓨터의 구성 요소]]></title>
            <link>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C</guid>
            <pubDate>Sun, 16 Mar 2025 08:15:14 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-cpu">📌 CPU</h2>
<p>: 기억,해석,연산,제어라는 4대 주요 기능을 하는 컴퓨터의 가장 핵심적인 중앙 처리 장치</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/0ce48c86-b1c2-45f8-b21c-eeb04fc184d5/image.png" alt=""></p>
<h3 id="✔️-구성-요소">✔️ 구성 요소</h3>
<ol>
<li><strong>ALU(Arithmetic Logic Unit)</strong>
: 각종 산술 연산과 논리 연산을 수행하는 회로들로 이루어진 하드웨어 모듈
: 가산기, 보수기, 누산기, 기억 레지스터, 데이터 레지스터 등으로 구성</li>
<li><strong>Control Unit</strong>
: 컴퓨터의 제어를 담당하며 IODevice, Memory, ALU등의 동작을 제어
: 구현 방식으로 고정 배선제어(Hardwired), Micro Program 방식이 있음</li>
<li><strong>Register set</strong>
: 내부에 위치한 기억 장치
: CPU에서 Memory로 이동하는 시간을 단축해 빠르게 데이터를 처리할 수 있게 해주는 장치</li>
</ol>
<p><strong>&lt;레지스터의 종류&gt;</strong>
더 자세한 내용 : <a href="https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0Register">레지스터(Register)</a>
-&gt; <em><strong>PC(Program Counter)</strong></em> : 다음 실행할 명령어 주소를 가리키는 레지스터
-&gt; <em><strong>IR(Instruction Register)</strong></em> : 현재 수행 중에 있는 명령어 부호를 저장하고 있는 레지스터
-&gt; <em><strong>누산기(ACC, Accumulator)</strong></em> : 데이터 일시 보관 레지스터 / 산술 및 논리 연산의 결과를 임시로 기억하는 레지스터
-&gt; <em><strong>MAR(Memory Address Register)</strong></em>
: CPU가 메모리 참조하기 위해 보관하는 데이터 주소를 가진 레지스터
-&gt; <em><strong>MBR(Memory Buffer Register)</strong></em>
: CPU가 메모리로부터 읽거나 저장 할 데이터 자체를 보관하는 레지스터</p>
</br>

<h3 id="✔️-명령어-수행-과정">✔️ 명령어 수행 과정</h3>
<p>: CPU 가 하나의 명령(Operation)을 처리하는 과정</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/e83d3004-e34d-431e-ab06-d81322531ebc/image.png" alt=""></p>
<h4 id="1-읽기fetch-instruction-fi"><strong>1. 읽기(Fetch Instruction, FI)</strong></h4>
<ul>
<li>실행할 명령어를 메모리에서 읽어 CPU로 가져옴<blockquote>
<p>PC가 가리키는 주소 → MAR
MAR에 적힌 주소를 메모리(Memory)에서 읽어 → MBR
MBR에 있는 명령어 → IR 저장
다음 명령어를 가리키도록 PC 주소값 증가</p>
</blockquote>
</li>
</ul>
<h4 id="2-해석decode-instruction-di"><strong>2. 해석(Decode Instruction, DI)</strong></h4>
<ul>
<li>IR에 저장된 인출한 명령어를 해석을 해서 해당 명령어에 포함된 데이터를 가져오고 이 명령어(ex.10h)를 해독하는 과정</li>
<li>여기서 &quot;인출한 명령어에 포함된 데이터를 가져온다&quot; 를 CPU 명령어 구조로 파악하자면</li>
</ul>
<blockquote>
<ul>
<li>실제로 메모리에는 명령어 메모리, 주소 메모리를 따로 가지고 있지는 않음. 그냥 하나의 메모리에 명령어와 필요한 주소 데이터, 즉 인자(Argument)를 작성 해놓음 (= 기본적으로 하나의 명령은 opcode + argument(operand) 구조)</li>
</ul>
</blockquote>
<ul>
<li>그러면 실제로 이 부분은 아래 빨간 네모 박스처럼 RAM(메모리)에 저장되어 있음
<img src="https://velog.velcdn.com/images/bae_hyeona/post/73e3ce7e-ed06-42d6-8818-1b5cb916143f/image.png" alt=""></li>
<li>위 그림에서 LOD A라는 명렁과 01h라는 주소가 00111110(OpCode)와 00000001(Operand, argument)처럼 2진수로 표현될 것임</li>
<li>이것을 16진수로 표현하면 3E, 01로 표현되며, RAM에 순차적으로 저장되어 있음</li>
</ul>
<h4 id="3-실행execute-instruction-ei"><strong>3. 실행(Execute Instruction, EI)</strong></h4>
<ul>
<li>명령어 실행</li>
<li>MBR의 데이터와 ACC(Accumulator)의 데이터로 연산 후, ACC(Accumulator)에 저장</li>
</ul>
<h4 id="4-기록write-back-wb"><strong>4. 기록(Write Back, WB)</strong></h4>
<ul>
<li>실행 결과를 저장</li>
</ul>
</br>

<h3 id="✔️-명령어-처리-방식">✔️ 명령어 처리 방식</h3>
<h4 id="1-cisc-complex-instruction-set-computer">1. CISC (Complex Instruction Set Computer)</h4>
<p>: 하나의 기능에 해당하는 하나의 명령이 있는 개념</p>
<ul>
<li>여러 사이클로 명령어를 처리</li>
<li>많은 명령어가 메모리를 참조하는 처리 방식</li>
<li>파이프라이닝의 사용이 어려움</li>
<li>복잡한 마이크로 프로그램 구조를 갖고 있음</li>
</ul>
<h4 id="risc-reduced-instruction-set-computer">RISC (Reduced Instruction Set Computer)</h4>
<p>: 컴퓨터 내부적으로 사용하는 명령어 세트를 단순화 시켜서 처리하는 형태의 구조
: 단순한 명령을 조합해서 하나의 기능을 수행</p>
<ul>
<li>하나의 사이클로 명령어를 처리</li>
<li>메모리 Load / Store 명령만 처리하는 방식</li>
<li>파이프라이닝, 슈퍼스칼라의 사용이 가능</li>
<li>복잡한 컴파일러 구조를 갖고 있음</li>
</ul>
</br>

<hr>
<h2 id="📌-메모리">📌 메모리</h2>
<p>: 기억장치로서 컴퓨터에서 데이터를 일시적으로 또는 영구적으로 보존하는 장치</p>
<h3 id="✔️-종류">✔️ 종류</h3>
<p>: 주 기억 장치(RAM, ROM) 와 보조 기억장치(HDD SSD)</p>
<h4 id="⭐️-주-기억-장치-ram-rom">⭐️ 주 기억 장치 (RAM, ROM)</h4>
<ol>
<li><p><strong>RAM</strong></p>
<p> <strong>1) SRAM (Static RAM)</strong></p>
<ul>
<li><p>CPU 안에 포함되어 <strong>캐시 메모리</strong>라고도 함</p>
</li>
<li><p>CPU와 DRAM의 속도 차이를 극복하기 위해 CPU와 DRAM 사이에 존재하는 고속 기억 장치</p>
</li>
<li><p><em><strong>캐시 메모리</strong></em> : 시간적, 공간적 지역성을 기반으로 가까운 미래에 접근될 확률이 높은 데이터를 미리 보관하는 것</p>
</li>
<li><p><strong>전기가 남아있는 한 재생을 하지 않아도 메모리가 날아가지 않음</strong></p>
</li>
<li><p><em>2) DRAM (Dynamic RAM)*</em></p>
</li>
<li><p>흔히 말하는 메인메모리</p>
</li>
<li><p>SRAM보다 <strong>속도는 느리지만</strong> 집적도를 높이기 쉬워 <strong>메모리 용량이 크고 SRAM보다 상대적으로 저렴</strong></p>
</li>
<li><p>축전기(capacitor)로 이루어져있는 소자의 집합체</p>
<ul>
<li>각각의 축전기가 담고 있는 전자의 수에 따라 전기신호를 1과 0으로 나타내는데, 축전기가 시간이 지나면 방전되기 때문에 일정 시간마다 재충전하여 데이터를 재생시켜야 함</li>
</ul>
</li>
<li><p><strong>메모리 자체에 지속적인 전기를 소모하고, 전기가 약해지면 순간적으로 데이터가 날아감</strong></p>
</li>
</ul>
</li>
<li><p><strong>ROM</strong></p>
</li>
</ol>
<ul>
<li>메인보드에 작은 부품으로, 내용을 읽을 수는 있어도 쓰기가 불가능한 메모리</li>
<li>비휘발성 메모리</li>
<li>공장에서 생산될 때 납땜되어 출하되기 때문에, 입출력을 처리하는 바이오스 등의 변경 가능성이 없는 소프트웨어를 기억시키는데 사용</li>
</ul>
</br>

<h4 id="⭐️-보조-기억-장치-ssd-hdd">⭐️ 보조 기억 장치 (SSD, HDD)</h4>
<ol>
<li><strong>SSD</strong></li>
</ol>
<ul>
<li>플래시 메모리(SSD, USB)</li>
<li>데이터를 영구적으로 저장하는 비휘발성 대용량 기억장치</li>
<li>물리적인 디스크를 고속으로 회전시켜 데이터를 저장하는 장치</li>
<li>디스크에 물리적으로 저장하기 때문에 충격에 약하며, 소음이 발생</li>
</ul>
<ol start="2">
<li><strong>HDD</strong></li>
</ol>
<ul>
<li>자기 디스크(HDD, FDD)</li>
<li>반도체를 이용하여 데이터를 저장하는 기억장치</li>
<li>HDD와 다르게 전기적으로 데이터를 저장하기 때문에 속도도 월등히 빠르고 소음 발생 X</li>
<li>가격은 좀 높지만, 전력 소모도 적고 소형화가 가능하여 최근에 많이 사용되고 있는 보조기억장치</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/b618c410-00f5-493d-93b9-952bdf8a0f90/image.png" alt=""></p>
</br>

<hr>
<h2 id="📌-io">📌 IO</h2>
<ul>
<li>Input/Output의 약자로 컴퓨터에게 있어 인간의 오감과 같은 역할을 함<ul>
<li><strong>Input</strong> : 마우스, 키보드, 카메라 등</li>
<li><strong>Output</strong> : 모니터, 스피커, 프린터 등</li>
<li><strong>In/Out</strong> : 네트워크, 저장매체 등</li>
</ul>
</li>
<li>CPU, 메모리 등 요소간에 <strong>Bus</strong>를 통해서 연결됨<ul>
<li>But, 병목현상이 일어날 수 있는 문제점에 최근엔 고속 시리얼 통신을 이용하기도 함</li>
</ul>
</li>
</ul>
</br>

<hr>
<h2 id="📌-bus">📌 Bus</h2>
<ul>
<li>시스템 내외부 모듈 사이에 데이터 전송을 위한 통신 링크 규약</li>
<li>병렬 직렬 연결 모두 가능</li>
</ul>
</br>

<h3 id="✔️-장점--단점">✔️ 장점 &amp; 단점</h3>
<h4 id="--장점">- 장점</h4>
<ul>
<li>새로운 노드 추가가 용이</li>
<li>표준 규격의 범용성과 낮은 연결 비용<h4 id="--단점">- 단점</h4>
</li>
<li>통신 병목 현상 발생</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[컴퓨터구조]  폰노이만 구조 및 하버드 구조]]></title>
            <link>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%ED%8F%B0%EB%85%B8%EC%9D%B4%EB%A7%8C-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%ED%95%98%EB%B2%84%EB%93%9C-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@bae_hyeona/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%ED%8F%B0%EB%85%B8%EC%9D%B4%EB%A7%8C-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%ED%95%98%EB%B2%84%EB%93%9C-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sun, 16 Mar 2025 07:19:12 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="📌-폰노이만-구조-vs-하버드-구조">📌 폰노이만 구조 VS 하버드 구조</h2>
<h3 id="✔️-폰노이만-구조">✔️ 폰노이만 구조</h3>
<p>: 존 폰노이만이 제시한 컴퓨터 구조 / <strong>프로그램 내장 방식</strong>
: 현대 컴퓨터 구조의 기반이 된 컴퓨터 구조로, CPU, 메모리, 프로그램 구조를 확립
: CPU =&gt; fetch - decode - execute - store 순서로 처리</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/4b970b74-2090-4b90-af92-edc46a7d19aa/image.png" alt=""></p>
<h4 id="⭐️-구성">⭐️ 구성</h4>
<ul>
<li><strong>processing unit</strong> :<ul>
<li>ALU(Arithmetic Logic Unit) : 산술/논리 연산 장치</li>
<li>processor registers</li>
</ul>
</li>
<li><strong>control unit</strong> :<ul>
<li>instruction register : 현재 실행중인 명령어 저장</li>
<li>program counter : 다음 실행할 명령어의 주소를 가리킴</li>
</ul>
</li>
<li><strong>memory</strong> : 물리적 구분이 없어 같은 메모리, 버스를 사용 (동시 접근 X)<ul>
<li>데이터</li>
<li>명령어 (프로그램)</li>
</ul>
</li>
<li><strong>External mass storage</strong> : ex) SSD</li>
<li><strong>Input and output mechanisms</strong></li>
</ul>
</br>

<h4 id="⭐️-장점--단점">⭐️ 장점 &amp; 단점</h4>
<ul>
<li><p><strong>장점</strong></p>
<ul>
<li>컴퓨터에 다른 작업을 시키려고 할 때 전처럼 하드웨어를 재배치할 필요 없이 소프트웨어만 교체 (범용성 향상)</li>
<li>순차처리 방식은 수치 계산이나 정밀하게 작성된 프로그램을 실행하는 데에 탁월</li>
</ul>
</li>
<li><p><strong>단점</strong></p>
<ul>
<li>하나의 버스로 메모리에 접근하기 때문에 CPU가 명령어와 데이터에 동시 접근 X (파이프라이닝 시에 구조적 해저드 문제)</li>
<li>메모리 값을 읽고 쓰는 구조이기 때문에 기억장치에 병목현상 생김</li>
<li>이미지나 소리와 같은 아날로그 데이터를 처리하는 데에 효율성이 낮음</li>
</ul>
</li>
</ul>
</br>

<h4 id="🔥-폰-노이만-병목현상-von-neumann-bottleneck">🔥 폰 노이만 병목현상 (Von-Neumann Bottleneck)</h4>
<p>: 기억장치의 속도가 전체 시스템의 성능 저하를 야기하는 현상
: 계산을 빠르게 처리할 수 있어도 기억을 불러오는 속도가 느리면 전체적으로 속도가 느려짐
(계산 속도가 기억장치 속도에 영향을 받음)</p>
<ul>
<li>원인 : <ul>
<li>프로그램 메모리와 데이터 메모리가 물리적 구분 없이 하나의 버스를 통해 CPU와 교류</li>
<li>CPU는 명령어와 데이터에 동시 접근이 불가하며 나열된 명령을 한 번에 하나씩 읽고 씀</li>
</ul>
</li>
</ul>
<p></br></br></br></p>
<h3 id="✔️-하버드-구조">✔️ 하버드 구조</h3>
<p>: 폰 노이만 병목현상을 해결하기 위한 컴퓨터 구조
: CPU가 명령어와 데이터를 동시에 사용할 수 있도록 명령용 버스와 데이터용 버스를 물리적으로 구분</p>
<h4 id="⭐️-장점--단점-1">⭐️ 장점 &amp; 단점</h4>
<ul>
<li>장점<ul>
<li>프로그램의 명령어와 데이터를 동시에 접근할 수 있도록 지원함으로써 엑세스 속도 개선</li>
<li>현재 명령의 처리를 끝냄과 동시에 다음 명령을 읽어 들여 더 빠른 속도를 냄</li>
</ul>
</li>
<li>단점<ul>
<li>더 많은 전기 회로 필요</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/034dab27-e5b3-427e-8ddf-1d58338cab27/image.png" alt=""></p>
<h3 id="✔️-현대-컴퓨터-구조">✔️ 현대 컴퓨터 구조</h3>
<p>: CPU의 외부적으로는 폰 노이만 구조, 내부적으로는 하버드 구조를 적용하여 속도를 향상시킨 구조를 주로 사용
: 폰 노이만 구조를 기반으로 만들어진 것이기 때문에 병목현상만 어느 정도 해결할 뿐 메모리 속의 프로그램을 순차적을 실행하는 기본적인 구조 자체는 변하지 않음</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/aca6884c-faab-4aa0-99d6-a19c6229da72/image.png" alt=""></p>
<blockquote>
<p>참고 :</p>
</blockquote>
<ul>
<li><a href="https://m.blog.naver.com/with_msip/221981730449">컴퓨터의 구조는 어떻게 생겼을까? 폰 노이만 구조</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Unity] Localization]]></title>
            <link>https://velog.io/@bae_hyeona/Unity-Localization</link>
            <guid>https://velog.io/@bae_hyeona/Unity-Localization</guid>
            <pubDate>Tue, 21 Jan 2025 08:31:58 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-setting">📌 Setting</h1>
<ol>
<li>Window &gt; Package Manager &gt; Localization Package 다운</li>
<li>Project Setting &gt; Localization 들어간 후, Setting 생성
(Localization Folder 따로 만들고 저장)</li>
<li>Project Setting &gt; Locale Generator &gt; 필요한 Language 선택
(Language 묶음 하나를 &#39;<strong>LOCALE</strong>&#39;이라 부름)</li>
<li>Specific Locale Selector / Project Locale Identifier 에 LOCALE 할당
(할당한 언어 : Defualt Language)</li>
</ol>
<p></br></br></p>
<hr>
<h1 id="📌-다국어-자료-입력">📌 다국어 자료 입력</h1>
<ol>
<li>Window &gt; Asset Management &gt; Localization Table</li>
<li>New table Collection &gt; String Table Collection &gt; Name 작성 및 생성
(Table : 다국어 자료 입력하는 DB / <em>Tables 파일 만들고 저장해두기!</em>)</li>
<li>Key 만들고 각 언어별 Text 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/2c3b7d85-3ff0-4c71-b2cc-49679b288b46/image.png" alt=""></p>
<p></br></br></p>
<hr>
<h1 id="📌-다국어-설정-적용">📌 다국어 설정 적용</h1>
<ol>
<li>원하는 Text에 &#39;Localize String Event&#39; 컴포넌트 추가</li>
<li>String Reference에 생성한 Table 할당</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/c43157b0-b294-4849-9cde-3b5adfa1902d/image.png" alt=""></p>
<hr>
<h1 id="📌-사용-방법">📌 사용 방법</h1>
<h2 id="⭐️-게임설정-ui에서-적용">⭐️ 게임설정 UI에서 적용</h2>
<ul>
<li><code>LocalizationSettings.AvailableLocales.Locales[index]</code></li>
<li><blockquote>
<p>Index 값을 받아 사용자가 지정한 언어로 변경</p>
</blockquote>
</li>
<li><blockquote>
<p>Index 값의 순서는 Tables 창에서 표시되는 언어의 순서대로 지정하면 되며, 시작은 0번부터</p>
</blockquote>
</li>
</ul>
<pre><code class="language-cpp">using UnityEngine.Localization;
using UnityEngine.Localization.Settings;

public void UserLocalization(int index) {
    LocalizationSettings.SelectedLocale = 
        LocalizationSettings.AvailableLocales.Locales[index];
}</code></pre>
<h2 id="⭐️-동적으로-적용">⭐️ 동적으로 적용</h2>
<h3 id="예시--상점내-아이템-정보">예시 : 상점내 아이템 정보</h3>
<ol>
<li><strong>Localize String Event Component</strong>만 추가해 주고 String Reference는 설정하지 않음</li>
</ol>
</br>

<p>아래와 같이 아이템의 데이터가 다음과 같다면 Item 테이블을 만든 다음 Key 값으로 ItemName을 넣어줌</p>
<pre><code class="language-cpp">public class Item : ScriptableObject {
    public string itemID;
    public string itemName;
    public Sprite itemImage;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/ee0eb0c8-968a-4522-8857-06510efa58e1/image.png" alt=""></p>
</br>

<p>이후, &#39;<strong>LocalizeItem</strong>&#39; 스크립트 생성후 다음과 같이 코드 작성
-&gt; <code>string tableName</code> : 바로 위에서 만들어 두었던 Item 내용의 번역이 들어가 있는 Table명
-&gt; <code>Item itemValue</code> : Table에서 key 값으로 사용될 itemName을 받음
-&gt; 입력받은 Table 명과 Table의 key 값을 찾아 Localize String Event의 String Reference에 적용시켜 줌</p>
<pre><code class="language-cpp">using UnityEngine;
using UnityEngine.Localization.Components;

public class LocalizeItem : MonoBehaviour {
    public void LocalizeTextString(string tableName, Item itemValue) {
        GetComponent&lt;LocalizeStringEvent&gt;().StringReference
            .SetReference(tableName, itemValue.itemName);
    }
}</code></pre>
<p>Item과 관련된 스크립트에서 위에서 작성한 스크립트의 함수를 가져와 적용시켜줌</p>
<pre><code class="language-cpp">public class ItemCard : MonoBehaviour {
    [Header(&quot;Localize Text&quot;)] 
    public LocalizeItem localizeTitle;

    Item item;

    void Start() {
        localizeTitle.LocalizeTextString(&quot;Item&quot;, item.itemName);
    }
}</code></pre>
<hr>
<blockquote>
<p>참고 링크 :</p>
</blockquote>
<ul>
<li><a href="https://geojun.tistory.com/77">유니티 (Unity) - 게임에 다중 언어 (Localization) 적용하기</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 프레임워크 vs 라이브러리]]></title>
            <link>https://velog.io/@bae_hyeona/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-vs-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</link>
            <guid>https://velog.io/@bae_hyeona/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-vs-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</guid>
            <pubDate>Tue, 21 Jan 2025 08:09:03 GMT</pubDate>
            <description><![CDATA[<hr>
<h1 id="개요">개요</h1>
<p>평소 개발을 진행하면서 프레임워크와 라이브러리를 많이 사용하는데, 이 둘의 차이점을 잘 알지 못하고 있었다. 이에 인터넷으로 여러 사람들의 블로그 내용을 정리하면서 둘의 차이점을 확실하게 알고자 글을 작성하게 되었다.</p>
</br>

<hr>
<h2 id="📌-프레임워크">📌 프레임워크</h2>
<p>: 원하는 기능 구현에 집중하여 개발할 수 있도록 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대
: 앱/서버 등의 구동, 메모리관리, 이벤트 루프 등 공통된 부분은 프레임워크가 관리하고, 사용자는 프레임워크가 정해준 방식대로 클래스, 메소드를 구현</p>
<ul>
<li>자유도 : 낮음</li>
<li>거의 모든 기능을 제공</li>
</ul>
</br>

<h3 id="⭐️-기능">⭐️ 기능</h3>
<ol>
<li><strong>코드 재사용성</strong> : 공통 기능을 제공하여 코드 재사용에 용이</li>
<li><strong>일정한 구조 제공</strong> : 애플리케이션의 구조를 정의하여 개발자가 그 구조를 따르도록 함</li>
<li><strong>모듈화</strong> : 기능을 모듈화하여 독립적인 컴포넌트로 나눌 수 있게 함</li>
<li><strong>생산성 향상</strong> : 반복적인 작업을 자동화하고 개발 생산성을 높임</li>
<li><strong>유지보수성</strong> : 일관된 코드 구조를 유지하여 유지보수성을 향상</li>
</ol>
</br>

<h3 id="⭐️-종류">⭐️ 종류</h3>
<ul>
<li>Java 서버 개발 : <strong>Spring</strong></li>
<li>Python 서버 개발 : <strong>Django, Flask</strong></li>
<li>안드로이드 앱 개발 : <strong>Android</strong></li>
<li>아이폰 앱 개발 : <strong>Cocoa Touch</strong></li>
<li>웹 개발 : <strong>Angular, Vue.js</strong> 등</li>
<li>Java 기반의 JSP : <strong>Struts</strong></li>
<li>루비로 작성된 MVC패턴을 이용 : <strong>Ruby on Rails</strong></li>
</ul>
<p></br></br></p>
<hr>
<h2 id="📌-라이브러리">📌 라이브러리</h2>
<p>: 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임
: 특정 기능을 모와둔 코드, 함수들의 집합이며 코드 작성 시 활용 가능한 도구
: 미리 작성된 코드, 변수, 함수, 클래스가 포함된다.</p>
<ul>
<li>자유도 : 높음</li>
<li>기본 기능 외 제공 X</li>
</ul>
</br>

<h3 id="⭐️-기능-1">⭐️ 기능</h3>
<ol>
<li><strong>코드 재사용성</strong>: 특정 작업을 처리하는 코드의 재사용을 촉진</li>
<li><strong>추상화</strong>: 복잡한 작업을 간단한 함수 호출로 추상화</li>
<li><strong>모듈화</strong>: 기능별로 모듈화되어 필요에 따라 가져다 쓸 수 있음</li>
<li><strong>유연성</strong>: 개발자가 필요에 따라 라이브러리를 선택하여 사용할 수 있음</li>
</ol>
</br>

<h3 id="⭐️-종류-1">⭐️ 종류</h3>
<ul>
<li><strong>TensorFlow</strong>: 머신러닝과 딥러닝을 위한 Python 라이브러리</li>
<li><strong>Pandas</strong>: 데이터 분석과 조작을 위한 Python 라이브러리</li>
<li><strong>NumPy</strong>: 수치 계산을 위한 Python 라이브러리</li>
<li><strong>jQuery</strong>: HTML 문서 탐색 및 조작, 이벤트 처리, 애니메이션, Ajax를 쉽게 처리할 수 있게 하는 JavaScript 라이브러리</li>
<li><strong>Lodash</strong>: JavaScript 유틸리티 라이브러리로서 배열, 객체, 문자열 등 다양한 작업을 편리하게 처리할 수 있게 해</li>
</ul>
<p></br></br></p>
<hr>
<h2 id="✔️-프레임워크-vs-라이브러리">✔️ 프레임워크 vs 라이브러리</h2>
<h3 id="🌱-프레임워크">🌱 프레임워크</h3>
<ul>
<li><p>주도권 : <strong>프레임워크</strong></p>
</li>
<li><blockquote>
<p>프레임워크가 제공하는 기능을 이용하거나 허용하는 범위 내에서만 추가 도구 사용 가능</p>
</blockquote>
</li>
<li><p>프레임워크는 모델하우스를 짓는것에 비유할 수 있다. 모델하우스의 소파의 위치, 의자와 책상의 위치, 방의 용도 등. 우리가 수정할 수 있는 범위는 제한적이다. 주방의 위치, 기둥의 개수, 방의 개수 등 집을 이루고있는 굵직한 뼈대는 수정할 수 없다. 사용자는 모델하우스가 제공하는 청사진 안에서&quot;만&quot; 움직일 수 있다. 프레임워크가 제공하는 틀에 따라 코드를 작성해야 하는것이다.</p>
</li>
</ul>
</br>

<h3 id="🌱-라이브러리">🌱 라이브러리</h3>
<ul>
<li><p>주도권 : <strong>개발자</strong></p>
</li>
<li><blockquote>
<p>기능 구현을 원하는 방향으로 진행</p>
</blockquote>
</li>
<li><blockquote>
<p>쓰고싶은 도구, 쓰고싶은 기술 사용</p>
</blockquote>
</li>
<li><p>라이브러리는 이케아에서 산 재료로 가구를 조립하는것에 비유할 수 있다. 집에서 사용할 가구를 조립하거나 만들기 위해 벌목부터 시작해서 목공을 하거나, 가죽을 얻기위해 사냥을 하고싶은 사람은 거의 없을것이다. 그래서 이케아 혹은 가구점에 가서 기본적인 재료를 사서 입맛대로 조립하고 배치할 수 있다.</p>
</li>
</ul>
</br>

<blockquote>
<p><strong>[ 토비의 스프링 中 ]</strong></p>
</blockquote>
<ul>
<li>프레임워크는 단지 미리 만들어준 반제품이나, 확장해서 사용할 수 있도록 준비된 추상 라이브러리의 집합이 아니다. 프레임워크가 어떤 것인지 이해하려면 라이브러리와 프레임워크가 어떻게 다른지 알아야 한다.</li>
<li><strong>라이브러리</strong>를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다.
단지 동작하는 중에 필요한 기능이 있을 때 능동적으로 라이브러리를 사용할 뿐이다.</li>
<li><strong>프레임워크</strong>는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다.
프레임워크에는 분명한 [제어의 역전] 개념이 적용되어 있어야 한다.</li>
<li>애플리케이션 코드는 프레임워크가 짜 놓은 틀에서 수동적으로 동작해야 한다.</li>
</ul>
<p></br></br></p>
<hr>
<h2 id="❗️-정리">❗️ 정리</h2>
<h3 id="공통점"><strong>공통점</strong></h3>
<ul>
<li><p>코드 작성에 도움이 되는 타인이 작성한 코드의 집합</p>
<h3 id="차이점"><strong>차이점</strong></h3>
</li>
<li><p>어플리케이션의 <strong>Flow(흐름)</strong>를 누가 가지고 있는가</p>
</li>
<li><p><strong>프레임워크</strong></p>
<ul>
<li>프로그램이 필요한것을 개발자에게 알려줌으로써 제어권을 역전</li>
<li>전체적인 흐름을 프레임워크가 쥐고 있으며 사용자는 그 안에 필요한 코드를 짜 넣으면 됨
(틀안에 제어 흐름에 대한 주도성 내포)</li>
<li>전체 어플리케이션의 구조를 정의하여 일정한 개발 패턴을 따르게 함</li>
</ul>
</li>
<li><p><strong>라이브러리</strong></p>
<ul>
<li>개발자가 필요할 때 마다 설치, 혹은 호출함으로써 개발자가 능동적으로 사용</li>
<li>사용자가 전체적인 흐름을 직접 만들고 필요에 따라 라이브러리를 가져다 씀
(사용자가 전적으로 제어 흐름에 대한 주도성 가짐)</li>
<li>특정 기능만을 제공할 뿐 어플리케이션의 전체 구조에는 관여하지 않음
(개발자 스스로 원하는 방식으로 구조 설계 가능)</li>
</ul>
</li>
</ul>
</br>




<p></br></br></br></p>
<blockquote>
<p>참고 링크 : </p>
</blockquote>
<ul>
<li><a href="https://idkim97.github.io/2022-08-16-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%20vs%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/#-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AClibrary%EB%9E%80">테드의 테크 블로그 </a></li>
<li><a href="https://velog.io/@whitecloud94/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-vs-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC">프레임워크 vs 라이브러리</a></li>
<li><a href="https://cocoon1787.tistory.com/745">[개발상식] 프레임워크(Framework)와 라이브러리(Library)의 차이</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 변수, 함수]]></title>
            <link>https://velog.io/@bae_hyeona/C-%EB%B3%80%EC%88%98-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@bae_hyeona/C-%EB%B3%80%EC%88%98-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 28 Mar 2024 12:10:06 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-변수">📌 변수</h1>
<ul>
<li>사용 : <strong>선언</strong>(<em>declaration</em>)과 <strong>정의</strong>(<em>definition</em>)</li>
</ul>
<hr>
<h2 id="1-지역변수local-variable">1. 지역변수(Local variable)</h2>
<p>: 함수 내부에서 선언되며 해당 함수가 호출되어 실행되면 생성되었다가 함수가 종료되면 사라지는 변수
: 해당 범위 내에서만 사용 가능하며 다른 함수에서는 접근이 불가하다.</p>
<hr>
<h2 id="2-전역변수global-variable">2. 전역변수(Global variable)</h2>
<p>: 함수 외부에서 선언되며 범위(스코프)에 구애받지 않고 프로그램 전체에서 접근할 수 있는 변수</p>
<hr>
<h2 id="3-정적변수">3. 정적변수</h2>
<hr>
<h2 id="4-외부변수">4. 외부변수</h2>
<hr>
<h1 id="📌-함수">📌 함수</h1>
<p>✔️ 함수 사용 이유 : 기능을 하나의 모듈화 시켜놓고 계속해서 사용할 수 있도록 만들기 위하여</p>
<h2 id="1-함수-오버로딩">1. 함수 오버로딩</h2>
<p>: 함수의 중복 정의
: 함수명이 같고 매개 변수의 타입이나 개수가 다른 함수를 허용하는 것
(즉, 함수명이 같아도 전달받는 인자의 개수나 타입이 다르면 서로 다른 함수로 인식한다.)</p>
<blockquote>
<p> ❗️ 리턴타입이 다른 것만으로는 허용되지 않는다!</p>
</blockquote>
<h2 id="2-함수-오버라이딩">2. 함수 오버라이딩</h2>
<p>: 함수의 재정의 (상속에서의 중요한 정의 중 하나)
: 함수를 자식 클래스가 재정의할 수 있게 해주는 기능
(<em>override</em> : 무시하다, 거절하다, 무효로 하다, 뒤엎다 등)</p>
<h2 id="3-재귀-함수">3. 재귀 함수</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] Character Set의 종류]]></title>
            <link>https://velog.io/@bae_hyeona/CS-%EC%95%84%EC%8A%A4%ED%82%A4-%EC%9C%A0%EB%8B%88-%EC%BD%94%EB%93%9C-%EB%A9%80%ED%8B%B0-%EB%B0%94%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@bae_hyeona/CS-%EC%95%84%EC%8A%A4%ED%82%A4-%EC%9C%A0%EB%8B%88-%EC%BD%94%EB%93%9C-%EB%A9%80%ED%8B%B0-%EB%B0%94%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Fri, 23 Feb 2024 08:30:35 GMT</pubDate>
            <description><![CDATA[<h3 id="📌-아스키-코드-sbcs-single-byte-character-set">📌 아스키 코드 (SBCS, <em>Single Byte Character Set</em>)</h3>
<p>: 최초의 문자열 인코딩 (<strong>ASCII</strong>, American Standard Code for Information Interchange), 미국 정보 교환 표준
: 7bit로 구성되어 있으며, 영어를 위한 문자, 숫자, 특수문자, 기호 등 128개 문자를 표현할 수 있다.
: 모든 문자를 <strong>1Byte</strong>로 간주 (0-255의 범위 내에 있다.)</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/45ee6dcf-a777-4161-9c83-7739fbbce8e2/image.png" alt=""></p>
<h4 id="1-장점">1. 장점</h4>
<ul>
<li>알파벳(대문자, 소문자)들과 확장 문자를 포함하여 총 256개를 넘지 않는 문자로 이루어져 있다.</li>
<li>1Byte(는 256가지의 표현이 가능)를 가지고 충분히 표현할 수 있기에 1Byte의 char형을 사용해서 표현을 할 수 있다.</li>
</ul>
</br>

<h4 id="2-단점">2. 단점</h4>
<ul>
<li>아스키 문자 코드만으로는 한글이나 일어 등의 <strong>다른 문자를 표시할 수 없다.</strong></li>
<li>SBCS로는 프로그램을 <strong>국제화</strong>(<em>Internationalization</em>(i18n))<strong>할 수 없다.</strong></li>
</ul>
<p></br></br></p>
<hr>
<h3 id="📌-유니-코드-wbcs-wide-byte-character-set">📌 유니 코드 (WBCS, <em>Wide Byte Character Set</em>)</h3>
<p>: 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준 (유니코드 협회 제정)
: 모든 문자를 <strong>2Byte</strong>로 간주 (주의 : 인코딩에 따라 가변적으로 적용됨)
: 모든 코드값이 일괄적으로 16비트로 할당
: 대표적인 인코딩 방법 : UTF-</p>
<p></br></br></p>
<h4 id="1-장점-1">1. 장점</h4>
<ul>
<li>유니코드는 지구상에서 통용되는 대부분의 문자들을 담고 있다.</li>
<li>2Bytes를 사용하므로 65536개의 표현 범위 덕분에 아스키 코드가 가지는 한계 극복</li>
</ul>
</br>

<h4 id="2-단점-1">2. 단점</h4>
<ul>
<li>아스키코드의 Char은 1바이트, 유니코드의 Char은 2바이트이기 때문에 printf , scanf 등의 함수는 유니코드와 맞지 않는다.
(함수 사용을 위해서는 wprint등 새로 정의된 다른 함수를 사용해야 한다.)</li>
</ul>
<p></br></br></p>
<hr>
<h3 id="📌-멀티-바이트-코드-mbcs-multi-byte-character-set">📌 멀티 바이트 코드 (MBCS, <em>Multi Byte Character Set</em>)</h3>
<p>: 1Byte만으로는 표현되지 않는 언어들을 표현하기 위해 만들어진 개념 (MicroSoft에서 만든 표준)
: 영어 <strong>1Byte</strong>, 한글 <strong>2Byte</strong>로 간주
: 유니코드가 생기기 이전 다국어를 표현하기 위해 사용했던 방식
: MBCS는 SBCS와 DBCS를 묶어놓은 Character Set이다.</p>
<blockquote>
<p>✔️ <strong>DBCS</strong>
: 하나의 문자세트에 부여된 글자값이 두 바이트 (0-65535의 범위 내에 있다.)
: 8비트로 처리할 수 없을 정도로 문자의 종류가 많은 중국, 한국, 일본 그리고 대만 등에서 주로 사용한다.</p>
</blockquote>
<ul>
<li>ANSI, UTF-8 포함</li>
</ul>
<p></br></br></p>
<h4 id="1-장점-2">1. 장점</h4>
<ul>
<li>특정 문자 집합마다의 코드페이지가 존재하여 영어 이외의 나라 문자 표현이 가능하다.</li>
</ul>
</br>


<blockquote>
<p>✔️ <strong>ANSI(<em>American National Standard Institute</em>)</strong>
: <strong>8bit</strong>로 구성되어 있으며 <strong>256개의 문자를 표현</strong>할 수 있다.
: ASCII의 확장판으로 ASCII에서 1bit를 더 사용한다.
(앞 7bit는 ASCII와 동일하고, 뒤에 1bit를 이용하여 다른 언어의 문자를 표현한다.)
: 새로 추가 된 128개 문자로는 모든 언어의 문자를 표현할 수 없어서 <strong>코드페이지</strong>가 생겼다.
(각 언어별로 Code 값을 주고, Code마다 다른 문자열 표를 의미하도록 약속)</p>
</blockquote>
<ul>
<li><strong>ANSI = ASCII(7bit) + CodePage(1bit)</strong></li>
</ul>
<blockquote>
<p>✔️ <strong>코드페이지(<em>Code Page</em>)</strong>
: 마이크로소프트 테크넷에 게재된 각종 컴퓨터용 코드
: 특정 문자 인코딩 테이블을 위해 쓰이는 전통적인 IBM 용어</p>
</blockquote>
<ul>
<li><strong>문자 인코딩 테이블</strong> : 0부터 255까지의 정수를 표현하는 <strong>단일 옥텟</strong>(<em>Octet, 바이트</em>)이라고 불리는 일련의 비트들이 특정한 문자와 결합하여 도표화(Mapping)한 것</li>
</ul>
</br>

<h4 id="2-단점-2">2. 단점</h4>
<ul>
<li>ASCII를 제외하고는 각 DBCS들이 모두 다르다.</li>
</ul>
<p></br></br></p>
<hr>
<h3 id="📌-t-매크로">📌 T 매크로</h3>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/1c929876-b23d-48ff-8546-b91fe0d8526a/image.png" alt=""></p>
<blockquote>
<p> ❗️ 문자를 처리할 때</p>
</blockquote>
<ul>
<li><strong>멀티 바이트</strong> : 기본적으로 <code>Char</code> 사용</li>
<li><strong>유니 코드</strong> : <code>wchar_t</code> 사용</li>
</ul>
</br>


<blockquote>
<p>참고: 이쿠의 슬기로운 개발생활:티스토리 | <a href="https://ikcoo.tistory.com/227">https://ikcoo.tistory.com/227</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 동계 모각소] 6주차]]></title>
            <link>https://velog.io/@bae_hyeona/2023-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-6%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@bae_hyeona/2023-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-6%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 18 Feb 2024 12:53:00 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-컨테이너-어댑터">📌 컨테이너 어댑터</h2>
<p>: 기존 컨테이너의 인터페이스를 제한하여 만든 기능이 제한되거나 변형된 컨테이너</p>
</br>

<blockquote>
<p>✔️ 기존 컨테이너를 감싸는 <strong>래퍼를 제공하는 몇 가지 이유</strong></p>
</blockquote>
<ul>
<li>코드에 좀 더 의미를 부여하고 싶은 경우</li>
<li>의도하지 않는 함수를 실수로 사용하지 못하도록 제한하고 싶은 경우</li>
<li>특별한 인터페이스를 새롭게 제공하고 싶은 경우</li>
</ul>
<p></br></br></p>
<h3 id="❓-스택-stack">❓ 스택 (<em>stack</em>)</h3>
<p>: 데이터 처리와 보관을 위해 LIFO(Last In Fist Out, 후입선출) 구조를 사용한다.</p>
</br>

<p>✔️ <strong>기능적 측면</strong> : 컨테이너의 한쪽 끝에서만 데이터를 삽입하거나 삭제할 수 있으며, 한쪽 끝이 아닌 위치에 있는 데이터는 접근하거나 변경할 수 없다.</p>
<ul>
<li>벡터나 덱은 이러한 기능을 기본적으로 지원하기 때문에 스택을 구현하기 위한 용도로 사용할 수 있다. 
❗️ 벡터나 덱을 직접 스택처럼 사용하기에는 약간의 문제가 있다.</li>
</ul>
<pre><code class="language-cpp">std::deque&lt;int&gt; stk1;
stk1.push_back(1);            // 스택에 1 추가: {1}
stk1.push_back(2);            // 스택에 2 추가: {1, 2}
stk1.pop_back();            // 스택에서 맨 위 원소 제거: {1}
stk1.push_front(0);            // 원래 스택에서는 지원하지 않는 동작입니다. : {0, 1}


std::stack&lt;int&gt; stk2;
stk2.push(1);                // 스택에 1 추가: {1}
stk2.push(2);                // 스택에 2 추가: {1, 2}
stk2.pop();                    // 스택에서 맨 위 원소 제거: {1}
stk2.push_front(0);            // 컴파일 에러!</code></pre>
<ul>
<li><p><code>std::deque</code>을 사용하여 스택 객체 stk1을 만들어 사용</p>
</li>
<li><blockquote>
<p>이 경우 <em><strong>push_front()</strong></em> 함수처럼 스택에서 사용하면 안 되는 명령 코드를 작성하는 것을 막을 수 없다.</p>
</blockquote>
</li>
<li><blockquote>
<p><em><strong>push_back()</strong>_과 _<strong>pop_back()</strong></em> 같은 함수 이름은 자료 구조 맨 뒤에 데이터를 추가하거나 삭제한다는 의미인데, 스택으로 사용할 때에는 어느 위치에 데이터가 저장되는지는 알 필요가 없다.</p>
</blockquote>
</li>
<li><p><code>std::stack</code>을 사용하여 작성된 소스 코드는 어떤 작업을 하고 있는지 좀 더 직관적으로 알 수 있다.</p>
</li>
<li><blockquote>
<p>의도하지 않은 동작을 지시하거나 실수로 코드를 잘못 작성하는 경우가 발생하지 않게 된다.</p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h3 id="1-stdstack">1. std::stack</h3>
<p>: <code>std::deque</code>으로 만든 간단한 래퍼 (<strong>기본 컨테이너</strong> : <code>std::deque</code>)
: 스택 자료 구조에서 꼭 필요한 인터페이스만을 제공</p>
</br>

<p>✔️ 관련 함수 : <em><strong>empty(), size(), top(), push(), pop(), emplace()</strong></em>
-&gt; <em><strong>push()</strong></em> : 기본 컨테이너의 <strong>push_back()</strong> 함수를 사용하여 구현
-&gt; <em><strong>pop()</strong></em> : <strong>pop_back()</strong> 함수를 사용하여 구현
-&gt; <em><strong>top()</strong></em> : 기본 컨테이너의 <strong>back()</strong> 함수 사용 (스택에서 맨 위에 있는 데이터가 덱 구조에서는 맨 끝에 있는 원소이기 때문이다.)</p>
</br>

<p>이처럼 기본 컨테이너의 <strong>한쪽 끝에서만</strong> 원소의 추가 및 삭제를 수행함으로써 <strong>LIFO 특징</strong>을 제공한다.</p>
</br>

<blockquote>
<p>✔️ <strong>스택의 모든 연산 시간 복잡도</strong> : O(1)</p>
</blockquote>
<ul>
<li>스택에서 기본 컨테이너로 함수 호출을 전달하는 과정은 컴파일러의 최적화에 의해 모두 인라인(<em>inline</em>) 형식으로 호출될 수 있어서 여기서 발생하는 오버헤드는 없다.</li>
</ul>
<p></br></br></p>
<h3 id="2-stdqueue">2. std::queue</h3>
<p>: <strong>FIFO</strong>(First In First Out, 선입선출) 구조</p>
</br>

<p>✔️ 스택과 비슷한 형태의 함수를 지원하며, LIFO 대신 FIFO를 지원하기 위해 그 의미와 동작이 조금 다르게 정의되어 있다.
-&gt; <em><strong>push()</strong></em> : <code>std::stack</code>에서의 <strong>push_back()</strong>
-&gt; <em><strong>pop()</strong></em> : <strong>pop_front()</strong>
-&gt; 원소를 제거하는 pop() 함수와 달리, 단순히 양 끝단에 있는 원소에 접근하고 싶을 때에는 <em><strong>front()</strong></em> 또는 <em><strong>back()</strong></em> 함수를 사용한다.</p>
<pre><code class="language-cpp">std::queue&lt;int&gt; q;
q.push(1);                    // 맨 뒤에 1을 추가: {1}
q.push(2);                    // 맨 뒤에 2를 추가: {1, 2}
q.push(3);                    // 맨 뒤에 3을 추가: {1, 2, 3}
q.pop();                    // 맨 앞 원소를 제거: {2, 3}
q.push(4);                    // 맨 뒤에 4를 추가: {2, 3, 4}</code></pre>
<blockquote>
<p>✔️ <strong>앞서 사용한 모든 함수의 시간 복잡도</strong> : O(1)</p>
</blockquote>
<p></br></br></p>
<h3 id="3-stdpriority_queue">3. std::priority_queue</h3>
<p>: 우선순위 큐(priority queue)는 힙(heap)이라고 부르는 매우 유용한 구조를 제공</p>
<blockquote>
<p>✔️ 힙
: 컨테이너에서 가장 작은(또는 가장 큰) 원소에 빠르게 접근할 수 있는 자료 구조
-&gt; 최소/최대 원소에 접근하는 동작은 <strong>O(1)</strong>의 시간 복잡도를 가진다.
-&gt; <strong>원소 삽입</strong>은 <strong>O(log n)</strong> 시간 복잡도로 동작하며, 원소 제거는 최소/최대 원소에 대해서만 가능하다.</p>
</blockquote>
<p><br/><br/></p>
<h3 id="📌-백준-문제-풀이">📌 백준 문제 풀이</h3>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/30d0c147-702d-49e7-a883-7da05a1f90f6/image.png" alt=""></p>
<p><br/><br/></p>
<h3 id="📌-24-1-게임-개발-프로젝트-기획안-작성">📌 24-1 게임 개발 프로젝트 기획안 작성</h3>
<h4 id="아이디어-브레인스토밍-및-backlogs--sprint-작성">&lt;아이디어 브레인스토밍 및 Backlogs &amp; Sprint 작성&gt;</h4>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/014d6b74-4c14-41a2-8f89-e12327f42f7b/image.png" alt=""></p>
<h4 id="게임-기획안-목차">&lt;게임 기획안 목차&gt;</h4>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/ff73fed1-bffa-4fbc-8f54-b3896719f176/image.png" alt=""></p>
<h4 id="회의-진행도">&lt;회의 진행도&gt;</h4>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/5a336fe7-7d69-4d2c-9a53-2b2d93938b6f/image.png" alt=""></p>
<blockquote>
<p>✔️ 현재 게임 개발 진행중이므로 자세한 게임 기획안은 올리지 않음을 알립니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 동계 모각소] 5주차]]></title>
            <link>https://velog.io/@bae_hyeona/2023-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-5%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@bae_hyeona/2023-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-5%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Thu, 08 Feb 2024 06:08:22 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-stdlist">📌 std::list</h2>
<p>: 양쪽 방향으로 연결된 리스트
: <strong>이중 연결 리스트</strong>(<em>double-linked list</em>) 구조</p>
<blockquote>
<p>✔️ <code>std::forward_list</code>에 비해 메모리를 조금 더 사용한다!</p>
</blockquote>
</br>

<h3 id="1-노드-기본-형태">1. 노드 기본 형태</h3>
<pre><code class="language-cpp">struct doubly_linked_list_node
{
    int data;
    doubly_linked_list_node* next;
    doubly_linked_list_node* prev;
};</code></pre>
<p>✔️ 이중 연결 리스트 노드는 이전 노드를 가리키는 <strong>포인터</strong>가 있다.
-&gt; 포인터를 이용하여 <strong>역방향</strong>으로 이동할 수 있으며, <strong>맨 마지막 원소</strong>와 <strong>리스트 크기</strong>를 <strong>따로 저장</strong>하여 빠른 <code>pushback()</code> 또는 <code>size()</code> 함수를 지원할 수 있다.</p>
<p>✔️ 템플릿 매개변수로 사용자 정의 할당자를 지정할 수 있다.</p>
<p><br/><br/></p>
<h3 id="2-stdlist-멤버-함수">2. std::list 멤버 함수</h3>
<p>✔️ 대부분의 함수가 <code>std::forward_list</code>와 같거나 유사하지만, 약간의 차이가 있다.</p>
<p>1) <code>std::forward_list</code>에서 <strong>_after</strong>로 끝나는 함수는 <code>std::list</code>에서 <strong>_after</strong>로 끝나지 않는 형태로 바뀐다.
-&gt; <strong><em>insert_after()</em></strong>와 <strong><em>emplace_after()</em></strong> 함수는 <em><strong>insert()</strong>_와 _<strong>emplace()</strong></em> 함수와 대응된다.</p>
<p>2) <code>std::list</code>에서는 원소 이동을 <strong>역방향</strong>으로도 할 수 있으므로 원소 삽입을 위해 특정 원소의 이전 원소 반복자를 제공하지 않아도 된다. (대신 정확하게 새로운 원소가 삽입될 위치를 가리키는 반복자를 함수 인자로 전달한다.)</p>
<p>3) <code>std::list</code>는 빠른 <strong>push_back(), emplace_back(), pop_back()</strong> 함수를 제공한다.</p>
<p></br></br></p>
<p><strong>&lt;원소 삽입 및 삭제를 위한 코드 작성 방법&gt;</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

int main()
{
    //리스트 생성 및 새로운 원소 추가
    std::list&lt;int〉 list1 = {1, 2, 3, 4, 5};
    list1.push_back(6);                            // {1, 2, 3, 4, 5, 6}
    list1.insert(next(list1.begin()), 0);        // {1, 0, 2, 3, 4, 5, 6}
    list1.insert(list1.end(), 7);                // {1, 0, 2, 3, 4, 5, 6, 7}

    //리스트 맨 뒤 원소 제거
    list1.pop_back();                            // {1, 0, 2, 3, 4, 5, 6}
    std::cout &lt;&lt; &quot;삽입 &amp; 삭제 후 리스트: &quot;;
    for (auto i : list1)
        std::cout &lt;&lt; i &lt;&lt; &quot; &quot;;
}</code></pre>
<p>✔️ <strong>출력 결과</strong></p>
<ul>
<li>삽입 &amp; 삭제 후 리스트: 1 0 2 3 4 5 6</li>
</ul>
<blockquote>
<p>❗️ 이중 연결 리스트에서 포인터를 관리하기 위해서는 단일 연결 리스트보다 대략 <strong>두 배의 연산을 수행</strong>해야 한다.</p>
</blockquote>
<blockquote>
<p>✔️ <code>std::forward_list</code>와 <code>std::list</code>의 push_front(), insert(), pop_front(), erase() <strong>함수 시간 복잡도는 서로 같지만</strong>, 실제로는 <code>std::list</code>에서 좀 <strong>더 많은 연산이 필요</strong>하다.
-&gt; 이유 : <code>std::list</code>는 각각의 노드에 <strong>두 개의 포인터</strong>를 가지고 있고, <strong>삽입 또는 삭제 연산 시 두 개의 포인터를 관리해야 하기 때문</strong>이다.</p>
</blockquote>
<p><br/><br/></p>
<h3 id="2-양방향-반복자">2. 양방향 반복자</h3>
<ul>
<li>std::list의 반복자는 배열 기반의 임의 접근 반복자와 std::forward_list 기반의 순방향 반복자 중간 정도의 유연성을 가지고 있다.</li>
</ul>
<p><br/><br/></p>
<h3 id="📌-백준-문제-풀이">📌 백준 문제 풀이</h3>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/77612af0-6780-4fa0-be01-e0a2a78e9248/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 메모리 구조]]></title>
            <link>https://velog.io/@bae_hyeona/CS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@bae_hyeona/CS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Wed, 07 Feb 2024 12:41:30 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-메모리-공간">📌 메모리 공간</h1>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/6d927d1e-a7bf-4c04-af8f-43f1a771168a/image.png" alt=""></p>
</br>
---
## 1. 코드(code) 영역
: 실행할 프로그램의 코드가 저장되는 영역 (텍스트 영역이라고도 부른다.)
: **CPU**는 코드 영역에 저장된 명령어를 하나씩 가져가서 **처리**하게 된다.


</br>

<hr>
<h2 id="2-데이터data-영역">2. 데이터(data) 영역</h2>
<p>: <strong>전역/정적변수</strong> 저장
: 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.</p>
</br>

<hr>
<h2 id="3-스택stack-영역">3. 스택(stack) 영역</h2>
<p>: 함수의 호출과 관계되는 <strong>지역 변수</strong>와 <strong>매개변수</strong>가 저장되는 영역데이터 구조를 저장하는 데 사용되는 메모리 영역
: 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.</p>
<blockquote>
<p>✔️ <strong>스택 프레임(<em>stack frame</em>)</strong>
: 스택 영역에 저장되는 함수의 호출 정보</p>
</blockquote>
</br>

<h3 id="1-동작">(1) 동작</h3>
<p>: <strong>푸시</strong>(push) 동작으로 데이터를 저장하고, <strong>팝</strong>(pop) 동작으로 데이터를 인출한다.</p>
<ul>
<li><p><strong>후입선출</strong>(LIFO, Last-In First-Out) 방식 사용</p>
</li>
<li><blockquote>
<p>가장 늦게 저장된 데이터가 가장 먼저 인출된다.</p>
</blockquote>
</li>
<li><p>메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.</p>
</li>
</ul>
</br>

<h3 id="2-장점">(2) 장점</h3>
<ul>
<li><strong>매우 빠르게 액세스</strong> 할 수 있다.</li>
<li>CPU에 의해 효율적으로 관리되므로 <strong>메모리를 수동으로 할당하거나 해제할 필요가 없다</strong>.</li>
<li><blockquote>
<p><strong>일시적으로 필요한 데이터</strong>를 저장하기에 편리하고 안전하다!</p>
</blockquote>
</li>
</ul>
</br>

<h3 id="3-단점">(3) 단점</h3>
<ul>
<li>사용 가능한 <strong>메모리가 제한</strong>되어 있다. (컴파일 시간에 결정된다.)</li>
<li><blockquote>
<p>스택이 가득차면, 스택 오버플로우가 발생하여 프로그램이 충돌될 수 있다!</p>
</blockquote>
</li>
<li><blockquote>
<p><strong>재귀 함수 호출을 피하는 것</strong>이 좋다.</p>
</blockquote>
</li>
<li>변수의 크기 조정이 불가하다.</li>
</ul>
</br>

<hr>
<h2 id="4-힙heap-영역">4. 힙(heap) 영역</h2>
<p>: 사용자가 직접 관리해야하는 영역
: 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
: 스택에 넣기에는 너무 크거나 여러 함수 또는 코드 블록에서 액세스해야 하는 데이터 구조를 저장하는 데 사용되는 메모리 영역</p>
<ul>
<li>메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.</li>
</ul>
</br>

<h3 id="2-장점-1">(2) 장점</h3>
<ul>
<li>변수는 전역적으로 액세스 할 수 있다.</li>
<li>메모리 크기 제한이 없다.</li>
</ul>
</br>

<h3 id="3-단점-1">(3) 단점</h3>
<ul>
<li>엑세스가 느리다.</li>
<li>프로그래머가 <strong>메모리를 명시적으로 할당하고 해제해야 한다</strong>.</li>
<li><blockquote>
<p><strong>메모리 할당</strong> : 지정된 크기의 메모리 블록을 예약하는 <code>malloc()</code> 또는 <code>new</code> 함수 호출</p>
</blockquote>
</li>
<li><blockquote>
<p><strong>메모리 해제</strong> :  <code>free()</code> 또는 <code>delete</code> 함수 호출</p>
</blockquote>
</li>
<li>효율적으로 공간을 사용하지 않으면 <strong>메모리 문제</strong>가 일어날 수 있다.</li>
<li><blockquote>
<p><strong>메모리 누수</strong> : 메모리가 할당되었지만 해제되지 않음</p>
</blockquote>
</li>
<li><blockquote>
<p><strong>메모리 손상</strong> : 실수로 데이터를 덮어쓰거나 삭제</p>
</blockquote>
</li>
</ul>
</br>]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 입/출력]]></title>
            <link>https://velog.io/@bae_hyeona/C-%EC%9E%85%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@bae_hyeona/C-%EC%9E%85%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Wed, 07 Feb 2024 11:56:15 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-헤더파일">📌 헤더파일</h1>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;    //std::cout 하지 않고 편하기 쓰기 위해 설정</code></pre>
</br>

<hr>
<h1 id="📌-입력">📌 입력</h1>
<pre><code class="language-cpp">cin &gt;&gt; a;</code></pre>
</br>

<hr>
<h1 id="📌-출력">📌 출력</h1>
<pre><code class="language-cpp">cout &lt;&lt; a &lt;&lt; endl;      //endl은 띄어쓰기! 
                        //문자를 출력하고 싶을 시 &quot;&quot; 붙이기</code></pre>
</br>

<h2 id="✔️-활용">✔️ 활용</h2>
<h3 id="1-precision">(1) precision()</h3>
<p>: 원하는 n자리까지의 출력</p>
<pre><code class="language-cpp">cout.precision(n);</code></pre>
<blockquote>
<p><strong>✔️ 소수점 이하의 자릿수 다루기</strong></p>
</blockquote>
<pre><code class="language-cpp">cout &lt;&lt; fixed;          //소수점 이하의 n개의 수를 나타낼 것이라는 뜻
cout &lt;&lt; precision(n);</code></pre>
</br>

<h3 id="2-eof-출력">(2) EOF 출력</h3>
<pre><code class="language-cpp">cin.eof()</code></pre>
</br>

<h3 id="3-특수문자-출력">(3) 특수문자 출력</h3>
<pre><code class="language-cpp">&#39; 출력 : \&#39;
&quot; 출력 : \&quot;
\ 출력 : \\</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] break, continue]]></title>
            <link>https://velog.io/@bae_hyeona/C-break-continue</link>
            <guid>https://velog.io/@bae_hyeona/C-break-continue</guid>
            <pubDate>Wed, 07 Feb 2024 11:36:13 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-break">📌 break</h1>
<p>: 여러 반복문, 조건문을 종료시키는 역할을 한다.</p>
<blockquote>
<p>✔️ <strong>return과의 차이점</strong>
-&gt; <code>break</code> : 해당하는 반복문, 조건문에서만 종료한다.
-&gt; <code>return</code> : 해당하는 문의 <strong>전체 함수를 종료</strong>하고, 함수가 호출된 지점에서 실행을 계속한다.</p>
</blockquote>
</br>

<pre><code class="language-cpp">#include &lt;iostream&gt;

int breakOrReturn()
{
    while (true) // 무한 루프
    {
        std::cout &lt;&lt; &quot;Enter &#39;b&#39; to break or &#39;r&#39; to return: &quot;;
        char ch;
        std::cin &gt;&gt; ch;

        if (ch == &#39;b&#39;)
            break; // 루프 밖의 첫 번째 명령문에서 실행이 계속된다.

        if (ch == &#39;r&#39;)
            return 1; // return을 호출하면 함수가 호출자에게 즉시 반환된다 (이 경우 main()).
    }

    // break를 실행하면 여기서부터 실행된다. (루프 밖의 첫 번째 명령문)
    std::cout &lt;&lt; &quot;We broke out of the loop\n&quot;;

    return 0;
}

int main()
{
    int returnValue = breakOrReturn();
    std::cout &lt;&lt; &quot;Function breakOrContinue returned &quot; &lt;&lt; returnValue &lt;&lt; &#39;\n&#39;;

    return 0;
}</code></pre>
<hr>
<h1 id="📌-continue">📌 continue</h1>
<p>: 현재 루프 몸체의 끝으로 이동한다.
: 현재 반복을 일찍 종료하고 싶을 때 유용하게 쓰인다.
-&gt; coninute 문을 사용하여 일부 코드를 실행하지 않고 점프할 수 있다.</p>
<pre><code class="language-cpp">for (int count=0; count  &lt; 20; ++count)
{
    // 숫자가 4로 나눌 수 있는 경우 이 반복을 건너뛴다.
    if ((count % 4) == 0)
        continue; // 루프 몸체 끝으로 점프한다.

    // 숫자가 4로 나눌 수 없는 경우 계속된다.
    std::cout &lt;&lt; count &lt;&lt; std::endl;

    // continue 문은 여기로 이동시킨다.
}</code></pre>
<blockquote>
<p>📌 참고 : 소년코딩 블로그 | <a href="https://boycoding.tistory.com/191">https://boycoding.tistory.com/191</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 반복문 (for, while)]]></title>
            <link>https://velog.io/@bae_hyeona/C-%EB%B0%98%EB%B3%B5%EB%AC%B8-for-while</link>
            <guid>https://velog.io/@bae_hyeona/C-%EB%B0%98%EB%B3%B5%EB%AC%B8-for-while</guid>
            <pubDate>Wed, 07 Feb 2024 11:27:27 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-반복문">📌 반복문</h1>
<hr>
<h2 id="1-for-문">1. for 문</h2>
<p>: C++에서 가장 많이 사용하는 반복문
: 반복해야 하는 <strong>횟수를 정확히 알고 있을 때 사용하기 좋다</strong>.</p>
<pre><code class="language-cpp">for (초기식; 조건식; 변화식)
   statement // 반복할 명령문</code></pre>
</br>

<h3 id="1-초기식">(1) 초기식</h3>
<p>: 변수 정의와 초기화로 구성된다.
: 루프가 처음 실행될 때 한 번만 평가된다.</p>
</br>

<h3 id="2-조건식">(2) 조건식</h3>
<p>: 값이 <strong>거짓</strong>(False)로 평가되면 루프가 즉시 종료된다.
: 값이 <strong>참</strong>(True)로 평가되면 명령문이 실행된다.</p>
</br>

<h3 id="3-변화식">(3) 변화식</h3>
<p>: 명령문이 실행된 후, 평가된다.
: 초기식에서 선언한 변수를 증가 또는 감소시키는데 사용된다.</p>
</br>

<hr>
<h2 id="2-while-문">2. while 문</h2>
<p>: 표현식이 <strong>참</strong>(True)으로 평가되면 명령문이 실행된다.</p>
<pre><code class="language-cpp">while (expression)
    statement;</code></pre>
</br>

<h3 id="1-루프-변수">(1) 루프 변수</h3>
<p>: 루프가 <strong>실행된 횟수를 세는 목적</strong>으로 정의된 정수 변수 (<strong>카운터(counter)</strong>라고도 부름)</p>
<ul>
<li>count와 같이 의미 있는 <strong>고유한 이름</strong>을 사용하는 게 좋다.</li>
</ul>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main()
{
    int count = 10;

    // count from 10 down to 0
    while (count &gt;= 0)
    {
        if (count == 0)
            std::cout &lt;&lt; &quot;blastoff!&quot;;
        else
            std::cout &lt;&lt; count &lt;&lt; &quot; &quot;;
        --count;
    }

    return 0;
}</code></pre>
</br>

<h3 id="2-무한-루프">(2) 무한 루프</h3>
<p>: 표현식이 항상 <code>true</code>로 평가되는 <code>while</code> 루프는 영원히 실행한다.</p>
<ul>
<li><strong>종료 방법</strong></li>
<li><blockquote>
<p>return 문, break 문, exit 문, goto 문 사용</p>
</blockquote>
</li>
<li><blockquote>
<p>예외가 발생하거나 프로그램을 종료</p>
</blockquote>
</li>
</ul>
<pre><code class="language-cpp">while (1) // or while (true)
{
  // this loop will execute forever
}</code></pre>
</br>

<hr>
<h2 id="3-do-while-문">3. do-while 문</h2>
<p>:  항상 적어도 한번 실행된다.
: 주로 루프가 적어도 한번 실행되기를 원하는 경우(ex_ 메뉴를 표시할 때)에 사용한다.</p>
</br>

<ul>
<li><strong>사용자에게 메뉴를 표시하고 사용자가 올바른 선택을 할 때까지 기다리는 예제</strong><pre><code class="language-cpp">#include &lt;iostream&gt;
</code></pre>
</li>
</ul>
<p>int main()
{
    // selection must be declared outside do/while loop
    int selection;</p>
<pre><code>do
{
    std::cout &lt;&lt; &quot;Please make a selection: \n&quot;;
    std::cout &lt;&lt; &quot;1) Addition\n&quot;;
    std::cout &lt;&lt; &quot;2) Subtraction\n&quot;;
    std::cout &lt;&lt; &quot;3) Multiplication\n&quot;;
    std::cout &lt;&lt; &quot;4) Division\n&quot;;
    std::cin &gt;&gt; selection;
}
while (selection != 1 &amp;&amp; selection != 2 &amp;&amp;
    selection != 3 &amp;&amp; selection != 4);

// do something with selection here
// such as a switch statement

std::cout &lt;&lt; &quot;You selected option #&quot; &lt;&lt; selection &lt;&lt; &quot;\n&quot;;

return 0;</code></pre><p>}
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 조건문 (if-else/switch)]]></title>
            <link>https://velog.io/@bae_hyeona/C-%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@bae_hyeona/C-%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Wed, 07 Feb 2024 09:05:28 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-조건문">📌 조건문</h1>
<p>: 특정 조건에 따라 C++ 프로그램의 흐름을 제어할 수 있도록 해주는 프로그래밍의 기본적인 문법</p>
<ul>
<li>특정 조건이 참(True), 거짓(False)인지 여부에 따라 특정 코드 블록을 실행하고 결정할 수 있다.</li>
</ul>
<hr>
<h2 id="1-if-조건문">1. if 조건문</h2>
<p>: 가장 기본적인 조건문</p>
<pre><code class="language-cpp">if (expression)  // conditional expression
    statement

or

if (expression)  // conditional expression
    statement
else
    statement2</code></pre>
<ul>
<li><code>expression</code> : 조건식(<em>conditional expression</em>)</li>
<li>조건식이 <code>true</code>로 평가되면 if 문이 실행되며, <code>false</code>로 평가되면 else 문이 실행된다.</li>
</ul>
</br>

<hr>
<h2 id="2-switch-조건문">2. switch 조건문</h2>
<p>: switch 표현식이 값을 평가하고, 각 case 레이블의 값과 &#39;같은&#39; 지 테스트한다.
: 레이블의 값과 같으면 레이블 뒤의 명령문을 실행한다.
: 일치하는 레이블이 없으면 default 뒤의 명령문을 실행한다.</p>
<pre><code class="language-cpp">void printColor(Colors color)
{
    switch (color)
    {
        case COLOR_BLACK:
            std::cout &lt;&lt; &quot;Black&quot;;
            break;
        case COLOR_WHITE:
            std::cout &lt;&lt; &quot;White&quot;;
            break;
        case COLOR_RED:
            std::cout &lt;&lt; &quot;Red&quot;;
            break;
        case COLOR_GREEN:
            std::cout &lt;&lt; &quot;Green&quot;;
            break;
        case COLOR_BLUE:
            std::cout &lt;&lt; &quot;Blue&quot;;
            break;
        default:
            std::cout &lt;&lt; &quot;Unknown&quot;;
            break;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 연산자]]></title>
            <link>https://velog.io/@bae_hyeona/C-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@bae_hyeona/C-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Tue, 06 Feb 2024 09:36:33 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-연산자">📌 연산자</h1>
<p>: 연산 명령을 수행시킬 수 있는 것</p>
</br>

<p>** ✔️ 연산자 우선순위(<em>Operator Priority</em>)**
<img src="https://velog.velcdn.com/images/bae_hyeona/post/b55e02e8-b37a-4155-9004-a0a73b58b82e/image.png" alt=""></p>
<hr>
<h2 id="1-대입-연산자">1. 대입 연산자</h2>
<ul>
<li><code>=</code></li>
</ul>
</br>

<hr>
<h2 id="2-산술-연산자">2. 산술 연산자</h2>
<h3 id="1-단항-산술-연산자">(1) 단항 산술 연산자</h3>
<p>: 숫자 표현식의 음수 또는 양수 값을 반환한다. 피연산자를 하나만 취한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/69982a1a-bf77-4ae4-99ec-2d54cb5f0426/image.png" alt=""></p>
<h3 id="2-이항-산술-연산자">(2) 이항 산술 연산자</h3>
<p>: 연산자 왼쪽과 오른쪽에 피연산자를 취한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/99a7ded7-e366-4089-b448-d909352fec47/image.png" alt=""></p>
<blockquote>
<p>✔️ <strong>정수와 부동 소수점 숫자 나눗셈</strong>
-&gt; 두 피연산자 중 하나 이상이 부동 소수점 숫자면 <code>/</code> 연산자는 부동 소수점 나누기를 수행한다. 
(Ex. 7.0/3=2.333, 7/3.0=2.333, 7.0/3.0=2.333)</p>
</blockquote>
</br>

<h3 id="3-모듈러-연산자나머지-연산자">(3) 모듈러 연산자(나머지 연산자)</h3>
<p>: 나눗셈의 나머지를 구하는 연산 (Ex) <code>%</code>)
: 정수 피연산자에서만 작동하며 정수 나눗셈을 수행 후 나머지를 반환한다.</p>
<h3 id="4-산술-할당-연산자">(4) 산술 할당 연산자</h3>
<p>: 산술을 간결하게 하도록 도와준다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/7e78e7aa-dede-49ce-9aa8-855bfdf29fc8/image.png" alt=""></p>
</br>

<hr>
<h2 id="3-증감-연산자">3. 증감 연산자</h2>
<p>: C++에서는 <strong>전위(<em>prefix</em>)</strong>, <strong>후위(<em>postfix</em>)</strong>버전의 두 가지 연산이 있다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/8c79ac96-f27b-4faf-9a61-e9c162688d1e/image.png" alt=""></p>
<h3 id="1-전위-증감-연산자">(1) 전위 증감 연산자</h3>
<p>: 증가 또는 감소한 다음 값 평가</p>
<pre><code class="language-cpp">int x = 5;
int y = ++x; //x=6 / y=6</code></pre>
<h3 id="2-후위-증감-연산자">(2) 후위 증감 연산자</h3>
<p>: 컴파일러는 <code>x</code>의 임시 복사본을 만든후, 원본 <code>x</code>를 증가 또는 감소시킨 다음 <code>x</code>의 임시 복사본을 평가한다. 이후 <code>x</code>의 임시 복사본이 삭제 된다.</p>
<pre><code class="language-cpp">int x = 5;
int y = x++; //x=5 / y=6</code></pre>
<p>-&gt; 컴파일러는 <code>x</code>와 같은 값을 가진 임시 복사본 <code>x(5)</code> 를 만든다.
-&gt; 원본 <code>x</code>를 5에서 6으로 증가시킨다. 
-&gt; 컴파일러가 5로 평가되는 임시 복사본 <code>x</code>값을 <code>y</code>에 할당한다.
-&gt; 임시 복사본이 삭제된다.</p>
</br>

<blockquote>
<p>✔️ <strong>전위 증감 연산자</strong>를 사용하는 것이 <strong>후위 증감 연산자</strong>를 사용하는 것보다 성능이 더 좋다!
-&gt; 후위 증감 연산자로 사용하는 경우, 연산자 우선순위가 가장 나중으로 밀린다.</p>
</blockquote>
</br>

<hr>
<h2 id="4-논리-연산자">4. 논리 연산자</h2>
<p>: 여러 조건을 테스트할 수 있는 기능을 제공한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/fffed62f-4c00-444f-b991-b446373dd50b/image.png" alt=""></p>
<h3 id="1-논리-부정logical-not">(1) 논리 부정(<em>Logical NOT</em>)</h3>
<p>: 논리 부정 연산자(!)는 부울(bool) 값을 <strong>반전</strong>시킨다.
-&gt; 피연산자 <code>true</code>를 평가하면 <code>false</code> / <code>false</code>를 평가하면 <code>true</code>
<img src="https://velog.velcdn.com/images/bae_hyeona/post/221c6732-5701-4036-a1d7-4b61df5872c0/image.png" alt=""></p>
<blockquote>
<p>✔️ <strong>우선순위가 매우 높으므로</strong> 주의해서 사용해야 한다!</p>
</blockquote>
<pre><code class="language-cpp">//x==y가 아니라면 &quot;x does not equal y&quot;값이 출력되어야 함
//옳지 못한 방법 -&gt; 출력 값 : x equals y
int x = 5;
int y = 7;
if (! x == y)
    cout &lt;&lt; &quot;x does not equal y&quot;;
else
    cout &lt;&lt; &quot;x equals y&quot;;
/
/
//올바른 방법 -&gt; 출력 값 : x does not equal y
int x = 5;
int y = 7;
if (!(x == y))
    cout &lt;&lt; &quot;x does not equal y&quot;;
else
    cout &lt;&lt; &quot;x equals y&quot;;</code></pre>
<h3 id="2-논리-orlogical-or---논리합">(2) 논리 OR(<em>Logical OR</em>) - 논리합</h3>
<p>: 두 조건 중 <strong>하나가 참(true)</strong>인지 테스트하는 데 사용한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/3cf38637-1904-4007-9206-eec97b602107/image.png" alt=""></p>
<h3 id="3-논리-andlogical-and---논리곱">(3) 논리 AND(<em>Logical AND</em>) - 논리곱</h3>
<p>: 두 조건이 <strong>모두 참(true)</strong>인지 테스트하는 데 사용한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/855eb43c-b4e0-4ef2-bb00-15f0203a8f4f/image.png" alt=""></p>
</br>

<hr>
<h2 id="5-sizeof-연산자">5. sizeof 연산자</h2>
<p>: 해당 변수의 크기를 반환한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/70bcd876-e05d-4a6c-98af-7255887b65cd/image.png" alt=""></p>
</br>

<hr>
<h2 id="6-조건부-연산자">6. 조건부 연산자</h2>
<p>: C++의 유일한 삼항 연산자(피연산자가 3개)이므로 <strong>삼항 연산자</strong>라고도 부른다.</p>
<ul>
<li><code>?:</code> 연산자 :  <code>if-else</code> 문을 더 간결하게 사용하는 방법 제공 / 우선순위가 매우 낮다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/8c6c8221-ae15-494d-9229-f04991b54252/image.png" alt=""></li>
</ul>
<h4 id="✔️-사용-방법">✔️ 사용 방법</h4>
<pre><code class="language-cpp">//일반적인 if-else
if (condition)
    expression;
else
    other_expression;

//?: 연산자 사용
(condition) ? expression : other_expression;
</code></pre>
<h4 id="✔️-활용-예시">✔️ 활용 예시</h4>
<pre><code class="language-cpp">//if-else
if (x &gt; y)
    larger = x;
else
    larger = y;

//?:
larger = (x &gt; y) ? x : y;</code></pre>
<blockquote>
<p>✔️ 출력하는 코드를 짜고 싶다면 &lt;&lt;연산자가 ?:연산자보다 우선순위가 높으므로 ()를 써야한다!</p>
</blockquote>
<pre><code class="language-cpp">//if-else
f (x &gt; y)
    std::cout &lt;&lt; x;
else
    std::cout &lt;&lt; y;
//?:
std::cout &lt;&lt; ((x &gt; y) ? x : y);</code></pre>
</br>

<hr>
<h2 id="7-관계-연산자비교">7. 관계 연산자(비교)</h2>
<p>: 각 연산자는 <strong>부울 값(<em>bool value</em>)</strong> <code>true(1)</code> 또는 <code>false(0)</code>를 반환한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/928faf41-e894-428b-adff-d5cf1048b0f3/image.png" alt=""></p>
<blockquote>
<p>✔️ <strong>부동 소수점 숫자 비교</strong>
-&gt; 부동 소수점 숫자의 반올림 오류 때문에 관계 연산자를 사용해서 비교하는 것은 위험하다.
-&gt; <code>==</code> 또는 <code>!=</code>를 사용하는 것은 <strong>권장하지 않는다.</strong></p>
</blockquote>
</br>

<hr>
<h2 id="8-비트-연산자">8. 비트 연산자</h2>
<p>: 변수 내의 비트(bit)를 조작한다.</p>
<ul>
<li><strong>최적화가 필요한 특정 상황</strong>을 제외하고는 잘 쓰지 않는다.</li>
<li>C++에서는 <strong>기호가 있는(<em>signed</em>)</strong>정수에서 적용 방식을 보장하지 않으므로 <strong>부호 없는(<em>unsigned</em>)</strong>정수 자료형을 사용해야 한다.
<img src="https://velog.velcdn.com/images/bae_hyeona/post/29db2142-5d9e-437e-919a-46074600c871/image.png" alt=""></li>
</ul>
</br>

<h3 id="1-bitwise-left-shift--bitwise-right-shift">(1) Bitwise left shift / Bitwise right shift</h3>
<p>✔️ <strong>왼쪽 시프트 연산자</strong>(<code>&lt;&lt;</code>): 각 비트를 왼쪽으로 이동시킨다.</p>
<pre><code class="language-cpp">3 = 0011
3 &lt;&lt; 1 = 0110 = 6
3 &lt;&lt; 2 = 1100 = 12
3 &lt;&lt; 3 = 1000 = 8</code></pre>
<ul>
<li><strong>왼쪽 피연산자</strong> : 이동할 수식</li>
<li><strong>오른쪽 피연사자</strong> : 이동할 비트 정수 수</li>
<li><code>3 &lt;&lt; 1</code>은 리터럴 <code>3</code>의 비트를 왼쪽으로 <code>1</code>자리 이동시킨다.</li>
<li><code>3 &lt;&lt; 3</code> 경우에, 이동한 비트가 왼쪽 끝 범위를 넘어간다. (이진수의 끝에서 벗어난 비트는 손실된다.)</li>
</ul>
</br>

<p>✔️ <strong>오른쪽 시프트 연산자</strong>(<code>&gt;&gt;</code>): 각 비트를 오른쪽으로 이동시킨다.</p>
<pre><code class="language-cpp">12 = 1100
12 &gt;&gt; 1 = 0110 = 6
12 &gt;&gt; 2 = 0011 = 3
12 &gt;&gt; 3 = 0001 = 1</code></pre>
<ul>
<li><code>12 &lt;&lt; 3</code> 경우에, 이동한 비트가 오른쪽 끝 범위를 넘어간다. (이진수의 끝에서 벗어난 비트는 손실된다.)</li>
</ul>
</br>


<blockquote>
<p>✔️ <strong>변수도 시프트할 수 있다!</strong></p>
</blockquote>
<pre><code class="language-cpp">unsigned int x = 4;
x = x &lt;&lt; 1; // x will be 8</code></pre>
</br>

<h3 id="2-bitwise-not">(2) Bitwise NOT</h3>
<ul>
<li><strong>비트 NOT 연산자</strong>(<code>~</code>) : 비트 단위 연산자 중 가장 이해하기 쉽다.</li>
<li><blockquote>
<p>각 비트에서 <strong>0과 1을 서로 바꾼다</strong>.</p>
</blockquote>
</li>
<li><blockquote>
<p>결과값은 자료형의 크기에 따라 다르다.</p>
</blockquote>
</li>
</ul>
<pre><code class="language-cpp">//4bits
4 = 0100
~4 = 1011 = 11 (decimal)

//8bits
4 = 0000 0100
~4 = 1111 1011 = 251 (decimal)</code></pre>
</br>

<h3 id="3-bitwise-and-or-xor">(3) Bitwise AND, OR, XOR</h3>
<ul>
<li><strong>비트 AND 연산자</strong>(<code>&amp;</code>), <strong>비트 OR 연산자</strong>(<code>|</code>) : 논리 AND 연산자(<code>&amp;&amp;</code>) 및 논리 OR 연산자(<code>||</code>)와 비슷하게 동작한다.</li>
<li><blockquote>
<p>But, bool 값을 평가하는 대신 <strong>각 비트에 적용</strong>된다. (비트의 각 열에 연산이 적용된다.)</p>
</blockquote>
</li>
</ul>
</br>

<ul>
<li><strong>비트 OR 연산자</strong>(<code>|</code>) : 비트 두개 중 하나 이상이 1이면 1로 평가된다.<pre><code class="language-cpp">//5 | 6: 0111(7)
0 1 0 1 // 5
0 1 1 0 // 6</code></pre>
</li>
</ul>
<hr>
<p>0 1 1 1 // 7</p>
<pre><code>

- **비트 AND 연산자**(`&amp;`) : 두 비트 모두 1인 경우에만 1로 평가된다. 
```cpp
//5 &amp; 6: 0100(4)
0 1 0 1 // 5
0 1 1 0 // 6
--------
0 1 0 0 // 4</code></pre><ul>
<li><strong>비트 XOR 연산자</strong>(<code>^</code>) : 두 연산자를 평가할 때, 한 개의 피연산자만 1인 경우에만 1로 평가된다. (같으면 0, 다르면 1)<pre><code class="language-cpp">//5 ^ 6: 0101(5)
0 1 1 0 // 6
0 0 1 1 // 3</code></pre>
</li>
</ul>
<hr>
<p>0 1 0 1 // 5</p>
<pre><code>
&lt;/br&gt;

- **활용 코드** (게임 캐릭터의 상태값을 조절할 때 많이 사용함)
```cpp
#define HUNGRY 1(0x1)
#define THIRSTY 2(0x2)
#define TIRED 4(0x4)
#define FIRE 8(0x8)
#define COLD 16(0x10)
#define POISON 32(0x20)
//이후부터는 (0x40,0x80,0x100,0x200...등)

unsigned int iStatus = 0;

//상태 추가
iStatus |= HUNGRY;
iStatus |= THIRSTY;

//상태 확인
if (iStatus &amp; THIRSTY)
{
}

//특정 자리 비트 제거
iStatus &amp;= ~THIRSTY;</code></pre><hr>
<h2 id="9-비트-할당-연산자">9. 비트 할당 연산자</h2>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/f3a41006-e95c-476d-b5d3-88ab39050f43/image.png" alt=""></p>
<p></br></br></br></br></p>
<blockquote>
<p>📌 참고 : 소년코딩 블로그 | <a href="https://boycoding.tistory.com/158">https://boycoding.tistory.com/158</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 자료형 (정수/실수)]]></title>
            <link>https://velog.io/@bae_hyeona/C-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@bae_hyeona/C-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Tue, 06 Feb 2024 09:31:23 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-데이터-단위-및-양">📌 데이터 단위 및 양</h2>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/31e0c03c-b0af-43ce-8ee1-5974f698b6b9/image.png" alt=""></p>
<blockquote>
<p>✔️ 1바이트 = 8비트 = 2^8 : 256가지의 표현 가능(0~255)</p>
</blockquote>
<hr>
<h2 id="📌-자료형data-type">📌 자료형(<em>Data Type</em>)</h2>
<p>: 변수가 어떠한 자료의 형태를 나타내는지 알려준다.</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/031ce8a2-68ac-4256-9996-d58c0effd185/image.png" alt=""></p>
<p>정수와 실수는 표현하는 방식이 다르다.</p>
</br>

<hr>
<h3 id="1-정수형">1. 정수형</h3>
<ul>
<li><code>char</code>, <code>short</code>, <code>int</code>, <code>long</code></li>
<li><code>long long</code> : int형 연산에서 초과되는 범위를 다룰 때 사용</li>
</ul>
<blockquote>
<p>✔️ <strong>양수</strong>만 취급하고 싶을 경우 <code>unsigned</code>를 앞에 붙여야 함!</p>
</blockquote>
</br>

<h4 id="1-자료형에-따라-달라지는-양수-음수">(1) 자료형에 따라 달라지는 양수, 음수</h4>
<blockquote>
<p>✔️ 맨 앞자리 비트(<strong>MSB</strong>: Most Significant Bit)가 <strong>0</strong>일 경우 : 양수 -&gt; 128개
✔️ 맨 앞자리 비트(<strong>MSB</strong>: Most Significant Bit)가 <strong>1</strong>일 경우 : 음수 -&gt; 128개</p>
</blockquote>
</br>

<p>하지만 무조건 MSB가 0,1이라고 양수,음수가 아니다!!!!!!!
즉, 양수로 사용할 때는 굳이 비트를 안 봐도 되지만 양수,음수 둘 다 표현할 때는 MSB 확인!</p>
<pre><code class="language-cpp">//0~255 표현
unsigned char c = 0;
c = 255; //255로 들어감 (비트 상태 : 1111 1111) -&gt; 양수
c = -1; //255로 들어감

//-128~127 표현
char c1 = 0;
c1 = 255; //-1로 들어감 (비트 상태 : 1111 1111) -&gt; 음수</code></pre>
<blockquote>
<p>❗️ 동일한 메모리 공간에 같은 값으로 채워지더라도 어떻게 해석하느냐에 따라 달라진다!</p>
</blockquote>
</br>

<h4 id="2-2의-보수법">(2) 2의 보수법</h4>
<p>: 주로 음의 정수를 찾을 때 사용한다.</p>
<p>✔️ <strong>사용법</strong> : 대응되는 양수의 부호를 반전 후, 1을 더한다.</p>
</br>

<hr>
<h3 id="2-실수형">2. 실수형</h3>
<p>: 정밀도에 의존
: <strong>부동 소수점</strong> 표현 방식 사용
    -&gt; 가장 근사한 값으로 비트 표현</p>
<ul>
<li><code>float</code></li>
<li><code>double</code> : 더 정밀한 표현이 가능 (<code>float</code>보다 더 아래의 소수점까지 정확하게 표현이 가능)</li>
</ul>
</br>

<p>✔️ 실수를 상수로 적을 경우, 소수점 뒤에 <strong>f</strong>를 붙이면 float, 안 붙이면 double으로 간주한다.</p>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/2b3aa036-1db9-4e8a-8279-7e228edfe854/image.png" alt=""></p>
<blockquote>
<p>✔️ 정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 연산될 경우 명시적으로 변환!
Ex) float f = 10.2415f + (float)20;</p>
</blockquote>
<p></br></br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 동계 모각소] 4주차]]></title>
            <link>https://velog.io/@bae_hyeona/2023-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-4%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@bae_hyeona/2023-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-4%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sat, 03 Feb 2024 13:42:31 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-stdforward_list">📌 std::forward_list</h2>
<p>: <strong>연결 리스트</strong>와 같은 형태의 자료 구조
: 기본적인 연결 리스트에 대한 래퍼 클래스 (C++이 제공)
: C++에서 제공하는 연결 리스트 관련 컨테이너</p>
<p>✔️ 기본적인 연결 리스트를 구성하려면 <strong>포인터</strong>를 하나 가지고 있어야 하고, <code>new</code>와 <code>delete</code> 연산자를 이용하여 메모리를 할당하고 해제할 수 있어야 한다. 
-&gt; 이러한 기능을 구현하는 것이 그리 어렵지는 않지만 자칫 잘못하면 찾기 어려운 버그를 양산할 수 있다.</p>
</br>

<p>✔️ 많은 응용 프로그램에서는 자료 구조 중간에 <strong>삽입</strong> 또는 <strong>삭제 작업</strong>을 필요로 한다.
Ex) 탭을 지원하는 브라우저 : 언제든 새로운 탭을 임의의 위치에 옮길 수 있어야 한다.
    음악 플레이어 : 재생 목록 중간에 새로운 노래를 추가할 수 있어야 한다. </p>
<p>-&gt; <strong>빠른 동작</strong>을 위해 연결 리스트를 사용할 수 있다.
(음악 플레이어를 만드는 &#39;실습 문제 1: 음악 재생 목록 구현하기&#39;에서 연결 리스트의 사용 예를 확인할 수 있다.)</p>
<p><br/><br/></p>
<h3 id="1-추가적인-기능-제공">1. 추가적인 기능 제공</h3>
<ul>
<li><p>기본적인 연결 리스트의 성능을 유지하면서 추가적인 기능을 제공한다.</p>
</li>
<li><p>성능 유지를 위해 <code>std::forward_list</code>는 전체 리스트의 크기를 반환하거나 첫 번째 원소를 제외한 나머지 원소에 직접 접근하는 기능을 제공하지 않는다.</p>
</li>
<li><blockquote>
<p>맨 처음 원소에 접근하는 <code>front()</code> 함수 제공</p>
</blockquote>
</li>
<li><blockquote>
<p>반대 방향의 원소로 이동하는 <code>back()</code> 같은 함수 제공 X</p>
</blockquote>
</li>
<li><p>원소의 삽입, 삭제, 순서 뒤집기, 분할을 위한 기능을 제공한다.</p>
</li>
<li><blockquote>
<p>기본적인 연결 리스트의 메모리 사용량이나 성능에 영향을 주지 않는다.</p>
</blockquote>
</li>
<li><p><code>std::vector</code>와 마찬가지로 두 번째 템플릿 매개변수에 사용자 지정 할당자를 지정할 수 있다.</p>
</li>
<li><blockquote>
<p>맞춤형 메모리 관리가 필요한 고급 응용 프로그램에서도 <code>std::forward_list</code>를 사용할 수 있다.</p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h3 id="2-원소-삽입-삭제">2. 원소 삽입/ 삭제</h3>
<ol>
<li>원소 삽입</li>
</ol>
<ul>
<li><p><strong>push_front()</strong> 함수</p>
</li>
<li><blockquote>
<p>연결 리스트 맨 앞에 새로운 원소를 삽입</p>
</blockquote>
</li>
<li><blockquote>
<p><code>std::forward_list</code>는 마지막 원소에 직접 접근할 수 없으므로 <code>push_back()</code> 함수 제공 X</p>
</blockquote>
</li>
<li><p><strong>insert_after()</strong> 함수</p>
</li>
<li><blockquote>
<p>특정 위치에 원소를 삽입시 사용</p>
</blockquote>
</li>
<li><blockquote>
<p>연결 리스트에서 새로운 원소를 삽입한 후, 해당 위치 앞에 있는 원소의 next 포인터를 수정해야 하기 때문에 <code>insert()</code> 사용 X</p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h3 id="📌-백준-문제-풀이">📌 백준 문제 풀이</h3>
<p><img src="https://velog.velcdn.com/images/bae_hyeona/post/2f82faea-38c6-4f0d-b7df-7bd3fe2405d2/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>