<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발자로 홀로 서기</title>
    <link>https://mommoo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 00:51:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Mommoo</managingEditor>
    <item>
      <title>[네트워크] REST API</title>
      <link>https://mommoo.tistory.com/110</link>
      <description>&lt;article id=&quot;d452a701-e0d0-43fe-a7cd-e48edfdb41e4&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;ef480567-de2d-4302-888c-132345730ce0&quot; class=&quot;&quot;&gt;안녕하세요.&lt;/p&gt;&lt;p id=&quot;a89648ff-2d17-4330-8ad6-56c38e30945b&quot; class=&quot;&quot;&gt;오늘은 &lt;strong&gt;&lt;code&gt;REST API&lt;/code&gt;&lt;/strong&gt;에 대해서 포스팅 합니다.&lt;/p&gt;&lt;p id=&quot;20cdaa9a-97b5-4827-b64a-c72b0676edd2&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;c9522fe2-114f-4b65-9142-2a364ea9706a&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 아키텍쳐를 웹 아키텍쳐중 하나인 &lt;strong&gt;HTTP&lt;/strong&gt; 프로토콜과 동일 선상에서 해석하는 자료가 많았습니다. &lt;/p&gt;&lt;p id=&quot;acc018f0-a759-4ca5-8763-73545a954053&quot; class=&quot;&quot;&gt;재밌는 사실은 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 창시자인 로이 필딩은 &lt;strong&gt;HTTP&lt;/strong&gt;에 대해 전혀 언급하지 않았으며 순수하게 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 시스템을 구성하는 방법에 대해서만 소개 하였습니다. &lt;/p&gt;&lt;p id=&quot;14cdb9b4-61c8-42a0-a09e-32667b0f022e&quot; class=&quot;&quot;&gt;이번 포스팅의 목적은 웹과 무관한 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 시스템을 본질을 이해하고, &lt;strong&gt;HTTP&lt;/strong&gt; 프로토콜을 이용한여 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 시스템을 설계하는 방법에 대해 이해하는 것 입니다. &lt;/p&gt;&lt;h1 id=&quot;a66bcb4a-844a-4f99-b39f-656fbc17066f&quot; class=&quot;&quot;&gt;REST&lt;/h1&gt;&lt;p id=&quot;23e4f852-2f91-45e2-abf0-461cd6fcf409&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt;는 간단하게 말하자면, &lt;strong&gt;존재하는 자원의 식별하고 제어하는 방법론&lt;/strong&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;c8d876c8-aabc-4d02-83a6-60b2de7d3db4&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; &lt;/strong&gt;에서 정의 하는 &lt;code&gt;&lt;strong&gt;자원&lt;/strong&gt;&lt;/code&gt;에 대한 정의를 알아보고 &lt;code&gt;&lt;strong&gt;자원의 제어&lt;/strong&gt;&lt;/code&gt;와&lt;strong&gt; &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;자원의 표현&lt;/strong&gt;&lt;/code&gt;은 무엇인지 알아봅시다. &lt;/p&gt;&lt;p id=&quot;892f91f7-732a-42c8-bfea-530d66c7d2c6&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;191d3c38-051a-47b4-b8b7-159a3beabbcc&quot; class=&quot;&quot;&gt;자원 (Resource)&lt;/h3&gt;&lt;p id=&quot;f7811bae-73e5-4353-b01f-04ea587339c0&quot; class=&quot;&quot;&gt;&lt;strong&gt;&lt;code&gt;자원&lt;/code&gt;&lt;/strong&gt;이란 일이 처리되는 비용을 의미합니다.&lt;/p&gt;&lt;p id=&quot;46d177ff-e30f-4739-9eaf-8a8ec509a233&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 는 소프트웨어 아키텍쳐 이므로 컴퓨터의 자원을 의미합니다.&lt;/p&gt;&lt;p id=&quot;29c9a52a-e2b9-49ca-929e-bbb9c0f200ec&quot; class=&quot;&quot;&gt;컴퓨터의 자원은 CPU가 수행하는 명령, 하드디스크에 저장되는 파일들, 메모리에 저장되는 데이터들을 의미합니다.&lt;/p&gt;&lt;p id=&quot;31230dfb-f365-4925-934a-8753dfa37cfd&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt;는 &lt;strong&gt;컴퓨터 자원을 사용하여 처리하는 한 단위의 작업을 식별&lt;/strong&gt;할 수 있어야 합니다.&lt;/p&gt;&lt;p id=&quot;47bcf829-7b63-41aa-a8cc-a959cc0bea57&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt;는 &lt;strong&gt;&lt;code&gt;자원&lt;/code&gt;&lt;/strong&gt;을 식별 할 수 있는 식별자가 필요합니다. 예를든다면 TIMESTAMP 나 UUID 같은 중복되지 않는 정보들을 식별자로 사용할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;ae56d96e-3987-475e-ab6e-3b40a9ce3685&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;e17a8cd2-4e86-4c5b-a199-cbbaee5c701c&quot; class=&quot;&quot;&gt;자원의 제어 (Resource Methods)&lt;/h3&gt;&lt;p id=&quot;6111fabf-2cc6-407a-b3eb-ee18bb627943&quot; class=&quot;&quot;&gt;&lt;strong&gt;&lt;code&gt;자원의 제어&lt;/code&gt;&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;는 흔히 CRUD 라 부르는 생성, 읽기, 변경, 삭제 행위를 &lt;strong&gt;&lt;code&gt;자원&lt;/code&gt;&lt;/strong&gt;에 수행하는것을 의미합니다. &lt;/p&gt;&lt;p id=&quot;24d3ddcf-cb96-4586-b299-943d4ca11bf4&quot; class=&quot;&quot;&gt;이때 제어 방법은 일관적인 인터페이스로 구성되어야 합니다. 이는 소프트웨어의 API 처리 법칙을 정하면 일관적이게 규칙을 따라야 한다는 것입니다. 예를들어 웹 기반(&lt;strong&gt;HTTP&lt;/strong&gt;)의 시스템에서 자원의 변경을 POST 메소드로 한다면(PUT이 더 어울릴지라도) 자원의 변경은 POST 메소드로 일관적이게 처리해야 한다는 점입니다.&lt;/p&gt;&lt;p id=&quot;d58894f3-d23a-42bf-921b-99796d771922&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;47a04f1d-0226-4de3-8adb-44b79f7940a5&quot; class=&quot;&quot;&gt;자원의 표현 &lt;strong&gt;(Resource Representation)&lt;/strong&gt;&lt;/h3&gt;&lt;p id=&quot;049934b1-2b61-4196-92bb-51925c938211&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;자원의 표현&lt;/strong&gt;&lt;/code&gt;은 조회한 순간의 자원 상태를 의미합니다. &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 시스템의 &lt;code&gt;&lt;strong&gt;자원의 표현&lt;/strong&gt;&lt;/code&gt;은 &lt;strong&gt;자기 서술적인(self-descriptive)&lt;/strong&gt; 메시지와 &lt;strong&gt;HATEOAS(hypermedia as the engine of application state)&lt;/strong&gt;로 구성됩니다. 이는 데이터를 설명하는 메타 데이터, 다음 자원으로의 이동을 안내하는 하이퍼 텍스트 등이 포함 되는 데이터를 의미합니다. &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 시스템은 클라이언트가 &lt;code&gt;&lt;strong&gt;자원의 표현&lt;/strong&gt;&lt;/code&gt;만 보더라도 이해되는 것을 목표로 합니다.&lt;/p&gt;&lt;p id=&quot;52d18fdc-de60-437b-b254-fc4ef2d2cc91&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;9a57fc83-967d-4138-bdb0-dc7a7f633dc1&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;16617cd1-4415-4a5d-bb39-d107b5a32f82&quot;&gt;&lt;h1 id=&quot;ba7c0cd1-81e6-4c6f-8dfc-d39c385500f5&quot; class=&quot;&quot;&gt;웹 기반(HTTP)의 REST&lt;/h1&gt;&lt;p id=&quot;50f3ae95-b2b5-40ee-ab81-0bef0b19345d&quot; class=&quot;&quot;&gt;많은 자료들이 설명하고 있는 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템은 &lt;strong&gt;HTTP&lt;/strong&gt; 기반으로 구성된 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템 입니다.&lt;/p&gt;&lt;p id=&quot;70801558-a479-4010-b848-23b9622fae54&quot; class=&quot;&quot;&gt;&lt;strong&gt;HTTP&lt;/strong&gt; 기술을 통해 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템을 어떻게 구현하는지 알아봅시다.&lt;/p&gt;&lt;p id=&quot;a714d72d-ca7e-409a-a240-01b3a1c6bd70&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;539511cc-2c05-4c07-af6b-979913b835e4&quot; class=&quot;&quot;&gt;자원의 식별&lt;/h3&gt;&lt;p id=&quot;4520118d-ced9-4d89-b475-feeed498595e&quot; class=&quot;&quot;&gt;&lt;strong&gt;HTTP&lt;/strong&gt;는 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템이 요구하는 &lt;code&gt;&lt;strong&gt;자원의 식별&lt;/strong&gt;&lt;/code&gt;을 &lt;strong&gt;URI&lt;/strong&gt;의 정의로 처리합니다. &lt;/p&gt;&lt;p id=&quot;fee8d1f0-b78d-4378-88fe-7b377ae95965&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;자원&lt;/strong&gt;&lt;/code&gt;은 명사로 커뮤니케이션을 하기 때문에 많은 웹 기반 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템 선구자들은 &lt;strong&gt;URI&lt;/strong&gt;을 명사구로 표현함으로써 &lt;strong&gt;&lt;code&gt;자원&lt;/code&gt;&lt;/strong&gt;을 나타내려고 노력했습니다.&lt;/p&gt;&lt;p id=&quot;68ba0527-c14e-4eed-9d4d-ddeb7aefa771&quot; class=&quot;&quot;&gt;다음과 같은 URI 표기법을 따릅니다.&lt;/p&gt;&lt;ul id=&quot;f526b0ae-7e0e-4b7a-8bf4-51e74f548642&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;URI의 세그먼트는 동사가 아닌 명사 사용.&lt;ul id=&quot;df07d0d5-fe24-402f-9fa6-c4f6e1153bd1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;users/mommoo/name (O)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;055fd2ef-8020-4dcb-a4c3-b201396b7872&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;users/mommoo/getName (X)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a01219b8-6f1b-42ce-9f02-c15d656ead8a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;만약 컨트롤 자원이라면 예외적으로 동사구 허용.&lt;ul id=&quot;7374351f-7b27-42b4-85e4-0e1f1c221580&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;users/mommoo/name/duplicate (중복 이름 검사 API)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;784e1394-ff3e-4b89-8c57-d70fd48a5209&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;자원의 관계가 표시되도록 작성.&lt;ul id=&quot;5a1ea517-1d78-489f-aa9d-215ab6e92e6e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;users/mommoo/devices/android-phone&lt;/li&gt;&lt;/ul&gt;&lt;blockquote id=&quot;6b3c6f20-cd69-4b78-8d93-a479589a68a7&quot; class=&quot;&quot;&gt;위 예시는 유저 목록중 Mommoo를 의미하고, Mommoo가 가지고 있는 디바이스들을 의미하며, 디바이스들중 안드로이드 폰을 의미합니다.&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;5106e266-6325-4b6f-8a8b-f2b0f532d51d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;204745ae-baf3-44b2-8448-d2939dcef9d2&quot; class=&quot;&quot;&gt;자원의 제어&lt;/h3&gt;&lt;p id=&quot;d6bf80aa-6178-4bce-966b-63873aa640e5&quot; class=&quot;&quot;&gt;&lt;strong&gt;HTTP&lt;/strong&gt;는 &lt;code&gt;&lt;strong&gt;자원의 제어&lt;/strong&gt;&lt;/code&gt;를 &lt;strong&gt;HTTP Method&lt;/strong&gt;로 표현합니다. 대표적으로 &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; 4개의 Method를 사용 합니다. &lt;/p&gt;&lt;p id=&quot;a5b254a2-0413-47cd-8431-a872d754fcca&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;자원&lt;/strong&gt;&lt;/code&gt;을 URI로 식별하고 URI에 행위를 붙여줌으로써 &lt;strong&gt;&lt;code&gt;자원&lt;/code&gt;&lt;/strong&gt;을 제어합니다.&lt;/p&gt;&lt;p id=&quot;d705eb65-d8dd-463b-98f8-34b2591a3d8b&quot; class=&quot;&quot;&gt;아래는 &lt;strong&gt;&lt;code&gt;자원 제어&lt;/code&gt;&lt;/strong&gt;의 예시입니다.&lt;/p&gt;&lt;ul id=&quot;f0db7e24-fa26-4761-bb57-ee52db73677f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;mark class=&quot;highlight-gray&quot;&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/mark&gt;&lt;strong&gt; &lt;/strong&gt;&lt;em&gt;users/mommoo/name&lt;/em&gt; (이름을 조회합니다.)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;950e30dd-efdb-4679-a0ba-47c6eb68620d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;mark class=&quot;highlight-gray&quot;&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/mark&gt; &lt;em&gt;users/mommoo/name&lt;/em&gt; (이름을 등록합니다.)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;2c78f200-899d-430b-9e00-8e015aec40bb&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;mark class=&quot;highlight-gray&quot;&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/mark&gt;&lt;strong&gt; &lt;/strong&gt;&lt;em&gt;users/mommoo/name&lt;/em&gt; (이름을 수정합니다.)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;e60ce80f-c451-40d7-9250-819faeaad0b8&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;mark class=&quot;highlight-gray&quot;&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/mark&gt;&lt;strong&gt; &lt;/strong&gt;&lt;em&gt;users/mommoo/name&lt;/em&gt; (이름을 삭제합니다.)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;7fd63880-46fd-4ac5-907b-f4b9df3d3d1f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;012994e7-6b94-47bd-96c2-7c540fa14a92&quot; class=&quot;&quot;&gt;자원의 표현&lt;/h3&gt;&lt;p id=&quot;fb0318bc-f3a1-4f3f-a1b6-0a0132676dea&quot; class=&quot;&quot;&gt;&lt;strong&gt;HTTP&lt;/strong&gt;는 자원의 표현을 &lt;strong&gt;HTTP 응답&lt;/strong&gt; 메시지로 구현합니다. &lt;/p&gt;&lt;p id=&quot;8f245e60-94c8-4915-bcae-c7aece02a68a&quot; class=&quot;&quot;&gt;&lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 자원의 표현의 특징인 &lt;strong&gt;self-descriptive&lt;/strong&gt;과 &lt;strong&gt;HATEOS&lt;/strong&gt;를 만족하기 위해 ContentType 또는 커스텀 &lt;strong&gt;HTTP 헤더&lt;/strong&gt;에 메타데이터 명시, 데이터에 링크를 포함하는 등의 기법을 사용합니다.&lt;/p&gt;&lt;blockquote id=&quot;53526757-61a4-43ef-9af4-7fe7e76988aa&quot; class=&quot;&quot;&gt;응답 예시는 &lt;a href=&quot;https://slides.com/eungjun/rest#/79/0/1&quot;&gt;https://slides.com/eungjun/rest#/79/0/1&lt;/a&gt; 참고해주세요.&lt;/blockquote&gt;&lt;p id=&quot;c47c199e-654d-41bb-b012-1f263efa172a&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;da1c06ed-a8ff-4cc6-be63-47de28e5e17e&quot;&gt;&lt;h1 id=&quot;682fb0a4-61ed-43ff-8c27-ff940165252a&quot; class=&quot;&quot;&gt;REST-FUL&lt;/h1&gt;&lt;p id=&quot;623f6a65-09cc-425e-acec-b165123a1135&quot; class=&quot;&quot;&gt;&lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템의 구성 요소는 다음과 같이 6개로 구성됩니다.&lt;/p&gt;&lt;ul id=&quot;d2eadc91-b6b4-4722-9db3-5371b5b681dc&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;Client-Server&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;7164b7e9-e67f-4a25-9316-abf85fbd1d40&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;Stateless&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;2e980621-7db2-4402-86f9-0cabbd370257&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;Cacheable&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;cacce044-e02e-4ec3-b3a2-bc01ca4d4b95&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;Unitform-Interface&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;ba03d757-61c2-48fb-96c8-38684657356c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;Layered-System&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;6a4037e5-020c-4d11-8a85-9d5c6bf7564d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;Code on demand (optional)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;6600b9c4-5cc9-417a-b88b-34bdefc49e22&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;0bf86439-db5c-44da-b786-28e8156d7884&quot; class=&quot;&quot;&gt;위 6가지 항목을 만족하는 &lt;strong&gt;HTTP&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템을 구현한다고 가정할때, &lt;strong&gt;Unitform-Interface&lt;/strong&gt; 항목을 제외한 나머지 항목들은 자연스럽게 구현이 되거나 조금만 신경을 쓴다면 어렵지 않게 구현할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;34f39dbe-a09c-4311-afff-7d87c6fae4a7&quot; class=&quot;&quot;&gt;왜 &lt;strong&gt;Unitform-Interface&lt;/strong&gt; 항목은 제외가 됬을까요? &lt;strong&gt;Unitform-Interface&lt;/strong&gt;를 제공하기 위해 수행해야할 특징 중 &lt;strong&gt;self-descriptive&lt;/strong&gt;과 &lt;strong&gt;HATEOS&lt;/strong&gt;는 &lt;strong&gt;HTTP&lt;/strong&gt; 시스템에서 자연스럽게 처리 되지 않기 때문입니다.&lt;/p&gt;&lt;p id=&quot;d655c8da-ec25-4fdd-a525-3b8cb1f90ee2&quot; class=&quot;&quot;&gt;사실 &lt;strong&gt;self-descriptive&lt;/strong&gt;과 &lt;strong&gt;HATEOS&lt;/strong&gt; 속성은 데이터가 독립적으로 자생하기 위해 필요한 요소들이라 볼 수 있습니다. 그렇다보니 &lt;strong&gt;HTTP&lt;/strong&gt; 서버 스펙을 구현할 때 데이터 독립적인 요소들까지 챙기지 않는 경우도 많습니다. 하지만 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt;의 철학을 따르므로 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템이라 부르고 있습니다.&lt;/p&gt;&lt;p id=&quot;f27457da-0ab8-4c11-bbe1-1babf261b6aa&quot; class=&quot;&quot;&gt;&lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt;의 구성요소를 완벽하게 지키지 않은 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템을 구분하기 위해서인지 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt;의 구성요소 (특히 &lt;strong&gt;Unitform-Interface&lt;/strong&gt;)를 완벽하게 지킨 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템을 &lt;code&gt;&lt;strong&gt;REST-FUL&lt;/strong&gt;&lt;/code&gt; 시스템이라 부르고 있습니다.&lt;/p&gt;&lt;blockquote id=&quot;c6cd95a8-e509-4608-b2aa-ba4232208030&quot; class=&quot;&quot;&gt;로이 필딩은 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템의 규칙을 하나라도 제공하지 않는다면 &lt;strong&gt;&lt;code&gt;REST&lt;/code&gt;&lt;/strong&gt; 시스템이 아니라고 주장합니다.&lt;/blockquote&gt;&lt;p id=&quot;a9a8a9d6-f19c-4985-9b8a-84ce15cad991&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;815335e2-a229-49a2-bfa9-3e24febbfa96&quot; class=&quot;&quot;&gt;정리하자면 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt; 시스템으로 소개 되고 있는 시스템은  &lt;strong&gt;Unitfor-Interface&lt;/strong&gt;의 &lt;strong&gt;self-descriptive&lt;/strong&gt; 와 &lt;strong&gt;HATEOS&lt;/strong&gt;가 지켜지지 않는 경우도 많으며, 나머지 항목까지도 완벽히 구현한 시스템을 &lt;code&gt;&lt;strong&gt;REST-FUL&lt;/strong&gt;&lt;/code&gt; 하다고 표현 합니다.&lt;/p&gt;&lt;p id=&quot;8800ba5e-c6db-4b5d-b0fe-b3d0712aeb33&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;d25ea1ee-e864-4ce1-b71e-8e3b7428812f&quot;&gt;&lt;h1 id=&quot;8cfeb93e-0210-4bc3-9721-7566e85f4012&quot; class=&quot;&quot;&gt;REST-API&lt;/h1&gt;&lt;p id=&quot;c19cbefa-380e-4a90-8c14-05a1fd39ab73&quot; class=&quot;&quot;&gt;&lt;strong&gt;API&lt;/strong&gt;는 컴퓨터의 &lt;strong&gt;&lt;code&gt;자원 제어&lt;/code&gt;&lt;/strong&gt; 방법의 집합입니다.&lt;/p&gt;&lt;p id=&quot;7fff3c34-7ba2-4dee-b2d5-87b1f785f491&quot; class=&quot;&quot;&gt;그렇다면 &lt;code&gt;&lt;strong&gt;REST-API&lt;/strong&gt;&lt;/code&gt;는 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; &lt;/strong&gt;시스템의 자원 제어 방법의 집합으로 정의할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;9a93af76-a2af-4fac-91a7-798e58a80a79&quot; class=&quot;&quot;&gt;한단계 더나아가 &lt;code&gt;&lt;strong&gt;REST-FUL API&lt;/strong&gt;&lt;/code&gt;는 &lt;code&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/code&gt;의 구성요소를 완벽히 따른 시스템의 자원 제어 방법의 집합이라 정의 할 수 있겠습니다.&lt;/p&gt;&lt;p id=&quot;bfe6891d-015a-4cc3-a0e3-750091da5ee3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;b50a07d5-8265-43a0-b6c0-9214a7d51b5b&quot;&gt;&lt;p id=&quot;050d7488-10b0-4a51-93e7-6271a49687b4&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;8e5f245a-85e6-4a98-9f35-b5342419e9df&quot; class=&quot;&quot;&gt;오늘 포스팅은 여기까지 입니다.&lt;/p&gt;&lt;p id=&quot;e0cdaf52-395a-43bd-a6fa-5a9e5ce68696&quot; class=&quot;&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;p id=&quot;dfda2117-c5bf-4474-9bf1-faabc21553c4&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7fbe31af-9d82-46f2-a203-7ddde981df52&quot; class=&quot;&quot;&gt;참고문헌&lt;/p&gt;&lt;p id=&quot;c7653820-ac6c-4242-bad6-cac5a3a54835&quot; class=&quot;&quot;&gt;&lt;a href=&quot;https://restfulapi.net/&quot;&gt;https://restfulapi.net/&lt;/a&gt;&lt;/p&gt;&lt;p id=&quot;640f0bf0-10e3-42b7-9b8b-6123ff6c3dc9&quot; class=&quot;&quot;&gt;&lt;a href=&quot;https://slides.com/eungjun/rest&quot;&gt;그런 REST-API로 괜찮은가?&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;block-color-gray&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>네트워크</category>
      <category>HATEOS</category>
      <category>HTTP</category>
      <category>REST</category>
      <category>REST-API</category>
      <category>REST-FULL</category>
      <category>SELF-DESCRIPTIVE</category>
      <category>자원</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/110</guid>
      <comments>https://mommoo.tistory.com/110#entry110comment</comments>
      <pubDate>Sun, 8 Aug 2021 05:14:48 +0900</pubDate>
    </item>
    <item>
      <title>[데이터베이스] 인덱스(INDEX)</title>
      <link>https://mommoo.tistory.com/109</link>
      <description>&lt;article id=&quot;7341b5d5-839f-4265-9c27-8fbc95c3a2af&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;e449b84a-4b8a-4630-b19b-4879569d7a3c&quot; class=&quot;&quot;&gt;안녕하세요.&lt;/p&gt;&lt;p id=&quot;cab47c04-3276-4ce9-ac7f-9548f837553b&quot; class=&quot;&quot;&gt;오늘은 데이터베이스 인덱스 개념에 대해 설명합니다.&lt;/p&gt;&lt;p id=&quot;fbb5b367-d872-440b-adef-4d78c1b5485b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h1 id=&quot;9866046c-7a16-4734-ac8d-8c98b076df61&quot; class=&quot;&quot;&gt;인덱스란&lt;/h1&gt;&lt;p id=&quot;07755a4b-7261-4a97-b477-c4daa2ba11a6&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;85cb1d15-2d1d-4bbf-acb2-8df2521a1d47&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스(INDEX)&lt;/strong&gt;&lt;/code&gt;는 &lt;strong&gt;DBMS&lt;/strong&gt;의 검색 속도를 높이기 위한 기술 입니다. &lt;/p&gt;&lt;p id=&quot;454f010c-56e7-42b0-99d6-03e7afe09e33&quot; class=&quot;&quot;&gt;&lt;strong&gt;DBMS&lt;/strong&gt;는 데이터를 순차적으로 쌓으므로, 특정 데이터를 찾기 위해서는 데이터의 &lt;strong&gt;FULL-SCAN&lt;/strong&gt;인 순차 탐색(&lt;strong&gt;O(N)&lt;/strong&gt;)이 필요합니다.&lt;/p&gt;&lt;p id=&quot;f8533e69-d3ec-439c-a572-43d03c438eb5&quot; class=&quot;&quot;&gt;&lt;strong&gt;DBMS&lt;/strong&gt;는 특정 데이터를 특별한 자료 구조로 쌓아 탐색 속도를 개선할 수 있는 기능을 제공합니다. 해당 기능을 &lt;strong&gt;&lt;code&gt;인덱스&lt;/code&gt;&lt;/strong&gt;라 부르고 쌓은 데이터들을 &lt;strong&gt;&lt;code&gt;인덱스 테이블&lt;/code&gt;&lt;/strong&gt;이라 부릅니다.&lt;/p&gt;&lt;p id=&quot;a968da43-8a0d-421f-be0c-4392a280ea8a&quot; class=&quot;&quot;&gt;인덱스는 책의 목차와 비유할 수 있습니다. 우리가 책의 목차를 참고하여 필요한 내용으로 곧 바로 넘어가드시, &lt;strong&gt;DBMS&lt;/strong&gt;도 &lt;strong&gt;&lt;code&gt;인덱스 테이블&lt;/code&gt;&lt;/strong&gt;에서 특정 &lt;strong&gt;&lt;code&gt;인덱스&lt;/code&gt;&lt;/strong&gt;를 찾아 필요한 행 데이터를 바로 가져옵니다.&lt;/p&gt;&lt;p id=&quot;128b1c9c-5633-4c86-8f83-9c150c5edbb1&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;82604c8c-3dba-4c7b-a6c0-17c2adae3dba&quot;&gt;&lt;h1 id=&quot;67aab56e-c291-48a7-aa20-5b564bcf3ba4&quot; class=&quot;&quot;&gt;인덱스 테이블&lt;/h1&gt;&lt;p id=&quot;4d5e0fe9-39a1-4378-9503-bab3873a399a&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;86188165-f8d7-44b4-b18b-0e6af5a65005&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;은 데이터를 조회할 때 사용되는 특정 컬럼의 데이터로 구성됩니다. &lt;/p&gt;&lt;p id=&quot;e598d9b4-5b49-451a-888d-783dae80d4b5&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt; 에 포함된 데이터를 &lt;strong&gt;WHERE&lt;/strong&gt; 문으로 조회를 하면 &lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;을 통해 &lt;strong&gt;ROW-ID&lt;/strong&gt;를 빠르게 구한 뒤 단번에 행 데이터를 조회 할 수 있습니다.&lt;/p&gt;&lt;h3 id=&quot;12dfd07f-61bc-4ff4-89a2-f866219e2742&quot; class=&quot;&quot;&gt;인덱스 테이블 탐색&lt;/h3&gt;&lt;p id=&quot;a9768824-d0fe-49c3-8ebe-2d0a62766a6e&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;의 핵심은 빠른 조회 성능입니다. 이를 위해 &lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;은 탐색 트리 자료구조 중 하나인 &lt;strong&gt;B+트리&lt;/strong&gt; 자료구조로 데이터를 저장합니다. 탐색 트리는 &lt;strong&gt;O(&lt;/strong&gt;&lt;strong&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;log_2N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8888799999999999em;vertical-align:-0.19444em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;)&lt;/strong&gt; 성능의 빠른 조회를 할 수 있는 특징이 있습니다.&lt;/p&gt;&lt;p id=&quot;6c41c35e-e8c6-40a5-974c-3c3faf34feaf&quot; class=&quot;&quot;&gt;그렇기에, 데이터 &lt;strong&gt;FULL-SCAN&lt;/strong&gt;[&lt;strong&gt;O(N)&lt;/strong&gt;]성능에 비해, &lt;strong&gt;&lt;em&gt;압도적인 빠른 조회를 할 수 있는 장점&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; &lt;/em&gt;이 있습니다.&lt;/p&gt;&lt;blockquote id=&quot;ed8a92ba-6871-4dcc-8291-f9415aedb8ac&quot; class=&quot;&quot;&gt;&lt;a href=&quot;https://mommoo.tistory.com/108&quot;&gt;B+트리&lt;/a&gt; 포스팅을 참고해주세요.&lt;/blockquote&gt;&lt;h3 id=&quot;a5e03652-dafb-4fca-8b06-5d4156d32f7c&quot; class=&quot;&quot;&gt;인덱스 테이블 생성&lt;/h3&gt;&lt;p id=&quot;528c280f-f436-413e-b129-063b0529402b&quot; class=&quot;&quot;&gt;&lt;strong&gt;TABLE&lt;/strong&gt;을 생성 할 때, &lt;strong&gt;PRIMARY_KEY&lt;/strong&gt;를 지정한 컬럼은 자동적으로 &lt;strong&gt;PRIMARY_KEY&lt;/strong&gt;를 기준으로 &lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;이 생성됩니다. &lt;/p&gt;&lt;p id=&quot;80f1f2ab-8d43-41c2-b3cf-5239abccaa17&quot; class=&quot;&quot;&gt;만약 다른 컬럼을 &lt;strong&gt;&lt;code&gt;인덱스 테이블&lt;/code&gt;&lt;/strong&gt;을 생성하고 싶다면, 직접 생성해야 합니다.&lt;/p&gt;&lt;p id=&quot;75edb26e-6eac-4161-b6b7-5460402af06c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;51771aa4-e56d-44d3-aac7-3ab540ed19db&quot;&gt;&lt;h1 id=&quot;e639e1fa-7c18-445a-9582-65dfe70de9fb&quot; class=&quot;&quot;&gt;인덱스 장점&lt;/h1&gt;&lt;p id=&quot;9ccfc773-2c84-48a3-b2c1-099e45e39848&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;의 장점은 곧 &lt;strong&gt;B+트리&lt;/strong&gt; 자료구조의 장점과 일맥상통 합니다.&lt;/p&gt;&lt;h3 id=&quot;c00f1f89-ecd8-4ecb-b38c-900b3cf799cf&quot; class=&quot;&quot;&gt;빠른 조회&lt;/h3&gt;&lt;p id=&quot;74799987-4712-4341-8f4a-2edab21bf6bb&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;은 메모리에 저장되어 있는 &lt;strong&gt;B+트리&lt;/strong&gt; 자료구조 입니다. &lt;/p&gt;&lt;p id=&quot;40c449aa-dc8a-473b-9292-62f9dda4ab1f&quot; class=&quot;&quot;&gt;메모리는 한정적인 자원이기 때문에 &lt;strong&gt;DBMS&lt;/strong&gt;는 &lt;strong&gt;&lt;code&gt;인덱스&lt;/code&gt;&lt;/strong&gt;로 지정한 컬럼 데이터와 &lt;strong&gt;ROW-ID&lt;/strong&gt;로 구성된 최소한의 노드로 &lt;strong&gt;B+트리&lt;/strong&gt;를 구성합니다.&lt;/p&gt;&lt;blockquote id=&quot;e5e96eb2-796a-4e37-a8fe-82cbc1229663&quot; class=&quot;&quot;&gt;&lt;strong&gt;ROW-ID&lt;/strong&gt;는 파일에 저장되어 있는 행 데이터를 가져올 수 있는 정보입니다.&lt;/blockquote&gt;&lt;p id=&quot;9d84b386-75ee-4c31-bb64-6398e073434f&quot; class=&quot;&quot;&gt;여기에서 알 수 있는 재미있는 특징이 하나 있습니다. 데이터 &lt;strong&gt;FULL-SCAN&lt;/strong&gt;이 느린이유는 순차탐색인 이유도 있지만, 빈번한 &lt;strong&gt;파일IO&lt;/strong&gt;도 많은 영향을 미칩니다. &lt;/p&gt;&lt;p id=&quot;5d4537e6-2efa-41a9-a949-0fa328c6a3c1&quot; class=&quot;&quot;&gt;반면에 빠른 메모리 조회로 행 아이디를 찾는 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt; 방식은 최소한의 &lt;strong&gt;파일IO&lt;/strong&gt;를 사용합니다. 최소한의 &lt;strong&gt;파일IO&lt;/strong&gt;는  더욱 빠른 탐색 속도를 가능하게 합니다.&lt;/p&gt;&lt;p id=&quot;07ed5ab4-d902-46c7-b7b3-5c5c8f2c5033&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;626c9a46-9bc1-43ac-8a9f-e6a76fd50603&quot; class=&quot;&quot;&gt;데이터 정렬&lt;/h3&gt;&lt;p id=&quot;57c29c89-e04e-4bd5-bd8d-01b7b54221b8&quot; class=&quot;&quot;&gt;만약 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;된 컬럼으로 정렬 명령을 내린다면 정렬 비용을 아낄 수 있습니다.&lt;/p&gt;&lt;p id=&quot;128e9bb9-52eb-4f06-a16b-56dbb8973900&quot; class=&quot;&quot;&gt;&lt;strong&gt;B+트리&lt;/strong&gt; 구조상 조회된 데이터를 가져오기만 해도 정렬된 데이터를 획득할 수 있기 때문입니다.&lt;/p&gt;&lt;p id=&quot;8c2d3811-c807-4a15-ae2c-5abd07c00d56&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;c6373da9-7272-4be9-843a-a5111f2354ed&quot;&gt;&lt;h1 id=&quot;e3daa76a-864b-4948-8ac2-a5a45cef37ee&quot; class=&quot;&quot;&gt;인덱스 단점&lt;/h1&gt;&lt;p id=&quot;90abe476-df65-4e90-82cf-8188f915363f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7aea9163-b237-4a8c-ab8a-23f8e1fb794b&quot; class=&quot;&quot;&gt;지금까지의 설명만 보자면 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt; 기능은 매우 훌륭한 기능 같습니다만, 그에 못지 않은 단점도 존재합니다. 대표적으로 아래와 같은 단점이 존재합니다.&lt;/p&gt;&lt;ul id=&quot;e37038eb-224f-4cb0-9150-061b62f0a433&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt; 유지 비용 (&lt;strong&gt;B+트리&lt;/strong&gt; 유지비용)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;d78310a4-d297-4e1a-bb68-91fa510cd7f6&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; &lt;/strong&gt;추가 공간 비용&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;ee3e794a-91b9-4f5f-a81d-35aa0ffc5195&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;36cd4a2b-6f55-4473-9cc8-c6b7c328b03b&quot; class=&quot;&quot;&gt;인덱스 테이블 유지 비용&lt;/h3&gt;&lt;p id=&quot;b4449f5d-f95b-4419-9566-9063f5b60765&quot; class=&quot;&quot;&gt;&lt;strong&gt;B+트리&lt;/strong&gt;의 중요한 특징 중 하나는 &lt;strong&gt;균형 이진 트리&lt;/strong&gt;를 구성한다는 점 입니다. 노드의 삭제, 삽입시 트리 균형을 위해 트리 구조를 재구성 하는 비용이 발생합니다. 더군다나 탐색 이진 트리의 업데이트는 삭제 + 삽입 과정이 발생하므로 2배의 비용이 발생하게 됩니다.&lt;/p&gt;&lt;p id=&quot;1be45303-21ed-4784-bff5-2a154548fdd8&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;253bc8de-6086-4e6e-85d5-cce115d4183f&quot; class=&quot;&quot;&gt;위에서 살펴본 B+트리의 특징이 인덱스 테이블에도 똑같이 적용됩니다. &lt;/p&gt;&lt;p id=&quot;30be0887-7a9b-48ef-8215-0ac0cbf35dad&quot; class=&quot;&quot;&gt;즉, &lt;strong&gt;O(&lt;/strong&gt;&lt;strong&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;log_2N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8888799999999999em;vertical-align:-0.19444em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;)&lt;/strong&gt;으로 빠르게 조회가 가능하지만 삽입, 삭제, 업데이트 작업은 &lt;strong&gt;&lt;em&gt;노드의 위치 탐색 비용&lt;/em&gt;&lt;/strong&gt; + &lt;strong&gt;&lt;em&gt;트리 재구성 비용&lt;/em&gt;&lt;/strong&gt; 이 발생하게 됩니다.&lt;/p&gt;&lt;p id=&quot;3181d0c0-0b66-43db-86f2-b1e49119c968&quot; class=&quot;&quot;&gt;&lt;strong&gt;DBMS&lt;/strong&gt;는 트리 재구성 비용이라도 아끼기 위해 노드 삭제를 진행하지 않습니다. 대신 해당 노드에 사용하지 않는다는 마킹만 진행합니다. 그로인해 &lt;strong&gt;DBMS&lt;/strong&gt;의 삭제, 업데이트 명령은 노드의 위치 탐색 비용만 발생하게 됩니다.&lt;/p&gt;&lt;p id=&quot;aa06a21d-b34c-4459-958a-dae5838ca6da&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;649b479e-bf96-4082-a186-180b0c9fe9cd&quot; class=&quot;&quot;&gt;인덱스 테이블 추가 공간 비용&lt;/h3&gt;&lt;p id=&quot;008dc86f-1a11-4828-b509-da7c0ec69f19&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;의 노드 삭제를 하지 않음으로써, 트리 재구성 비용을 아낀 전략은 유효해 보입니다. 하지만 이 역시도 다른 문제가 존재합니다.&lt;/p&gt;&lt;p id=&quot;36d4a0c5-e346-4235-9e72-2963f755905f&quot; class=&quot;&quot;&gt;그 문제는 바로, &lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;이 거대해짐에 따라, 트리의 높이가 깊어지는 문제 입니다.&lt;/p&gt;&lt;p id=&quot;3767ab09-43f5-47c8-846c-da4ff3e12627&quot; class=&quot;&quot;&gt;이는 테이블의 행 개수 보다 많은 개수의 저장공간을 필요로 합니다.&lt;/p&gt;&lt;p id=&quot;9e7ae610-1018-4932-aac3-740a99f24153&quot; class=&quot;&quot;&gt;하지만 더욱 결정적인 문제는 트리 높이에 따른 성능으로 인해 &lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt; 의 깊은 높이는 &lt;strong&gt;DBMS&lt;/strong&gt; 성능을 점진적으로 내린다는 점 입니다.&lt;/p&gt;&lt;p id=&quot;64f12f6d-d13a-4a74-8ff0-161b4625fca9&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;0fb666f4-5404-4ed5-9c14-0c37c40b4a46&quot; class=&quot;&quot;&gt;결론적으로, 미 사용 노드를 트리에서 제거함으로써 높이 최적화가 필요함 을 알 수 있습니다. &lt;strong&gt;DBMS&lt;/strong&gt;는 트리 높이 최적화를 수행하는 명령을 제공합니다. 해당 명령을 주기적으로 수행함으로써 전체적인 &lt;strong&gt;DBMS&lt;/strong&gt; 성능을 높일 수 있습니다. &lt;/p&gt;&lt;p id=&quot;a6768320-1837-4e73-90b3-77d72df00ddf&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;675ed55b-1489-4007-b9f4-998c36b096bc&quot;&gt;&lt;h1 id=&quot;dc6be9da-1d09-4df0-ba60-a899903b247e&quot; class=&quot;&quot;&gt;인덱스 생성 전략&lt;/h1&gt;&lt;p id=&quot;3c5953f4-4736-456b-9916-21ee3cbcc867&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;e261e188-97e9-4e4a-95f0-f6847477e733&quot; class=&quot;&quot;&gt;위에서 살펴본 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;의 단점을 통해, 다음과 같은 결론을 도출 할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;59480439-e5c2-4306-8154-b20567b39054&quot; class=&quot;&quot;&gt;&lt;em&gt;&lt;strong&gt;조회보다 삽입, 삭제, 업데이트가 더 많이 발생하는 테이블은 인덱스 기능이 오히려 단점이 될 수 있습니다.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p id=&quot;380387c1-4783-4b90-a1af-1d70a2796032&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7c7ce2a0-17db-4ff8-8efe-c46428cb7438&quot; class=&quot;&quot;&gt;또한 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;를 설정할 때는 유의할점이 몇개 존재합니다.&lt;/p&gt;&lt;h3 id=&quot;4d026b1b-6c9e-47f0-a3cb-339282d02894&quot; class=&quot;&quot;&gt;Cardinality 체크&lt;/h3&gt;&lt;p id=&quot;ed75b663-e4f5-492a-8023-e786ca284b58&quot; class=&quot;&quot;&gt;&lt;strong&gt;&lt;code&gt;인덱스&lt;/code&gt;&lt;/strong&gt;를 구성할 땐, 컬럼의 &lt;code&gt;&lt;strong&gt;Cardinality&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; &lt;/strong&gt;를 고려하여 생성해야 합니다.&lt;/p&gt;&lt;p id=&quot;7a53a20b-3acc-48fd-b43a-f735e54b0823&quot; class=&quot;&quot;&gt;&lt;code&gt;&lt;strong&gt;Cardinality&lt;/strong&gt;&lt;/code&gt; 란 값의 분산도를 의미합니다. 다르게 표현하자면 값이 형태가 얼마나 다양하게 나올 수 있느냐의 척도입니다. 만약 (&lt;em&gt;Y&lt;/em&gt;, &lt;em&gt;N&lt;/em&gt;) 2가지 값으로만 구성된 컬럼을 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;로 설정하는 것은, 1700 페이지로 구성된 책에 목차가 2개만 존재하는것과 마찬가지 효과 입니다.&lt;/p&gt;&lt;p id=&quot;f8a2fe56-f769-481f-bd8e-02483e8a4edd&quot; class=&quot;&quot;&gt;그렇기에 행 데이터가 최대한 많이 분류될 수 있는 컬럼으로 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;를 생성해야 효과적입니다.&lt;/p&gt;&lt;h3 id=&quot;b0929914-dd2a-4407-a4da-7bb7ae831a4f&quot; class=&quot;&quot;&gt;조회 조건 빈번도 체크&lt;/h3&gt;&lt;p id=&quot;ce846a7a-775a-4c91-8d33-c6fab2760ce8&quot; class=&quot;&quot;&gt;당연한 얘기일 수 있겠지만, 조회 조건으로 자주 사용되는 컬럼일수록 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt; 조건에 부합합니다.&lt;/p&gt;&lt;p id=&quot;589466c9-6ad2-4800-8ffd-ecbaf69f7661&quot; class=&quot;&quot;&gt;아래의 항목은 간단한게 체크해볼 수 있는 리스트 입니다.&lt;/p&gt;&lt;ul id=&quot;4f7c3fb0-1dbe-4d29-8048-ca7482f340a3&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;조건절에 자주 등장하는 컬럼&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;13fad616-983a-4d26-a5e3-faff82470a6e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;LIKE&lt;/strong&gt; 검색보다는 &lt;strong&gt;=&lt;/strong&gt; 으로 검색하는 컬럼&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;5b1df049-8bee-416e-b68f-54d6b7646541&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;ORDER BY&lt;/strong&gt; 절에서 자주 사용되는 컬럼&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;20b0d8ec-6a91-4669-ba0c-097e263f36c5&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;JOIN&lt;/strong&gt;으로 자주 사용되는 컬럼&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;fe327ecf-4394-420e-9c8c-792b52e0276c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;1abd1261-a5f3-4407-80c1-649ce0aa12fc&quot;&gt;&lt;p id=&quot;d357de10-59fc-4fd7-a159-e8803633d0da&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;b672252d-4e0d-49a3-b83f-3ac34672ada1&quot; class=&quot;&quot;&gt;지금까지 살펴본 내용을 요약하자면 다음과 같습니다.&lt;/p&gt;&lt;ul id=&quot;1b61f042-5e94-4812-92b1-7b2e47caa2a6&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;는 &lt;strong&gt;B+트리&lt;/strong&gt; 구조를 통해 조회 성능을 올리는 기능입니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;6de72803-73b7-4da0-b235-6285b2c00f86&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 &lt;strong&gt;FULL-SCAN&lt;/strong&gt;은 빈번한 &lt;strong&gt;파일IO&lt;/strong&gt; 작업을 통한 순차탐색으로 매우 느린 반면에 &lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;는 메모리에 저장된 트리 탐색을 통해 파일의 위치를 획득하여 &lt;strong&gt;파일IO&lt;/strong&gt; 작업을 최소화 합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;652da501-db56-4384-bbd8-869baf80bf07&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;는 조회 성능을 높이고 삽입, 삭제, 업데이트 성능을 낮추는 트레이드 오프 기능 이므로 조회가 주된 목적인 테이블일 수록 유리합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;d1cabd66-02ab-4795-af24-087101145dff&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;는 조회가 주된 목적인 테이블일 수록 유리합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a7d1001d-dbe7-4578-9583-e0ff58d03818&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스 테이블&lt;/strong&gt;&lt;/code&gt;의 높이는 점점 깊어지므로, 주기적인 정리가 필요합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;0900602a-e8f1-4fb8-89a0-3568ca0cc628&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;&lt;strong&gt;인덱스&lt;/strong&gt;&lt;/code&gt;를 생성할 때는 &lt;strong&gt;Cardinality&lt;/strong&gt;와 &lt;strong&gt;조회 조건 빈번도 체크&lt;/strong&gt;가 필요합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;e5b14f64-ae80-4823-9994-f09462249beb&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;8e62d23b-f62c-4ebd-acc8-6d876ccf6e52&quot; class=&quot;&quot;&gt;오늘 포스팅은 여기까지 입니다.&lt;/p&gt;&lt;p id=&quot;0236421d-42fa-4ee5-aba9-c32c3c16e306&quot; class=&quot;&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;block-color-gray&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>데이터베이스</category>
      <category>B+TREE</category>
      <category>B+트리</category>
      <category>db</category>
      <category>index</category>
      <category>Index Table</category>
      <category>데이터베이스</category>
      <category>인덱스</category>
      <category>인덱스 테이블</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/109</guid>
      <comments>https://mommoo.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 31 Jul 2021 23:48:06 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] B 트리</title>
      <link>https://mommoo.tistory.com/108</link>
      <description>&lt;article id=&quot;e01ab228-c99d-4fed-8cbe-84569dd49206&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;cf5b37f6-f907-43d4-972a-ed17d6448670&quot; class=&quot;&quot;&gt;안녕하세요.&lt;/p&gt;&lt;p id=&quot;1814975f-5e2d-47aa-9589-13a3e1a1e819&quot; class=&quot;&quot;&gt;오늘은 &lt;code&gt;B 트리&lt;/code&gt; 에 대해 포스팅 합니다.&lt;/p&gt;&lt;p id=&quot;41a46617-37db-4e7f-aa00-795a59fe7527&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt; 는 &lt;strong&gt;이진 탐색 트리&lt;/strong&gt;의 일종으로 탐색 성능을 높이기 위해 균형있게 높이를 유지하는 &lt;strong&gt;균형 트리&lt;/strong&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;e1a13fc7-a342-4feb-b884-887c11cad3d4&quot; class=&quot;&quot;&gt;균형 이진 탐색 트리는 대표적으로 RedBlackTree, AVL 트리 같은것이 있습니다. 두 트리가 독특한 규칙으로 높이를 유지 하는것처럼 &lt;code&gt;B 트리&lt;/code&gt;도 자신만의 규칙이 존재합니다.&lt;/p&gt;&lt;p id=&quot;f09d0f15-b8c5-4d8e-864c-8755c2eb6e7e&quot; class=&quot;&quot;&gt;특이한점은, &lt;code&gt;이진 트리&lt;/code&gt;가 아니라는 점 입니다. 규칙에 따라 노드의 자식 노드 개수는 2개 이상이 될 수 도 있습니다. &lt;/p&gt;&lt;h1 id=&quot;ac76aa9a-dc0a-4c44-8c62-dd65d2cac8b3&quot; class=&quot;&quot;&gt;B 트리 장점&lt;/h1&gt;&lt;p id=&quot;2b3ecc70-0f0e-46ee-8a9d-4925dac90f39&quot; class=&quot;&quot;&gt;B 트리의 장점은 크게 3가지가 존재합니다.&lt;/p&gt;&lt;ul id=&quot;de380a67-c5e0-4802-a2d4-5ebb0d53a5a1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;균형 트리&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;f7a3bfdc-2e70-4db0-8e3d-51bbb066278a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;데이터 로드 효율성&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;ead793ea-afac-4798-9225-8ab0c0951eb4&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;1fb31cf8-f1fd-49ce-b20e-067019be7037&quot; class=&quot;&quot;&gt;&lt;strong&gt;균형 트리&lt;/strong&gt;의 장점은 &lt;a href=&quot;https://mommoo.tistory.com/101&quot;&gt;이진 탐색 트리&lt;/a&gt; 에서도 살펴봤다시피, 노드들이 한쪽으로 치우쳐 &lt;strong&gt;연결 리스트&lt;/strong&gt;의 형태가 되는것을 방지하여 검색 효율을 높일 수 있다는 장점이 있습니다.&lt;/p&gt;&lt;p id=&quot;500ebd2d-777e-4929-9854-63382afc1c7f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3e055757-4c0d-4a70-b18d-95627df0f3c8&quot; class=&quot;&quot;&gt;&lt;strong&gt;데이터 로드 효율성&lt;/strong&gt; 측면은 대량의 데이터로 &lt;strong&gt;트리&lt;/strong&gt;를 구성할 때, 진가를 발휘합니다. &lt;/p&gt;&lt;p id=&quot;31d15f7f-4ed9-44f4-84bf-f0b4ecb676eb&quot; class=&quot;&quot;&gt;데이터가 많은경우 메모리에 트리 구조를 유지하기 보다는 외부장치에 데이터를 저장해야 합니다. 각 노드의 값을 파일로 저장한 후, 파일 정보만 저장하고 있다면 메모리에서도 충분히 &lt;strong&gt;트리&lt;/strong&gt;를 유지할 수 있게 됩니다. &lt;/p&gt;&lt;p id=&quot;da60a316-b90f-4a68-a3b9-6fd110a54f16&quot; class=&quot;&quot;&gt;외부장치에서 데이터를 읽어올때 데이터가 크던 작던 블럭 크기 만큼 읽어옵니다. 즉 노드의 데이터를 특정 블럭 크기 만큼 지정하여 저장 할 수 있다면 &lt;strong&gt;효율적으로 데이터를 읽어올 수 있다는 장점이 생깁니다.&lt;/strong&gt;&lt;/p&gt;&lt;p id=&quot;b9777c6f-97bd-4cdc-82de-c5bd12a26e63&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;6114fded-ccdf-46f2-bdc2-fb62417b8bc3&quot;&gt;&lt;h1 id=&quot;b544d670-fb35-4beb-ba75-135ac234753a&quot; class=&quot;&quot;&gt;B 트리 구성 방법&lt;/h1&gt;&lt;p id=&quot;666c44a9-586a-43a1-bdb8-68c7c046faa1&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt; 만의 독특한 구성 규칙이 존재합니다. 이해를 위해서 모든 규칙은 맨 마지막에 정리하고, 중요한 조건순으로 차근차근 알아가봅시다.&lt;/p&gt;&lt;h3 id=&quot;48066fc1-b074-4299-98e8-fc41c83c5166&quot; class=&quot;&quot;&gt;N차 B 트리&lt;/h3&gt;&lt;p id=&quot;a7b7b8fe-5dd1-4a5d-b090-c45af74ddd7e&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt;를 구성할 때, 가장 중요한 조건은 노드가 최대 몇개의 데이터를 가질 수 있느냐 입니다.&lt;/p&gt;&lt;p id=&quot;92c9dd4f-9850-4c12-b7ba-aa57f2da3bc5&quot; class=&quot;&quot;&gt;만약 최대 3개의 자료를 가질 수 있다고 정의하면, 노드 자식 개수는 최대 4개를 가질 수 있습니다. 이때 최대 자식 개수를 사용하여 &lt;code&gt;4차 B 트리&lt;/code&gt; 라고 표현 합니다.&lt;/p&gt;&lt;p id=&quot;79d005bf-42c1-4359-ac42-19ade4d1a279&quot; class=&quot;&quot;&gt;즉 일반화 해본다면, 하나의 노드가 최대 M개의 자료를 가질 수 있다면 최대 자식 노드 개수는 M+1이 되므로 &lt;code&gt;M+1차 B 트리&lt;/code&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;ec582ee6-a129-4cda-9836-e846f897a844&quot; class=&quot;&quot;&gt;왜 최대 자식 노드 개수가 M+1 이냐구요? 아래 &lt;strong&gt;B 트리 삽입&lt;/strong&gt; 에서 살펴봅시다!&lt;/p&gt;&lt;p id=&quot;697b2423-ace0-4ade-aeea-8f28209a9e34&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;5039d17a-f7b3-481a-8920-883c775378e7&quot; class=&quot;&quot;&gt;&lt;em&gt;N차 B 트리는 노드의 최대 자료수는 N-1 이며, 최대 N개의 자식노드를 가질 수 있습니다.&lt;/em&gt;&lt;/p&gt;&lt;p id=&quot;b7c8791e-776f-4420-b5aa-dd5f36d8d0f3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;a0fcef2e-e034-401e-8978-214e8754b961&quot;&gt;&lt;h1 id=&quot;306f7275-f498-4a7c-b079-c633c7b35a3a&quot; class=&quot;&quot;&gt;B 트리 탐색&lt;/h1&gt;&lt;p id=&quot;f70fb201-8c00-482c-99a5-ed23aea97bc6&quot; class=&quot;&quot;&gt;&lt;strong&gt;B 트리&lt;/strong&gt; 탐색은 탐색 노드와 특징을 이용합니다.&lt;/p&gt;&lt;p id=&quot;e11568e6-a5a8-4e4a-b665-dbb60b750d6b&quot; class=&quot;&quot;&gt;특정 노드의 범위 위치를 찾은 후 아래의 자식 노드로 이동합니다.&lt;/p&gt;&lt;p id=&quot;4f28541e-836c-4c65-a06c-2a23255560f3&quot; class=&quot;&quot;&gt;아래의 과정은 &lt;strong&gt;0016&lt;/strong&gt; 값을 찾는 과정입니다.&lt;/p&gt;&lt;figure id=&quot;909f185a-7cd8-47c6-8f30-34f22f178d8b&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btnw9H/btraDArvzin/ZWKKtAYHfjh7MEdaczF0Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btnw9H/btraDArvzin/ZWKKtAYHfjh7MEdaczF0Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btnw9H/btraDArvzin/ZWKKtAYHfjh7MEdaczF0Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtnw9H%2FbtraDArvzin%2FZWKKtAYHfjh7MEdaczF0Dk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ul id=&quot;c5c3195d-125d-43d4-a63d-27c0a60f4026&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;루트 노드에서 &lt;strong&gt;0016&lt;/strong&gt; 값의 범위 위치를 찾습니다. (0015 &amp;lt; &lt;strong&gt;0016&lt;/strong&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;91e139cf-1019-4611-b94e-7843f4a27642&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;다음 노드에 &lt;strong&gt;0016&lt;/strong&gt; 값이 존재하는지 찾아봅니다. 존재하지 않으므로 &lt;strong&gt;0016&lt;/strong&gt; 값의 범위 위치를 찾습니다. (&lt;strong&gt;0016&lt;/strong&gt; &amp;lt; 0017)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;abaf8623-fb10-4e76-9c9b-6572d0cd3e69&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;다음 노드는 리프노드 이므로 해당 노드에 값이 존재하지 않는다면 &lt;strong&gt;트리&lt;/strong&gt;에 값이 존재하지 않음을 알 수 있습니다. &lt;strong&gt;0016&lt;/strong&gt; 값이 있으므로 탐색을 종료합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;18080d5b-43b7-4a0c-945d-f30bd3023d7e&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;e7b00e0b-78eb-4bfb-97fa-fb704615bd80&quot;&gt;&lt;h1 id=&quot;163f37da-d4c8-46a6-9e8a-c44986565ff5&quot; class=&quot;&quot;&gt;B 트리 삽입&lt;/h1&gt;&lt;p id=&quot;90856e05-6f2f-4c68-b366-b4a3024f983e&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt;의 차수를 정할 때 홀수냐 짝수냐에 따라 알고리즘이 조금 다릅니다. 홀수가 조금 더 계산하기 편하므로 홀수로 설명하겠습니다.&lt;/p&gt;&lt;p id=&quot;9dd7e5b3-92f7-4ffe-81a3-442646b9b010&quot; class=&quot;&quot;&gt;&lt;code&gt;3차 B 트리&lt;/code&gt; 를 예시로 들어봅시다. (노드의 최대 자료 개수는 2개)&lt;/p&gt;&lt;p id=&quot;0d43260c-e8eb-446c-a501-bf1bc34fad57&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;95392669-6046-46d2-b31d-4896a0ff7730&quot; class=&quot;&quot;&gt;삽입의 핵심은 &lt;strong&gt;노드 분열 &lt;/strong&gt;작업 입니다.&lt;/p&gt;&lt;p id=&quot;34f55532-6a8e-4934-99ca-72346447df11&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;c796222e-11c5-48d4-b515-b9c40b6913a3&quot; class=&quot;&quot;&gt;아래의 삽입 과정은 최초 &lt;strong&gt;노드 분열&lt;/strong&gt;이 발생하는 과정입니다.&lt;/p&gt;&lt;figure id=&quot;da7ae28f-9fc4-49ea-83a4-ddf8e7dc3d9b&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%201.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0hWPj/btraJo4ETj2/HpySZ80RybqxYXJvcGCbx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0hWPj/btraJo4ETj2/HpySZ80RybqxYXJvcGCbx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0hWPj/btraJo4ETj2/HpySZ80RybqxYXJvcGCbx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0hWPj%2FbtraJo4ETj2%2FHpySZ80RybqxYXJvcGCbx1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ul id=&quot;cd1438e2-e50b-4a38-8ca0-f9ddb02f16cb&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;01~02 번 삽입 과정은 루트 노드에 빈자리가 존재하여 자리를 찾아 삽입 합니다.&lt;ul id=&quot;ce3804c5-749e-477a-bd7e-a993d09a19d1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 저장 순서는 오름 차순으로 저장합니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;e2d13cdc-8baf-42d3-9644-c4413811b016&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;03번은 &lt;strong&gt;0011&lt;/strong&gt; 을 루트 노드에 넣을 자리가 없는 경우 입니다.&lt;ul id=&quot;d7a9f325-b952-4017-94ab-646af63dbc18&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;이때 &lt;code&gt;B 트리&lt;/code&gt; 핵심 과정 중 하나인 &lt;strong&gt;노드 분열&lt;/strong&gt;이 발생합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;2419d290-ca91-41aa-841d-34439b6e8650&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;03-2. 루트 노드의 값들과 넣을 값을 포함하여 중간 값을 찾습니다. (홀수 차수를 고른것이 이때 편합니다.)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;c735f7b5-3597-4cf5-8da4-05570aef689a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;03-3. 중간 값 &lt;strong&gt;0005&lt;/strong&gt; 값을 부모 노드로 올리고, 왼쪽 값들과 오른쪽 값들을 자식 노드로 각각 구성하여 연결합니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;1cc2aa8e-cebf-4faa-96c5-04d1b0e707f3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;a2547198-d19a-4c81-8892-e38e727f1ec6&quot; class=&quot;&quot;&gt;아래의 과정에서 발생하는 &lt;strong&gt;노드 분열&lt;/strong&gt;도 한번 살펴보시죠.&lt;/p&gt;&lt;p id=&quot;bdb6add0-de89-4b98-8c12-9c8cadca289b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;figure id=&quot;233e8251-24f1-466f-88ba-5fe20c3538e0&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%202.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYThNa/btraMpB1MT1/rbuK4KniZbC2l5ec3DSWA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYThNa/btraMpB1MT1/rbuK4KniZbC2l5ec3DSWA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYThNa/btraMpB1MT1/rbuK4KniZbC2l5ec3DSWA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYThNa%2FbtraMpB1MT1%2FrbuK4KniZbC2l5ec3DSWA1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ul id=&quot;886c0db9-77be-44c1-b595-c8f1648f8a30&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;04번 삽입은 탐색 노드 특징을 이용하여 리프노드 까지 도달합니다.&lt;ul id=&quot;e3ecdaa5-d7b5-4295-87aa-fa66a96cffb6&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리프노드에 자리가 비었으므로, &lt;strong&gt;0017&lt;/strong&gt;값이 그대로 저장됩니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;3d66f256-d3df-4ea5-b217-2f4244330a7e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;05-01. &lt;strong&gt;0022&lt;/strong&gt; 값의 자리를 탐색하여 리프 노드 까지 도달했습니다.&lt;ul id=&quot;46cb1914-692f-4d18-b017-c39018b60412&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;05-01. 하지만, 리프 노드엔 자리가 없습니다. &lt;strong&gt;노드 분열&lt;/strong&gt;과 마찬 가지로 &lt;strong&gt;중간 값&lt;/strong&gt;을 찾습니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;dce1b653-372d-41f0-a138-bccabd29600f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;05-02. &lt;strong&gt;중간 값&lt;/strong&gt;을 부모 노드로 이동시킵니다. (&lt;strong&gt;노드 분열&lt;/strong&gt;이 발생합니다.)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;5aec97be-f375-4096-9e35-2835b33b7a1e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;05-02. 남은 값들은 각각 노드로 구성하여 중간 값 왼쪽, 오른쪽 자식노드로 연결합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;7153d4ed-4685-451c-9b56-8763fa1b09cb&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;407b2218-b739-489e-b7ba-9829f556ecaa&quot; class=&quot;&quot;&gt;위 예시와 같이 리프노드에 공간이 부족할 때, 부모 노드로 중간 값을 옮기는 &lt;strong&gt;노드 분열&lt;/strong&gt;를 수행하면 재밌는 특징이 생깁니다.&lt;/p&gt;&lt;p id=&quot;2e496a0c-de6e-4cb3-9ab9-62f5e91d94bc&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;f7faf9ee-3cdd-497c-885e-eecb8695d760&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;규칙1.&lt;/strong&gt; 노드의 자료가 최대 N개 라면, 해당 노드의 자식 노드 개수는 &lt;strong&gt;항상 N+1&lt;/strong&gt; 입니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;3c21a174-5e7f-46d5-ba55-cee0e4dfd88a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;규칙2.&lt;/strong&gt; 모든 리프 노드들은 &lt;strong&gt;항상 같은 레벨에 위치&lt;/strong&gt;하게 됩니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;49f31384-5b27-49bf-9b58-70079eb0254e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;규칙3.&lt;/strong&gt; 노드의 자료가 최대 N개 라면, 리프 노드가 분열 할때 항상 중간 값으로 분열 하므로 노드의 &lt;strong&gt;자료 개수는 [N/2]~N개가 보장 됩니다&lt;/strong&gt;.&lt;blockquote id=&quot;5ce21453-c8a5-4c6c-81aa-03f387e6c323&quot; class=&quot;&quot;&gt;[3/2] ⇒ 2 (올림연산 입니다.)&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;009cae38-eb21-40ba-8f6f-42f327bf6c44&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;639b321a-00e8-4ab1-8a34-07a9cb9067de&quot; class=&quot;&quot;&gt;마지막으로 아래의 &lt;strong&gt;노드 분열&lt;/strong&gt;을 이해 하실 수 있다면, &lt;code&gt;트리 삽입&lt;/code&gt; 과정을 이해 하실 수 있습니다.&lt;/p&gt;&lt;figure id=&quot;a295f7cd-15e6-4321-829b-232a6398f0c0&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%203.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GTrQg/btraNIH6mXX/VqPeva5DnlXjA2Y5CAklTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GTrQg/btraNIH6mXX/VqPeva5DnlXjA2Y5CAklTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GTrQg/btraNIH6mXX/VqPeva5DnlXjA2Y5CAklTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGTrQg%2FbtraNIH6mXX%2FVqPeva5DnlXjA2Y5CAklTk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;hr id=&quot;96e48b2a-58a5-439d-808d-685eacfd96c2&quot;&gt;&lt;h1 id=&quot;fc6d8fe5-f357-4ee3-8d9a-6d4120558f62&quot; class=&quot;&quot;&gt;B 트리 삭제&lt;/h1&gt;&lt;p id=&quot;a0863c78-6a7e-47cf-89c3-4b4ac8b9369d&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt;의 삭제는 크게 두가지 케이스로 나누어 생각 해볼 수 있습니다.&lt;/p&gt;&lt;ul id=&quot;fc75332e-bc0a-4ef6-a5fc-8e747f45bdcd&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리프 노드에서 값 삭제.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;b93a056b-0dac-454f-9a9f-87f743c81833&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리프 노드가 아닌 중간 노드에서 값 삭제.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;33f8fded-cc51-422c-9801-48ef192fe3c2&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h2 id=&quot;ba513b4b-ef01-4d3f-afd0-81df44837d20&quot; class=&quot;&quot;&gt;리프 노드에서 삭제&lt;/h2&gt;&lt;p id=&quot;125ebe8c-f975-4b88-8e03-f492c5d56973&quot; class=&quot;&quot;&gt;이 경우에도 크게 3가지 경우로 나뉩니다.&lt;/p&gt;&lt;ul id=&quot;b78f2517-55eb-4139-94e5-fbc0e91caf33&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리프 노드에서 값을 삭제 하더라도 &lt;strong&gt;최소 유지 개수&lt;/strong&gt; (&lt;strong&gt;&lt;em&gt;[N/2]&lt;/em&gt;&lt;/strong&gt;) 조건에 만족하는 경우.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;7b7da233-0fe5-4af5-986e-3c9c5870ff58&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리프 노드에서 값을 삭제 할 때, &lt;strong&gt;최소 유지 개수&lt;/strong&gt;를 만족하지 못하지만 바로 옆 형제 노드들 중 &lt;strong&gt;최소 유지 개수&lt;/strong&gt; 보다 많아 값을 빌려올 수 있는 경우.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;6632b2e7-f920-4086-ae48-b616dcc7c1e9&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리프 노드에서 값을 삭제 할 때, &lt;strong&gt;최소 유지 개수&lt;/strong&gt;를 만족하지 못하고 옆 형제 노드들도 &lt;strong&gt;최소 유지 개수&lt;/strong&gt;만 가지고 있어 값을 빌려올 수 없는 경우.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;a9bb3fcc-f126-4959-9382-36aba5cc20ee&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;f057b768-2f4c-4444-9a1d-d6ab4681ced3&quot; class=&quot;&quot;&gt;리프 노드에서 바로 삭제.&lt;/h3&gt;&lt;p id=&quot;9334b5ae-f754-4fd1-992c-02bc17d18c48&quot; class=&quot;&quot;&gt;리프 노드가 &lt;strong&gt;최소 유지 개수&lt;/strong&gt;를 만족하는 경우 바로 삭제가 가능합니다.&lt;/p&gt;&lt;figure id=&quot;a4536fd1-115e-4478-9824-ea48c7628701&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%204.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mRDH7/btraJz6xmlF/7GA7DguhK9iwPFyocrnW11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mRDH7/btraJz6xmlF/7GA7DguhK9iwPFyocrnW11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mRDH7/btraJz6xmlF/7GA7DguhK9iwPFyocrnW11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmRDH7%2FbtraJz6xmlF%2F7GA7DguhK9iwPFyocrnW11%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;3d87ef7e-9e61-4fc3-886b-d99f864a37ab&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;f47ae13e-7229-48ba-831b-6dd1f46a5c70&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;85e710e0-b956-4d7a-9c73-2b26c0dee282&quot; class=&quot;&quot;&gt;형제 노드에서 값을 빌려 오는 경우.&lt;/h3&gt;&lt;figure id=&quot;e8936595-29e6-4ebc-b10f-86b54760f4ae&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%205.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beVI75/btraNIg2h99/VxaVxgeyyxn0Jk4nmI7bzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beVI75/btraNIg2h99/VxaVxgeyyxn0Jk4nmI7bzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beVI75/btraNIg2h99/VxaVxgeyyxn0Jk4nmI7bzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeVI75%2FbtraNIg2h99%2FVxaVxgeyyxn0Jk4nmI7bzk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ol id=&quot;a7429649-9ae2-440d-a980-02504bda0885&quot; class=&quot;numbered-list&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;strong&gt;리프 노드&lt;/strong&gt;의 &lt;strong&gt;형제 노드&lt;/strong&gt;에서 빌려야 할 값을 찾습니다.&lt;ul id=&quot;905be5a5-c66b-43e1-a7f6-69040c7c2ce6&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;오른쪽 형제 노드라면 &lt;strong&gt;형제 노드중 최대값.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;e3a08b79-c81e-4495-8eef-586998069148&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;왼쪽 형제 노드라면 &lt;strong&gt;형제 노드중 최소 값.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;8de2a4eb-d1da-4603-909e-3f87fe7737ed&quot; class=&quot;numbered-list&quot; start=&quot;2&quot;&gt;&lt;li&gt;&lt;strong&gt;리프 노드&lt;/strong&gt;의 &lt;strong&gt;부모 노드&lt;/strong&gt;에서 &lt;strong&gt;리프 노드&lt;/strong&gt;와 &lt;strong&gt;형제 노드&lt;/strong&gt;를 동시에 가리키고 있는 값을 찾습니다.&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;c63ed7cd-8d69-4c34-a2a2-9fd89b630831&quot; class=&quot;numbered-list&quot; start=&quot;3&quot;&gt;&lt;li&gt;&lt;strong&gt;리프 노드&lt;/strong&gt;에서 값을 삭제 후, &lt;strong&gt;부모 노드&lt;/strong&gt;에서 찾은 값을 &lt;strong&gt;리프노드&lt;/strong&gt;로 내려주고 빌린 &lt;strong&gt;형제 노드&lt;/strong&gt; 값을 &lt;strong&gt;부모 노드&lt;/strong&gt; 찾은 값 자리에 넣습니다.&lt;/li&gt;&lt;/ol&gt;&lt;p id=&quot;08ac1b9b-2392-403a-a005-00f374dc48ca&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;9e89290e-a68a-4522-aec5-ad44ce9142a9&quot; class=&quot;&quot;&gt;형제 노드에서도 값을 빌릴 수 없는 경우.&lt;/h3&gt;&lt;figure id=&quot;39964a4a-86ec-4dbd-a0b2-5a5fcc817703&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%206.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9HFA/btraMpB1NLg/0yoMVk740gLNmOt3lBQK2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9HFA/btraMpB1NLg/0yoMVk740gLNmOt3lBQK2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9HFA/btraMpB1NLg/0yoMVk740gLNmOt3lBQK2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9HFA%2FbtraMpB1NLg%2F0yoMVk740gLNmOt3lBQK2K%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ol id=&quot;f10d4270-947d-4502-bc50-3b54c248cdfd&quot; class=&quot;numbered-list&quot; start=&quot;1&quot;&gt;&lt;li&gt;삭제할 &lt;strong&gt;리프 노드&lt;/strong&gt;와 &lt;strong&gt;형제 노드&lt;/strong&gt;를 병합 합니다. &lt;strong&gt;병합 노드&lt;/strong&gt;도 &lt;strong&gt;최소 개수 조건&lt;/strong&gt;을 만족 시키기 위해 &lt;strong&gt;부모 노드&lt;/strong&gt;에서 값 하나를 내려줍니다.&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;a9a5697c-f288-4dc9-9862-855a2097c19e&quot; class=&quot;numbered-list&quot; start=&quot;2&quot;&gt;&lt;li&gt;부모 노드도 &lt;strong&gt;최소 개수 조건&lt;/strong&gt;을 만족하지 않는다면, 1번 과정을 &lt;strong&gt;리프 노드&lt;/strong&gt; 대신 &lt;strong&gt;부모 노드&lt;/strong&gt;로 치환하여 수행합니다.&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;77ab9602-326f-434a-a586-5dd9801a80a2&quot; class=&quot;numbered-list&quot; start=&quot;3&quot;&gt;&lt;li&gt;만약 병합된 노드가 최대 개수를 넘는다면, 중간 값을 찾아 병합 노드의 &lt;strong&gt;부모 노드&lt;/strong&gt;로 값을 넘겨줍니다. &lt;/li&gt;&lt;/ol&gt;&lt;p id=&quot;29a5c57a-7238-46de-952d-f4f8c279e69b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h2 id=&quot;5e9a0b55-5c0e-40a0-b966-877edbc1424e&quot; class=&quot;&quot;&gt;중간 노드에서 삭제&lt;/h2&gt;&lt;p id=&quot;051b06f8-55b4-4bb1-a30f-352dc7a316e9&quot; class=&quot;&quot;&gt;해당 경우도 3가지로 나눌 수 있습니다.&lt;/p&gt;&lt;ul id=&quot;78f4ce53-8667-4903-9832-9a58f8f0f264&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;최소 개수 보다 많아 값을 빌려올 수 있는 자식 노드가 존재하는 경우.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;5dc72280-880b-4633-bcc5-44b54de13098&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;여유있는 자식 노드가 없지만, 부모 노드가 최소 개수보다 많은 경우.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1bdffc7a-b0b6-4e2c-9db3-23bd7e5691b8&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;자식 노드도, 부모 노드도 여유가 없는 경우.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;f89333f0-eef6-4f5e-97da-3316e87d0c19&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;fe1d0d40-33ea-4eec-8c04-91170ce906e2&quot; class=&quot;&quot;&gt;자식 노드에게 값을 빌려오는 경우.&lt;/h3&gt;&lt;figure id=&quot;0f66c4ac-13c1-400d-b5ad-2cba854aff3b&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%207.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKnHgi/btraKEfomNB/bExRIYSzz4Th7HLo9psQ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKnHgi/btraKEfomNB/bExRIYSzz4Th7HLo9psQ10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKnHgi/btraKEfomNB/bExRIYSzz4Th7HLo9psQ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKnHgi%2FbtraKEfomNB%2FbExRIYSzz4Th7HLo9psQ10%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ol id=&quot;82baafdf-4c2c-4900-9fd5-7cfd2a7acfec&quot; class=&quot;numbered-list&quot; start=&quot;1&quot;&gt;&lt;li&gt;값을 빌려올 자식 노드의 값을 찾습니다.&lt;ul id=&quot;e1122879-85a9-45c4-a4bc-ddf8c0d0dff6&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;왼쪽 &lt;strong&gt;자식 노드&lt;/strong&gt;라면 최소 값을 찾습니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;b81314eb-3220-479e-8147-2a88f012ce1d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;오른쪽 &lt;strong&gt;자식 노드&lt;/strong&gt;라면 최대 값을 찾습니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;5d8595ff-48f4-4e67-83cb-2728816caf37&quot; class=&quot;numbered-list&quot; start=&quot;2&quot;&gt;&lt;li&gt;타겟 노드의 값을 지우고, 해당 자리를 찾은 &lt;strong&gt;자식 노드&lt;/strong&gt;의 값으로 대체 합니다.&lt;/li&gt;&lt;/ol&gt;&lt;p id=&quot;f15cb003-6784-4ea1-a64f-f249cc7e8fb5&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;b5c3f76e-e324-40d8-a0bd-95d953c4509d&quot; class=&quot;&quot;&gt;여유있는 자식 노드는 없지만, 부모 노드가 여유가 있는 경우.&lt;/h3&gt;&lt;figure id=&quot;03eed555-4548-42f0-ae3d-2ee7a1ba212c&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%208.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1dnlL/btraKFZEeB5/4Yha8dHz22xiK5mMTaguwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1dnlL/btraKFZEeB5/4Yha8dHz22xiK5mMTaguwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1dnlL/btraKFZEeB5/4Yha8dHz22xiK5mMTaguwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1dnlL%2FbtraKFZEeB5%2F4Yha8dHz22xiK5mMTaguwk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ol id=&quot;b06fbabf-79b7-4cb3-a10e-da8b636c949d&quot; class=&quot;numbered-list&quot; start=&quot;1&quot;&gt;&lt;li&gt;노드의 삭제 값의 &lt;strong&gt;자식 노드&lt;/strong&gt;들을 합병합니다.&lt;/li&gt;&lt;/ol&gt;&lt;p id=&quot;224c11ac-8f02-4955-8d30-d2c40e213900&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;a8efc1ba-df33-4876-94ae-6441c8331a68&quot; class=&quot;&quot;&gt;자식노드, 부모노드 둘다 여유가 없는 경우.&lt;/h3&gt;&lt;figure id=&quot;c5ca74b0-5cd5-4899-8e84-1a1e61999ee7&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%209.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rEo4C/btraGGFgpJE/9upkyqIgvckz0R4mE1fcAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rEo4C/btraGGFgpJE/9upkyqIgvckz0R4mE1fcAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rEo4C/btraGGFgpJE/9upkyqIgvckz0R4mE1fcAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrEo4C%2FbtraGGFgpJE%2F9upkyqIgvckz0R4mE1fcAk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;ol id=&quot;acd2a519-51b8-415a-b5b0-7abc8970cb76&quot; class=&quot;numbered-list&quot; start=&quot;1&quot;&gt;&lt;li&gt;노드의 삭제 값의 &lt;strong&gt;자식 노드&lt;/strong&gt;들을 병합합니다.&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;b4e39c4d-f4d0-4ba6-92b6-dcbe69b0bf68&quot; class=&quot;numbered-list&quot; start=&quot;2&quot;&gt;&lt;li&gt;노드의 &lt;strong&gt;형제 노드&lt;/strong&gt;와 &lt;strong&gt;부모노드&lt;/strong&gt;를 대상으로 병합을 진행합니다. &lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;e5331d25-6e33-4d27-8d95-6d73b96890bc&quot; class=&quot;numbered-list&quot; start=&quot;3&quot;&gt;&lt;li&gt;만약 &lt;strong&gt;병합 노드&lt;/strong&gt;가 최대 개수를 초과 한다면 중간 값을 추출해 &lt;strong&gt;병합 노드&lt;/strong&gt;의 &lt;strong&gt;부모노드&lt;/strong&gt;로 이동시킵니다.&lt;/li&gt;&lt;/ol&gt;&lt;p id=&quot;8d4ab519-b17d-4d69-a899-9cba744ca33d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;d5ba81d4-0af9-470c-a066-fd1d10d08493&quot;&gt;&lt;h1 id=&quot;3194cb98-923d-4165-af20-1a9dda425815&quot; class=&quot;&quot;&gt;B+트리&lt;/h1&gt;&lt;h3 id=&quot;10b96b74-83e4-4569-a324-1c824046d5a7&quot; class=&quot;&quot;&gt;B 트리의 단점은 순회?&lt;/h3&gt;&lt;blockquote id=&quot;e110ba46-fa4e-4ab4-8873-9c772a20a518&quot; class=&quot;&quot;&gt;&lt;mark class=&quot;highlight-red&quot;&gt;Warning!!&lt;/mark&gt; 주관적인 생각이 섞여 있습니다.&lt;/blockquote&gt;&lt;p id=&quot;10d04170-ebfd-4787-b894-97f6235701be&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt; 는 자료 순회가 단점이라는 글이 많습니다. B 트리도 트리 구조이기 때문에 트리 순회와 똑같은 시간복잡도가 걸립니다. 그렇기에 단점이라 할 수는 없습니다.&lt;/p&gt;&lt;p id=&quot;b4e3135a-3563-4c4d-9547-e48107e96440&quot; class=&quot;&quot;&gt;많은 자료들이 단점이라 오해(?)하는 이유는 트리 순회를 개선한 B+트리의 존재 유무 때문이 아닐까 생각이 듭니다.&lt;/p&gt;&lt;h3 id=&quot;5ec86d80-f74e-4be9-9b21-6083c18dda58&quot; class=&quot;&quot;&gt;리프 노드들을 모든 노드의 값이 포함되도록 처리&lt;/h3&gt;&lt;p id=&quot;f2a16480-2b97-46e9-9cde-7c734a030319&quot; class=&quot;&quot;&gt;B+ 트리의 순회 연산의 개선 포인트는 리프 노드들의 구조에 있습니다.&lt;/p&gt;&lt;figure id=&quot;dc99cd5e-92cf-4f86-8e0d-3852043a96ce&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20B%20%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%20909f185a7cd847c68f3034f22f178d8b/Untitled%2010.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xIPVM/btraGFl26sG/Vn39V6Lj38dbDyVTIluys1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xIPVM/btraGFl26sG/Vn39V6Lj38dbDyVTIluys1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xIPVM/btraGFl26sG/Vn39V6Lj38dbDyVTIluys1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxIPVM%2FbtraGFl26sG%2FVn39V6Lj38dbDyVTIluys1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;99df3b43-4d19-44c9-b37f-2fe1900b2106&quot; class=&quot;&quot;&gt;다음의 예시를 보면, &lt;strong&gt;리프 노드&lt;/strong&gt;들은 모든 값들을 포함하고 있고 연결리스트 형태를 구성하고 있습니다.&lt;/p&gt;&lt;p id=&quot;8b4bd167-f00b-43f4-b38d-f91427f20f6c&quot; class=&quot;&quot;&gt;&lt;strong&gt;리프 노드&lt;/strong&gt;의 위 노드들은 검색을 위해 유지하고 있는 모습입니다.&lt;/p&gt;&lt;p id=&quot;0c638c3f-0fc5-44e0-86ee-a757a7c63e8f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;f0d98b09-8b68-4490-8f5e-a7212de19e8c&quot; class=&quot;&quot;&gt;특정 범위를 순회하고 싶다면, 손쉽게 특정 &lt;strong&gt;리프 노드&lt;/strong&gt;에서 차례대로 순회 할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;7f68dfa8-17b8-4e24-832c-52b73c841444&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;6dc4e44c-353d-4882-9b2a-a4e4922dfdff&quot; class=&quot;&quot;&gt;빠른 검색-삽입-삭제 + 범위 검색 이 필요한 &lt;strong&gt;관계형 데이터베이스&lt;/strong&gt;가 해당 자료구조를 사용하고 있습니다.&lt;/p&gt;&lt;p id=&quot;fb0f5c47-97cc-4b60-907d-76ae59892c00&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;591f7955-350a-4494-8f9e-154a713c87f8&quot;&gt;&lt;p id=&quot;7adc9af0-54cc-4ad3-9137-34326673d425&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;d0df558f-b4c6-4faa-9871-c054ce0aa0b1&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt;의 삽입, 삭제 과정을 단번에 이해하긴 어려운거 같습니다. &lt;/p&gt;&lt;p id=&quot;082ad532-3e66-4351-93ac-875b480da92a&quot; class=&quot;&quot;&gt;더군다나 트리의 특정 스냅샷 기준으로 설명했기 때문에 높이가 큰 트리인 경우에는 설명한 개념에 더해 재귀 개념 까지 합산하여 이해를 해야 하기 때문에 더 어려운거 같습니다.&lt;/p&gt;&lt;p id=&quot;a3f4a049-f6b9-44b2-9c5d-86f28e7f5840&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;a5865568-3f92-4e1f-b75d-0d4f66dd18de&quot; class=&quot;&quot;&gt;&lt;code&gt;B 트리&lt;/code&gt; 특징들을 살펴보면서 항상 만족했던 조건들을 다시 정리해보면 아래와 같습니다.&lt;/p&gt;&lt;ul id=&quot;e77d0234-5a84-4c88-b75b-6f510832b7a7&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;em&gt;N차 B 트리는 노드의 최대 자료수는 N-1 이며, 자식노드는 최대 N개.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;378263a9-5086-47ec-b5bf-14f4c1a04fbd&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;em&gt;노드의 자료가 최대 N개 라면, 해당 노드의 자식 노드 개수는 &lt;/em&gt;&lt;em&gt;&lt;strong&gt;항상 N+1&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;d3f6b224-40a3-495e-87b4-a32e4b674511&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;em&gt;노드의 자료가 최대 N개 라면, 노드의 &lt;/em&gt;&lt;strong&gt;&lt;em&gt;자료 개수는 [N/2] ~ N개.&lt;/em&gt;&lt;/strong&gt; (루트 노드 제외)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;626d8fea-f5a0-4fd6-918a-9543d4c334b7&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;em&gt;모든 리프 노드들은 &lt;/em&gt;&lt;em&gt;&lt;strong&gt;항상 같은 레벨에 위치&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;한다.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;ea6db9c9-a463-401a-8dd5-57137c01edf3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;a50885be-81a1-4ac2-88f4-2a41917f5fa8&quot; class=&quot;&quot;&gt;오늘 준비한 포스팅은 여기까지 입니다.&lt;/p&gt;&lt;p id=&quot;a1aa523f-7262-45b1-b01e-8b1bff68cabb&quot; class=&quot;&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;p id=&quot;0a722824-f58b-4687-b8d9-a4a138eb2269&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>자료구조</category>
      <category>B+TREE</category>
      <category>b-tree</category>
      <category>BALANCE TREE</category>
      <category>db index</category>
      <category>tree</category>
      <category>균형 트리</category>
      <category>데이터베이스</category>
      <category>트리</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/108</guid>
      <comments>https://mommoo.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 29 Jul 2021 02:49:11 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] OSI 7계층</title>
      <link>https://mommoo.tistory.com/107</link>
      <description>&lt;article id=&quot;5f215e4e-aed2-4118-80f6-16a03ca35e64&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;7bfcd721-47a5-4f59-bcbe-ff5b18512eb9&quot; class=&quot;&quot;&gt;안녕하세요. &lt;/p&gt;&lt;p id=&quot;b0265dda-1eca-48fb-bcea-3584b3341840&quot; class=&quot;&quot;&gt;오늘은 &lt;code&gt;OSI 7계층&lt;/code&gt;에 대해 간략하게 소개합니다.&lt;/p&gt;&lt;h1 id=&quot;1825dab2-e987-4b09-a198-2b87546de856&quot; class=&quot;&quot;&gt;OSI 7 Layer&lt;/h1&gt;&lt;p id=&quot;0a6c9352-b158-43b2-8599-8ca8c5e07d09&quot; class=&quot;&quot;&gt;&lt;code&gt;OSI 7계층&lt;/code&gt; 이란 네트워크 통신을 수행할 때, 처리되어야 할 작업을 순차적으로 7단계로 처리 하는 과정을 의미합니다.&lt;/p&gt;&lt;p id=&quot;35d69d45-0507-43dd-b4ce-80cf49681fd1&quot; class=&quot;&quot;&gt;계층을 나누어 처리함으로써, 필요한 작업들은 독립적인 모듈로 처리 됩니다. 이는 디버깅이 용이하고 모듈간 교체 및 확장등이 자유롭다는 장점이 존재합니다.&lt;/p&gt;&lt;p id=&quot;6962b614-8f41-4cb9-a6e9-fa541a3aa931&quot; class=&quot;&quot;&gt;&lt;code&gt;OSI 1~3 계층&lt;/code&gt;은 &lt;strong&gt;하드웨어 영역&lt;/strong&gt;으로써, 각 층마다 매칭되는 하드웨어 장치가 존재합니다. 따라서, 해당 계층의 역할들은&lt;strong&gt; 하드웨어가 실질적으로 수행하는 역할&lt;/strong&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;031f6949-e348-482c-98b8-2a4d0d9a29cb&quot; class=&quot;&quot;&gt;&lt;code&gt;OSI 4~7 계층&lt;/code&gt;은 &lt;strong&gt;소프트웨어 영역&lt;/strong&gt;이며, &lt;code&gt;4~6 계층&lt;/code&gt;은 &lt;strong&gt;OS&lt;/strong&gt;가 &lt;code&gt;7계층&lt;/code&gt;은 우리가 사용하는 &lt;strong&gt;프로그램&lt;/strong&gt;이 해당 계층의 역할을 수행합니다.&lt;/p&gt;&lt;p id=&quot;d8c44142-0858-4c48-95d7-774a25663934&quot; class=&quot;&quot;&gt;다음 이미지는 OSI 7계층 구성도 입니다.&lt;/p&gt;&lt;figure id=&quot;9ab1396d-71a6-4724-9860-38e8fb7f8475&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/2752F645565D107C24&quot;&gt;&lt;img style=&quot;width:288px&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/2752F645565D107C24&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;hr id=&quot;5735cd5c-aec2-4b55-ac31-fcb2831b7ac5&quot;&gt;&lt;h1 id=&quot;4a40ef8a-97cc-4bc8-8743-c186d8f1a310&quot; class=&quot;&quot;&gt;Physical Layer&lt;/h1&gt;&lt;p id=&quot;4b52f154-8da9-4161-bcbf-4ec086bd426c&quot; class=&quot;&quot;&gt;네트워크 통신은 서로 멀리 떨어져 있는 지점끼리 데이터를 주고 받을 수 있습니다. 데이터 통신은 아날로그 신호(주파수)로 최초 전달 되고 디지털 데이터로 변환되어 해석하는것을 의미합니다.&lt;/p&gt;&lt;p id=&quot;aa89b645-afc9-47d6-870b-1bd5aa7ea5f5&quot; class=&quot;&quot;&gt;&lt;code&gt;물리 계층(Physical Layer)&lt;/code&gt;은 이러한 아날로그 신호(주파수)를 디지털 신호로 변경해주는 역할을 수행합니다.&lt;/p&gt;&lt;p id=&quot;09139bbc-241f-4f97-8f65-6ce07d19442e&quot; class=&quot;&quot;&gt;&lt;code&gt;물리 계층&lt;/code&gt;의 역할은 여러 하드웨어의 조합으로 수행됩니다. 아날로그 신호를 디지털 테이터로 변환하는 주된 역할은 &lt;strong&gt;NIC(Network Interface Controller)&lt;/strong&gt;란 하드웨어가 수행합니다. 흔히 &lt;strong&gt;네트워크 카드&lt;/strong&gt;, &lt;strong&gt;랜 카드&lt;/strong&gt;로 불립니다.&lt;/p&gt;&lt;h1 id=&quot;e13bad62-4624-4ac6-ba4a-aaa7a31ea53d&quot; class=&quot;&quot;&gt;Data-Link Layer&lt;/h1&gt;&lt;p id=&quot;f9d1e13a-b478-48ac-93e7-db80d4caffd9&quot; class=&quot;&quot;&gt;네트워크 통신은 여러 프로그램이 동시적, 지속적으로 수행 할 수 있습니다. 이때, 컴퓨터는 들어온 데이터를 식별하기 위한 라벨링 작업이 필요합니다. 이러한 행위를 &lt;strong&gt;프레임화&lt;/strong&gt; 라고 부릅니다.&lt;/p&gt;&lt;p id=&quot;2ae90e29-5479-4c95-b0c4-42dc7e57c92d&quot; class=&quot;&quot;&gt;&lt;code&gt;데이터 링크 계층(Data-Link Layer)&lt;/code&gt;은 &lt;strong&gt;프레임화&lt;/strong&gt;를 진행하고, 만들어진 &lt;strong&gt;프레임&lt;/strong&gt;을 상위 계층 또는 하위 계층에 전달 합니다.&lt;/p&gt;&lt;p id=&quot;ef9aded9-084d-4e94-9dda-7d2ca10c3936&quot; class=&quot;&quot;&gt;결론적으로, 해당 계층은 두가지 역할로 정리할 수 있습니다.&lt;/p&gt;&lt;ul id=&quot;2d76901a-2a08-4efc-86ea-892ba0036e8d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;프레임화&lt;/strong&gt; (데이터 라벨링)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;eab9ba04-ef25-45ec-a333-34322cca422c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;흐름제어&lt;/strong&gt; (상위 계층 또는 하위 계층으로 프레임 전달)&lt;blockquote id=&quot;256201e3-5800-4a69-9fc1-fed88cfac8f9&quot; class=&quot;&quot;&gt;3계층, 1계층도 하드웨어 영역이므로 인접한 네트워크 장비에 데이터를 전송하는것을 의미합니다.&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;06f8480f-a342-46df-aff7-a2676f2d70c3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;b68762bd-eb99-4dea-aee1-8e0e57870edf&quot; class=&quot;&quot;&gt;해당 계층의 역할을 수행하는 대표적인 하드웨어는 위에서 언급한 &lt;strong&gt;NIC&lt;/strong&gt; 입니다. 해당 계층의 역할을 전문적으로 수행하는 &lt;strong&gt;브릿지&lt;/strong&gt;, &lt;strong&gt;스위치&lt;/strong&gt; 같은 장비들도 존재합니다.&lt;/p&gt;&lt;h1 id=&quot;2befe990-cd76-40a7-bc66-bb39c3901c5c&quot; class=&quot;&quot;&gt;Network Layer&lt;/h1&gt;&lt;p id=&quot;58215b07-6357-4e33-aba3-5d035968338a&quot; class=&quot;&quot;&gt;&lt;code&gt;물리 계층&lt;/code&gt;의 아날로그 신호는 거리가 먼 지점까지 전달되지 않습니다.&lt;/p&gt;&lt;p id=&quot;563a1c6d-0ea2-4234-b149-0fcf091c2800&quot; class=&quot;&quot;&gt;신호를 세게 하는 &lt;strong&gt;리피터&lt;/strong&gt;라는 장비를 사용 할 수 있지만, 이는 특정 지점에 전달 하기 보다 무분별하게 전파하기 때문에 효율이 떨어 집니다.&lt;/p&gt;&lt;p id=&quot;e7a1fb52-2d07-45e5-aa4f-5fea872f84b3&quot; class=&quot;&quot;&gt;이를 해결하기 위해 사용되는 장비는 바로 &lt;strong&gt;라우터&lt;/strong&gt; 입니다. 무분별하게 전파하는 &lt;strong&gt;리피터&lt;/strong&gt;와는 다르게 &lt;strong&gt;라우터&lt;/strong&gt;는 내장된 &lt;strong&gt;라우팅 알고리즘&lt;/strong&gt;을 통해 전달 할 수 있는 가장 가까운 &lt;strong&gt;라우터&lt;/strong&gt; 까지의 경로를 결정하고 이를 테이블로 저장합니다. 해당 행위를 &lt;strong&gt;라우팅&lt;/strong&gt; 이라 표현 합니다.&lt;/p&gt;&lt;p id=&quot;6a4a87fe-2333-4d83-838f-09f156af4c12&quot; class=&quot;&quot;&gt;경로가 결정되면 전달해야할 데이터를 다음 라우터에게 맡깁니다. N개의 라우터가 지속적으로 정보를 전달을 하면서 최종 목적지 까지 전달하는 방법을 &lt;strong&gt;포워딩&lt;/strong&gt; 이라 표현 합니다.&lt;/p&gt;&lt;p id=&quot;b8210eb0-b665-40a2-9844-ef12c50c6002&quot; class=&quot;&quot;&gt;이때, 정보를 전달 받은 라우터는 본인이 최종 목적지 인지 여부와 응답 데이터를 다시 출발지 라우터로 보내기 위한 데이터가 필요합니다. 즉 전달해야 하는 데이터는 출발지 정보, 목적지 정보가 부가적으로 필요 하며 해당 정보는 &lt;strong&gt;IP&lt;/strong&gt; 라는 정보로 처리합니다. 전달 데이터에 &lt;strong&gt;IP&lt;/strong&gt; 정보를 붙인 데이터를 &lt;strong&gt;패킷&lt;/strong&gt; 이라 부릅니다.&lt;/p&gt;&lt;p id=&quot;5a21cf6e-05b2-4f90-a3c9-38fa5a18b3ff&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;0e072618-d115-4928-a601-8e482b4c6845&quot; class=&quot;&quot;&gt;정리하자면 해당 계층은 3가지 역할을 수행합니다.&lt;/p&gt;&lt;ul id=&quot;429ac0a0-be7f-49fb-8345-df418cc0ce3c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;2계층에서 넘어온 데이터를 &lt;strong&gt;패킷&lt;/strong&gt;으로 만들거나, 수신된 &lt;strong&gt;패킷&lt;/strong&gt; 데이터를 해석합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;9801797e-fc46-41a0-a005-13a37067f1e7&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;다음 라우터의 경로를 찾기 위한 &lt;strong&gt;라우팅&lt;/strong&gt;을 진행합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a9868030-b428-463e-9626-f78c1996c783&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;패킷&lt;/strong&gt; 전달의 역할을 다음 &lt;strong&gt;라우터&lt;/strong&gt;에게 위임하는 &lt;strong&gt;포워딩&lt;/strong&gt;을 진행합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;d68cd8da-9640-46d2-9b78-798d7dc58d95&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;0e9912f5-1332-4efa-99f4-1a62fa26cbf8&quot; class=&quot;&quot;&gt;해당 계층에 대표적인 하드웨어는 위에서 언급했던 &lt;strong&gt;라우터&lt;/strong&gt; 이며 우리가 집에서 흔히 사용하는 &lt;strong&gt;공유기&lt;/strong&gt;도 &lt;strong&gt;라우터&lt;/strong&gt;의 역할을 어느정도 수행 합니다.&lt;/p&gt;&lt;h1 id=&quot;c1ef4c81-b55c-4871-92b7-6a6901540cf2&quot; class=&quot;&quot;&gt;Transport Layer&lt;/h1&gt;&lt;p id=&quot;9e494e7a-d8eb-4809-843e-06e0792861d9&quot; class=&quot;&quot;&gt;데이터 통신은 여러 프로그램이 동시에 지속적으로 수행되고 있습니다.&lt;/p&gt;&lt;p id=&quot;b62c90d3-06a1-4ff3-988d-76bbea8cee66&quot; class=&quot;&quot;&gt;그렇기에 특정 데이터가 어떤 프로그램과 관련이 있는지 식별할 수 있어야 합니다.&lt;/p&gt;&lt;p id=&quot;03688103-cc48-42d2-b422-d0bee76fc8ed&quot; class=&quot;&quot;&gt;식별하기 위해 &lt;strong&gt;포트번호&lt;/strong&gt; 라는 데이터가 사용됩니다. &lt;/p&gt;&lt;p id=&quot;02dc0f47-762e-4236-a9d0-c80a8eb47ad7&quot; class=&quot;&quot;&gt;&lt;code&gt;전송 계층(Transport Layer)&lt;/code&gt;은 하위 계층에 데이터를 전달 할때 데이터에 &lt;strong&gt;포트번호&lt;/strong&gt;를 붙이며, 하위 계층으로 부터 데이터를 전달 받을 때도 &lt;strong&gt;포트번호&lt;/strong&gt; 를 통해 데이터를 식별합니다. &lt;/p&gt;&lt;p id=&quot;5129b9c0-7713-49cf-a1bf-e3565c845095&quot; class=&quot;&quot;&gt;또한 &lt;strong&gt;데이터 통신 프로토콜에 따른 알고리즘이 수행&lt;/strong&gt;됩니다. 대표적인 예로 &lt;strong&gt;TCP&lt;/strong&gt;, &lt;strong&gt;UDP&lt;/strong&gt; 프로토콜이 존재합니다. &lt;/p&gt;&lt;p id=&quot;1836ceea-f3b2-4a70-b7cc-e80a2d50935f&quot; class=&quot;&quot;&gt;&lt;strong&gt;TCP&lt;/strong&gt; 통신이 제공하는 &lt;strong&gt;연결지향&lt;/strong&gt;, &lt;strong&gt;흐름제어&lt;/strong&gt;, &lt;strong&gt;오류검출 및 회복&lt;/strong&gt; 등이 해당 계층에서 수행됩니다.&lt;/p&gt;&lt;p id=&quot;281689d9-8ed6-4048-8ea2-f55b128a83e6&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;97ff81c3-79d4-4e08-b28a-73d57dbc5113&quot; class=&quot;&quot;&gt;해당 계층의 역할은 운영체제 커널에 소프트웨어적으로 구현되어 있습니다.&lt;/p&gt;&lt;p id=&quot;7da36d42-62df-4197-aba9-d7a6b802a30f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7e324bfd-31f8-4ae9-84ba-68d441d9cfb9&quot; class=&quot;&quot;&gt;정리하자면 해당 계층은 크게 2가지 역할을 수행합니다.&lt;/p&gt;&lt;ul id=&quot;60670b51-fc37-438d-9eb7-4847ccb603ec&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;포트번호&lt;/strong&gt;를 통한 데이터 식별 작업.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;3be6fec6-e318-418f-b714-bcbc38925b94&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 통신 프로토콜에 따른 알고리즘 수행.&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;ea8e494f-3128-4c6a-adfc-c76d67b136e1&quot; class=&quot;&quot;&gt;Session Layer&lt;/h1&gt;&lt;blockquote id=&quot;2567e892-1079-48a6-8627-5b311ae74278&quot; class=&quot;&quot;&gt;&lt;mark class=&quot;highlight-red&quot;&gt;Warning!&lt;/mark&gt; 해당 계층은 작성자가 정확히 이해하지 못했습니다.&lt;/blockquote&gt;&lt;p id=&quot;f1917bb3-3a94-4264-8d11-c1a901e10327&quot; class=&quot;&quot;&gt;&lt;code&gt;세션 계층(Session Layer)&lt;/code&gt;의 주된 목표는 각 프로그램의 &lt;strong&gt;네트워크 통신 상태 관리&lt;/strong&gt;와 &lt;strong&gt;동기화&lt;/strong&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;e1a5d05e-105d-4fd5-8712-037c9c22a63e&quot; class=&quot;&quot;&gt;&lt;strong&gt;상태 관리&lt;/strong&gt;는 데이터 통신 프로토콜 알고리즘이 가지는 특성들을 수행하기 위해 필요한 처리를 의미합니다. 예를들어 TCP 프로토콜은 연결 수립, 종료와 같은 상태 등을 처리합니다.&lt;/p&gt;&lt;p id=&quot;e0e9efe2-19c3-4624-ba25-58e5c8d879e7&quot; class=&quot;&quot;&gt;&lt;strong&gt;동기화&lt;/strong&gt;란 &lt;code&gt;전송 계층&lt;/code&gt;에서 올라온 또는 &lt;code&gt;응용 계층&lt;/code&gt; 에서 내려온 데이터를 안정적으로 상위 또는 하위 계층으로 전달하는 역할을 수행합니다. 데이터가 성공적으로 전달된 지점까지 내부적으로 마킹해두며, 데이터 전달에 문제가 발생하면 마킹한 지점부터 오류지점까지 데이터 복구 절차가 수행됩니다.&lt;/p&gt;&lt;p id=&quot;75c20261-ab21-4752-b917-3102f4c50263&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;79703525-18da-4bce-9ac5-15c42b94c33d&quot; class=&quot;&quot;&gt;해당 계층 역할도 운영체제가 수행합니다.&lt;/p&gt;&lt;h1 id=&quot;0fd16a3d-103e-4421-9387-e5a9a2b5e105&quot; class=&quot;&quot;&gt;Presentation Layer&lt;/h1&gt;&lt;p id=&quot;728b0a8d-2e62-4aec-968a-44deeb8df988&quot; class=&quot;&quot;&gt;&lt;code&gt;표현 계층(Presentation Layer)&lt;/code&gt;은 하위 계층이 전달한 데이터를 어플리케이션이 해석 할 수 있도록 데이터를 &lt;strong&gt;디코딩&lt;/strong&gt; 하거나, 데이터 전달을 효율적으로 수행하기 위해 데이터를 &lt;strong&gt;인코딩&lt;/strong&gt; 한 뒤 하위 계층으로 전달합니다.&lt;/p&gt;&lt;p id=&quot;57f7ee85-1ef5-43e8-ba80-eaa311c98ad1&quot; class=&quot;&quot;&gt;다음은 표현 계층이 수행하는 대표적인 예시 입니다. &lt;/p&gt;&lt;ul id=&quot;1d5f1bf6-96e6-4aea-9944-6968849a6efb&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;SSL 프로토콜에서 처리되는 &lt;strong&gt;암, 복호화 처리&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;7f3ebeb8-808d-494b-b337-7182a44f5c97&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 &lt;strong&gt;압축&lt;/strong&gt;및 &lt;strong&gt;해제&lt;/strong&gt; 처리&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;9b27ea55-f2af-4407-883b-ff52ad779592&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 포맷(UTF-8 과 같은)에 따른 &lt;strong&gt;인코딩&lt;/strong&gt;, &lt;strong&gt;디코딩&lt;/strong&gt; 처리&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;13c9a356-51dc-4d44-82fa-435b9dfb345d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;2e19795e-6c12-4635-b92f-d57e97266a1f&quot; class=&quot;&quot;&gt;해당 계층 역할 역시 운영체제가 수행합니다.&lt;/p&gt;&lt;h1 id=&quot;f2e93bb9-d435-4332-92e8-0712a102cff3&quot; class=&quot;&quot;&gt;Application Layer&lt;/h1&gt;&lt;p id=&quot;bfba5bb0-168c-41d0-805b-b49f98a5147c&quot; class=&quot;&quot;&gt;&lt;code&gt;응용 계층(Application Layer)&lt;/code&gt;은 요구사항을 처리하기 위해 네트워크 통신을 이용한 데이터의 송-수신이 발생하는 가장 마지막 영역 입니다.&lt;/p&gt;&lt;p id=&quot;fbf7dee1-1434-4661-bce9-ff7621bd97d1&quot; class=&quot;&quot;&gt;운영체제는 &lt;code&gt;전송 계층&lt;/code&gt;에서 제공하는 API를 활용하여 네트워크 통신을 가능토록 API를 제공하는데, 이를 &lt;strong&gt;소켓 API&lt;/strong&gt;라 부릅니다. &lt;/p&gt;&lt;p id=&quot;334793dc-aa8e-4cfd-9429-3153ced9a2e2&quot; class=&quot;&quot;&gt;해당 계층은 &lt;strong&gt;소켓 프로그래밍&lt;/strong&gt;을 통해 데이터를 &lt;strong&gt;송신 및 수신&lt;/strong&gt;을 수행합니다.&lt;/p&gt;&lt;p id=&quot;4038e2ec-f3fe-491e-a07b-7af8d43d9766&quot; class=&quot;&quot;&gt;재밌는 특징은 각 프로그램이 개별적으로 데이터 규격을 만들어 통신 할 수 있습니다. 데이터의 인코딩 및 디코딩을 각 프로그램이 자체적으로 수행할 수 있기 때문입니다.&lt;/p&gt;&lt;p id=&quot;9880205e-0a16-4b7c-a573-adc2d2ad457d&quot; class=&quot;&quot;&gt;프로그램이 대표적으로 사용하는 데이터 규격은 &lt;strong&gt;HTTP 프로토콜&lt;/strong&gt; 방식이 있으며 작은 단위로는 &lt;strong&gt;JSON&lt;/strong&gt;, &lt;strong&gt;XML&lt;/strong&gt;과 같은 데이터 규격도 존재합니다.&lt;/p&gt;&lt;p id=&quot;d73af5ea-9da7-4500-8e2c-c850d3e0ef75&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;da8755f7-ad0c-40e7-afd9-0eb9bf5adca9&quot; class=&quot;&quot;&gt;해당 계층의 역할은 개발된 프로그램이 수행합니다.&lt;/p&gt;&lt;h1 id=&quot;b46d7298-d779-4668-a55f-a75a42698422&quot; class=&quot;&quot;&gt;TCP/IP 모델의 등장&lt;/h1&gt;&lt;p id=&quot;35d83fb6-9154-465a-b1a9-a3a84d2409e4&quot; class=&quot;&quot;&gt;독립적인 모듈을 구성하는것은 정답이 존재하지 않습니다. 나뉘어진 모듈이 서로 심하게 의존하는 경우 모듈의 &lt;strong&gt;결합도&lt;/strong&gt;가 높다고 하며, 모듈이 너무 작은 단위로 구성 된 경우 &lt;strong&gt;응집도&lt;/strong&gt;가 떨어진다고 합니다. 이러한 특징들은 소프트웨어적 가치를 하락시키는 요인입니다. &lt;/p&gt;&lt;p id=&quot;1c19fba7-aca8-4342-a1f7-151a48afda19&quot; class=&quot;&quot;&gt;&lt;code&gt;OSI 7계층&lt;/code&gt;은 대표적인 네트워크 통신 규격으로 사용 되고 있지만, &lt;code&gt;OSI 7계층&lt;/code&gt;역시 결합도가 높고, 응집도가 낮은 모듈들이 존재합니다. &lt;/p&gt;&lt;p id=&quot;ced02691-acd1-451d-ac58-563de18351ad&quot; class=&quot;&quot;&gt;그 대상 계층들은 &lt;code&gt;응용 계층&lt;/code&gt;, &lt;code&gt;표현 계층&lt;/code&gt;, &lt;code&gt;세션 계층&lt;/code&gt; 입니다. 따라서 현대적인 네트워크 통신 규격인 &lt;code&gt;TCP/IP 모델&lt;/code&gt; 은 다음과 같이 정의 되었습니다.&lt;/p&gt;&lt;figure id=&quot;d3dfb03c-87ca-44bc-927c-10409abc21eb&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://itwiki.kr/images/thumb/2/20/TCP_4%EA%B3%84%EC%B8%B5.png/400px-TCP_4%EA%B3%84%EC%B8%B5.png&quot;&gt;&lt;img style=&quot;width:384px&quot; src=&quot;https://itwiki.kr/images/thumb/2/20/TCP_4%EA%B3%84%EC%B8%B5.png/400px-TCP_4%EA%B3%84%EC%B8%B5.png&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;2c203ca7-cf27-4e7f-a909-6f2c173abeee&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;42449dba-fa2f-4a01-bc2d-db055621a87f&quot; class=&quot;&quot;&gt;&lt;code&gt;TCP/IP 모델&lt;/code&gt;의 &lt;code&gt;네트워크 엑세스 계층&lt;/code&gt;은 &lt;code&gt;데이터 링크 계층&lt;/code&gt; + &lt;code&gt;물리 계층&lt;/code&gt; 으로 나누어서 표현하기도 합니다.&lt;/p&gt;&lt;p id=&quot;df675b34-b556-4acd-82d1-e9ec008ac09a&quot; class=&quot;&quot;&gt;반면에 &lt;code&gt;응용 계층&lt;/code&gt;, &lt;code&gt;표현 계층&lt;/code&gt;, &lt;code&gt;세션 계층&lt;/code&gt; 들은 &lt;code&gt;응용 계층&lt;/code&gt; 하나로 통합 되었습니다.&lt;/p&gt;&lt;p id=&quot;31e1dda3-4f36-4d89-a537-d1257b5c2549&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;3ef20679-46b0-4ad0-902a-4ee14f0a0fcd&quot;&gt;&lt;p id=&quot;d6adfcd0-d086-43df-b75d-226b5fa21cd8&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;85f11b27-6a07-4f0c-81cf-b4590375bbaa&quot; class=&quot;&quot;&gt;&lt;code&gt;TCP/IP 모델&lt;/code&gt;의 각 계층 역할도 &lt;code&gt;OSI 7계층&lt;/code&gt;의 역할과 동일합니다.&lt;/p&gt;&lt;p id=&quot;e1264023-d881-4035-8acc-9ad2340da639&quot; class=&quot;&quot;&gt;몇몇 모듈이 독립적으로 수행되던 역할이 하나의 모듈이 통합 수행 한다고 이해하면 될거 같습니다.&lt;/p&gt;&lt;p id=&quot;ccc9a5f7-dcca-479f-b650-ff6e80d6ed5a&quot; class=&quot;&quot;&gt;오늘 포스팅은 여기까지 입니다.&lt;/p&gt;&lt;p id=&quot;9951366a-9d6c-4121-9646-5c0b45d9a9f9&quot; class=&quot;&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;p id=&quot;82efa895-00ad-444c-8e10-ce252c6bc055&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;block-color-gray&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>네트워크</category>
      <category>Application</category>
      <category>DataLink</category>
      <category>network</category>
      <category>OSI</category>
      <category>OSI 7계층</category>
      <category>presentation</category>
      <category>Pysical</category>
      <category>session</category>
      <category>TCP/IP</category>
      <category>transport</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/107</guid>
      <comments>https://mommoo.tistory.com/107#entry107comment</comments>
      <pubDate>Mon, 26 Jul 2021 02:27:10 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 뮤텍스와 세마포어</title>
      <link>https://mommoo.tistory.com/106</link>
      <description>&lt;article id=&quot;9cc7f8d2-a518-4940-94b0-4da6bb37f6cb&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;05aa5ef6-a5c5-48f0-abcb-6e277bde3139&quot; class=&quot;&quot;&gt;소프트웨어를 개발하다 보면, 공유되어야 할 자원이 존재할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;5dc2c437-de99-4225-b3b9-a7eb03540ab8&quot; class=&quot;&quot;&gt;&lt;code&gt;공유자원&lt;/code&gt;은 서로 다른 두 태스크가 각자 처리를 마친 후, 결과가 하나로 취합되어야 하는 경우에 필요합니다.&lt;/p&gt;&lt;p id=&quot;805074b2-ef5f-41af-acb0-ed98ffc064c7&quot; class=&quot;&quot;&gt;하나로 취합하는 경우, 상호 배제 개념이 중요합니다.&lt;/p&gt;&lt;p id=&quot;951bed64-d3ee-40cf-90b1-2443837b6ba7&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;a89f8140-2362-4fde-8fad-0fe8f552f41c&quot;&gt;&lt;h1 id=&quot;45d58b6b-36cc-40a5-8844-92fc39a1a041&quot; class=&quot;&quot;&gt;싱글 테스크 와 멀티 테스크&lt;/h1&gt;&lt;p id=&quot;3aa84280-be3f-442e-921b-2cd16c5a1828&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;e697d6a9-1759-4678-b1da-89e4e251bcec&quot; class=&quot;&quot;&gt;&lt;strong&gt;싱글 태스크&lt;/strong&gt;(&lt;code&gt;싱글 프로세스&lt;/code&gt; + &lt;code&gt;싱글 스레드&lt;/code&gt;) 프로그램이면 문제가 되질 않습니다. 두 태스크는 순차적으로 처리되므로, &lt;code&gt;공유자원&lt;/code&gt;의 동시성 문제가 존재하지 않기 때문입니다.&lt;/p&gt;&lt;p id=&quot;aee952fb-1bcb-47cb-bf06-09df117c0b8b&quot; class=&quot;&quot;&gt;반면에 &lt;strong&gt;멀티 태스크&lt;/strong&gt;(&lt;code&gt;멀티 프로세스&lt;/code&gt; 또는 &lt;code&gt;멀티 스레드&lt;/code&gt;) 프로그램이면 문제가 발생할 수 있습니다. 두 태스크가 동시적으로 처리되면서 &lt;code&gt;공유자원&lt;/code&gt;이 예기치 못한 결과로 취합될 수 있기 때문입니다.&lt;/p&gt;&lt;p id=&quot;446c3f9f-d0bd-4c0d-a03b-a4c6703de6c0&quot; class=&quot;&quot;&gt;다음은 은행 입-출금 기능이 &lt;strong&gt;싱글 태스크&lt;/strong&gt;, &lt;strong&gt;멀티 태스크&lt;/strong&gt;로 구현된 예시입니다.&lt;/p&gt;&lt;p id=&quot;6da96599-7b86-4ba8-8eea-81dcafb4efda&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;787c027a-18e5-4427-9cb8-c2ed69a31f5d&quot; class=&quot;&quot;&gt;싱글 테스크&lt;/h3&gt;&lt;p id=&quot;83288783-193a-46cf-9a20-5a90e7c729ed&quot; class=&quot;&quot;&gt;보유 금액: 50,000 (&lt;code&gt;공유 자원&lt;/code&gt;)&lt;/p&gt;&lt;div id=&quot;2cc50eaf-a289-413e-8f3d-d4ef7f63f0b1&quot; class=&quot;column-list&quot;&gt;&lt;div id=&quot;68e1bf8a-aca1-4694-b56c-270e707503ba&quot; style=&quot;width:50.000000000000014%&quot; class=&quot;column&quot;&gt;&lt;p id=&quot;18feef98-f071-4d40-aab0-11b0be1132d3&quot; class=&quot;&quot;&gt;&lt;strong&gt;입금 태스크&lt;/strong&gt;&lt;/p&gt;&lt;ul id=&quot;ab2b95ec-a13e-42c5-abe1-35f45f90eac2&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;현재 보유된 금액을 조회. (50,000)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;df99195e-9ef4-4669-9c52-23810c0a5f3f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;입금할 금액을 확인 (10,000)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;5871f9f7-fe91-4741-9450-90f0c33ab45c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;입금 처리. (50,000 + 10,000)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id=&quot;3f80c39c-5ae1-4fa0-bbe8-53894ce41ab1&quot; style=&quot;width:50%&quot; class=&quot;column&quot;&gt;&lt;p id=&quot;96e6bbee-40fc-494a-8b76-b4ed93326924&quot; class=&quot;&quot;&gt;&lt;strong&gt;출금 태스크&lt;/strong&gt;&lt;/p&gt;&lt;p id=&quot;a117591a-3286-4859-b13a-fcc701fd0fce&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3aa557e5-0a72-4c6e-ad37-1c529abc54b9&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;22953141-7364-4371-b580-95e90c6f1f85&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;c30dc70e-5fd1-4407-a5eb-87735acf5e7e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;현재 보유된 금액을 조회. (60,000)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;7ee3b019-4be7-4c70-ab23-f4e053187231&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;출금할 금액을 확인 (20,000)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;b8b613ba-11f4-4819-a23c-18b24df502f2&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;출금 처리. (60,000 - 20,000)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;p id=&quot;9d8c2fe5-971e-498f-8e0a-92ba781d5eba&quot; class=&quot;&quot;&gt;&lt;em&gt;최종 보유금액은 &lt;/em&gt;&lt;mark class=&quot;highlight-teal&quot;&gt;&lt;em&gt;40,000&lt;/em&gt;&lt;/mark&gt;&lt;em&gt;(&lt;/em&gt;&lt;mark class=&quot;highlight-orange&quot;&gt;&lt;em&gt;40,000&lt;/em&gt;&lt;/mark&gt;&lt;em&gt;) 이 됩니다.&lt;/em&gt;&lt;/p&gt;&lt;p id=&quot;5d720ef4-17a4-49ca-9410-62de83bd8bf7&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;c8abd67d-8f6a-4f48-b492-4ff27a5b95c1&quot; class=&quot;&quot;&gt;멀티 테스크&lt;/h3&gt;&lt;p id=&quot;9ca1543f-12fc-4b85-955a-16ec0d410a92&quot; class=&quot;&quot;&gt;보유 금액: 50,000 (&lt;code&gt;공유 자원&lt;/code&gt;)&lt;/p&gt;&lt;div id=&quot;ea76fc54-a950-46c0-90b6-d4b1b2c77a0c&quot; class=&quot;column-list&quot;&gt;&lt;div id=&quot;9e37c726-2509-4ac8-bc42-1923673a7440&quot; style=&quot;width:50%&quot; class=&quot;column&quot;&gt;&lt;p id=&quot;6664a637-eb3a-4de4-86ef-927e7ab3bbcc&quot; class=&quot;&quot;&gt;&lt;strong&gt;입금 테스크&lt;/strong&gt;&lt;/p&gt;&lt;ul id=&quot;acffb5ab-602a-481e-aa3c-73fffb14dbf1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;현재 보유된 금액을 조회 (50,000)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;20458126-33d5-4e93-8ff9-321a4e666fb0&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;b9c4faf6-5f34-4f44-b726-392a120716b2&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;입금할 금액을 확인 (10,000)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;21246a6e-4cb1-4029-83d0-cd2c910ea80d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;812bb252-5363-4b0f-95d7-55fcbb7bc855&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;2ecaf2e0-c48a-4e1e-bb8d-a372e688c511&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;입금 처리. (50,000 + 10,000)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;e8510a45-2843-4a63-b5a7-8bcb78f4305f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;4d62055a-9e02-48b0-b2f0-732d97789174&quot; class=&quot;&quot;&gt;&lt;em&gt;최종 보유금액은 &lt;/em&gt;&lt;mark class=&quot;highlight-red&quot;&gt;&lt;em&gt;60,000&lt;/em&gt;&lt;/mark&gt;&lt;em&gt;(&lt;/em&gt;&lt;mark class=&quot;highlight-orange&quot;&gt;&lt;em&gt;40,000&lt;/em&gt;&lt;/mark&gt;&lt;em&gt;) 이 됩니다.&lt;/em&gt;&lt;/p&gt;&lt;p id=&quot;01ced5fc-30d3-460f-a09e-811f4aaab778&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;3242da58-5480-4052-9795-f1fec2279ddf&quot; style=&quot;width:50%&quot; class=&quot;column&quot;&gt;&lt;p id=&quot;ace09249-bf62-4611-8ba7-9aba6ab95cd3&quot; class=&quot;&quot;&gt;&lt;strong&gt;출금 테스크&lt;/strong&gt;&lt;/p&gt;&lt;p id=&quot;b4713d13-9810-40fb-a345-baf802423f86&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;b3eaf2c6-d441-4a53-b198-17e77bb92e27&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;현재 보유된 금액을 조회 (50,000)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;2b3ce101-9bbc-474f-9abb-0f2f11f86758&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;01188126-cf1d-4925-bad2-0c74e2014e7d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;출금할 금액을 확인 (20,000)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;c158c197-a5e9-4d79-8a49-1c3d4b4fcd2c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;출금 처리. (50,000 - 20,000)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr id=&quot;7d1d5f25-b085-4df6-9b8a-dc19ceab0e95&quot;&gt;&lt;h1 id=&quot;de092636-684d-4768-b1f3-644d19f2aa80&quot; class=&quot;&quot;&gt;임계영역&lt;/h1&gt;&lt;p id=&quot;03b60d3e-cb1b-4859-9c38-a508aae69166&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;ca5d30f0-6389-40ec-b330-a08f2bcc814a&quot; class=&quot;&quot;&gt;위 예시에서 살펴봤다시피, &lt;/p&gt;&lt;p id=&quot;73301eb1-5e07-417d-8c82-0b8d49eabd2b&quot; class=&quot;&quot;&gt;멀티 태스크 프로그램을 개발하면, &lt;code&gt;공유자원&lt;/code&gt;을 사용하는 부분을 순차적으로 처리하도록 보장해야 합니다. 이때, 순차적으로 처리해야 하는 부분을 &lt;code&gt;임계영역&lt;/code&gt; 이라 일컫습니다.&lt;/p&gt;&lt;p id=&quot;eee6bc68-13dc-4f2e-90c7-8a29ee8e72ee&quot; class=&quot;&quot;&gt;&lt;code&gt;임계영역&lt;/code&gt; 이 순차적으로 처리될 수 있게 하는 방법은 크게 2가지가 있습니다.&lt;/p&gt;&lt;ul id=&quot;0c51901e-59e0-46c0-8f50-642042033b07&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;뮤텍스(Mutex)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;47442fd1-16e2-42cb-ba56-fd007c1146f9&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;세마포어(Semaphore)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;992ad79f-7320-4c08-8a9e-9f9844f2ed3d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;89674f53-e299-4033-8e8e-3e5b972d2482&quot;&gt;&lt;h1 id=&quot;8048b7e9-5457-437c-967a-4c1638957612&quot; class=&quot;&quot;&gt;뮤텍스&lt;/h1&gt;&lt;p id=&quot;4e2fd771-85db-48d8-a792-c9c8ef8c9804&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;59471629-f56f-48f5-b4af-f8e934665cf1&quot; class=&quot;&quot;&gt;자원의 선점을 통해, 순차 처리를 수행하는 방법입니다.&lt;/p&gt;&lt;p id=&quot;fdded88f-3cdb-41e6-b944-86e21cb744ac&quot; class=&quot;&quot;&gt;이때, 선점될 자원은 하나의 객체로 처리 되며 이를 &lt;code&gt;Lock&lt;/code&gt; 또는 &lt;code&gt;Key&lt;/code&gt; 라고 부릅니다.&lt;/p&gt;&lt;p id=&quot;5532de9a-e7ab-4c2a-be6c-39c0246965ba&quot; class=&quot;&quot;&gt;하나의 태스크가 &lt;code&gt;임계 영역&lt;/code&gt;을 진입할 때, &lt;code&gt;Lock&lt;/code&gt;을 획득하고 진입 하는 방식입니다. 이렇게 되면 다른 태스크들은 &lt;code&gt;Lock&lt;/code&gt;을 획득 할 수 있을때 까지 줄지어서 기다리게 됩니다.&lt;/p&gt;&lt;p id=&quot;c86666c0-bca8-440a-9707-81bbd6bf062d&quot; class=&quot;&quot;&gt;&lt;code&gt;Lock&lt;/code&gt;을 획득한 태스크가 &lt;code&gt;임계 영역&lt;/code&gt;을 처리하고 나면 &lt;code&gt;Lock&lt;/code&gt;을 반납하게 됩니다. 그 후, 대기하던 태스크들 중 하나가 &lt;code&gt;Lock&lt;/code&gt;을 획득하여 &lt;code&gt;임계 영역&lt;/code&gt;을 수행하게 됩니다.&lt;/p&gt;&lt;h3 id=&quot;bcf5a1ef-4203-4027-97c9-dfbfb049b74c&quot; class=&quot;&quot;&gt;뮤텍스는 단일 공유 자원 처리에 적합&lt;/h3&gt;&lt;p id=&quot;c54a3032-b76e-46df-8e89-3a21699dd6ab&quot; class=&quot;&quot;&gt;만약 각 태스크가 &lt;code&gt;공유 자원&lt;/code&gt;이 2개 이상 필요한 경우는 어떨까요? &lt;/p&gt;&lt;p id=&quot;706947ea-541f-41e0-8485-15368a8d141d&quot; class=&quot;&quot;&gt;각 자원에 대한 &lt;code&gt;Lock&lt;/code&gt; 을 생성하고 태스크에 두개의 &lt;code&gt;Lock&lt;/code&gt; 에 대한 처리가 필요하게 됩니다. &lt;/p&gt;&lt;p id=&quot;f744d6fe-ee8e-4a89-8554-34f9c92f9bad&quot; class=&quot;&quot;&gt;이는 &lt;code&gt;공유 자원&lt;/code&gt; 추가로 인해 변경 사항이 모든 테스크에 반영되어야 하므로, 유지보수를 어렵게 만드는 요인이 됩니다.&lt;/p&gt;&lt;p id=&quot;37c76d9a-ebc1-40b5-a73e-a0574ed60e14&quot; class=&quot;&quot;&gt;또한 &lt;code&gt;공유 자원&lt;/code&gt; 개수가 많아 지면 분기 처리도 복잡하고 어려워 지는 문제도 발생합니다.&lt;/p&gt;&lt;p id=&quot;5b44ff64-96fa-408b-9953-fc845ab1be59&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;e778555a-a7ad-420d-b257-2b769d16f734&quot;&gt;&lt;h1 id=&quot;c8078482-ea69-4b6d-8a4d-e1aa03c40b40&quot; class=&quot;&quot;&gt;세마포어&lt;/h1&gt;&lt;p id=&quot;cd553f82-bfbd-485d-bee6-fc36d0f51962&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;5e690d86-2f9f-40cf-bc4e-69b96b7de3de&quot; class=&quot;&quot;&gt;&lt;code&gt;뮤텍스&lt;/code&gt;의 다중 &lt;code&gt;공유 자원&lt;/code&gt; 처리에 대한 단점을 보완한 방법입니다.&lt;/p&gt;&lt;p id=&quot;b68f1f7f-b7f4-4566-9e32-e073e71f1757&quot; class=&quot;&quot;&gt;&lt;code&gt;세마포어&lt;/code&gt;는 하나의 자원에 대한 락킹 개념보다 조금더 나아가, &lt;strong&gt;자원 사용 카운팅&lt;/strong&gt; 기법으로 순차 처리를 보장하는 방법입니다.&lt;/p&gt;&lt;p id=&quot;dfc74faa-9995-4c03-9660-3dc35821dbce&quot; class=&quot;&quot;&gt;테스크가 &lt;code&gt;임계 영역&lt;/code&gt;을 진입할 때, 진입 가능한 숫자를 참고합니다. &lt;/p&gt;&lt;p id=&quot;6e480d30-7852-476e-aa92-b6f3acbab9ad&quot; class=&quot;&quot;&gt;&lt;strong&gt;자원 사용 카운팅&lt;/strong&gt;이 0보다 크다면, 테스크가 &lt;code&gt;임계 영역&lt;/code&gt;을 집입하고 &lt;strong&gt;자원 사용 카운팅&lt;/strong&gt;을 하나 감소시킵니다. &lt;/p&gt;&lt;p id=&quot;84b83053-fdc5-489e-81bf-44de22597e52&quot; class=&quot;&quot;&gt;만약, &lt;strong&gt;자원 사용 카운팅&lt;/strong&gt;이 0이라면 테스크는 추가 카운팅이 생길 때 까지 대기하게 됩니다.&lt;/p&gt;&lt;p id=&quot;f7da4519-574c-4b74-a3a2-b9812fe46700&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;fd68b502-6a6d-46ff-bb45-c77593a41eef&quot;&gt;&lt;h1 id=&quot;77fb2d43-9e31-43a2-a1ea-4a19dce102ce&quot; class=&quot;&quot;&gt;데드락&lt;/h1&gt;&lt;p id=&quot;a1bd0b79-738d-49f2-9a4c-87f570110aa4&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3121859a-7f0b-4179-bbbe-c052acecdcc9&quot; class=&quot;&quot;&gt;앞서 살펴본 2가지 방법은 널리 사용되고 있는 기본적인 개념입니다.&lt;/p&gt;&lt;p id=&quot;28cff3ed-e92a-42a7-b1aa-00576a4aa64f&quot; class=&quot;&quot;&gt;하지만, &lt;code&gt;공유 자원&lt;/code&gt;을 2개 이상 사용하는 &lt;code&gt;임계 영역&lt;/code&gt;을 처리하는 경우 &lt;code&gt;교착 상태&lt;/code&gt;가 발생할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;79eb17da-4c82-4aab-8bf3-04b96d90e3b5&quot; class=&quot;&quot;&gt;&lt;code&gt;공유 자원&lt;/code&gt; &lt;strong&gt;A&lt;/strong&gt;, &lt;strong&gt;B&lt;/strong&gt; 가 있다고 가정할 때, 다음의 &lt;code&gt;뮤텍스&lt;/code&gt; 방법은 &lt;code&gt;교착 상태&lt;/code&gt; 즉, &lt;code&gt;데드락&lt;/code&gt;이 발생할 수 있습니다.&lt;/p&gt;&lt;div id=&quot;1766f215-3a93-4278-b897-ee31dba5a4d9&quot; class=&quot;column-list&quot;&gt;&lt;div id=&quot;dc4c9cd7-a8ab-4554-8b57-c471e65c65a7&quot; style=&quot;width:50%&quot; class=&quot;column&quot;&gt;&lt;p id=&quot;412804a9-83b9-4d25-9e8f-c0ece501ea22&quot; class=&quot;&quot;&gt;&lt;strong&gt;TASK-1&lt;/strong&gt;&lt;/p&gt;&lt;ul id=&quot;2dbb6f4d-960f-4a38-a314-db0788d009a0&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Locking(A)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;50fd7fbd-c150-43de-8896-f8f90d80f648&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Locking(&lt;strong&gt;B&lt;/strong&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id=&quot;c83c9888-d303-4f52-a9ff-39b63722dc45&quot; style=&quot;width:50%&quot; class=&quot;column&quot;&gt;&lt;p id=&quot;2c309c69-1d19-41c9-8e3b-420cd1d83963&quot; class=&quot;&quot;&gt;&lt;strong&gt;TASK-2&lt;/strong&gt;&lt;/p&gt;&lt;ul id=&quot;816d5b50-8b76-4517-b02c-9559d71bb0e9&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Locking(&lt;strong&gt;B&lt;/strong&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;56efdab5-e753-408c-ad34-71de23fc5e15&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Locking(&lt;strong&gt;A&lt;/strong&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;p id=&quot;63010608-0f8e-48b4-9516-fd52aa06af33&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7af8393d-f300-4972-a0b5-921f10cd7d27&quot; class=&quot;&quot;&gt;위 예시는 &lt;strong&gt;TASK-1&lt;/strong&gt;은  &lt;code&gt;공유 자원&lt;/code&gt; &lt;strong&gt;B&lt;/strong&gt;의 락이 해제 되길 기다리고 있으며, 반대로 &lt;strong&gt;TASK-2&lt;/strong&gt;는  &lt;code&gt;공유 자원&lt;/code&gt;&lt;strong&gt;A&lt;/strong&gt;가 해제 되길 기다리고 있습니다. 이는 결국 무한정 대기하게 되는 데드락이 발생하게 됩니다.&lt;/p&gt;&lt;blockquote id=&quot;a3579c2c-cbd9-4a0d-ae68-2a148807d6c4&quot; class=&quot;&quot;&gt;세마포어 기법도 마찬가지로 적용됩니다.&lt;/blockquote&gt;&lt;p id=&quot;2eb58ddb-7ed9-4322-92b3-1f8eb1d2a211&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;68ca0548-520e-441d-8848-b484de8d9b74&quot; class=&quot;&quot;&gt;데드락 해결 방법&lt;/h3&gt;&lt;p id=&quot;0ec8b82c-dab6-49dd-97c1-716b4dd4aef2&quot; class=&quot;&quot;&gt;해결 방법은 여러 가지가 존재하며, 상황에 맞게 처리하는것이 중요합니다.&lt;/p&gt;&lt;p id=&quot;6a3365bc-6261-43d0-b131-1279ca742d16&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;828878a5-adf8-4a21-b66f-6248befbb239&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;타임아웃 설정&lt;p id=&quot;4f92de98-7dbf-4e0c-b6bb-1df684e1b2d9&quot; class=&quot;&quot;&gt;자원의 대기 타임아웃을 설정하여 &lt;code&gt;교착 상태&lt;/code&gt;에 빠진 테스크중 하나를 타임아웃으로 포기하게 하는 방법 입니다. &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;08e699b1-8e65-418d-859c-1239922883b5&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;진입 순서 일치&lt;p id=&quot;c8e887a1-9756-4d2d-9007-3f6f5a3acb80&quot; class=&quot;&quot;&gt;공유자원의 임계영역 진입 처리 순서를 동일하게 하여 자원 요청 방향이 원형을 이루지 않도록 처리하는 방법입니다.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;8797b973-7614-4595-b429-b7d76492c7aa&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;a9d86f49-5eea-4450-906d-6ddbcdec83b5&quot;&gt;&lt;h1 id=&quot;c77984e2-7641-4611-b8e9-0673facfd2cd&quot; class=&quot;&quot;&gt;정리&lt;/h1&gt;&lt;ul id=&quot;89ec766c-df46-4d1a-b97d-fa613af33ce5&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;뮤텍스&lt;/code&gt;는 하나의 락 객체를 통해 &lt;code&gt;임계 영역&lt;/code&gt;이 하나의 태스크만 처리할 수 있도록 고안된 방법입니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;10f6a0ef-47d9-4c69-9f0f-fd601a99c365&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;세마포어&lt;/code&gt;는 공유자원 접근 가능 카운트를 정의해, 정의한 수 만큼 태스크가 처리할 수 있도록 고안된 방법입니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;4e2f1f27-5730-4d25-8351-4e58c2ac7556&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;공유 자원&lt;/code&gt;을 2개 이상 사용하는 &lt;code&gt;임계영역&lt;/code&gt;은 데드락이 발생 할 수 있으므로, 유념해야 합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;83b47984-7764-444e-b1fe-a3913d2f2a5f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;세마포어&lt;/code&gt;의 카운팅을 1로 하면 &lt;code&gt;뮤텍스&lt;/code&gt;와 같은 효과를 누릴 수 있습니다.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;block-color-gray&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>운영체제</category>
      <category>CriticalSection</category>
      <category>mutex</category>
      <category>semaphore</category>
      <category>뮤텍스</category>
      <category>상호배제</category>
      <category>세마포어</category>
      <category>임계영역</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/106</guid>
      <comments>https://mommoo.tistory.com/106#entry106comment</comments>
      <pubDate>Sun, 25 Jul 2021 05:39:00 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 스레드</title>
      <link>https://mommoo.tistory.com/105</link>
      <description>&lt;article id=&quot;8ed9405d-995f-47c2-995e-c2debe727bc4&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;369ef021-07ca-4a07-82a5-952429481785&quot; class=&quot;&quot;&gt;안녕하세요.&lt;/p&gt;&lt;p id=&quot;d3485de3-db84-42fe-ae2c-60008be0c2e2&quot; class=&quot;&quot;&gt;오늘은 &lt;code&gt;스레드&lt;/code&gt;에 대해 포스팅 합니다.&lt;/p&gt;&lt;p id=&quot;7e6f7fd9-f3b5-4dd4-b54a-fa0837eb271c&quot; class=&quot;&quot;&gt;&lt;a href=&quot;https://mommoo.tistory.com/104&quot;&gt;프로세스&lt;/a&gt; 포스팅을 읽고 오시면 좀 더 쉽게 읽으실 수 있습니다.&lt;/p&gt;&lt;p id=&quot;1b8693a8-8eb5-4841-8f13-f863bef79732&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;44ecd463-7160-47db-beb4-a6409c878f27&quot;&gt;&lt;h1 id=&quot;c9b9fcb0-a105-4fcc-b261-d7e984b8b1c7&quot; class=&quot;&quot;&gt;CPU 스레드&lt;/h1&gt;&lt;p id=&quot;bd92c79e-86e6-427c-aec5-da2b0d8ef35c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;695562d8-6651-4a69-a573-faee401e5a0a&quot; class=&quot;&quot;&gt;&lt;strong&gt;CPU&lt;/strong&gt; 하드웨어를 평가할 때 참고하는 많은 정보들이 있습니다.&lt;/p&gt;&lt;p id=&quot;b243e5cd-34fd-42f5-8f82-de0a2f5e3927&quot; class=&quot;&quot;&gt;대표적으로는 아래의 두정보가 있습니다.&lt;/p&gt;&lt;ul id=&quot;7dd61a3d-dcf7-43a7-a42e-e8d39ffd8fa9&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;코어 수&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1c08215c-4e27-43eb-9d89-2181bacb266b&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;스레드 수&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;e2176689-c464-44da-a1bb-e87f3c9d240a&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;fa784a4f-38c9-4560-add8-f80b0ca57270&quot; class=&quot;&quot;&gt;&lt;strong&gt;코어 수&lt;/strong&gt;는 컴퓨터 데이터인 이진수를 계산 할 수 있는 계산기의 갯수 입니다. 이는 하드웨어적인 개념 입니다.&lt;/p&gt;&lt;p id=&quot;7fd73c24-02dc-4e1d-932a-ea83d624ea55&quot; class=&quot;&quot;&gt;&lt;strong&gt;스레드 수&lt;/strong&gt;는 이진수를 계산 할 수 있는 능력입니다. 이는 소프트웨어적인 개념 입니다.&lt;/p&gt;&lt;p id=&quot;8d823eaa-03eb-4e30-9df7-5f1b2c831495&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;96b4a593-78da-4336-9a90-faa50be90848&quot; class=&quot;&quot;&gt;보통은 &lt;strong&gt;코어 수&lt;/strong&gt;가 곧 &lt;strong&gt;스레드 수&lt;/strong&gt; 입니다. 하지만 인텔이 개발한 하이퍼스레딩 같은 기술을 접목하면 각 코어당 2개의 스레드를 사용 할 수 있습니다. &lt;/p&gt;&lt;p id=&quot;a1c70df3-2c62-4f34-85ae-c7901473a488&quot; class=&quot;&quot;&gt;정리하자면 &lt;strong&gt;코어 수&lt;/strong&gt;의 두배인 &lt;strong&gt;스레드 &lt;/strong&gt;를 사용할 수 가 있습니다.&lt;/p&gt;&lt;p id=&quot;7f4f6abf-bbbc-40d8-b6c3-31a511db387c&quot; class=&quot;&quot;&gt;하지만 이해가 잘 안갑니다. 계산기는 하나 인데 어떻게 2배의 처리 능력을 가질 수 있는것일까요?&lt;/p&gt;&lt;p id=&quot;b06101fc-230f-47a9-b335-069e90947954&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;4aa111f0-af29-4fe3-ab8e-1d5d8ffae70b&quot; class=&quot;&quot;&gt;아래의 프로세스 2개가 존재한다고 가정해봅시다.&lt;/p&gt;&lt;div id=&quot;d843a4d5-37e1-4bcd-85be-4f61b2f70d03&quot; class=&quot;collection-content&quot;&gt;&lt;h4 class=&quot;collection-title&quot;&gt;프로세스&lt;/h4&gt;&lt;table class=&quot;collection-content&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 14 14&quot; style=&quot;width:14px;height:14px;display:block;fill:rgba(55, 53, 47, 0.4);flex-shrink:0;-webkit-backface-visibility:hidden&quot; class=&quot;typesTitle&quot;&gt;&lt;path d=&quot;M7.73943662,8.6971831 C7.77640845,8.7834507 7.81338028,8.8943662 7.81338028,9.00528169 C7.81338028,9.49823944 7.40669014,9.89260563 6.91373239,9.89260563 C6.53169014,9.89260563 6.19894366,9.64612676 6.08802817,9.30105634 L5.75528169,8.33978873 L2.05809859,8.33978873 L1.72535211,9.30105634 C1.61443662,9.64612676 1.2693662,9.89260563 0.887323944,9.89260563 C0.394366197,9.89260563 0,9.49823944 0,9.00528169 C0,8.8943662 0.0246478873,8.7834507 0.0616197183,8.6971831 L2.46478873,2.48591549 C2.68661972,1.90669014 3.24119718,1.5 3.90669014,1.5 C4.55985915,1.5 5.12676056,1.90669014 5.34859155,2.48591549 L7.73943662,8.6971831 Z M2.60035211,6.82394366 L5.21302817,6.82394366 L3.90669014,3.10211268 L2.60035211,6.82394366 Z M11.3996479,3.70598592 C12.7552817,3.70598592 14,4.24823944 14,5.96126761 L14,9.07922535 C14,9.52288732 13.6549296,9.89260563 13.2112676,9.89260563 C12.8169014,9.89260563 12.471831,9.59683099 12.4225352,9.19014085 C12.028169,9.6584507 11.3257042,9.95422535 10.5492958,9.95422535 C9.60035211,9.95422535 8.47887324,9.31338028 8.47887324,7.98239437 C8.47887324,6.58978873 9.60035211,6.08450704 10.5492958,6.08450704 C11.3380282,6.08450704 12.040493,6.33098592 12.4348592,6.81161972 L12.4348592,5.98591549 C12.4348592,5.38204225 11.9172535,4.98767606 11.1285211,4.98767606 C10.6602113,4.98767606 10.2411972,5.11091549 9.80985915,5.38204225 C9.72359155,5.43133803 9.61267606,5.46830986 9.50176056,5.46830986 C9.18133803,5.46830986 8.91021127,5.1971831 8.91021127,4.86443662 C8.91021127,4.64260563 9.0334507,4.44542254 9.19366197,4.34683099 C9.87147887,3.90316901 10.6232394,3.70598592 11.3996479,3.70598592 Z M11.1778169,8.8943662 C11.6830986,8.8943662 12.1760563,8.72183099 12.4348592,8.37676056 L12.4348592,7.63732394 C12.1760563,7.29225352 11.6830986,7.11971831 11.1778169,7.11971831 C10.5616197,7.11971831 10.056338,7.45246479 10.056338,8.0193662 C10.056338,8.57394366 10.5616197,8.8943662 11.1778169,8.8943662 Z M0.65625,11.125 L13.34375,11.125 C13.7061869,11.125 14,11.4188131 14,11.78125 C14,12.1436869 13.7061869,12.4375 13.34375,12.4375 L0.65625,12.4375 C0.293813133,12.4375 4.43857149e-17,12.1436869 0,11.78125 C-4.43857149e-17,11.4188131 0.293813133,11.125 0.65625,11.125 Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;이름&lt;/th&gt;&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 14 14&quot; style=&quot;width:14px;height:14px;display:block;fill:rgba(55, 53, 47, 0.4);flex-shrink:0;-webkit-backface-visibility:hidden&quot; class=&quot;typesText&quot;&gt;&lt;path d=&quot;M7,4.56818 C7,4.29204 6.77614,4.06818 6.5,4.06818 L0.5,4.06818 C0.223858,4.06818 0,4.29204 0,4.56818 L0,5.61364 C0,5.88978 0.223858,6.11364 0.5,6.11364 L6.5,6.11364 C6.77614,6.11364 7,5.88978 7,5.61364 L7,4.56818 Z M0.5,1 C0.223858,1 0,1.223858 0,1.5 L0,2.54545 C0,2.8216 0.223858,3.04545 0.5,3.04545 L12.5,3.04545 C12.7761,3.04545 13,2.8216 13,2.54545 L13,1.5 C13,1.223858 12.7761,1 12.5,1 L0.5,1 Z M0,8.68182 C0,8.95796 0.223858,9.18182 0.5,9.18182 L11.5,9.18182 C11.7761,9.18182 12,8.95796 12,8.68182 L12,7.63636 C12,7.36022 11.7761,7.13636 11.5,7.13636 L0.5,7.13636 C0.223858,7.13636 0,7.36022 0,7.63636 L0,8.68182 Z M0,11.75 C0,12.0261 0.223858,12.25 0.5,12.25 L9.5,12.25 C9.77614,12.25 10,12.0261 10,11.75 L10,10.70455 C10,10.4284 9.77614,10.20455 9.5,10.20455 L0.5,10.20455 C0.223858,10.20455 0,10.4284 0,10.70455 L0,11.75 Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;걸리는 시간&lt;/th&gt;&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 14 14&quot; style=&quot;width:14px;height:14px;display:block;fill:rgba(55, 53, 47, 0.4);flex-shrink:0;-webkit-backface-visibility:hidden&quot; class=&quot;typesText&quot;&gt;&lt;path d=&quot;M7,4.56818 C7,4.29204 6.77614,4.06818 6.5,4.06818 L0.5,4.06818 C0.223858,4.06818 0,4.29204 0,4.56818 L0,5.61364 C0,5.88978 0.223858,6.11364 0.5,6.11364 L6.5,6.11364 C6.77614,6.11364 7,5.88978 7,5.61364 L7,4.56818 Z M0.5,1 C0.223858,1 0,1.223858 0,1.5 L0,2.54545 C0,2.8216 0.223858,3.04545 0.5,3.04545 L12.5,3.04545 C12.7761,3.04545 13,2.8216 13,2.54545 L13,1.5 C13,1.223858 12.7761,1 12.5,1 L0.5,1 Z M0,8.68182 C0,8.95796 0.223858,9.18182 0.5,9.18182 L11.5,9.18182 C11.7761,9.18182 12,8.95796 12,8.68182 L12,7.63636 C12,7.36022 11.7761,7.13636 11.5,7.13636 L0.5,7.13636 C0.223858,7.13636 0,7.36022 0,7.63636 L0,8.68182 Z M0,11.75 C0,12.0261 0.223858,12.25 0.5,12.25 L9.5,12.25 C9.77614,12.25 10,12.0261 10,11.75 L10,10.70455 C10,10.4284 9.77614,10.20455 9.5,10.20455 L0.5,10.20455 C0.223858,10.20455 0,10.4284 0,10.70455 L0,11.75 Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;데이터&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr id=&quot;b178231e-e873-45cc-bc35-3e001c9abfa2&quot;&gt;&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/A-b178231ee87345ccbc353e001c9abfa2&quot;&gt;A&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;cell-pthq&quot;&gt;10초&lt;/td&gt;&lt;td class=&quot;cell-Y?{l&quot;&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1111111111&lt;/strong&gt;&lt;/mark&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id=&quot;9c326a01-5db0-491b-9984-b69efb7f94bc&quot;&gt;&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/B-9c326a015db0491b9984b69efb7f94bc&quot;&gt;B&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;cell-pthq&quot;&gt;4초&lt;/td&gt;&lt;td class=&quot;cell-Y?{l&quot;&gt;&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0000&lt;/strong&gt;&lt;/mark&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p id=&quot;b32f5d19-4e99-43a6-90b0-fb83237ca57d&quot; class=&quot;&quot;&gt;&lt;strong&gt;1코어 1스레드&lt;/strong&gt;는 두 프로세스를 마치는 시간은 &lt;strong&gt;14초&lt;/strong&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;503e1a82-1fd1-426b-a2ee-5a5c53a1665a&quot; class=&quot;&quot;&gt;&lt;strong&gt;A&lt;/strong&gt; 프로세스가 선 처리되던 (&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1111111111&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0000&lt;/strong&gt;&lt;/mark&gt;) &lt;/p&gt;&lt;p id=&quot;daae88c1-1ed5-4ca8-a7c6-34e78d854bcc&quot; class=&quot;&quot;&gt;&lt;strong&gt;B&lt;/strong&gt; 프로세스가 선 처리되던 (&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0000&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1111111111&lt;/strong&gt;&lt;/mark&gt;) 간에 총 처리 시간은 같습니다. &lt;/p&gt;&lt;p id=&quot;5ee8eeee-afac-40e3-8c13-9d6fe90eabc4&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;4236212e-0b54-492d-a24b-509380752377&quot; class=&quot;&quot;&gt;하지만 &lt;strong&gt;B&lt;/strong&gt; 프로세스의 처리 결과를 기다리는 사용자가 느끼는 경험은 많이 다릅니다.&lt;/p&gt;&lt;p id=&quot;098004c8-0d24-4263-9671-3050bcae5976&quot; class=&quot;&quot;&gt;첫번째 경우는 &lt;strong&gt;B&lt;/strong&gt; 프로세스가 처리 될 때까지 걸린시간은 &lt;strong&gt;14초&lt;/strong&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;c72d4d73-8d34-40ba-9132-4ef3a5ea7549&quot; class=&quot;&quot;&gt;반면에 두번째 경우는 &lt;strong&gt;4초&lt;/strong&gt;가 걸렸습니다.&lt;/p&gt;&lt;p id=&quot;ac5c188f-d774-40df-bd48-528027302f34&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;019ff6fe-98b6-4f9a-8072-4a1d12131dd4&quot; class=&quot;&quot;&gt;이렇게, 처리시간이 긴 프로세스가 존재하면 상대적으로 다른 프로세스들이 늦게 끝나게 되는 경우가 발생하게 되고 이는 사용자가 여러가지 프로그램을 동시적으로 처리하는데 어려움을 느낄 수 있다는 것입니다.&lt;/p&gt;&lt;p id=&quot;360dfd8e-71d0-418a-b45d-8d713d6c9d83&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;877207d4-c3d6-498f-8a64-5d16623d443a&quot; class=&quot;&quot;&gt;반면에 &lt;strong&gt;1코어 2스레드&lt;/strong&gt;는 어떻게 처리할까요? 아래와 같이 처리합니다.&lt;/p&gt;&lt;p id=&quot;751647cb-33d4-418b-856f-e8a2bcf66be8&quot; class=&quot;&quot;&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-yellow&quot;&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/mark&gt;&lt;mark class=&quot;highlight-blue&quot;&gt;&lt;strong&gt;111111&lt;/strong&gt;&lt;/mark&gt;&lt;/p&gt;&lt;p id=&quot;1faa3dcc-9222-4247-bc7e-9bdd70e9730b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;c267672a-ea8b-445e-8f18-c14691bd5db1&quot; class=&quot;&quot;&gt;&lt;strong&gt;CPU&lt;/strong&gt; 입장에서 총 처리시간은 1스레드와 같은 1&lt;strong&gt;4초&lt;/strong&gt;입니다.&lt;/p&gt;&lt;p id=&quot;c96240b3-9753-49bd-9804-0771d2fc6d3a&quot; class=&quot;&quot;&gt;하지만 B프로세스는 &lt;strong&gt;8초&lt;/strong&gt;가 걸리게 됩니다. 최악의 경우인 &lt;strong&gt;14초&lt;/strong&gt; 보다 거의 2배 가량 감소하게 되었습니다.&lt;/p&gt;&lt;p id=&quot;f4adbd61-7c6f-4757-80a5-c73350e49c1b&quot; class=&quot;&quot;&gt;더군다나 이렇게 나누어 처리하게 된다면 여러가지 프로그램이 동시적으로 조금씩 처리되고 사용자 입장에서는 여러 프로그램이 버벅임 없이 처리되는것을 경험하게 됩니다.&lt;/p&gt;&lt;p id=&quot;eb6bb473-24fd-4984-aca5-27286c75eef8&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;6c377424-11c3-4353-b8ae-48035e4f678e&quot; class=&quot;&quot;&gt;정리하자면, 스레드는 데이터를 병렬로 처리하는 능력을 의미합니다.&lt;/p&gt;&lt;p id=&quot;aa7bffca-4b09-4495-bac1-7a3ab925a67d&quot; class=&quot;&quot;&gt;이 때, 착각하면 안되는 것은 &lt;strong&gt;CPU&lt;/strong&gt; 입장에서는 총 처리 시간은 변함없다는 점 입니다.&lt;/p&gt;&lt;p id=&quot;79aa720d-0ccb-4822-b570-c628c0359b87&quot; class=&quot;&quot;&gt;&lt;strong&gt;CPU&lt;/strong&gt; 하드웨어 입장에서 총 처리 시간을 줄이는 방법은 코어 갯수를 늘리는 방법 뿐입니다.&lt;/p&gt;&lt;p id=&quot;dcf37dc0-7023-4cec-bd78-10183be9e368&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;78492129-0da0-4811-a1c9-0a89723206d8&quot;&gt;&lt;h1 id=&quot;ad436c49-c922-46e7-831c-03c799bfad24&quot; class=&quot;&quot;&gt;프로세스 스레드&lt;/h1&gt;&lt;p id=&quot;056e9910-af93-4d36-9af4-cbdca14fa250&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3e407d78-b24b-46c2-bbb7-14e04afd0a88&quot; class=&quot;&quot;&gt;&lt;code&gt;CPU 스레드&lt;/code&gt;는 일을 처리할 수 있는 능력이라 소개했습니다. 운영체제는 &lt;code&gt;프로세스&lt;/code&gt;를 &lt;strong&gt;CPU&lt;/strong&gt; &lt;code&gt;스레드&lt;/code&gt;에게 할당하는 작업을 합니다. &lt;/p&gt;&lt;p id=&quot;a0438589-2f26-40bb-a2b4-0244bbed9191&quot; class=&quot;&quot;&gt;CPU가 2개의 &lt;code&gt;스레드&lt;/code&gt;를 제공한다고 가정 할 때, &lt;code&gt;프로세스&lt;/code&gt;를 2개만 처리하는 것으로 착각 할 수 있습니다. 이는 잘못된 개념이며 쉽게 설명하자면, 2개의 계산기가 있고 여러 사람(=프로세스)이 돌려 사용하는것을 의미합니다.&lt;/p&gt;&lt;p id=&quot;b0583385-23ad-415c-9cd5-f504d2e718a5&quot; class=&quot;&quot;&gt;위에서 소개한 예시처럼 컴퓨터는&lt;code&gt;CPU 스케줄링&lt;/code&gt; 을 통해 여러 &lt;code&gt;프로세스&lt;/code&gt;들을 N개의 &lt;strong&gt;CPU&lt;/strong&gt; &lt;code&gt;스레드&lt;/code&gt; 에 일을 돌아가면서 할당 합니다.&lt;/p&gt;&lt;p id=&quot;f6a3718a-c7b8-48c4-8449-635ba5a27b16&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;d96062af-739d-495e-91c3-0f31ed74de69&quot; class=&quot;&quot;&gt;이때, 운영체제가 정의하는 &lt;strong&gt;스레드&lt;/strong&gt; 의 개념은 &lt;code&gt;프로세스&lt;/code&gt; 내부의 작업 단위로 사용됩니다. &lt;/p&gt;&lt;p id=&quot;33ed5ebe-6f28-4030-a114-ded58c5a2885&quot; class=&quot;&quot;&gt;특정 &lt;code&gt;프로세스&lt;/code&gt;가 &lt;strong&gt;CPU&lt;/strong&gt;에게 선택받는다고 해서, &lt;strong&gt;CPU&lt;/strong&gt;는 무조건적으로 일을 진행하지 않습니다. 예를 들어, 해당 &lt;code&gt;프로세스&lt;/code&gt;가 IO 인터럽트가 걸려있으면 &lt;strong&gt;CPU&lt;/strong&gt;는 해당 &lt;code&gt;프로세스&lt;/code&gt; 를 처리하지 않고 대기 큐에 보내 버리지요.&lt;/p&gt;&lt;p id=&quot;2e9453b1-af32-4ab2-a355-8208716de007&quot; class=&quot;&quot;&gt;프로세스 입장에서는 억울 할 수 있습니다. IO 인터럽트 처리 다음에도 해야할 일이 많을 수도 있을테니깐요. 이 때, 다중 &lt;code&gt;스레드&lt;/code&gt;를 이용하면 해당 이슈를 개선할 수 있습니다. &lt;/p&gt;&lt;p id=&quot;d46a520b-70cf-48ea-ab84-d8114d0f6805&quot; class=&quot;&quot;&gt;&lt;code&gt;A 스레드&lt;/code&gt;는 IO 인터럽트를 처리하게 하고, &lt;code&gt;B 스레드&lt;/code&gt;는 &lt;strong&gt;CPU&lt;/strong&gt;가 진행 할 수 있는 일을 처리하게 했다고 가정해봅시다. &lt;/p&gt;&lt;p id=&quot;7bc5b05c-30f3-4715-acac-5561464b7608&quot; class=&quot;&quot;&gt;&lt;strong&gt;CPU&lt;/strong&gt;는 해당 &lt;code&gt;프로세스&lt;/code&gt;를 선택했을 때, &lt;code&gt;스레드&lt;/code&gt; 단위로 살펴보게 되고 처리할 수 있는 &lt;code&gt;스레드&lt;/code&gt;가 있다면 해당 작업을 진행하게 됩니다.&lt;/p&gt;&lt;p id=&quot;9cebb6a2-5949-4991-a87f-c2820805a487&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;368014bc-5cda-441a-8eb0-0c3fb8752cd0&quot; class=&quot;&quot;&gt;정리하자면, 다중 &lt;code&gt;스레드&lt;/code&gt;로 프로그래밍을 진행하게 된다면 &lt;strong&gt;CPU&lt;/strong&gt;에게 일을 처리 받을 확률이 높아짐을 의미합니다.&lt;/p&gt;&lt;p id=&quot;c16ce55a-716c-4298-8528-27e768548be4&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;1203c6b8-0a49-427b-8cd5-a179903dc9b2&quot;&gt;&lt;h1 id=&quot;2e406616-383f-4908-8770-e7c65b18fc00&quot; class=&quot;&quot;&gt;프로세스 스레드 특징&lt;/h1&gt;&lt;p id=&quot;80710248-72f0-4a3f-9d94-57cc995ed688&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;6e889af3-017a-40ff-837e-0e0dd9be4f93&quot; class=&quot;&quot;&gt;&lt;code&gt;프로세스&lt;/code&gt; 는 CODE, DATA, STACK, HEAP 영역을 가지게 됩니다. &lt;/p&gt;&lt;blockquote id=&quot;e45d8490-71ac-470a-9359-e1f788140b40&quot; class=&quot;&quot;&gt;STACK은 명령어가 수행되기 위한 작업 공간입니다.&lt;/blockquote&gt;&lt;p id=&quot;f100d22f-1e54-4ad6-86ef-14114716348d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;01ea3142-b92c-4ebb-868d-a7eebc643aa4&quot; class=&quot;&quot;&gt;스레드의 개별 STACK&lt;/h3&gt;&lt;p id=&quot;c5c197ef-036e-4b84-92e9-1fc5721ebf1e&quot; class=&quot;&quot;&gt;프로세스 내부에 스레드를 만들게 되면 각 스레드는 개별 STACK 영역을 가지게 됩니다.&lt;/p&gt;&lt;p id=&quot;d96070bd-fdb0-40fd-a71b-6ea20f9955cf&quot; class=&quot;&quot;&gt;즉, 스레드가 3개인 &lt;code&gt;프로세스&lt;/code&gt;는 3개의 STACK 공간을 가지게 되는것이지요.&lt;/p&gt;&lt;p id=&quot;7eef313e-e07f-4be6-a5ba-f00b224ab4d0&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;761bf5f8-b434-4d05-9f7d-dc6c888e0498&quot; class=&quot;&quot;&gt;이러한 개별 스택 공간을 통해 &lt;strong&gt;CPU&lt;/strong&gt;는 독립적인 단위로 처리하는것이 가능해집니다.&lt;/p&gt;&lt;p id=&quot;b84201ef-e2da-40a9-a29b-f7e34eebc20c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;1cd35be9-a471-4b67-bb8b-6140ade0aa08&quot; class=&quot;&quot;&gt;스레드간 통신&lt;/h3&gt;&lt;p id=&quot;a5427ebc-baa5-47aa-8cd1-1c04ef950e74&quot; class=&quot;&quot;&gt;&lt;code&gt;프로세스&lt;/code&gt;의 CODE, DATA, HEAP 영역은 &lt;code&gt;스레드&lt;/code&gt; 끼리 공유하게 됩니다.&lt;/p&gt;&lt;p id=&quot;a276f19e-e80e-41e4-8a24-3a6bce8db0bf&quot; class=&quot;&quot;&gt;그로인해, 스레드간 데이터 통신은 프로세스간 데이터 통신보다 쉽게 처리할 수 있는 특징이 있습니다.&lt;/p&gt;&lt;blockquote id=&quot;4b31e6ec-860e-4c69-9601-47a32b0058d7&quot; class=&quot;&quot;&gt;자바와 같은 프로그래밍 언어를 이용해 코딩해보면 서로 다른 스레드를 처리 할 때, 특정 변수등을 같이 사용할 수 있습니다.&lt;/blockquote&gt;&lt;blockquote id=&quot;5e8b33d7-4441-4137-a526-0e628e9ff708&quot; class=&quot;&quot;&gt;프로세스간 데이터 통신은 파일 통신(소켓 통신)이 베이스가 되어야 합니다.&lt;/blockquote&gt;&lt;p id=&quot;8d479962-8b4a-4569-88f7-824aa4f5fce5&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7b42387f-2a4d-42b1-b491-c69e746a3972&quot; class=&quot;&quot;&gt;하지만, 데이터를 공유한다는 것은 그만큼 동기화 문제가 발생할 확률로 높습니다.&lt;/p&gt;&lt;p id=&quot;2553a6c5-0be6-4914-8b43-f8c8cf17e7aa&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;20a527a0-9aef-41f3-b999-8afe6d16e374&quot;&gt;&lt;h1 id=&quot;60a9111d-cdca-44c6-8ca6-fdd8c2f8bc0c&quot; class=&quot;&quot;&gt;멀티 프로세스 방식과 멀티 스레드 방식&lt;/h1&gt;&lt;p id=&quot;77a1c932-77d2-4d30-ab22-67b74ea68508&quot; class=&quot;&quot;&gt;프로그램을 만들 때, &lt;strong&gt;CPU&lt;/strong&gt;에게 최대한 많은 일 처리를 받기 위해 사용하는 방식은 크게 두가지 입니다.&lt;/p&gt;&lt;ul id=&quot;621e1da7-0452-4ae6-82ca-2c8991660060&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;멀티 프로세스 프로그래밍&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;bfa2aa3b-0f66-41e7-be85-a10ab6d3186c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;멀티 스레드 프로그래밍&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;4cff91c3-a35c-4c79-a7ee-b1d40ad63658&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;31ea9dbc-b7df-480e-8c64-009a71bd3d89&quot; class=&quot;&quot;&gt;&lt;code&gt;멀티 프로세스&lt;/code&gt; 방식은 루트 &lt;code&gt;프로세스&lt;/code&gt;가 존재하고, 일처리를 다수의 자식 &lt;code&gt;프로세스&lt;/code&gt;에게 나누어 처리하여 취합하는 방식입니다.&lt;/p&gt;&lt;p id=&quot;4d69c8e8-5f5f-4860-aaaa-c5b1969e7297&quot; class=&quot;&quot;&gt;장점은 독립성을 보장받을 수 있다는 점 입니다.&lt;/p&gt;&lt;p id=&quot;0f787f1e-13e8-4c05-b9de-b4764be4273a&quot; class=&quot;&quot;&gt;하나의 프로세스가 문제가 생기더라도 다른 프로세스에게 영향을 주지 않습니다.&lt;/p&gt;&lt;p id=&quot;1e4ea61f-7b9f-44d2-be65-0bb3bfe445f0&quot; class=&quot;&quot;&gt;단점은 데이터 통신에 많은 자원을 소비한다는 점입니다. &lt;strong&gt;컨텍스트 스위칭&lt;/strong&gt;에 따른 성능 저하가 대표적입니다.&lt;/p&gt;&lt;p id=&quot;ebd65b57-57ec-4810-8843-6a8ff45a21af&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;babba3c0-f213-4929-a541-7395f44fbf91&quot; class=&quot;&quot;&gt;&lt;code&gt;멀티 스레드&lt;/code&gt; 방식은 하나의 &lt;code&gt;프로세스&lt;/code&gt; 에 다수의 스레드(스택)에게 나누어 처리한 후 취합하는 방식입니다.&lt;/p&gt;&lt;p id=&quot;706aaffd-6125-41d4-a857-6e805e542913&quot; class=&quot;&quot;&gt;장점은 데이터 통신이 상대적으로 쉽고, 빠르고, 비용이 적습니다.&lt;/p&gt;&lt;p id=&quot;75239731-7d61-43b5-ad3c-29de2cad83bb&quot; class=&quot;&quot;&gt;단점은 데이터를 공유하기 쉬우므로, 동기화 문제가 빈번하게 발생 할 수 있고 특정 &lt;code&gt;스레드&lt;/code&gt;가 문제가 생기면 전체 &lt;code&gt;프로세스&lt;/code&gt;에 영향을 줄 수 있습니다.&lt;/p&gt;&lt;p id=&quot;fe193c81-97fe-42ea-acee-986aafdc3cdb&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;d108c548-c30f-4052-95c6-6c6cdc00e9a4&quot;&gt;&lt;p id=&quot;d61e966d-2895-4c75-8903-96bc234182dd&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;691c889c-36f5-400b-93f3-5d8ac7bbd055&quot; class=&quot;&quot;&gt;오늘 포스팅은 여기까지 입니다.&lt;/p&gt;&lt;p id=&quot;9793c2ec-914a-439a-bf5f-e06cac576413&quot; class=&quot;&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>운영체제</category>
      <category>cpu</category>
      <category>pcb</category>
      <category>멀티스레드</category>
      <category>스레드</category>
      <category>운영체제</category>
      <category>코어</category>
      <category>프로세스</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/105</guid>
      <comments>https://mommoo.tistory.com/105#entry105comment</comments>
      <pubDate>Thu, 22 Jul 2021 00:16:08 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 프로세스</title>
      <link>https://mommoo.tistory.com/104</link>
      <description>&lt;article id=&quot;7bf1fa9e-724d-4a8e-bc17-eb9dfb60cea3&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;p id=&quot;a77d71ed-856e-4c76-abaa-761c207f8df7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;/p&gt;
&lt;p class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 프로세스에 대해 포스팅합니다.&lt;/p&gt;
&lt;h1 id=&quot;88c475cb-0de1-4720-93bb-88fe7bf18302&quot; class=&quot;&quot;&gt;프로그램과 프로세스&lt;/h1&gt;
&lt;p id=&quot;eab5ad91-4c0c-4261-bc78-34fe7880a2ce&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;ada51e2e-c029-4a97-8f36-461f0b490d5d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터에서 &lt;code&gt;프로그램&lt;/code&gt; 이란 단어는 매우 많이 사용되고 있습니다.&lt;/p&gt;
&lt;p id=&quot;7f496779-3386-4777-9523-6a50d0a5cee7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;반면에 &lt;code&gt;프로세스&lt;/code&gt; 라는 용어는 생각보다 생소합니다. 운영체제에서는 두가지 단어의 개념을 구분해서 사용할 줄 알아야 합니다.&lt;/p&gt;
&lt;h3 id=&quot;0e53f66b-4e40-4f2b-9b52-d09932944cfc&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;프로그램&lt;/h3&gt;
&lt;p id=&quot;c8060c9b-b998-4ce1-bb02-832a2b48cef3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;하드디스크에 저장되어 있는 일련의 데이터 덩어리를 &lt;b&gt;파일&lt;/b&gt; 이라고 일컫습니다. &lt;b&gt;CPU&lt;/b&gt;가 해석하고 수행할 수 있는 명령어 데이터로 구성된 &lt;b&gt;파일&lt;/b&gt;을 &lt;code&gt;프로그램&lt;/code&gt; 이라고 합니다. &lt;b&gt;이미지 파일&lt;/b&gt;과 같은 순수 데이터는 &lt;code&gt;프로그램&lt;/code&gt;이라 할 수 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;e5594422-fd01-40f1-9ec0-e158a13686fb&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;프로세스&lt;/h3&gt;
&lt;p id=&quot;ff7a8159-5dd2-41b2-9a94-f2598b599e00&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;하드디스크에 저장되어 있는 &lt;code&gt;프로그램&lt;/code&gt; 을 CPU가 수행하기 위해서는 하드디스크에 위치한 데이터를 메모리로 옮기는 작업이 필요합니다. 메모리에 옮겨진 일련의 데이터 덩어리를 &lt;code&gt;프로세스&lt;/code&gt; 라고 일컫습니다.&lt;/p&gt;
&lt;p id=&quot;48822171-7ed1-47ec-871b-931c4b0e598a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;36c62c6e-d3b2-4dc2-a87c-4ad3d47ee542&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;정리하자면 &lt;code&gt;프로세스&lt;/code&gt; 는 &lt;code&gt;프로그램&lt;/code&gt; 이 메모리에 옮겨진 데이터 덩어리를 의미합니다.&lt;/p&gt;
&lt;p id=&quot;4fde201f-fad7-42ce-b1aa-375bb5708f60&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;그러므로 &lt;code&gt;프로세스&lt;/code&gt; 는 &lt;code&gt;실행 중인 프로그램&lt;/code&gt; 이라고도 불립니다.&lt;/p&gt;
&lt;p id=&quot;0f40877c-9610-44da-ae81-0b3fcb6eded6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr id=&quot;41bd2f64-59a0-4c4c-83b8-d2b357cd93c7&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 id=&quot;96e068ed-3138-44bf-bfc6-958a26503cf4&quot; class=&quot;&quot;&gt;프로세스 구조&lt;/h1&gt;
&lt;p id=&quot;adba44ca-0b07-4c8f-91f4-a5e96e535d4d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;32b54b89-2df9-4045-a3db-6f8ac397c44f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;사실 &lt;code&gt;프로세스&lt;/code&gt;가 &lt;code&gt;프로그램&lt;/code&gt; 데이터 그대로 메모리에 복사되는건 아닙니다.&lt;/p&gt;
&lt;p id=&quot;7f40bbd6-104e-45e4-8a1d-507ee2eded31&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;OS가 &lt;code&gt;프로그램&lt;/code&gt; 을 분석하여, 아래와 같은 &lt;code&gt;프로세스&lt;/code&gt; 구조를 만듭니다.&lt;/p&gt;
&lt;p id=&quot;3d612f66-15ce-4bf9-bd79-b070ea2c7816&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;716&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kMSJC/btq93od3W9n/kteF8rcr0VDy60nS6j93gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kMSJC/btq93od3W9n/kteF8rcr0VDy60nS6j93gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kMSJC/btq93od3W9n/kteF8rcr0VDy60nS6j93gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkMSJC%2Fbtq93od3W9n%2FkteF8rcr0VDy60nS6j93gK%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;716&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h3 id=&quot;3d119480-fe8e-4340-8207-768dff569616&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;CODE&lt;/h3&gt;
&lt;p id=&quot;77bda4a2-c339-4acf-9e35-782d44048219&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;하드디스크에서 읽어온 &lt;code&gt;프로그램&lt;/code&gt; 데이터가 저장되는 영역입니다.&lt;/p&gt;
&lt;p id=&quot;c1fb2b84-b536-489b-8165-48b27f8373a5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;CPU가 명령어를 수행하기 위해 사용됩니다.&lt;/p&gt;
&lt;p id=&quot;1fbe9f39-08b5-453e-9f68-db9bf1e72e6b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;cc2852d8-3797-4942-b7ad-98262b809f59&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;DATA&lt;/h3&gt;
&lt;p id=&quot;61f99449-8aab-4588-9599-aa114851506b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로세스&lt;/code&gt; 가 수행되면서 필요한 데이터들이 저장되는 영역입니다.&lt;/p&gt;
&lt;p id=&quot;be76d4a5-9144-4376-bc3b-681f33ee2f0f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;OS가 &lt;code&gt;프로그램&lt;/code&gt; 을 분석하면서 사전에 정의할 수 있는 데이터만 저장됩니다.&lt;/p&gt;
&lt;p id=&quot;8a320173-9027-4966-bb8b-d17b42ec36d1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로세스&lt;/code&gt; 가 수행(함수와 같은)되면서 생성되는 데이터들은 사전에 저장하지 못합니다.&lt;/p&gt;
&lt;p id=&quot;d8957e57-55cd-448c-a143-c91bcbdb667a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;9734b5e0-f438-4651-a4f6-4e7085cc738a&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;STACK&lt;/h3&gt;
&lt;p id=&quot;1504bb69-e0f6-44b5-854d-d412799621b2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로세스&lt;/code&gt; 의 명령어가 수행될 때 필요한 공간으로 사용됩니다.&lt;/p&gt;
&lt;p id=&quot;d697706a-7450-4973-ad0d-4c327742442e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;함수의 콜스택 지역변수 데이터들이 적재됩니다.&lt;/p&gt;
&lt;p id=&quot;58b74bf5-f62d-4ba6-96bf-49287c76d77a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;21731063-a88a-480d-a8ba-fd1745805fa1&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;HEAP&lt;/h3&gt;
&lt;p id=&quot;c5a12905-c30e-4f80-adff-2d94a587279b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;STACK&lt;/code&gt; 은 공간을 사용한 후 데이터가 소멸 됩니다.&lt;/p&gt;
&lt;p id=&quot;a8b58699-28ec-4c2c-ae36-82c9e44ddf13&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;반면에 &lt;code&gt;HEAP&lt;/code&gt; 공간은 데이터가 소멸되지 않습니다. 소멸시키기 위해서는 추가적인 소멸 명령어가 필요합니다.&lt;/p&gt;
&lt;p id=&quot;3f76441a-622a-4fa7-b058-df86a0a3b733&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;CODE&lt;/code&gt;, &lt;code&gt;DATA&lt;/code&gt;와 다르게 필요한 공간을 미리 계산할 수 없는 &lt;code&gt;STACK&lt;/code&gt; 과 &lt;code&gt;HEAP&lt;/code&gt;은 임의의 크기가 정해진 공간을 같이 사용합니다. 따라서, &lt;code&gt;STACK&lt;/code&gt; 또는 &lt;code&gt;HEAP&lt;/code&gt; 메모리 사용량이 매우 많아지면 여유 공간이 없어 문제가 발생할 수 있습니다. &lt;code&gt;STACK&lt;/code&gt; 공간을 과도하게 사용할 때는 &lt;b&gt;StackOverflow&lt;/b&gt;, &lt;code&gt;HEAP&lt;/code&gt; 공간을 과도하게 사용할 때는 &lt;b&gt;OutOfMemery(OOM)&lt;/b&gt; 과 같은 에러가 발생할 수 있습니다.&lt;/p&gt;
&lt;p id=&quot;aca1af37-6043-4bff-998a-7aabd3c203a4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr id=&quot;4ef4cdab-74e2-43a3-8175-4c679e89a10d&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 id=&quot;98ef8e77-0299-4038-adb0-30e5644e2d13&quot; class=&quot;&quot;&gt;프로그램 제어 블록(PCB)&lt;/h1&gt;
&lt;p id=&quot;b09c722b-bbf6-48bd-8982-e69697a9dc1d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;50a51b97-c4fd-4b4f-8ade-2a0304f8e6ed&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터는 하나의 &lt;code&gt;프로세스&lt;/code&gt;만 수행하지 않고 여러 &lt;code&gt;프로세스&lt;/code&gt;를 수행합니다.&lt;/p&gt;
&lt;p id=&quot;1a7b9cf0-68ac-406d-b2ee-946f7defa0d7&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;그렇기에 메모리에는 많은 &lt;code&gt;프로세스&lt;/code&gt; 들이 위치해 있습니다.&lt;/p&gt;
&lt;p id=&quot;9ec87f2d-12fe-47fc-8eac-509ae6bde185&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;는 어떻게 무수히 많은 &lt;code&gt;프로세스&lt;/code&gt; 중에 특정 &lt;code&gt;프로세스&lt;/code&gt;를 찾아내는 걸까요?&lt;/p&gt;
&lt;p id=&quot;e4cb29d2-c2ed-44e4-87bf-d37f2b81b0c8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;또 필요한 정보들을 취득하거나 저장하는 건 어떻게 하는 걸까요?&lt;/p&gt;
&lt;p id=&quot;52197aed-5016-4c7d-aa0e-84f02b5f881b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;c90eafef-ac5b-49f8-84d5-f0cee462c31c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;우리가 책을 읽을 때, 원하는 컨텐츠를 빠르게 찾기 위해서는 목차를 사용합니다.&lt;/p&gt;
&lt;p id=&quot;3b2e975b-1418-461d-9df1-34d90fa9a6bb&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;도 마찬가지로 &lt;code&gt;프로세스&lt;/code&gt; 목차를 사용합니다.&lt;/p&gt;
&lt;p id=&quot;4548e984-a13e-4bc4-bcf9-50712eaf207a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이에 &lt;b&gt;OS&lt;/b&gt;는 &lt;code&gt;PCB&lt;/code&gt; 단위로 &lt;code&gt;프로세스&lt;/code&gt; 목차를 구성하여 &lt;b&gt;CPU&lt;/b&gt;에게 제공합니다.&lt;/p&gt;
&lt;p id=&quot;71b3ddd0-1301-427e-9ccc-25e09d945784&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;588f6853-96db-48a3-8c87-a32aa386ce45&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;PCB&lt;/code&gt;는 &lt;b&gt;CPU&lt;/b&gt;가 &lt;code&gt;프로세스&lt;/code&gt;를 수행하기 위해 필요한 데이터로 구성되어 있습니다.&lt;/p&gt;
&lt;p id=&quot;e03250f7-41b7-4faa-9460-0dcf41bf7751&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;a358a867-1625-4d36-9813-86447c23a3fc&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;PID(Process IDentification)&lt;/h3&gt;
&lt;p id=&quot;bbb4be2a-7886-4aaa-8163-e6ed2cdbd72c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OS&lt;/b&gt;는 각 &lt;code&gt;프로세스&lt;/code&gt;를 식별하기 위해 번호를 부여합니다. 이 식별 번호가 바로 &lt;code&gt;PID&lt;/code&gt; 입니다.&lt;/p&gt;
&lt;p id=&quot;4436b5be-a296-426f-8d19-03f9917938b2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;6e906204-dfc7-482b-a09d-d00e3ec8b1ba&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;포인터&lt;/h3&gt;
&lt;p id=&quot;66981b73-512a-4f3d-ac92-0b383d1e2809&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;가 &lt;b&gt;큐&lt;/b&gt;와 같은 공간에서 &lt;code&gt;프로세스&lt;/code&gt;를 효율적으로 찾을 수 있도록 도와주는 정보입니다.&lt;/p&gt;
&lt;p id=&quot;c803fe82-f9ef-4945-8248-1cacd3a65a9a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;10dbc7c1-20d2-4d19-b213-7a357bdb1d9e&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;프로세스 상태&lt;/h3&gt;
&lt;p id=&quot;8e90cb68-d200-4a53-a72f-f753b3a65c77&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;OS는 무수히 많은 &lt;code&gt;프로세스&lt;/code&gt;를 정해진 절차대로 처리합니다. 해당 정보는 그 절차를 판단하기 위해 사용됩니다.&lt;/p&gt;
&lt;p id=&quot;6b4d4c6d-1a11-4425-beb0-478821e1c57b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로세스 상태&lt;/code&gt;에 따라 정해진 절차대로 수행하는 것을 &lt;code&gt;프로세스 스케줄링&lt;/code&gt; 이라 부르며 &lt;code&gt;프로세스 스케줄러&lt;/code&gt; 라는 프로그램이 수행합니다.&lt;/p&gt;
&lt;p id=&quot;6f33c6fb-1ef9-4aa0-9088-2ad253702115&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;아래에서 자세히 다룰 예정입니다.&lt;/p&gt;
&lt;p id=&quot;b56aabd0-1f41-416f-83e8-6a09c3ec4612&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;c98eac37-bc57-4ca9-ba6c-39166e898a01&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;프로그램 카운터&lt;/h3&gt;
&lt;p id=&quot;5b27836d-b9cc-433c-b452-c0ae69ba02f6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;해당 &lt;code&gt;프로세스&lt;/code&gt;에서 &lt;b&gt;CPU&lt;/b&gt;가 다음으로 실행할 명령어 위치를 가리키는 값입니다.&lt;/p&gt;
&lt;p id=&quot;147d8ae1-2073-4791-a298-6b869b5bfac3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;d97a7f40-443b-4341-b404-2f37bf2dca4b&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;레지스터 정보&lt;/h3&gt;
&lt;p id=&quot;76da51ba-0cc1-44bc-8c33-6977b2ba9b3f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;레지스터&lt;/code&gt; 는 쉽게 말해, 데이터를 저장할 수 있는 임시 공간입니다.&lt;/p&gt;
&lt;p id=&quot;e64b9447-94d4-4bf0-8089-1b233591194e&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;가 &lt;code&gt;프로세스&lt;/code&gt;를 처리하면서 필요한 데이터를 저장하고 읽는 용도로 사용합니다.&lt;/p&gt;
&lt;p id=&quot;44cb1813-a90e-4d9d-b7e1-4f68ef84a264&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr id=&quot;e50779f9-7e27-4458-9605-190761b65f6f&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 id=&quot;17c969c4-e179-4228-83d7-b3f16c5d7a76&quot; class=&quot;&quot;&gt;프로세스 스케줄링&lt;/h1&gt;
&lt;p id=&quot;87833607-7db4-4f37-a06e-e31a82189670&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;c60ef17c-ea1d-41c7-a5af-77d5e6227063&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;현대 &lt;b&gt;OS&lt;/b&gt;는 &lt;b&gt;시분할 시스템&lt;/b&gt;을 제공합니다.&lt;/p&gt;
&lt;p id=&quot;078333bd-998e-4667-b3de-4c8d17cd8289&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;채팅을 하면서 동시에 음악을 들을 수 있는 이유는 &lt;b&gt;CPU&lt;/b&gt;가 빠른 속도로 번갈아가면서 &lt;code&gt;프로세스&lt;/code&gt;를 수행하기 때문입니다.&lt;/p&gt;
&lt;p id=&quot;0e38002a-575a-43ab-8904-787431ddac15&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;특정 &lt;code&gt;프로세스&lt;/code&gt;가 &lt;b&gt;CPU&lt;/b&gt;로 처리되기 위한 과정은 아래와 같습니다.&lt;/p&gt;
&lt;p id=&quot;b2ab7cb8-6e8d-4ba9-9fb8-a9079c3185b5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;766&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vmKzT/btq97nFuh04/C2ORZGzwY5cHhtwhG22aF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vmKzT/btq97nFuh04/C2ORZGzwY5cHhtwhG22aF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vmKzT/btq97nFuh04/C2ORZGzwY5cHhtwhG22aF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvmKzT%2Fbtq97nFuh04%2FC2ORZGzwY5cHhtwhG22aF0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;766&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p id=&quot;38269614-fe12-41e0-b743-9884783e4e25&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;99a6cd50-0aa2-487a-a7c1-0bda53e3c0b0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로세스의 상태&lt;/code&gt;는 크게 5가지가 존재합니다.&lt;/p&gt;
&lt;h3 id=&quot;b57bd42c-7f0c-4793-8144-829b23a40ba8&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;생성 상태&lt;/h3&gt;
&lt;p id=&quot;fd099016-ffd6-4931-beed-ebf699dbaca0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로그램&lt;/code&gt;을 메모리로 가져와 &lt;code&gt;프로세스 제어 블록(PCB)&lt;/code&gt; 생성이 완료된 상태입니다.&lt;/p&gt;
&lt;p id=&quot;56e01dd6-60e6-42c8-8687-9084142c1664&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;af49ee32-8098-443d-aac1-e92a89653302&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;준비 상태&lt;/h3&gt;
&lt;p id=&quot;6929ea61-2662-4d1f-aecd-eb641c8418d2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;실행을 기다리는 모든 &lt;code&gt;프로세스&lt;/code&gt;가 자기 차례를 기다리고 있는 상태입니다.&lt;/p&gt;
&lt;p id=&quot;2c4a41c2-cf40-420a-9c76-ab152694b598&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;실행될 &lt;code&gt;프로세스&lt;/code&gt;는 &lt;b&gt;CPU 스케줄러&lt;/b&gt;가 선택합니다.&lt;/p&gt;
&lt;p id=&quot;a94feae6-d340-412d-b8f7-89005d61c046&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;75ca1aa2-c9c8-4ea5-b186-abbc877d942a&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;실행 상태&lt;/h3&gt;
&lt;p id=&quot;84a8d74e-6832-49ca-82f8-bd80a8867f1d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;선택된 &lt;code&gt;프로세스&lt;/code&gt;가 타임 슬라이스를 얻어 &lt;b&gt;CPU&lt;/b&gt;를 사용하는 상태입니다.&lt;/p&gt;
&lt;p id=&quot;c10922ac-5089-4de8-991d-e53001884162&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;기존 수행되던 &lt;code&gt;PCB&lt;/code&gt;가 &lt;code&gt;준비 상태&lt;/code&gt; 또는 &lt;code&gt;대기 상태&lt;/code&gt;로 넘어가면서 &lt;code&gt;문맥 교환&lt;/code&gt; 오버헤드가 발생합니다.&lt;/p&gt;
&lt;p id=&quot;fe76aa66-5997-4c62-9dd0-36fbf6bca2ae&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;6ece5d1d-d7ce-40a8-8e2b-a0f2ada10688&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;대기 상태&lt;/h3&gt;
&lt;p id=&quot;3f16b3a0-5db1-46c3-b3a4-369d721cc04d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;실행 상태&lt;/code&gt;에 있는 &lt;code&gt;프로세스&lt;/code&gt;가 입출력과 같은 인터럽트가 발생되면 완료될때까지 기다리는 상태입니다.&lt;/p&gt;
&lt;p id=&quot;77192995-0f28-4dab-80f0-21d94a2f5c77&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;가 키보드와 마우스 같은 입출력 장치의 처리를 기다리면서 생기는 병목현상을 방지합니다.&lt;/p&gt;
&lt;p id=&quot;f73c9993-493f-49de-8ba7-6d299e8434d8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;입출력 처리가 완료되면 해당 &lt;code&gt;PCB&lt;/code&gt;를 &lt;code&gt;준비 상태&lt;/code&gt;로 보냅니다.&lt;/p&gt;
&lt;p id=&quot;a271dbde-e3ef-4ce2-ac5c-8ca79711d8ea&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr id=&quot;49afc096-993f-4624-b6ef-2fc20e638fc2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 id=&quot;30781559-8682-4546-b593-eb5f829e0f63&quot; class=&quot;&quot;&gt;문맥 교환(Context Switching)&lt;/h1&gt;
&lt;p id=&quot;bcc323db-53d5-4e56-903d-12d0de2e4863&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;6e36eb05-fde2-4460-8d7b-98ea9748149f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;는 여러 &lt;code&gt;프로세스&lt;/code&gt;를 특정 시간마다 번갈아 가면서 수행합니다.&lt;/p&gt;
&lt;p id=&quot;7205798c-0da7-4d82-9e90-9dae06474e5b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;요리 중 다른 요리를 하게 되면 기존 재료들을 냉장고에 넣고 새 재료를 배치하는 것처럼 &lt;b&gt;CPU&lt;/b&gt;도 &lt;code&gt;프로세스&lt;/code&gt; 교체 수행을 위한 준비가 필요합니다..&lt;/p&gt;
&lt;p id=&quot;35add53b-3194-4697-81cc-03246a15c72c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;프로세스&lt;/code&gt; 를 교체할 때 &lt;b&gt;CPU&lt;/b&gt;는 아래와 같은 과정이 필요합니다. (&lt;code&gt;A 프로세스&lt;/code&gt;에서 &lt;code&gt;B 프로세스&lt;/code&gt;로 교체된다고 가정합니다.)&lt;/p&gt;
&lt;ul id=&quot;8a167050-0dd1-4739-8399-cf8cfe6e15f1&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;A 프로세스&lt;/code&gt;의 정보를 &lt;code&gt;A PCB&lt;/code&gt; 에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;df6b1f1d-5f3c-4f37-b11b-a7af87773c0d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;B 프로세스&lt;/code&gt;의 정보를 &lt;code&gt;B PCB&lt;/code&gt; 로부터 가져온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;5508c34e-9746-4187-a406-483a9e1a532f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;60880d01-0868-4625-bdc1-089a25371c58&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 준비시간을 CPU가 일을 하지 못하는 낭비시간이라 생각하여 오버헤드라 부릅니다.&lt;/p&gt;
&lt;p id=&quot;211f27ab-4af5-4488-97fd-f53ecd0b5dac&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;문맥 교환 오버헤드&lt;/code&gt;를 개선하고자, &lt;code&gt;프로세스&lt;/code&gt; 교체 타임 슬라이스를 너무 길게 잡아도 프로세스 동시성 처리가 나빠질 수 있기 때문에 적당한 수준의 타임 슬라이스를 잡는 것이 중요합니다.&lt;/p&gt;
&lt;p id=&quot;05a7f6c5-1ed1-48af-827e-4fa1af46635b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr id=&quot;46f35c58-123c-41a2-8cd9-2c633307bb06&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p id=&quot;0415e8b3-fb32-408c-932d-a067af45e3c1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;3e23ec96-75af-4361-9cb4-a97924846679&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;오늘 준비한 내용은 여기까지입니다.&lt;/p&gt;
&lt;p id=&quot;87d31122-5412-4ef8-9675-e4fbc35cd15d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;
&lt;p id=&quot;d5cae7d1-e8ed-4052-82c2-494502dd91d9&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>운영체제</category>
      <category>cpu</category>
      <category>pcb</category>
      <category>process</category>
      <category>TCB</category>
      <category>스케줄러</category>
      <category>운영체제</category>
      <category>프로그램</category>
      <category>프로그램제어블록</category>
      <category>프로세스</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/104</guid>
      <comments>https://mommoo.tistory.com/104#entry104comment</comments>
      <pubDate>Wed, 21 Jul 2021 03:36:07 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] HTTPS 프로토콜</title>
      <link>https://mommoo.tistory.com/103</link>
      <description>&lt;article id=&quot;71bd90c5-0631-4dd4-b8c4-06cf610c9809&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;1cf39c2e-cda5-41ae-825b-0c3f02b031c8&quot; class=&quot;&quot;&gt;안녕하세요.&lt;/p&gt;&lt;p id=&quot;477d8268-9be9-42ec-adf7-2f8af947f7ed&quot; class=&quot;&quot;&gt;오늘은 &lt;code&gt;HTTPS 통신&lt;/code&gt; 에 대해 포스팅 합니다.&lt;/p&gt;&lt;p id=&quot;aab2e600-ae6d-4a3e-ad20-1bcbf32d5bae&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3f176e49-8121-4365-9254-fc03ecb53e14&quot; class=&quot;&quot;&gt;&lt;code&gt;HTTPS 통신&lt;/code&gt; 은 데이터를 암호화 하여 통신하도록 설계되어 보안적인 요소가 강화된 &lt;code&gt;HTTP 통신&lt;/code&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;4f27f90b-ece1-4c85-86a3-8ef4f7e40a7b&quot; class=&quot;&quot;&gt; &lt;code&gt;HTTPS 통신&lt;/code&gt; 은 &lt;code&gt;HTTP 통신&lt;/code&gt; 과 다르게 서버가 제공하는 &lt;code&gt;SSL 인증서&lt;/code&gt; 라는 요소가 추가되었으며, 이를 통해 클라이언트는 필요한 서버의 정보를 취득하고 신뢰성을 판단합니다.&lt;/p&gt;&lt;h1 id=&quot;51e8232c-1ba8-4a55-92af-514ae0545fb0&quot; class=&quot;&quot;&gt;데이터 암호화 &lt;/h1&gt;&lt;p id=&quot;8c58814a-e5c8-4516-be5f-6c46e6af41b5&quot; class=&quot;&quot;&gt;&lt;code&gt;HTTPS 통신&lt;/code&gt; 방법에 앞서, 간단하게 데이터 &lt;code&gt;암호화&lt;/code&gt; 개념을 살펴보면 좋습니다.&lt;/p&gt;&lt;p id=&quot;9446798e-c069-4296-9bfe-84431f4ee330&quot; class=&quot;&quot;&gt;&lt;code&gt;암호화&lt;/code&gt; 란 평문을 암호문으로 변경하는것을 의미합니다.&lt;/p&gt;&lt;p id=&quot;95ac3abd-c55e-4bc0-a8b5-2ab004e4c161&quot; class=&quot;&quot;&gt;반대로 &lt;code&gt;복호화&lt;/code&gt; 는 암호문을 평문으로 변경하는것을 의미합니다.&lt;/p&gt;&lt;blockquote id=&quot;4794617e-d651-45f3-9f84-8d4abe73d46b&quot; class=&quot;&quot;&gt;평문: 사람이 이해할 수 있는 데이터&lt;/blockquote&gt;&lt;p id=&quot;66081087-1d24-4f47-8c5a-62ed24c389a8&quot; class=&quot;&quot;&gt;&lt;code&gt;암호화&lt;/code&gt;는 어떤 특정 데이터를 사용하여 수행하는데, 이 특정 데이터를 &lt;code&gt;암호키&lt;/code&gt; 라고 부릅니다.&lt;/p&gt;&lt;p id=&quot;079a0970-dea1-43b7-919a-5c561590aa20&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;2cc97af5-670f-4e2c-8b5b-a7f1fd943d7b&quot; class=&quot;&quot;&gt;암호화는 크게 두가지 방식이 있습니다.&lt;/p&gt;&lt;ul id=&quot;85fc9db3-0e7a-4478-8baa-3afe0b886518&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;대칭키&lt;/strong&gt; 방식&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;8886b64d-01c4-4945-bab3-f13582945c35&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;strong&gt;공개키&lt;/strong&gt; 방식&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;0960fba1-2c3e-42a5-9af6-15c4010c40d3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h2 id=&quot;c2aa9646-c778-40ac-bdea-05a6dcef3651&quot; class=&quot;&quot;&gt;대칭키 방식&lt;/h2&gt;&lt;p id=&quot;81c0b47f-3405-424c-ac82-cdc271f98e09&quot; class=&quot;&quot;&gt;대칭키 방식은 말그대로 &lt;code&gt;암호키&lt;/code&gt; 가 대칭임을 의미 합니다.&lt;/p&gt;&lt;p id=&quot;6ddbda40-07cf-4ed7-a6ef-c40d2918556d&quot; class=&quot;&quot;&gt;암호화 할때도, 복호화 할때도 똑같은 1개의 &lt;code&gt;암호키&lt;/code&gt; 를 사용하는 것이 특징입니다.&lt;/p&gt;&lt;p id=&quot;96f5d149-72e8-4a15-8e0f-81ec2dc8f73c&quot; class=&quot;&quot;&gt;통신 하려는 대상 서로가 &lt;code&gt;암호키&lt;/code&gt; 를 알고 있으면 매우 유용합니다.&lt;/p&gt;&lt;p id=&quot;00b74a2e-51b7-413a-8855-d6dcfbb2aac3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3464ea3f-eb41-4091-a931-7441273dc3bc&quot; class=&quot;&quot;&gt;하지만 불특정 다수와 통신을 하기 위한 안전한 &lt;code&gt;암호키&lt;/code&gt; 전달이 무척 어렵습니다.&lt;/p&gt;&lt;p id=&quot;561df0af-5e48-4863-88ec-5482a1abf483&quot; class=&quot;&quot;&gt;해커가 중간에 &lt;code&gt;암호키&lt;/code&gt; 를 취득 해버리면 데이터를 &lt;code&gt;암호화&lt;/code&gt; 하는게 의미가 없기 때문입니다.&lt;/p&gt;&lt;blockquote id=&quot;8d6214fb-14ed-4b8e-9f27-97c71917778b&quot; class=&quot;&quot;&gt;&lt;strong&gt;Q.&lt;/strong&gt; &lt;code&gt;암호키&lt;/code&gt; 도 &lt;code&gt;암호화&lt;/code&gt; 해서주면 안되나요?

&lt;strong&gt;A.&lt;/strong&gt; &lt;code&gt;암호화&lt;/code&gt; 를 하기위해서는 무조건 최초로 평문으로된 &lt;code&gt;암호키&lt;/code&gt; 를 넘겨주어야만 합니다.
&lt;code&gt;암호키&lt;/code&gt; 를 &lt;code&gt;암호화&lt;/code&gt; 해버리면 클라이언트는 &lt;code&gt;복호화&lt;/code&gt; 를 할 수 있는 키를 모르기 때문입니다. &lt;/blockquote&gt;&lt;p id=&quot;1a5dcefd-03fe-405c-b121-3dbc5022cda7&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h2 id=&quot;970ad8aa-2df9-489b-abdc-9adb22681560&quot; class=&quot;&quot;&gt;공개키 방식&lt;/h2&gt;&lt;p id=&quot;b8dcb26f-8725-4326-8a55-b4b4211ae41d&quot; class=&quot;&quot;&gt;공개키 방식은 &lt;code&gt;암호키&lt;/code&gt; 가 두가지 존재합니다.&lt;/p&gt;&lt;ul id=&quot;5fa39762-19ca-4015-aaad-9a5a43c4dc6d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;공개키&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;29e19bb5-fa1a-4adb-87f4-575929c291ee&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;비공개키(개인키, 비밀키)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;5ed697ea-1340-420b-b1b3-cb787205110e&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;16ec8b21-01d3-4ee3-8afd-b11898601193&quot; class=&quot;&quot;&gt;&lt;code&gt;대칭키 방식&lt;/code&gt; 과는 다르게 &lt;code&gt;암호화&lt;/code&gt; 할때 &lt;code&gt;공개키&lt;/code&gt;를 사용했으면 &lt;code&gt;복호화&lt;/code&gt; 는 &lt;code&gt;비밀키&lt;/code&gt; 를 사용해야 합니다.&lt;/p&gt;&lt;p id=&quot;2f3b981b-802c-4bf6-a7f6-01852da579b2&quot; class=&quot;&quot;&gt;반대로, &lt;code&gt;암호화&lt;/code&gt; 할때 &lt;code&gt;비밀키&lt;/code&gt; 를 사용했다면 &lt;code&gt;복호화&lt;/code&gt; 는 &lt;code&gt;공개키&lt;/code&gt; 로만 가능합니다.&lt;/p&gt;&lt;h3 id=&quot;736971b6-2e34-4a61-a58d-44c15118b5eb&quot; class=&quot;&quot;&gt;공개키 방식의 장점&lt;/h3&gt;&lt;p id=&quot;42aa41ad-f8c8-4cde-bca4-a19a293470ea&quot; class=&quot;&quot;&gt;&lt;code&gt;공개키 방식&lt;/code&gt; 은 &lt;code&gt;대칭키 방식&lt;/code&gt; 의 키를 안전하게 전달하기 어려운 단점을 어느정도 해소 하였습니다.&lt;/p&gt;&lt;p id=&quot;aa745178-3b66-407e-a38f-f3181078b295&quot; class=&quot;&quot;&gt;서버가 &lt;code&gt;개인키&lt;/code&gt; 를 소유하고 있고, 불특정 다수에게 &lt;code&gt;공개키&lt;/code&gt; 를 전달합니다.&lt;/p&gt;&lt;p id=&quot;899d9cd3-c00f-4e14-94b5-91ef8a66fcde&quot; class=&quot;&quot;&gt;이때, 해커가 &lt;code&gt;공개키&lt;/code&gt; 를 획득 할 수 있고 그로인해 서버가 내려주는 &lt;code&gt;데이터&lt;/code&gt; 를 해석은 할 수 있지만 클라이언트에게 공격하지는 못합니다.&lt;/p&gt;&lt;p id=&quot;eb4a7531-18b8-45c0-bd3c-025540e8ba1b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;dcb873f3-4661-4053-89bb-46193e30c3d4&quot; class=&quot;&quot;&gt;예를들어, 서버가 클라이언트에게 &lt;code&gt;A의 장소&lt;/code&gt; 를 알려줬습니다. 이때 해커는 &lt;code&gt;공개키&lt;/code&gt; 를 취득해 복호화 하여 내용을 읽었고 클라이언트에게 &lt;code&gt;B의 장소&lt;/code&gt; 로 속이고 싶습니다. &lt;/p&gt;&lt;p id=&quot;28f01b4d-285b-4184-959c-20c6eddb8c44&quot; class=&quot;&quot;&gt;해커가 데이터를 변경하더라도 서버가 가지고 있는 &lt;code&gt;비밀키&lt;/code&gt; 를 알아야 클라이언트가 속을 수 있는 &lt;code&gt;암호문&lt;/code&gt; 을 만들 수 있습니다. &lt;/p&gt;&lt;p id=&quot;954363f0-0730-4461-b38b-9885014358c5&quot; class=&quot;&quot;&gt;해커가 임의로 암호문을 만들어버리면 클라이언트는 &lt;code&gt;공개키&lt;/code&gt; 로 복호화에 실패할것이고, 결국 클라이언트에게 공격하지 못하는 상황이 발생합니다. &lt;/p&gt;&lt;blockquote id=&quot;6e24aadc-3114-4501-97d6-80f174f0a7a0&quot; class=&quot;&quot;&gt;물론 클라이언트가 서버의 서비스를 이용 못하는건 있습니다. 하지만 공격 받지 않는것이 핵심입니다.&lt;/blockquote&gt;&lt;p id=&quot;a894dc2d-e15b-4d1b-b58d-9196844e6f50&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;28da64b9-6b9a-4e31-acc3-db3c06e23158&quot; class=&quot;&quot;&gt;반대로 클라이언트가 서버로 데이터를 보낼 때는 &lt;code&gt;공개키&lt;/code&gt; 로 데이터를 암호화 하여 보냅니다. &lt;/p&gt;&lt;p id=&quot;63c3ab0d-dbac-427b-8b87-817cb15fb3c6&quot; class=&quot;&quot;&gt;해커는 &lt;code&gt;공개키&lt;/code&gt; 만알고 있기 때문에 클라이언트 데이터를 읽지 못합니다. 왜냐면 &lt;code&gt;공개키 방식&lt;/code&gt; 은 &lt;code&gt;공개키&lt;/code&gt; 로 &lt;code&gt;암호화&lt;/code&gt; 를 하면 &lt;code&gt;비밀키&lt;/code&gt; 로만 &lt;code&gt;복호화&lt;/code&gt; 를 진행할 수 있기 때문입니다. &lt;/p&gt;&lt;p id=&quot;e42a9074-217e-4662-9bfb-406174dba765&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;6c61e40e-6534-4661-aa1b-6586f4c8e486&quot; class=&quot;&quot;&gt;정리하자면 &lt;code&gt;공개키 방식&lt;/code&gt; 은 클라이언트로 하여금 데이터가 변경되지 않음을 보장할 수 있고 안전하게 데이터를 서버로 보낼 수 있는 장점이 있습니다.&lt;/p&gt;&lt;p id=&quot;e034c016-3e88-435c-90ad-401fc97ad0f3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;921a5d24-eec9-4c23-9745-60cab48f0b30&quot; class=&quot;&quot;&gt;공개키 방식의 단점&lt;/h3&gt;&lt;p id=&quot;b4a0ef7a-3f72-4df7-b742-85b23b5459c9&quot; class=&quot;&quot;&gt;하지만 &lt;code&gt;공개키 방식&lt;/code&gt;도 한계가 존재합니다. 클라이언트 → 서버로 데이터를 &lt;code&gt;암호화&lt;/code&gt; 해서 보내는건 문제가 되지 않습니다. 해커가 읽지도 못하니깐요.&lt;/p&gt;&lt;p id=&quot;c6320448-cfad-4f48-b094-f9b41f01214f&quot; class=&quot;&quot;&gt;하지만 서버 → 클라이언트로 보내는 데이터는 해커가 읽을 수 있습니다. 만약 데이터가 민감한 개인 정보같은게 포함되어 있다면 해커가 읽는것만으로도 피해가 생길 수 있기 때문입니다.&lt;/p&gt;&lt;p id=&quot;114c586b-324d-4e8a-82dd-89066396321e&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;5de33b46-a3a0-42fa-856a-b0a648fc1797&quot; class=&quot;&quot;&gt;또한 &lt;code&gt;공개키 방식&lt;/code&gt; 은 &lt;code&gt;대칭키 방식&lt;/code&gt; 보다 &lt;code&gt;암-복호화&lt;/code&gt; 속도가 느립니다.&lt;/p&gt;&lt;h1 id=&quot;a1770e8c-f032-43f9-9de9-2e4f77bfcafc&quot; class=&quot;&quot;&gt;SSL 인증서&lt;/h1&gt;&lt;p id=&quot;c762a897-9f0d-4be0-ad2d-6601555d78ba&quot; class=&quot;&quot;&gt;&lt;code&gt;HTTPS 통신&lt;/code&gt; 에서는 서버가 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 제공한다고 언급했습니다.&lt;/p&gt;&lt;p id=&quot;18729557-e6f9-43df-827e-4a3af0ab8e0f&quot; class=&quot;&quot;&gt;이 &lt;code&gt;SSL 인증서&lt;/code&gt;는 크게 두가지 역할을 수행합니다.&lt;/p&gt;&lt;ul id=&quot;f6c5422d-3321-40ac-bf7b-929336250263&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;서버 본인이 신뢰할 수 있는 서버임을 증명하는 수단.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;3cbf34db-2c3b-4ec7-9853-f8bbf1a8ad2f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;서버가 제공하는 &lt;code&gt;공개키&lt;/code&gt;를 전달.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;55fefe15-8fc4-475e-8dff-053f2f68d2f0&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;304029c5-d38f-4a4f-a36e-8c4563754113&quot; class=&quot;&quot;&gt;&lt;code&gt;SSL 인증서&lt;/code&gt; 는 서버의 신뢰성을 판단할 수 있는 수단이라 했는데, 다짜고짜 클라이언트에게 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 내밀면 신뢰할 수 있을까요?&lt;/p&gt;&lt;p id=&quot;81ba2c60-59f4-49d9-abb6-e0648fe1fab2&quot; class=&quot;&quot;&gt;예를들어, 모르는 사람이 다가와서 &lt;em&gt;나 믿을 수 있는 사람이야  &lt;/em&gt;라고 말하면 여러분을 믿을 수 있으신가요?&lt;/p&gt;&lt;p id=&quot;46632d24-b1e7-4f03-9bd9-19672a68e18a&quot; class=&quot;&quot;&gt;그렇기에 &lt;code&gt;SSL 인증서&lt;/code&gt; 의 신뢰성을 대신 보장하는 제 3자가 존재합니다.&lt;/p&gt;&lt;p id=&quot;cb6782ed-7178-4667-9f00-1fdec17411dd&quot; class=&quot;&quot;&gt;그 3자를 &lt;code&gt;CA(Certificate authority)&lt;/code&gt; 혹은 &lt;code&gt;Root Certificate&lt;/code&gt; 라 일컫는 기업들입니다.&lt;/p&gt;&lt;blockquote id=&quot;687c4a05-af0f-4396-b540-be5baba8073b&quot; class=&quot;&quot;&gt;해당 기업들은 세계적인 기업으로써, 신뢰성이 엄격하게 공인된 기업들만 &lt;code&gt;CA&lt;/code&gt;로써, 참여할 수 있습니다.&lt;/blockquote&gt;&lt;p id=&quot;1effa9e1-e5db-40af-9dd3-76ce7aa6c2e5&quot; class=&quot;&quot;&gt;이러한 기업은 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 신청한 기업들이 신뢰성있는 기업인지 평가한 후 발급을 진행합니다. &lt;/p&gt;&lt;p id=&quot;2d0717c7-d0b0-47fd-89d3-1d7f12765936&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;c17f0766-5dcf-4135-99fd-60175e83ed70&quot; class=&quot;&quot;&gt; &lt;code&gt;CA&lt;/code&gt; 기업들은 잘 알려진 기업들로써, &lt;code&gt;HTTPS 통신&lt;/code&gt;을 지원하는 클라이언트(대표적으로 브라우저)들은 &lt;code&gt;CA 리스트&lt;/code&gt; 를 보유하고 있습니다. 그렇기에, 클라이언트는 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 받은 후 정보를 읽어 &lt;code&gt;CA 리스트&lt;/code&gt; 대조를 통해, &lt;code&gt;CA&lt;/code&gt; 가 발급한 &lt;code&gt;SSL 인증서&lt;/code&gt; 의 유무를 판단하고 신뢰성을 평가합니다. &lt;/p&gt;&lt;blockquote id=&quot;e16221ba-f1fd-47b1-8cc3-f1acb2ec453f&quot; class=&quot;&quot;&gt;&lt;code&gt;CA&lt;/code&gt; 가 발급하지 않은 &lt;code&gt;SSL 인증서&lt;/code&gt; 는 클라이언트가 신뢰성을 낮게 평가합니다.&lt;/blockquote&gt;&lt;p id=&quot;d83fd3fd-7c64-42d6-857f-72823a5940be&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;5eb4b947-bc8d-4f65-876c-17268f38c16a&quot; class=&quot;&quot;&gt;SSL 인증서 암호화&lt;/h3&gt;&lt;p id=&quot;6d92c530-c19e-4461-ac4a-ac488ab20c6e&quot; class=&quot;&quot;&gt;SSL 인증서는 &lt;code&gt;비공개키 방식&lt;/code&gt; 으로 &lt;code&gt;암호화&lt;/code&gt;하여 클라이언트에게 전달됩니다.&lt;/p&gt;&lt;p id=&quot;8d97039f-354c-46eb-880c-bd2947088f35&quot; class=&quot;&quot;&gt;이때, &lt;code&gt;암호화&lt;/code&gt; 를 수행하는 대상은 서버가 아닌, &lt;code&gt;CA&lt;/code&gt; 에서 자체적으로 소요한 &lt;code&gt;비밀키&lt;/code&gt; 를 통해 &lt;code&gt;암호화&lt;/code&gt; 를 진행합니다. &lt;/p&gt;&lt;p id=&quot;23c1335e-8537-49e5-91ca-fcb2abc8ae7f&quot; class=&quot;&quot;&gt;즉 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 서버에서도 변조하여 클라이언트에게 공격할 수 없습니다. &lt;code&gt;비밀키&lt;/code&gt; 를 모르기 때문입니다.&lt;/p&gt;&lt;p id=&quot;6d908009-01f2-4cbd-bf3a-96b5ee666305&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3a7987e8-254b-4747-a7a7-ba93693be7ce&quot; class=&quot;&quot;&gt;&lt;code&gt;CA&lt;/code&gt; 의 &lt;code&gt;공개키&lt;/code&gt;는 이미 널리 알려진 정보로써, 클라이언트가 &lt;code&gt;CA 리스트&lt;/code&gt; 와 함께  &lt;code&gt;공개키&lt;/code&gt; 도 보유하고 있습니다.  그렇기에 위에 앞서 언급한 &lt;code&gt;공개키 방식&lt;/code&gt; 장점을 잘 활용하고 있다고 볼 수 있습니다. &lt;code&gt;SSL 인증서&lt;/code&gt; 가 위조되지 않음을 보장받을 수 있기 때문입니다.&lt;/p&gt;&lt;p id=&quot;3b70cff0-9f9b-42c8-8f80-2fe4828ae61b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;7ae0388b-4432-41ba-b938-61676110851b&quot; class=&quot;&quot;&gt;SSL 인증서에 포함된 공개키&lt;/h3&gt;&lt;p id=&quot;eec76ed9-27b8-45d5-b378-3b152b670ec2&quot; class=&quot;&quot;&gt;&lt;code&gt;SSL&lt;/code&gt; 인증서엔 &lt;code&gt;공개키&lt;/code&gt;가 포함되어 있는데 이는, &lt;code&gt;CA&lt;/code&gt; 의 &lt;code&gt;공개키&lt;/code&gt;가 아닙니다. 서버가 클라이언트와 보안 통신을 하기위해 서버가 직접 생성한 &lt;code&gt;공개키&lt;/code&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;5cf9e1a3-fe59-4c01-aaf0-c425cebfd061&quot; class=&quot;&quot;&gt;서버가 &lt;code&gt;CA&lt;/code&gt; 에게 &lt;code&gt;SSL 인증서&lt;/code&gt; 의 발급 신청을 할 때, 몇몇 서버 데이터를 전달하는데 필수적으로 &lt;code&gt;공개키&lt;/code&gt; 도 전달이 되어야 합니다.&lt;/p&gt;&lt;p id=&quot;8669b86d-e042-4177-8393-30f2292a84da&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;1db47ba3-d3f4-44a8-a69c-6f7fb68d6bc3&quot; class=&quot;&quot;&gt;뒤에 설명할 &lt;code&gt;SSL 통신&lt;/code&gt; 에서는 클라이언트가 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 통해 서버의 &lt;code&gt;공개키&lt;/code&gt; 를 취득하고, &lt;code&gt;비공개 방식&lt;/code&gt; 으로 보안 통신하는 절차가 있기 때문에 필수적으로 필요합니다.&lt;/p&gt;&lt;p id=&quot;6817f1b6-b67f-4d28-a721-51503d760cac&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h1 id=&quot;d8ebe10f-d362-4342-a436-17b8508fd0bc&quot; class=&quot;&quot;&gt;SSL 통신&lt;/h1&gt;&lt;p id=&quot;d4d9c63f-c744-4ded-9586-7a08c264da0d&quot; class=&quot;&quot;&gt;&lt;code&gt;공개키 방식&lt;/code&gt; 으로 통신을 하면, 서버 → 클라이언트로 데이터를 내려줄땐 조금 문제가 될 순 있지만, 어느정도 감안하고 보안 통신 방법으로 사용할 수 있을거 같습니다.&lt;/p&gt;&lt;p id=&quot;55eed7a2-171b-45cd-81c9-c635663502f5&quot; class=&quot;&quot;&gt;하지만, 큰 단점이 있는데요. &lt;/p&gt;&lt;p id=&quot;a6104aab-fcaa-46d4-9e63-9f7f800c3b9b&quot; class=&quot;&quot;&gt;그것은 바로 &lt;code&gt;&lt;em&gt;&lt;strong&gt;공개키 방식&lt;/strong&gt;&lt;/em&gt;&lt;/code&gt;&lt;em&gt;&lt;strong&gt;은 암호화 복호화 하는 과정이 느리다&lt;/strong&gt;&lt;/em&gt; 라는 것 입니다.&lt;/p&gt;&lt;p id=&quot;a82d113e-ae8c-49e1-b1bd-18091e9807b8&quot; class=&quot;&quot;&gt;웹통신이 느리면, 문제가 될 수 있기 때문에 &lt;code&gt;SSL 통신&lt;/code&gt; 은 상대적으로 빠른 &lt;code&gt;대칭키 방식&lt;/code&gt; 으로 메인 통신을 진행합니다. &lt;/p&gt;&lt;p id=&quot;df5d9f8b-acc5-4ac2-b2c5-a7af2c210659&quot; class=&quot;&quot;&gt;하지만, &lt;code&gt;대칭키&lt;/code&gt;는 공격자가 알면 너무나도 쉽게 데이터를 변조하여  대상을 속일 수 있기 때문에 매우 위험합니다. SSL 통신은 어떻게 이런 이슈들을 해결했을까요?&lt;/p&gt;&lt;p id=&quot;4a53e7e3-5857-4b74-8f1b-699da59f1a1f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h2 id=&quot;514f80d3-e2c9-46ea-96b7-6a5fb39c5216&quot; class=&quot;&quot;&gt;SSL 통신 방법&lt;/h2&gt;&lt;p id=&quot;0921e731-5d53-48bf-95ec-9441ea64b9e7&quot; class=&quot;&quot;&gt;결론적으로 말하자면, SSL 통신은 &lt;code&gt;공개키 방식&lt;/code&gt; 과 &lt;code&gt;대칭키 방식&lt;/code&gt; 둘 다 사용합니다. &lt;/p&gt;&lt;p id=&quot;a3b4b2f5-0990-44b0-a60e-888045d52f07&quot; class=&quot;&quot;&gt;SSL 통신은 다음의 아이디어를 사용합니다.&lt;/p&gt;&lt;p id=&quot;9cdd16fd-3b64-4248-9abe-306329cc1a77&quot; class=&quot;&quot;&gt;&lt;code&gt;공개키 방식&lt;/code&gt; 으로 서버와 함께 작성된 &lt;code&gt;대칭키&lt;/code&gt; 를 서로에게 전달합니다. 이때 중간 공격자는 서버의 &lt;code&gt;개인키&lt;/code&gt; 를 알고있지 않는한 내용을 &lt;code&gt;복호화&lt;/code&gt;하지 못하여 데이터 해독이 불가능 합니다. &lt;/p&gt;&lt;p id=&quot;2d6ecc2c-79a9-43f5-b338-8ff1dcc37fbb&quot; class=&quot;&quot;&gt;이렇게 서로 안전하게 &lt;code&gt;대칭키&lt;/code&gt; 가 전달되었다면, &lt;code&gt;암-복호화&lt;/code&gt;가 빠른 &lt;code&gt;대칭키&lt;/code&gt; 로 데이터 통신을 합니다.&lt;/p&gt;&lt;p id=&quot;bf3a07a6-75f8-4e09-9931-9c9ace5df869&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h2 id=&quot;24d7966f-113a-4acc-9846-b9fbaad17109&quot; class=&quot;&quot;&gt;SSL 통신 절차&lt;/h2&gt;&lt;p id=&quot;b64ba6ce-d2cd-4dad-a025-3f19e708648b&quot; class=&quot;&quot;&gt;TCP와 같은 연결지향 프로토콜은 크게 아래의 과정을 거칩니다.&lt;/p&gt;&lt;ul id=&quot;521e6887-9d1d-4789-8804-bf990ef866ba&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;악수(HandShake)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;ead94c44-5bdd-4abe-8a93-05df91ddbc9c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 전송(세션)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;891c336e-ebe5-4b1d-9914-5c9e07cc2e41&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;세션 종료&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;3338f73c-7025-450a-a0c1-3b8c3b5c39ac&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;ce3f0fc2-214b-4d7d-9bec-df103c6a7998&quot; class=&quot;&quot;&gt;&lt;code&gt;SSL 통신&lt;/code&gt;도 결국 TCP위에서 동작하므로, 위 과정과 같습니다만, 세부적인 내용이 조금 다릅니다.&lt;/p&gt;&lt;blockquote id=&quot;16f4de58-a196-4ef6-ab62-41bf60a32c7c&quot; class=&quot;&quot;&gt;&lt;code&gt;SSL 통신&lt;/code&gt;은 TCP의 핸드쉐이크 (&lt;code&gt;SYN&lt;/code&gt; → &lt;code&gt;SYN ACK&lt;/code&gt; → &lt;code&gt;ACK&lt;/code&gt;) 과정이 이루어 진 후에, &lt;code&gt;SSL 통신&lt;/code&gt;이 시작됩니다. (악수 → 데이터 전송 → 세션 종료)&lt;/blockquote&gt;&lt;h3 id=&quot;7d9a17c0-9c39-4a39-b776-2c0c940dd4e1&quot; class=&quot;&quot;&gt;악수(HandShake)&lt;/h3&gt;&lt;ol id=&quot;3f682675-265d-4478-bcad-69edca35449d&quot; class=&quot;numbered-list&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;strong&gt;Client Hello&lt;/strong&gt; (클라이언트가 서버에 접속합니다. )&lt;ul id=&quot;d3d96cd5-76bb-4556-bc37-bdf9dcbe7e07&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;서버에게 평문 문자열 &lt;code&gt;Client Hello&lt;/code&gt; 를 전송합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;7c8e4886-7a1b-45c6-a617-cd0418d6d56d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;서버에게 &lt;code&gt;대칭키&lt;/code&gt; 를 만들 수 있는 랜덤 데이터를 평문으로 전송 합니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;4a0257d5-d2e0-467a-97ba-9bc754c7ed70&quot; class=&quot;numbered-list&quot; start=&quot;2&quot;&gt;&lt;li&gt;&lt;strong&gt;Server Hello&lt;/strong&gt; (서버가 &lt;code&gt;Client Hello&lt;/code&gt; 를 받은 후, 클라이언트에게 응답합니다.)&lt;ul id=&quot;daa9e0f5-5fc9-442d-bd9c-5ed74cce180f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;클라이언트에게 평문 &lt;code&gt;Server Hello&lt;/code&gt; 를 전송합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;035d7f41-a70d-46e3-9ee2-7b4c9e8d8aa4&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;클라이언트에게 &lt;code&gt;대칭키&lt;/code&gt; 를 만들 수 있는 랜덤 데이터를 평문으로 전송합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;d9bd3d84-6cee-4d08-9607-ef5835a1556f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;제일 중요한 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 전송합니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;1057a986-e257-4b2f-9152-db9dfb46dc5d&quot; class=&quot;numbered-list&quot; start=&quot;3&quot;&gt;&lt;li&gt;&lt;strong&gt;클라이언트의 SSL 인증서 신뢰성 판단&lt;/strong&gt;&lt;ul id=&quot;41aa6bf5-666c-4f76-ac88-fb27d1f373d8&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;서버에게 받은 &lt;code&gt;SSL 인증서&lt;/code&gt; 를 보유하고 있는 CA 리스트를 통해 &lt;code&gt;복호화&lt;/code&gt; 합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;c7946b40-3328-46ec-8fb5-24b1c349f9c9&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;복호화&lt;/code&gt; 에 성공하였다면, 해당 서버를 신뢰할 수 있다고 판단합니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;4d1c2758-6c7e-435d-b581-16528b4133d2&quot; class=&quot;numbered-list&quot; start=&quot;4&quot;&gt;&lt;li&gt;&lt;strong&gt;서버에 &lt;/strong&gt;&lt;strong&gt;&lt;code&gt;대칭키&lt;/code&gt;&lt;/strong&gt;&lt;strong&gt; 전송&lt;/strong&gt; (SSL 핸드쉐이크의 핵심 목적 입니다.)&lt;ul id=&quot;84e6af2f-c086-4011-a39e-4bef9d9823c2&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;클라이언트는 본인이 만든 랜덤 데이터와 서버에서 받은 랜덤 데이터를 이용하여, &lt;code&gt;대칭키&lt;/code&gt; 를 구성합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;268905ea-30a9-47c7-bec6-c417a0b92d68&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;해당 대칭키를 &lt;code&gt;SSL 인증서&lt;/code&gt; 에 포함되어 있는 서버 &lt;code&gt;공개키&lt;/code&gt;로 &lt;code&gt;암호화&lt;/code&gt; 하여 서버에게 전송합니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol id=&quot;c75a407a-84f6-4ff0-8b97-e905b9385964&quot; class=&quot;numbered-list&quot; start=&quot;5&quot;&gt;&lt;li&gt;핸드쉐이크 종료&lt;ul id=&quot;074044ae-9173-4e25-b353-f2c445bf90b7&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;클라이언트와 서버가 서로 &lt;code&gt;대칭키&lt;/code&gt; 를 안전하게 전달 받은 후, 통신 준비가 되었다는 신호와 함께 &lt;code&gt;핸드쉐이크&lt;/code&gt;가 종료됩니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;a5f1670d-adc5-4af2-9fc2-3dad9d036e8d&quot; class=&quot;&quot;&gt;데이터 전송(세션)&lt;/h3&gt;&lt;p id=&quot;8b0a4d68-6a18-4b3d-ac0a-01fc2b61d3a8&quot; class=&quot;&quot;&gt;서버와 클라이언트가 데이터를 서로 주고 받고 하는 단계입니다. 서로 안전하게 전달받은 &lt;code&gt;대칭키&lt;/code&gt; 를 사용하여, &lt;code&gt;암-복호화&lt;/code&gt;를 빠르게 진행합니다.&lt;/p&gt;&lt;p id=&quot;715e9199-afed-486c-b484-e41646487837&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;aea25be5-8c5f-4b2c-8489-fd6469a674c0&quot; class=&quot;&quot;&gt;세션종료&lt;/h3&gt;&lt;p id=&quot;1ac3e5a6-92e1-454c-8294-c3ae9a4bc5eb&quot; class=&quot;&quot;&gt;&lt;code&gt;데이터 전송&lt;/code&gt;이 끝나면 &lt;code&gt;SSL 통신&lt;/code&gt;이 끝났음을 서로에게 알려줍니다.&lt;/p&gt;&lt;p id=&quot;feaf7843-9708-499e-9eaa-aabc21bc190c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;af71e2ed-9585-4864-8496-b806d7c78b16&quot; class=&quot;&quot;&gt;오늘 준비한 포스팅은 여기까지 입니다. 읽어주셔서 감사합니다.&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;block-color-gray&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>네트워크</category>
      <category>ca</category>
      <category>HTTP</category>
      <category>HTTPS</category>
      <category>SSL 인증서</category>
      <category>ssl/tls</category>
      <category>TLS</category>
      <category>공개키</category>
      <category>대칭키</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/103</guid>
      <comments>https://mommoo.tistory.com/103#entry103comment</comments>
      <pubDate>Fri, 16 Jul 2021 04:09:07 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 이진탐색트리</title>
      <link>https://mommoo.tistory.com/101</link>
      <description>&lt;article id=&quot;7243e368-8655-4977-875b-ae31bdd59ff0&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;p id=&quot;746d72a0-335a-4274-a268-c0461171e0dd&quot; class=&quot;&quot;&gt;안녕하세요. &lt;/p&gt;&lt;p id=&quot;f9731f0e-7cd3-4a0e-9d67-86a9f9481c50&quot; class=&quot;&quot;&gt;오늘은 &lt;code&gt;이진 탐색트리&lt;/code&gt; 에 대해 포스팅 합니다. &lt;/p&gt;&lt;h1 id=&quot;cecdfce2-3c26-4c3e-a595-074661d23f2f&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 란&lt;/strong&gt;&lt;/h1&gt;&lt;p id=&quot;e583b526-dddf-41fb-b387-7354cc02eb59&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 탐색트리&lt;/code&gt; 는 &lt;code&gt;이진 탐색(Binary Search)&lt;/code&gt;의 아이디어를 채용한 자료구조 입니다.&lt;/p&gt;&lt;p id=&quot;9b63fbdd-dc73-4888-a03a-f34c628a83d3&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;110e0f2a-6ee0-428c-9541-a2c00b5212a0&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 탐색&lt;/code&gt;은 원소가 정렬되어 있다는 조건아래, 정렬된 특징을 이용해 반씩 쪼개가며 검색을 합니다.&lt;/p&gt;&lt;p id=&quot;0457ee06-b7a5-4311-8a3e-a12cb1592e43&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;15ae364d-c03d-449b-bdd3-df71a54bf63d&quot; class=&quot;&quot;&gt;그러므로, 검색 횟수가 획기적으로 낮아지는 특징이 있습니다.&lt;/p&gt;&lt;p id=&quot;6fe760c3-abb4-45df-96ab-79e1dfd4438e&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;6c4793bb-3bb9-4750-aeec-83a02172938d&quot; class=&quot;&quot;&gt;이는, &lt;code&gt;이진 탐색트리&lt;/code&gt;도 똑같이 원소가 정렬된 형태로 지니고 있어야 하고 반씩 쪼개가며 검색을 할 수 있는 구조를 갖추고 있어야 함을 의미합니다.&lt;/p&gt;&lt;p id=&quot;1d954e5f-9f78-4cfb-8f6a-a6cce1ed1715&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;69831504-d27f-450d-b570-7afc35ad2573&quot; class=&quot;&quot;&gt;&lt;strong&gt;그러면... 이진 탐색 사용하면 되는거 아닌가요?&lt;/strong&gt;&lt;/h3&gt;&lt;p id=&quot;67c06eb0-b5c8-415b-8557-9329f8e6785d&quot; class=&quot;&quot;&gt;그렇다면, &lt;code&gt;이진 탐색트리&lt;/code&gt;는 &lt;code&gt;이진 탐색&lt;/code&gt;을 사용하는 &lt;code&gt;배열&lt;/code&gt; 자료구조보다 나은점이 무엇일까요?&lt;/p&gt;&lt;p id=&quot;727636eb-f810-496f-914f-408dc16874ab&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;5ae121f8-ec33-42b8-b396-e071ce9eb50f&quot; class=&quot;&quot;&gt;아시다 시피, &lt;code&gt;배열&lt;/code&gt;은 조회에 강점이 있는 자료구조 입니다. 그렇다 보니, 검색만 한다고 가정할 때는 &lt;code&gt;트리&lt;/code&gt; 구조가 굳이 필요하지 않습니다.&lt;/p&gt;&lt;p id=&quot;fbafe512-10e5-434f-96af-e0142d93a757&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;29fad070-9b39-4ab5-9b69-0dea91dbb7dd&quot; class=&quot;&quot;&gt;하지만, 원소가 &lt;strong&gt;삽입&lt;/strong&gt;/&lt;strong&gt;삭제&lt;/strong&gt; 될 수 있다고 가정하면 어떨까요? &lt;code&gt;배열&lt;/code&gt; 자료구조는, &lt;strong&gt;삽입&lt;/strong&gt;/&lt;strong&gt;삭제&lt;/strong&gt; 될 &lt;em&gt;Index&lt;/em&gt; 를 찾은 후, 그 &lt;em&gt;Index&lt;/em&gt; 뒤에 위차한 원소들을 한칸씩 전부 뒤로 이동해야 하는 수고가 존재합니다. 또한, &lt;code&gt;배열&lt;/code&gt;공간이 모자라, &lt;code&gt;배열&lt;/code&gt; 크기를 증가시키거나 혹은 공간이 너무 남아, 축소 시키는 작업은 덤으로 발생할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;59dddff0-83ec-4c9e-9a59-9b1bd379f3e8&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;be204042-b6ae-4684-be79-c260392d06e1&quot; class=&quot;&quot;&gt;그에 반면에, &lt;code&gt;트리&lt;/code&gt; 구조는 참조(포인터)만 변경해주면 되므로, 원소의 대량 이동이 필요 없고, 공간 복잡도를 신경안써도 되는 장점이 있습니다. 그렇다보니, &lt;strong&gt;삽입&lt;/strong&gt;/&lt;strong&gt;삭제&lt;/strong&gt; 연산이 한번이라도 존재한다면, 이는 삽입이 연속적으로 N번 발생할 수도 있다는 의미이므로 굳이 &lt;code&gt;배열&lt;/code&gt; 자료구조를 사용할 필요가 없습니다.&lt;/p&gt;&lt;p id=&quot;5d95b954-4dc8-4ca4-9429-c9ba66c29436&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;9274093f-8eab-4826-b2f9-0c6811749127&quot; class=&quot;&quot;&gt;사실 조회 자체도 &lt;code&gt;이진 탐색&lt;/code&gt; 구조상 &lt;code&gt;트리&lt;/code&gt; 도 특정 노드의 &lt;em&gt;Index&lt;/em&gt; 검색이 아닌, 특정 노드로부터 순차대로 검색하는 구조이므로 &lt;code&gt;배열&lt;/code&gt;이랑 크게 차이가 없습니다.&lt;/p&gt;&lt;blockquote id=&quot;5b7b3d8f-04b3-4ed6-86eb-573a6ca1b51f&quot; class=&quot;&quot;&gt;예를들어, &lt;code&gt;연결 리스트&lt;/code&gt;는 특정 &lt;em&gt;Index&lt;/em&gt; 노드 검색 시간복잡도는 &lt;code&gt;O(n)&lt;/code&gt;이지만, 전체 순회를 할 때는 각 노드의 참조값을 순차대로 탐색하므로 각 노드의 검색 시간이 &lt;code&gt;O(1)&lt;/code&gt; 입니다.&lt;/blockquote&gt;&lt;p id=&quot;e8bb236b-2ffe-4b9a-9b33-b3154df4f9dd&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;1bdaa30b-7aa7-4d5f-9b48-1f76d54e1284&quot; class=&quot;&quot;&gt;&lt;strong&gt;결론적으론, &lt;/strong&gt;&lt;strong&gt;&lt;code&gt;이진 탐색트리&lt;/code&gt;&lt;/strong&gt;&lt;strong&gt;가 더 보편적으로 사용될 수 있다고 말할 수 있겠습니다.&lt;/strong&gt;&lt;/p&gt;&lt;h1 id=&quot;179e8f9f-4d70-43d9-85db-458440f5f813&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진탐색을 위한 트리 구조&lt;/strong&gt;&lt;/h1&gt;&lt;p id=&quot;ece7cdeb-ab01-4d5d-9402-eb7807c97ac6&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 탐색트리&lt;/code&gt; 는 &lt;code&gt;트리&lt;/code&gt;에 어떤식으로 데이터의 구조를 형성하길래, &lt;code&gt;이진 탐색&lt;/code&gt;이 가능한걸까요?&lt;/p&gt;&lt;p id=&quot;83bf9acc-6072-4e40-bc2b-17fc93d80ed7&quot; class=&quot;&quot;&gt;아래와 규칙으로 데이터를 쌓기 때문입니다!&lt;/p&gt;&lt;blockquote id=&quot;8a6499c8-0086-49be-81eb-f0b55b39e79f&quot; class=&quot;&quot;&gt;규칙만 봐서는 이해가 어렵습니다. 아래의 예시 이미지와, 삽입과정 설명을 보시는걸 추천합니다!&lt;/blockquote&gt;&lt;p id=&quot;588df7d5-fba4-41fc-9e9e-34ee0104fd8b&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;ul id=&quot;e4581066-0434-40ce-ae0a-fa3a45722854&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;루트 노드&lt;/code&gt;가 비었다면, &lt;code&gt;삽입 노드&lt;/code&gt;를 &lt;code&gt;루트 노드&lt;/code&gt;로 채웁니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1b65f5d8-9af4-42b7-99db-c450e37f494a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;&lt;code&gt;루트 노드&lt;/code&gt;가 존재한다고 가정할 때, &lt;code&gt;삽입 노드&lt;/code&gt;의 값과 비교하여 &lt;code&gt;삽입 노드&lt;/code&gt;의 값이 작으면 &lt;code&gt;루트 노드&lt;/code&gt;의 오른쪽, 크면 오른쪽으로 이동합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;36ddf94e-fe15-43ea-8bfa-c7cdf6438c0a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;이동시, 노드가 비었다면 &lt;code&gt;삽입 노드&lt;/code&gt;로 채웁니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;744bf692-ce57-486e-8aed-35bf7af91373&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;만약 노드가 존재한다면, 2번~3번 과정을 반복합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;4f59eec2-9394-401f-af57-08b80719067c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;figure id=&quot;6910d57f-1226-41b4-a309-94b7251f9218&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WeuWy/btq9hyBQ4p4/NtkQk6Y2YCCwiHLBslBAFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WeuWy/btq9hyBQ4p4/NtkQk6Y2YCCwiHLBslBAFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WeuWy/btq9hyBQ4p4/NtkQk6Y2YCCwiHLBslBAFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWeuWy%2Fbtq9hyBQ4p4%2FNtkQk6Y2YCCwiHLBslBAFk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;h1 id=&quot;24ea84de-28af-4044-b86a-39e902687df3&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 순회&lt;/strong&gt;&lt;/h1&gt;&lt;p id=&quot;4db42814-5c87-4f0a-891b-b52b61a66c50&quot; class=&quot;&quot;&gt;이진 트리는 대표적인 &lt;code&gt;DFS 순회&lt;/code&gt;방법 3가지가 있습니다.&lt;/p&gt;&lt;ul id=&quot;dbf38cac-c2c1-412a-a3a2-db49dd8cf4c0&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;전위 순회(pre-order traversal)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;e46988f1-c922-45b4-bfab-8441f38c290a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;중위 순회(in-order traversal)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;bfd3ea7c-2dbc-45ee-85e7-6044a36b1d5f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;후위 순회(post-order traversal)&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;fb9ff618-7109-43e6-b283-49e0ca8be3d5&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;26715454-d08e-4852-9fd7-7b26d4700a6a&quot; class=&quot;&quot;&gt;이때, 중위 순회를 이용하면 정렬된 원소의 목록을 획득 할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;ce0f4c34-84cb-4006-83da-3deffe620695&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;figure id=&quot;4a22ffb1-22e9-4990-8814-7fdac3082107&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%201.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGjHcO/btq9hAfnqJw/7pxEenD0mE57GvMREGwgt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGjHcO/btq9hAfnqJw/7pxEenD0mE57GvMREGwgt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGjHcO/btq9hAfnqJw/7pxEenD0mE57GvMREGwgt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGjHcO%2Fbtq9hAfnqJw%2F7pxEenD0mE57GvMREGwgt0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;039e91a5-ceb8-46be-8306-34530ec04e34&quot; class=&quot;&quot;&gt;위 예시를 중위 순회를 해보면 다음과 같은 원소의 목록을 얻을 수 있습니다.&lt;/p&gt;&lt;p id=&quot;e6952bb8-852d-428e-966d-cc54b2a85d2c&quot; class=&quot;&quot;&gt; &lt;code&gt;1&lt;/code&gt; &amp;gt; &lt;code&gt;2&lt;/code&gt; &amp;gt; &lt;code&gt;3&lt;/code&gt; &amp;gt; &lt;code&gt;4&lt;/code&gt; &amp;gt; &lt;code&gt;5&lt;/code&gt;  &amp;gt; &lt;code&gt;7&lt;/code&gt; &amp;gt; &lt;code&gt;9&lt;/code&gt; &lt;/p&gt;&lt;p id=&quot;0806b0cd-0d51-4916-ab63-53d1873e8990&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;49a4417d-5ed3-400b-b472-9bfb1c591674&quot; class=&quot;&quot;&gt;따라서, 해당 트리 구조는 &lt;code&gt;트리 정렬&lt;/code&gt; 알고리즘 으로도 사용되며,&lt;/p&gt;&lt;p id=&quot;4e1d1535-3ef7-4dd4-9833-860075014792&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 탐색트리&lt;/code&gt;를 제공하는 프로그래밍 API 에서는 정렬을 이용한 기능을 제공하는 경우가 많습니다.&lt;/p&gt;&lt;blockquote id=&quot;cce26c92-fba9-49fa-82ae-4a2fc28ff253&quot; class=&quot;&quot;&gt;ex) Java Collection API: &lt;code&gt;TreeMap&lt;/code&gt;, &lt;code&gt;TreeSet&lt;/code&gt; 은 이진 탐색 트리 구조로 트리를 쌓습니다. 따라서 특정 값들이 정렬로 보관되어 있고, 정렬특징을 이용하는 메서드들이 존재합니다.&lt;/blockquote&gt;&lt;h1 id=&quot;946209f2-7e79-40f0-890e-1612cf120d33&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 검색&lt;/strong&gt;&lt;/h1&gt;&lt;figure id=&quot;f6368ba3-a7d8-4c3e-8245-37bd24af00d0&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%202.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ohubE/btq9jvD52ZY/MtYPKqOwfSmJYJmKEMgtsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ohubE/btq9jvD52ZY/MtYPKqOwfSmJYJmKEMgtsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ohubE/btq9jvD52ZY/MtYPKqOwfSmJYJmKEMgtsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FohubE%2Fbtq9jvD52ZY%2FMtYPKqOwfSmJYJmKEMgtsK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;f0bf7c4f-c550-46fb-9f7b-9f0d585cd99a&quot; class=&quot;&quot;&gt;예시의 &lt;code&gt;이진 탐색트리&lt;/code&gt; 에서 &lt;code&gt;4&lt;/code&gt; 노드를 검색한다고 가정해봅시다.&lt;/p&gt;&lt;ul id=&quot;6508183f-8ca3-42ca-add9-4a2d8016b75d&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;첫번째로 만나는 노드는 &lt;code&gt;5&lt;/code&gt; 입니다.  검색노드가 &lt;code&gt;5&lt;/code&gt; 보다 작으므로, 왼쪽으로 이동합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;04af3d02-48c3-47d7-ae8f-5194644d44d1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;두번째로 만나는 노드는 &lt;code&gt;3&lt;/code&gt; 입니다.  검색노드가 &lt;code&gt;3&lt;/code&gt; 보다 크므로, 오른쪽으로 이동합니다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a761a42e-c1ee-4536-9346-1b69997e51df&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;세번째로 만나는 노드는 &lt;code&gt;4&lt;/code&gt; 입니다.  검색노드와 일치 하므로 해당 노드를 리턴 합니다.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote id=&quot;d536c3c0-6f6f-4f4d-b53e-d911bca4268c&quot; class=&quot;&quot;&gt;&lt;strong&gt;Q.&lt;/strong&gt; &lt;code&gt;4&lt;/code&gt; 의 존재유무를 검색 해보는건 의미가 있을거 같은데, 어차피 똑같은 값인 노드를 리턴하는게 의미가 있을까요? 

&lt;strong&gt;A.&lt;/strong&gt; 노드는 꼭 하나의 값을 가진 자료형이 아닙니다. 예를들어 아래의 노드의 자료형을 구성한다고 생각해봅시다. 이때 &lt;code&gt;4&lt;/code&gt; 로 검색하면 아래의 노드가 리턴 되고 리턴된 노드에서 제공하는 정보를 활용할 수 있습니다.&lt;/blockquote&gt;&lt;pre id=&quot;0d1eac05-c9d4-48fb-81ea-301eeb2f9f9d&quot; class=&quot;code&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;Mommoo&quot;,
  &quot;job&quot;: &quot;Developer&quot;,
  &quot;value&quot;: 4
}&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;58c3434c-5174-40c5-af04-4abed335d8f3&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 삽입&lt;/strong&gt;&lt;/h1&gt;&lt;p id=&quot;05377d09-add9-4ad4-bb4e-59dec661741f&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 탐색트리&lt;/code&gt; 에 노드를 넣는 순서는 다음과 같다고 가정합니다.&lt;/p&gt;&lt;p id=&quot;6928e932-0712-428a-94a3-5d9fc98a78dc&quot; class=&quot;&quot;&gt;&lt;code&gt;5&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;4&lt;/code&gt;, &lt;code&gt;7&lt;/code&gt;, &lt;code&gt;9&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;&lt;/p&gt;&lt;p id=&quot;aa1dd2f1-f4d6-4603-8b81-64ab615b019e&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;f8909a75-6fdd-4d89-af0c-74b57af05d91&quot; class=&quot;&quot;&gt;위에서 설명한 규칙대로 삽입과정을 거칩니다. &lt;/p&gt;&lt;p id=&quot;dc7ecffe-cfbc-4782-b87f-2b9032280252&quot; class=&quot;&quot;&gt;검색과 마찬가지로 이동하며, 자리를 찾아 노드를 저장합니다. &lt;/p&gt;&lt;figure id=&quot;4e49e471-0f09-4407-bb44-374ccbf79a95&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%203.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU8g5P/btq9gSzLWpv/IZaZveYYhSJK3Ra6KMrf0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU8g5P/btq9gSzLWpv/IZaZveYYhSJK3Ra6KMrf0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU8g5P/btq9gSzLWpv/IZaZveYYhSJK3Ra6KMrf0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU8g5P%2Fbtq9gSzLWpv%2FIZaZveYYhSJK3Ra6KMrf0k%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;h1 id=&quot;4557b4fe-2de1-4847-97b5-3592f265bfc0&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 삭제&lt;/strong&gt;&lt;/h1&gt;&lt;p id=&quot;8ce93391-2dab-4f8b-9cab-b40027a2ec09&quot; class=&quot;&quot;&gt;이진 탐색트리의 &lt;strong&gt;검색/삽입&lt;/strong&gt; 연산과 달리 &lt;strong&gt;삭제&lt;/strong&gt;는 조금 복잡합니다. &lt;/p&gt;&lt;p id=&quot;ddc337d5-bc68-48cf-b585-6a9631421e77&quot; class=&quot;&quot;&gt;고려해야 할 케이스를 3개로 나눌 수 있습니다.&lt;/p&gt;&lt;ul id=&quot;3836ca69-4479-4e2b-84d0-de282e3276fb&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삭제할 노드가 말단 노드인 경우(자식노드가 없는 경우)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;6300fb84-9bcc-43dd-b48b-718deae1d105&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삭제할 노드의 자식 노드가 1개인 경우&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;50e6f5ba-b677-4c1a-ba5a-7a510f9e881b&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삭제할 노드의 자식 노드가 2개인 경우&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;091928d8-fb9e-4484-9650-a10e6933cef0&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;dd6c1dc2-2374-4282-a9de-683b78b0e5ca&quot; class=&quot;&quot;&gt;삭제할 노드가 말단 노드인 경우&lt;/h3&gt;&lt;p id=&quot;8d2eb179-7fcb-45c6-824b-934f4ac2b6df&quot; class=&quot;&quot;&gt;해당 경우는 간단합니다. 삭제할 노드만 삭제해주면 됩니다.&lt;/p&gt;&lt;p id=&quot;e87c82ac-c7ba-4c00-9b3a-7e4ced3a83c2&quot; class=&quot;&quot;&gt;아래의 예시는 &lt;code&gt;2&lt;/code&gt; 노드를 지웁니다.&lt;/p&gt;&lt;figure id=&quot;0227dc7d-f9f4-429f-b2a2-9d2ee97e7f24&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%204.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWy8t/btq9fXavedz/RuTBLitDbO7wKyUU6gDQa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWy8t/btq9fXavedz/RuTBLitDbO7wKyUU6gDQa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWy8t/btq9fXavedz/RuTBLitDbO7wKyUU6gDQa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWy8t%2Fbtq9fXavedz%2FRuTBLitDbO7wKyUU6gDQa0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;90cf095e-1498-4e3a-a730-ab3487afda49&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;5ef8120f-fac3-412b-b26c-01c3dc87509f&quot; class=&quot;&quot;&gt;삭제할 노드의 자식 노드 1개인 경우&lt;/h3&gt;&lt;p id=&quot;8bde311e-ab4d-48d8-9298-17de20d5edfb&quot; class=&quot;&quot;&gt;이 경우도 어렵지 않습니다. 삭제할 노드의 자식들의 트리 구조 규칙은 삭제할 노드의 조상으로 부모를 바꾸더라도 규칙이 깨지지 않기 때문입니다.&lt;/p&gt;&lt;p id=&quot;33c8dbb5-066c-4dec-b44f-62bc7479ca21&quot; class=&quot;&quot;&gt;이래의 예시는 &lt;code&gt;7&lt;/code&gt; 노드를 지웁니다.&lt;/p&gt;&lt;figure id=&quot;39bb7055-b6e8-4139-b507-364aaa94be79&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%205.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TYKZP/btq9nCCNphD/Fn7SenAiHKjxS0rOshFO4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TYKZP/btq9nCCNphD/Fn7SenAiHKjxS0rOshFO4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TYKZP/btq9nCCNphD/Fn7SenAiHKjxS0rOshFO4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTYKZP%2Fbtq9nCCNphD%2FFn7SenAiHKjxS0rOshFO4K%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;386eae01-7a45-4e5b-8902-6a263b645259&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;bc0bd6f2-a786-441b-9622-ce1f1a027a13&quot; class=&quot;&quot;&gt;삭제할 노드의 자식 노드가 2개인 경우&lt;/h3&gt;&lt;p id=&quot;110bc84f-3415-4ea5-9279-e3590b90e503&quot; class=&quot;&quot;&gt;이 경우가 살짝 복잡합니다. 삭제할 노드의 자리에 대신 채울 노드를 찾아야 하는 과정이 필요합니다.&lt;/p&gt;&lt;p id=&quot;b146d3dc-8a61-4f61-b979-fa6c1340e3c4&quot; class=&quot;&quot;&gt;대신 채울 노드를 찾는 방법은 2가지 존재합니다.&lt;/p&gt;&lt;ul id=&quot;54019900-bdd7-45c8-a7ea-2ed6490f6923&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삭제할 노드의 왼쪽 &lt;code&gt;서브 트리&lt;/code&gt;에서 &lt;code&gt;최대 값 노드&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;b1fd86dc-1707-4cff-bf31-7326746044f5&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삭제할 노드의 오른쪽 &lt;code&gt;서브 트리&lt;/code&gt;에서 &lt;code&gt;최소 값 노드&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;1ffb3c6c-8555-4ef8-bd4d-c2620c80905a&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;0b2b3f30-1cbc-40b2-9613-dad39622cf87&quot; class=&quot;&quot;&gt;아래의 예시는 &lt;code&gt;20&lt;/code&gt; 노드를 삭제할 때, &lt;code&gt;서브 트리&lt;/code&gt;에서 위 방법으로, 노드를 찾아 대체합니다.&lt;/p&gt;&lt;figure id=&quot;02177532-33f2-4072-a550-28db201e8547&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%206.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ef7U05/btq9kRgo73D/kofVkv1BketHB79L73I7BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ef7U05/btq9kRgo73D/kofVkv1BketHB79L73I7BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ef7U05/btq9kRgo73D/kofVkv1BketHB79L73I7BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fef7U05%2Fbtq9kRgo73D%2FkofVkv1BketHB79L73I7BK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;h1 id=&quot;ff91a2d7-c2d1-43df-809e-933c07757229&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 시간 복잡도&lt;/strong&gt;&lt;/h1&gt;&lt;p id=&quot;0613f3d2-277c-4c25-88a1-bc1aaa4833dc&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;7cc7349d-7087-46fa-b3e5-7ab96353f39b&quot; class=&quot;&quot;&gt;검색/삽입 시간복잡도&lt;/h3&gt;&lt;p id=&quot;bf694725-63fd-45b4-b990-ed0ed0072772&quot; class=&quot;&quot;&gt;위에서 &lt;strong&gt;검색/삽입&lt;/strong&gt; 연산을 살펴보시면 아시겠지만, 모든 원소를 탐색하지 않는것이 특징입니다.&lt;/p&gt;&lt;p id=&quot;83a27331-224a-4411-919c-b2a043079b3b&quot; class=&quot;&quot;&gt;최악의 경우는 트리의 높이 만큼 탐색하는 경우라 볼 수 있겠습니다.&lt;/p&gt;&lt;p id=&quot;7f77488a-5010-4f79-a1c5-c8610eadb10f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;8caa1566-6767-4a63-a051-f61e52e2dc07&quot; class=&quot;&quot;&gt;따라서 높이가 &lt;code&gt;H&lt;/code&gt; 인경우의 &lt;strong&gt;검색/삽입&lt;/strong&gt;의 시간 복잡도는 &lt;code&gt;O(H)&lt;/code&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;bdb019de-e55b-4620-a197-f411b44674d5&quot; class=&quot;&quot;&gt;하지만, 시간복잡도는 원소의 개수로 표기할 때, 조금 더 좋은 표현이라 할 수 있습니다.&lt;/p&gt;&lt;p id=&quot;cb44f4f3-3b46-49ef-9cea-87d36e917c58&quot; class=&quot;&quot;&gt; &lt;code&gt;H&lt;/code&gt; 를 원소의 개수 &lt;code&gt;N&lt;/code&gt; 으로 표현해볼 수 없을까요?&lt;/p&gt;&lt;p id=&quot;33a7e50c-3667-4189-8287-42b4a8028fd2&quot; class=&quot;&quot;&gt;이진 트리는 대개, 원소의 개수가 &lt;code&gt;N&lt;/code&gt; 이면 &lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;log_2N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8888799999999999em;vertical-align:-0.19444em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 으로 치환 가능합니다. &lt;/p&gt;&lt;blockquote id=&quot;70a81d9f-ce22-46b7-9eff-ee5d9aec8737&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 검색트리&lt;/code&gt; 구조가 &lt;code&gt;완전 이진 트리&lt;/code&gt;라 가정할 때의 경우로 한정적이긴 합니다. 그래서 최악의 경우로 규정짓는 빅오 표기법으로는 애매하긴 합니다.&lt;/blockquote&gt;&lt;p id=&quot;65d40f00-609e-488e-a3d6-ec620e6f7914&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;70ffa79a-74ce-4e35-aa22-31e5a1cdf819&quot; class=&quot;&quot;&gt;따라서, &lt;strong&gt;검색/삽입&lt;/strong&gt; 연산의 시간복잡도는 &lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(log_2N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;으로 표기 가능합니다.&lt;/p&gt;&lt;p id=&quot;227f5a11-6738-4a50-8fbe-da36208d5198&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;7af716e3-025d-4470-8438-c12a6e3b1636&quot; class=&quot;&quot;&gt;삭제 시간복잡도&lt;/h3&gt;&lt;p id=&quot;739c5ab3-3199-4061-bd50-085d00aadaed&quot; class=&quot;&quot;&gt;&lt;strong&gt;삭제&lt;/strong&gt; 시간복잡도는 왜 따로 다룰까요? &lt;/p&gt;&lt;p id=&quot;9483eaa0-e78f-4f1a-ba51-5b933a6b2f56&quot; class=&quot;&quot;&gt;&lt;strong&gt;검색/삽입&lt;/strong&gt;과 동일하게 다룰 수 없는 찜찜한 구석이 있지 않았나요?&lt;/p&gt;&lt;p id=&quot;a38a9cb2-80a0-47db-be5a-302f915ce429&quot; class=&quot;&quot;&gt;네 맞습니다. &lt;strong&gt;삭제할 노드의 자식 노드가 2개인 경우&lt;/strong&gt; 에는 추가 연산이 있기에 시간 복잡도를 다시 따져봐야 할거 같습니다.&lt;/p&gt;&lt;p id=&quot;fdbd2b09-cfa5-45a1-81e2-a04f882f4cdf&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;3996a120-6c9a-43e2-9705-0451aa7d647a&quot; class=&quot;&quot;&gt;&lt;strong&gt;검색&lt;/strong&gt; 시간복잡도는 &lt;code&gt;O(H)&lt;/code&gt; 로 삭제할 대상을 검색하는 것도 동일하게 시간이 소모됩니다.&lt;/p&gt;&lt;p id=&quot;4f8be80c-4e08-4b0d-9e45-79f11fbf5bf1&quot; class=&quot;&quot;&gt;이때, &lt;strong&gt;삭제할 노드가 단말 노드&lt;/strong&gt;, &lt;strong&gt;삭제할 노드의 자식 노드가 1개&lt;/strong&gt; 인 경우는 지우거나 참조값만 붙여주면 되므로, &lt;code&gt;O(1)&lt;/code&gt; 의 시간이 소모된다고 볼 수 있습니다. 따라서 총 시간 복잡도는 &lt;code&gt;O(H + 1)&lt;/code&gt; → &lt;code&gt;O(H)&lt;/code&gt; 라 할 수 있겠네요.&lt;/p&gt;&lt;p id=&quot;47922fd5-4294-47a9-9723-a6c0d01fbf1c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;956a6e48-0202-4202-8048-b15b40be416e&quot; class=&quot;&quot;&gt;그렇다면 우리가 궁금한 &lt;strong&gt;삭제할 노드의 자식 노드가 2개&lt;/strong&gt; 인 경우는 어떨까요?&lt;/p&gt;&lt;p id=&quot;8dcca631-14f0-4bd9-846f-b3d5cf6a00ab&quot; class=&quot;&quot;&gt;검색 후, 대체할 노드만 찾는다면 대체 노드의 참조값만 바꿔주면 되므로 &lt;code&gt;O(1)&lt;/code&gt; 입니다.&lt;/p&gt;&lt;p id=&quot;66eb1e20-1d51-4630-a4f3-a36698018d81&quot; class=&quot;&quot;&gt;그말은, &lt;em&gt;대체할 노드를 찾는게 얼마나 걸리는지에 따라 시간 복잡도가 규정&lt;/em&gt; 된다는 점입니다.&lt;/p&gt;&lt;p id=&quot;69a1d246-dd11-475e-ae98-f52185bca1f3&quot; class=&quot;&quot;&gt;생각해보자면, 대체할 노드를 찾는것도 결국 탐색이 필요합니다. 다만 &lt;code&gt;Full-Tree&lt;/code&gt; 가 아닌 &lt;code&gt;Sub-Tree&lt;/code&gt; 에서의 검색이지요. 시간복잡도를 간단하게 정의해본다면 &lt;code&gt;O(H-K)&lt;/code&gt; 정도가 될것입니다. &lt;/p&gt;&lt;blockquote id=&quot;99c8cd1c-0aa3-469f-a6d5-03db8d1ada33&quot; class=&quot;&quot;&gt; &lt;code&gt;K&lt;/code&gt; 는 탐색을 시작할 높이 값입니다.&lt;/blockquote&gt;&lt;p id=&quot;0c6dbe17-0cb6-4749-9286-225b87e807a8&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;a6686178-a037-49b9-8208-3125120ab8ae&quot; class=&quot;&quot;&gt;시간복잡도는 최악의 경우를 생각해야 하므로, 최악의 경우의 &lt;code&gt;K&lt;/code&gt;는 &lt;code&gt;0&lt;/code&gt; 이 되는 경우가 있겠네요. &lt;/p&gt;&lt;blockquote id=&quot;79532696-37d1-4fb7-b5f6-8d26e4d49c10&quot; class=&quot;&quot;&gt;이 경우는 루트를 지운다는 의미입니다. &lt;/blockquote&gt;&lt;p id=&quot;892565b2-b3b8-44df-afdb-ca3db20ee594&quot; class=&quot;&quot;&gt;결국 서브트리를 탐색하는 시간복잡도도 &lt;code&gt;O(H)&lt;/code&gt; 라 생각할 수 있겠습니다.  &lt;/p&gt;&lt;p id=&quot;060e700a-e84d-49b3-881e-ef045905b8ab&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;0cc55e93-3cbe-4f2e-b838-08da62502f42&quot; class=&quot;&quot;&gt;정리해보자면, 아래의 작업이 필요합니다.&lt;/p&gt;&lt;ul id=&quot;f48833c7-3e7c-41c4-b846-d015802a8898&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삭제 노드를 탐색 &lt;code&gt;O(H)&lt;/code&gt; &lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;6120de0d-d5ad-4025-a80a-2444ebd7f02f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;대체 노드를 찾기 위한 서브 트리를 탐색 &lt;code&gt;O(H)&lt;/code&gt; &lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;e22d14fc-7f56-4f81-b157-23f680e9fbd4&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;참조값 변경 &lt;code&gt;O(1)&lt;/code&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;48453f88-077f-4a35-9751-f94e7a5b7ac7&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;03f8e018-e9f6-4c4e-ba43-a6ffc4ce942a&quot; class=&quot;&quot;&gt;따라서 &lt;strong&gt;삭제&lt;/strong&gt; 연산의 시간 복잡도는 &lt;code&gt;O(H + H + 1)&lt;/code&gt; → &lt;code&gt;O(2H)&lt;/code&gt; → &lt;code&gt;O(H)&lt;/code&gt; 라 볼 수 있습니다. 위에서 N으로 치환한것과 마찬가지로 &lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(log_2N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 으로 표기 가능하겠습니다.&lt;/p&gt;&lt;p id=&quot;07bbbadb-beda-40f6-9857-50a60453e049&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;dbaa8786-c939-40cd-a5db-d2c1083f47aa&quot; class=&quot;&quot;&gt;&lt;strong&gt;결론적으로 탐색/삽입/삭제 시간복잡도는 전부 동일하게 &lt;/strong&gt;&lt;strong&gt;&lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(log_2N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;&lt;strong&gt; 라고 정의할 수 있습니다.&lt;/strong&gt;&lt;/p&gt;&lt;h1 id=&quot;8ca88fe1-ba02-4879-9850-b403a5aae52a&quot; class=&quot;&quot;&gt;&lt;strong&gt;이진 탐색트리 사용시 고려할 점&lt;/strong&gt;&lt;/h1&gt;&lt;h3 id=&quot;c1510092-003a-4dd2-9a18-6893ceee751d&quot; class=&quot;&quot;&gt;&lt;strong&gt;중복값 처리 (주관적 의견. 뇌피셜 주의보!)&lt;/strong&gt;&lt;/h3&gt;&lt;p id=&quot;2e192442-bb1e-4ed6-97ec-917cad681976&quot; class=&quot;&quot;&gt;지금까지 보여드린 예시는 중복값이 없는 예시입니다. &lt;code&gt;이진 탐색트리&lt;/code&gt; 는 중복값을 허용하면 안된다는 자료가 많이 보이는거 같습니다.&lt;/p&gt;&lt;p id=&quot;c6735432-7850-410a-a46f-3609ab5c8634&quot; class=&quot;&quot;&gt;현실적으로 중복값이 충분히 나올 수 있는지라, 중복값 비허용 규칙은 너무 잔인하다고 느꼈습니다. &lt;/p&gt;&lt;p id=&quot;fc5b3007-26eb-4558-b89b-d1744814f6e8&quot; class=&quot;&quot;&gt;제가 짧게 연구 해봤을때, 중복값을 노드의 왼쪽에 배치할 것인지, 오른쪽에 배치할 것인지만 정하고 배치하면 무리없이 동작합니다.&lt;/p&gt;&lt;p id=&quot;9cc54b18-d777-4b5e-935f-4ec4267fc985&quot; class=&quot;&quot;&gt;다만, 중요한것은 중복의 개수만큼 끝까지 내려간 후, 연결되어야 한다는 점입니다.&lt;/p&gt;&lt;p id=&quot;18981ca6-88e6-4762-badd-5a328cbaf625&quot; class=&quot;&quot;&gt;아래의 예시에서 왼쪽의 경우는 안됩니다. 트리 규칙이 깨지게 됩니다.&lt;/p&gt;&lt;figure id=&quot;989c5d6f-d1ea-4168-9a46-bdb94749fa86&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%207.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n5T6O/btq9gYHwjYa/BagpxkbBP2QP4fko3Uuec1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n5T6O/btq9gYHwjYa/BagpxkbBP2QP4fko3Uuec1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n5T6O/btq9gYHwjYa/BagpxkbBP2QP4fko3Uuec1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn5T6O%2Fbtq9gYHwjYa%2FBagpxkbBP2QP4fko3Uuec1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;6b1507d3-29d1-4e06-9970-46d7814f0b9b&quot; class=&quot;&quot;&gt;다만 중복의 개수가 많아지면, 트리의 높이가 너무 커지게 되고 시간복잡도가 비약적으로 올라가게 될것입니다.&lt;/p&gt;&lt;p id=&quot;c531278f-cba4-495c-ac9a-fedef68f59f4&quot; class=&quot;&quot;&gt;그렇다보니, 다음과 같은 아이디어도 좋을거 같습니다. &lt;/p&gt;&lt;ul id=&quot;6d465661-f1ff-48c3-b09b-ed63d9f8bcbd&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;단순히 값만 정의된 노드라면, 노드에 카운팅을 추가.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;784f5325-05ef-48f6-b395-28e415ac14e4&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;특정 자료형으로 정의된 노드라면, 해당 노드를 여러개 저장할 수 있는 자료구조를 감싼 wrapper 노드로 트리를 구성.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;61cdf36d-fa16-4a93-878c-d59956430a4c&quot; class=&quot;&quot;&gt;다만 추가 공간을 쓰게 되는 단점은 있는거 같습니다.&lt;/p&gt;&lt;p id=&quot;e140b9b6-212b-4206-a97a-a19221495773&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;c107bc12-c8bc-46e7-9eae-c7ac9041d0f0&quot; class=&quot;&quot;&gt;&lt;strong&gt;한쪽으로 쏠린 트리&lt;/strong&gt;&lt;/h3&gt;&lt;p id=&quot;a503e2a6-7c0e-409f-b256-1226e08c3303&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 검색트리&lt;/code&gt; 의 시간복잡도는 &lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(log_2N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 이라 소개드렸는데, 사실 최악의 경우는 &lt;code&gt;O(N)&lt;/code&gt;이 나오게 됩니다.&lt;/p&gt;&lt;blockquote id=&quot;bb51c492-c656-4539-8371-5ce636557e9f&quot; class=&quot;&quot;&gt;&lt;strong&gt;Q.&lt;/strong&gt; 빅오 표기법은 최악의 시간인 경우로 표기해야 하므로, &lt;code&gt;이진 탐색트리&lt;/code&gt; 의 연산 시간복잡도는 &lt;code&gt;O(N)&lt;/code&gt; 아닐까요?

&lt;strong&gt;A.&lt;/strong&gt; 엄밀히 따지자면 &lt;code&gt;O(N)&lt;/code&gt;이 맞습니다. 

빅오표기법의 약점은 빈번도를 체크 하지 못합니다. 100번에 1번 나오는 경우의 수 때문에 최악의 경우로 시간을 규정하는게 제대로 된 측정값 일까요? 

그렇기에 퀵소트도 &lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.064108em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141079999999999em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 이라 하지 않고, 대체적으로 측정되는 &lt;code&gt;&lt;style&gt;@import url('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.2/katex.min.css')&lt;/style&gt;&lt;span data-token-index=&quot;0&quot; contenteditable=&quot;false&quot; class=&quot;notion-text-equation-token&quot; style=&quot;user-select:all;-webkit-user-select:all;-moz-user-select:all&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(Nlog_2N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;Nl&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.30110799999999993em;&quot;&gt;&lt;span style=&quot;top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;﻿&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 이라고 표기합니다.  &lt;/blockquote&gt;&lt;p id=&quot;d1b2ba1a-130c-438d-a54d-816568b6c0d6&quot; class=&quot;&quot;&gt;간단한 예로, 정렬된 순서로 요소가 들어가게 된다면 아래와 같은 트리 구조로 구성되게 됩니다.&lt;/p&gt;&lt;p id=&quot;44d9d27f-ee8f-4caa-bb87-46238d2956ee&quot; class=&quot;&quot;&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;, &lt;code&gt;4&lt;/code&gt;, &lt;code&gt;5&lt;/code&gt;&lt;/p&gt;&lt;figure id=&quot;74b5230c-6081-47bd-8cfb-be66897e5f93&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;%5B%E1%84%8C%E1%85%A1%E1%84%85%E1%85%AD%E1%84%80%E1%85%AE%E1%84%8C%E1%85%A9%5D%20%E1%84%8B%E1%85%B5%E1%84%8C%E1%85%B5%E1%86%AB%E1%84%90%E1%85%A1%E1%86%B7%E1%84%89%E1%85%A2%E1%86%A8%E1%84%90%E1%85%B3%E1%84%85%E1%85%B5%206910d57f122641b4a30994b7251f9218/Untitled%208.png&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLI1d9/btq9lSTFzxx/YpKUkoF0fAX0tNvDHwMVvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLI1d9/btq9lSTFzxx/YpKUkoF0fAX0tNvDHwMVvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLI1d9/btq9lSTFzxx/YpKUkoF0fAX0tNvDHwMVvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLI1d9%2Fbtq9lSTFzxx%2FYpKUkoF0fAX0tNvDHwMVvk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;6c4dbdf6-0bad-4bb3-9623-f6f1b977ceae&quot; class=&quot;&quot;&gt;해당 구조는 &lt;code&gt;트리&lt;/code&gt; 라기보다, &lt;code&gt;연결 리스트&lt;/code&gt; 의 구조로 잡혀있습니다.&lt;/p&gt;&lt;p id=&quot;7cc9f519-5591-4179-914f-52ed6a8e9376&quot; class=&quot;&quot;&gt;높이가 낮을 수록 성능에 유리한 &lt;code&gt;이진 검색트리&lt;/code&gt;가 이렇게 개수만큼 높이가 쌓이게 되면, &lt;strong&gt;검색/삽입/삭제&lt;/strong&gt;는 선형 연산이 되버립니다. 선형 연산이기 때문에 시간 복잡도는 &lt;code&gt;O(N)&lt;/code&gt; 이 됩니다.  &lt;/p&gt;&lt;blockquote id=&quot;0ce52ebd-0f1d-410f-af56-2661d03af34c&quot; class=&quot;&quot;&gt;&lt;code&gt;5&lt;/code&gt;를 찾으려면 &lt;code&gt;5번 탐색&lt;/code&gt; 이 필요하네요.&lt;/blockquote&gt;&lt;p id=&quot;136b78ab-dc77-4dfe-a4dc-66edb8048bb0&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;h3 id=&quot;a8edcc49-ea32-46fa-9ae9-263bfce9a849&quot; class=&quot;&quot;&gt;&lt;strong&gt;균형 이진 탐색트리&lt;/strong&gt;&lt;/h3&gt;&lt;p id=&quot;c173e606-8a0d-4452-ae40-a99d19363d40&quot; class=&quot;&quot;&gt;&lt;code&gt;이진 탐색트리&lt;/code&gt; 는 &lt;code&gt;완전 이진트리&lt;/code&gt; 구조로 쌓여야, 요소 개수 N개의 대비 최소 높이가 됩니다.&lt;/p&gt;&lt;p id=&quot;3ba85b21-e0ca-47d1-9b95-26ef35937796&quot; class=&quot;&quot;&gt;그렇다면, 요소를 어떤 순서로 삽입 하더라도, 강제적으로 &lt;code&gt;완전 이진트리&lt;/code&gt; 구조로 되게끔 규칙을 만들면 어떨까요!?&lt;/p&gt;&lt;p id=&quot;5124c34f-4970-4ec6-871a-8d3bc2a31c17&quot; class=&quot;&quot;&gt;그러한 알고리즘을 추가한 &lt;code&gt;이진 탐색트리&lt;/code&gt; 를 &lt;code&gt;균형 이진 탐색트리&lt;/code&gt; 라 부르며, 대표적은 구현체는 &lt;code&gt;AVL 트리&lt;/code&gt; , &lt;code&gt;레드 블랙 트리&lt;/code&gt; 등이 있습니다.&lt;/p&gt;&lt;p id=&quot;ee1276c7-0ea5-454b-b25c-0d6422592985&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;fcaffca0-c521-43f6-844a-b5793fc56979&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;7f72ddfd-0579-4d22-82d9-f53e76336a87&quot; class=&quot;&quot;&gt;오늘 포스팅은 여기까지 입니다.&lt;/p&gt;&lt;p id=&quot;de2eaf31-ae5a-40d8-a6b1-7fcb9a1ef531&quot; class=&quot;&quot;&gt;뇌피셜인 부분도 있으니, 주의해서 읽어주셨으면 합니다. &lt;/p&gt;&lt;p id=&quot;fce90b21-a77e-456d-9261-a1230c17a878&quot; class=&quot;&quot;&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;div class=&quot;n2t_comment&quot;&gt;&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;</description>
      <category>자료구조</category>
      <category>BinarySearchTree</category>
      <category>binaryTree</category>
      <category>이진검색트리</category>
      <category>이진탐색트리</category>
      <category>이진트리</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/101</guid>
      <comments>https://mommoo.tistory.com/101#entry101comment</comments>
      <pubDate>Mon, 12 Jul 2021 01:33:29 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 트리(Tree)</title>
      <link>https://mommoo.tistory.com/95</link>
      <description>&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='UTF-8'&gt;&lt;meta name='viewport' content='width=device-width initial-scale=1'&gt;
&lt;title&gt;Tree 란&lt;/title&gt;&lt;link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&amp;subset=latin,latin-ext' rel='stylesheet' type='text/css' /&gt;&lt;style type='text/css'&gt;html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:&quot;Lucida Console&quot;,Consolas,&quot;Courier&quot;,monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 40px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li &gt; figure:first-child { margin-top: -20px; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; }
input[type=&quot;checkbox&quot;], input[type=&quot;radio&quot;] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 2; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type=&quot;checkbox&quot;] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure &gt; table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote &gt; :last-child { margin-bottom: 0px; }
blockquote &gt; :first-child, li &gt; :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  html.blink-to-pdf { font-size: 13px; }
  .typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  @page { margin: 20mm 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p &gt; .md-image:only-child:not(.md-img-error) img, p &gt; img:only-child { display: block; margin: auto; }
p &gt; .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable=&quot;true&quot;]:active, [contenteditable=&quot;true&quot;]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item &gt; input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: &quot;.&quot;; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: &quot;Segoe UI Symbol&quot;, sans-serif; }
.md-diagram-panel &gt; svg { max-width: 100%; }
[lang=&quot;mermaid&quot;] svg, [lang=&quot;flow&quot;] svg { max-width: 100%; }
[lang=&quot;mermaid&quot;] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }


:root { --side-bar-bg-color: #fafafa; --control-text-color: #777; }
@font-face { font-family: &quot;Open Sans&quot;; font-style: normal; font-weight: normal; src: local(&quot;Open Sans Regular&quot;), url(&quot;./github/400.woff&quot;) format(&quot;woff&quot;); }
@font-face { font-family: &quot;Open Sans&quot;; font-style: italic; font-weight: normal; src: local(&quot;Open Sans Italic&quot;), url(&quot;./github/400i.woff&quot;) format(&quot;woff&quot;); }
@font-face { font-family: &quot;Open Sans&quot;; font-style: normal; font-weight: bold; src: local(&quot;Open Sans Bold&quot;), url(&quot;./github/700.woff&quot;) format(&quot;woff&quot;); }
@font-face { font-family: &quot;Open Sans&quot;; font-style: italic; font-weight: bold; src: local(&quot;Open Sans Bold Italic&quot;), url(&quot;./github/700i.woff&quot;) format(&quot;woff&quot;); }
html { font-size: 16px; }
body { font-family: &quot;Open Sans&quot;, &quot;Clear Sans&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; color: rgb(51, 51, 51); line-height: 2; }
#write { max-width: 860px; margin: 0px auto; padding: 30px 30px 100px; }
#write &gt; ul:first-child, #write &gt; ol:first-child { margin-top: 30px; }
a { color: rgb(65, 131, 196); }
h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; }
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; }
h1 tt, h1 code { font-size: inherit; }
h2 tt, h2 code { font-size: inherit; }
h3 tt, h3 code { font-size: inherit; }
h4 tt, h4 code { font-size: inherit; }
h5 tt, h5 code { font-size: inherit; }
h6 tt, h6 code { font-size: inherit; }
h1 { padding-bottom: 0.3em; font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid rgb(238, 238, 238); margin-top: 2rem !important; }
h2 { padding-bottom: 0.3em; font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid rgb(238, 238, 238); }
h3 { font-size: 1.5em; line-height: 1.43; }
h4 { font-size: 1.25em; }
h5 { font-size: 1em; }
h6 { font-size: 1em; color: rgb(119, 119, 119); }
p, blockquote, ul, ol, dl, table { margin: 0.8em 0px; }
li &gt; ol, li &gt; ul { margin: 0px; }
hr { height: 2px; padding: 0px; margin: 16px 0px; background-color: rgb(231, 231, 231); border: 0px none; overflow: hidden; box-sizing: content-box; }
li p.first { display: inline-block; }
ul, ol { padding-left: 30px; }
ul:first-child, ol:first-child { margin-top: 0px; }
ul:last-child, ol:last-child { margin-bottom: 0px; }
blockquote { border-left: 4px solid rgb(223, 226, 229); padding: 0px 15px; color: rgb(119, 119, 119); }
blockquote blockquote { padding-right: 0px; }
table { padding: 0px; word-break: initial; }
table tr { border-top: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; }
table tr:nth-child(2n), thead { background-color: rgb(248, 248, 248); }
table tr th { font-weight: bold; border-width: 1px 1px 0px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-top-color: rgb(223, 226, 229); border-right-color: rgb(223, 226, 229); border-left-color: rgb(223, 226, 229); border-image: initial; border-bottom-style: initial; border-bottom-color: initial; text-align: left; margin: 0px; padding: 6px 13px; }
table tr td { border: 1px solid rgb(223, 226, 229); text-align: left; margin: 0px; padding: 6px 13px; }
table tr th:first-child, table tr td:first-child { margin-top: 0px; }
table tr th:last-child, table tr td:last-child { margin-bottom: 0px; }
.CodeMirror-lines { padding-left: 4px; }
.code-tooltip { box-shadow: rgba(0, 28, 36, 0.3) 0px 1px 1px 0px; border-top: 1px solid rgb(238, 242, 242); }
.md-fences, code, tt { border: 1px solid rgb(231, 234, 237); background-color: rgb(248, 248, 248); border-radius: 3px; padding: 2px 4px 0px; font-size: 0.9em; }
code { background-color: rgb(243, 244, 244); color: rgb(198, 40, 40); padding: 4px; }
.md-fences { margin-bottom: 15px; margin-top: 15px; padding: 8px 1em 6px; }
.md-task-list-item &gt; input { margin-left: -1.3em; }
@media print {
  html { font-size: 13px; }
  table, pre { break-inside: avoid; }
  pre { word-wrap: break-word; }
}
.md-fences { background-color: rgb(248, 248, 248); }
#write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: rgb(247, 247, 247); border: 0px; border-radius: 3px; color: rgb(119, 119, 119); margin-top: 0px !important; }
.mathjax-block &gt; .code-tooltip { bottom: 0.375rem; }
.md-mathjax-midline { background: rgb(250, 250, 250); }
#write &gt; h3.md-focus::before { left: -1.5625rem; top: 0.375rem; }
#write &gt; h4.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
#write &gt; h5.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
#write &gt; h6.md-focus::before { left: -1.5625rem; top: 0.285714rem; }
.md-image &gt; .md-meta { border-radius: 3px; padding: 2px 0px 0px 4px; font-size: 0.9em; color: inherit; }
.md-tag { color: rgb(167, 167, 167); opacity: 1; }
.md-toc { margin-top: 20px; padding-bottom: 20px; }
.sidebar-tabs { border-bottom: none; }
#typora-quick-open { border: 1px solid rgb(221, 221, 221); background-color: rgb(248, 248, 248); }
#typora-quick-open-item { background-color: rgb(250, 250, 250); border-color: rgb(254, 254, 254) rgb(229, 229, 229) rgb(229, 229, 229) rgb(238, 238, 238); border-style: solid; border-width: 1px; }
.on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); }
header, .context-menu, .megamenu-content, footer { font-family: &quot;Segoe UI&quot;, Arial, sans-serif; }
.file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state { visibility: visible; }
.mac-seamless-mode #typora-sidebar { background-color: var(--side-bar-bg-color); }
.md-lang { color: rgb(180, 101, 77); }
.html-for-mac .context-menu { --item-hover-bg-color: #E6F0FE; }
#md-notification .btn { border: 0px; }
.dropdown-menu .divider { border-color: rgb(229, 229, 229); }





 .typora-export li, .typora-export p, .typora-export,  .footnote-line {white-space: normal;} 
&lt;/style&gt;
&lt;/head&gt;
&lt;body class='typora-export os-windows' &gt;
&lt;div  id='write'  class = 'is-node'&gt;&lt;p&gt;안녕하세요.&lt;/p&gt;&lt;p&gt;오늘은 자료구조 트리(Tree)에 대해 포스팅 합니다.&lt;/p&gt;&lt;p&gt;필수적으로 알아야 할것들만 정리하였습니다.&lt;/p&gt;&lt;p&gt;트리구조에 대해 대략적으로 설명하므로, 특정 용어나 개념들은 따로 찾아봐야 합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;&lt;a name='header-n511' class='md-header-anchor '&gt;&lt;/a&gt;트리(Tree) 란&lt;/h2&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFhtmG/btq9eu0TEjY/NnE7ktXqMiu2jcZTmBsceK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFhtmG/btq9eu0TEjY/NnE7ktXqMiu2jcZTmBsceK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFhtmG/btq9eu0TEjY/NnE7ktXqMiu2jcZTmBsceK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFhtmG%2Fbtq9eu0TEjY%2FNnE7ktXqMiu2jcZTmBsceK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;&lt;p&gt;위 본문의 그림과 같이 &lt;code&gt;노드&lt;/code&gt; 와 &lt;code&gt;간선&lt;/code&gt;으로 이루어진 것을 &lt;code&gt;그래프(Graph)&lt;/code&gt; 라고 합니다.&lt;/p&gt;&lt;p&gt;&lt;code&gt;트리&lt;/code&gt;는 이러한 &lt;code&gt;그래프&lt;/code&gt; 의 일종 입니다. 아래의 규칙을 따르는 &lt;code&gt;그래프&lt;/code&gt;를 &lt;code&gt;트리&lt;/code&gt;라고 일컫습니다.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;사실 규칙을 외울 필요는 없고, 이런 형태구나 정도로 기억하면 될 거 같습니다.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n501' class='md-header-anchor '&gt;&lt;/a&gt;트리 규칙&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;특정 노드는 오직 하나의 조상 노드와 N 개의 자식 노드와 연결됩니다.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;특정노드에서 조상노드, 자식노드는 레벨의 차이가 반드시 1이어야 합니다.&lt;/li&gt;&lt;li&gt;&lt;code&gt;C 노드&lt;/code&gt;는 하나의 조상 노드인 &lt;code&gt;A&lt;/code&gt;와 2개의 자식 노드인 &lt;code&gt;G&lt;/code&gt; , &lt;code&gt;H&lt;/code&gt;와 연결됩니다. &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;여러 노드가 한 노드를 가리킬 수 없습니다.&lt;/li&gt;&lt;li&gt;노드와 노드를 잇는 길(&lt;code&gt;간선&lt;/code&gt;)이 하나만 존재합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;또한 트리는 다음과 같은 특징들을 가집니다. &lt;/p&gt;&lt;h4&gt;&lt;a name='header-n172' class='md-header-anchor '&gt;&lt;/a&gt;높이&lt;/h4&gt;&lt;p&gt;트리는 루트로 부터 &lt;code&gt;레벨&lt;/code&gt; 을 셀 수가 있는데 이때 최대 레벨의 값을 &lt;code&gt;높이&lt;/code&gt;라 부를 수 있습니다.&lt;/p&gt;&lt;p&gt;따라서, 예제의 트리의 높이는 3입니다.  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n263' class='md-header-anchor '&gt;&lt;/a&gt;말단 노드(리프 노드)&lt;/h4&gt;&lt;p&gt;자식이 없는 노드를 &lt;code&gt;말단 노드&lt;/code&gt; 또는 &lt;code&gt;리프 노드&lt;/code&gt;라 일컫습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n176' class='md-header-anchor '&gt;&lt;/a&gt;형제 노드&lt;/h4&gt;&lt;p&gt;같은 부모를 가지는 노드들을 &lt;code&gt;형제(sibling)&lt;/code&gt;노드라 부릅니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n178' class='md-header-anchor '&gt;&lt;/a&gt;서브 트리&lt;/h4&gt;&lt;p&gt;트리안에서 특정 범위를 묶어 하나의 작은 트리를 구성 할 수 있습니다.&lt;/p&gt;&lt;p&gt;예제 트리의 &lt;strong&gt;&lt;em&gt;빨간 박스&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;파란 박스&lt;/em&gt;&lt;/strong&gt; 와 같은 예시처럼 묶을 수 있으며 이를 &lt;code&gt;서브 트리&lt;/code&gt;라 일컫습니다. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;&lt;a name='header-n314' class='md-header-anchor '&gt;&lt;/a&gt;이진트리 (Binary Tree) 란&lt;/h2&gt;&lt;p&gt;트리의 특정 노드는 자식의 개수를 제한 없이 가질 수 있는데요.&lt;/p&gt;&lt;p&gt;이때, &lt;strong&gt;&lt;em&gt;최대 2개의 자식 노드만 가질 수 있다&lt;/em&gt;&lt;/strong&gt; 는 조건을 추가한것을 &lt;code&gt;이진트리&lt;/code&gt;라고 부릅니다.&lt;/p&gt;&lt;p&gt;쉽게 말해, 노드가 &lt;code&gt;왼쪽 자식&lt;/code&gt; 과 &lt;code&gt;오른쪽 자식&lt;/code&gt;을 갖는 특징을 가집니다.&lt;/p&gt;&lt;p&gt;예제의 트리도 &lt;code&gt;이진트리&lt;/code&gt;라 부를 수 있습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;이진트리&lt;/code&gt;구조를 갖추면, 해당 구조가 제공하는 연산의 이점들이 존재합니다.&lt;/p&gt;&lt;p&gt;예를들면, 노드의 개수를 알면 높이를 알 수 있습니다.&lt;/p&gt;&lt;p&gt;레벨(N)당 노드의 개수는 2^N 이기 때문입니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;대표적으로 사용되는 연산은 탐색입니다.&lt;/p&gt;&lt;p&gt;너무나도 유명한 &lt;code&gt;이진 탐색 트리&lt;/code&gt; 를 구성할 수 있습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;특정 조건이 추가된 &lt;code&gt;이진 트리&lt;/code&gt;들이 있습니다.&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n223' class='md-header-anchor '&gt;&lt;/a&gt;완전 이진트리&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;모든 레벨에서의 노드가 꽉차 있어야 합니다.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;예외적으로, 마지막 레벨에서의 노드는 꽉차 있지 않아도 되지만 왼쪽에서 차례대로 채워져야만 합니다.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;예시 트리도 완전 이진트리 입니다.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;예시 트리에서 &lt;code&gt;N&lt;/code&gt; 만 없애거나, (&lt;code&gt;M&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt;) 을 없애거나, (&lt;code&gt;L&lt;/code&gt;, &lt;code&gt;M&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt;)을 없앤 케이스도 &lt;code&gt;완전 이진트리&lt;/code&gt;입니다.&lt;/p&gt;&lt;p&gt;  &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;&lt;a name='header-n240' class='md-header-anchor '&gt;&lt;/a&gt;전 이진트리&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;특정 노드의 자식이 0개 또는 2개로만 구성되어 있는 트리를 의미합니다.&lt;/li&gt;&lt;li&gt;예시 트리에서 (&lt;code&gt;G&lt;/code&gt;, &lt;code&gt;H&lt;/code&gt;)를 없애거나, (&lt;code&gt;E&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt;, &lt;code&gt;K&lt;/code&gt;, &lt;code&gt;L&lt;/code&gt;, &lt;code&gt;M&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt;)을 없앤 케이스를 &lt;code&gt;전 이진트리&lt;/code&gt;로 볼 수 있습니다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n345' class='md-header-anchor '&gt;&lt;/a&gt;포화 이진트리&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;모든 말단 노드가 같은 높이에 있어야 합니다. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;예를들어, (&lt;code&gt;E&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt;, &lt;code&gt;K&lt;/code&gt;, &lt;code&gt;L&lt;/code&gt;, &lt;code&gt;M&lt;/code&gt;, &lt;code&gt;N&lt;/code&gt;)을 없앤 케이스를 &lt;code&gt;전 이진트리&lt;/code&gt;형태는 말단 노드인 &lt;code&gt;B&lt;/code&gt;가 다른 말단 노드인 &lt;code&gt;G&lt;/code&gt;와 레벨이 동일하지 않습니다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;마지막 레벨에서 노드의 개수가 최대가 되어야 합니다.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;예시 트리도 &lt;code&gt;포화 이진트리&lt;/code&gt;라 부를 수 있습니다.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n349' class='md-header-anchor '&gt;&lt;/a&gt;이진 탐색트리&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;노드의 자식은 아래의 규칙을 따릅니다.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;오른쪽 노드의 값 &amp;lt; 현재 노드의 값 &amp;lt; 왼쪽노드의 값&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;값을 이용한 규칙을 통해 구조를 쌓으면 추후 이진 탐색을 사용할 수 있습니다.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;다음 포스팅에서 자세히 다룰 예정입니다.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;&lt;a name='header-n317' class='md-header-anchor '&gt;&lt;/a&gt;이진트리 순회&lt;/h2&gt;&lt;p&gt;이진트리를 연산하기 위해서는 순회는 빼놓을 수 없습니다. 방문하지 않으면 값을 알 수 없기 때문입니다.&lt;/p&gt;&lt;p&gt;순회는 많이 알려진 방법인 &lt;code&gt;너비우선탐색(BFS)&lt;/code&gt;, &lt;code&gt;깊이우선탐색(DFS)&lt;/code&gt; 으로 나눌 수 있습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n329' class='md-header-anchor '&gt;&lt;/a&gt;너비우선탐색(BFS)&lt;/h4&gt;&lt;p&gt;레벨순으로 차례대로 탐색합니다.&lt;/p&gt;&lt;p&gt;예시 트리를 기준으로 설명드리자면, 아래와 같이 탐색합니다.&lt;/p&gt;&lt;p&gt;&lt;code&gt;Root&lt;/code&gt; &amp;gt; &lt;code&gt;A&lt;/code&gt; &amp;gt; &lt;code&gt;B&lt;/code&gt; &amp;gt; &lt;code&gt;C&lt;/code&gt; &amp;gt; &lt;code&gt;D&lt;/code&gt; &amp;gt; &lt;code&gt;E&lt;/code&gt; &amp;gt; &lt;code&gt;F&lt;/code&gt; &amp;gt; &lt;code&gt;G&lt;/code&gt; &amp;gt; &lt;code&gt;H&lt;/code&gt; &amp;gt; &lt;code&gt;I&lt;/code&gt; &amp;gt; &lt;code&gt;J&lt;/code&gt; &amp;gt; &lt;code&gt;K&lt;/code&gt; &amp;gt; &lt;code&gt;L&lt;/code&gt; &amp;gt; &lt;code&gt;M&lt;/code&gt; &amp;gt; &lt;code&gt;N&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;a name='header-n366' class='md-header-anchor '&gt;&lt;/a&gt;깊이우선탐색(DFS)&lt;/h4&gt;&lt;p&gt;탐색 방법 3가지가 존재합니다.&lt;/p&gt;&lt;p&gt;기본적으로 왼쪽 자식 노드에서 오른쪽 자식 노드로 순회를 한다고 가정(&lt;code&gt;B&lt;/code&gt; -&amp;gt; &lt;code&gt;C&lt;/code&gt;)하고 현재 노드(&lt;code&gt;A&lt;/code&gt;)가 방문되는 순서를 기억하면 좋습니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNZJ9A/btq9e0yaZdn/CRONhodZUu1YQ3n65G8A0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNZJ9A/btq9e0yaZdn/CRONhodZUu1YQ3n65G8A0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNZJ9A/btq9e0yaZdn/CRONhodZUu1YQ3n65G8A0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNZJ9A%2Fbtq9e0yaZdn%2FCRONhodZUu1YQ3n65G8A0k%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;전위 순회 (pre-order traversal)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;현재 노드(&lt;code&gt;A&lt;/code&gt;)가 첫번째로 방문 됩니다.&lt;/li&gt;&lt;li&gt;&lt;code&gt;B&lt;/code&gt; -&amp;gt;&lt;code&gt;C&lt;/code&gt;는 고정이므로 첫번째로 방문되려면 맨 앞에 배치 되어야 합니다.&lt;/li&gt;&lt;li&gt;&lt;code&gt;A&lt;/code&gt; -&amp;gt; &lt;code&gt;B&lt;/code&gt; -&amp;gt; &lt;code&gt;C&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;중위 순회 (in-order traversal)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;현재 노드(&lt;code&gt;A&lt;/code&gt;)가 중간에 방문 됩니다.&lt;/li&gt;&lt;li&gt;&lt;code&gt;B&lt;/code&gt; -&amp;gt; &lt;code&gt;A&lt;/code&gt; -&amp;gt; &lt;code&gt;C&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;후위 순회 (post-order traversal)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;현재 노드(&lt;code&gt;A&lt;/code&gt;)가 마지막에 방문 됩니다.&lt;/li&gt;&lt;li&gt;&lt;code&gt;B&lt;/code&gt; -&amp;gt; &lt;code&gt;C&lt;/code&gt; -&amp;gt; &lt;code&gt;A&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;위 예시는 &lt;code&gt;서브 트리&lt;/code&gt;가 존재하지 않는 트리인 경우 입니다.&lt;/p&gt;&lt;p&gt;만약 &lt;code&gt;서브 트리&lt;/code&gt;가 존재한다면 어떻게 방문할까요?&lt;/p&gt;&lt;p&gt;이때는 &lt;code&gt;서브 트리&lt;/code&gt;를 하나의 노드라 생각하고 방문합니다. &lt;/p&gt;&lt;p&gt;다음의 트리를 이용하여 전위 순회로 알아봅시다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sDI0G/btq9gASQCoA/C1pdsfhipuq2KX4pefsFv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sDI0G/btq9gASQCoA/C1pdsfhipuq2KX4pefsFv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sDI0G/btq9gASQCoA/C1pdsfhipuq2KX4pefsFv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsDI0G%2Fbtq9gASQCoA%2FC1pdsfhipuq2KX4pefsFv1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;&lt;p&gt;해당 예시의 &lt;code&gt;서브 트리&lt;/code&gt;는 (&lt;code&gt;B&lt;/code&gt;, &lt;code&gt;D&lt;/code&gt;, &lt;code&gt;E&lt;/code&gt;) 입니다. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;STEP1:&lt;/em&gt;&lt;/strong&gt;  &lt;code&gt;서브 트리&lt;/code&gt;를 하나의 노드(&lt;code&gt;BB&lt;/code&gt;)로 치환하여 전위 순회를 진행합니다.(&lt;code&gt;A&lt;/code&gt; -&amp;gt; &lt;code&gt;BB&lt;/code&gt; -&amp;gt; &lt;code&gt;C&lt;/code&gt;)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;STEP2:&lt;/em&gt;&lt;/strong&gt;  &lt;code&gt;BB&lt;/code&gt;도  트리이므로 내부적으로 순회를 똑같이 진행합니다. (&lt;code&gt;B&lt;/code&gt; -&amp;gt; &lt;code&gt;D&lt;/code&gt; -&amp;gt; &lt;code&gt;E&lt;/code&gt;)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;STEP3&lt;/em&gt;&lt;/strong&gt;: &lt;code&gt;서브 트리&lt;/code&gt; 순회 결과를 치환한 노드&lt;code&gt;BB&lt;/code&gt;에 반영합니다. (&lt;code&gt;A&lt;/code&gt; -&amp;gt; &lt;code&gt;B&lt;/code&gt; -&amp;gt; &lt;code&gt;D&lt;/code&gt; -&amp;gt; &lt;code&gt;E&lt;/code&gt; -&amp;gt; &lt;code&gt;C&lt;/code&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;최초 분문의 예시를 각 방법으로 순회 하면 다음과 같습니다. (&lt;code&gt;ROOT&lt;/code&gt;의 위치를 살펴보세요.)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;전위 순회 :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;ROOT&lt;/code&gt; &amp;gt; &lt;code&gt;A&lt;/code&gt; &amp;gt; &lt;code&gt;C&lt;/code&gt; &amp;gt; &lt;code&gt;G&lt;/code&gt; &amp;gt; &lt;code&gt;H&lt;/code&gt; &amp;gt; &lt;code&gt;D&lt;/code&gt; &amp;gt; &lt;code&gt;I&lt;/code&gt; &amp;gt; &lt;code&gt;J&lt;/code&gt; &amp;gt; &lt;code&gt;B&lt;/code&gt; &amp;gt; &lt;code&gt;E&lt;/code&gt; &amp;gt; &lt;code&gt;K&lt;/code&gt; &amp;gt; &lt;code&gt;L&lt;/code&gt; &amp;gt; &lt;code&gt;F&lt;/code&gt; &amp;gt; &lt;code&gt;M&lt;/code&gt; &amp;gt; &lt;code&gt;N&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;중위 순회 :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; &amp;gt; &lt;code&gt;C&lt;/code&gt; &amp;gt; &lt;code&gt;H&lt;/code&gt; &amp;gt; &lt;code&gt;A&lt;/code&gt; &amp;gt; &lt;code&gt;I&lt;/code&gt; &amp;gt; &lt;code&gt;D&lt;/code&gt; &amp;gt; &lt;code&gt;J&lt;/code&gt; &amp;gt; &lt;code&gt;ROOT&lt;/code&gt; &amp;gt; &lt;code&gt;K&lt;/code&gt; &amp;gt; &lt;code&gt;E&lt;/code&gt; &amp;gt; &lt;code&gt;L&lt;/code&gt; &amp;gt; &lt;code&gt;B&lt;/code&gt; &amp;gt; &lt;code&gt;M&lt;/code&gt; &amp;gt; &lt;code&gt;F&lt;/code&gt; &amp;gt; &lt;code&gt;N&lt;/code&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;후위 순회 :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;G&lt;/code&gt; &amp;gt; &lt;code&gt;H&lt;/code&gt; &amp;gt; &lt;code&gt;C&lt;/code&gt; &amp;gt; &lt;code&gt;I&lt;/code&gt; &amp;gt; &lt;code&gt;J&lt;/code&gt; &amp;gt; &lt;code&gt;D&lt;/code&gt; &amp;gt; &lt;code&gt;A&lt;/code&gt; &amp;gt; &lt;code&gt;K&lt;/code&gt; &amp;gt; &lt;code&gt;L&lt;/code&gt; &amp;gt; &lt;code&gt;E&lt;/code&gt; &amp;gt; &lt;code&gt;M&lt;/code&gt; &amp;gt; &lt;code&gt;N&lt;/code&gt; &amp;gt; &lt;code&gt;F&lt;/code&gt; &amp;gt; &lt;code&gt;B&lt;/code&gt; &amp;gt; &lt;code&gt;ROOT&lt;/code&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;오늘 준비한 내용은 여기까지 입니다.&lt;/p&gt;&lt;p&gt;읽어주셔서 감사합니다.&lt;/p&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>자료구조</category>
      <category>DataStructure</category>
      <category>tree</category>
      <category>이진 트리</category>
      <category>이진탐색트리</category>
      <category>자료구조</category>
      <category>전위 순회</category>
      <category>중위 순회</category>
      <category>트리</category>
      <category>포화 이진트리</category>
      <category>후위 순회</category>
      <author>Mommoo</author>
      <guid isPermaLink="true">https://mommoo.tistory.com/95</guid>
      <comments>https://mommoo.tistory.com/95#entry95comment</comments>
      <pubDate>Sat, 10 Jul 2021 01:43:12 +0900</pubDate>
    </item>
  </channel>
</rss>