<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>h_dev.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 09 Apr 2024 07:57:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. h_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ch_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CS-네트워크] TCP/IP 4 계층]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPIP-4-Layer</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPIP-4-Layer</guid>
            <pubDate>Tue, 09 Apr 2024 07:57:02 GMT</pubDate>
            <description><![CDATA[<p>컴퓨터 네트워킹의 세계에서 TCP/IP 모델은 인터넷과 관련된 통신 프로세스를 이해하는 데 필수적인 기본 요소이다. 1970년대 후반에 개발된 이 모델은 네트워크 통신의 표준으로 자리 잡았으며, 오늘날 인터넷의 기반이 되고 있다. TCP/IP 모델은 네트워크 통신을 위한 프로토콜의 집합을 체계적으로 분류하고 있으며, 네트워크 설계와 구현에 있어 중요한 가이드를 제공한다. TCP/IP 4 계층은 다음과 같다.</p>
<hr>
<h1 id="tcpip-4-계층"><strong>TCP/IP 4 계층</strong></h1>
<p>TCP/IP 4 계층 모델은 인터넷 프로토콜 스위트의 핵심 프레임워크로, 네트워크 통신 과정을 네 개의 추상적인 계층으로 분류한다. TCP/IP 4 계층 모델은 데이터가 네트워크를 통해 전송되는 과정을 단순화하여 설명하며, 각 계층은 서로 다른 역할을 가진다. TCP/IP 모델은 다음과 같은 네 계층으로 구성되어 있다.
<img src="https://velog.velcdn.com/images/ch_dev/post/4399ca13-0dd5-492a-a603-1308146f501c/image.png" alt=""></p>
<h2 id="네트워크-엑세스-계층network-access-layer">네트워크 엑세스 계층(Network Access Layer)</h2>
<p>네트워크 접속 계층은 데이터를 물리적 네트워크로 전송하는 역할을 한다. 네트워크 엑세스 계층은 데이터 링크 계층과 물리 계층의 기능을 포함하며, 하드웨어 주소 지정, 프레임의 구성과 전송 등을 담당한다.</p>
<h2 id="인터넷-계층internet-layer">인터넷 계층(Internet Layer)</h2>
<p>인터넷 계층은 패킷을 송신지에서 목적지로 라우팅하는 역할을 한다. 인터넷 계층의 핵심 프로토콜은 IP(Internet Protocol)로, 데이터 패킷의 주소 지정 및 라우팅을 담당한다.</p>
<h2 id="전송-계층transport-layer">전송 계층(Transport Layer)</h2>
<p>전송 계층은 데이터의 전송을 담당하며, 주로 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol) 프로토콜을 사용한다. 전송 계층은 데이터의 분할, 오류 검사 및 데이터의 순서 보장 등을 처리한다.</p>
<h2 id="응용-계층application-layer">응용 계층(Application Layer)</h2>
<p>응용 계층은 사용자와 가장 가까운 계층으로, 웹 브라우저, 이메일 클라이언트, FTP 클라이언트 같은 응용 프로그램이 응용 계층에서 작동한다. 사용자의 데이터를 네트워크로 전송하기 위해 적절한 형태로 변환하는 역할을 한다.</p>
<p>TCP/IP 4 계층 모델은 복잡한 네트워크 작업을 이해하고 구현하는 데 중요한 역할을 한다. 각 계층은 특정한 역할을 수행하여 네트워크 통신의 효율성과 신뢰성을 보장합니다. TCP/IP 4 계층 모델은 인터넷과 같은 네트워크에서 핵심적인 역할을 하며, 각 계층의 역할과 중요성을 강조한다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-네트워크] OSI 7 계층]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7-Layer</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7-Layer</guid>
            <pubDate>Fri, 29 Mar 2024 06:58:54 GMT</pubDate>
            <description><![CDATA[<p>OSI 7 계층(OSI 7 Layer)은 국제 표준화 기구인 ISO에서 개발된 네트워크 통신을 위한 모델로, 네트워크 통신 과정을 7단계로 구분하였다. OSI 7 계층에서 각 계층에 대한 내용은 다음과 같다.</p>
<hr>
<h1 id="osi-7-계층"><strong>OSI 7 계층</strong></h1>
<h2 id="1-물리-계층physical-layer">1. 물리 계층(Physical Layer)</h2>
<p>실제 전기적, 기계적, 절차적 특성을 이용하여 비트 스트림을 물리적 매체를 통해 전송한다.</p>
<ul>
<li>데이터 단위는 비트(Bit)로 데이터를 전기적 신호로 변환하여 전송하며. 데이터는 가장 기본적인 형태인 &#39;1&#39;과 &#39;0&#39;의 비트로 표현된다.</li>
</ul>
<p>예시 장비에는 허브, 리피터가 있다.</p>
<h2 id="2-데이터-링크-계층data-link-layer">2. 데이터 링크 계층(Data Link Layer)</h2>
<p>통신 오류를 감지하고 수정하며, 물리 계층을 통해 안정적으로 데이터를 전송하기 위한 프레임, 오류 검출 및 수정, 흐름 제어 등을 수행한다.</p>
<ul>
<li>데이터 단위는 프레임(Frame)으로, 데이터 링크 계층에서는 네트워크 장치 간의 물리적 전송을 위해 데이터를 프레임으로 구성한다. 프레임은 주소, 제어 정보, 데이터 자체를 포함할 수 있으며 오류 검출 및 수정 정보도 포함된다.</li>
</ul>
<p>예시 장비에는 브리지, 스위치가 있다.</p>
<h2 id="3-네트워크-계층network-layer">3. 네트워크 계층(Network Layer)</h2>
<p>다양한 라우팅 기술을 사용하여 패킷을 출발지에서 목적지까지 전달하며 IP 주소와 같은 네트워크 주소를 이용하여 경로를 결정한다.</p>
<ul>
<li>데이터 단위는 패킷(Packet)이며, 패킷에는 출발지와 목적지 주소 정보가 포함되어 있어 이를 통해 데이터가 최종 목적지까지 경로를 찾아간다.</li>
</ul>
<p>예시 장비에는 라우터가 있다.</p>
<h2 id="4-전송-계층transport-layer">4. 전송 계층(Transport Layer)</h2>
<p>통신을 활성화하기 위한 전체 메시지를 세그먼트로 나누고, 이를 네트워크 계층에서 전달받아 목적지에서 재조립하며, 오류 검출 및 복구, 흐름 제어 등을 수행한다.</p>
<ul>
<li>데이터 단위는 세그먼트(Segment) 또는 데이터그램(Datagram)로, 전송 계층에서는 TCP를 사용할 경우 데이터 단위를 세그먼트라고 하며, UDP를 사용할 경우 데이터그램이라고 한다. 이 계층은 두 종단 간의 신뢰성 있는 데이터 전송을 담당한다.</li>
</ul>
<p>예시 프로토콜에는 TCP, UDP가 있다.</p>
<h2 id="5-세션-계층session-layer">5. 세션 계층(Session Layer)</h2>
<p>통신 세션을 설정, 관리, 종료하는 역할을 수행한며, 두 장치 간의 대화 관리를 담당한다.</p>
<ul>
<li>데이터 단위는 데이터(Data)로, 세션을 연결, 유지, 종료하는데 필요한 정보와 제어 메시지를 포함한다.</li>
</ul>
<p>예시로는 NetBIOS, RPC가 있다.</p>
<h2 id="6-표현-계층presentation-layer">6. 표현 계층(Presentation Layer)</h2>
<p>데이터의 표현 형식(암호화, 압축)을 수행한다. 송수신하는 데이터의 형식을 변환하여 양쪽 시스템이 데이터를 이해할 수 있도록 한다.</p>
<ul>
<li>데이터 단위는 데이터(Data)로, 데이터의 인코딩, 암호화 또는 압축과 같은 변환을 담당하여, 송수신되는 데이터의 표현 형식을 관리한다.</li>
</ul>
<p>예시로는 JPEG, MPEG가 있다.</p>
<h2 id="7-응용-계층application-layer">7. 응용 계층(Application Layer)</h2>
<p>네트워크 서비스를 사용자에게 제공하는 계층으로, 최종 사용자와 직접적으로 상호 작용하는 애플리케이션에 대한 접근을 제공한다.</p>
<ul>
<li>데이터 단위는 데이터(Data)로, 사용자 데이터(이메일, 파일 전송 등)나 애플리케이션 간의 요청과 응답을 포함할 수 있다.</li>
</ul>
<p>예시 프로토콜에는 HTTP, FTP, SMTP가 있다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-네트워크] DNS]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-DNS</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-DNS</guid>
            <pubDate>Sun, 03 Dec 2023 08:32:59 GMT</pubDate>
            <description><![CDATA[<p>로컬에서 서버를 실행하면, 해당 서버에 접근하기 위해 사용되는 IP 주소는 주로 사용 중인 네트워크에 따라 다양하다. 보통 <strong>192.168.x.x</strong>, <strong>10.x.x.x</strong>, <strong>172.16.x.x</strong>와 같은 형식의 IP 주소나 루프백 주소인 <strong>127.0.0.1</strong> 또는 <strong>localhost</strong>로 접근할 수 있다.
IP는 숫자로 구성되어 있는 반면에 네이버의 도메인인 <code>www.naver.com</code> 또는 <code>naver.com</code>을 주소창에 입력하면 네이버로 연결되는데 이는 DNS 역할 덕분이다.</p>
<hr>
<h1 id="도메인-이름-시스템domain-name-system-dns"><strong>도메인 이름 시스템(Domain Name System, DNS)</strong></h1>
<p>DNS는 인터넷에서 사용되는 주소를 사람이 이해하기 쉬운 문자열로 변환하는 시스템이다. 이를 통해 웹 브라우저에 도메인 이름을 입력하여 웹사이트에 접속할 수 있다.</p>
<p>간단히 말하면, DNS는 컴퓨터가 이해하는 숫자로 된 IP 주소와 우리가 기억하기 쉬운 도메인 이름 간의 변환을 담당한다. 이러한 역할 덕분에 <code>223.130.195.95</code>, <code>223.130.195.200</code>, <code>223.130.200.104</code>, <code>223.130.200.107</code>와 같은 IP 주소를 기억하지 않고 <code>www.naver.com</code>과 같은 도메인을 입력하여 웹사이트에 쉽게 접근할 수 있다. DNS는 전 세계적으로 분산된 서버 네트워크로 이뤄져 있으며, 이를 통해 인터넷 사용자는 도메인을 통해 서버에 접근할 수 있게 된다.</p>
<h2 id="dns-역할">DNS 역할</h2>
<ol>
<li><p><strong>도메인 이름 해석</strong>
DNS는 사용자가 입력한 도메인 이름(예: <a href="http://www.google.com)%EC%9D%84">www.google.com)을</a> 해당 도메인의 IP 주소로 변환한다. 이 과정을 &quot;도메인 이름 해석&quot; 또는 &quot;도메인 이름을 해석하여 IP 주소로 변환&quot;이라고 한다.</p>
</li>
<li><p><strong>계층적인 구조</strong>
DNS는 계층적인 구조를 가지고 있다. 최상위 도메인(Top-Level Domain, TLD) 서버부터 시작하여 하위 도메인 서버로 이어지며, 최종적으로 원하는 도메인의 IP 주소를 찾아낸다.</p>
</li>
<li><p><strong>도메인 등록 정보 관리</strong>
DNS는 도메인 이름 등록 정보를 관리하고 유지한다. 도메인을 등록하면 해당 도메인과 관련된 IP 주소 및 기타 레코드 정보가 DNS 서버에 저장된다.</p>
</li>
<li><p><strong>분산된 시스템</strong>
DNS는 전 세계에 분산된 여러 DNS 서버로 이루어져 있어 빠른 응답과 시스템의 안정성을 제공한다.</p>
</li>
</ol>
<p>DNS는 인터넷에서 효율적인 도메인 이름 해석과 통신을 지원하는 핵심 서비스이며, 웹 브라우징, 이메일, 파일 공유 등 모든 인터넷 활동에서 중요한 역할을 한다.</p>
<hr>
<h1 id="번외">번외</h1>
<p><strong>DNS 활용</strong>
DNS는 다양한 환경에서 유용하게 활용된다.</p>
<ol>
<li><p><strong>인프라스트럭처의 효율성</strong>
내부망에서는 다수의 서비스 서버와 모니터링 서버 등이 운영될 수 있는데, DNS를 구성함으로써 각 서버에 접근할 때 IP 주소를 직접 입력할 필요 없이 설정된 도메인을 통해 효율적으로 서버에 접근할 수 있다. 이는 인프라스트럭처의 관리와 운영을 간소화하고 효율성을 높인다.</p>
</li>
<li><p><strong>서비스 식별</strong>
서비스가 다양하게 운영되는 환경에서는 각 서비스에 대한 도메인을 명확하게 설정함으로써 해당 서비스를 식별하는 데 도움이 된다. 이는 개발자나 시스템 관리자에게 서비스 구조를 명확하게 전달하고 이해하기 쉽도록 한다.</p>
</li>
<li><p><strong>서버 이전의 유연성</strong>
서버의 IP 주소가 변경되어도 DNS에서는 IP 주소만 재설정하면 도메인은 변경하지 않고 계속 사용할 수 있다. 또한, 서버를 이전할 때에도 동일한 도메인을 통해 사용자가 서버에 접근할 수 있다.</p>
</li>
</ol>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-네트워크] IP 주소/MAC 주소]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-IP%EC%A3%BC%EC%86%8CMAC%EC%A3%BC%EC%86%8C</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-IP%EC%A3%BC%EC%86%8CMAC%EC%A3%BC%EC%86%8C</guid>
            <pubDate>Sat, 04 Nov 2023 03:38:54 GMT</pubDate>
            <description><![CDATA[<p>IP 주소와 MAC 주소는 네트워크에서 서로 다른 역할을 하는 주소 체계이다. 이 두 주소에 대한 내용은 다음과 같다.</p>
<hr>
<h1 id="ipinternet-protocol"><strong>IP(Internet Protocol)</strong></h1>
<p>IP (Internet Protocol)는 컴퓨터 및 다양한 네트워크 장치가 인터넷에서 통신하기 위해 사용하는 프로토콜이다. IP는 컴퓨터 간의 데이터 패킷을 라우팅하고 전달하는 데 사용되며, 모든 인터넷 통신에서 중요한 역할을 한다.</p>
<h2 id="ip-address">IP Address</h2>
<ul>
<li>IP 주소는 네트워크 계층에서 작동하며, 인터넷이나 로컬 네트워크에서 컴퓨터나 기기를 식별하는 주소이다.</li>
<li>IP 주소는 논리 주소로, 컴퓨터의 위치를 나타내거나 데이터 패킷의 목적지를 결정하는 데 사용된다.</li>
<li>IP 주소는 계층화된 주소 구조를 가지며, IP 버전 4 (IPv4)와 IP 버전 6 (IPv6)이 가장 널리 사용된다.</li>
</ul>
<h2 id="ip-종류">IP 종류</h2>
<p>IP 주소에는 다양한 유형이 존재하는데, 먼저 공인 IP 주소는 인터넷이 사용자를 찾을 수 있도록 사용자를 식별하는 역할을 하고 사설 IP 주소는 사설 네트워크에서 다른 장치와 안전하게 연결하기 위해 사용되며, 동일한 네트워크의 각 장치에는 고유한 사설 IP 주소가 할당된다.</p>
<p>그렇다면 공인 IP 주소와 사설 IP 주소의 차이는 무엇일까?</p>
<h3 id="공인-ip-public-ip"><strong>공인 IP (Public IP)</strong></h3>
<ul>
<li>공인 IP 주소는 인터넷 상에서 고유한 식별자로 사용된다. 이 주소는 전 세계의 네트워크 장치에서 접근 가능하며, 웹 서버, 이메일 서버, 클라이언트 컴퓨터 등에 할당된다.</li>
<li>공인 IP 주소는 전체 인터넷에서 전역적으로 고유해야 한다.</li>
<li>이 주소는 일반적으로 ISP (인터넷 서비스 제공업체)에 의해 할당되며, 다양한 프로토콜을 통해 전 세계로 라우팅된다.</li>
</ul>
<h3 id="사설-ip-private-ip"><strong>사설 IP (Private IP)</strong></h3>
<ul>
<li><p>사설 IP 주소는 개별 네트워크에서 사용되며, 인터넷에서 직접 접근할 수 없다.사설 IP 주소를 사용하면 여러 장치가 동일한 공인 IP 주소를 공유하면서 내부 네트워크에서 통신할 수 있다.</p>
</li>
<li><p>사설 IP 주소는 주로 가정이나 기업 내부 네트워크에서 사용된다.
가장 흔히 사용되는 사설 IP 주소 범위는 다음과 같다.</p>
<ul>
<li>클래스 A: 10.0.0.0 ~ 10.255.255.255</li>
<li>클래스 B: 172.16.0.0 ~ 172.31.255.255</li>
<li>클래스 C: 192.168.0.0 ~ 192.168.255.255</li>
</ul>
</li>
<li><p>사설 IP 주소는 NAT(Network Address Translation)을 통해 공인 IP 주소와 연결되고 인터넷과 통신할 때는 NAT 장치를 통해 변환된다.</p>
</li>
</ul>
<p>공인 IP 주소는 인터넷에서 고유하게 식별되며 외부 통신에 사용되는 반면, 사설 IP 주소는 개별 네트워크 내에서 내부 통신에 사용된다. 사설 IP 주소는 보안성과 네트워크 관리를 위해 중요한 역할을 한다.</p>
<h2 id="internet-protocol-version">Internet Protocol version</h2>
<p>IPv4(Internet Protocol version 4)와 IPv6(Internet Protocol version 6)은 인터넷에서 사용되는 주소 지정 체계로, 네트워크 장치 및 컴퓨터 간의 통신을 관리하는 역할을 한다.</p>
<h3 id="ipv4internet-protocol-version-4"><strong>IPv4(Internet Protocol version 4)</strong></h3>
<ol>
<li><strong>주소 길이</strong> IPv4 주소는 32비트로 구성되며, 보통 4개의 8비트 블록으로 표현된다.
예를 들어, 192.168.1.1과 같은 형태이다.</li>
<li><strong>주소 고갈</strong> IPv4 주소 고갈 문제가 심각한데, 주소 고갈을 해결하기 위해 여러 가지 방법이 사용되고 있지만 한계가 있다.</li>
<li><strong>서브넷팅</strong> IPv4에서 서브넷팅은 주소 공간을 효율적으로 관리하기 위한 중요한 기술이다.</li>
<li><strong>네트워크 주소, 브로드캐스트 주소</strong> IPv4에서 각 네트워크는 네트워크 주소와 브로드캐스트 주소를 가지며, 이들 주소는 일반적으로 첫 번째 주소와 마지막 주소로 설정된다.</li>
<li><strong>클래스 기반 주소 할당</strong> IPv4에서는 클래스 A, B, C, D 및 E와 같은 주소 클래스가 있었으며, 각 클래스는 주소 범위와 네트워크 크기를 나타낸다.</li>
</ol>
<h3 id="ipv6internet-protocol-version-6"><strong>IPv6(Internet Protocol version 6)</strong></h3>
<ol>
<li><strong>주소 길이</strong> IPv6 주소는 128비트로 구성되며, 16비트 블록으로 표현된다.
예를 들어, 2001:0db8:85a3:0000:0000:8a2e:0370:7334와 같은 형태이다.</li>
<li><strong>주소 고갈 해결</strong> IPv6는 주소 공간의 고갈 문제를 해결하기 위해 대규모 주소 할당을 제공한다. 이로써 대규모 네트워크 및 IoT 디바이스를 지원할 수 있게 되었다.</li>
<li><strong>서브넷팅 간소화</strong> IPv6는 서브넷팅을 간소화하고, 대규모 주소 공간을 효과적으로 관리하도록 설계되었다.</li>
<li><strong>주소 할당</strong> IPv6 주소 할당은 이전의 클래스 기반 주소 할당보다 유연하며, 주소 체계가 단순화되었다.</li>
<li><strong>네트워크 주소와 브로드캐스트 없음</strong> IPv6에서는 네트워크 주소와 브로드캐스트 주소 개념이 없어졌으며, 대신 모든 노드를 위한 고유 주소와 멀티캐스트를 통한 효과적인 통신이 가능하다.</li>
</ol>
<p>IPv4와 IPv6는 공존하며, IPv6는 주소 고갈 문제를 해결하고 미래의 인터넷에 대비하기 위한 중요한 프로토콜이다. 이제 많은 네트워크와 서비스가 IPv6를 채택하고 있으며, 앞으로 IPv6의 중요성은 더 커질 것으로 예상된다.</p>
<h1 id="mac-주소media-access-control-address"><strong>MAC 주소(Media Access Control Address)</strong></h1>
<p>MAC 주소는 네트워크 장치의 고유한 식별자로 사용되는 주소이다.</p>
<ul>
<li>MAC 주소는 데이터 링크 계층에서 작동하며, 네트워크 카드나 네트워크 인터페이스 카드(NIC)와 관련이 있다.</li>
<li>MAC 주소는 하드웨어 주소로, 네트워크 장치 자체를 고유하게 식별하는 데 사용된다.</li>
<li>MAC 주소는 6바이트(48비트)의 고유한 주소로 표현된다.
예를 들어 00:1A:2B:3C:4D:5E와 같이 콜론(:) 또는 하이픈(-)으로 구분된다.</li>
</ul>
<p>IP 주소와 MAC 주소는 서로 다른 역할을 하며 다른 계층에서 작동한다. IP 주소는 라우팅 및 패킷 전송을 관리하며, 통신하는 장치 간의 네트워크 주소를 식별하는 데 사용된다. 반면 MAC 주소는 데이터 링크 계층에서 패킷의 출발지와 목적지를 식별하는 데 사용된다. MAC 주소는 더 낮은 수준에서 작동하며, 네트워크 장치가 실제로 통신하기 위해 필요한 주소이다.</p>
<hr>
<h1 id="번외">번외</h1>
<p>네트워크 통신에서 사용되는 주소 지정 방식에는 다양한 유형이 있다. 이중 주요한 것은 유니캐스트, 멀티캐스트, 애니캐스트, 브로드캐스트이다.</p>
<ol>
<li><p><strong>유니캐스트 (Unicast)</strong></p>
<ul>
<li>유니캐스트는 네트워크에서 가장 일반적으로 사용되는 주소 지정 방식이다.</li>
<li>데이터 패킷은 특정 목적지 하나로 전송된다.</li>
<li>주로 일대일 통신에 사용되며, 목적지 주소는 유일해야 한다.</li>
</ul>
</li>
<li><p><strong>멀티캐스트 (Multicast)</strong></p>
<ul>
<li>멀티캐스트는 데이터 패킷을 다수의 목적지로 전송하는 방식이다.</li>
<li>하나의 송신자가 여러 수신자에게 동시에 데이터를 보낼 수 있다.</li>
<li>주로 온라인 스트리밍, IP 텔레비전, 그룹 채팅 등의 다중 통신 시나리오에 사용된다.</li>
</ul>
</li>
<li><p><strong>애니캐스트 (Anycast)</strong></p>
<ul>
<li>애니캐스트는 여러 대상 중 가장 가까운 목적지에 데이터 패킷을 보내는 방식이다.</li>
<li>여러 대상이 동일한 주소를 사용하며, 라우팅 알고리즘에 따라 가장 가까운 대상이 패킷을 처리한다.</li>
<li>주로 부하 분산, 서비스 가용성을 향상시키는 목적으로 사용된다.</li>
</ul>
</li>
<li><p><strong>브로드캐스트 (Broadcast)</strong></p>
<ul>
<li>브로드캐스트는 네트워크 상의 모든 호스트에 데이터 패킷을 전송하는 방식이다.</li>
<li>모든 호스트가 패킷을 수신하며, 주로 로컬 네트워크에서 사용된다.</li>
<li>인터넷에서는 사용되지 않거나 제한적으로 사용된다.</li>
</ul>
</li>
</ol>
<p>이러한 주소 지정 방식은 네트워크 통신에서 데이터 전송의 효율성과 목적에 따라 선택된다. 유니캐스트와 멀티캐스트는 일반적으로 널리 사용되며, 애니캐스트는 서버 부하 분산과 가용성 향상을 위해 중요한 역할을 한다. 브로드캐스트는 네트워크 트래픽을 늘리는 원인이 될 수 있어 현대의 네트워크에서는 제한적으로 사용된다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-네트워크] HTTP | HTTPS]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%ACHTTP-HTTPS</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%ACHTTP-HTTPS</guid>
            <pubDate>Sun, 24 Sep 2023 13:07:44 GMT</pubDate>
            <description><![CDATA[<p>인터넷을 사용하다 보면 어떠한 사이트의 URL이 HTTP로 시작하거나 HTTPS로 시작하는 것을 본 적이 있을 것이다. HTTP와 HTTPS는 무엇이고 어떠한 차이점이 있는지 다음과 같다.</p>
<hr>
<h1 id="httphypertext-transfer-protocol">HTTP(HyperText Transfer Protocol)</h1>
<p>HTTP는 &quot;하이퍼텍스트 전송 프로토콜&quot;의 약자로, 웹 브라우저와 웹 서버 간에 데이터를 주고받는 데 사용되는 프로토콜이다.</p>
<h2 id="http-동작-방식">HTTP 동작 방식</h2>
<ol>
<li>클라이언트(웹 브라우저)가 웹 페이지를 요청한다.</li>
<li>서버는 해당 페이지를 찾아서 클라이언트에게 전송한다.</li>
<li>클라이언트는 받은 데이터를 웹 페이지로 렌더링하여 화면에 표시한다.</li>
</ol>
<p>HTTP는 데이터를 평문으로 전송하기 때문에 보안적인 측면에서 취약하다. 따라서, 민감한 정보를 주고받는 서비스에서는 사용하지 않는 것이 좋다.</p>
<h1 id="httpshypertext-transfer-protocol-secure">HTTPS(HyperText Transfer Protocol Secure)</h1>
<p>HTTPS는 HTTP의 보안 버전으로, 데이터의 안전한 전송을 보장한다.</p>
<h2 id="https-동작-방식">HTTPS 동작 방식</h2>
<ol>
<li>클라이언트가 웹 페이지를 요청한다.</li>
<li>서버는 클라이언트에게 공개키를 제공한다.</li>
<li>클라이언트는 이 공개키를 사용하여 데이터를 암호화하여 서버로 전송한다.</li>
<li>서버는 자신의 개인키로 데이터를 해독한다.</li>
<li>클라이언트와 서버 간의 통신은 암호화된 상태로 이루어진다.</li>
</ol>
<p>HTTPS의 가장 큰 장점은 데이터의 안전성이다. 중요한 정보를 주고받는 온라인 결제, 로그인, 개인정보 제공 등의 상황에서 HTTPS를 사용하면 제3자가 데이터를 엿볼 수 없게 된다.</p>
<h1 id="http--https-주요-차이점">HTTP | HTTPS 주요 차이점</h1>
<ol>
<li><p><strong>보안</strong>: 가장 큰 차이는 보안이다. HTTP는 데이터를 평문으로 전송하므로 중요한 정보가 노출될 수 있지만, HTTPS는 데이터를 암호화하여 전송하기 때문에 안전하다.</p>
</li>
<li><p><strong>포트 번호</strong>: HTTP는 기본적으로 80번 포트를 사용하고, HTTPS는 443번 포트를 사용한다. 이 포트 번호를 통해 서버가 어떤 프로토콜을 사용하는지 구분한다.</p>
</li>
<li><p><strong>인증</strong>: HTTPS는 SSL/TLS 인증서를 사용하여 웹 사이트의 신뢰성을 검증한다. 브라우저는 이러한 인증서를 확인하고, 웹 사이트가 실제로 해당 도메인에 속한 것인지 확인한다.</p>
</li>
</ol>
<p>HTTP와 HTTPS는 웹 통신의 기초를 이루는 프로토콜 중 두 가지이다. 웹 브라우징부터 온라인 거래까지, 어떤 데이터를 주고받느냐에 따라 이 두 프로토콜을 적절히 선택하는 것이 중요하다. 개인 정보와 같이 민감한 데이터를 다룰 때는 항상 HTTPS를 사용하여 데이터의 안전을 보장하는 것이 좋다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-네트워크] TCP/UDP]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP</guid>
            <pubDate>Sun, 24 Sep 2023 12:54:00 GMT</pubDate>
            <description><![CDATA[<p>네트워크 통신에서 데이터 전송 방식에는 연결형 서비스와 비연결 서비스 두 가지가 있는데, 연결형 서비스 (Connection-Oriented Service)는 데이터 통신에 있어서 신뢰성과 순서를 중요하게 여기며, 데이터를 주고받기 전에 미리 연결을 설정하는 반면에, 비연결 서비스 (Connectionless Service)는 데이터 통신에 있어서 연결 설정 단계가 없고, 각각의 데이터 패킷은 독립적으로 처리한다. TCP와 UDP는 연결형 서비스와 비연결 서비스에서 제공하는 프로토콜이다. TCP와 UDP에 대한 내용은 다음과 같다.</p>
<hr>
<h1 id="tcptransmission-control-protocol-전송-제어-프로토콜">TCP(Transmission Control Protocol, 전송 제어 프로토콜)</h1>
<p>TCP는 컴퓨터 간 데이터 통신을 위한 연결형 서비스로, 데이터의 신뢰성을 보장하는 연결 지향형 프로토콜이다.</p>
<h1 id="tcp-특징">TCP 특징</h1>
<ol>
<li><h4 id="양방향-연결full-duplex-connection">양방향 연결(Full Duplex Connection)</h4>
<p>TCP는 양방향 통신을 지원하며, 전이중 통신 방식을 사용한다.</p>
</li>
<li><h4 id="연결형-서비스">연결형 서비스</h4>
<p>TCP는 가상 회선 방식을 제공하며, 연결 설정과 해제를 위해 3-Way Handshaking 및 4-Way Handshaking 과정을 사용한다.</p>
</li>
<li><h4 id="신뢰성-있는-데이터-전송">신뢰성 있는 데이터 전송</h4>
<p>TCP는 데이터의 신뢰성을 중요시하며, 데이터 손실 및 오류를 최소화하고 재전송 기능을 제공한다.</p>
</li>
<li><h4 id="전송-속도">전송 속도</h4>
<p>UDP에 비해 전송 속도가 상대적으로 느리다. 이는 신뢰성을 확보하기 위한 오버헤드 때문이다.</p>
</li>
<li><h4 id="스트림-전송-서비스">스트림 전송 서비스</h4>
<p>TCP는 스트림 전송 서비스를 제공하며, 데이터의 순서를 보장하여 수신 측에서의 데이터 순서가 최종 목적지에서도 일치하도록 한다.</p>
</li>
<li><h4 id="흐름-제어-오류-제어-혼잡-제어">흐름 제어, 오류 제어, 혼잡 제어</h4>
<p>TCP는 흐름 제어를 통해 데이터 처리 속도를 조절하여 수신 측의 버퍼 오버플로우를 방지하고, 혼잡 제어를 통해 네트워크 내의 패킷 수를 관리한다. 또한, 오류 제어 기능은 데이터의 손상이나 손실을 탐지하고 이를 복구하기 위해 ARQ(Automatic Repeat reQuest)와 같은 메커니즘을 사용하여 데이터가 손실 또는 손상 시 재전송을 수행하여 데이터의 신뢰성을 유지한다.</p>
</li>
</ol>
<h2 id="3-way-handshaking">3-Way Handshaking</h2>
<p>3-Way Handshaking은 TCP에서 연결 설정을 위해 사용되는 프로세스이다. 이 과정은 다음과 같이 세 단계로 이루어진다.</p>
<ol>
<li><h4 id="클라이언트가-서버에-연결-요청syn">클라이언트가 서버에 연결 요청(SYN)</h4>
<p>클라이언트가 서버에 연결을 요청하기 위해 클라이언트는 SYN(시작) 패킷을 전송한다. 이 패킷에는 초기 순서 번호(Initial Sequence Number)가 포함된다. 이 번호는 데이터 스트림의 일부를 식별하기 위한 값이다.</p>
</li>
<li><h4 id="서버가-연결-요청-수락-및-응답syn-ack">서버가 연결 요청 수락 및 응답(SYN-ACK)</h4>
<p>서버는 클라이언트의 SYN 요청을 받으면 이를 수락하고 연결을 설정하기 위한 준비를 한다. 서버는 클라이언트에게 SYN-ACK(시작 및 확인) 패킷을 전송한다. 이 패킷은 서버의 초기 순서 번호와 함께 클라이언트가 보낸 초기 순서 번호에 1을 더한 값을 포함한다.</p>
</li>
<li><h4 id="클라이언트가-연결-요청-수락-응답ack">클라이언트가 연결 요청 수락 응답(ACK)</h4>
<p>클라이언트는 서버로부터 받은 SYN-ACK 패킷을 수신하면 이에 응답하기 위해 ACK(확인) 패킷을 서버로 전송한다. 이 패킷에는 클라이언트의 초기 순서 번호에 1을 더한 값을 포함하며, 클라이언트와 서버 간의 연결이 설정된다.</p>
</li>
</ol>
<p>이러한 3-Way Handshaking 과정을 통해 클라이언트와 서버는 서로의 신뢰성 있는 연결을 설정하고 데이터를 안전하게 주고받을 수 있게 된다. 연결이 설정된 후에는 데이터 전송이 이루어지며, 데이터 전송이 완료되면 연결을 종료하기 위한 4-Way Handshaking 과정이 이루어진다.</p>
<h2 id="4-way-handshaking">4-Way Handshaking</h2>
<p>4-Way Handshaking은 TCP에서 연결 종료를 위해 사용되는 프로세스이다. 이 과정은 다음과 같이 네 단계로 이루진다.</p>
<ol>
<li><h4 id="클라이언트가-연결-종료-요청fin">클라이언트가 연결 종료 요청(FIN)</h4>
<p>클라이언트가 서버와의 연결을 종료하고자 할 때, 클라이언트는 FIN(종료) 패킷을 서버로 전송한다. 이 패킷은 클라이언트가 더 이상 데이터를 보내지 않을 것임을 나타낸다.</p>
</li>
<li><h4 id="서버가-종료-요청-수락-및-응답ack">서버가 종료 요청 수락 및 응답(ACK)</h4>
<p>서버는 클라이언트로부터 받은 FIN 요청을 수락하고, 데이터를 모두 받았음을 의미하는 ACK(확인) 패킷을 클라이언트로 전송한다. 이때, 서버는 아직 보내지 않은 데이터가 있는 경우 이 데이터를 클라이언트로 전송할 수 있다.</p>
</li>
<li><h4 id="서버가-종료-요청fin">서버가 종료 요청(FIN)</h4>
<p>서버가 모든 데이터를 전송했고 클라이언트와의 연결을 종료하고자 할 때, 서버는 FIN(종료) 패킷을 클라이언트로 전송한다. 이 패킷은 서버가 더 이상 데이터를 보내지 않을 것임을 나타낸다.</p>
</li>
<li><h4 id="클라이언트가-종료-요청-수락-및-응답ack">클라이언트가 종료 요청 수락 및 응답(ACK)</h4>
<p>클라이언트는 서버로부터 받은 FIN 요청을 수락하고, 데이터를 모두 받았음을 의미하는 ACK(확인) 패킷을 서버로 전송한 후, 클라이언트와 서버 간의 연결을 종료한다.</p>
</li>
</ol>
<p>4-Way Handshaking은 클라이언트와 서버 간의 연결을 안전하게 종료하기 위한 프로세스로, 양측 모두가 데이터 송수신을 완료하고 연결을 종료함을 확인한다. 이를 통해 데이터의 신뢰성과 일관성을 유지하며 연결을 해제할 수 있다.</p>
<h2 id="arq-기법">ARQ 기법</h2>
<ol>
<li><h4 id="go-back-n-arq">GO-Back-N ARQ</h4>
<p>GO-Back-N ARQ는 손상되거나 분실된 프레임 이후의 프레임을 모두 재전송하는 방식으로, 추가 버퍼가 필요하지 않으며 상대적으로 간단한 구조를 가지고 구현이 단순하다. 하지만 단점으로는 하나의 패킷으로 인해 많은 패킷을 불필요하게 재전송해야 하는 점이 있다.</p>
</li>
<li><h4 id="selective-reject-arq">Selective-Reject ARQ</h4>
<p>Selective-Reject ARQ는 손상되거나 분실된 프레임만을 재전송하는 방식다. 이 방식은 추가적인 로직이 필요하며 순차적이지 않은 프레임을 재배열하기 위해 버퍼가 필요하다.</p>
</li>
<li><h4 id="stop-and-wait-arq">Stop-and-wait ARQ</h4>
<p>Stop-and-wait ARQ는 수신 측에서 전송한 1개의 프레임을 송신 측에서 손상 및 분실을 검사하여 손상 분실 시 재전송하는 방식이다. 이 방식은 구현 방식이 단순하여 최대 프레임 크기의 버퍼를 하나만 필요로 하다. 그러나 단점으로는 송신 측에서 확인을 할 때까지 다음 프레임을 전송할 수 없으므로 전송 효율이 떨어진다는 점이 있어 실제 네트워크에서는 채택되지 않는 방식이다.</p>
</li>
<li><h4 id="adaptive-arq">Adaptive ARQ</h4>
<p>Adaptive ARQ는 전송 효율을 최대화하기 위해 데이터 블록의 길이를 채널의 상태에 따라 동적으로 조절하는 방식이다. 이 방식은 전송 효율을 최적화하는 데 효과적이지만 제어 회로가 복잡하고 비용이 많이 들어가므로 현재는 거의 사용되지 않는 방식이다.</p>
</li>
</ol>
<br/>
이러한 TCP의 특징은 웹 브라우징, 이메일 전송과 같이 데이터의 정확성과 신뢰성이 필요한 응용 프로그램에 적합하다.


<h1 id="udpuser-datagram-protocol-사용자-데이터그램-프로토콜">UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)</h1>
<p>UDP는 연결 설정 과정 없이 데이터를 주고받는 비연결형 서비스를 제공하는 전송 계층 프로토콜이다. UDP는 데이터를 데이터그램 단위로 처리하며, 데이터그램은 독립적인 패킷을 의미한다. UDP는 주로 연속성보다는 데이터의 신속한 전달이 중요한 서비스에 사용된다. 예를 들어 DNS, 음성 인터넷 프로토콜(VoIP), 온라인 게임, 실시간 스트리밍 서비스 등에서 활용된다.</p>
<h1 id="udp-특징">UDP 특징</h1>
<ol>
<li><h4 id="비연결형-서비스">비연결형 서비스</h4>
<p>UDP는 데이터를 송수신할 때 연결 설정 과정을 거치지 않는다. 이는 TCP와 대조적인 특징으로, 빠른 데이터 전송이 요구되는 상황에서 유용하다.</p>
</li>
<li><h4 id="신뢰성-부족">신뢰성 부족</h4>
<p>데이터 손실 또는 오류 복구 기능이 없으며, UDP는 데이터를 전송할 때 신뢰성을 보장하지 않는다. 이는 데이터가 전송 중 손실될 수 있거나 순서가 바뀔 수 있다는 의미이다. 따라서 UDP는 신뢰성보다는 연속성이 중요한 서비스에 주로 사용된다.</p>
</li>
<li><h4 id="데이터-경계">데이터 경계</h4>
<p>UDP는 데이터그램 단위로 데이터를 처리하는데, 이는 각각의 데이터그램이 서로 독립적이며, 경계가 명확하게 구분됨을 의미한다. 이러한 특징은 데이터를 쪼개서 보내거나, 메시지 크기를 파악하기 위해 유용하다.</p>
</li>
<li><h4 id="빠른-전송">빠른 전송</h4>
<p>UDP는 연결 설정 및 신뢰성을 확인하는 추가적인 오버헤드가 없기 때문에 전송 속도가 빠르다. 따라서 UDP는 실시간 통신, 스트리밍 서비스, DNS(Domain Name System) 등에서 자주 사용된다. </p>
</li>
</ol>
<p>UDP의 가장 큰 장점은 빠른 전송 속도와 오버헤드가 적다는 점이지만, 단점으로는 데이터 손실이나 순서 변경이 발생할 수 있다는 점을 고려해야 한다.</p>
<h1 id="tcpudp-비교">TCP/UDP 비교</h1>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">TCP</th>
<th align="center">UDP</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">가상 회선 방식</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">UDP보다 느리다</td>
<td align="center">TCP보다 빠르다</td>
</tr>
<tr>
<td align="center">통신 방식</td>
<td align="center">1:1 통신</td>
<td align="center">1:1 or 1:N or N:N 통신</td>
</tr>
<tr>
<td align="center">용도</td>
<td align="center">웹 브라우징, 이메일 전송 등</td>
<td align="center">실시간 스트리밍, 온라인 게임, DNS 등</td>
</tr>
</tbody></table>
<p>TCP와 UDP는 각각의 특징과 장단점을 가지고 있으므로, 어떤 프로토콜을 선택할지는 사용하는 응용 프로그램의 요구 사항과 상황에 따라 다르다.</p>
<hr>
<h1 id="번외">번외</h1>
<h4 id="1-connection-timeout-연결-시간-초과">1. Connection Timeout (연결 시간 초과)</h4>
<ul>
<li>연결 시간 초과는 클라이언트가 서버에 연결을 시도할 때 해당 서버로의 연결을 설정하는 데 소요되는 최대 시간을 의미한다.</li>
<li><strong>발생</strong> : 클라이언트가 서버에 연결을 시도하면, 해당 연결이 설정될 때까지의 시간이 연결 시간 초과로 정의된다. 일반적으로, 클라이언트는 서버에 연결을 시도하고 일정 시간 내에 연결이 설정되지 않으면 연결 시간 초과 오류가 발생한다.</li>
</ul>
<h4 id="2-read-timeout-읽기-시간-초과">2. Read Timeout (읽기 시간 초과)</h4>
<ul>
<li>읽기 시간 초과는 연결이 설정된 후 클라이언트가 서버로부터 데이터를 읽는 과정에서, 서버로부터 응답을 받지 못하고 일정 시간 동안 데이터를 읽지 못하면 발생한다.</li>
<li><strong>발생</strong> : 클라이언트가 서버로부터 데이터를 읽기 위해 요청을 보내고, 서버가 응답을 제때 보내지 않거나 지연되면 읽기 시간 초과 오류가 발생한다.</li>
</ul>
<p>이러한 시간 초과 조건은 3-Way Handshake 중 연결 설정 및 데이터 교환 단계에서 중요한 역할을 한다. Connection Timeout은 클라이언트가 서버로의 연결 설정이 지연되거나 실패할 때 발생하며, Read Timeout은 이미 연결이 설정된 후 데이터를 주고받을 때 지연이나 문제가 발생할 때 발생한다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-네트워크] 프로토콜]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C</guid>
            <pubDate>Sun, 24 Sep 2023 11:12:18 GMT</pubDate>
            <description><![CDATA[<p>도로에서 교통을 통제하기 위해 빨간 불, 노란 불, 초록 불과 같은 신호등이 존재한다. 신호등은 어떤 차량이 움직일지, 어떤 차량이 멈추어야 하는지를 규정하는 중요한 역할을 한다. 교통 신호를 규정하는 신호등이 없다면 교통에 혼란을 겪을 것이다. 이와 유사하게 컴퓨터와 기기 간에 데이터를 원활하게 주고받기 위해 사용되는 것이 바로 프로토콜(Protocol)인데, 프로토콜에 대한 내용은 다음과 같다.</p>
<hr>
<h1 id="프로토콜">프로토콜</h1>
<p>프로토콜은 컴퓨터와 서버, 컴퓨터와 컴퓨터, 또는 애플리케이션과 애플리케이션 간에 통신을 원활하게 수행할 수 있도록 표준화시켜 놓은 통신 규약이다.</p>
<h1 id="프로토콜-구성-요소">프로토콜 구성 요소</h1>
<p>프로토콜은 구문(Syntax), 의미(Semantics), 타이밍(Time) 세 가지 구성 요소로 구성되어 있다.</p>
<ul>
<li><h4 id="구문syntax">구문(Syntax)</h4>
프로토콜의 구문은 전송하고자 하는 데이터의 형식, 부호화, 신호 레벨 등을 규정한다. 예를 들어, JSON(JavaScript Object Notation)은 데이터를 표현하는 방식 중 하나인데, JSON의 구문은 다음과 같다.</li>
</ul>
<pre><code class="language-JSON">{
    &quot;name&quot;: &quot;Smite&quot;,
    &quot;age&quot;: 20,
    &quot;city&quot;: &quot;New York&quot;
}</code></pre>
<p>이 예제에서는 JSON 형식을 사용하여 사용자 정보를 표현하는데, &quot;name&quot;, &quot;age&quot;, &quot;city&quot;와 같은 키와 해당 값들이 정해진 구문을 따르고 있다. 프로토콜은 데이터를 이러한 형식으로 정의하고, 이를 사용하여 데이터를 주고받는 방법을 정의한다.</p>
<ul>
<li><h4 id="의미semanfics">의미(Semanfics)</h4>
<p>프로토콜의 의미는 두 기기 간의 효율적이고 정확한 정보 전송을 위해 전송 조작, 데이터 해석, 오류 제어, 상태 관리 등의 제어 정보를 규정한다. 예를 들면, <a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP">TCP(Transmission Control Protocol)</a>는 데이터의 안정적인 전송을 보장하기 위한 프로토콜로, 데이터 전송의 순서, 오류 복구, 중복 데이터 처리 등의 의미를 정의한다.</p>
</li>
<li><h4 id="타이밍timing">타이밍(Timing)</h4>
<p>통신 속도, 메시지의 순서 제어 등을 규정한다. 예를 들어, <a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP">TCP</a> 프로토콜은 데이터 패킷의 전송 및 재전송 시간과 관련된 시간적인 측면을 다룬다.</p>
</li>
</ul>
<h1 id="프로토콜의-기능">프로토콜의 기능</h1>
<ol>
<li><h4 id="주소-지정addressing">주소 지정(Addressing)</h4>
<p>통신을 위해서는 통신 상대방의 주소를 알아야 한다. 프로토콜은 각 통신 계층에 맞는 주소 체계를 정의하여 데이터를 전송할 대상을 식별한다. 이 주소 지정 기능은 통신의 기초 중 하나이며, 예를 들면 IP 주소나 MAC 주소가 이에 해당된다.</p>
</li>
<li><h4 id="순서-제어sequence-control">순서 제어(Sequence Control)</h4>
<p>데이터가 전송될 때, 이 데이터들은 특정한 순서를 가져야 하는 경우가 있다. 특히 연결 지향형 프로토콜에서는 데이터의 순서를 관리하여 데이터가 올바른 순서로 도착하도록 보장한다. 이는 흐름 제어, 혼잡 제어 및 오류 제어와 관련된 중요한 역할을 한다.</p>
</li>
<li><h4 id="단편화-및-재조합fragmentation--reassembly">단편화 및 재조합(Fragmentation &amp; Reassembly)</h4>
<p>큰 데이터를 한 번에 전송하는 것은 비효율적일 수 있다. 프로토콜은 데이터를 작은 단위로 분할하여 전송하고, 수신 측에서는 이러한 단편화된 데이터를 재조합하여 원래의 데이터로 복구한다. 이를 통해 전송 효율성을 높이고 대용량 데이터 전송이 가능해진다.</p>
</li>
<li><h4 id="캡슐화encapsulation">캡슐화(Encapsulation)</h4>
<p>통신은 여러 계층으로 구성되며, 각 계층은 특정한 역할을 수행한다. 프로토콜은 데이터를 각 계층을 통과시키면서 필요한 정보를 추가하고, 수신 측에서는 이 정보를 제거하여 데이터를 추출한다. 이 과정을 캡슐화라고 하며, 각 계층에서 데이터를 추가하거나 제거한다.</p>
</li>
<li><h4 id="연결-제어connection-control">연결 제어(Connection Control)</h4>
<p>통신은 연결 지향형과 비연결 지향형 두 가지 방식으로 이루어진다. 연결 제어는 연결 지향형 통신에서 연결 설정, 데이터 전송, 연결 해제 등을 다룬다. 예를 들어, <a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP">TCP</a>는 연결 지향형 프로토콜로, 3-way 핸드셰이킹을 통해 연결을 설정하고, 데이터를 안정적으로 전송한다.</p>
</li>
<li><h4 id="흐름-제어flow-control">흐름 제어(Flow Control)</h4>
<p>송신 측과 수신 측 간의 데이터 전송 속도 차이로 인한 데이터 유실을 방지하기 위해 흐름 제어를 수행한다. 이는 수신 측이 데이터를 처리할 수 있는 속도로 데이터를 송신 측에서 전송하는 것을 조절하는 메커니즘을 말한다.</p>
</li>
<li><h4 id="오류-제어error-control">오류 제어(Error Control)</h4>
<p>데이터를 교환할 때, 데이터의 손상 또는 유실을 방지하고, 손상된 데이터를 식별하고 복구하기 위한 기법으로 오류 제어가 사용된다. 이는 데이터의 무결성을 유지하고 품질을 보장하는 데 중요하다.</p>
</li>
<li><h4 id="동기화synchronization">동기화(Synchronization)</h4>
<p>송신 측과 수신 측 간의 데이터 전송 시점을 정확하게 일치시키는 것은 중요하다. 특히 비동기 통신에서는 데이터의 동기화가 필수적이다.</p>
</li>
<li><h4 id="다중화multiplexing">다중화(Multiplexing)</h4>
<p>다중화는 하나의 통신 선로에서 여러 시스템이 동시에 통신할 수 있도록 하는 기술이다. 이는 효율적인 자원 활용을 가능하게 한다.</p>
</li>
<li><h4 id="전송-서비스">전송 서비스</h4>
<p>프로토콜은 데이터 전송에 대한 다양한 서비스를 제공한다. 이 서비스에는 우선순위 결정, 서비스 등급 설정 등이 포함된다. 예를 들어, QoS (Quality of Service)를 통해 특정 데이터에 대한 서비스 품질을 관리할 수 있다.</p>
</li>
</ol>
<p>프로토콜은 이러한 다양한 기능을 통해 통신 시스템 간의 상호 운용성을 보장하고 데이터 교환을 원활하게 수행할 수 있도록 한다. 이러한 표준화된 규약은 서로 다른 시스템 간에 효율적인 데이터 통신 및 네트워크 상호 작용을 가능하게 하며, 다양한 응용 분야에서 핵심적으로 활용된다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 형 변환]]></title>
            <link>https://velog.io/@ch_dev/Java-%ED%98%95-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@ch_dev/Java-%ED%98%95-%EB%B3%80%ED%99%98</guid>
            <pubDate>Mon, 11 Sep 2023 15:09:58 GMT</pubDate>
            <description><![CDATA[<p>형 변환은 프로그래밍에서 데이터를 다룰 때 필수적인 기술 중 하나로 데이터의 타입을 변환하는 프로세스를 의미한다. 데이터를 다루다 보면 서로 다른 데이터 형식 간의 변환이 필요한 순간이 자주 발생한다. 이럴 때 형 변환을 통하여 데이터 형식을 통일시키거나 원하는 형식으로 변경할 수 있다. 자바에서는 데이터 타입 간의 형 변환이 필요한 경우가 많으며, <strong>묵시적 형 변환</strong>과 <strong>명시적 형 변환</strong> 두 가지 유형으로 나눌 수 있다.</p>
<hr>
<h1 id="묵시적-형-변환implicit-type-conversion-자동-형-변환"><strong>묵시적 형 변환(Implicit Type Conversion, 자동 형 변환)</strong></h1>
<p>묵시적 형 변환은 자동으로 발생하는 형 변환이며, 자바에서는 데이터의 손실 없이 작은 데이터 타입에서 큰 데이터 타입으로 형 변환된다. 정수 데이터를 실수로 변환하거나 작은 정수 데이터 타입을 큰 정수 데이터 타입으로 변환하는 등 작은 데이터 타입의 값을 큰 데이터 타입의 변수에 대입하는 경우에 발생한다.</p>
<p>예를 들어, <code>int</code>를 <code>double</code>로 대입하거나 <code>short</code>를 <code>int</code>로 대입하는 경우이다.</p>
<pre><code class="language-java">int myInt = 42;
double myDouble = myInt; // 묵시적 형변환</code></pre>
<p>위의 코드에서 <code>myInt</code>는 <code>int</code> 타입이고 <code>myDouble</code>은 <code>double</code> 타입이다. <code>myInt</code>의 값을 <code>myDouble</code>에 대입할 때 묵시적으로 <code>int</code>에서 <code>double</code>로 형 변환이 일어나는데, <code>int</code>는 <code>double</code>보다 작은 데이터 타입이므로 <code>int</code> 값을 <code>double</code>로 할당하면 데이터 손실 없이 <code>int</code> 값이 <code>double</code>로 자동 형 변환된다.</p>
<p><img src="https://velog.velcdn.com/images/ch_dev/post/79c45284-c779-4c5b-8fe7-cd865170dc0c/image.png" alt="원시 타입의 묵시적 형 변환"></p>
<p>자바에서는 데이터 타입의 표현 범위에 따라 이미지와 같은 방향으로 묵시적 형 변환이 이루어진다.</p>
<p>이미지를 보면 <code>short</code>와 <code>char</code>의 크기가 같은데 묵시적 형 변환이 이루어지지 않거나 <code>long</code>이 <code>float</code>보다 크기는 크지만 묵시적인 형 변환이 이루어지지 않는 것을 알 수 있다. </p>
<p>이러한 이유는 데이터 표현 방식의 차이 때문이다.
<code>short</code>와 <code>char</code>은 모두 2 바이트의 크기를 갖지만, <code>short</code>는 부호 있는(signedt) 정수 데이터 타입으로 음수와 양수 값을 표현(-32,768 ~ 32,767) 할 수 있고, <code>char</code>는 부호 없는(unsigned) 정수 데이터 타입으로 양의 정수를 표현(0 ~ 65535) 하는데 사용된다. 따라서 <code>short</code>와 <code>char</code>는 서로 데이터 표현 범위 범위가 달라서 둘 중 어느 쪽으로의 형 변환은 값 손실이 발생할 수 있으므로 묵시적으로 형 변환이 수행될 수 없다. </p>
<p>또한, 8 바이트인<code>long</code>과 4 바이트인<code>float</code> 중에서 크기는 <code>long</code>이 더 크지만 데이터 표현 범위는 <code>float</code>이 더 크다. 게다, <code>long</code>은 정수 데이터 타입이고 <code>float</code>는 부동 소수점 데이터 타입이다. 부동 소수점은 소수점 이하 값을 저장할 수 있고, 정수는 소수점 이하 값을 저장하지 않는데, 정수 데이터 타입인 <code>long</code>에서 부동 소수점 데이터 타입인 <code>float</code>로의 묵시적 형 변환은 데이터 손실이 발생할 수 있기 때문에 자동으로 수행되지 않는다.</p>
<ul>
<li><a href="https://velog.io/@ch_dev/Java-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85">[Java] 원시 타입과 참조 타입</a></li>
</ul>
<h1 id="명시적-형-변환-explicit-type-conversion-강제-형-변환"><strong>명시적 형 변환 (Explicit Type Conversion, 강제 형 변환)</strong></h1>
<p>명시적 형 변환은 개발자가 직접 형변환을 수행하는 것으로, 큰 데이터 타입을 작은 데이터 타입으로 변환할 때 사용된다. 이 경우, 데이터 손실이 발생할 수 있으므로 주의해야 한다. 명시적 형 변환은 괄호 안에 변환하려는 타입을 명시해주어야 한다.</p>
<p>예를 들어, <code>double</code>에서 <code>int</code>로 형변환하는 경우가 있다. <code>double</code>은 <code>int</code>보다 큰 데이터 타입이므로 명시적 형변환을 사용하여 <code>double</code> 값을 <code>int</code>로 변환할 수 있다.</p>
<pre><code class="language-java">double myDouble = 3.14;
int myInt = (int) myDouble; // 명시적 형 변환</code></pre>
<p>위의 코드에서 <code>myDouble</code>은 <code>double</code> 타입이고 <code>myInt</code>는 <code>int</code> 타입이다. <code>myDouble</code>의 값을 <code>int</code>로 형변환하려면 <code>(int)</code>로 명시적으로 표현한다. 이때 데이터의 손실이 발생하므로 주의가 필요하다.</p>
<p><em>(<code>double</code>은 실수를 표현할 수 있는 데이터 타입으로 소수점 아래 값을 가질 수 있지만, <code>int</code>는 정수 데이터 타입으로 소수점 이하의 값을 저장할 수 없다. 따라서 <strong>3.14</strong>와 같은 실수 값은 <code>int</code>로 변환할 때 소수점 이하 데이터가 손실되고 <strong>3</strong>으로 줄어들게 된다.)</em></p>
<h1 id="형-변환-주의사항"><strong>형 변환 주의사항</strong></h1>
<p>자바에서 형 변환을 다룰 때 몇 가지 주의할 점이 있다.</p>
<ul>
<li><p><strong>데이터 손실</strong>
큰 데이터 타입에서 작은 데이터 타입으로 형 변환 시 데이터 손실이 발생할 수 있으므로 주의해야 한다.</p>
</li>
<li><p><strong>무효한 형 변환</strong>
서로 호환되지 않는 데이터 타입 간의 형 변환은 무효하며 컴파일 오류를 일으킨다.</p>
</li>
<li><p><strong>범위 초과</strong>
정수 데이터 타입을 다른 정수 데이터 타입으로 변환할 때 범위 초과에 주의해야 한다.</p>
</li>
<li><p><strong>부호 비트 손실</strong>
부호 있는 데이터 타입을 부호 없는 데이터 타입으로 변환할 때 부호 비트 손실이 발생할 수 있다.</p>
</li>
</ul>
<h1 id="형-변환-활용"><strong>형 변환 활용</strong></h1>
<ol>
<li><p><strong>데이터 형식 변경</strong></p>
<ul>
<li>정수를 부동 소수점으로 변환하여 계산<pre><code class="language-java">int intNumber = 42;
double doubleNumber = (double) intNumber;</code></pre>
</li>
</ul>
</li>
<li><p><strong>문자열 처리</strong></p>
<ul>
<li>문자열을 정수로 변환하여 연산   <pre><code class="language-java">String strNumber = &quot;123&quot;;
int intNumber = Integer.parseInt(strNumber);</code></pre>
</li>
</ul>
</li>
<li><p><strong>배열 형식 변경</strong></p>
<ul>
<li>정수 배열을 부동 소수점 배열로 변환</li>
</ul>
</li>
</ol>
<pre><code class="language-java">     int[] intArray = {1, 2, 3};
     double[] doubleArray = new double[intArray.length];

     for (int i = 0; i &lt; intArray.length; i++) {
         doubleArray[i] = (double) intArray[i];
     }</code></pre>
<ol start="4">
<li><p><strong>날짜 및 시간 처리</strong></p>
<ul>
<li><p>날짜를 다른 형식으로 형식화하거나 파싱</p>
<pre><code class="language-java">// Date를 문자열로 변환
Date currentDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);
String dateString = dateFormat.format(currentDate);

// 문자열을 Date로 변환
String dateStr = &quot;2023-09-10&quot;;
Date parsedDate = dateFormat.parse(dateStr);</code></pre>
</li>
</ul>
</li>
<li><p><strong>비트 조작</strong></p>
<ul>
<li>비트 연산을 수행하여 데이터를 조작<pre><code class="language-java">int flags = 5; // 이진 플래그: 101
boolean isFlagSet = (flags &amp; 4) != 0; // 비트 2(4)가 설정되어 있는지 확인</code></pre>
</li>
</ul>
</li>
<li><p><strong>타입 호환성 관리</strong></p>
<ul>
<li><p>상위 클래스 타입에서 하위 클래스 타입으로 변환</p>
<pre><code class="language-java">class Animal { }
class Dog extends Animal { }

Animal animal = new Dog(); // Dog를 Animal로 형 변환</code></pre>
</li>
</ul>
</li>
<li><p><strong>인터페이스 구현</strong>:</p>
<ul>
<li><p>인터페이스를 구현한 클래스 간의 형 변환</p>
<pre><code class="language-java">interface Shape { void draw(); }
class Circle implements Shape { /* 구현 생략 */ }

Shape shape = new Circle(); // Circle을 Shape로 형 변환</code></pre>
</li>
</ul>
</li>
<li><p><strong>다형성 활용</strong>:</p>
<ul>
<li><p>다형성을 통해 여러 객체를 동일한 인터페이스나 상위 클래스로 다룸</p>
<pre><code class="language-java">List&lt;Shape&gt; shapes = new ArrayList&lt;&gt;();
shapes.add(new Circle());
shapes.add(new Rectangle());

for (Shape shape : shapes) {
    shape.draw();
}</code></pre>
</li>
</ul>
</li>
</ol>
<p>형 변환은 다양한 상황에서 프로그램의 유연성과 확장성을 높이는 데 도움이 되며, 데이터를 필요한 형식으로 변환하거나 다양한 객체를 처리하는 데 중요한 역할을 한다. 하지만 데이터의 유효성을 검사하고 적절한 예외 처리를 수행하여 형 변환 오류를 방지하는 것도 중요하다.</p>
<hr>
<h4 id="📖java-index"><a href="https://velog.io/@ch_dev/Java-Index" title="Java Index">📖Java Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 원시 타입과 참조 타입]]></title>
            <link>https://velog.io/@ch_dev/Java-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@ch_dev/Java-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Fri, 25 Aug 2023 23:26:39 GMT</pubDate>
            <description><![CDATA[<p>프로그래밍 언어에서 변수를 다루는 방식은 데이터 타입에 따라 다양하게 변한다. 자바에서는 데이터 타입을 크게 <strong>원시 타입(Primitive Type)</strong>과 <strong>참조 타입(Reference Type)</strong> 두 가지로 구분할 수 있다. 이 둘은 프로그래밍 언어의 핵심 요소로, 데이터의 특징과 사용 방식에서 차이를 보인다.</p>
<hr>
<h1 id="원시-타입-primitive-type">원시 타입 (Primitive Type)</h1>
<ul>
<li>원시 타입은 간단한 데이터 값을 직접 저장하는 타입이다.</li>
<li>스택(Stack) 메모리에 변수의 값을 직접 저장하므로 빠르고 메모리 효율적인 연산이 가능하다.</li>
<li>원시 타입의 변수는 실제 값을 저장하므로 변수 간의 비교는 값 자체를 비교한다.</li>
<li>원시 타입에는 논리형(<code>boolean</code>), 문자형(<code>char</code>), 정수형(<code>byte</code>, <code>short</code>, <code>int</code>, <code>long</code>) 실수형(<code>float</code>, <code>double</code>)이 있다.</li>
<li>원시 타입은 크기와 표현 범위가 정해져 있으며 null 값을 가질 수 없다.</li>
</ul>
<h2 id="원시-자료형">원시 자료형</h2>
<h3 id="논리형">논리형</h3>
<h4 id="boolean">boolean</h4>
<ul>
<li>할당되는 메모리 크기 : 1 byte</li>
<li>기본값 : <code>flase</code></li>
<li>데이터 표현 범위 : true, flase</li>
</ul>
<pre><code class="language-java">    boolean myBoolean = true;</code></pre>
<h3 id="문자형">문자형</h3>
<h4 id="char">char</h4>
<ul>
<li>할당되는 메모리 크기 : 2 byte</li>
<li>기본값 : &#39;\u0000&#39; (유니코드의 널 문자)</li>
<li>데이터 표현 범위 : 0 ~ 65,535</li>
</ul>
<pre><code class="language-java">    char myChar = &#39;A&#39;;</code></pre>
<h3 id="정수형">정수형</h3>
<p>정수형의 기본 자료형은 <code>int</code>이다.</p>
<h4 id="byte">byte</h4>
<ul>
<li>할당되는 메모리 크기 : 1 byte</li>
<li>기본값 : 0</li>
<li>데이터 표현 범위 : -$$2^{7}$$ ~ $$2^{7}$$-1 (-128 ~ 127)</li>
</ul>
<pre><code class="language-java">    byte myByte = 10;</code></pre>
<h4 id="short">short</h4>
<ul>
<li>할당되는 메모리 크기 : 2 byte</li>
<li>기본값 : 0</li>
<li>데이터 표현 범위 : -$$2^{15}$$ ~ $$2^{15}$$-1 (-32,768 ~ 32,767)</li>
</ul>
<pre><code class="language-java">    short myShort = 1000;</code></pre>
<h4 id="int">int</h4>
<ul>
<li>할당되는 메모리 크기 : 4 byte</li>
<li>기본값 : 0</li>
<li>데이터 표현 범위 : -$$2^{31}$$ ~ $$2^{31}$$-1 (-2,147,483,648 ~ 2,147,483,647)</li>
</ul>
<pre><code class="language-java">    int myInt = 100000;</code></pre>
<h4 id="long">long</h4>
<ul>
<li>할당되는 메모리 크기 : 8 byte</li>
<li>기본값 : 0L</li>
<li>데이터 표현 범위 : -$$2^{63}$$ ~ $$2^{63}$$-1 
(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)</li>
<li>리터럴 타입 접미사 : L, l</li>
</ul>
<pre><code class="language-java">    long myLong = 1000000000;    // 에러 발생
    long myLong = 1000000000L;

/* long타입의 리터럴에는 접미사 L 또는 l 를 붙여야하는데,
이를 표기하지 않으면 int형으로 간주하게 되어 에러가 발생한다. */</code></pre>
<h3 id="실수형">실수형</h3>
<p>실수형의 기본 자료형은 <code>double</code>이다.</p>
<h4 id="float">float</h4>
<ul>
<li>할당되는 메모리 크기 : 4 byte</li>
<li>기본값 : 0.0f</li>
<li>데이터 표현 범위 : -$$3.4<em>10^{-38}$$ ~ $$3.4</em>10^{38}$$</li>
<li>리터럴 타입 접미사 : F, f</li>
</ul>
<pre><code class="language-java">    float myFloat = 3.14;    // 에러 발생
    float myFloat = 3.14f;

/* float타입의 리터럴에는 접미사 F 또는 f 를 붙여야하는데,
이를 표기하지 않으면 double형으로 간주하게 되어 에러가 발생한다. */</code></pre>
<h4 id="double">double</h4>
<ul>
<li>할당되는 메모리 크기 : 8 byte</li>
<li>기본값 : 0.0</li>
<li>데이터 표현 범위 : -$$1.7<em>10^{-308}$$ ~ $$1.7</em>10^{308}$$</li>
<li>리터럴 타입 접미사 : D, d(생략 가능)</li>
</ul>
<pre><code class="language-java">    double myDouble = 3.141592;</code></pre>
<h2 id="원시-타입-사용-시-주의사항">원시 타입 사용 시 주의사항</h2>
<ol>
<li><p><strong>초기화</strong>
원시 타입 변수는 선언한 후 반드시 초기화되어야 한다. 초기화하지 않은 변수를 사용하려고 하면 컴파일 오류가 발생한다. 초기화는 변수에 적절한 값을 할당하는 것을 의미하며, 초기화하지 않으면 해당 원시 타입의 기본값이 자동으로 할당된다.</p>
</li>
<li><p><strong>데이터 표현 범위 주의</strong>
각 원시 타입은 표현 가능한 값의 범위가 다르다. 예를 들어 <code>byte</code> 타입은 -128부터 127까지의 값을 표현할 수 있지만, 이 범위를 벗어나는 값이 할당되면 오버플로우(Overflow)가 발생할 수 있다. 데이터의 범위를 고려하여 적절한 원시 타입을 선택하고 사용해야 한다.</p>
</li>
<li><p><strong>정밀도 손실</strong>
실수형 원시 타입인 <code>float</code>와 <code>double</code>은 부동 소수점 형식을 사용하며, 이로 인해 정밀도 손실이 발생할 수 있다. 특히 긴 계산을 수행할 때 정밀한 결과가 필요한 경우, 부동 소수점 타입 사용 시 주의가 필요하다.</p>
</li>
<li><p><strong>객체와 혼용 불가</strong>
원시 타입은 객체가 아니기 때문에, 객체와 혼용할 수 없다. 예를 들어 원시 타입 변수에는 메소드를 호출할 수 없으며, <code>null</code> 값으로 초기화할 수 없다. 이런 경우에는 참조 타입을 사용해야 한다.</p>
</li>
<li><p><strong>박싱과 언박싱</strong>
원시 타입을 참조 타입으로 변환하거나, 참조 타입을 원시 타입으로 변환하는 작업은 박싱(Boxing)과 언박싱(Unboxing)이라고 불린다. 이 작업은 자동으로 처리되기도 하지만, 성능 저하를 유발할 수 있으므로 반드시 필요한 경우에만 사용해야 한다.</p>
</li>
<li><p><strong>배열과 제네릭 컬렉션</strong>
원시 타입을 배열이나 제네릭 컬렉션에 저장할 경우, 타입 안정성(type safety)이 보장되지 않는다. 따라서 객체를 다루는 경우에는 객체 래퍼 클래스(Wrapper Class)를 사용하거나, 자바 제네릭(Java Generic)를 활용하여 타입 안정성을 유지하는 것이 좋다.</p>
</li>
</ol>
<hr>
<h1 id="참조-타입-reference-type">참조 타입 (Reference Type)</h1>
<ul>
<li>참조 타입은 객체의 주소를 저장하는 타입이다.<ul>
<li>참조 타입은 스택에는 참조(메모리 주소) 값이, 실제 데이터는 힙(Heap) 메모리에 저장된다.</li>
</ul>
</li>
<li>객체의 데이터와 메서드는 힙에 저장되어 해당 객체의 주소로 접근한다.</li>
<li>원시 타입의 8가지 자료형을 제외한 타입으로 <code>클래스</code>, <code>인터페이스</code>, <code>배열</code> 등이 참조 타입이다.</li>
<li>참조 타입의 변수는 객체의 내용을 비교하는 것이 아니라 주소를 비교한다.</li>
<li>참조 타입 변수는 초기화하지 않거나, 참조할 객체가 없는 경우 <code>null</code> 값을 가진다.</li>
</ul>
<pre><code class="language-java">// String은 참조 타입으로 문자열을 나타내는 클래스이다.
String myString = &quot;Hello, Java!&quot;;</code></pre>
<h2 id="자주-사용되는-참조-타입">자주 사용되는 참조 타입</h2>
<ol>
<li><p><strong>클래스(Class)</strong>
사용자가 정의한 데이터 타입을 나타내며 객체의 속성(멤버 변수)과 동작(메서드)를 정의한다.</p>
</li>
<li><p><strong>인터페이스(Interface)</strong>
클래스가 구현해야 하는 메서드 목록을 정의한다. 다중 상속을 지원하기 위한 중요한 개념이다.</p>
</li>
<li><p><strong>배열(Array)</strong>
동일한 타입의 데이터를 여러 개 저장하는 자료 구조이다.</p>
</li>
<li><p><strong>열거형(Enum)</strong>
몇 가지 고정된 값 중 하나를 나타내는 데이터 타입이다. 열거형은 보통 연관된 상수 값을 그룹화할 때 사용된다.</p>
</li>
<li><p><strong>제네릭(Generic)</strong>
클래스나 메서드를 작성할 때 타입을 파라미터화할 수 있는 기능을 제공한다. 타입 안정성을 높이고 재사용성을 높이는 데 사용된다.</p>
</li>
</ol>
<h2 id="참조-타입-사용-시-주의-사항">참조 타입 사용 시 주의 사항</h2>
<ol>
<li><p><strong>Null 체크</strong>
참조 타입 변수는 <code>null</code>일 수 있으므로 사용 전에 항상 <code>null</code> 여부를 체크해야 한다.</p>
</li>
<li><p><strong>메모리 관리</strong>
참조 타입은 힙 메모리에 저장되므로 메모리 누수를 방지하기 위해 더 이상 필요하지 않는 객체에 대한 참조를 해제해야 한다.</p>
</li>
<li><p><strong>객체 생성</strong>
클래스의 인스턴스를 생성할 때 <code>new</code> 키워드를 사용하며, 생성자를 호출하여 객체를 초기화한다.</p>
</li>
</ol>
<hr>
<h1 id="정리">정리</h1>
<h2 id="원시-타입">원시 타입</h2>
<ol>
<li><p><strong>단순한 데이터 값을 저장</strong>
원시 타입 변수는 해당 데이터의 값을 직접 저장한다. 복잡한 구조를 가지지 않으며, 그 자체로 값 하나를 나타낸다.</p>
</li>
<li><p><strong>스택 메모리에 저장</strong>
원시 타입 변수는 스택(Stack) 메모리에 직접 값이 저장된다. 스택 메모리는 데이터를 효율적으로 저장하고 관리하는 데 사용되며, 변수의 범위(scope)와 함께 관리된다.</p>
</li>
<li><p><strong>기본형 타입</strong>
원시 타입은 다음과 같은 기본형(primitive type)으로 나뉜다.</p>
<ul>
<li>논리형(boolean): <code>true</code> 또는 <code>false</code> 값을 표현</li>
<li>문자형(char): 문자 하나를 표현 (유니코드)</li>
<li>정수형(byte, short, int, long): 정수 값을 표현 (부호와 크기에 따라 다름)</li>
<li>실수형(float, double): 부동 소수점 수를 표현 (소수 부분의 정확도가 다름)</li>
</ul>
</li>
<li><p><strong>자동 초기화</strong>
원시 타입 변수는 선언만 하고 초기화하지 않으면 해당 데이터 타입에 따른 기본 값으로 자동 초기화된다. 이는 변수를 사용하기 전에 명시적으로 초기화해야 할 필요가 없다는 장점을 가진다.</p>
</li>
<li><p><strong>메모리 사용량이 적음</strong>
원시 타입 변수는 각각 고정된 크기를 가지므로 메모리 사용량이 상대적으로 적다. 이는 대량의 데이터를 다룰 때 효율적이다.</p>
</li>
<li><p><strong>빠른 연산</strong>
원시 타입은 별도의 연산을 거치지 않고 직접 연산이 가능하기 때문에 연산이 빠르다.</p>
</li>
<li><p><strong>객체가 아닌 값</strong>
원시 타입은 객체가 아닌 값(value)을 다룬다. 이로 인해 객체 지향 프로그래밍 언어인 자바에서도 기본적인 연산과 데이터 저장에 효율적으로 사용된다.</p>
</li>
</ol>
<br>

<h2 id="참조-타입">참조 타입</h2>
<ol>
<li><p><strong>메모리 동적 할당</strong>
참조 타입의 데이터는 스택 메모리가 아닌 힙(heap) 메모리에 저장된다. 이는 데이터 크기가 동적으로 변할 수 있음을 의미하며, 메모리의 효율적인 활용을 가능하게 한다.</p>
</li>
<li><p><strong>객체 지향 프로그래밍</strong>
참조 타입은 객체 지향 프로그래밍(OOP)의 핵심 원칙을 구현하는 데 사용된다. 클래스를 정의하고 인스턴스(객체)를 생성하여 데이터와 동작을 함께 캡슐화할 수 있다.</p>
</li>
<li><p><strong>Null 값 지원</strong>
참조 타입 변수는 참조할 객체가 없는 경우 <code>null</code> 값을 가질 수 있다. 이는 객체의 존재 유무를 나타내는데 유용하게 사용된다.</p>
</li>
</ol>
<br>

<h2 id="원시-타입과-참조-타입의-차이점"><strong>원시 타입과 참조 타입의 차이점</strong></h2>
<ol>
<li><p><strong>값 vs 주소</strong>
원시 타입은 값을 직접 저장하고, 참조 타입은 값이 저장된 메모리 주소를 가리킨다.</p>
</li>
<li><p><strong>크기</strong>
원시 타입은 크기가 정해져 있으며, 참조 타입은 객체의 크기가 변한다.</p>
</li>
<li><p><strong>메모리 영역</strong>
원시 타입은 스택(Stack)에 저장되고, 참조 타입은 스택에는 주소가, 객체는 힙(Heap) 메모리에 저장된다.</p>
</li>
<li><p><strong>null 값</strong>
원시 타입은 항상 값을 가지며 초기화된다. 참조 타입은 초기화되지 않으면 <code>null</code> 값을 가진다.</p>
</li>
<li><p><strong>사용</strong>
원시 타입은 단순한 데이터 값을 저장하고 연산할 때 사용되며, 참조 타입은 객체를 생성하고 그 내부의 데이터와 메서드에 접근할 때 사용된다.</p>
</li>
</ol>
<br>

<p>원시 타입은 값 자체를 저장하므로 작은 메모리 공간을 사용하며 빠른 연산이 가능하다. 반면에 참조형 변수는 실제 값이 아니라 객체나 배열의 메모리 주소를 저장하며, 해당 주소를 통해 실제 데이터에 접근한다.</p>
<p>원시 타입과 참조 타입은 자바 프로그래밍에서 기본적인 개념 중 하나로, 개발자가 변수를 선언하고 데이터를 다루는 데 있어서 핵심적인 역할을 한다.</p>
<p>빠른 연산을 위해 사용되는 원시 타입과 객체 지향 프로그래밍에서 다양한 종류의 객체를 효율적으로 다룰 수 있도록 해주는 참조 타입의 특징을 이해하고 적절히 활용하는 것은 코드의 효율성과 가독성을 높이는데 도움이 될 것이다.</p>
<hr>
<h4 id="📖java-index"><a href="https://velog.io/@ch_dev/Java-Index" title="Java Index">📖Java Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 변수와 상수]]></title>
            <link>https://velog.io/@ch_dev/Java-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98</link>
            <guid>https://velog.io/@ch_dev/Java-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98</guid>
            <pubDate>Wed, 23 Aug 2023 12:42:19 GMT</pubDate>
            <description><![CDATA[<p>변수와 상수는 프로그래밍에서 기본적이고 핵심적인 개념으로, 데이터의 저장과 관리를 위해 사용된다. 이 두 가지 요소는 프로그램의 실행 중 데이터의 유연한 처리와 저장을 가능하게 하며, 프로그래밍 언어에서는 데이터를 조작하고 다루는 데 필수적인 역할을 한다.</p>
<hr>
<h1 id="변수-variable">변수 (Variable)</h1>
<p>변수(Variable)는 프로그램에서 사용되는 값을 저장하는 메모리 공간을 의미한다. 변수는 데이터의 특성에 따라 다양한 타입으로 선언할 수 있으며, 이렇게 저장된 값은 나중에 필요한 곳에서 다시 사용할 수 있으며, 저장된 변수의 값은 변경이 될 수 있다.</p>
<h2 id="변수의-종류">변수의 종류</h2>
<p>자바에서는 기본형 변수(Primitive Variables)와 참조형 변수(Reference Variables) 두 가지 유형의 변수가 존재한다.</p>
<ul>
<li><a href="https://velog.io/@ch_dev/Java-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85">[Java] 원시 타입과 참조 타입</a></li>
</ul>
<h2 id="변수-네이밍-규칙">변수 네이밍 규칙</h2>
<ol>
<li>변수 이름은 영문자나 언더바(<code>_</code>), 달러 기호(<code>$</code>)로 시작해야 하며, 숫자로 시작할 수 없다.</li>
<li>변수는 대소문자를 구분한다.</li>
<li>변수 이름에는 영문자, 숫자, 언더바(<code>_</code>), 달러 기호(<code>$</code>)를 사용할 수 있다.</li>
<li>변수 이름은 언더바(<code>_</code>), 달러 기호(<code>$</code>)를 제외한 특수문자나 예약어(키워드)는 변수 이름으로 사용할 수 없다.</li>
</ol>
<pre><code class="language-java">1.변수 이름 영문자 및 언더바(`_`), 달러 기호(`$`)로 시작
String name;    // 변수 name 선언
String $name;    // 변수 $name 선언
String 1name;    // 변수 이름 숫자로 시작 -&gt; 변수 선언 불가

2.변수 대소문자 구분
int age;        // 변수 age 선언
int Age;        // 변수 Age 선언

4.변수 이름 언더바(`_`), 달러 기호(`$`)를 제외한 특수문자 및 예약어 사용 불가
int #value;        // 변수 이름 특수문자 포함 -&gt; 변수 선언 불가
String int;        // 변수 이름 예약어로 선언 -&gt; 변수 선언 불가
</code></pre>
<p><strong>예약어</strong>
자바에서 이미 의미를 갖고 있는 키워드 (<code>int</code>, <code>boolean</code>, <code>class</code> 등)</p>
<h2 id="변수의-선언과-초기화">변수의 선언과 초기화</h2>
<p>자바에서 변수를 사용하기 위해서는 먼저 변수를 선언하고 초기화해야 한다. 변수를 선언하는 것은 해당 변수의 이름과 데이터 타입을 정의하는 과정이다. 초기화는 변수에 실제 값을 할당하는 것을 의미한다. 변수를 선언한 후에 초기값을 주지 않으면 해당 변수는 <a href="https://velog.io/@ch_dev/Java-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85">기본 초기값</a>으로 자동으로 초기화된다.</p>
<pre><code class="language-java">int age;         // 변수 선언
age = 25;        // 변수 초기화
int score = 90;  // 변수 선언과 초기화</code></pre>
<h2 id="변수의-사용과-변경">변수의 사용과 변경</h2>
<p>변수를 선언하고 초기화한 후에는 해당 변수를 사용하여 연산하거나 다른 변수와 조합하여 프로그램 로직을 작성할 수 있다. 변수는 프로그램 실행 중에 값이 변경될 수 있다.</p>
<pre><code class="language-java">int count = 0;        // 변수 선언과 초기화
count = count + 1;  // 변수 값 변경</code></pre>
<h2 id="변수의-유효-범위">변수의 유효 범위</h2>
<p>변수는 특정한 유효 범위(Scope)에서만 사용할 수 있다. 유효 범위란 변수가 존재하고 접근 가능한 영역을 말한다. 보통 중괄호(<code>{}</code>)로 둘러싸인 코드 블록 내에서 변수가 선언되면 해당 블록 내에서만 사용할 수 있다. 이를 블록 스코프(Block Scope)라고 한다.</p>
<p>아래의 예제는 정상적으로 값을 출력하는 경우와 변수가 다른 스코프에서 사용되어 오류가 발생하는 경우이다.</p>
<pre><code class="language-java">1.값을 정상 출력하는 경우
public class ScopeExample {

    public static void main(String[] args) {
        int variable1 = 10;                    // 변수 선언과 초기화
        System.out.println(variable1);        // 변수 출력
        outerMethod();                        // outerMethod 메서드 호출
    }

    public static void outerMethod() {
        int variable2 = 5;                    // 변수 선언과 초기화
        System.out.println(variable2);        // 변수 출력
    }
}
결과 
10
5

2.오류가 발생하는 경우
public class ScopeExample {

    public static void main(String[] args) {
        int variable1 = 10;                    // 변수 선언과 초기화
        System.out.println(variable1);        // 변수 출력
        outerMethod();                        // outerMethod 메서드 호출
        System.out.println(variable2);        // 변수 출력 -&gt; 메소드 외부에서 variable2에 접근할 수 없어 에러 발생
    }

    public static void outerMethod() {
        int variable2 = 5;                    // 변수 선언과 초기화
    }
}</code></pre>
<h2 id="변수의-활용">변수의 활용</h2>
<p>변수는 프로그램에서 다양한 용도로 활용된다. 데이터 저장, 계산, 조건문, 반복문 등에서 변수를 사용하여 프로그램의 동작을 제어하고 효율적인 코드를 작성할 수 있다.</p>
<pre><code class="language-java">int width = 10;
int height = 5;
int area = width * height; </code></pre>
<p>변수는 프로그램의 실행 중 값이 변할 수 있는 상황에서 유용하며, 데이터의 다양한 처리와 저장에 활용된다. </p>
<hr>
<h1 id="상수-constant">상수 (Constant)</h1>
<p>자바에서 상수(Constant)는 한 번 정의되면 그 값을 변경할 수 없는 변수를 의미한다. 상수는 주로 프로그램에서 변경되지 않고 일정한 값을 사용해야 할 때 사용된다. 상수는 <code>final</code> 키워드를 사용하여 정의하며, 전체 대문자로 작성하며 여러 단어는 언더바(<code>_</code>)로 구분하는 것이 관례이다.</p>
<h2 id="상수-규칙">상수 규칙</h2>
<ul>
<li>상수를 정의할 때 <code>final</code> 키워드를 사용한다. 이 키워드를 사용하면 해당 변수의 값을 변경할 수 없게 된다.</li>
<li>상수 이름은 전체 대문자로 작성하는 것이 관례이다. 여러 단어를 사용하는 경우 언더바(<code>_</code>)로 단어를 구분한다.</li>
<li>상수에 값을 할당할 때는 선언과 동시에 초기화해야 하며, 이후에 값을 변경할 수 없다.</li>
</ul>
<pre><code class="language-java">1.상수 선언
final int MAX_VALUE = 100;
final double PI = 3.14159;
final String MY_CONSTANT = &quot;Hello, World!&quot;;

2.상수 선언 불가
final String MY_PHONE = &quot;SAMSUNG&quot;;    // 상수 선언과 초기화
MY_PHONE = &quot;apple&quot;;                    // 상수 값 변경 -&gt; 불가</code></pre>
<hr>
<h1 id="번외">번외</h1>
<p><strong>변수와 상수 사용</strong></p>
<ol>
<li><strong>변수(Variable) 사용</strong></li>
</ol>
<ul>
<li>데이터가 변하거나 다양한 값들을 저장해야 할 때 유용하다.</li>
<li>예를 들어, 사용자의 입력이나 계산 결과를 저장하고 나중에 사용하려면 변수를 활용할 수 있다.</li>
<li>데이터가 다양한 경우에 유연하게 대응할 수 있으며, 상황에 따라 값이 변경되어야 할 때도 변수를 사용할 수 있다.</li>
</ul>
<ol start="2">
<li><strong>상수(Constant) 사용</strong></li>
</ol>
<ul>
<li>프로그램에서 변하지 않고 고정된 값을 사용해야 할 때 유용다.</li>
<li>예를 들어, 원주율 π(3.14159265359)나 세금 비율 등은 상수로 정의하여 프로그램 내에서 일관된 값을 사용할 수 있다.</li>
<li>값이 고정되어 있기 때문에 다른 부분에서 수정할 필요가 없어서 코드의 안정성을 높일 수 있다.</li>
</ul>
<p>따라서 변수는 프로그램의 실행 중 값이 변할 수 있는 상황에서 유용하며, 데이터의 다양한 처리와 저장에 활용된다. 반면 상수는 주로 프로그램에서 일정한 값을 사용해야 하는 경우에 활용되며, 값이 고정되어야 하므로 보다 안정적인 코드를 작성할 수 있다. 이에 따라 상황에 맞게 변수와 상수를 적절하게 선택하여 사용하는 것이 좋다.</p>
<p><strong>네이밍 컨벤션</strong>
네이밍 컨벤션은 변수, 함수, 클래스, 메서드 등의 이름을 지을 때 사용되는 규칙을 의미한다. 이는 코드의 가독성을 높이고 유지보수를 용이하게 하기 위해 사용되는 중요한 원칙이다.</p>
<ol>
<li><strong>카멜 케이스(Camel Case)</strong></li>
</ol>
<ul>
<li>첫 번째 단어는 소문자로 시작하고, 그 뒤에 오는 각 단어의 첫 글자는 대문자로 표기한다.
<code>myVariableName</code>, <code>calculateTotalAmount</code></li>
</ul>
<ol start="2">
<li><strong>파스칼 케이스(Pascal Case)</strong></li>
</ol>
<ul>
<li>각 단어의 첫 글자를 대문자로 표기한다.
<code>MyClassName</code>, <code>CalculateTotalAmount</code></li>
</ul>
<ol start="3">
<li><strong>스네이크 케이스(Snake Case)</strong></li>
</ol>
<ul>
<li>모든 단어를 소문자로 표기하며, 단어 사이를 밑줄(<code>_</code>)로 구분한다.
<code>my_variable_name</code>, <code>calculate_total_amount</code></li>
</ul>
<ol start="4">
<li><strong>케밥 케이스(Kebab Case)</strong></li>
</ol>
<ul>
<li>모든 단어를 소문자로 표기하며, 단어 사이를 하이픈(<code>-</code>)으로 구분한다.
<code>my-variable-name</code>, <code>calculate-total-amount</code></li>
</ul>
<ol start="5">
<li><strong>헝가리안 표기법(Hungarian Notation)</strong></li>
</ol>
<ul>
<li>변수 이름을 작성할 때 접두사로 변수의 데이터 타입을 나타내는 문자를 추가한다.</li>
<li><code>strName</code> (문자열), <code>nCount</code> (정수), <code>fPrice</code> (실수), <code>bEnabled</code> (부울)</li>
</ul>
<pre><code>타입 정보를 변수명에 추가하는 것보다 의미 있는 이름을 사용하여 보다 명확하고 간결한 변수명을 사용하여
가독성을 높이는 것이 더 권장되며, 현대 프로그래밍에서는 헝가리안 표기법은 사용되지 않는 추세이다.</code></pre><br>
협업 시 개발자들 간에 명확한 네이밍 규칙이 없으면 다양한 네이밍이 존재하게 된다. 이러한 네이밍은 어떤 코드인지 이해하기 어려운 상황을 유발한다.

<p>이러한 이유로 네이밍 컨벤션을 따르는 것은 코드를 읽고 이해하기 쉽게 만들어 코드 품질을 향상시키고 가독성을 확보하며, 다른 개발자들과의 협업 시에도 통일성을 유지하고 코드의 일관성을 보장하는 데 도움이 된다.</p>
<p>이처럼 프로젝트나 프로그래밍 언어, 프레임워크 등에 따라 적절한 네이밍 컨벤션을 선택하는 것은 코드의 가독성과 일관성을 유지할 수 있으며, 효율적인 협업을 실현할 수 있다.</p>
<hr>
<h4 id="📖java-index"><a href="https://velog.io/@ch_dev/Java-Index" title="Java Index">📖Java Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-컴퓨터 구조] 컴퓨터 구성 요소]]></title>
            <link>https://velog.io/@ch_dev/CS-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@ch_dev/CS-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C</guid>
            <pubDate>Sun, 13 Aug 2023 16:38:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/ch_dev/post/748ec9d5-208c-4c69-85e9-862ad6e56e34/image.png" alt=""></p>
<p>컴퓨터는 현대사회에서 정보를 저장하고 처리하는 필수적인 도구이다. 컴퓨터의 구조는 복잡하고 정교하게 구성되어 있다. 컴퓨터는 크게 <strong>하드웨어</strong>와 <strong>소프트웨어</strong>로 구분된다. 하드웨어는 컴퓨터의 기계적인 장치를 의미하며, 소프트웨어는 하드웨어의 동작을 제어하고 지시하는 모든 종류의 프로그램을 의미한다.</p>
<hr>
<h1 id="하드웨어-hardware">하드웨어 (Hardware)</h1>
<p>컴퓨터의 물리적인 장치인 하드웨어는 기능에 따라 중앙처리장치, 기억장치, 입출력장치로 분류된다.</p>
<h2 id="중앙처리장치">중앙처리장치</h2>
<ul>
<li>중앙처리장치(Central Processing Unit, CPU)는 컴퓨터 시스템 전체를 제어하는 장치로써 입력장치에서 입력받은 데이터를 처리한 후 출력장치와 기억장치로 보내는 과정을 수행한다. 즉 컴퓨터의 두뇌라고 할 수 있다.</li>
<li>중앙처리장치는 크게 시스템을 제어하는 제어장치와 계산의 과정을 담당하는 산술논리연산장치로 구성되며, 저장 장소의 역할을 하는 레지스터도 포함된다.</li>
</ul>
<h3 id="산술논리연산장치">산술논리연산장치</h3>
<ul>
<li>산술논리연산장치(Arithmetic Logic Unit, ALU)는 CPU의 핵심 요소로써 산술연산(Arithmetic Operation)과 논리연산(Logic Operation)을 수행한다.</li>
<li>산술연산은 주로 덧셈, 뺄셈, 곱셈, 나눗셈 등의 사칙연산을 수행하며, 논리연산은 참(True)과 거짓(False)을 판결하는 연산으로 대표적으로 AND, OR, NOT, XOR 등의 연산이 있다.</li>
</ul>
<h3 id="제어장치">제어장치</h3>
<ul>
<li>제어장치(Control Device)는 CPU 내부에서 일어나는 모든 작업을 통제하고 관리한다. 제어장치는 적절한 순서로 명령어를 인출하고 그 명령어를 해석한 결과에 따라 컴퓨터 시스템의 필요한 부분으로 제어신호를 전달한다.</li>
</ul>
<h2 id="기억장치">기억장치</h2>
<ul>
<li>컴퓨터는 프로그램과 프로그램을 수행하는데 필요한 데이터를 저장하기 위해 다양한 기억장치를 사용한다.</li>
<li>기억장치(Memory Device)는 내부 기억장치와 외부 기억장치로 나룰 수 있는데, CPU 내의 레지스터(Register)와 캐시기억장치(Cache Memory), 주기억장치는 내부 기억장치에 속하고, 보조기억장치는 외부 기억장치에 해당한다. </li>
</ul>
<h3 id="주기억장치">주기억장치</h3>
<ul>
<li>주기억장치(Main Memory)는 컴퓨터 시스템에서 수행되는 프로그램과 수행에 필요한 데이터를 저장한다.</li>
<li>CPU에 접근하는 속도가 비교적 빠르며 많은 양의 데이터를 저장할 수 있다.</li>
<li>현재 주기억장치로는 RAM(Random Access Memory)을 사용한다.</li>
</ul>
<h3 id="보조기억장치">보조기억장치</h3>
<ul>
<li>보조기억장치(Secondery Memory)는 외부 기억장치라고도 하며 반영구적으로 데이터를 저장하고 보존할 수 있다. 그러나 보조기억장치에 저장된 데이터는 중앙처리장치와 직접 정보를 교환할 수 없기 때문에 주기억장치로 옮겨진 후 처리된다.</li>
<li>주기억장치에 비해 가격이 저렴하고 저장 용량이 크지만 속도가 느려 처리 속도가 빠른 중앙처리장치와 직접적인 데이터 교환이 불가능하다.</li>
<li>자기 테이프, 자기 디스크, 자기 드럼, 하드 디스크, 플로피 디스크, CD-ROM, 플래시 메모리, 광 디스크 등이 있다.</li>
</ul>
<h2 id="입출력장치">입출력장치</h2>
<ul>
<li>입출력장치(I/O Devices)는 컴퓨터와 외부 환경 간의 데이터 이동을 담당한다.</li>
</ul>
<h3 id="입력장치">입력장치</h3>
<ul>
<li>입력장치(Input Device)는 컴퓨터에서 처리할 데이터와 정보를 외부에서 입력할 수 있게 해준다. 즉 처리하고자 하는 데이터를 제어장치의 명령에 따라 입력매체에서 읽어서 기억장치로 보낸다.</li>
<li>마우스, 키보드, 스캐너, 조이스틱, 터치 스크린 등이 있다.</li>
</ul>
<h3 id="출력장치">출력장치</h3>
<ul>
<li>출력장치(Output Device)는 컴퓨터 내부에서 처리된 결과를 사용자가 보거나 들을 수 있도록 출력매체를 이용해서 내보낸다.</li>
<li>모니터, 프린터, 스피커 등이 있다.</li>
</ul>
<hr>
<h1 id="소프트웨어-software">소프트웨어 (Software)</h1>
<ul>
<li>소프트웨어(Software)는 컴퓨터 프로그램과 그와 관련된 문서들을 총칭하는 용어로, 정보가 이도하는 방향과 정보처리의 종류를 지정하고, 이러한 동작이 일어나는 시간을 지정하는 명령이 집합이다. 운영체제와 같은 시스템 소프트웨어와 응용 소프트웨어로 나뉘며 하드웨어가 발달하여 가격이 저렴해지고 교체 주기가 짧아짐에 따라 소프트웨어의 중요성은 더욱 커지고 있다.
소프트웨어로 향상되는 생산성 바뀐 하드웨어에 적용할 수 있는 소프트웨어의 호환성, 유지보수를 하는 것이 효율적인지 등의 요구 조건이 중요시되고, 또한 중요한 연구 개발 대상이 되고 있다.</li>
</ul>
<h2 id="시스템-소프트웨어">시스템 소프트웨어</h2>
<ul>
<li>시스템 소프트웨어(Systen Software)는 여러 컴퓨터 시스템에서 공통적으로 필요한 프로그램으로, 사용자가 컴퓨터를 좀 더 효율적으로 사용하기 위해 만들어졌다. 즉 컴퓨터 시스템을 제어하고 운영하는 프로그램이다.</li>
<li>운영체제(DOS, UNIX, Windows, Mac), 컴파일러(C·FORTRAN 컴파일러 등) 입출력 제어 프로그램 등이 있다.</li>
</ul>
<h2 id="응용-소프트웨어">응용 소프트웨어</h2>
<ul>
<li>응용 소프트웨어(Application Software)는 시스템 소프트웨어를 기반으로 하여 특정한 응용 분야에서 특수 목적을 위해 사용할 수 있는 프로그램이다.</li>
<li>사무자동화 프로그램, 공학용 계산 프로그램, 인터넷 웹 브라우저, 그래픽 프로그램 등이 있다.</li>
</ul>
<hr>
<h1 id="번외">번외</h1>
<h4 id="컴퓨터-역사">컴퓨터 역사</h4>
<ol>
<li><h4 id="1세대-컴퓨터">1세대 컴퓨터</h4>
<p>1세대 컴퓨터는 진공관을 사용하여 동작한다.
진공관은 전기 신호를 조작하고 증폭하는데 사용되었으며, 크기가 크고 전력 소비가 많았지만, 기초적인 계산을 수행할 수 있었다.
ENIAC, UNIVAC 등이 있다.</p>
</li>
<li><h4 id="2세대-컴퓨터">2세대 컴퓨터</h4>
<p>2세대 컴퓨터는 트랜지스터를 사용하여 작동한다.
트랜지스터는 진공관보다 작고 신속한 스위칭이 가능하며, 더 적은 전력을 소비 이로 인해 컴퓨터의 크기가 줄어들고 성능이 향상되었다.
FORTRAN, COBOL 등의 고급 언어가 개발되었다.</p>
</li>
<li><h4 id="3세대-컴퓨터">3세대 컴퓨터</h4>
<p>3세대 컴퓨터는 집적회로(Integrated Circuit, IC)를 도입하여 작동한다.
IC는 여러 개의 트랜지스터를 단일 칩에 통합한 것으로, 크기를 더욱 축소시키고 성능을 향상되었으며, 이로 인해 더 복잡하고 다양한 작업을 처리할 수 있는 컴퓨터가 등장하였다.</p>
</li>
<li><h4 id="4세대-컴퓨터">4세대 컴퓨터</h4>
<p>4세대 컴퓨터는 대규모 집적회로(Large Scale Integrated circuit, LSI)를 사용하여 작동한다.
LSI는 여러 개의 IC를 단일 칩에 집적한 것으로, 개인용 컴퓨터의 등장과 함께 대중화되었다.
개인용 컴퓨터와 함께 그래픽 사용자 인터페이스(GUI) 등의 혁신적인 기술이 개발되었다.</p>
</li>
<li><h4 id="5세대-컴퓨터">5세대 컴퓨터</h4>
<p>5세대 컴퓨터는 초밀집 집적회로(Very Large Scale Integrated circuit, VLSI)를 사용하여 작동한다.
병렬 컴퓨팅과 인공지능 분야에서의 연구가 활발해지고 컴퓨터의 성능은 지속적으로 향상되고 있으며, 클라우드 컴퓨팅 등의 기술이 등장하여 컴퓨터의 활용 범위가 더욱 확장되고 있다.</p>
</li>
<li><h4 id="현대-세대-컴퓨터">현대 세대 컴퓨터</h4>
<p>현대 세대 컴퓨터는 마이크로프로세서의 성능 향상과 클라우드 컴퓨팅의 발전으로 인해 빠르고 효율적인 컴퓨팅이 가능해졌다.
인공지능, 빅데이터 분석 등의 기술을 활용하여 다양한 분야에서 혁신적인 서비스가 등장하고 있다.</p>
</li>
<li><h4 id="미래-세대-컴퓨터">미래 세대 컴퓨터</h4>
<p>미래 세대 컴퓨터는 현대 기술의 한계를 뛰어넘어 다양한 혁신과 가능성을 가진 컴퓨터로 양자 컴퓨팅과 인공지능, 생체 컴퓨팅 등이 있다.<br></p>
</li>
</ol>
<p><strong>1. 양자 컴퓨팅:</strong> 양자 컴퓨팅은 양자 물리학의 원리를 활용하여 정보를 처리하는 기술로 양자 비트 또는 큐비트를 사용하여 복잡한 문제를 빠르고 효율적으로 해결할 수 있으며, 암호 해독과 최적화 문제 등 다양한 분야에서 혁신을 가져올 것으로 예상된다.<br>
<strong>2. 인공지능과 머신러닝:</strong> 미래 세대 컴퓨터는 더욱 지능적이고 자율적인 인공지능을 갖출 것으로 예측된다. 머신러닝 알고리즘의 발전으로 복잡한 데이터 처리와 분석이 가능해지며, 더욱 자연스러운 상호작용이 이루어질 것으로 기대된다.<br>
<strong>3. 생체 컴퓨팅:</strong> 생체 컴퓨팅은 생명체의 원리를 모방하여 컴퓨터 시스템을 구축하는 기술로 생체 신호를 활용하여 빠르고 정확한 데이터 분석이 가능해지며, 인간과 컴퓨터 간의 상호작용이 더욱 자연스러워질 것으로 예상된다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 데이터 단위]]></title>
            <link>https://velog.io/@ch_dev/CS-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%8B%A8%EC%9C%84</link>
            <guid>https://velog.io/@ch_dev/CS-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%8B%A8%EC%9C%84</guid>
            <pubDate>Sun, 30 Jul 2023 10:46:45 GMT</pubDate>
            <description><![CDATA[<p>컴퓨터는 디지털 형식의 전기 신호를 사용하기에 컴퓨터는 모든 데이터를 비트 형태로 처리하고 저장한다. 비트(binary digits, Bit)는 이진(binary) 숫자 체계를 기반으로 하며, 0과 1로 표현된다. 0과 1로 표현하는 비트는 이를 False와 True 또는 OFF/ON 으로도 사용할 수 있다.</p>
<p>비트를 활용하여 디지털 회로에 사용되는 논리 게이트(NOT, OR, AND,  ...)는 컴퓨터의 모든 연산과 제어 동작에 사용되는 기본적인 요소이다. 컴퓨터는 논리 게이트를 사용하여 숫자와 데이터를 처리하고, 프로그램의 흐름을 제어하며, 복잡한 논리 연산을 수행한다. 이러한 여러 논리 게이트들의 조합으로 컴퓨터의 동작이 이루어지며 모든 연산과 동작에 기반이 되는 중요한 역할을 수행한다.</p>
<p>컴퓨터가 처리하는 최소 정보 단위인 비트는, 한 개만으로는 많은 양의 데이터를 나타내기에 턱없이 부족하기, 정보를 표현하는 기본 단위는 8개의 비트를 묶은 <strong>바이트(Byte)</strong>로 삼고있다.</p>
<hr>
<h1 id="데이터-단위">데이터 단위</h1>
<table>
<thead>
<tr>
<th align="center">단위</th>
<th align="center">기호</th>
<th align="center">이진 변환</th>
<th align="center">표준 SI</th>
<th align="center">참고</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1 비트</td>
<td align="center">Bit</td>
<td align="center">$$2^{1}$$</td>
<td align="center">-</td>
<td align="center">0, 1</td>
</tr>
<tr>
<td align="center">1 바이트</td>
<td align="center">Byte</td>
<td align="center">$$2^{8}$$</td>
<td align="center">-</td>
<td align="center">1Byte = 8 bit</td>
</tr>
<tr>
<td align="center">1 킬로바이트</td>
<td align="center">KB</td>
<td align="center">$$2^{10}$$</td>
<td align="center">$$10^{3}$$</td>
<td align="center">1KB = 1,024 Byte</td>
</tr>
<tr>
<td align="center">1 메가바이트</td>
<td align="center">MB</td>
<td align="center">$$2^{20}$$</td>
<td align="center">$$10^{6}$$</td>
<td align="center">1MB = 1,024 KB</td>
</tr>
<tr>
<td align="center">1 기가바이트</td>
<td align="center">GB</td>
<td align="center">$$2^{30}$$</td>
<td align="center">$$10^{9}$$</td>
<td align="center">1GB = 1,024 MB</td>
</tr>
<tr>
<td align="center">1 테라바이트</td>
<td align="center">TB</td>
<td align="center">$$2^{40}$$</td>
<td align="center">$$10^{12}$$</td>
<td align="center">1TB = 1,024 GB</td>
</tr>
<tr>
<td align="center">1 페타바이트</td>
<td align="center">PB</td>
<td align="center">$$2^{50}$$</td>
<td align="center">$$10^{15}$$</td>
<td align="center">1PB = 1,024 TB</td>
</tr>
<tr>
<td align="center">1 엑사바이트</td>
<td align="center">EB</td>
<td align="center">$$2^{60}$$</td>
<td align="center">$$10^{18}$$</td>
<td align="center">1EB = 1,024 PB</td>
</tr>
<tr>
<td align="center">1 제타바이트</td>
<td align="center">ZB</td>
<td align="center">$$2^{70}$$</td>
<td align="center">$$10^{21}$$</td>
<td align="center">1ZB = 1,024 EB</td>
</tr>
<tr>
<td align="center">1 요타바이트</td>
<td align="center">YB</td>
<td align="center">$$2^{80}$$</td>
<td align="center">$$10^{24}$$</td>
<td align="center">1YB = 1,024 ZB</td>
</tr>
</tbody></table>
<h2 id="비트-bit">비트 (Bit)</h2>
<ul>
<li>가장 작은 데이터 단위로서 0 또는 1의 이진 값으로 표현되는 정보의 단위이다.</li>
<li>컴퓨터의 가장 기본적인 데이터 단위로서 비트로 표현된 정보는 논리 연산이나 이진 숫자 등으로 사용된다.</li>
</ul>
<h2 id="바이트-byte">바이트 (Byte)</h2>
<ul>
<li>8개의 비트로 구성된 데이터 단위이자, 정보를 표현하는 <span style = 'background-color: #f5f0ff'> <strong>기본 단위</strong> </span>이다.</li>
<li>일반적으로 ASCII(영어 대소문자 알파벳, 숫자, 일부 특수 문자 등)문자 하나를 나타내는데 사용된다.</li>
</ul>
<ul>
<li><strong>한글과 같은 동양권 문자를 표기하기 위해서는 한 문자당 2바이트 이상 필요하다.
예를 들어, &quot;A&quot;라는 ASCII 문자는 1바이트로 표현되지만, &quot;가&quot;라는 한글 문자는 UTF-8 인코딩에서는 3바이트, UTF-16 인코딩에서는 2바이트로 표현된다.</strong></li>
</ul>
<h2 id="킬로바이트-kb">킬로바이트 (KB)</h2>
<ul>
<li>$$2^{10}$$(1,024) 바이트로 구성된 데이터 단위이다.</li>
</ul>
<h2 id="메가바이트-mb">메가바이트 (MB)</h2>
<ul>
<li>$$2^{20}$$(1,048,576) 바이트로 구성된 데이터 단위이다. </li>
</ul>
<h2 id="기가바이트-gb">기가바이트 (GB)</h2>
<ul>
<li>$$2^{30}$$(1,073,741,824) 바이트로 구성된 데이터 단위이다.</li>
</ul>
<h2 id="테라바이트-tb">테라바이트 (TB)</h2>
<ul>
<li>$$2^{40}$$(1,099,511,627,776) 바이트로 구성된 데이터 단위이다.</li>
</ul>
<h2 id="페타바이트-pb">페타바이트 (PB)</h2>
<ul>
<li>$$2^{50}$$(1,125,899,906,842,624) 바이트로 구성된 데이터 단위이다.</li>
<li>이 <a href="https://www.quora.com/What-is-the-total-capacity-of-YouTube-storage">내용[1]</a>에 의하면 한 달 동안 유튜브(YouTube)에 저장되는 데이터 단위이다.</li>
</ul>
<h2 id="엑사바이트-eb">엑사바이트 (EB)</h2>
<ul>
<li>$$2^{60}$$(1,152,921,504,606,846,976) 바이트로 구성된 데이터 단위이다.</li>
<li><a href="https://www.makeuseof.com/will-google-run-out-storage-space/">기사[2]</a> 내용에 의하면 구글에서 보유하고 있는 데이터의 총량은 10~15EB로 예측하고 있다.</li>
</ul>
<h2 id="제타바이트-zb">제타바이트 (ZB)</h2>
<ul>
<li>$$2^{70}$$(1,180,591,620,717,411,303,424) 바이트로 구성된 데이터 단위이다.</li>
<li>미국의 리서치 기업 IDC(International Data Corporation, IDC)에 의하면 2018년을 기준으로 인류가 지금까지 생산해 낸 모든 데이터의 총합이 33ZB를 넘겼다고 한다.</li>
</ul>
<h2 id="요타바이트-yb">요타바이트 (YB)</h2>
<ul>
<li>$$2^{80}$$(1,208,925,819,614,629,174,706,176) 바이트로 구성된 데이터 단위이다.</li>
<li>현재까지는 실제로 사용되지는 않지만, 빅데이터, 인공지능과 같은 기술의 발전과 데이터의 증가로 인해 머지않아 미래에 일상적인 용어로 사용될 수 있다.</li>
</ul>
<hr>
<h1 id="번외">번외</h1>
<p>실제 용량과 저장 장치의 표기 용량과 실제 용량이 다른 이유는 두 가지 이유로 설명된다.</p>
<ol>
<li><p><strong>이진법 표기와 십진법 표기의 차이</strong>
컴퓨터의 저장 장치는 2진 산술을 기반으로 동작하지만, 저장 장치 제조업체에서는 용량을 일반적으로 10진 산술로 표기한다. 즉, 이진 산술 컴퓨터에서는 1KB가 1024Byte로 표현되지만, 10진 산술을 표기하는 제조업체에서는 1KB가 1000Byte로 표현하기에 저장 장치 표기 용량과 실제 용량이 다르게 차이 난다.
예를 들어, 제조업체의 1TB는 1,000,000,000,000바이트를 저장할 수 있지만 컴퓨터에서는 이를 1TB가 아닌 약 931.3GB로 인식한다.</p>
</li>
<li><p><strong>파일 시스템과 운영 체제의 사용</strong>
저장 장치에는 파일 시스템이 사용되고, 운영 체제와 파일 시스템은 일부 공간을 예약하여 파일 관리 등의 용도로 사용한다. 이러한 예약된 공간은 사용자가 직접 사용할 수 없으며, 따라서 실제 사용 가능한 용량이 표기 용량보다 작아질 수 있다.</p>
</li>
</ol>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
<blockquote>
<p>참고 자료
[1] : <a href="https://www.quora.com/What-is-the-total-capacity-of-YouTube-storage">What is the total capacity of YouTube storage?</a>
&emsp;&emsp;&emsp;&ensp;(<em>Quora</em>)
[2] : <a href="https://www.makeuseof.com/will-google-run-out-storage-space/">Will Google Ever Run Out of Storage Space?</a>
&emsp;&emsp;&emsp;&ensp;(TOMISIN OLUJINMI, <em>MUO</em>, 2023.01.19.)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 자바 개요]]></title>
            <link>https://velog.io/@ch_dev/Java-%EC%9E%90%EB%B0%94-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@ch_dev/Java-%EC%9E%90%EB%B0%94-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Sun, 23 Jul 2023 18:28:29 GMT</pubDate>
            <description><![CDATA[<p>자바(Java)라는 이름의 기원은 개발자인 <strong>J</strong>ames Gosling, <strong>A</strong>rthur <strong>V</strong>an Hoff, <strong>A</strong>ndy Bechtolsheim의 이름 첫 글자를 조합했다는 설과, 개발자들이 마시던 인도네시아산 커피 이름에서 따왔다는 설이 있지만, 이 <a href="https://www.ciokorea.com/news/245482">기사<sup>[1]</sup></a>의 내용에 따르면 후자의 이야기로 기울여진다.</p>
<hr>
<h1 id="자바-개요">자바 개요</h1>
<p>자바란 썬 마이크로시스템즈(Sun Microsystems)에서 개발한 객체지향 프로그래밍 언어이다. 자바의 슬로건은 &quot;<strong>Write Once, Run Anywhere</strong>&quot;이다. 이는 자바의 가장 큰 특징 중 하나로, 한 번 작성한 코드를 어떤 운영체제나 플랫폼에서든지 동일하게 실행할 수 있다는 뜻이다. 이를 가능하게 하는 것은 자바 가상 머신(Java Virtual Machine, JVM)으로 JVM은 운영체제(Operating System, OS)에 독립적으로 작동하여 자바 프로그램을 실행시켜주기 때문에 어떤 환경에서도 일관되고 안정적으로 실행될 수 있다.</p>
<ul>
<li><a href="https://velog.io/@ch_dev/%EC%A0%88%EC%9E%90%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4" title="[CS]절자지향 언어 | 객체지향 언어">[CS]절자지향 언어 | 객체지향 언어</a></li>
</ul>
<h1 id="자바-역사">자바 역사</h1>
<p>자바는 썬 마이크로시스템즈사의 제임스 고슬링(James Gosling) 팀에 의해 개발되었다. 1991년에 오크(Oak)라는 이름으로 개발되었으며, 1995년에 첫 버전인 JDK 1.0이 정식으로 발표되었으며, 후에 1996년에 발표된 1.0.2 버전에서 Java로 이름이 바뀌었다. </p>
<p>1998년 발표된 J2SE 1.2에서는 웹에서도 자바를 돌릴 수 있게 해 주는 자바 애플릿(Java Applet)이 추가되었다. 당시에는 웹 브라우저에서 웹 페이지의 내용뿐만 아니라 다양한 기능을 제공하는 것이 쉽지 않았지만, 자바 애플릿은 웹 페이지에서 강력한 인터랙션과 동적인 기능을 제공할 수 있었기에 웹 애플리케이션 개발에 많이 활용되었고, 이로 인하여 자바는 인기를 끌게 되었다. (현재에는 보안 이슈와 성능 문제, 다양한 웹 기술과 프레임워크가 등장하면서 웹 애플리케이션 개발이 훨씬 더 간편해지고, 자바 애플릿보다 훨씬 안전하고 효율적인 방법들이 사용하면서 자바 애플릿을 거의 사용하지 않는다.)</p>
<p>이후 자바는 버전 업그레이드를 거쳐 개선되어 현재는 Java SE(Standard Edition), Java EE(Enterprise Edition), Java ME(Micro Edition) 등 다양한 에디션으로 사용되고 있다.</p>
<p>2009년에 썬 마이크로시스템즈사가 오라클(Oracle)과 인수 합병됨에 따라 자바 소유권은 오라클로 넘어갔다.</p>
<p>소유권이 오라클로 넘어간 이후에도 여전히 자바가 널리 사용되고 있으며, 현대 소프트웨어 개발에서 중요한 위치를 차지하고 있다.</p>
<h1 id="자바-특징">자바 특징</h1>
<ol>
<li><p><strong>객체지향 프로그래밍 (OOP)</strong>
자바는 객체지향 프로그래밍 언어로, 현실 세계의 개념을 추상화하여 객체들로 프로그램을 구성한다. 클래스(class)와 객체(object)를 기반으로 데이터와 해당 데이터를 처리하는 메서드(method)를 묶어서 관리하며, 캡슐화, 상속, 다형성 등의 OOP의 특성을 지원한다.</p>
</li>
<li><p><strong>플랫폼 독립성 (Platform Independence)</strong>
자바는 JVM(Java Virtual Machine)을 통해 실행되기 때문에 특정 운영 체제에 종속되지 않는다. 한 번의 컴파일링으로 생성된 바이트코드(.class 파일)는 어떤 플랫폼에서라도 실행될 수 있다. 이는 &quot;Write Once, Run Anywhere&quot;라는 모토를 갖게 한 주요 특징 중 하나이다.</p>
</li>
<li><p><strong>가비지 컬렉션 (Garbage Collection)</strong>
자바는 가비지 컬렉션(GC)을 통해 메모리 관리를 자동으로 처리한다. 개발자가 명시적으로 메모리를 할당하고 해제하는 번거로움을 덜어주며, 메모리 누수를 방지하여 프로그램의 안정성을 높여준다.</p>
</li>
<li><p><strong>멀티스레딩 지원 (Multithreading)</strong>
자바는 멀티스레딩을 쉽게 구현할 수 있도록 지원한다. 쓰레드(thread)를 만들고 관리할 수 있는 API를 제공하여 동시에 여러 작업을 처리하는데 용이하다. 이를 통해 프로그램의 성능을 개선하고 응답성을 높일 수 있다.</p>
</li>
<li><p><strong>높은 보안성</strong>
자바는 웹에서의 악성 코드 실행 등으로부터 안전하게 보호하기 위해 다양한 보안 기능을 내장하고 있다. JVM은 악성 코드 실행을 방지하고, 네트워크 통신에 있어서도 보안적인 측면을 고려하여 설계되어 있다.</p>
</li>
<li><p><strong>풍부한 API(라이브러리) 지원</strong>
자바는 다양한 기능을 제공하는 풍부한 API와 라이브러리를 갖추고 있으며, 이를 활용하여 개발자는 간편하게 원하는 기능을 구현할 수 있다.</p>
</li>
<li><p><strong>동적 로딩(Dynamic Loading)</strong>
자바는 동적 로딩을 지원하여 필요한 클래스나 라이브러리를 프로그램이 실행 중에 동적으로 로드할 수 있다. 이로 인해 런타임 시에 클래스의 추가나 변경 등이 용이하다.</p>
</li>
<li><p><strong>자동화된 메모리 관리</strong>
자바는 포인터를 사용하지 않고, 가비지 컬렉션을 통해 메모리를 관리한다. 이로 인해 개발자가 메모리 관리에 신경 쓰지 않아도 되므로 프로그램의 안정성을 높이고 개발 효율을 향상시킨다.</p>
</li>
<li><p><strong>대중적인 언어</strong>
많은 개발자들이 사용하고 있으며, 자바에 관한 수많은 참고 자료를 찾을 수 있다. 오픈 소스 프로젝트부터 대규모 기업용 응용 프로그램까지 다양한 분야에서 활용되고 있다.</p>
</li>
</ol>
<h1 id="jvmjava-virtual-machine">JVM(Java Virtual Machine)</h1>
<p>JVM(Java Virtual Machine)은 자바 프로그램을 실행하는 가상 머신으로, 자바 프로그램을 컴파일하여 생성된 바이트코드를 해석하고 실행하는 역할을 한다. &quot;Write Once, Run Anywhere&quot;를 실현시키는 핵심 컴포넌트로서, 다양한 운영 체제와 하드웨어에서 동일한 바이트코드를 실행하여 자바 프로그램의 플랫폼 독립성을 보장한다.</p>
<h2 id="jvm의-주요-기능"><strong>JVM의 주요 기능</strong></h2>
<ul>
<li><strong>자바 바이트코드 실행</strong>: JVM은 자바 바이트코드를 읽고 해석하여 해당 플랫폼에서 실행 가능한 기계어로 변환하고 실행한다. 이로써 자바 프로그램은 운영 체제와 하드웨어에 독립적으로 실행될 수 있게 된다.</li>
<li><strong>메모리 관리</strong>: JVM은 가비지 컬렉션(Garbage Collection)을 통해 더 이상 사용되지 않는 객체들을 자동으로 제거하여 메모리를 관리한다.</li>
<li><strong>스레드 관리</strong>: JVM은 멀티스레딩을 지원하며, 여러 개의 스레드를 생성하고 관리하여 동시에 여러 작업을 처리할 수 있으며, 병렬 처리를 통해 프로그램의 성능을 향상시킬 수 있다.</li>
<li><strong>예외 처리</strong>: JVM은 자바에서 발생하는 예외를 적절하게 처리하여 프로그램의 비정상 종료를 방지하고  안정성을 유지한다. 개발자는 예외를 적절히 처리하여 프로그램의 오류를 예방하거나 처리할 수 있다.</li>
<li><strong>클래스 로딩 및 링킹</strong>: JVM은 필요한 클래스들을 동적으로 로딩하고, 링킹과정을 거쳐 실행에 필요한 최종적인 바이트코드를 생성한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ch_dev/post/0075d580-2c4f-4b70-b7fc-3e1756e9f901/image.png" alt="JVM-Architecture"></p>
<h2 id="jvm의-동작-방식"><strong>JVM의 동작 방식</strong></h2>
<ul>
<li><p><strong>클래스 로더(Class Loader)</strong>
JVM은 클래스 로더를 통해 필요한 클래스 파일을 로딩한다. 클래스 로더는 클래스 파일을 찾고, 메모리에 로드하여 해당 클래스를 사용할 수 있도록 준비한다.</p>
</li>
<li><p><strong>바이트코드 실행</strong>
클래스가 로드되면 JVM은 해당 클래스의 바이트코드를 실행한다. 바이트코드는 JVM이 이해할 수 있는 명령어로 해석되고, JVM은 이를 실행하면서 프로그램이 동작한다.</p>
</li>
<li><p><strong>가비지 컬렉션</strong>
JVM은 메모리 사용을 최적화하기 위해 가비지 컬렉션(GC)을 수행한다. 가비지 컬렉션은 더 이상 사용되지 않는 객체들을 식별하고 자동으로 메모리를 해제하여 프로그램의 메모리 누수를 방지한다.</p>
</li>
<li><p><strong>JIT 컴파일러(Just-In-Time Compiler)</strong>
일부 JVM 구현은 JIT 컴파일러를 통해 바이트코드를 기계어로 변환하고, 이를 캐싱하여 빠르게 실행할 수 있도록 한다. 이로 인해 반복적으로 사용되는 코드의 실행 성능이 향상된다.</p>
</li>
</ul>
<h2 id="jvm-구성-요소"><strong>JVM 구성 요소</strong></h2>
<ul>
<li><strong>Class Loader</strong>: 클래스 로더는 클래스 파일을 로딩하고 JVM 내부에 클래스를 정의하는 역할을 담당한다.</li>
<li><strong>Runtime Data Area</strong>: JVM은 프로그램 실행에 필요한 데이터를 저장하는 메모리 영역으로, 메소드 영역, 힙 영역, 스택 영역 등으로 구성된다.</li>
<li><strong>Execution Engine</strong>: 실행 엔진은 바이트코드를 실제 기계어로 변환하고, 실행하는 역할을 수행한다.</li>
<li><strong>Garbage Collector</strong>: 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 제거하여 메모리를 관리하는 역할을 한다.</li>
<li><strong>Native Interface</strong>: JVM은 Java와 네이티브 코드(C, C++ 등) 간의 인터페이스를 지원하여 네이티브 코드를 호출하거나 호출 받을 수 있다.</li>
</ul>
<hr>
<h4 id="📖java-index"><a href="https://velog.io/@ch_dev/Java-Index" title="Java Index">📖Java Index</a></h4>
<blockquote>
<p>참고 자료
[1] : <a href="https://www.ciokorea.com/news/245482">‘IT 브랜드의 전설’··· 자바의 이름이 자바인 사연</a>
&emsp;&emsp;&emsp;&ensp;(Kieron Murphy | JavaWorld, <em>CIO Korea</em>, 2022.07.19.)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS]절자지향 언어 | 객체지향 언어]]></title>
            <link>https://velog.io/@ch_dev/%EC%A0%88%EC%9E%90%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4</link>
            <guid>https://velog.io/@ch_dev/%EC%A0%88%EC%9E%90%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4</guid>
            <pubDate>Sun, 23 Jul 2023 18:14:00 GMT</pubDate>
            <description><![CDATA[<p>프로그래밍 패러다임의 주요 접근 방식인 객체지향 언어와 절차지향 언어에 대한 특징과 차이점을 설명하자면 다음과 같다.</p>
<hr>
<h2 id="절차지향-언어-procedural-programming-language">절차지향 언어 (Procedural Programming Language)</h2>
<p>절차지향 언어는 프로그램을 실행하는 데 필요한 절차를 순차적으로 작성하는 방식으로 접근한다. 프로그램은 주로 함수 또는 프로시저(Procedure)의 집합으로 구성된다. 이러한 함수들은 데이터를 처리하는 데 사용되는 절차적인 단계들을 포함한다. C, Pascal, Fortran 등이 대표적인 절차지향 언어이다.</p>
<h3 id="특징"><strong>특징</strong></h3>
<ul>
<li>순차적인 절차에 따라 프로그램이 실행된다.</li>
<li>데이터와 함수(프로시저)가 별도로 구분된다.</li>
<li>데이터 중심의 접근 방식으로, 데이터와 함수 간의 관계를 강조한다.</li>
<li>모듈화가 가능하지만 객체지향 언어보다 덜 추상화된다.</li>
<li>재사용성과 유지보수가 어려울 수 있다.</li>
</ul>
<hr>
<h2 id="객체지향-언어-object-oriented-programming-language">객체지향 언어 (Object-Oriented Programming Language)</h2>
<p>객체지향 언어는 현실 세계의 객체(Object) 개념을 프로그래밍에 적용하는 방식으로 접근한다. 프로그램을 객체의 집합으로 구성하며, 각 객체는 데이터와 그 데이터를 처리하는 메서드(Method)를 가지고 있다. 자바, C++, Python, C# 등이 대표적인 객체지향 언어이다.</p>
<h3 id="특징-1"><strong>특징</strong></h3>
<ul>
<li>프로그램을 객체로 구성하며, 객체는 상태(데이터)와 행동(메서드)를 함께 가지고 있다.</li>
<li>캡슐화(Encapsulation)를 통해 데이터와 그를 처리하는 메서드를 하나의 단위로 묶어 정보 은닉을 지원한다.</li>
<li>상속(Inheritance)을 통해 새로운 클래스를 기존 클래스를 기반으로 생성하여 코드 재사용과 확장성을 높힌다.</li>
<li>다형성(Polymorphism)을 지원하여 같은 이름의 메서드가 서로 다른 객체에서 다르게 동작할 수 있도록 한다.</li>
<li>객체 간의 관계를 모델링하여 현실 세계와 유사한 구조로 프로그램을 설계한다.</li>
</ul>
<hr>
<h2 id="절차지향-언어--객체지향-언어-차이점">절차지향 언어 | 객체지향 언어 차이점</h2>
<ol>
<li>접근 방식: 절차지향 언어는 순차적인 절차에 따라 프로그램을 실행하고, 객체지향 언어는 객체들의 상호작용에 따라 프로그램을 실행한다.</li>
<li>프로그램 구성: 절차지향 언어는 함수와 데이터를 별도로 구분하여 작성하며, 객체지향 언어는 객체에 상태와 행동을 함께 묶어서 작성한다.</li>
<li>모듈화: 객체지향 언어는 캡슐화와 상속을 통해 모듈화가 용이하며, 코드 재사용성과 유지보수성이 뛰어나다.</li>
<li>추상화: 객체지향 언어는 현실 세계의 개념을 추상화하여 프로그램을 설계하는 반면, 절차지향 언어는 추상화 수준이 낮을 수 있다.</li>
<li>다형성: 객체지향 언어는 다형성을 지원하여 유연한 프로그래밍이 가능하며, 절차지향 언어는 다형성을 제한적으로 사용한다.</li>
</ol>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS]프로그래밍 패러다임]]></title>
            <link>https://velog.io/@ch_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84</link>
            <guid>https://velog.io/@ch_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84</guid>
            <pubDate>Sun, 23 Jul 2023 17:48:39 GMT</pubDate>
            <description><![CDATA[<p>프로그래밍 패러다임은 프로그래밍을 어떻게 접근하고 구성하는지를 나타내는 방식으로, 프로그래밍 언어와 밀접한 관련이 있다. 각각의 프로그래밍 패러다임은 고유한 개념과 원칙을 갖고 있으며, 문제 해결과 코드의 구조를 다양한 방식으로 접근한다.  각 패러다임은 특정 상황과 문제에 적합한 장단점이 있다. 또한, 하나의 프로그래밍 언어가 여러 패러다임을 지원하는 경우도 있으며, 이러한 다양한 패러다임을 융합하여 사용하는 것도 가능하다. 개발 시 상황에 맞는 패러다임을 선택하여 보다 효율적이고 유지 보수가 쉬운 프로그램을 개발하는 데 도움이 된다. 몇 가지 주요 프로그래밍 패러다임은 다음과 같다.</p>
<hr>
<h1 id="1-명령형-프로그래밍-imperative-programming">1) 명령형 프로그래밍 (Imperative Programming)</h1>
<p>명령형 프로그래밍은 컴퓨터에게 실행할 일련의 명령문을 순서대로 기술하여 원하는 결과를 얻는 방식으로, 프로그래머는 컴퓨터에게 &quot;어떻게&quot; 작업을 수행해야 할지를 명시적으로 지시한다. 명령형 프로그래밍 방식의 프로그램은 명령어의 순서와 상태(state)를 중심으로 구성되어 있다. 명령형 프로그래밍에서 프로그램은 주로 변수, 조건문, 반복문 등을 사용하여 알고리즘과 절차를 표현하는데, 프로그래머는 명령어의 순서를 조작하여 원하는 결과를 얻으며, 프로그램의 상태를 직접 변경하여 원하는 동작을 수행한다.</p>
<p>예를 들어, 대표적인 명령형 프로그래밍 언어인 C언어나 자바에서 변수를 선언하고, 조건문과 반복문을 사용하여 원하는 계산이나 처리를 수행한다. 프로그램의 실행은 주로 위에서 아래로 순차적으로 진행되며, 프로그램의 상태는 변수의 값을 변경하면서 변화한다.</p>
<p>명령형 프로그래밍은 프로그램의 동작을 세밀하게 제어할 수 있어서 효율적인 알고리즘을 구현하는데 유용하다. 하지만 프로그램의 상태를 직접 변경하기 때문에 코드의 이해와 유지 보수가 어려울 수 있으며, 코드의 길이가 길어지고 복잡해질 수 있다.</p>
<h2 id="11-절차지향-프로그래밍-procedural-programming">1.1) 절차지향 프로그래밍 (Procedural Programming)</h2>
<p>절차지향 프로그래밍은 순차적인 처리를 강조하는 프로그래밍 패러다임이다. 프로시저(함수)를 작성하고, 이들을 순차적으로 호출하며 문제를 해결한다. 이러한 프로시저들은 데이터를 중심으로 동작하며, 데이터의 변환과 조작을 위해 절차적인 접근 방식을 채택하며, C 언어가 대표적인 절차지향 프로그래밍 언어이다.</p>
<h2 id="12-객체지향-프로그래밍-object-oriented-programming-oop">1.2) 객체지향 프로그래밍 (Object-Oriented Programming, OOP)</h2>
<p>객체지향 프로그래밍은 현실 세계의 객체들을 모델링하여 프로그래밍하는 패러다임이다. 객체는 데이터와 해당 데이터를 처리하는 함수(메서드)들을 하나로 묶어서 표현하며, 이러한 객체들의 상호작용으로 문제를 해결한다. 객체지향 프로그래밍은 상속, 캡슐화, 다형성 등의 개념을 지원하여 코드의 재사용성과 유지 보수성을 높이는데 중점을 둔다. Java, Python, C++ 등이 대표적인 객체지향 프로그래밍 언어이다.</p>
<hr>
<h1 id="2-선언형-프로그래밍-declarative-programming">2) 선언형 프로그래밍 (Declarative Programming)</h1>
<p>선언형 프로그래밍은 원하는 결과를 &quot;무엇&quot;으로 표현하여 문제 해결에 접근하는 프로그래밍 패러다임이다. 프로그래머는 컴퓨터에게 &quot;어떻게&quot; 작업을 수행해야 할지를 명시적으로 지시하지 않고, &quot;무엇&quot;을 원하는지를 기술한다. 이러한 방식에서 프로그램은 어떻게 동작하는지에 대한 세부 사항을 추상화하고, 컴퓨터가 이를 자동으로 처리한다. 선언형 프로그래밍은 명령형 프로그래밍과 달리 상태(state)를 갖지 않고, 함수와 수식 등으로 구성되어, 프로그래머는 원하는 결과를 달성하기 위해 데이터와 연산을 기술하며, 컴퓨터는 이를 평가하여 최적의 방법으로 처리한다.</p>
<p>예를 들어, SQL은 데이터베이스에서 데이터를 검색하는데 선언적인 언어로 사용되는데, 프로그래머는 어떤 데이터를 원하는지를 SQL 쿼리로 기술하면, 데이터베이스 시스템이 이를 처리하여 원하는 데이터를 반환한다. 프로그래머는 데이터를 가져오는 방법이나 내부 구현 방식에 대해서 명시적으로 제어하지 않고, 단지 원하는 데이터를 어떻게 표현할지를 기술한다.</p>
<p>선언형 프로그래밍은 코드가 간결하고 추상화되어 있어 코드의 이해가 쉽고 유지 보수가 편리하다. 또한, 성능 최적화와 관련된 세부 사항을 컴퓨터에게 맡기기 때문에 프로그래머는 핵심 로직에 집중할 수 있다.</p>
<h2 id="21-함수형-프로그래밍-functional-programming">2.1) 함수형 프로그래밍 (Functional Programming)</h2>
<p>함수형 프로그래밍은 수학적인 함수 개념을 기반으로 하는 프로그래밍 패러다임이다. 데이터의 상태 변화를 최소화하고, 함수들의 조합으로 문제를 해결한다. 함수형 프로그래밍은 부작용(side effect)을 최소화하여 프로그램을 더 안정적이고 예측 가능하게 만들고, 동시에 코드의 간결성과 가독성을 높이는 장점이 있다. Haskell, Lisp, Scala 등이 대표적인 함수형 프로그래밍 언어이다.</p>
<h2 id="22-논리형-프로그래밍-logic-programming">2.2) 논리형 프로그래밍 (Logic Programming)</h2>
<p>논리형 프로그래밍은 명시적인 단계적인 처리보다 논리적 규칙을 사용하여 문제를 해결하는 패러다임으로, 사실을 표현하는 규칙들과 목표를 명시하여 시스템이 그 규칙에 따라 자동으로 해결책을 찾는다. Prolog가 가장 대표적인 논리형 프로그래밍 언어이다.</p>
<hr>
<h1 id="3-이벤트-기반-프로그래밍-event-driven-programming-edp">3) 이벤트 기반 프로그래밍 (Event-Driven Programming, EDP)</h1>
<p>이벤트 기반 프로그래밍은 프로그램의 동작을 이벤트의 발생과 처리를 중심으로 구성하는 프로그래밍 패러다임이다. 이벤트란 사용자의 입력, 외부 시스템의 상태 변화, 네트워크에서의 데이터 수신 등과 같이 프로그램 외부에서 발생하는 사건을 의미한다. 이러한 이벤트들을 프로그램이 적절하게 처리하고 응답하는 방식으로 동작한다.</p>
<p>이벤트 기반 프로그래밍은 주로 GUI 기반의 응용 프로그램, 웹 애플리케이션, 게임 등에서 많이 사용된다. 사용자가 버튼을 클릭하거나 키보드 입력을 하면 해당 이벤트가 발생하고, 프로그램은 이벤트를 감지하고 이벤트 핸들러(Event Handler)라는 특별한 함수를 실행하여 해당 이벤트에 대한 처리를 수행한다.</p>
<p>예를 들어, 웹 애플리케이션에서는 사용자의 요청에 따라 웹 페이지가 동적으로 업데이트되어야 할 때, 사용자의 요청은 클릭 이벤트나 입력 이벤트로 표현될 수 있다. 웹 애플리케이션은 이러한 이벤트를 감지하여 적절한 처리를 수행하고, 웹 페이지의 내용을 업데이트하거나 다른 동작을 수행한다.</p>
<p>이벤트 기반 프로그래밍은 비동기적인 방식으로 동작한다. 이벤트가 발생하면 해당 이벤트에 대한 처리를 즉시 실행하는 것이 아니라, 이벤트 루프(Event Loop)라는 메커니즘을 통해 이벤트가 발생할 때까지 대기하다가 이벤트가 발생하면 이벤트 핸들러를 호출하여 처리한다. 이러한 방식으로 여러 이벤트들을 비동기적으로 처리하면서도 동시에 프로그램이 응답성을 유지할 수 있게 된다.</p>
<p>이벤트 기반 프로그래밍은 비동기적인 특성을 갖기 때문에 복잡한 응용 프로그램에서 특히 유용하다. 또한, 이벤트 기반 프로그래밍은 높은 확장성을 제공하여 여러 이벤트들을 효율적으로 처리할 수 있다. 그러나 이벤트 처리의 순서와 시점을 고려해야 하는 점과 이벤트 핸들러가 오래 걸리는 작업을 수행할 경우 응용 프로그램의 성능에 영향을 미칠 수 있는 부분을 주의해야 한다.</p>
<hr>
<h4 id="📖cs-index"><a href="https://velog.io/@ch_dev/CS-Index" title="CS Index">📖CS Index</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[CS Index]]></title>
            <link>https://velog.io/@ch_dev/CS-Index</link>
            <guid>https://velog.io/@ch_dev/CS-Index</guid>
            <pubDate>Sun, 23 Jul 2023 15:17:42 GMT</pubDate>
            <description><![CDATA[<p>🖥 CS(Computer Science, CS)</p>
<hr>
<h1 id="📖index">📖Index</h1>
<h2 id="cs">CS</h2>
<ul>
<li><h3 id="프로그래밍-패러다임"><a href="https://velog.io/@ch_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84" title="[CS]프로그래밍 패러다임">프로그래밍 패러다임</a></h3>
<ul>
<li><h3 id="절자지향-언어--객체지향-언어"><a href="https://velog.io/@ch_dev/%EC%A0%88%EC%9E%90%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4" title="[CS]절자지향 언어 | 객체지향 언어">절자지향 언어 | 객체지향 언어</a></h3>
</li>
<li><h3 id="데이터-단위"><a href="https://velog.io/@ch_dev/CS-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%8B%A8%EC%9C%84" title="[CS]데이터 단위">데이터 단위</a></h3>
</li>
</ul>
</li>
</ul>
<h2 id="컴퓨터-구조">컴퓨터 구조</h2>
<ul>
<li><h3 id="컴퓨터-구성-요소"><a href="https://velog.io/@ch_dev/CS-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C">컴퓨터 구성 요소</a></h3>
</li>
</ul>
<h2 id="네트워크">네트워크</h2>
<ul>
<li><h3 id="프로토콜"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C">프로토콜</a></h3>
</li>
<li><h3 id="tcpudp"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP">TCP/UDP</a></h3>
</li>
<li><h3 id="http--https"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%ACHTTP-HTTPS">HTTP | HTTPS</a></h3>
</li>
<li><h3 id="ip-주소mac-주소"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-IP%EC%A3%BC%EC%86%8CMAC%EC%A3%BC%EC%86%8C">IP 주소/MAC 주소</a></h3>
</li>
<li><h3 id="dns"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-DNS">DNS</a></h3>
</li>
<li><h3 id="osi-7-계층"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7-Layer">OSI 7 계층</a></h3>
</li>
<li><h3 id="tcpip-4-계층"><a href="https://velog.io/@ch_dev/CS-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPIP-4-Layer">TCP/IP 4 계층</a></h3>
</li>
</ul>
<h2 id="운영체제">운영체제</h2>
<p>###</p>
<h2 id="데이터베이스">데이터베이스</h2>
<h3 id=""></h3>
<hr>
<p>Update. 2024.04.09.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Index]]></title>
            <link>https://velog.io/@ch_dev/Java-Index</link>
            <guid>https://velog.io/@ch_dev/Java-Index</guid>
            <pubDate>Sun, 23 Jul 2023 06:43:12 GMT</pubDate>
            <description><![CDATA[<hr>
<h1 id="📖index">📖Index</h1>
<h2 id="java-개요"><a href="https://velog.io/@ch_dev/Java-%EC%9E%90%EB%B0%94-%EA%B0%9C%EC%9A%94" title="Java 개요">Java 개요</a></h2>
<h2 id="타입">타입</h2>
<ul>
<li><h3 id="java-변수와-상수"><a href="https://velog.io/@ch_dev/Java-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98">[Java] 변수와 상수</a></h3>
</li>
<li><h3 id="java-원시-타입과-참조-타입"><a href="https://velog.io/@ch_dev/Java-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85">[Java] 원시 타입과 참조 타입</a></h3>
</li>
<li><h3 id="java-형-변환"><a href="https://velog.io/@ch_dev/Java-%ED%98%95-%EB%B3%80%ED%99%98">[Java] 형 변환</a></h3>
</li>
</ul>
<h2 id="연산자">연산자</h2>
<h2 id="제어문">제어문</h2>
<h2 id="배열">배열</h2>
<h2 id="제네릭">제네릭</h2>
<hr>
<p>Update. 2023.09.12.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Sourcetree 실행 안됨 해결하기]]></title>
            <link>https://velog.io/@ch_dev/Sourcetree-%EC%8B%A4%ED%96%89-%EC%95%88%EB%90%A8-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ch_dev/Sourcetree-%EC%8B%A4%ED%96%89-%EC%95%88%EB%90%A8-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 01 Jul 2023 07:50:16 GMT</pubDate>
            <description><![CDATA[<h4 id="넌-또-왜-그러니🤔">넌 또 왜 그러니🤔</h4>
<p>잘 사용하고 있는 소스트리가 어느새 갑자기 스플래시 스크린만 나타나고 프로그램이 다운되는 현상이 발생하고 있다.
실행 중인 프로세스에서도 소스트리를 찾아볼 수 없고 프로세스가 종료되고 있다.</p>
<hr>
<h1 id="🔍원인-파악">🔍원인 파악</h1>
<p>로그를 확인하기 위하여 <code>sourcetree.log</code>파일을 확인해보았는데 다음과 같았다.</p>
<h2 id="sourcetreelog">sourcetree.log</h2>
<pre><code>ERROR [2023-06-30 15:30:25,213] [1] [Sourcetree.Composition.VSMef.Net48.VSMefCompositionManager] [Log] - Unable to load MEF components
System.InvalidOperationException: 시퀀스에 요소가 없습니다.
   위치: System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   위치: Microsoft.VisualStudio.Composition.PartDiscovery.GetElementTypeFromMany(Type type)
   위치: Microsoft.VisualStudio.Composition.RuntimeComposition.RuntimeImport.get_ImportingSiteTypeWithoutCollection()
   위치: Microsoft.VisualStudio.Composition.RuntimeComposition.RuntimeImport.get_IsLazy()
   위치: Microsoft.VisualStudio.Composition.RuntimeComposition.RuntimeImport.get_LazyFactory()
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.GetValueForImportSite(RuntimePartLifecycleTracker importingPartTracker, RuntimeImport import)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.RuntimePartLifecycleTracker.SatisfyImports()
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.SatisfyImmediateImports()
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveNext(PartLifecycleState nextState)
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveToState(PartLifecycleState requiredState)
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.GetValueReadyToExpose()
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.&lt;&gt;c__DisplayClass15_0.&lt;GetExportedValueHelper&gt;b__0()
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.GetValueForImportElement(RuntimePartLifecycleTracker importingPartTracker, RuntimeImport import, RuntimeExport export, Func`3 lazyFactory)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.GetValueForImportSite(RuntimePartLifecycleTracker importingPartTracker, RuntimeImport import)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.RuntimePartLifecycleTracker.&lt;CreateValue&gt;b__10_0(RuntimeImport import)
   위치: System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   위치: System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   위치: System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.RuntimePartLifecycleTracker.CreateValue()
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.Create()
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveNext(PartLifecycleState nextState)
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveToState(PartLifecycleState requiredState)
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.GetValueReadyToExpose()
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.&lt;&gt;c__DisplayClass15_0.&lt;GetExportedValueHelper&gt;b__0()
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.GetValueForImportElement(RuntimePartLifecycleTracker importingPartTracker, RuntimeImport import, RuntimeExport export, Func`3 lazyFactory)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.GetValueForImportSite(RuntimePartLifecycleTracker importingPartTracker, RuntimeImport import)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.RuntimePartLifecycleTracker.&lt;CreateValue&gt;b__10_0(RuntimeImport import)
   위치: System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   위치: System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   위치: System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   위치: Microsoft.VisualStudio.Composition.RuntimeExportProviderFactory.RuntimeExportProvider.RuntimePartLifecycleTracker.CreateValue()
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.Create()
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveNext(PartLifecycleState nextState)
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.MoveToState(PartLifecycleState requiredState)
   위치: Microsoft.VisualStudio.Composition.ExportProvider.PartLifecycleTracker.GetValueReadyToExpose()
   위치: System.Lazy`1.CreateValue()
   위치: System.Lazy`1.LazyInitValue()
   위치: Microsoft.VisualStudio.Composition.NetFxAdapters.MefV1ExportProvider.&lt;&gt;c__DisplayClass12_0.&lt;UnwrapExport&gt;b__1()
   위치: System.ComponentModel.Composition.Primitives.Export.get_Value()
   위치: System.ComponentModel.Composition.ReflectionModel.ImportingItem.Cast(Type type, Export export)
   위치: System.ComponentModel.Composition.ReflectionModel.ReflectionComposablePart.SetImport(ImportingItem item, Export[] exports)
   위치: System.ComponentModel.Composition.Hosting.ImportEngine.PartManager.TrySetImport(ImportDefinition import, Export[] exports)
   위치: System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportSubset(PartManager partManager, IEnumerable`1 imports, AtomicComposition atomicComposition)
   위치: System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportsStateMachine(PartManager partManager, ComposablePart part)
   위치: System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImports(PartManager partManager, ComposablePart part, Boolean shouldTrackImports)
   위치: System.ComponentModel.Composition.Hosting.ImportEngine.SatisfyImportsOnce(ComposablePart part)
   위치: System.ComponentModel.Composition.Hosting.CompositionContainer.SatisfyImportsOnce(ComposablePart part)
   위치: System.ComponentModel.Composition.AttributedModelServices.SatisfyImportsOnce(ICompositionService compositionService, Object attributedPart)
   위치: Sourcetree.Composition.VSMef.Net48.VSMefCompositionManager.&lt;Compose&gt;d__5.MoveNext()
</code></pre><p>핵심은 <code>[Log] - Unable to load MEF components System.InvalidOperationException: 시퀀스에 요소가 없습니다.</code> 이 부분 같다.
Windows 업데이트 이후 캐시 파일이 손상이 되어 문제가 발생한 거 같다.</p>
<hr>
<h1 id="해결방법">해결방법</h1>
<p>소스트리 캐시 파일인 <code>Composition.cache</code>파일을 삭제해 주면 된다.
<img src="https://velog.velcdn.com/images/ch_dev/post/109779da-6e24-4c0a-a5ce-6032e2228ee2/image.png" alt=""></p>
<blockquote>
<p># 소스트리 캐시 경로
C:\Users&lt;USER&gt;\AppData\Local\Atlassian\SourceTree.exe_Url_&lt;UID&gt;&lt;소스트리 버전&gt;</p>
</blockquote>
<p>삭제된 캐시 파일은 소스트리를 실행하면 <strong>새로 캐시 파일이 생기니</strong> 걱정하지 않아도 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[에러 해결] pip 뭐가 문제야! No midule named 'pip'❓]]></title>
            <link>https://velog.io/@ch_dev/%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0-pip-%EB%AD%90%EA%B0%80-%EB%AC%B8%EC%A0%9C%EC%95%BC-No-midule-named-pip</link>
            <guid>https://velog.io/@ch_dev/%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0-pip-%EB%AD%90%EA%B0%80-%EB%AC%B8%EC%A0%9C%EC%95%BC-No-midule-named-pip</guid>
            <pubDate>Sat, 01 Jul 2023 03:44:09 GMT</pubDate>
            <description><![CDATA[<h4 id="뭐가-문제야❓">뭐가 문제야❓</h4>
<p>일반적으로 <code>python</code>을 설치할 <code>pip</code>가 설치되고, 잘 사용했던 <code>pip</code>가 <code>No midule named &#39;pip&#39;</code> 로그를 남기며 갑자기 동작하지 않는 문제가 발생하였다.</p>
<hr>
<h1 id="원인">원인</h1>
<p><code>No midule named &#39;pip&#39;</code>가 발생하기 직전 과정을 떠올려보면 <code>pip install --upgrade pip</code>을 시도한 후 <code>pip</code>가 먹통이 되었다. 다음과 같은 로그를 뿌리고 말이다.</p>
<blockquote>
<p>ModuleNotFoundError: No module named ‘pip’</p>
</blockquote>
<p><strong>ModuleNotFound</strong>라고? <code>pip install --upgrade pip</code>시도 이전에 잘 되었던 <code>pip</code> 모듈이 없다고 한다.
아마 윈도우에서 관리자 권한이 없는 채로 <code>pip install --upgrade pip</code>를 진행하는 과정 중에 기존 <code>pip</code>모듈이 삭제된 후 최신 버전의 <code>pip</code>가 설치되어야 하는데, <code>pip</code> 설치 시에 권한 문제로 실패하는 현상 같아 보인다. </p>
<hr>
<h1 id="해결방법">해결방법</h1>
<p>이러한 문제는<code>pip</code>를 재설치 해주면 해결된다.
약간의 첨언을 하자면 <a href="https://www.pypa.io">PyPA</a>(Python Packaging Authority)라는 파이썬 패키지 관련 핵심 프로젝트를 유지하고 관리하는 그룹이 있는데, 대표적으로 <code>pip</code>, <code>setuptools</code>, <code>wheel</code> 패키지가 있다.</p>
<h2 id="ensurepip-방식">ensurepip 방식</h2>
<p><code>Python</code>에 기본적으로 포함된 <code>ensurepip</code>모듈을 이용하여 <code>pip</code> 패키지를 설치하는 방법이다.
일반적으로 <code>ensurepip</code>모듈은 <code>Python</code>을 설치한 후 처음 사용할 때 실행되며, <code>pip</code>를 자동으로 설치해 주는 역할을 하는데,<code>ensurepip</code> 모듈을 사용해서 <code>pip</code>가 설치되어 있는지 확인하고, 없다면 <code>pip</code>를 설치한다. </p>
<blockquote>
<p>## <em><code>pip</code> 복구를 원한다면 다음과 같은 명령어</em>
python -m ensurepip
<br>
## <em><code>pip</code> 설치 후 최신 버전으로 업그레이드를 원한다면 다음과 같은 명령어</em>
python -m ensurepip --upgrade</p>
</blockquote>
<h2 id="get-pippy-방식">get-pip.py 방식</h2>
<p><code>curl</code>을 이용하여 <code>get-pip.py</code>파일을 다운로드 후 패키지를 설치하는 방법으로<code>upgrade</code>명령어 없이 최신 버전의 <code>pip</code>패키지를 설치할 수 있다.</p>
<blockquote>
<p>## 1. <code>get-pip.py</code> 파일 다운로드
curl <a href="https://bootstrap.pypa.io/get-pip.py">https://bootstrap.pypa.io/get-pip.py</a> -o get-pip.py
<br>
## 2. <code>pip</code> 패키지 설치
python get-pip.py</p>
</blockquote>
<hr>
<h1 id="참고문서">참고문서</h1>
<p><a href="https://pip.pypa.io/en/stable/installation/">pip documentation_Installation(리눅스, 맥OS, 윈도우)
</a></p>
<br>

<blockquote>
<p>기존 업무와 업무 인수인계로 바쁜 나날을 보내고 있다. <del>해야 할 게 산더미</del></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 사라진 커밋(Commit) 복구하기]]></title>
            <link>https://velog.io/@ch_dev/Git-%EC%82%AC%EB%9D%BC%EC%A7%84-%EC%BB%A4%EB%B0%8BCommit-%EB%B3%B5%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ch_dev/Git-%EC%82%AC%EB%9D%BC%EC%A7%84-%EC%BB%A4%EB%B0%8BCommit-%EB%B3%B5%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 20 Jun 2023 16:03:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/ch_dev/post/33ef0916-041b-41ea-a98f-f424e59bf097/image.jfif" alt=""></p>
<h4 id="🙋🏻♀️잘가-commit">🙋🏻‍♀️잘가 Commit~</h4>
<p>(실은 이 글은 몇 개월 전에 올릴 글이었지만, 이제서야 올린다. 업무가 쏟아져 내려와..)
Git을 이용하여 작업을 하다 보면 실수나 명령어를 잘못 치거나 등 다양한 이유로 커밋들을 날려버린 경우가 있을 텐데, 그대로 코드들과 작별 인사를 하기에는 아쉬우니 다시 코드를 만나러 가자!</p>
<hr>
<h2 id="commit-복구하기">Commit 복구하기</h2>
<p>Git 터미널을 실행시켜 잃어버린 Commit을 만날 준비를 하자!</p>
<h3 id="step1-git-reflog로-커밋-내역-확인하기">Step.1 git reflog로 커밋 내역 확인하기</h3>
<p><img src="https://velog.velcdn.com/images/ch_dev/post/4bd76d21-7eee-44a6-aaa5-6c5372551545/image.png" alt="">
git 터미널에서 <code>git reflog</code> 커밋 내역을 확인하자!
<code>grep</code> 명령어를 추가로 이용하면 원하는 커밋 찾을 수 있다.</p>
<blockquote>
<p>Ex.) feat가 들어간 커밋을 찾고자 한다면 다음과 같다.
<code>git reflog | grep feat</code> </p>
</blockquote>
<h3 id="step2-해당-커밋-되돌리기">Step.2 해당 커밋 되돌리기</h3>
<p><img src="https://velog.velcdn.com/images/ch_dev/post/f0de7827-b83a-43b8-8882-e4de0e810586/image.png" alt=""></p>
<p><code>git reset --hard [commitID]</code> 명령어를 이용하여 Commit을 복구하자!
<br>
* 그 외 <code>git reset --hard HEAD@[n]</code> 명령어와 이전 커밋으로 되돌리는 <code>git reset --hard ORIG_HEAD</code> 명령어를 사용하여 복구할 수 있다.</p>
<h3 id="✨-checkout">✨ checkout</h3>
<p><code>git checkout</code>은 Git에서 다양한 작업을 수행하는 명령어인데, 주로 브랜치를 전환하거나 커밋 체크아웃 또는 파일 복원에 사용된다.</p>
<h2 id="git-reset-git-checkout-응">Git reset, Git checkout 응?</h2>
<p>이 둘의 차이가 궁금할텐데 간단히 하자면
<code>git checkout</code>은 주로 작업 디렉토리, 스테이징 영역 및 브랜치를 변경하는데 사용되고
<code>git reset</code>은 주로 커밋과 브랜치의 HEAD를 조작하는데 사용한다.</p>
<blockquote>
<p>나의 케이스는 그냥 완전 날려먹은 케이스로 코드를 다시 작성했었던 기억이 있다. 😂😂😂
그래도 내가 작성했던 코드이여서 인지 어려움은 없었지만 다시 코드를 작성하는 과정에서, 이전에는 내가 파악하지 못한 이슈를 발견하게 되었다.
<del>Commit을 날려서 좋은 사례가 된 일 일지도?</del></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>