<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Develop Log</title>
    <link>https://hs5555.tistory.com/</link>
    <description>프로그래밍, 개발 정보 기록 및 공유</description>
    <language>ko</language>
    <pubDate>Fri, 19 Jun 2026 19:56:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>haeseong5</managingEditor>
    <image>
      <title>Develop Log</title>
      <url>https://tistory1.daumcdn.net/tistory/3828656/attach/580de924a7e84c5d8e3dbf65d1d8b183</url>
      <link>https://hs5555.tistory.com</link>
    </image>
    <item>
      <title>[개발자 책] 소프트 스킬 - 4부 생산성</title>
      <link>https://hs5555.tistory.com/178</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집중이 중요하다&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;생산적인 사람이 되고 싶으면 일을 더 빨리 끝내면 된다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떻게? 중요한 것은 집중이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집중한다. &amp;harr;&amp;nbsp; 주의가 산만하다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집중한다는 것은 시간이 쏜살 같이 지나갔을 때 느낌이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;생상성 = 집중력&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집중을 하지 못하면 작업 시간이 굉장히 길어진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;또 어떤 작업을 할 때 작업 기반만 반복해서 다지게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집중은 관성과 같다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;처음 5분에서 10분만 버티면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;10분을 지속한다면 지속할 수 있는 충분한 광성을 얻을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 집중 모드로 들어설 수 있었던 원인은 무엇인가?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하고자 하는 작업 혹은 목표가 명확하고 시간에 대한 제한이 있을 때.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 집중이 깨진 이유는 무엇인가?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SNS 혹은 메신저를 확인 할 때, 옆에서 누가 말 걸 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;생산성 계획&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매주 해야 할 일을 두시간 이하의 작은 작업으로 나누고, 칸반보드를 사용해 한 주를 계획한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;분기별 계획&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한 해를 각 3개월씩 4분기로 나누고, 분기별 계획을 세운다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이때 한 분기 동안 완료할 큰 프로젝트를 정하는 동시에 작은 목표 몇가지도 함께 계획한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;할 일은 주단위나 일단위로 나누어 생각하는데 계획은 어플리케이션에 정리해서 기록해둔다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그리고 한 분기 동안 완료하고자 하는 일의 개요를 간단하게 작성한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이를 통해 주요 목표와 그것을 달성하는 방법에 대한 아이디어를 얻고 이 목표에 계속 집중할 수 있게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;월간 계획&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매월 1일에는 한달치 달력을 출력해놓고 그달에 해야 할 일을 계획한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아주 정확하게 예측할 수는 없지만 일할 수 있는 날과 이전에 했던 작업을 기반으로 한달 동안 할 수 있는 일의 양을 어림잡아 예측한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 다음에는 분기별 개요에서 작업할 항목을 가져와서 그 달에 할 만한 일이 무엇인지 확인한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주간 계획&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매주 월요일 아침에는 한 주간의 일정을 계획하며 하루를 시작한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 할 수 있는 뽀모도리는 10개라고 가정한다. 매주 이렇게 해야 할 일 목록을 만들어야 하므로 한 주계획을 이 작업으로 시작한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 약 9뽀모도리를 넣어 약간의 여유를 둔다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일간 계획&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매일 일을 시작하기 전 운동으로 하루를 시작한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자리에 앉아 일을 시작할 준비가 됐을 때 가장 먼저 하는 일은 그날 하루를 계획하는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 작업할 일들에 대한 우선순위 및 중요도에 따라 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;방해요소 제거하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;휴식과 휴가를 가지기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;뽀모도로 기법&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루 동안 할 일을 계획한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;타이머를 25분으로 설정하고 계획했던 첫 번째 일을 시작한다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작업은 한번에 한 개만 진행하고 25분동안 완전히 집중해서 일해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;25분이 끝나면 5분 간 휴식을 취한다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;뽀모도리 4번을 반복하고 나면 15분간 휴식을 취한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작업을 일찍 끝냈다면 남은 시간은 추가학습에 할당한다. 즉시, 다른 작업을 진행하는 것도 괜찮다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 몇개의 뽀모도리를 할 수 있는 지 살펴보고, 매일 몇개를 할 지 목표를 설정하는 방식으로 활용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작업 예측 및 측정도구로 사용 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 뽀모도리를 몇 번 실행했는지 기록하고, 완료할 뽀모도리의 개수를 목표로 설정하면 스스로 하루에 얼마나 열심히 일하는지, 얼마나 많은 일을 처리할 수 있는지 정확히 측정할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정신적인 면에서는 일을 더해야 할 것만 하는 죄책감을 덜어낼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일주일에 50~55개를 목표로 함.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 9~10개를 목표,.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;처음에는 하루에 뽀모도리를 몇개나 완료했는 지 고민하지 말고, 일단 시도해보고 한주동안 몇개나 해내는지 기록해보자&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;할당 체계를 도입해 생산성을 높여라&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매일 반복해야 하는 일에 대한 실천 방법이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;완료해야 할 일을 꾸준히 진행할 수 있는 유일한 방법은 미리 설정해둔 기간 내에 얼마나 처리할 것인지 목표를 세우는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복하는 작업은 반복 횟수를 정확하게 수치화하고, 무조건 할당량을 완수한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예시&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매주 3회 조깅하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매주 블로그 글 한 개 작성하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매일 책 한 개 한장씩 쓰기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매주 뽀모도리 50개 끝내기 등등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;할당 체계 실행법&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복해야하는 작업을 선택한 뒤 일정한 기간마다 얼마나 자주 진행할 것인지 할당량을 정하면된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실천하는 것이 핵심이다. 목표했던 일을 해내는 것 이외에는 다른 어떤 선택지도 두지 마라. 마음속에서 실패라는 단어를 아예 지워버려라. 한번이라도 실수를 용납하면 다시 실수하게 되고, 이내 할당량은 아무런 기능을 하지 못할 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;할당 체계 규칙&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복 가능한 작업을 선택한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작업이 완료되고 반복되어야 하는 주기를 정한다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한 주기 안에 작업을 몇 번 완료할 것인지 할당량을 정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실천한다. 할당량을 완수할 수 있도록 실천한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;조정한다 할당량을 더 높이거나 낮춘다. 하지만 실천 주기 도중에는 조정하지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;할당 체계가 효과적인 이유&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;느리지만 꾸준한 속도로 하는 것이 빠르지만 지속성이 없는 것보다 낫다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실천하기&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복해야 할 작업 목록을 작성하자. 바로했더라면 득이 되었을 텐데 미루고 하지 않았던 것을 중심으로 생각해보자.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오전 운동하기 / 식단&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스터디&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사이드 프로젝트&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작업을 한 개 이상 골라서 일정한 간격으로 할당해보자. 할당한 작업을 적어도 5회이상 지키도록 노력해보자 이러한 할당 체계를 몇달이나 몇년간 지속할 때 얻을 수 있는 이득도 떠 올려 보자.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;낭비되는 시간 줄이기&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TV시청&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SNS&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;게임 등등..&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복 행위의 중요성&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;생산성의 진정한 비결은 작은 일을 오랜 시간동안 반복해서 해내는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복행위가 당신을 만든다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;좋은 반복행위는 큰 목표를 정하는 것에서부터 시작한다. 달성하고 싶은 목표는 무엇인가?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한번에 한가지 이상 집중하기는 어려우므로 지금 가장 중요한 목표를 골라보자.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;큰 목표를 정했다면 매일 혹은 매주 실천하여 결국 목표를 당ㄹ성할 수 있는 단계를 생각할 차례다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이처럼 큰 목표가 반복행위의 기본을 만든다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하루에 8시간 일하고, 식사시간으로 2시간 쓰고, 잠자는데 8시간 쓰면, 6시간이 남는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;매일 아침 한 시간 또는 두시간 정도를 가장 중요한 목표를 이루는데 할당하면 좋다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 시간을 유용하게 사용함으로써 목표를 향해 노력하는 것은 물론이고, 에너지도 얻을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구체적일 수록 좋다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/178</guid>
      <comments>https://hs5555.tistory.com/178#entry178comment</comments>
      <pubDate>Sat, 11 Jun 2022 18:24:36 +0900</pubDate>
    </item>
    <item>
      <title>코틀린 함수 관련 개념</title>
      <link>https://hs5555.tistory.com/177</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일급 객체&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일급객체는 다음과 같은 특징을 갖고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일급함수는 함수가 객체(변수)로 취급될 수 있습니다. (함수를 변수에 할당하거나 자료구조에 저장하는 것이 가능)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일급함수는 함수 객체를 인자로 넘길 수 있어야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일급함수는 함수 객체를 반환값으로 반환할 수 있어야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;프로그래밍 언어에서 일급함수를 지원한다는 것은 고차함수를 사용할 수 있다는 것과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함수 리터럴&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Literal은 어떤 값을 표기하는 방법을 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;In computer science, a literal is a notation for representing a fixed value in source code.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컴퓨터 과학에서 리터럴은 고정된 값을 나타내기 위한 표기법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함수 리터럴이란 함수를 어떤 변수를 받았을 때 함수 내용 그 자체입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Lambda expressions and anonymous functions are function literals. Function literals are functions that are not declared but are passed immediately as an expression.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;람다표현식과 익명함수는 함수리터럴이다. 함수리터럴은 객체로 선언이 안되어있지만 표현식을 통해 값으로 전달되는 함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함수 리터럴은 &lt;b&gt;함수 본문을 표기하기 위한 방법&lt;/b&gt;입니다. 함수 리터럴 방식에는 2가지가 있는데, 람다 표현식과 익명함수가 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;val sum: (Int, Int) -&amp;gt; Int = { x: Int, y: Int -&amp;gt; x + y }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위 코드에서 함수 리터럴은 함수를 반환하는 부분입니다. { x: Int, y: Int -&amp;gt; x + y }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://velog.io/@ejjjang0414/%EC%BD%94%ED%8B%80%EB%A6%B0-Function-receiver-with-receiver&quot;&gt;https://velog.io/@ejjjang0414/%EC%BD%94%ED%8B%80%EB%A6%B0-Function-receiver-with-receiver&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함수 참조(function reference)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함수 참조는 이미 선언된 함수도 일급-시민처럼 변수, 자료 구조에 저장하고 인자로 전달하거나 반환할 수 있게 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;람다식&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일종의 익명함수. 익명함수랑 완전히 같진 않음. 익명함수에서는 return, break, continue 사용 가능&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;값에 의한 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이름에 의한 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;참조에 의한 호출&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;고차함수&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다른 함수를 인자로 사용하거나 함수를 결과값으로 반환하는 함수&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Kotlin</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/177</guid>
      <comments>https://hs5555.tistory.com/177#entry177comment</comments>
      <pubDate>Wed, 11 May 2022 01:51:14 +0900</pubDate>
    </item>
    <item>
      <title>RTMP (Real Time Messaging Protocol)</title>
      <link>https://hs5555.tistory.com/173</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP (Real Time Messaging Protocol)&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어도비 스시템즈사의 독점 통신 규약이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP는 오디오, 비디오 및 기타 데이터를 인터넷을 통해 스트리밍 할 때 쓰인다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP는 어도비 플래시 플레이어와 서버 사이의 통신에 이용된다. 현재는 플래시 뿐만 아니라 다른 응용프로그램에서도 쓰이고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP (기본): 1935번 포트 사용, 암호화되지 않은 RTMP, 혹시나 1935번 포트로 시도해서 실패하면 443 포트(RTMPS)나 80 포트(RTMPT)로 재시도함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP 동작&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;순수 TCP 기반의 RTMP 프로토콜은 접속을 지속적으로 유지하는 데 기여한다. 또 실시간 통신을 한다. 더 큰 덩어리의 정보를 보낼 수 있는 동안, 부가적으로 비디오 및 오디오 스트림을 부드럽게 전달하기 위해, 이 프로토콜은 비디오 및 데이터를 여러 조각들로 나누기도 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 조각들의 크기는 클라이언트 및 서버 간에 유동적으로 결정된다. 동적 크기 조절은 비활성화할 수 있다. 비디오 및 기타 데이터에 대한 스트림 조각들의 기본 사이즈는 128Byte이다. 오디오에 대한 스트림 조각 기본 사이즈는 64Byte이다. 여러 개의 스트림이 있을 때, 각각의 스트림으로 부터 깨내온 조각들은 인터리빙(interleaving)되며, 한 접속 내에서 다중화된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 덩어리(chunk) 크기가 클 경우, RTMP 프로토콜은 조각 당 1바이트 헤더만 실어 보내기도 한다. 그렇게 함으로써 부하를 상당 부분 줄일 수 있다. 그러나 실제 조각들은 인터리빙 되지 않는다. 대신, 인터리빙과 다중화는 패킷 수준에서 수행된다. 활성화된 여러 다른 채널에 실린 RTMP 패킷들은 각각의 채열의 대역폭, 레이턴시 그리고 기타 QoS 요구에 맞게 인터리빙 된다. 이렇게 인터리빙 된 패킷들은 다시 나눌 수 없으며, 조각 수준에서 다시 인터리빙되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP 프로토콜은 패킷들을 주고 받을 수 있는 여러 개의 채널들을 정의한다. 각 채널들은 다른 채널에 대해 독립적으로 동작한다. 예를 들어, RPC 요청과 응답에 할당된 채널이 있고, 또 비디오 스트림 데이터에 대한 채널이 있고, 오디오 스트림 데이터에 대한 채널이 있고, 아웃-오브-밴드(out-of-band) 제어 메시지(조각 크기 결정 등)들에 대한 채널이 있는 식이다. 일반적으로 하나의 RTMP 세션 내에, 어떤 시점에서 여러 개의 채널이 동시에 활성화될 수 있다. RTMP 데이터가 패킷화될 때, 패킷 헤더가 생성된다. 패킷 헤더는 채널의 아이디(id), 패킷의 타임스탬프(필요한 경우에는), 패킷 페이로드 크기 등을 담고 있다. 패킷 헤더 다음에는 패킷 페이로드가 온다. 패킷 페이로드는 현재 클라이언트와 서버 간 약속된 조각 크기만큼씩 조각으로 쪼개진다. 패킷 헤더 자체가 조각나는 경우는 없다. 패킷의 첫 번째 조각 크기에 헤더 크기가 더해지지 않는다. 다시 말해 실제 패킷 페이로드만이 조각으로 쪼개진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;더 상위 레벨에서, RTMP 프로토콜은&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/MP3&quot;&gt;MP3&lt;/a&gt;&amp;nbsp;및&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9E%98%EC%8B%9C_%EB%B9%84%EB%94%94%EC%98%A4&quot;&gt;플래시 비디오&lt;/a&gt;&amp;nbsp;멀티미디어 스트림을 캡슐화한다.&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/w/index.php?title=%EC%95%A1%EC%85%98_%EB%A9%94%EC%8B%9C%EC%A7%80_%ED%8F%AC%EB%A7%B7&amp;amp;action=edit&amp;amp;redlink=1&quot;&gt;액션 메시지 포맷&lt;/a&gt;을 이용하여&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/RPC&quot;&gt;RPC&lt;/a&gt;를 수행하기도 한다.&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%96%BC_%ED%83%80%EC%9E%84_%EB%A9%94%EC%8B%9C%EC%A7%95_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C#cite_note-2&quot;&gt;[2]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인터리빙 : 사전적 의미는 &amp;ldquo;끼워 넣기&amp;rdquo;이다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP 네트워크를 통하여 트래픽을 전송할 때 발생할 수 있는 군집 에러를 랜덤 에러로 변환하여 에러 정정을 용이하게 사용하기 위한 기법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디지털 무선 전송시스템에서 Interleaving&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 열의 순서를 일정 단위로 재배열시킴으로써 순간적인 잡음에 의하여 데이터 열 중간의 비트가 손실되더라도 그 영향을 국부적으로 나타나게하여 그것을 복구할 수 있게함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 어떤 한 시점에서 간섭 등으로 정보가 손실된 채 신호를 수신한 경우에, 이 신호를 다시 원래의 순서대로 재배열해 봄으로써 손실된 정보가 분산되며 단지 부분적으로만 정보가 손실되게 됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;메세지 스트림 비트를 램덤하게 하는 기술이며, 따라서 이것은 채널에 의해 야기된 연집 에러 오류를 랜덤 에러 오류로 변환시킴&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://ensxoddl.tistory.com/109&quot;&gt;인터리빙&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다중화 (먹싱 or 멀티 플렉싱)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두개 이상의 로우레벨의 채널을 하나의 고수준 채널로 통합하는 과정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스트림&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, 스트림은 운영체제에 의해 생성되는 가상의 연결고리를 의미하며 중간 매개자 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리할 수 는 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 스트림은 사용목적에 따라 입력스트림과 출력스트림으로 구분됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/java/java_io_stream&quot;&gt;코딩교육 티씨피스쿨&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://gamsunghacker.tistory.com/193&quot;&gt;[rtmp]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=slrkanjsepdi&amp;amp;logNo=90139026743&quot;&gt;[안드로이드] 네트워크 심화 ( Stream )&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP (Real Time Messaging Protocol)&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어도비 스시템즈사의 독점 통신 규약이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP는 오디오, 비디오 및 기타 데이터를 인터넷을 통해 스트리밍 할 때 쓰인다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP는 어도비 플래시 플레이어와 서버 사이의 통신에 이용된다. 현재는 플래시 뿐만 아니라 다른 응용프로그램에서도 쓰이고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP (기본): 1935번 포트 사용, 암호화되지 않은 RTMP, 혹시나 1935번 포트로 시도해서 실패하면 443 포트(RTMPS)나 80 포트(RTMPT)로 재시도함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP 동작&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;순수 TCP 기반의 RTMP 프로토콜은 접속을 지속적으로 유지하는 데 기여한다. 또 실시간 통신을 한다. 더 큰 덩어리의 정보를 보낼 수 있는 동안, 부가적으로 비디오 및 오디오 스트림을 부드럽게 전달하기 위해, 이 프로토콜은 비디오 및 데이터를 여러 조각들로 나누기도 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 조각들의 크기는 클라이언트 및 서버 간에 유동적으로 결정된다. 동적 크기 조절은 비활성화할 수 있다. 비디오 및 기타 데이터에 대한 스트림 조각들의 기본 사이즈는 128Byte이다. 오디오에 대한 스트림 조각 기본 사이즈는 64Byte이다. 여러 개의 스트림이 있을 때, 각각의 스트림으로 부터 깨내온 조각들은 인터리빙(interleaving)되며, 한 접속 내에서 다중화된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 덩어리(chunk) 크기가 클 경우, RTMP 프로토콜은 조각 당 1바이트 헤더만 실어 보내기도 한다. 그렇게 함으로써 부하를 상당 부분 줄일 수 있다. 그러나 실제 조각들은 인터리빙 되지 않는다. 대신, 인터리빙과 다중화는 패킷 수준에서 수행된다. 활성화된 여러 다른 채널에 실린 RTMP 패킷들은 각각의 채열의 대역폭, 레이턴시 그리고 기타 QoS 요구에 맞게 인터리빙 된다. 이렇게 인터리빙 된 패킷들은 다시 나눌 수 없으며, 조각 수준에서 다시 인터리빙되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP 프로토콜은 패킷들을 주고 받을 수 있는 여러 개의 채널들을 정의한다. 각 채널들은 다른 채널에 대해 독립적으로 동작한다. 예를 들어, RPC 요청과 응답에 할당된 채널이 있고, 또 비디오 스트림 데이터에 대한 채널이 있고, 오디오 스트림 데이터에 대한 채널이 있고, 아웃-오브-밴드(out-of-band) 제어 메시지(조각 크기 결정 등)들에 대한 채널이 있는 식이다. 일반적으로 하나의 RTMP 세션 내에, 어떤 시점에서 여러 개의 채널이 동시에 활성화될 수 있다. RTMP 데이터가 패킷화될 때, 패킷 헤더가 생성된다. 패킷 헤더는 채널의 아이디(id), 패킷의 타임스탬프(필요한 경우에는), 패킷 페이로드 크기 등을 담고 있다. 패킷 헤더 다음에는 패킷 페이로드가 온다. 패킷 페이로드는 현재 클라이언트와 서버 간 약속된 조각 크기만큼씩 조각으로 쪼개진다. 패킷 헤더 자체가 조각나는 경우는 없다. 패킷의 첫 번째 조각 크기에 헤더 크기가 더해지지 않는다. 다시 말해 실제 패킷 페이로드만이 조각으로 쪼개진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;더 상위 레벨에서, RTMP 프로토콜은&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/MP3&quot;&gt;MP3&lt;/a&gt;&amp;nbsp;및&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9E%98%EC%8B%9C_%EB%B9%84%EB%94%94%EC%98%A4&quot;&gt;플래시 비디오&lt;/a&gt;&amp;nbsp;멀티미디어 스트림을 캡슐화한다.&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/w/index.php?title=%EC%95%A1%EC%85%98_%EB%A9%94%EC%8B%9C%EC%A7%80_%ED%8F%AC%EB%A7%B7&amp;amp;action=edit&amp;amp;redlink=1&quot;&gt;액션 메시지 포맷&lt;/a&gt;을 이용하여&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/RPC&quot;&gt;RPC&lt;/a&gt;를 수행하기도 한다.&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%96%BC_%ED%83%80%EC%9E%84_%EB%A9%94%EC%8B%9C%EC%A7%95_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C#cite_note-2&quot;&gt;[2]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인터리빙 : 사전적 의미는 &amp;ldquo;끼워 넣기&amp;rdquo;이다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP 네트워크를 통하여 트래픽을 전송할 때 발생할 수 있는 군집 에러를 랜덤 에러로 변환하여 에러 정정을 용이하게 사용하기 위한 기법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디지털 무선 전송시스템에서 Interleaving&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 열의 순서를 일정 단위로 재배열시킴으로써 순간적인 잡음에 의하여 데이터 열 중간의 비트가 손실되더라도 그 영향을 국부적으로 나타나게하여 그것을 복구할 수 있게함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 어떤 한 시점에서 간섭 등으로 정보가 손실된 채 신호를 수신한 경우에, 이 신호를 다시 원래의 순서대로 재배열해 봄으로써 손실된 정보가 분산되며 단지 부분적으로만 정보가 손실되게 됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;메세지 스트림 비트를 램덤하게 하는 기술이며, 따라서 이것은 채널에 의해 야기된 연집 에러 오류를 랜덤 에러 오류로 변환시킴&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://ensxoddl.tistory.com/109&quot;&gt;인터리빙&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다중화 (먹싱 or 멀티 플렉싱)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두개 이상의 로우레벨의 채널을 하나의 고수준 채널로 통합하는 과정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스트림&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, 스트림은 운영체제에 의해 생성되는 가상의 연결고리를 의미하며 중간 매개자 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리할 수 는 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 스트림은 사용목적에 따라 입력스트림과 출력스트림으로 구분됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/java/java_io_stream&quot;&gt;코딩교육 티씨피스쿨&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://gamsunghacker.tistory.com/193&quot;&gt;[rtmp]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=slrkanjsepdi&amp;amp;logNo=90139026743&quot;&gt;[안드로이드] 네트워크 심화 ( Stream )&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP (Real Time Messaging Protocol)&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어도비 스시템즈사의 독점 통신 규약이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP는 오디오, 비디오 및 기타 데이터를 인터넷을 통해 스트리밍 할 때 쓰인다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP는 어도비 플래시 플레이어와 서버 사이의 통신에 이용된다. 현재는 플래시 뿐만 아니라 다른 응용프로그램에서도 쓰이고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP (기본): 1935번 포트 사용, 암호화되지 않은 RTMP, 혹시나 1935번 포트로 시도해서 실패하면 443 포트(RTMPS)나 80 포트(RTMPT)로 재시도함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP 동작&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;순수 TCP 기반의 RTMP 프로토콜은 접속을 지속적으로 유지하는 데 기여한다. 또 실시간 통신을 한다. 더 큰 덩어리의 정보를 보낼 수 있는 동안, 부가적으로 비디오 및 오디오 스트림을 부드럽게 전달하기 위해, 이 프로토콜은 비디오 및 데이터를 여러 조각들로 나누기도 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 조각들의 크기는 클라이언트 및 서버 간에 유동적으로 결정된다. 동적 크기 조절은 비활성화할 수 있다. 비디오 및 기타 데이터에 대한 스트림 조각들의 기본 사이즈는 128Byte이다. 오디오에 대한 스트림 조각 기본 사이즈는 64Byte이다. 여러 개의 스트림이 있을 때, 각각의 스트림으로 부터 깨내온 조각들은 인터리빙(interleaving)되며, 한 접속 내에서 다중화된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 덩어리(chunk) 크기가 클 경우, RTMP 프로토콜은 조각 당 1바이트 헤더만 실어 보내기도 한다. 그렇게 함으로써 부하를 상당 부분 줄일 수 있다. 그러나 실제 조각들은 인터리빙 되지 않는다. 대신, 인터리빙과 다중화는 패킷 수준에서 수행된다. 활성화된 여러 다른 채널에 실린 RTMP 패킷들은 각각의 채열의 대역폭, 레이턴시 그리고 기타 QoS 요구에 맞게 인터리빙 된다. 이렇게 인터리빙 된 패킷들은 다시 나눌 수 없으며, 조각 수준에서 다시 인터리빙되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTMP 프로토콜은 패킷들을 주고 받을 수 있는 여러 개의 채널들을 정의한다. 각 채널들은 다른 채널에 대해 독립적으로 동작한다. 예를 들어, RPC 요청과 응답에 할당된 채널이 있고, 또 비디오 스트림 데이터에 대한 채널이 있고, 오디오 스트림 데이터에 대한 채널이 있고, 아웃-오브-밴드(out-of-band) 제어 메시지(조각 크기 결정 등)들에 대한 채널이 있는 식이다. 일반적으로 하나의 RTMP 세션 내에, 어떤 시점에서 여러 개의 채널이 동시에 활성화될 수 있다. RTMP 데이터가 패킷화될 때, 패킷 헤더가 생성된다. 패킷 헤더는 채널의 아이디(id), 패킷의 타임스탬프(필요한 경우에는), 패킷 페이로드 크기 등을 담고 있다. 패킷 헤더 다음에는 패킷 페이로드가 온다. 패킷 페이로드는 현재 클라이언트와 서버 간 약속된 조각 크기만큼씩 조각으로 쪼개진다. 패킷 헤더 자체가 조각나는 경우는 없다. 패킷의 첫 번째 조각 크기에 헤더 크기가 더해지지 않는다. 다시 말해 실제 패킷 페이로드만이 조각으로 쪼개진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;더 상위 레벨에서, RTMP 프로토콜은&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/MP3&quot;&gt;MP3&lt;/a&gt;&amp;nbsp;및&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9E%98%EC%8B%9C_%EB%B9%84%EB%94%94%EC%98%A4&quot;&gt;플래시 비디오&lt;/a&gt;&amp;nbsp;멀티미디어 스트림을 캡슐화한다.&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/w/index.php?title=%EC%95%A1%EC%85%98_%EB%A9%94%EC%8B%9C%EC%A7%80_%ED%8F%AC%EB%A7%B7&amp;amp;action=edit&amp;amp;redlink=1&quot;&gt;액션 메시지 포맷&lt;/a&gt;을 이용하여&amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/RPC&quot;&gt;RPC&lt;/a&gt;를 수행하기도 한다.&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%96%BC_%ED%83%80%EC%9E%84_%EB%A9%94%EC%8B%9C%EC%A7%95_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C#cite_note-2&quot;&gt;[2]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인터리빙 : 사전적 의미는 &amp;ldquo;끼워 넣기&amp;rdquo;이다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP 네트워크를 통하여 트래픽을 전송할 때 발생할 수 있는 군집 에러를 랜덤 에러로 변환하여 에러 정정을 용이하게 사용하기 위한 기법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디지털 무선 전송시스템에서 Interleaving&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 열의 순서를 일정 단위로 재배열시킴으로써 순간적인 잡음에 의하여 데이터 열 중간의 비트가 손실되더라도 그 영향을 국부적으로 나타나게하여 그것을 복구할 수 있게함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 어떤 한 시점에서 간섭 등으로 정보가 손실된 채 신호를 수신한 경우에, 이 신호를 다시 원래의 순서대로 재배열해 봄으로써 손실된 정보가 분산되며 단지 부분적으로만 정보가 손실되게 됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;메세지 스트림 비트를 램덤하게 하는 기술이며, 따라서 이것은 채널에 의해 야기된 연집 에러 오류를 랜덤 에러 오류로 변환시킴&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://ensxoddl.tistory.com/109&quot;&gt;인터리빙&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다중화 (먹싱 or 멀티 플렉싱)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두개 이상의 로우레벨의 채널을 하나의 고수준 채널로 통합하는 과정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스트림&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, 스트림은 운영체제에 의해 생성되는 가상의 연결고리를 의미하며 중간 매개자 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리할 수 는 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 스트림은 사용목적에 따라 입력스트림과 출력스트림으로 구분됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;http://www.tcpschool.com/java/java_io_stream&quot;&gt;코딩교육 티씨피스쿨&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://gamsunghacker.tistory.com/193&quot;&gt;[rtmp]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=slrkanjsepdi&amp;amp;logNo=90139026743&quot;&gt;[안드로이드] 네트워크 심화 ( Stream )&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/Android</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/173</guid>
      <comments>https://hs5555.tistory.com/173#entry173comment</comments>
      <pubDate>Thu, 31 Mar 2022 21:18:13 +0900</pubDate>
    </item>
    <item>
      <title>동영상의 이해</title>
      <link>https://hs5555.tistory.com/172</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상의 이해&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;영상 + 소리 정보를 가진 파일&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해당 글에서는 영상 정보만 가진 파일을 말할 때는 &amp;ldquo;비디오&amp;rdquo;, &amp;rdquo; 비디오 파일&amp;rdquo;, &amp;ldquo;비디오 스트림&amp;rdquo;으로 용어 정의를 함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷은 비디오와 오디어를 담아두는 상자나 포장해둔 포장지 정도로 이해하면 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아래 그림에서 비디오는 x264코덱으로 만들어 졌고, 오디오는 DTS코덱으로 만들어졌습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너는 이렇게 비디오와 오디오를 하나의 파일로 만드는 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img id=&quot;img_1648728992735_0&quot; src=&quot;https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7c428316-2bdd-40ac-95cb-3fedd794c63e/Untitled.png&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우리가 보통 파일의 정체를 확인하기 위해서는 확장자를 봅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하지만 동영상을 판단할 때 확장자를 봐서는 단지 컨테이너가 무엇인지 알 수 있을 뿐이지. 상자 안에 들어있는 비디오와 오디오가 어떤 코덱으로 만들어져 있는지 알 수 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 파일의 확장자인 avi, mkv, mp4 등등 모두 &lt;b&gt;컨테이너 포맷&lt;/b&gt;을 가르키는 말로 &lt;b&gt;파일 형식&lt;/b&gt; 이라고 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너에 포함된 비디오와 오디오를 만드는 과정을 &lt;b&gt;인코딩&lt;/b&gt;이라고 하며, &lt;b&gt;코덱&lt;/b&gt;이라는 압축 프로그램이 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비디오와 오디오를 재생하는 과정을 &lt;b&gt;디코딩&lt;/b&gt;이라고 하며, 이 또한 코덱이 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상이 재생이 안 될 때는 컨테이너 포맷을 확인하는 것도 중요하지만, 그보다 비디오 코덱 오디오 코덱을 확인하는 것이 중요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상을 구체적으로 표현하는 방법 (예시)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DivX로 인코딩된 비디오와 MP3로 인코딩된 오디오가 AVI 컨테이너에 들어 있는 동영상&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DivX 비디오와 MP3 오디오가 AVI에 들어 있는 동영상&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;플레이어 동영상 지원 포멧&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷은 단지 비디오와 오디오를 하나로 묶는 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 재생은 코덱이라는 프로그램이 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;만약 플레이어가 AVI, MKV, MPEG 포맷의 컨테이너를 지원한다면, 플레리어가 그 컨테이너에서 비디오와 오디오를 꺼낼 수 있다는 말이지. 그 안의 오디오와 비디오를 재생할 수 있다는 말은 아닙니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 재생은 컴퓨터에 설치된 비디오코덱과 오디오 코덱이 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코덱에서 재생 능력만 떼어낸 디코더라는 프로그램이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 디코더를 플레이어가 내장한 경우에는 자신의 컴퓨터에 코덱을 설치하지 않아도 재생이 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 컴퓨터에 코덱도 설치되지 않고, 플레이어에 내장 디코더도 없는 경우엔 재생 에러가 발생합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어, 곰플레이어로 동영상 파일을 열었을 때 화면은 나오나 소리가 나오지 않는 경우가 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 경우에는 비디오 코덱이나 디코더가 컴퓨터나 플레이어에 있기 때문에 화면을 출력되지만 오디오 커덱이나 디코더가 컴퓨나 플레이어에 설치되지 않았기 때문입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이럴 경우, 해당 코덱 정보를 알고 그 동영상에 맞는 오디오 코덱이나 디코더를 설치해주면 해결됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 변환의 이해&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 변환의 방법은 크게 2가지 입니다&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷만 바꾸는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비디오를 다른 코덱으로 트랜스코딩하는 방법&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보통 컨버터라는 프로그램들이 사용하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원본의 화질과 음질을 유지하기 위해 컨테이너 포맷만 바꾸는 방법&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디먹싱(Demux, Demultiplexing)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디먹싱은 컨테이너 포맷에서 비디오 데이터, 오디오 데이터 구성요소를 뺴내는 과정을 말합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;먹싱(Muxing, Multiplexing)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;먹싱은 비디오 데이터나 오디오 데이터 등을 특정 컨테이너 상자에 넣는 과정을 말합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 컨테이너(MP4, MKV, AVI)에 파일만 결합하는 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원래 MKV 동영상 파일 하나에 비디오 파일과 음성파일, 자막파일 등 여러개의 파일들이 MKV하나의 파일 형식으로 결합된 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디먹싱, 먹싱은 상자에서 비디오, 오디오 데이터를 빼거나 넣는 과정일 뿐, 상자 안의 비디오, 오디오를 변경하진 않습니다. 따라서 원본 화질과 음질을 그댜로 유지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;예시)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DVD-Video에서 립한 흔히 디빅스라고 말하는 영화파일을 준비합니다.(그림에서 왼쪽편 파일)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이&amp;nbsp;AVI파일에서 DivX&amp;nbsp;비디오와 MP3 오디오를 추출합니다.(디먹싱)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;추출된 DivX 비디오와&amp;nbsp;MP3 오디오를 MKV 상자에 넣습니다.(먹싱)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2가지의&amp;nbsp;avi 파일과 mkv 파일을 비교해 보면,&amp;nbsp;비디오와 오디오를 담아두는&amp;nbsp;상자만 다를뿐&amp;nbsp;실제 비디오 데이터와 오디오 데이터는 똑같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 바꾸어 말하면&amp;nbsp;화질과 음질은 똑같습니다. 또한 거꾸로 MKV파일을&amp;nbsp;디먹싱, 먹싱을 통해 AVI파일로 만들수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;※ 실제 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DivX 비디오가 들어간 AVI파일은 재생하지만, DivX 비디오가 들어간 MKV파일은 재생하지 못하는 플레이어가 있다면 MKV 상자에서 DivX 비디오를 꺼내 AVI 상자에 넣으면 재생 문제가 해결됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=dbfan24&amp;amp;logNo=10128721121&quot;&gt;동영상의 기본적인 이해 (컨테이너 포맷이란?, 동영상의 변환이란?)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코덱 (Coder and Decorder)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떠한 데이터 스트림에 대해 인코딩, 디코딩을 할 수 있는 소프트웨어&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;음성 또는 영상 신호를 디지털 신호로 변환하는 코더와, 그 반대로 변환시켜주는 디코더를 통틀어부르는 용어이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코더 + 디코더의 합성어&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인코딩: 영상신호를 디지털 신호로 바꾸는 것을 코딩이라고 하고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디지털 신호를 영상으로 변환하는 것을 디코딩이라고 함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상의 이해&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;영상 + 소리 정보를 가진 파일&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해당 글에서는 영상 정보만 가진 파일을 말할 때는 &amp;ldquo;비디오&amp;rdquo;, &amp;rdquo; 비디오 파일&amp;rdquo;, &amp;ldquo;비디오 스트림&amp;rdquo;으로 용어 정의를 함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷은 비디오와 오디어를 담아두는 상자나 포장해둔 포장지 정도로 이해하면 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아래 그림에서 비디오는 x264코덱으로 만들어 졌고, 오디오는 DTS코덱으로 만들어졌습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너는 이렇게 비디오와 오디오를 하나의 파일로 만드는 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img id=&quot;img_1648728992735_0&quot; src=&quot;https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7c428316-2bdd-40ac-95cb-3fedd794c63e/Untitled.png&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우리가 보통 파일의 정체를 확인하기 위해서는 확장자를 봅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하지만 동영상을 판단할 때 확장자를 봐서는 단지 컨테이너가 무엇인지 알 수 있을 뿐이지. 상자 안에 들어있는 비디오와 오디오가 어떤 코덱으로 만들어져 있는지 알 수 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 파일의 확장자인 avi, mkv, mp4 등등 모두 &lt;b&gt;컨테이너 포맷&lt;/b&gt;을 가르키는 말로 &lt;b&gt;파일 형식&lt;/b&gt; 이라고 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너에 포함된 비디오와 오디오를 만드는 과정을 &lt;b&gt;인코딩&lt;/b&gt;이라고 하며, &lt;b&gt;코덱&lt;/b&gt;이라는 압축 프로그램이 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비디오와 오디오를 재생하는 과정을 &lt;b&gt;디코딩&lt;/b&gt;이라고 하며, 이 또한 코덱이 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상이 재생이 안 될 때는 컨테이너 포맷을 확인하는 것도 중요하지만, 그보다 비디오 코덱 오디오 코덱을 확인하는 것이 중요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상을 구체적으로 표현하는 방법 (예시)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DivX로 인코딩된 비디오와 MP3로 인코딩된 오디오가 AVI 컨테이너에 들어 있는 동영상&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DivX 비디오와 MP3 오디오가 AVI에 들어 있는 동영상&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;플레이어 동영상 지원 포멧&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷은 단지 비디오와 오디오를 하나로 묶는 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 재생은 코덱이라는 프로그램이 담당합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;만약 플레이어가 AVI, MKV, MPEG 포맷의 컨테이너를 지원한다면, 플레리어가 그 컨테이너에서 비디오와 오디오를 꺼낼 수 있다는 말이지. 그 안의 오디오와 비디오를 재생할 수 있다는 말은 아닙니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 재생은 컴퓨터에 설치된 비디오코덱과 오디오 코덱이 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코덱에서 재생 능력만 떼어낸 디코더라는 프로그램이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 디코더를 플레이어가 내장한 경우에는 자신의 컴퓨터에 코덱을 설치하지 않아도 재생이 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 컴퓨터에 코덱도 설치되지 않고, 플레이어에 내장 디코더도 없는 경우엔 재생 에러가 발생합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어, 곰플레이어로 동영상 파일을 열었을 때 화면은 나오나 소리가 나오지 않는 경우가 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 경우에는 비디오 코덱이나 디코더가 컴퓨터나 플레이어에 있기 때문에 화면을 출력되지만 오디오 커덱이나 디코더가 컴퓨나 플레이어에 설치되지 않았기 때문입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이럴 경우, 해당 코덱 정보를 알고 그 동영상에 맞는 오디오 코덱이나 디코더를 설치해주면 해결됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 변환의 이해&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 변환의 방법은 크게 2가지 입니다&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨테이너 포맷만 바꾸는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비디오를 다른 코덱으로 트랜스코딩하는 방법&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보통 컨버터라는 프로그램들이 사용하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원본의 화질과 음질을 유지하기 위해 컨테이너 포맷만 바꾸는 방법&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디먹싱(Demux, Demultiplexing)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디먹싱은 컨테이너 포맷에서 비디오 데이터, 오디오 데이터 구성요소를 뺴내는 과정을 말합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;먹싱(Muxing, Multiplexing)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;먹싱은 비디오 데이터나 오디오 데이터 등을 특정 컨테이너 상자에 넣는 과정을 말합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;동영상 컨테이너(MP4, MKV, AVI)에 파일만 결합하는 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원래 MKV 동영상 파일 하나에 비디오 파일과 음성파일, 자막파일 등 여러개의 파일들이 MKV하나의 파일 형식으로 결합된 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디먹싱, 먹싱은 상자에서 비디오, 오디오 데이터를 빼거나 넣는 과정일 뿐, 상자 안의 비디오, 오디오를 변경하진 않습니다. 따라서 원본 화질과 음질을 그댜로 유지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;예시)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DVD-Video에서 립한 흔히 디빅스라고 말하는 영화파일을 준비합니다.(그림에서 왼쪽편 파일)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이&amp;nbsp;AVI파일에서 DivX&amp;nbsp;비디오와 MP3 오디오를 추출합니다.(디먹싱)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;추출된 DivX 비디오와&amp;nbsp;MP3 오디오를 MKV 상자에 넣습니다.(먹싱)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2가지의&amp;nbsp;avi 파일과 mkv 파일을 비교해 보면,&amp;nbsp;비디오와 오디오를 담아두는&amp;nbsp;상자만 다를뿐&amp;nbsp;실제 비디오 데이터와 오디오 데이터는 똑같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 바꾸어 말하면&amp;nbsp;화질과 음질은 똑같습니다. 또한 거꾸로 MKV파일을&amp;nbsp;디먹싱, 먹싱을 통해 AVI파일로 만들수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;※ 실제 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DivX 비디오가 들어간 AVI파일은 재생하지만, DivX 비디오가 들어간 MKV파일은 재생하지 못하는 플레이어가 있다면 MKV 상자에서 DivX 비디오를 꺼내 AVI 상자에 넣으면 재생 문제가 해결됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=dbfan24&amp;amp;logNo=10128721121&quot;&gt;동영상의 기본적인 이해 (컨테이너 포맷이란?, 동영상의 변환이란?)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코덱 (Coder and Decorder)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떠한 데이터 스트림에 대해 인코딩, 디코딩을 할 수 있는 소프트웨어&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;음성 또는 영상 신호를 디지털 신호로 변환하는 코더와, 그 반대로 변환시켜주는 디코더를 통틀어부르는 용어이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코더 + 디코더의 합성어&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인코딩: 영상신호를 디지털 신호로 바꾸는 것을 코딩이라고 하고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;디지털 신호를 영상으로 변환하는 것을 디코딩이라고 함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programming/Android</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/172</guid>
      <comments>https://hs5555.tistory.com/172#entry172comment</comments>
      <pubDate>Thu, 31 Mar 2022 21:17:12 +0900</pubDate>
    </item>
    <item>
      <title>[개발자 책] 소프트 스킬 - 1부 경력</title>
      <link>https://hs5555.tistory.com/171</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 다른 이들과 달리 멋지게 시작하라&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사업가의 사고방식 갖추기&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;소프트웨어 개발자는 자신의 경력을 사업으로 봐야 한다. 회사에 소속되어 일하더라도 자신의 정체성이나 경력은 조직에서 주어진 역할과 별개로 존재해야 한다고 생각한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;머슴같은 태도를 버리고 사업가의 태도를 갖추는 것이야 말로 경력 관리의 출발점이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 제공하는 서비스를 사업으로 생각하고, 이 사업(서비스)의 가치가 정확히 무엇인지, 그 가치가 다른 수많은 소프트웨어 개발자가 제공하는 가치와 어떻게 다른지 설명할 수 있어야 한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;제품이나 서비스를 알릴 수 있는(마케팅) 방법도 생각해봐야 한다. 마케팅을 잘할수록 서비스 판매가격이 높아지고, 잠재고객 수가 증가한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떤 서비스를 제공할 지 , 그 서비스를 어떻게 마케팅 할 지 고민해라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서비스 개선 방법을 고민해라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;소수의 특정 유형 고객에게 필요한 특수 서비스를 제공하는 전문가가 돼라.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구체적인 내용은 아직 잘 모르더라도 고정관념에서 벗어나 사업가처럼 사고하는 것이 핵심이다. 고객을 모을 수 있는 가장 좋은 방법은 무엇인가? 당신의 서비스를 고객에게 어떻게 설명하겠는가? 이 간단한 질문에 대답할 수 있다면, 경력을 멋지게 시작할 수 있을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[실천하기]&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여러 기업이 자사의 제품이나 서비스를 차별화하고 광고하는 방법을 찾아보라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자신의 서비스를 장래의 고용주나 고객에게 한 문장으로 설명한다고 생각하고 아이디어를 내보라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사업가의 사고방식을 갖추면 다음 항목이 어떻게 변할지 생각해보라&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;업무방식, 재무관리 방식, 구직방식, 고객을 찾는 방식&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;15. 재택근무 생존 전략&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;시간 관리&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일할 시간을 규칙적으로 정하고, 매주 일을 계획해서 하자.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자발적으로 일하기&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최대한 규칙적으로 일하는 습관을 들여라. 의욕이 떨어졌을 때 습관이 당신을 도울 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집중이 잘 되지 않는다면, 15분만 집중해라. 15분간 집중해서 일하고 나면 계속 일하기가 더 쉬워진다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이를 관성이라고 부른다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;외로움&lt;/span&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;집을 나가서 다른 사람들과 만날 수 있는 활동에 참여하라.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;환경에 변화를 주고 싶다면, 커피숍을 가는 것도 괜찮다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;헬스장에 가도 좋고, 개발자 네트워킹 행사에 참여하는 것도 좋다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비대면 화상회의로 소통하는 것도 좋다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;26. 바보같이 보여도 괜찮다.&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;진짜 성공적으로 자신을 마케팅하고 싶다면, 남들에게 바보 같아 보일까 두려워 하는 마음과, 다른사람이 당신을 어떻게 생각하는지 신경쓰는 마음을 버려야한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;뭐든지 처음에는 어색하다&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;발표를 하는 것, 블로그에 글을 쓰는 일, 심지어 댓글을 남기는 일도 어느정도 용기가 필요하다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이런 문제에 부딪히면 보통 극복보다 포기를 선택한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다른 사람이 자신을 어떻게 생각할지 너무 신경쓰는 사람, 어렵고 어색한 상황을 극복할 때까지 밀어붙이지 않는 사람이 대부분이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;바보같아 보여도 괜찮다 &amp;rarr; 시간이 지나면 쉬워진다&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;꾸준히 블로그에 글을 쓰고, 강연을 하고, 유튜브에 동영상을 올린다면 조금씩 편해지다가 결국은 자연스럽게 느끼는 날이 반드시 올 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그래도 떨리면 어떻게 할까?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;신경쓰지 마라. 무대에서 바보처럼 보이더라도 신경쓰지 마라.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;누군가 당신의 블로그를 틀렸다고, 멍청하다고 해도 신경 쓰지 말고, 다른 사람이 당신을 비웃어도 함께 웃을 마음의 여유를 가져라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다시 한번 말하지만, 말보다 실천이 어렵다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;남들이 나를 바보같이 볼 만한 상황이 벌어진 후 이어질 최악의 상황은 무엇일까?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아무리 발표를 망쳐도 망친 강연자에게 뭐라고 할 사람은 아무도 없을 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;성공하고 싶다면 자존심은 잠시 접어두라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;지금 성공한 사람들은 모두 잘 하지 못했던 때가 있다. 그래도 그들은 해보기로 하고 최선을 다했다. 어떤 일이든 끝은 난다. 그리고 어떤 일이든 꾸준히 하면 반드시 나아진다. 그렇게 될 때까지 버터야한다. 무신경해져야 버틴다. 바보같아 보일 것을 두려워 하지마라.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;작든 크든 도전하라&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;발표, 저술이 어렵다면, 블로그에 댓글 다는 것 부터 해봐라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 다음은 블로그에 글쓰기를 해봐라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;조금이라도 발전하는 것이 핵심이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  용감해져라. 당신 인생의 주인공은 당신이다. 나가서 두려운 일에 도전하라. 작든 크든 상관없다. 불편한 상황도 자꾸 부딪치다 보면 별 게 아니라는 사실을 스스로 일깨워라.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 소프트 스킬은 생각보다 중요하다&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;코드 작성이 전부가 아니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;대인관계 기술 배우기 (카네기-인간관계론)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;존중하라&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;누구나 자신이 중요한 존재로 여겨지길 바란다는 사실을 잊지마라. 이러한 바람은 무언가 성취하고자하는 가장 근본적인 동기이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;칭찬하라&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원하는 결과를 얻으려고 비판하는 습관은 고쳐야 한다는 사실을 깨달았을 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;응원하는 말만하고, 칭찬하라&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;상대의 입장에서 생각해라&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;상대가 중요하게 생각하는 것, 상대가 원하는 것을 생각하라&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;특정 기능을 구현해서 설명할 때는, 그 방식을 사용하면 어떤 이득을 보는지 알려줘라&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;논쟁을 피해라&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>private</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/171</guid>
      <comments>https://hs5555.tistory.com/171#entry171comment</comments>
      <pubDate>Sun, 27 Mar 2022 23:51:37 +0900</pubDate>
    </item>
    <item>
      <title>[Design Pattern] Observer Pattern</title>
      <link>https://hs5555.tistory.com/168</link>
      <description>&lt;h2&gt;&lt;b&gt;Observer Pattern&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;옵저버 패턴은 데이터의 변경이 발생되었을 때, 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다.&lt;/p&gt;
&lt;p&gt;예를 들어, 새로운 파일이 추가되거나 기존 파일이 삭제되었을 때 탐색기는 이를 즉시 표시할 수 있다. 탐색기를 복수 개 실행하는 상황이나 하나의 탐색기에서 파일 시스템을 변경했을 때는 다른 탐색기에게 즉각적으로 이 변경을 통보해야 한다.&lt;/p&gt;
&lt;p&gt;다른 예로는 차량의 연료가 소진될 때까지 주행가능 거리를 출력하는 클래스, 연료량이 부족하면 경고 메세지를 보내는 클래스, 연료량이 부족하면 자동으로 근처 주유소를 표시하는 클래스 등에 연료량의 변화를 통보하는 경우가 있다.&lt;/p&gt;
&lt;p&gt;이런 경우 연료량 클래스는 연료량에 관심을 가지는 클래스에 직접 의존하지 않는 방식으로 설계하는 것이 바람직하다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;옵저버 패턴은 통보 대상 객체의 관리를 Subject 클래스와 Observer 인터페이스로 일반화한다. 그러면 데이터 변경을 통보하는 클래스(ConcreteSubject)는 통보 대상 클래스나 객체에 대한 의존성을 없앨 수 있다. 결과적으로 옵저버 패턴은 통보 대상 클래스나 대상 객체의 변경에도 ConcreteSubject 클래스를 수정없이 그대로 사용할 수 있도록 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;b&gt;옵저버 패턴의 모델&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Observer&lt;/b&gt; : 데이터의 변경을 통보 받는 인터페이스. 즉, Subject에서는 Observer 인터페이스의 update() 를 호출함으로써 ConcreteSubject의 데이터 변경을 Concrete에게 통보한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Subject&lt;/b&gt;: ConcreteSubject 객체를 관리하는 요소. Observer 인터페이스를 참조해서 ConcreteObserver를 관리하므로 ConctreteObserver 변화에 독립적일 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcreteSubject&lt;/b&gt; : 변경 관리 대상이 되는 데이터가 있는 클래스. 데이터 변경을 위한 메서드인 setState가 있으며, setState에서는 자신의 데이터인 subjectState를 변경하고 Subject의 notifyObservers를 호출해서 Concrete Observer 객체에 변경을 통보한다
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;ScoredRecored&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcreteObserver&lt;/b&gt; : ConcreteSubject의 변경을 통보받는 클래스. Observer 인터페이스의 update 메서드를 구현함으로써 변경을 통보받는다. 변경된데이터는 ConcreteSubject의 getState메서드를 호출함으로써 변경을 조회한다.
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;DataSheetView, MinMaxView&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1608970777840&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 입력하는 점수를 저장하는 클래스
 * 구체적인 변경 감시 대상 데이터
 */
public class ScoredRecord extends Subject{
    private List&amp;lt;Integer&amp;gt; scores = new ArrayList&amp;lt;Integer&amp;gt;();

    //데이터가 변경될 때 View 에게 통지한다.
    public void addScore(int score) { //새로운 점수를 추가
        scores.add(score); //점수 리스트에 점수 추가
        //데이터가 변경되면 Subject 클래스의 notifyObservers 메서드를 호출해
        // 각 옵저버에게 데이터 변경을 통보
        notifyObservers();
    }

    public List&amp;lt;Integer&amp;gt; getScoreRecord(){
        return scores;
    }
}


/**
 * 성적 변경에 관심이 있는 대상 객체를 관리하는 Subject 클래스를 추가 정의
 * Subject 는 Observer 인터페이스를 구현함으로써 성적 변경에 관심이 있음을 보여준다.
 * Subject 클래스는 Observer 인터페이스를 통해 View 객체들의 update 메서드를 호출한다.
 */

//추상화된 변경 관심 대상 데이터
public abstract class Subject {
    private List&amp;lt;Observer&amp;gt; observers = new ArrayList&amp;lt;&amp;gt;(); //추상화된 통보 대상 목록

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    //통보 대상 목록, 즉 observers 의 각 옵저버에게 변경을 통보함
    public void notifyObservers() {
        for (Observer o:observers)
            o.update();
    }
}

/**
 * 추상화된 통보 대상
 */
public interface Observer {
    public abstract void update(); //데이터 변경을 통보했을 때 처리하는 메서드
}

public class MinMaxView implements Observer{
    private ScoredRecord scoredRecord;

    public MinMaxView(ScoredRecord scoredRecord){
        this.scoredRecord = scoredRecord;
    }

    public void update() { //점수의 변경을 통보받음
        List&amp;lt;Integer&amp;gt; record = scoredRecord.getScoreRecord(); //점수를 조회함
        displayMinMax(record);
    }

    public void displayMinMax(List&amp;lt;Integer&amp;gt; record) {
        int min = Collections.min(record, null);
        int max = Collections.max(record, null);
        System.out.println(&quot;min: &quot; + min + &quot; max: &quot; + max);
    }
}
/**
 * 점수를 목록의 형태로 출력하는 클래스
 */
public class DataSheetView implements Observer {
    private ScoredRecord scoredRecord;
    private int viewCount;

    public DataSheetView(ScoredRecord scoredRecord, int viewCount){
        this.scoredRecord = scoredRecord;
        this.viewCount = viewCount;
    }

    public void update() { //점수의 변경을 통보받음
        List&amp;lt;Integer&amp;gt; record = scoredRecord.getScoreRecord(); //변경된 scores 리스트를 얻어서 표시
        displayScores(record);
    }

    private void displayScores(List&amp;lt;Integer&amp;gt; record) {
        for (int i=0; i&amp;lt;viewCount &amp;amp;&amp;amp; i&amp;lt;record.size(); i++){
            System.out.println(record.get(i) + &quot; &quot;);
        }
        System.out.println();
    }
}


/**
 * [문제점]
 * 데이터의 통보대상이 변경된 것을 반영하기 위해 ScoredRecord 클래스의 코드를 수정해야 한다.
 * 예를 들어, 평균/표준 편차를 출력하는 클래스에게 성적변경을 통보하려면 ScoredRecord 를 다시 변경해야한다.
 *
 * [해결책]
 * 성적 통보 대상이 변경(추가/삭제)되더라도 ScoreRecord 클래스를 그대로 재사용할 수 있어야 한다.
 * 따라서 Scored 클래스에서 변화되는 부분을 식별하고, 이를 일반화 시켜야한다.
 */
public class Client {
    public static void main(String[] args) {
        ScoredRecord scoredRecord = new ScoredRecord();

        DataSheetView dataSheetView3 = new DataSheetView(scoredRecord, 3);
        DataSheetView dataSheetView5 = new DataSheetView(scoredRecord, 5);
        MinMaxView minMaxView = new MinMaxView(scoredRecord);
        StatisticsView statisticsView = new StatisticsView(scoredRecord);

        scoredRecord.attach(dataSheetView3);
        scoredRecord.attach(dataSheetView5);
        scoredRecord.attach(minMaxView);

        scoredRecord.detach(dataSheetView3);
        scoredRecord.detach(dataSheetView5);
        scoredRecord.attach(statisticsView);

        for (int i=0; i&amp;lt;=5; i++){
            //데이터가 추가될 때 마다 , dataSheetView3 / dataSheetView5 / minMaxView 의 값이 출력됨
            scoredRecord.addScore(i*10);
        }



    }
}

&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/DesignPattern</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/168</guid>
      <comments>https://hs5555.tistory.com/168#entry168comment</comments>
      <pubDate>Sat, 26 Dec 2020 17:19:45 +0900</pubDate>
    </item>
    <item>
      <title>Array &amp;amp; List</title>
      <link>https://hs5555.tistory.com/167</link>
      <description>&lt;article id=&quot;9909ed67-d089-4b04-aff5-137cff15994e&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;h2 id=&quot;f94b411f-1f82-4546-8dd3-51bca41f766b&quot; class=&quot;&quot;&gt;배열 (Array)&lt;/h2&gt;&lt;p id=&quot;ac15ae66-a817-409f-9c64-bf5e3d3759cf&quot; class=&quot;&quot;&gt;같은 타입의 데이터를 나열한 선형 자료구조&lt;/p&gt;&lt;p id=&quot;c7e65f42-f86e-4a21-bdb2-fdd0570b3d5f&quot; class=&quot;&quot;&gt;연속된 메모리 공간에 순차적으로 저장&lt;/p&gt;&lt;p id=&quot;5175fba2-1a2b-4148-b671-ea22fb9b6d9f&quot; class=&quot;&quot;&gt;배열의 크기는 고정. 선언할 때 배열의 크기를 정하고, 변경할 수 없다.&lt;/p&gt;&lt;hr id=&quot;7a42b07a-8dd6-4866-82df-f38697e74263&quot;&gt;&lt;h3 id=&quot;d317d004-2a69-4c1c-8ea4-92855a0f3059&quot; class=&quot;&quot;&gt;시간복잡도&lt;/h3&gt;&lt;ul id=&quot;44b812b6-ad48-4ae8-9a25-9773ff68e582&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삽입/삭제&lt;ul id=&quot;525e9421-2096-4692-a119-99bb7feca20b&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;배열의 맨 앞에 삽입 삭제하는 경우 : O(n)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1a7029d6-cdf0-4685-ba30-b29c4dde7687&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;배열의 맨 뒤에 삽입/삭제하는 경우 : O(1)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;57db7fc6-a23a-4178-866b-145f54fd5767&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;배열 중간에 삽입/삭제하는 경우 : O(n)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;ecdbd4c1-9641-48e4-b075-f8c9ba4f3408&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;탐색&lt;ul id=&quot;df90bc59-3d01-41b4-9ed3-b615b6862d6b&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;O(1)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;a7823553-621d-4a82-8235-f4432e84f898&quot;&gt;&lt;h3 id=&quot;1ad33451-6de3-4a40-9b2f-5fae9fae50e4&quot; class=&quot;&quot;&gt;장점&lt;/h3&gt;&lt;ul id=&quot;3ad97cbb-dbae-4674-b002-0ceea27448ef&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;인덱스를 가지고 있어 바로 접근 가능 - O(1)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;09c376c7-7ed8-482e-b3da-6ec31c5d6090&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;연속된 메모리 공간에 존재하기 때문에 관리가 편하다.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;eda351f8-c4bf-4550-a309-68f9068d762e&quot; class=&quot;&quot;&gt;단점&lt;/h3&gt;&lt;ul id=&quot;f256d007-5696-475e-90ea-39517e419daf&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삽입과 삭제가 어렵고 오래 걸린다.&lt;ul id=&quot;97ba5d19-f8f9-42f4-ada3-9282a065ad11&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;원소를 삽입하거나 삭제할 경우, 해당 원소 이후의 모든 원소들을 한칸씩 밀거나 당겨야 한다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;f6a6c1b9-b9d1-43c3-8767-b0814ca62296&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;450f5c2a-0913-4129-a583-eb6981d455c4&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;배열의 크기를 바꿀 수 없다.&lt;ul id=&quot;cceead33-d4ea-49c5-b452-9c8c10b1556e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;배열은 처음 생성할 때 크기를 결정하고 고정&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;54ef2a47-4827-4942-ad75-af5d30dc8729&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;116eb009-6a13-4a1b-a028-67e39d3020f3&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;연속된 메모리 공간을 사용하기 때문에 공간낭비가 발생&lt;ul id=&quot;d805a109-f119-404f-a4bf-0cc7e764e16f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;중간에 데이터가 삭제되면 공간 낭비가 발생할 수 있음. 또, 처음에 배열 크기를 100으로 생성했는데 10정도 밖에 쓰지 않으면 나머지 공간은 빈 공간으로 낭비가 발생함&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;3a7d6072-2e8e-4f70-a144-318ea982e6ee&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;연속적인 메모리 할당이 필요하다&lt;ul id=&quot;4836a0f4-c6ad-4bec-9077-768c302f17a3&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;메모리 공간을 많이 사용하게 될 수 있다.&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;44887868-5858-47f1-a0c2-482ac1b62d3f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;5c65201e-bab1-4858-944f-d270d396a84f&quot;&gt;&lt;h3 id=&quot;2c585adc-4700-4689-8b66-17b9c0049b37&quot; class=&quot;&quot;&gt;언제 사용할까&lt;/h3&gt;&lt;ul id=&quot;8be07a9f-d0c2-4a0d-bc42-d4db2ae2e882&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터의 개수가 확실하게 정해져 있을 때&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;19c59e90-5399-4229-bd05-fde4ef37106c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삽입/삭제가 적을 때&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;dc703299-672c-4513-82dd-3ec0b7cb1a3a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;검색을 해야할 때&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;77b003a2-fb06-4d71-ae5d-1f458f02f13d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;635c7b45-6b2c-43a4-8c9d-961b0bb68dd3&quot;&gt;&lt;h2 id=&quot;f46ffb24-78c2-4def-8c19-aef43518f40f&quot; class=&quot;&quot;&gt;리스트 (Linked List)&lt;/h2&gt;&lt;ul id=&quot;2180e9c9-8124-4e32-8bec-bf1b0ef02c95&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터를 순차적으로 저장하는 선형 자료구조&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;4be7ddee-3391-4778-80c6-34b02019bded&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;불연속적 메모리 공간에 저장&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;e2cc8ece-31ec-4213-a925-56a403df8f09&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;노드를 연결하여 만든 리스트&lt;p id=&quot;15bc7d66-0158-48dd-bdf7-87b6d52d6318&quot; class=&quot;&quot;&gt;첫 번째 노드를 헤드, 마지막 노드를 테일이라고 함&lt;/p&gt;&lt;p id=&quot;0f9ae534-9e91-4696-a4ca-d9996cdaf78d&quot; class=&quot;&quot;&gt;각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어짐&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;96737785-ccf1-4622-be2d-862cf8f6f493&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;크기가 고정되어 있지 않고, 새로운 요소를 크기가 정해져 있지 않으므로 새로운 요소를 추가할 때 크게 제한에서 자유롭다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;4f1d3b1c-78b1-4195-97a5-5c2ceacfafeb&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;인덱스 접근이 불가능하다.&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;8ebf9b65-062f-4199-aa8b-3dc258784961&quot;&gt;&lt;h3 id=&quot;b8667ed9-0059-44cd-bba6-cf05d85275d2&quot; class=&quot;&quot;&gt;시간 복잡도&lt;/h3&gt;&lt;ul id=&quot;72b4c5e5-8548-4ebf-a12d-e4924766973c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삽입&lt;ul id=&quot;9c365a26-ec72-4c0f-b517-b6850a0417e4&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리스트의 맨 앞/뒤에 삽입 or 삭제 : O(1)&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;b89e48c7-9c40-4f44-ba4b-5dfa8d1240f6&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;리스트의 중간에 삽입 or 삭제: O(n)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1e606cd3-0fea-4775-a3f6-6563653cc589&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;탐색&lt;ul id=&quot;3eccc78b-01c4-48a2-990a-3f563bd6c81c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;O(n)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;371f7a7d-09fe-49a9-a889-2035bb07ef16&quot;&gt;&lt;h3 id=&quot;304f5daa-beef-4d1c-9acc-aeacd74d229a&quot; class=&quot;&quot;&gt;장점&lt;/h3&gt;&lt;ul id=&quot;31efc8e0-53bb-4dc3-8fb3-4c70ee270f4c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삽입과 삭제가 용이&lt;ul id=&quot;eb3c795a-b37b-4ee4-8d82-b883e50c2e17&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;993effac-34bc-432b-b67c-031b93f50db5&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;크기가 정해져 있지 않고 동적으로 생성&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;fb25b890-6026-4d25-a299-ee88ccfb0e41&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;연속적인 메모리 할당이 필요하지 않다&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;9d0d9ecd-bfc6-436d-b5e1-b0f438243c8b&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;사용한 메모리 재사용 가능&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;3e0c00ff-aeec-464b-a760-3c7ddee1577a&quot; class=&quot;&quot;&gt;단점&lt;/h3&gt;&lt;ul id=&quot;ef174fe5-b6f7-4bec-89be-99a514424d38&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;삽입과 삭제가 빈번할 때 성능이 좋지 않음.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;4eaf6bf0-05ea-4857-9314-38672557102c&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;검색을 자주 하지 않을 때&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;d3c89386-f6c3-4b1b-99ee-2dc0dd742173&quot;&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;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/167</guid>
      <comments>https://hs5555.tistory.com/167#entry167comment</comments>
      <pubDate>Wed, 23 Dec 2020 00:44:50 +0900</pubDate>
    </item>
    <item>
      <title>Java Collection Framework</title>
      <link>https://hs5555.tistory.com/164</link>
      <description>&lt;article id=&quot;b47d8334-5270-4e36-9eb7-1e445af24fe8&quot; class=&quot;page sans Notion_P&quot;&gt;&lt;div class=&quot;page-body&quot;&gt;&lt;figure id=&quot;c5d89c6f-2a24-4b27-a1a9-3cefb4c34682&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/99D179445FE0397221?original&quot;&gt;&lt;img style=&quot;width:576px&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99D179445FE0397221?original&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;e235671d-df60-46b6-a264-cdf9f26fe2a7&quot; class=&quot;&quot;&gt;컬렉션은 기본 데이터형이 아닌, &lt;strong&gt;참조 데이터형&lt;/strong&gt;만 저장이 가능하다는 것이다. 따라서 Collection에서의 &lt;strong&gt;데이터는 Object 타입의 객체로서 저&lt;/strong&gt;장이 되는 것인데, 그렇다면 여기서 기본 데이터형은 어떻게 저장하고 관리할 수 있을까?&lt;/p&gt;&lt;p id=&quot;87843694-f703-470f-a24d-33ee83a84b5d&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;f20919ae-5189-4e76-af2a-3cae9dd7dde4&quot; class=&quot;&quot;&gt;기본 데이터형인 5를 Wrapper클래스의 Integer 타입 객체로 변환하여 autoboxing으로 저장할 수 있다. 즉, 오토박싱을 통해 기본 데이터형을 컬렉션에 직접 대입하여 저장해도 &lt;strong&gt;컴파일러가 자동으로 Wrapper 클래스로 변환해준다&lt;/strong&gt;&lt;/p&gt;&lt;p id=&quot;93111114-3d6b-416d-93f7-d947d32c2811&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;p id=&quot;60cce5ad-7b32-42ec-b14a-1f8a23e6fb77&quot; class=&quot;&quot;&gt;저장된 값을 얻어올 때에도 객체화된 데이터를 기본 데이터형으로 바로 얻어올 수 있는 데, 이 경우 언박싱(unboxing)이라는 용어를 사용한다.&lt;/p&gt;&lt;hr id=&quot;d11b6265-fdda-4f20-b3e8-96fdcef53a90&quot;&gt;&lt;h3 id=&quot;47c33743-8d99-45f5-b885-83ae4bb0c9c2&quot; class=&quot;&quot;&gt;List : Interface&lt;/h3&gt;&lt;ul id=&quot;c015e7b7-ea6b-4c3e-b149-f42dd674c319&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;동일한 데이터의 중복을 허용한다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;d671a792-5d83-4c39-8e21-9e5b74b9a683&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터 저장 순서가 유지된다&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;261c6a8b-ae9e-4f9b-b5d5-29c3f06b58d9&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;힙 영역 내에서  List는 객체를 일렬로 늘어 놓은 구조를 취한다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;9e66a492-0c1b-46b9-b788-52cae742f35a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색 및 삭제할 수 있다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;77a1a70a-2e18-4fb2-94bb-8f67d9998c00&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;이 때 List는 객체 자체를 저장하여 인덱스를 부여하는 것이 아니라, 해당하는 인덱스에 객체의 주소값을 저장한다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a48c60c5-c48c-48d8-9dd7-5d0eef1622d1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;추가, 검색, 삭제 메소드를 갖고 있다.&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;dc0bb778-d445-4121-8405-0f8a6c5ea6de&quot;&gt;&lt;h3 id=&quot;4d9fa136-bcc8-4957-b6c4-a69a5d33b98f&quot; class=&quot;&quot;&gt;ArrayList&lt;/h3&gt;&lt;p id=&quot;bfc87b30-97d3-4e9b-8046-51415f16fd4f&quot; class=&quot;&quot;&gt;ArrayList는 List 인터페이스의 구현 클래스로, 데이터(객체)는 인덱스로 관리된다. &lt;/p&gt;&lt;p id=&quot;a23f9438-103d-4c65-a5d9-34af13fdf880&quot; class=&quot;&quot;&gt;Array List는 배열로 구현한 리스트이다. 내부에서 배열을 이용하기 때문에 인덱스를 이용해서 데이터에 접근합니다. 데이터를 조회할 땐 빠르지만, 데이터를 추가/삭제할 땐 느립니다.&lt;/p&gt;&lt;ul id=&quot;c9ea262b-f08c-4954-a836-a2900c33c743&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;기본 생성자로 ArrayList 객체를 생성하면, 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게 된다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;65004a7b-2204-487c-9890-da4e1f622718&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;만약 arrayList.add(&quot;more&quot;); 로 1개의 객체를 추가하면, 즉 저장 용량을 초과한 객체들이 들어오면 arrayList가 참조하고 있는 ArrayList 컬렉션에는 10*2+2 = 22개의 객체를 저장할 수 있는 공간이 자동으로 생겨난다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;493dd558-edb8-4d32-8bbe-f6084837355f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Array로 구현한 리스트는 데이터를 매우 빠르게 가져옵니다. 메모리 주소를 정확하게 참조해서 데이터를 가져오기 때문이죠.&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;52de7d61-bb3c-48d1-9de8-9a24c62fb3b8&quot;&gt;&lt;h3 id=&quot;f1978bbd-430a-4aa2-bf9b-125e8ad4dd7b&quot; class=&quot;&quot;&gt;ArrayList 의 단점&lt;/h3&gt;&lt;ul id=&quot;6cc94962-e141-4887-9664-abed8651be2f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;위에서 언급한 Size 확장 문제는 ArrayList의 단점이다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;5301d55e-47bf-4910-ad29-dae24e8db255&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Size를 늘리는 과정에서 많은 시간이 소요된다는 점이다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1a53ea0f-1df4-43ae-a95b-5419b753c259&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;Size 부족으로 이를 확장하게 되는 경우, 기존의 ArrayList에 데이터를 추가하는 것이 아닌, 확장된 크기의 ArrayList를 새로 생성한다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;ea0b767f-9f33-4d71-9e81-bec462c8e154&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;새로 생성한 ArrayList에 기존 ArrayList의 값들을 복사해주는 과정을 거친다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;c660f292-46df-4c43-9eba-78f50a2961ba&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;그리고 기존의 ArrayList는 GC에 의해 메모리에서 제거된다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;84a536d5-8ffd-41aa-8ab2-4a4c445af947&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;따라서 ArrayList의 Size를 늘린다는 것은 새로운 배열 인스턴스의 생성과 기존 데이터의 복사가 필요한 번거로운 작업이 되는 것이다.&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;f91596e5-58b6-45e0-8f45-532fe80a8090&quot;&gt;&lt;h3 id=&quot;36899103-8a96-4b48-ba89-72e9c6c6a724&quot; class=&quot;&quot;&gt;Vector&lt;/h3&gt;&lt;p id=&quot;70e4b499-c184-4377-8a32-e8624c4c5847&quot; class=&quot;&quot;&gt;Vector는 ArrayList와 동일한 내부 구조를 가지고 있다.&lt;/p&gt;&lt;p id=&quot;359cf58c-baeb-4468-8176-175f06602244&quot; class=&quot;&quot;&gt;ArrayList와 다르게 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메서드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드가 실행할 수 있다.&lt;/p&gt;&lt;p id=&quot;ab0297ef-9939-4476-84e0-fe5f2b9bc9a0&quot; class=&quot;&quot;&gt;따라서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다.&lt;/p&gt;&lt;hr id=&quot;642be56e-5d80-4b5b-9d6c-72cd24b676f9&quot;&gt;&lt;h3 id=&quot;3ebae81d-0f75-4d5c-ad73-955b364ca4b4&quot; class=&quot;&quot;&gt;LinkedList&lt;/h3&gt;&lt;p id=&quot;0f5e0dbc-15fd-4677-9ebd-564f278e7dbc&quot; class=&quot;&quot;&gt;LinkedList는 List의 구현 클래스이므로 ArrayList와 사용하는 메소드는 같지만 내부구조는 완전 다르다. ArrayList는 내부에 배열 객체를 저장해서 인덱스로 관리하지만, LinkedList는 양방향 포인터 구조로, 데이터마다 인접하는 주소값을 이용하여 체인처럼 관리한다.&lt;/p&gt;&lt;p id=&quot;ea4aa1c6-1303-449c-9a56-2428cee42387&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;figure id=&quot;6fed56ec-381b-48bc-a314-03d1c64f207c&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/99036E3C5FE0397122?original&quot;&gt;&lt;img style=&quot;width:1790px&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/99036E3C5FE0397122?original&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;24d15f71-5542-4134-a67f-d2d35104e013&quot; class=&quot;&quot;&gt;따라서 LinkedList는 특정 인덱스의 객체를 제거하거나 삽입하면, 앞 뒤 링크만 변경되고 나머지 링크는 변경되지 않는다. 그러므로 삽입/삭제가 빈번할 수록 LinkedList를 쓰는 것이 효율적이다.&lt;/p&gt;&lt;p id=&quot;e723cf32-7fc8-4d9c-8d05-0eb749955744&quot; class=&quot;&quot;&gt;반대로 순차적인 삽입/삭제가 빈번하다면 ArrayList를 사용하는 것이 효율적이다.&lt;/p&gt;&lt;hr id=&quot;943dc57d-b7c8-4063-83cf-c2bfa22cc932&quot;&gt;&lt;h3 id=&quot;63442a37-3f7c-46fc-90ed-1353a671760c&quot; class=&quot;&quot;&gt;Set : Interface&lt;/h3&gt;&lt;ul id=&quot;2eb91399-0cd3-403e-9cff-c8038ae3db9f&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;데이터의 저장 순서를 유지하지 않는다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;9e52ac02-176d-4c6e-884a-64859bbfe602&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;같은 데이터의 중복 저장을 허용하지 않는다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;1d7b48d0-ba6d-4d03-8627-014285d04a98&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;인덱스로 조회할 수 있는 메서드가 없다.&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a49d7a6a-1d1c-4e13-ab8a-7252cea08f51&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;대신 전체 객체를 대상으로 하나씩 조회할 수 있는 Iterator 를 제공.&lt;/li&gt;&lt;/ul&gt;&lt;hr id=&quot;8781c3d9-58d6-4f19-9198-ea9a34ab9473&quot;&gt;&lt;h3 id=&quot;c9c5a5ff-09ec-428a-92b3-35a9406b0ec5&quot; class=&quot;&quot;&gt;HashSet&lt;/h3&gt;&lt;ul id=&quot;080efe01-e823-418a-b204-eb745ee9e431&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;순서가 필요없는 데이터를 해쉬테이블에 저장. Set 중에서 가장 성능이 좋다.&lt;ul id=&quot;c34f0fdc-dd0b-4046-8cdb-6c9393f983c8&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;159a1677-5889-4791-905e-0a026ce44d9a&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;HashSet에 이미 존재하고 있는 데이터를 추가하려고 하면, 해당하는 요소를 바로 저장하지 않고, 내부적으로 객체의 hashCode()메서드와 equals() 메서드를 호출하여 검사한다.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;2f0f3b4f-4f09-43bc-837f-42c2c38d37c9&quot; class=&quot;&quot;&gt;TreeSet&lt;/h3&gt;&lt;ul id=&quot;68d64411-d558-4a5c-9d72-e1c6d12ea7a1&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;저장된 데이터의 값에 따라 정렬됨. red-black 트리 타입으로 값이 저장됨. &lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;a61612c8-f78b-4879-b4a7-aa5dd7311833&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;HashSet보다 성능이 느림&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;c4b75816-85f8-4df4-a88c-6e94de28b8e3&quot; class=&quot;&quot;&gt;LinkedHashSet&lt;/h3&gt;&lt;ul id=&quot;1cd8ad5c-682a-46d1-aba2-94791cc2794e&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;연결된 목록 타입으로 구현된 Hash Table에 데이터 저장&lt;/li&gt;&lt;/ul&gt;&lt;ul id=&quot;9a4bdb56-c243-41f2-b998-86d9991a3830&quot; class=&quot;bulleted-list&quot;&gt;&lt;li&gt;저장된 순서에 따라 값이 전렬되나 Set 중에 가장 느림&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;07226644-6c57-4655-bbc0-7363f981aa3c&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;hr id=&quot;829377c4-f2bd-4b5b-8046-24995c8ca099&quot;&gt;&lt;h3 id=&quot;79ab99d6-e409-44b4-8a09-ed02ac23cb4d&quot; class=&quot;&quot;&gt;해시 알고리즘: Hash Algorithm&lt;/h3&gt;&lt;p id=&quot;9bb06a03-ce46-4924-887b-84701acc0dc4&quot; class=&quot;&quot;&gt;해시 알고리즘이란 해시 함수를 사용하여 해시 테이블에 저장하고, 다시 그것을 검색하는 알고리즘이다. &lt;/p&gt;&lt;p id=&quot;950861fc-46ef-46f8-9023-2754b7af6c30&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;figure id=&quot;d4316b74-be40-430d-b941-0062051855dc&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/9910F3465FE0397128?original&quot;&gt;&lt;img style=&quot;width:1968px&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/9910F3465FE0397128?original&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p id=&quot;3e80145e-80fc-4e9f-a8f9-384d45442ab2&quot; class=&quot;&quot;&gt;자바에서 해시 알고리즘을 이용한 자료구조는 위의 그림과 같이 배열과 연결리스트로 구성된다.&lt;/p&gt;&lt;p id=&quot;c13f6038-aca3-4ab1-ab3c-55b3f976fa34&quot; class=&quot;&quot;&gt;저장할 Key값과 Value를 넣으면 해시함수는 int index = key.hashCode() % capacity 연산으로 배열의 인덱스를 구하여 해당 인덱스에 저장된 연결 리스트에 데이터를 저장하게 된다.&lt;/p&gt;&lt;hr id=&quot;18bf00ce-2e2c-4a2d-87bd-453fd06d5b40&quot;&gt;&lt;h3 id=&quot;2495ea02-2215-41e4-b301-a8ce23d9013c&quot; class=&quot;&quot;&gt;Map : Interface&lt;/h3&gt;&lt;p id=&quot;ac8080e0-82c9-493a-9285-247cb0ac45eb&quot; class=&quot;&quot;&gt;Map은 key-value 쌍으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. value는 중복 저장이 가능하지만 key는 중복저장이 불가능하다.&lt;/p&gt;&lt;p id=&quot;1fc0ae45-ef35-4896-b316-82fbaf84c333&quot; class=&quot;&quot;&gt;Set과 마찬가지로, Map 컬렉션에서는 Key 값의 중복저장이 허용되지 않는다.&lt;/p&gt;&lt;p id=&quot;77d53f77-9234-451f-9023-6f0375aa3ee8&quot; class=&quot;&quot;&gt;만약 중복 저장을 한다면, 기존 값은 없어지고 새로운 값으로 대체한다.&lt;/p&gt;&lt;hr id=&quot;ad35f633-1653-4e16-a096-d7b8938c3d07&quot;&gt;&lt;h3 id=&quot;86638c02-da04-4df6-ae8a-83f112de6b5b&quot; class=&quot;&quot;&gt;HashMap&lt;/h3&gt;&lt;p id=&quot;e5983d57-bc4e-4169-85c7-f3c4aab2ad42&quot; class=&quot;&quot;&gt;HashMap은 Map 인터페이스 구현을 위해 해시테이블을 사용한 클래스이다. &lt;/p&gt;&lt;p id=&quot;adfb6603-8de0-4231-8f50-0fb1c6fce44e&quot; class=&quot;&quot;&gt;중복을 허용하지 않고, 순서를 보장하지 않는다.&lt;/p&gt;&lt;p id=&quot;1dc4ba3a-1449-4239-af12-3f98f6b83cf2&quot; class=&quot;&quot;&gt;key value 값으로 null 이 허용된다.&lt;/p&gt;&lt;hr id=&quot;155b5cc1-76c3-4e0b-abb0-b8f07cbe6daa&quot;&gt;&lt;p id=&quot;0ee35cf1-2c50-4194-b86a-c685567e0a0f&quot; class=&quot;&quot;&gt;
&lt;/p&gt;&lt;figure id=&quot;168e76a8-14aa-494c-b404-b424da9b38ff&quot;&gt;&lt;br /&gt;&lt;/figure&gt;&lt;figure id=&quot;cb693af3-1e4a-4b99-9a55-baa252cd320e&quot;&gt;&lt;a href=&quot;https://sabarada.tistory.com/63&quot; class=&quot;bookmark source&quot;&gt;&lt;div class=&quot;bookmark-info&quot;&gt;&lt;div class=&quot;bookmark-href&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&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;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/164</guid>
      <comments>https://hs5555.tistory.com/164#entry164comment</comments>
      <pubDate>Mon, 21 Dec 2020 14:58:10 +0900</pubDate>
    </item>
    <item>
      <title>JVM 이해</title>
      <link>https://hs5555.tistory.com/163</link>
      <description>&lt;h2&gt;&lt;b&gt;JVM의 역할&lt;/b&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Java Byte Code를 OS에 맞게 해석해주는 역할
&lt;ul&gt;
&lt;li&gt;JVM이 Byte Code를 해석해주기 때문에 OS에 종속적이지 않고 실행 가능 (플랫폼 독립적)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한 GC, 메모리 관리 등을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;b&gt;JVM 실행 과정&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;.java -&amp;gt; (javac) -&amp;gt; .class -&amp;gt; (jvm) -&amp;gt; process&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Compiler는 .java 파일을 .class (java byte code)로 변환&lt;/li&gt;
&lt;li&gt;byte code는 기계어가 아니기 때문에 OS에서 바로 실행되지 않음&lt;/li&gt;
&lt;li&gt;이 때 JVM이 OS가 Byte Code를 이해할 수 있도록 해석해줌
&lt;ul&gt;
&lt;li&gt;Byte Code는 JVM위에서 OS에 상관없이 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JVM의 해석을 거치기 때문에 c언어와 같은 로우레벨 언어에 비해 속도가 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;JVM 구조&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;.java &amp;rarr; (javac) &amp;rarr; .class&amp;rarr; (Class Loader) &amp;rarr; Runtime Data Area&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.class (byte code)는 Class Loader가 Runtiem Data Area에 로딩시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;509&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnxufU/btqQCzsy5q8/lzMj5JhRCVhLpzgZ6UYtvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnxufU/btqQCzsy5q8/lzMj5JhRCVhLpzgZ6UYtvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnxufU/btqQCzsy5q8/lzMj5JhRCVhLpzgZ6UYtvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnxufU%2FbtqQCzsy5q8%2FlzMj5JhRCVhLpzgZ6UYtvk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;509&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;hr /&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;JVM 관련 용어&lt;/h2&gt;
&lt;h3&gt;Class Loader&lt;/h3&gt;
&lt;p&gt;RunTime 시점에 클래스를 로딩하게 해주며, 클래스의 인스턴스를 생성하면 Class Loader를 통해 메모리에 로드하게 됩니다.&lt;/p&gt;
&lt;h3&gt;Runtime Data Areas&lt;/h3&gt;
&lt;p&gt;JVM이 프로그램을 수행하기 위해 OS로 부터 별도의 할당받은 메모리 공간을 말합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Method Area와 Heap 영역은 모든 쓰레드가 공유&lt;/li&gt;
&lt;li&gt;Method 영역은 JVM이 시작될 때 생성되는 공간으로 바이트 코드가 이영역에 저장된다.&lt;/li&gt;
&lt;li&gt;클래스 정보, 변수 정보, static으로 선언한 변수가 저장되고, 모든 쓰레드가 공유하는 영역&lt;/li&gt;
&lt;li&gt;Heap 영역은 동적으로 생성된 저장되는 영역. GC의 대상이 되느 ㄴ공간&lt;/li&gt;
&lt;li&gt;Stack 영역은 지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역&lt;/li&gt;
&lt;li&gt;PC Register는 쓰레드가 시작될 때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간. 그러니까 스레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간 (?)&lt;/li&gt;
&lt;li&gt;Native Method Stacks는 Java가 아닌 다른언어로 작성된 코드를 위한 공간. 즉, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Execution Engine&lt;/h3&gt;
&lt;p&gt;Load된 Class의 ByteCode를 실행하는 Runtime Module&lt;/p&gt;
&lt;p&gt;Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드는 Execution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행(인터프리터)&lt;/p&gt;
&lt;p&gt;바이트 코드를 실행시키는 엔진&lt;/p&gt;
&lt;p&gt;인터프리터는 명령어를 한줄 한줄 읽어가며 실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;JIT Compiler&lt;/h2&gt;
&lt;p&gt;최초 JVM이 나왔을 때는 Interpreter 방식이였기 때문에 속도가 느리다는 단점이 있었지만, JIT Compiler 방식을 통해 이점을 보완.&lt;/p&gt;
&lt;p&gt;JIT는 ByteCode를 어셈블리어 같은 NativeCode로 바꿔서 실행이 빠르지만 역시 변환하는데 비용이 발생.&lt;/p&gt;
&lt;p&gt;이 같은 이유로 JVM은 모든 코드를 JIT Compiler 방식으로 실행하지 않고, Interpreter 방식을 사용하다 일정 기준이 넘어가면, JIT Compiler 방식으로 실행&lt;/p&gt;
&lt;p&gt;반복되는 코드는 JIT 로 실행. 이외에는 Interpreter 방식으로 실행&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;b&gt;Q. JVM은 무엇인가? (JVM의 역할은?)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자바 바이트 코드를 해석하여 OS에 관계없이 실행해주는 역할&lt;/li&gt;
&lt;li&gt;GC를 통해 사용되지 않는 메모리를 해제시켜주는 메모리 관리 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Q. Java는 왜 JVM을 쓰는가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;OS에 독립적으로 실행가능한 환경을 만들기 위해 JVM을 사용합니다.&lt;/p&gt;
&lt;p&gt;Java는 C언어와 달리 컴파일을 통해 기계어로 변환되는 것이 아니라 바이트코드 형식으로 변환이 됩니다. 바이트코드는 CPU가 즉시 해석하지 못하기 때문에, JVM이 ByteCode를 해석하는 과정을 거쳐야 실행가능한 프로세스로서 동작할 수 있습니다.&lt;/p&gt;
&lt;p&gt;C언어는 전처리기, 컴파일러, 어셈블러, 링커 과정을 거쳐 바이너리 파일로 만들어집니다. 이렇게 만들어진 실행파일을 실행하면 바이너리 파일의 내용들이 RAM에 적재되어 시스템에서 동작하게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q. Interpreter란?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;컴파일러는 Runtime 전에 전체 소스코드를 검사하여 오류 메세지를 생성한 후 문제 없으면 Runtime&lt;/p&gt;
&lt;p&gt;인터프리터는 런타임에 한번에 한문장씩 변환&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://dailyheumsi.tistory.com/196&quot;&gt;[더 자바] JVM 이해하기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://limkydev.tistory.com/51&quot;&gt;[Java] JVM 메모리 구조&lt;/a&gt;&lt;/p&gt;</description>
      <category>Computer Science</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/163</guid>
      <comments>https://hs5555.tistory.com/163#entry163comment</comments>
      <pubDate>Sat, 19 Dec 2020 17:39:46 +0900</pubDate>
    </item>
    <item>
      <title>Android Thread</title>
      <link>https://hs5555.tistory.com/162</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;안드로이드에서 Thread&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본적으로 한 어플리케이션 내의 &lt;span style=&quot;color: #8a3db6;&quot;&gt;모든 컴포넌트들은 같은 프로세스 내에서 동작&lt;/span&gt;해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어플리케이션이 launch되면, 안드로이드 시스템은 해당 어플리케이션이 메인쓰레드를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메신 쓰레드는 UI위젯을 그리는 역할을 수행하기 때문이다. 또한 UI와 상호작용한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, 메인쓰레드는 UI와 상호작용하는 중요할 역할을 하고 있기 때문에 UI 쓰레드라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안드로이드 시스템은 어플리케이션을 구성하는 각 컴포넌트 객체마다 쓰레드를 생성하지 않는다. &lt;span style=&quot;color: #ee2323;&quot;&gt;동일한 프로세스 내에서 실행되는 모든 컴포넌트들은 UI 쓰레드에서 인스턴스화&lt;/span&gt; 되며, 각 컴포넌트들에 대한 호출은 UI 쓰레드에서 실행된다. 결과적으로,&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시스템 콜백에 응답하는 메소드들은 항상 프로세스의 UI 쓰레드에서 실행되는 것&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러나, 만약 모든 일들이 UI 쓰레드에서만 처리되는 경우, 네트워크 접근이나 데이터베이스를 쿼리해오는 긴 작업을 수행하게 되면 모든 UI 가 블록되는 현상이 발생한다. UI 쓰레드가 블록되면, 그리기 이벤트와 같은 모든 이벤트들이 실행되지 않는다. 그렇게 되면 사용자 입장에서는 어플리케이션이 죽은 것처럼 보이고, 심지어 UI 쓰레드가 5초 이상 블록되면 ANR &quot;어플리케이션이 응답하지 않음&quot; 다이얼로그가 표시되게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;안드로이드 어플리케이션은 단일 스레드 모델이다.&lt;/u&gt;&amp;nbsp;따라서, UI 쓰레드가 아닌 다른 쓰레드에서는 UI 를 건드릴 수가 없다. 그래서&amp;nbsp;UI 쓰레드가 블록되지 않도록 하는 것이 중요하다. UI 쓰레드가 블록되면 화면에 UI 가 그려지지 않기 때문이다. 따라서 즉각적이지 않은 수행작업이 있는 경우에는 별도의 다른 스레드에서 작업을 수행해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안드로이드에서 UI 를 업데이트는 main Thread , 즉 UI 쓰레드에서만 진행되어야 한다. UI 를 메인 쓰레드 이외의 다른 쓰레드에서 처리하기 위해서 Handler 라는 개념이 나왔다.&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Handler 는 서브스레드에서 작업한 것들을 메시지 큐에 담아서 UI 쓰레드에 선입선출 방식으로 전달해주는 역할을 수행&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;핸들러&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루퍼&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트들은&amp;nbsp;&lt;b&gt;하나의&amp;nbsp;프로세스&lt;/b&gt;에서 실행됩니다. 앱은 여러 프로세스를 지정하여 여러 컴포넌트들을 각기 다른 프로세스에 지정하여 실행할 수 있지만, 일반적으로 단일 프로세스를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;매니페스트 항목은 이 구성 요소가 실행되는 프로세스를 지정할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;android:process&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;특성을 지원합니다. 이러한 특성을 설정하여 각 구성 요소를 자체 프로세스에서 실행하거나 다른 구성 요소를 제외한 일부 구성 요소만 프로세스를 공유하게 할 수 있습니다. 또한,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;android:process&lt;span&gt;를 설정하여 다른 애플리케이션의 구성 요소를 동일한 프로세스에서 실행할 수도 있습니다. 단, 이는 애플리케이션이 동일한 Linux 사용자 ID를 공유하고 동일한 인증서로 서명되었을 경우에 한합니다.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/components/processes-and-threads?hl=ko#java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;developer.android.com/guide/components/processes-and-threads?hl=ko#java&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1608268569723&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로세스 및 스레드 개요 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;애플리케이션 구성 요소가 시작되고 애플리케이션에 실행 중인 다른 구성 요소가 없으면 Android 시스템은 하나의 실행 스레드로 애플리케이션의 Linux 프로세스를 시작합니다. 기본적으로 같은 &quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/guide/components/processes-and-threads?hl=ko#java&quot; data-og-url=&quot;https://developer.android.com/guide/components/processes-and-threads?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c0hr6L/hyICbX9YMP/uK7rHexTkippE26iecWY40/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/components/processes-and-threads?hl=ko#java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/guide/components/processes-and-threads?hl=ko#java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c0hr6L/hyICbX9YMP/uK7rHexTkippE26iecWY40/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;프로세스 및 스레드 개요 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;애플리케이션 구성 요소가 시작되고 애플리케이션에 실행 중인 다른 구성 요소가 없으면 Android 시스템은 하나의 실행 스레드로 애플리케이션의 Linux 프로세스를 시작합니다. 기본적으로 같은&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Android</category>
      <author>haeseong5</author>
      <guid isPermaLink="true">https://hs5555.tistory.com/162</guid>
      <comments>https://hs5555.tistory.com/162#entry162comment</comments>
      <pubDate>Fri, 18 Dec 2020 14:15:13 +0900</pubDate>
    </item>
  </channel>
</rss>