<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yewon-july.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 18 Mar 2025 03:40:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. yewon-july.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yewon-july" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스] 더 맵게(heap) 파이썬]]></title>
            <link>https://velog.io/@yewon-july/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8D%94-%EB%A7%B5%EA%B2%8Cheap-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@yewon-july/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8D%94-%EB%A7%B5%EA%B2%8Cheap-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Tue, 18 Mar 2025 03:40:37 GMT</pubDate>
            <description><![CDATA[<h3 id="나의-풀이">나의 풀이</h3>
<pre><code class="language-python">import heapq

def solution(scoville, K):
    answer = 0

    #heapq로 변환
    heapq.heapify(scoville)

    #loop 돌기
    while True:
        # 최솟값 pop
        temp_min = heapq.heappop(scoville)

        if temp_min &gt;= K :
            return answer
        elif len(scoville) &lt; 1:
            return -1
        else:
            temp_min2 = heapq.heappop(scoville)
            temp_min = temp_min + (temp_min2 * 2)    

            heapq.heappush(scoville, temp_min)
            answer += 1</code></pre>
<h3 id="heap-자료구조">heap 자료구조</h3>
<p>참고 <a href="https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html">gmlwjd9405 github</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] K번째수(정렬) 문제 풀이(Python)]]></title>
            <link>https://velog.io/@yewon-july/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-K%EB%B2%88%EC%A7%B8%EC%88%98%EC%A0%95%EB%A0%AC-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4Python</link>
            <guid>https://velog.io/@yewon-july/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-K%EB%B2%88%EC%A7%B8%EC%88%98%EC%A0%95%EB%A0%AC-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4Python</guid>
            <pubDate>Mon, 17 Mar 2025 01:26:46 GMT</pubDate>
            <description><![CDATA[<h3 id="나의-답안">나의 답안</h3>
<pre><code class="language-python">def solution(array, commands):
    answer = []

    for i, j, k in commands:
        temp = array[i-1: j]
        temp.sort()
        answer.append(temp[k-1])
    return answer</code></pre>
<h3 id="개선점">개선점</h3>
<p>람다를 활용하면 좋을 것</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 폰켓몬(Hash) 문제 풀이(Python)]]></title>
            <link>https://velog.io/@yewon-july/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8F%B0%EC%BC%93%EB%AA%ACHash-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4Python</link>
            <guid>https://velog.io/@yewon-july/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8F%B0%EC%BC%93%EB%AA%ACHash-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4Python</guid>
            <pubDate>Sun, 16 Mar 2025 07:55:38 GMT</pubDate>
            <description><![CDATA[<p>내가 푼 문제 풀이</p>
<pre><code class="language-python"># programmers hash 1
def solution(nums):
    # answer 초기화
    answer = 0
    # dictionary type(Hash) 선언
    type_dict = dict()

    # nums loop
    for i in nums:
        # 번호 중복 체크
        if i in type_dict :
            type_dict[i] += 1
        else :
            # num_list에 번호 추가하기
            type_dict[i] = 1
            answer += 1

    answer_max = len(nums)/2

    if answer &gt; answer_max :
        return answer_max
    else :
        return answer</code></pre>
<h3 id="문제-풀이-방향개선점">문제 풀이 방향(개선점)</h3>
<ol>
<li>dict 사용 대신 set() 사용
중복되는 번호를 체크하기 위해서 type_dict라는 dict()를 사용했다.
그리고 중복이 될 때마다 value에 1씩 더해주면서 중복되었음을 활용했다.
하지만, 만약 set()함수를 썼다면 이와 같은 연산이 불필요했을 것이다.</li>
</ol>
<ol start="2">
<li>if/else 대신 min()의 사용
type_dict의 key의 개수와 len(nums)/2 중 작은 값을 사용했으면 더 유용했을 것이다.</li>
</ol>
<h3 id="set-함수의-특징">set 함수의 특징</h3>
<ol>
<li>순서가 없다(인덱스로 접근 불가)</li>
<li>중복은 허용되지 않는다.</li>
<li>요소는 변경 불가능한 자료형만 사용할 수 있다.</li>
</ol>
<p>참고자료: <a href="https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95">ctkim.tistory</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[5대 은행 예금 4%대]]></title>
            <link>https://velog.io/@yewon-july/5%EB%8C%80-%EC%9D%80%ED%96%89-%EC%98%88%EA%B8%88-4%EB%8C%80</link>
            <guid>https://velog.io/@yewon-july/5%EB%8C%80-%EC%9D%80%ED%96%89-%EC%98%88%EA%B8%88-4%EB%8C%80</guid>
            <pubDate>Mon, 09 Oct 2023 23:50:32 GMT</pubDate>
            <description><![CDATA[<p>3%대 중후반에 머물던 5대 시중은행의 정기예금 금리가 모두 4%대로 진입
최근 금융권이 예금 금리를 올리는 것은 100조 원에 달하는 고금리 상품의 만기가 돌아오기 때문. 국은행 경제통계시스템에 따르면 작년 10월부터 올 1월 기간 증가한 금융권 수신 잔액은 약 96조2500억원
더불어 지난해말 레고랜드 사태로 은행채를 통한 자금 조달이 어려워지자 은행들은 경쟁적으로 수신 금리를 높여 자금을 확보함. 당시 금융당국이 자금조달 시장 안정을 위해 은행들에 은행채 발행 자제를 요청하면서 은행들은 수신 금리를 높여 자금을 유치함.
이에 금융소비자들은 예·적금 상품 금리가 더 오를 수 있다는 기대감에 관망하는 분위기. 
문제는 은행권의 이같은 수신 경쟁으로 대출금리가 더 오를 수 있다는 점. 주택담보대출 변동금리의 기준이 되는 코픽스(COFIX·자금조달비용지수)는 은행이 취급한 수신 상품 금리의 변동을 반영하기 때문에 당분간은 대출금리 또한 따라 오름세를 이어갈 것으로 전망됨.</p>
<p>참조: <a href="http://news.bizwatch.co.kr/article/finance/2023/10/06/0028">http://news.bizwatch.co.kr/article/finance/2023/10/06/0028</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[보험업계 IFRS17 도입에 따른 영향]]></title>
            <link>https://velog.io/@yewon-july/%EB%B3%B4%ED%97%98%EC%97%85%EA%B3%84-IFRS17-%EB%8F%84%EC%9E%85%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%98%81%ED%96%A5</link>
            <guid>https://velog.io/@yewon-july/%EB%B3%B4%ED%97%98%EC%97%85%EA%B3%84-IFRS17-%EB%8F%84%EC%9E%85%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%98%81%ED%96%A5</guid>
            <pubDate>Thu, 05 Oct 2023 01:05:05 GMT</pubDate>
            <description><![CDATA[<h3 id="1-ifrs17란">1. IFRS17란?</h3>
<p>IFRS17은 보험사가 회계장부 작성시 지켜야 하는 새로운 회계기준</p>
<p>보험사가 가입자에게 돌려줘야 할 보험부채* 를 원가가 아니라 &#39;시가&#39;로 평가해 회계 처리하는 것이 핵심</p>
<ul>
<li>보험부채 :  고객에게 보험금을 돌려주기 위해 보험사가 쌓는 책임준비금</li>
</ul>
<h3 id="2-현행과-ifrs17의-차이점">2. 현행과 IFRS17의 차이점</h3>
<ul>
<li>현행: 보험계약을 맺은 시점을 기준으로 보험부채를 계산하는 <strong>원가평가</strong> 방식.</li>
<li>IFRS17: 결산기마다 실제 위험률과 시장금리를 반영해 보험부채를 계산하는 <strong>시가평가</strong> 방식.</li>
</ul>
<p>IFRS17 기준이 적용되면 이렇게 해마다 보험부채가 달라짐. 이 때문에 보험사가 쌓아야 하는 책임준비금 규모도 그때그때 바뀜. </p>
<p>시장금리↓ → 투자수익률↓  → 보험사에서는 적립금(책임준비금)을 추가로 쌓아야 함. + 적정 기준의 재무건전성을 유지하기 위한 자기자본도 늘려야 함.</p>
<p> 즉, &#39;회계기준 변경 → 자본확충 부담 → 자산운용 포트폴리오 조정 → 예정이율(예상운용수익률) 변경 → 보험료 인상·인하&#39; 고리가 완성</p>
<h3 id="3-생보-손보사에-끼치는-영향">3. 생보, 손보사에 끼치는 영향</h3>
<p>보험업계는 IFRS17 적용을 최대한 미루려고 함. </p>
<p>특히 생보사들은 과거 고금리를 약속하고 팔아둔 저축성 상품이 많아 우려가 컸기 때문. 
기존에 약속한 고금리를 바탕으로 할인율(이자율)까지 반영해야 해서 보험부채가 폭발적으로 늘어날 수 있음.</p>
<h3 id="4-바뀐-회계기준에-따른-세금-부과-방식-법인세">4. 바뀐 회계기준에 따른 세금 부과 방식 (법인세)</h3>
<p>세금은 이익(수익-비용=이익)이 잡히는 만큼 부과됨.
현재 보험사가 내는 법인세는 회사가 가입자에게 거둬들인 수입보험료(수익)에서 보험부채인 책임준비금 등(비용)을 차감해 당기순이익을 구한 다음 세무조정을 거쳐 각 사업연도 소득금액을 산출, 세금을 납부</p>
<p>다만 세법에서는 평가방식이나 평가 가정 변화에 따라 변동될 가능성이 크기 때문에 이렇게 매년 변할 수 있는(시가 평가) 부채를 비용으로 인정하는 경우가 거의 없다는 거죠. 그러니 혼선이 발생</p>
<p>수익 인식 방식도 다름. 지금은 수익을 현재가치에 대한 평가없이 전체 보험계약 기간에 걸쳐 나눠 인식하는데요. IFRS17에서는 미래에 예상되는 수익을 시가로 평가해 전체 보험계약 기간에 걸쳐 인식합니다. 바뀌는 보험사 회계체계와 현재 세무체계가 충돌하는 부분이 있다는 거죠. 기준이 다르니 혼란이 불가피</p>
<p>참고: <a href="http://news.bizwatch.co.kr/article/finance/2023/09/27/0004?_gl=1*1s0j9lr*_gcl_au*NjQ0MjA4NjAxLjE2OTU2MDg1ODU.&amp;_ga=2.122765192.2099888978.1696378211-1631130845.1695608585">http://news.bizwatch.co.kr/article/finance/2023/09/27/0004?_gl=1*1s0j9lr*_gcl_au*NjQ0MjA4NjAxLjE2OTU2MDg1ODU.&amp;_ga=2.122765192.2099888978.1696378211-1631130845.1695608585</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 배열을 이용한 탐색]]></title>
            <link>https://velog.io/@yewon-july/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@yewon-july/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%83%90%EC%83%89</guid>
            <pubDate>Mon, 28 Sep 2020 11:58:16 GMT</pubDate>
            <description><![CDATA[<h3 id="맵-구현-방법">맵 구현 방법</h3>
<ol>
<li><a href="#%EC%A0%95%EB%A0%AC%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EB%B0%B0%EC%97%B4%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">정렬되지 않은 배열을 이용하는 방법</a></li>
<li><a href="#%EC%A0%95%EB%A0%AC%EB%90%9C-%EB%B0%B0%EC%97%B4%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">정렬된 배열을 이용하는 방법</a></li>
<li>이진 탐색 트리를 이용하는 방법</li>
<li>해싱을 이용하는 방법</li>
</ol>
<h3 id="정렬되지-않은-배열을-이용하는-방법">정렬되지 않은 배열을 이용하는 방법</h3>
<ul>
<li><strong>순차탐색(Sequential Search)</strong><ul>
<li>가장 간단하고 직접적인 탐색 방법</li>
<li>배열의 요소들을 처음부터 마지막까지 하나씩 검사하여 원하는 레코드를 찾는 방법</li>
</ul>
</li>
</ul>
<pre><code class="language-cpp">//c++
int sequentialSearch(int list[], int key, int low, int high){
  for(int i=low; i&lt;=high; i++){
    if(list[i]==key)
      return i;
  }
  return -1;
}</code></pre>
<h3 id="정렬된-배열을-이용하는-방법">정렬된 배열을 이용하는 방법</h3>
<ul>
<li><a href="#%EC%88%9C%EC%B0%A8%ED%83%90%EC%83%89">순차탐색</a></li>
<li><a href="#%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89">이진탐색</a></li>
<li><a href="#%EC%83%89%EC%9D%B8-%EC%88%9C%EC%B0%A8-%ED%83%90%EC%83%89">색인 순차 탐색</a></li>
<li><a href="#%EB%B3%B4%EA%B0%84%ED%83%90%EC%83%89">보간 탐색</a></li>
</ul>
<h3 id="순차탐색">순차탐색</h3>
<ul>
<li>정렬되지 않은 배열과는 달리, 배열 전체를 검색하지 않고도 탐색 항목의 존재 유무를 알 수 있음.</li>
</ul>
<pre><code class="language-cpp">//c++
int sortedSequentialSearch(int list[], int key, int low, int high){
  if (key&lt;list[low] || key&gt;list[high])
      return -1;
  for(int i=low; i&lt;=high; i++){
      if(low[i]==key) return i;
      if(list[i]&gt;key) return -1; // 정렬되지 않은 배열과의 차이점
   }
}
</code></pre>
<h3 id="이진탐색binary-search">이진탐색(Binary Search)</h3>
<ul>
<li>배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 부분배열에 있는지 오른쪽 부분배열에 있는지 판단하고 다음 단계의 탐색 범위를 반으로 줄임.</li>
<li>반드시 배열이 정렬되어있어야만 사용 가능</li>
<li>데이터의 삽입이나 삭제가 빈번한 경우에는 적합하지 않음.<ul>
<li>삽입/삭제 시 마다 배열을 정렬해주어야 하기 때문!!</li>
</ul>
</li>
</ul>
<pre><code class="language-cpp">//재귀(순환) 호출을 사용하는 이진 탐색 c++
int binarySearch(int list[], int key, int low, int high){
  if(low &gt; high) return -1;
  int mid = (low + high) / 2;
  if(key == list[mid])
      return mid; // 탐색 성공
  else if(key &lt; list[mid])
      return binarySearch(list, key, low, mid-1); // 왼쪽 부분리스트 탐색
  else
      return binarySerach(list, key, mid+1, high); // 오른쪽 부분리스트탐색
}</code></pre>
<pre><code class="language-cpp">//반복문을 이용한 이진탐색 함수 c++
int binarySearch(int list[], int key, int low, int high){
  int mid;
  while(low&lt;=high){
    mid = (low + high) / 2;
    if(key == list[mid]) return mid;
    else if(key &lt; list[mid]) high = mid-1;
    else low = mid+1;
  }
  return -1;
}</code></pre>
<h3 id="색인-순차-탐색">색인 순차 탐색</h3>
<ul>
<li><strong>색인 순차 탐색(indexed sequential search)</strong> 방법은 <strong>인덱스(index)</strong>라 불리는 테이블을 사용하여 효율을 높이는 방법</li>
<li>인덱스 테이블에서 <code>index[i] &lt;= key &lt; index[i+1]</code>을 만족하는 항목을 찾아서 해당 범위의 항목들에 대해서만 검색</li>
<li>파일 처리, 데이터베이스 등의 응용 분야에서 많이 사용하는 방법</li>
</ul>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#define LIST_SIZE 9
#define INDEX_SIZE 3

using namespace std;

struct Index{
  int key; //키 값
  int index;//키값의 인덱스
}

int indexedSearch(int *list, int list_size, Index *index, int index_size, int key){
  if(key&lt;list[0] || key&gt;list[list_size-1]) return -1;

  for(int i=0; i&lt;index_size-1; i++){
    if (index[i].key &lt;= key &amp;&amp; key &lt; index[i+1].key)
      return sequentialSearch(list, key, index[i].index, index[i+1].index);
  }

  return sequentialSerach(list, key, index{i+1].index, list_size);
}

int main(){
  int list[LIST_SIZE] = {3, 9, 15, 22, 31, 55, 67, 88, 91};
  Index index[INDEX_SIZE] = {{3, 0}, {15, 2}, {67, 6}};//인덱스

  int num;
  cin &gt;&gt; num;

  int res = indexedSearch(list, LIST_SIZE, index, INDEX_SIZE, num);

  if(res &gt;= 0) cout &lt;&lt; &quot;성공!!&quot; &lt;&lt; res &lt;&lt; &quot; 에 있습니다&quot; &lt;&lt; endl;
  else cout &lt;&lt; &quot;실패!!&quot;&lt;&lt; endl;

  return 0;
}</code></pre>
<h3 id="보간탐색">보간탐색</h3>
<ul>
<li><strong>보간탐색(interpolation search)</strong>은 사전이나 전화번호부를 탐색하는 방법과 같이 탐색키가 존재할 위치를 예측하여 탐색하는 방법</li>
<li>사전을 찾을 때 &#39;z&#39;로 시작하는 단어는 사전의 뒷부분에서 찾고, &#39;a&#39;로 시작하는 단어는 앞부분에서 찾는 것고 같은 원리</li>
<li>이진 탐색과 유사하나 리스트를 반으로 분할하지 않고 <strong>불균등하게 분할</strong>하여 탐색</li>
<li><code>탐색위치 = ((key - list[low])/list[high]-list[low]) * (high-low) + low</code></li>
</ul>
<pre><code class="language-cpp">int interpolationSearch(int list[], int list_size, int key){
  int low = 0;
  int high = list_size-1;

  while(list[low]&lt;key  &amp;&amp; key &lt;= list[high]){
    int j = (int)((float)((key-list[low])/(list[high]-list[low]) * (high-low)) + low;

    if(key&gt;list[j]) low = j+1;
    else if(key &lt; list[j]) high = j-1;
    else return j;
  }
  return -1;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 탐색]]></title>
            <link>https://velog.io/@yewon-july/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@yewon-july/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%83%90%EC%83%89</guid>
            <pubDate>Mon, 28 Sep 2020 11:04:49 GMT</pubDate>
            <description><![CDATA[<h3 id="맵map이란">맵(map)이란?</h3>
<ul>
<li><strong>맵(map)</strong> 또는 <strong>사전(dictionary)</strong>은 자료를 저장하고 키를 이용해 원하는 자료를 빠르게 찾을 수 있도록 하는 자료구조</li>
<li><strong>키를 가진 레코드(keyed record)</strong> 또는 <strong>엔트리(entry)</strong>라 불리는 키-값 쌍(key, value)을 테이블에 저장한다<ul>
<li>이때 각 키는 <strong>유일</strong>하고 맵에 저장되는 키와 값은 <strong>어떠한 자료형도 가능하다</strong>.</li>
</ul>
</li>
<li>&quot;값&quot;은 변경할 수 있지만 &quot;키&quot;는 변경할 수 없다.</li>
</ul>
<h3 id="맵에서-필요한-연산들의-추상-형태">맵에서 필요한 연산들의 추상 형태</h3>
<pre><code>- 객체: 유일한 키를 가진 엔트리(키를 가진 레코드)의 집합

- 연산

(1) create(): 공백 상태의 맵을 생성
(2) search(key): 테이블에서 주어진 탐색키 key를 가진 레코드를 찾아 반환
(3) insert(entry): 테이블에서 주어진 entry를 삽입
(4) delete(key): 테이블에서 주어진 탐색키 key를 가진 레코드를 찾아 삭제
(5) count(): 테이블의 모든 레코드 수를 반환</code></pre><h3 id="맵을-구현하는-방법">맵을 구현하는 방법</h3>
<ol>
<li>정렬되지 않은 배열을 사용하는 방법<ul>
<li>시간복잡도: O(n)</li>
</ul>
</li>
<li>정렬된 배열을 사용하는 방법<ul>
<li>시간복잡도: O(log n)</li>
</ul>
</li>
<li>이진 탐색 트리를 이용하는 방법<ul>
<li>시간복잡도: O(log n) </li>
<li>단, 이진 트리의 균형을 잘 맞췄을 경우에 해당</li>
</ul>
</li>
<li>해싱을 사용하는 방법<ul>
<li>시간복잡도: O(1)</li>
<li>저장된 레코드의 수에 관계 없이 일정한 시간 안에 탐색 가능</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅테크 용어 정리]]></title>
            <link>https://velog.io/@yewon-july/%EB%B9%85%ED%85%8C%ED%81%AC-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yewon-july/%EB%B9%85%ED%85%8C%ED%81%AC-%EC%9A%A9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 23 Aug 2020 07:54:11 GMT</pubDate>
            <description><![CDATA[<h3 id="빅테크란">빅테크란?</h3>
<p><strong>BigData + Technology</strong>의 합성어. 
대형 정보기술(IT) 기업을 뜻하는 말이지만 국내 금융 산업에서는 네이버와 카카오 등 <strong>온라인 플랫폼 제공 사업을 하다가 금융 시장에 진출한 업체를 지칭하는 단어</strong>이다. 송금, 결제뿐만 아니라 자산관리, 보험 판매 시장까지 영역을 넓혀나가고 있다.</p>
<p>금융권은 네이버와 카카오의 금융업 진출을 두고 형평성에 있어 불만을 드러냈다. 금융권은 빅테크의 금융 시장 진출에 공정 경쟁이지 못한 특혜라며 비판하고 있다. 금융권은 빅테크에는 유독 규제 문턱이 낮다며 주장하고 있다. 이는 금융 지주사는 계열사 간 정보 공유가 제한적인데에 반해 빅테크는 <strong>계열사에 정보 제공이 쉬우며</strong>, 마이데이터 산업(본인신용정리관리업)에서 금융사와 빅테크 간 <strong>교환 가능한 데이터 범위가 불공평</strong>하다는 점 등 때문이다. 또한 간편결제 사업자에 <strong>후불 결제(최대 30만원 한도) 허용</strong>에 따라 카드사들이 역차별을 받는다는 점도 불만이다. 카드사는 후불 결제가 <strong>여신 기능으로 활용</strong>될 수 있다고 우려하기 때문이다.</p>
<pre><code>* 여신이란?
금융 기관에서 고객에게 돈을 빌려주는 일이다.</code></pre><p>참고: <a href="https://www.etoday.co.kr/news/view/1927298">네이버-금융권 갈등 풀리나…이달 말 빅테크협의체 출범
</a></p>
<h3 id="오픈-뱅킹이란">오픈 뱅킹이란?</h3>
<p>은행이 보유한 결제 기능 및 고객 데이터를 <strong>오픈 API 방식으로 은행 및 핀테크 업체 등에 공개</strong>하는 것이다.</p>
<h3 id="마이-데이터my-data란">마이 데이터(My Data)란?</h3>
<p>소비자가 여러 기관에 산재한 본인의 개인정보를 능동적으로 통합 관리, 활용하는 것으로 개정 신용정보법 상 신용 정보 주체의 <strong>신용 정보를 일정한 방식으로 통합해 본인에게 제공하는 행위를 영업으로 하는 &quot;본인신용정보관리업&quot;</strong>이다.</p>
<h3 id="데이터-이동권이란">데이터 이동권이란?</h3>
<p>개인이 직접 금융기관에 있는 자신의 개인 정보를 제 3의 업체에 전달해 새로운 서비스를 받도록 하는 것이다. 결국 마이데이터 사업은 데이터 이동권을 수단으로 본인의 신용 정보의 통합적 관리를 지원하면서 소비 패턴 분석으로 개인의 신용 및 자산 관리 서비스를 제공받을 수 있게 된다.</p>
<h3 id="마이-페이먼트my-payment란">마이 페이먼트(My Payment)란?</h3>
<p>고객 자금 보유 없이 금융기관에 지급지시(Payment Order)를 하는 사업으로 한 번의 로그인만으로 모든 은행의 자기 계좌에서 결제 및 송금을 처리할 수 있다.</p>
<h3 id="종합결제지급업이란">종합결제지급업이란?</h3>
<p>은해오가 제휴 없이 독립적으로 계좌를 발급 관리하고 이를 통해 결제하고 정산하는 업이다.</p>
<p>참고: <a href="https://www.asiae.co.kr/article/2020061712422548751">[시시비비] 빅테크와 금융회사 간의 경쟁
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TCP/IP]네트워크 접근 계층]]></title>
            <link>https://velog.io/@yewon-july/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A0%91%EA%B7%BC-%EA%B3%84%EC%B8%B5</link>
            <guid>https://velog.io/@yewon-july/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A0%91%EA%B7%BC-%EA%B3%84%EC%B8%B5</guid>
            <pubDate>Sat, 08 Aug 2020 11:20:15 GMT</pubDate>
            <description><![CDATA[<h3 id="네트워크-접근network-access-계층">네트워크 접근(Network Access) 계층</h3>
<ul>
<li>네트워크 계층은 <strong>논리적인 IP 주소를 물리적 MAC 주소로 변환</strong>하고 <strong>에러제어</strong>와 <strong>흐름제어</strong> 같은 기능을 제공한다.</li>
<li>Physical Layer가 이해할 수 있는 헤더를 붙여주는 Layer, Frame 단위, Mac Address를 사용하는 계층이다.</li>
<li>통신기기 사이의 연결 및 데이터 전송 기능을 한다.</li>
<li>에러 제어, 흐름 제어 기능을 한다.</li>
<li>OSI 7계층의 데이터 링크 및 물리 계층에 해당된다.</li>
</ul>
<h3 id="네트워크-접근-계층의-주요-기능">네트워크 접근 계층의 주요 기능</h3>
<ul>
<li>Point-to-Point 간 신뢰성 있는 전송으로 흐름 제어(Flow Control) 기능을 담당한다.</li>
<li>에러 제어(Error Control): Error Detection(에러 검출), Error Correction(에러정정)</li>
<li>MAC(Media Access Control): LAN 카드의 물리적 주소</li>
</ul>
<h3 id="csmacdcarrier-sense-multiple-accesscollision-detection">CSMA/CD(Carrier Sense Multiple Access/Collision Detection)</h3>
<p>유션 LAN(Local Area Network)에서 메시지를 송수신하기 위한 접근 방법이다. CSMA/CD를 사용할 때 Collision이 발생한 경우 <strong>Back off 알고리즘</strong>을 이용하여 재전송한다. 리피터와 허브를 이용하면 Collision이 발생하나, Switch는 Collision을 막을 수 있다. 하지만 Switch는 브로드캐스트를 막을 수 없고, Router가 브로드캐스트를 막을 수 있다.</p>
<h4 id="csmacd-동작-과정충돌이-발생하지-않는-경우">CSMA/CD 동작 과정(충돌이 발생하지 않는 경우)</h4>
<ol>
<li><p>전송을 원하는 호스트는 네트워크에 캐리어를 감지해 전송이 가능한지 검사한다.</p>
<ul>
<li>예) 호스트 A는 호스트 D로 데이터 프레임을 전송 </li>
</ul>
</li>
<li><p>호스트는 전송이 가능할 경우 전송을 시작한다.</p>
</li>
<li><p>호스트 A에서 발생한 프레임은 공유 매체를 통하여 호스트 B, C, D로 Broadcast된다.</p>
</li>
<li><p>호스트 B, C는 목적지 IP주소가 자기가 아니라는 걸 알면 바로 프레임을 폐기한다.</p>
</li>
<li><p>호스트 D는 목적지가 자기라는 것을 알고 호스트 A에게 Unicast로 응답한다.</p>
</li>
<li><p>하지만 Shared Device Hup 네트워크에서는 유니캐스트와 브로드캐스트의 차이가 없다.</p>
</li>
</ol>
<h4 id="csmacd-동작-과정충돌이-발생한-경우">CSMA/CD 동작 과정(충돌이 발생한 경우)</h4>
<ol>
<li><p>전송을 원하는 호스트는 네트워크에 캐리어를 감지해 전송이 가능한지 검사한다.</p>
<ul>
<li>예) 호스트 A는 호스트 D로 데이터 프레임 전송, 호스트 B는 호스트 C로 데이터 프레임 전송</li>
</ul>
</li>
<li><p>호스트 A에서 발생한 프레임과 호스트 B에서 발생한 프레임은 공유 매체에서 Collision을 발생시킨다.</p>
</li>
<li><p>Collsion이 발생되면 Jam Signal을 모든 호스트로 전송하여 Collision 발생에 대하여 알린다.</p>
</li>
<li><p>Jam Signal을 받은 호스트들은 일정한 시간 후에 다시 전송을 시작한다. 최대 15번까지 재전송한다.</p>
</li>
</ol>
<h3 id="csmacacarrier-sense-multiple-accesscollision-avoidance">CSMA/CA(Carrier SEnse Multiple Access/Collision Avoidance)</h3>
<ul>
<li>무선 LAN(Local Area Network)에서 메시지의 송수신을 하기 위한 접근 방법이다.</li>
<li>프레임 전송 이전에 제어 메시지를 이용하여 수신자로부터 간단한 전송을 유발한다.</li>
<li>제어 신호에 대한 응답이 도착하면 프레임을 전송한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TCP/IP]인터넷계층2]]></title>
            <link>https://velog.io/@yewon-july/%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%84%EC%B8%B52</link>
            <guid>https://velog.io/@yewon-july/%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%84%EC%B8%B52</guid>
            <pubDate>Sat, 08 Aug 2020 11:19:39 GMT</pubDate>
            <description><![CDATA[<h3 id="ipinternet-protocol">IP(Internet Protocol)</h3>
<ul>
<li><strong>주소화, 데이터그램 포맷, 패킷 핸들링</strong> 등을 정의해놓은 인터넷 규약</li>
<li>인터넷 프로토콜은 현재 IPv4와 IPv6을 사용한다.</li>
<li>IPv4: <strong>32비트</strong> 의 주소 체계를 가지고 있고, 이러한 주소체계는 <strong>네트워크 ID</strong>와 <strong>호스트 ID</strong>로 구분된다.</li>
<li>IPv4: IP 주소의 부족 문제를 해결하기 위해서 주소 비트 수를 <strong>128비트</strong> 로 늘린 것으로 이것은 모든 디지털 단말기에 IP 주소를 부여하여 인터넷과연계하려고 하는 것이다. 우리는 최근 이러한 서비스를 IoT 서비스라고도 한다.</li>
</ul>
<h3 id="네트워크-계층osi-7인터넷-계층tcpip의-프로토콜-종류">네트워크 계층(OSI 7)/인터넷 계층(TCP/IP)의 프로토콜 종류</h3>
<ul>
<li>라우팅 프로토콜<ul>
<li>경로 선택</li>
<li>RIP, OSPF, BGP 등</li>
</ul>
</li>
<li>IP 프로토콜<ul>
<li>주소화</li>
<li>데이터그램 포맷</li>
<li>패킷 핸들링 규약</li>
</ul>
</li>
<li>ICMP 프로토콜<ul>
<li>에러보고</li>
<li>라우터 시그널링</li>
</ul>
</li>
</ul>
<h3 id="ip-헤더-구조">IP 헤더 구조</h3>
<p>IP 헤더 구조를 보면, IP 프로토콜이 무슨 기능을 가지고 있는지 좀 더 명확하게 알 수 있따. IP Header는 <strong>버전(Version) 정보</strong>를 가지고 있다. 버전 정보는 IPv4 혹은 IPv6을 구분하는 역할을 수행하며, 즉, 버전 정보를 보고 라우터가 IP 헤더 구조를 파악하는 것이다.</p>
<p>또한 <strong>Flag</strong>와 <strong>Fragment Offset</strong>이라는 것이 있는데, 이것은 패킷을 전송할 때 패킷의 크기가 너무 크면 패킷은 분할되고 패킷이 분할될 경우 분할된 패킷을 수신자가 수신 이후에 다시 조립을 해야 하기 때문에 <strong>패킷 분할과 관련된 정보</strong>가 있는 것이다. 네트워크에는 <strong>MTU(Maximum Transmission Unit)</strong>라는 것이 있는데, MTU는 <strong>한 번에 통과할 수 있는 패킷의 최대 크기</strong>를 의미한다. 그래서 MTU 값보다 패킷의 크기가 크면 패킷은 분할되고 그 정보를 Flag와 Offset이 가지고 있게 된다. MTU 값을 확인하고 싶으면 이더넷(Ethernet) 정보를 조회하면 되고 리눅스에서 <strong>ifconfig 명령</strong>을 실행하면 된다.</p>
<p><strong>TTL(Time To Live)</strong>은 IP 패킷이 통과할 수 있는 라우터의 수를 의미하며 라우터를 하나 통과할 때마다 1씩 감소하여 0이 되면 패킷은 자동으로 폐기된다. 이는 <strong>인터넷에서 무한정으로 떠도는 패킷을 없애기 위함</strong>이다.</p>
<p><strong>Protocol</strong>은 IP Header 위의 <strong>상위 프로토콜의 종류</strong>를 의미하며, TCP 혹은 UDP인지를 의미한다.</p>
<p><strong>Header Checksum</strong> 은 <strong>헤더의 무결성을 검사</strong>하기 위한 것이다.</p>
<pre><code>*IP(Internet Protocol) Header 구조
- Version: IPv4 버전
- Header Length: Header 전체의 길이
- Type of Service: 서비스 유형
- Total Length: IP Datagram의 Byte 수
- Identification: Host에서 보낸 Datagram 식별
- Flags &amp; Offset: IP Datagram 단편화 정보
- Time to Live: Datagram이 통과할 수 있는 라우터 수
- Protocol: ICMP, TCP, UDP
- Header Checksum: IP Header Checksum 계산</code></pre><h3 id="ip-주소의-구조">IP 주소의 구조</h3>
<p>IP 주소는 클래스(Class)로 구분되며, <strong>클래스</strong>는 <strong>IP 주소를 분류하는 기준</strong>으로 사용된다. IP 클래스의 구조는 네트워크 ID와 호스트 ID로 분류할 수 있는데 <strong>네트워크 ID</strong>는 <strong>네트워크에 부여될 수 있는 것</strong>이고 <strong>호스트 ID</strong>는 <strong>하나의 네트워크에 부여될 수 있는 호스트 IP 주소의 자릿수</strong>이다. 그러므로 최대 32비트에 호스트 ID의 자리가 크면 하나의 네트워크에서 많은 수의 컴퓨터에 IP주소를 부여해서 사용할 수 있는 것이다.</p>
<p><img src="https://images.velog.io/images/yewon-july/post/361bb223-239f-460f-95f6-dfe0b99ea58b/IP-Class.jpeg" alt=""></p>
<h4 id="클래스의-구조">클래스의 구조</h4>
<table>
<thead>
<tr>
<th>클래스</th>
<th>메시지</th>
</tr>
</thead>
<tbody><tr>
<td>Class A</td>
<td>- 첫 바이트 7Bit가 네트워크 식별자 <br>- 한 네트워크에 <strong>가장 많은 호스트</strong> 를 가짐</td>
</tr>
<tr>
<td>Class B</td>
<td>- 14Bit의 네트워크 식별자<br>- 한 네트워크에 약 2^16대의 호스트 수용</td>
</tr>
<tr>
<td>Class C</td>
<td>- 세 번째 바이트까지 네트워크 식별자<br>- 한 네트워크에 254대까지 수용</td>
</tr>
<tr>
<td>Class D</td>
<td>멀티캐스트 주소로 사용</td>
</tr>
</tbody></table>
<h3 id="서브넷팅subnetting">서브넷팅(Subnetting)</h3>
<ul>
<li>주어진 네트워크 주소는 작게 나뉘어 여러 개의 <strong>서브넷(논리적)</strong>으로 구성된다.</li>
<li>네트워크 식별자 부분을 구분하기 위한 mask를 <strong>서브넷 마스크(Subnet Mask)</strong>라고 한다.</li>
</ul>
<p><img src="https://images.velog.io/images/yewon-july/post/103d40bf-f7d4-4fe9-b720-1f2a8a8f78d9/subnet.png" alt=""></p>
<h3 id="수퍼넷팅supernetting">수퍼넷팅(Supernetting)</h3>
<p>ISP(Internet Service Provider) 사업자가 많은 네트워크 망을 효율적으로 관리하기 위해서 네트워크를 묶어 관리하는 방법이다.</p>
<h3 id="icmp">ICMP</h3>
<ul>
<li>TCP/IP에서 <strong>오류 제어 프로토콜</strong>이다.</li>
<li>호스트 및 라우터는 다른 호스트나 라우터가 현재 도달 가능한지의 여부를 결정한다.</li>
<li>라우터는 특정 목적지 네트워크로 후속 IP 데이터그램을 보냈는데, 사용할 수 있는 더 좋은 경로가 있을 때 근원지 호스트에게 통지한다.</li>
<li>호스트나 라우터는 그들이 처리하기에 너무 빠른 IP 데이터그램이 도착하면 다른 시스템에게 통보한다.</li>
</ul>
<h4 id="icmp의-주요-기능">ICMP의 주요 기능</h4>
<ul>
<li>오류 보고 메시지: IP 패킷 처리 도중 발견된 문제를 보고</li>
<li>질의 메시지: 다른 호스트로부터 특정 정보를 획득하기 위해 사용</li>
</ul>
<h4 id="메시지-구조">메시지 구조</h4>
<ul>
<li>Type: ICMP 메시지 유형 표시</li>
<li>Code: Type과 같이 사용되며 세부적인 유형을 표현</li>
<li>Checksum: IP Datagram Checksum</li>
</ul>
<p><img src="https://images.velog.io/images/yewon-july/post/58f3b383-6a46-4db6-b2dc-50881b94a6ec/icmp.jpg" alt=""></p>
<h4 id="icmp-메시지">ICMP 메시지</h4>
<table>
<thead>
<tr>
<th>Type</th>
<th>Message</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>3</td>
<td>Destination Unreachable</td>
<td>라우터가 목적지를 찾지 못하는 경우 보내는 메시지</td>
</tr>
<tr>
<td>4</td>
<td>Source quench</td>
<td>패킷을 너무 빨리 보내 네트워크에 무리를 주는 호스트를 제지할 때 사용</td>
</tr>
<tr>
<td>5</td>
<td>Redirection</td>
<td>패킷 라우팅 경로를 수정, Smurf 공격에서 사용</td>
</tr>
<tr>
<td>8 or 0</td>
<td>Echo request or reply</td>
<td>Host의 존재를 확인</td>
</tr>
<tr>
<td>11</td>
<td>Time exceeded</td>
<td>패킷을 보냈으나 시간이 경과하여 패킷이 삭제되었을 때 보내는 메시지</td>
</tr>
<tr>
<td>12</td>
<td>Parameter Problem</td>
<td>IP Header field에 잘못된 정보가 있다는 것을 알림</td>
</tr>
<tr>
<td>13 or 14</td>
<td>Timestamp request and reply</td>
<td>Echo와 비슷하나 시간에 대한 정보 추가</td>
</tr>
</tbody></table>
<h3 id="데이터-전송-방식과-멀티캐스트">데이터 전송 방식과 멀티캐스트</h3>
<p>데이터 전송 방식은 송신자와 수신자 간에 어떻게 데이터를 보낼 것인지를 의미한다. 즉, 1대 1로 데이터를 전송하는 것은 <strong>유니캐스트(Unicast)</strong>이고 1대 N으로 모두에게 전송하는 것은 <strong>브로드캐스트(Broadcast)</strong>이다. <strong>멀티캐스트(Multicast)</strong>는 1:N 전송 또는 M:N 전송에서 특정 사용자에게만 데이터를 전송하는 것이다. <strong>애니케스트(Anycast)</strong>는 IPv6에 새롭게 등장한 것으로 그룹에 등록된 노드 중에서 최단 경로 노드 한 개에만 전송하는 기술이며, IPv6부터는 브로드캐스트가 없어졌다.</p>
<h4 id="멀티캐스트와-igmpinternet-group-management-protocol">멀티캐스트와 IGMP(Internet Group Management Protocol)</h4>
<p>멀티캐스트는 그룹에 등록된 사용자에게만 데이터는 전송하는 것이다. <strong>그룹에 등록된 사용자를 관리하는 프로토콜</strong>이 바로 <strong>IGMP</strong>이다.</p>
<h4 id="igmp-메시지-구조">IGMP 메시지 구조</h4>
<ul>
<li>8 byte로 구성된다.</li>
<li>Version: IGMP 프로토콜의 버전 표시, 현재 IGMP Version 2이다.</li>
<li>Type: 메시지 유형, 1=보고, 2=질의 메시지</li>
<li>Group ID: 보고 메시지의 경우 호스트에서 신규 가입하고자 하는 멀티캐스트 서비스의 group id, 계속 받아보기를 원하는 멀티캐스트 서비스의 group id 질의메시지의 경우 0</li>
</ul>
<h3 id="arpaddress-resolution-protocol">ARP(Address Resolution Protocol)</h3>
<p>ARP 프로토콜은 IP 주소를 물리적 하드웨어 주소인 MAC 주소로 변경하는 프로토콜이다. ARP 프로토콜은 ARP 리퀘스트를 보내고 인접에 있는 컴퓨터가 ARP Reply로 응답한 것을 통해서 <strong>ARP Cache Table</strong>을 유지한 후 인접 컴퓨터의 IP 주소와 MAC 주소를 가지고 있게 되는 것이다. </p>
<ul>
<li>인터넷 주소(IP)를 물리적 하드웨어 주소(MAC)로 매핑한다.</li>
<li>IP 주소와 이에 해당하는 물리적 네트워크 주소 정보는 각 IP 호스트의 <strong>ARP 캐시</strong>라 불리는 메모리에 테이블 형태로 저장된 후 다음 패킷 전송 시에 다시 사용된다.</li>
<li>ARP Cache Table은 MAC 주소와 IP 주소를 보유하고 있는 매핑 테이블이다.</li>
</ul>
<h3 id="rarpreverse-address-resolution-protocol">RARP(Reverse Address Resolution Protocol)</h3>
<ul>
<li>물리적인 주소 MAC을 기반으로 논리적인 주소 IP를 알아오는 프로토콜이다.</li>
<li>하나의 호스트를 RARP 서버로 지정한다.</li>
<li>디스크 없는 워크스테이션은 RARP Request 패킷을 전송한다.</li>
<li>RARP 서버는 디스크가 없는 워크스테이션들의 물리적 하드웨어 주소(MAC)를 인터넷 주소로 매핑한다.</li>
<li>RARP 서버는 인터넷 주소를 포함한 RARP Response 패킷으로 응답한다.</li>
<li>RARP 요청 메시지는 브로트케스트로 전송하고, 유니캐스트로 전송(요청 메시지에 송신자의 주소가 포함)한다.</li>
</ul>
<p>RARP는 Diskless Host에서 사용하는 것으로 이것은 운영체제도 없는 일종의 더미 터미널이다. 더미 터미널에서 자신의 물리적 주소인 MAC 주소를 서버에 전송하고 IP 주소를 수신 받아서 기동하는 것이다. 이것은 일반적인 데스크톱 PC에서는 필요하지 않고, 과거 은행에서 더미 터미널을 사용했을 경우 사용했던 방법이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TCP/IP] 인터넷 계층]]></title>
            <link>https://velog.io/@yewon-july/%EC%9D%B8%ED%84%B0%EB%84%B7-%EA%B3%84%EC%B8%B5</link>
            <guid>https://velog.io/@yewon-july/%EC%9D%B8%ED%84%B0%EB%84%B7-%EA%B3%84%EC%B8%B5</guid>
            <pubDate>Sat, 08 Aug 2020 11:17:36 GMT</pubDate>
            <description><![CDATA[<h3 id="인터넷-계층이란">인터넷 계층이란?</h3>
<ul>
<li>TCP/IP의 3번째 계층으로, 송신자의 IP 주소와 수신자의 IP 주소를 읽어서 경로를 결정하거나 전송하는 역할을 수행한다.</li>
</ul>
<h3 id="인터넷-계층-기능">인터넷 계층 기능</h3>
<ul>
<li>경로 설정(Routing): 경로를 설정</li>
<li>Point to Point packet 전달</li>
<li><strong>논리 주소 지정</strong></li>
<li><strong>주소 변환</strong></li>
</ul>
<pre><code>*데이터 그램이란?
기존 패킷(Packet)에 IP Header을 붙이는 것</code></pre><h3 id="라우팅">라우팅</h3>
<ul>
<li>라우팅은 IP 헤더에 있는 목적지 IP 주소를 읽어서 경로를 결정하는 작업이다. 라우팅의 방법에는 사전에 고정한 정적 경로(Static Routing) 방법이 있고, 네트워크의 상태를 파악해서 최적의 경로를 결정하는 동적 경로(Dynamic Routing) 방법이 있다. </li>
</ul>
<h4 id="라우팅-경로-고정-여부에-따른-라우팅-방법-종류">라우팅 경로 고정 여부에 따른 라우팅 방법 종류</h4>
<table>
<thead>
<tr>
<th>라우팅 방법</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>정적 경로</td>
<td>- 관리자가 직접 라우팅 테이블의 경로를 설정, 경로가 고정적이며, 수동 갱신하는 방식<br>- 기법: Floating Static routing 등</td>
</tr>
<tr>
<td>동적 경로</td>
<td>- 네트워크 관리자의 개입없이 네트워크 상황 변화에 따라 인접 라우터 간에 자동으로 경로 정보를 교환하도록 설정<br>- 경로 정보를 교환하여 최적의 경로를 결정 및 상황에 따른 능동 대처가 가능<br>- 기법: Distance Vector routing, Link State routing</td>
</tr>
</tbody></table>
<ul>
<li>라우팅 프로토콜은 경로를 결정하는 알고리즘을 포함한 프로토콜이다. 라우팅 프로토콜은 한 도메인 내에서 경로를 결정하는 IGP(Internal Gateway routing Protocol)와 도메인 간에 경로를 결정하는 EGP(Exterior Gateway routing Protocol)로 분류ehlsek.</li>
</ul>
<h4 id="라우팅-범위에-따른-라우팅-프로토콜-종류">라우팅 범위에 따른 라우팅 프로토콜 종류</h4>
<table>
<thead>
<tr>
<th>라우팅 프로토콜</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>IGP</td>
<td>동일 그룹(기업 또는 ISP) 내에서 라우팅 정보를 교환</td>
</tr>
<tr>
<td>EGP</td>
<td>다른 그룹과 라우팅 정보를 교환</td>
</tr>
</tbody></table>
<ul>
<li>라우팅 프로토콜 중에서 <strong>Distance Vector</strong>는 경로를 결정할 때 통과해야 하는 <strong>라우터의 수</strong>가 적은 쪽으로 경로를 결정하는 방법이다. 일명 홉 카운트(Hop Count) 또는 TTL(Time To Live)이라고 한다. 이는 도로에서 교차로가 적은 경우 빠르게 도착하는 이유와 같은 것이다. Distance Vector에는 RIP, IGRP, EIGRP, BGP 프로토콜이 존재한다.</li>
<li>라우팅 프로토콜 중 <strong>Link State</strong>는 넽워크 대역폭, 지연정보 등을 종합적으로 고려해 <strong>Cost를 산정</strong>하고 해당 Link의 Cost에 따라 경로를 결정하는 방법으로 대표적으로 OSPF가 있다. 이러한 기법은 주기적으로 지연과 같은 정보를 라우터 간에 공유해야 하고 이것은 라우터 브로드캐스트를 통해서 공유한다. OSPF는 라우터들을 <strong>트리 형태의 자료구조처럼 연결</strong>하고 라우터 간에 정보를 공유한다. OSPF는 <strong>대규모 네트워크</strong> 에서 사용되는 라우팅 프로토콜이고 구조가 복잡한 특성이 있다.</li>
</ul>
<h4 id="distance-vector-방식과-link-state-방식-차이점">Distance Vector 방식과 Link State 방식 차이점</h4>
<table>
<thead>
<tr>
<th>구분</th>
<th>Distance Vector</th>
<th>Link State</th>
</tr>
</thead>
<tbody><tr>
<td>알고리즘</td>
<td>최단 경로를 구하는 벨만 포드(Bellman-Ford) 알고리즘 기반</td>
<td>최소 신장 트리를 구하는 다익스트라(Dijkstra) 알고리즘 기반</td>
</tr>
<tr>
<td>동작 원리</td>
<td>네트워크 변화 발생 시 해당 정보를 인접한 라우터에 정기적으로 전달하고, 인접 라우터에서는 라우팅 테이블에 정보 갱신</td>
<td>- 라우터와 라우터를 연결하는 Link 상태에 따라 최적의 경로 설정<br>- 라우터가 네트워크 변화 감지 시 링크 상태 변경 정보를 인접한 라우터에게 즉각 전달하고 이를 저장함.</td>
</tr>
<tr>
<td>라우팅 정보</td>
<td>모든 라우터까지의 거리 정보 보관</td>
<td>인접 라우터까지의 Link Cost 계산</td>
</tr>
<tr>
<td>정보전송 시점</td>
<td>일정주기(30초, 이웃 라우터와 공유)</td>
<td>변화 발생 시에만</td>
</tr>
<tr>
<td>대표 프로토콜</td>
<td>RIP, IGRP, EIGRP(내부 라우팅), BGP</td>
<td>- OSPF(가장 많이 사용됨)<br>- IS-IS(소규모 N/W에서 사용)</td>
</tr>
<tr>
<td>단점</td>
<td>- 변화되는 라우팅 정보를 모든 라우터에 주기적으로 갱신하므로 망 자체의 트래픽을 유발<br>- 라우팅 정보를 변경하는 문제 발생 시 Routing Loop가 발생할 가능성이 있음</td>
<td>- 네트워크 전체 정보 유지를 위한 많은 메모리 소요<br>- 라우터의 CPU 사용량이 많아짐<br>- 라우터간 회선의 대역차이로 동기화 실패할 가능성 있음.</td>
</tr>
</tbody></table>
<h3 id="riprouting-information-protocol">RIP(Routing Information Protocol)</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>개념</td>
<td><strong>RFC 1058</strong>에 정의되어 있고 대표적인 <strong>거리 벡터(Distance Vector)</strong> 라우팅 프로토콜</td>
</tr>
<tr>
<td>동작 원리</td>
<td>- 라우터 간 거리 계산을 위한 척도로 홉수(Hop Count) 사용<br>- 16 Hop 이상이면 패킷을 폐기<br>- 180초 이내에 새로운 라우팅 정보가 수신되지 않으면 해당 경로를 이상 상태로 간주<br>- 수신된 목적지의 거리 값과 현재 거리 값을 비교하여 작은 것을 기준으로 라우팅 테이블을 변경</td>
</tr>
<tr>
<td>라우팅 정보</td>
<td>라우팅 정보 변경 시에 모든 망에 적용하므로 <strong>큰 규모의 망에는 적합하지 않음</strong></td>
</tr>
</tbody></table>
<h3 id="ospfopen-shortest-path-first">OSPF(Open Shortest Path First)</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>개념 및 특징</td>
<td>- <strong>RFC 1247</strong> 에 정의되어 있는 IP 라우팅 프로토콜<br>- <strong>대규모 IP망</strong>에서 사용되며 <strong>링크 상태(Link State)</strong> 라우팅 프로토콜<br>- 링크에서의 전송 시간을 링크 비용으로 사용하여 각 목적지별 최단경로를 구함<br>- 네트워크에 변화가 발생했을 때 상대적으로 짧고 간단한 링크 상태 정보를 교환</td>
</tr>
<tr>
<td>동작 원리</td>
<td>- Link의 delay, throughput, reliability를 이용하여 기본적인 throughput만 이용하고, Hop 수에 대한 제약이 없음.<br>- 네트워크를 Area로 구분하여 많은 라우팅 정보의 교환으로 인한 라우터의 성능저하를 예방함. 대역폭을 절약함<br>- Link 변화 감지 시 해당 Link에 대한 정보만을 즉시 모든 라우터에 전달하여 Convergence가 매우 빠름.<br>- Supernetting된 형태로 라우팅 정보를 전달할 수 있어 라우터 메모리 절약, 성능 향상 및 대역폭 절약 가능</td>
</tr>
<tr>
<td>라우터 종류</td>
<td>- ABR(Area Border Router, 영역 경계 라우터): Area에 백본망을 연결해주는 라우터<br>- ASBR(Autonomous System Boundary Router, 자율 시스템 경계 라우터): 다른 AS(Autonomous System)에 속한 라우터와 경로 정보 교환<br>- IR(Internal Router, 내부 라우터): Area에 접속한 라우터<br>- BR(Backbone Router, 백본 라우터): 백본망에 접속한 모든 라우터</td>
</tr>
</tbody></table>
<h3 id="bgpborder-gateway-protocol">BGP(Border Gateway Protocol)</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>개념</td>
<td>AS 상호 간의 라우팅에 적용되는 라우팅 프로토콜로 ISP(Internet Service Provider) 사업자들 상호 간에 주로 사용되는 라우팅 프로토콜</td>
</tr>
<tr>
<td>특징</td>
<td>- EGP라고 하는 Inter-domain 라우팅 프로토콜<br>- 인터넷을 AS 상호간 연결 경로로 이뤄진 방향성 그래프의 집단으로 인식: <strong>경로 벡터 라우팅(Distance Vector Routing)</strong> 방법을 적용하며, 경로 벡터 라우팅 테이블을 유지<br>- Looping free Routing<br>- TCP 기반 라우팅: BGP 라우팅 정보는 라우터 간에 <strong>179</strong> 번 포트를 통하여 TCP에 의해 신뢰성 있게 전달<br></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논리회로]불 대수]]></title>
            <link>https://velog.io/@yewon-july/%EB%85%BC%EB%A6%AC%ED%9A%8C%EB%A1%9C%EB%B6%88-%EB%8C%80%EC%88%98</link>
            <guid>https://velog.io/@yewon-july/%EB%85%BC%EB%A6%AC%ED%9A%8C%EB%A1%9C%EB%B6%88-%EB%8C%80%EC%88%98</guid>
            <pubDate>Wed, 05 Aug 2020 04:38:51 GMT</pubDate>
            <description><![CDATA[<h3 id="불-대수">불 대수</h3>
<ul>
<li>하나의 명제가 참 또는 거짓인가를 판단하는 데 이용되는 수학적인 방법</li>
<li>영국의 수학자 불(G. Boole)에 의해 개발되었다.</li>
<li>논리회로를 간략화하여 표현할 때 불 대수가 사용된다.</li>
</ul>
<h3 id="기본적인-논리-함수">기본적인 논리 함수</h3>
<ul>
<li>AND: 입력 정보의 값이 <strong>모두 1</strong>일 때만 결과가 1이 된다.</li>
</ul>
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
<th>A AND B</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
</tbody></table>
<ul>
<li>OR: 입력 정보의 값 중 <strong>하나 이상이 1</strong>일 때 결과가 1이 된다.</li>
</ul>
<p>A|B|A OR B|
|-|-|-
0|0|0
1|0|1
0|1|1
1|1|1</p>
<ul>
<li>NOT: 입력되는 정보의 반댓값이 출력된다.</li>
</ul>
<table>
<thead>
<tr>
<th>A</th>
<th>NOT A</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
</tr>
</tbody></table>
<h3 id="불-대수의-기본-공식">불 대수의 기본 공식</h3>
<ul>
<li>교환 법칙: A+B = B+A, AxB=BxA</li>
<li>결합 법칙: A + (B+C) = (A+B) + C, Ax(BxC) = (AxB)xC</li>
<li>분배 법칙: Ax(B+C) = AxB + AxC, A+BxC = (A+B)x(A+C)</li>
<li>멱등 법칙: A + A = A, AxA = A</li>
<li>보수 법칙: A+A&#39; = 1, AxA&#39; = 0</li>
<li>항등 법칙: A+0 = A, A+1 = 1, Ax0 = 0, Ax1 = A</li>
<li>콘센서스: AB + BC + CA&#39; = AB + CA&#39;, (A+B)(B+C)(C+A&#39;) = (A+B)(C+A&#39;)</li>
<li>드모르강: (A+B)&#39; = A&#39;xB&#39;, (AxB)&#39; = A&#39;+B&#39;</li>
<li>복원 법칙: (A&#39;)&#39; = A</li>
</ul>
<h3 id="논리식의-간소화">논리식의 간소화</h3>
<h4 id="불-대수의-기본-공식-이용하기">불 대수의 기본 공식 이용하기</h4>
<ol>
<li>합의 곱 표현을 곱의 합 표현으로 변환한다.</li>
<li>공통 인수를 뽑아 묶는다.</li>
<li>멱등법칙, 보수법칙, 항등법칙 등의 기본 공식 형태로 유도하여 줄여나간다.</li>
</ol>
<h4 id="카르노-맵-이용하기">카르노 맵 이용하기</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[OS]병행 프로세스]]></title>
            <link>https://velog.io/@yewon-july/OS-%EB%B3%91%ED%96%89-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</link>
            <guid>https://velog.io/@yewon-july/OS-%EB%B3%91%ED%96%89-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</guid>
            <pubDate>Mon, 20 Jul 2020 02:33:28 GMT</pubDate>
            <description><![CDATA[<h3 id="병행-프로세스란">병행 프로세스란?</h3>
<ul>
<li><strong>하나의 프로세서</strong>는 한 번에 <strong>하나의 프로세스</strong>만 실행할 수 있다.</li>
<li>그러나, 운영체제가 <strong>프로세서를 빠르게 전환</strong>하여, 마치 프로세스를 동시에 여러 개 실행하는 것처럼 보이게 하는 것을 <strong>병행 프로세스</strong>라고 한다.</li>
</ul>
<h3 id="병행-프로세스를-구현하기-위해-고려해야-할-사항">병행 프로세스를 구현하기 위해 고려해야 할 사항</h3>
<ul>
<li>공유 자원은 <strong>상호 배타적</strong>으로 사용해야 한다.</li>
<li>병행 프로세스 간에는 <strong>동기화</strong>가 되어야 한다. (순서가 정해져있어야 한다).</li>
<li>두 프로세스 사이에서는 <strong>데이터 교환</strong>이 가능하도록 <strong>통신</strong>이 되어야 한다.</li>
<li>항상 일정한 실행 결과를 보장하도록 <strong>결정성(determinacy)</strong>을 확보해야한다.</li>
<li><strong>교착 상태</strong>를 해결해야 한다.</li>
<li><strong>상호 배제</strong>를 보장해야 한다.</li>
</ul>
<h3 id="임계-영역이란">임계 영역이란?</h3>
<ul>
<li><strong>임계 자원</strong>: 공유 자원으로 둘 이상의 프로세스들이 <strong>동시에 공유할 수 없다</strong>.</li>
<li><strong>임계 영역</strong>: 프로그램에서 임계 자원을 이용하는 부분 또는 상태</li>
<li>프로세스가 공유 자원을 사용하고 있을 때, 이 프로세스는 <strong>임계 영역</strong> 내에 있다.</li>
<li>임계 영역 내에서는 반드시 <strong>빠른 속도로 수행</strong>되어야 한다.</li>
<li>프로세스는 임계 영역 내에서 <strong>보류(block)되어서는 안 되며</strong>, <strong>무한 루프에 빠지지 않아야 한다.</strong></li>
<li><strong>상호 배제</strong>: 한 프로세스가 임계 영역 내에 있을 때 다른 프로세스의 임계 영역 진입을 허용하지 않는다.</li>
<li><strong>세마포어(Semaphore)</strong>: 열쇠 의미의 변수로, <strong>상호 배제</strong> 또는 <strong>동기화</strong> 도구로 사용된다.</li>
</ul>
<h3 id="세마포어semaphore란">세마포어(Semaphore)란?</h3>
<ul>
<li>다익스트라(Dijkstra)에 의해 제안되어, 상호 배제를 해결하기 위한 도구이다.</li>
<li>플래그로 사용된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] Event Loop]]></title>
            <link>https://velog.io/@yewon-july/JavaScript-Event-Loop</link>
            <guid>https://velog.io/@yewon-july/JavaScript-Event-Loop</guid>
            <pubDate>Tue, 09 Jun 2020 05:25:33 GMT</pubDate>
            <description><![CDATA[<h3 id="rendering-engine-vs-javascript-engine">Rendering Engine vs Javascript Engine</h3>
<h4 id="rendering-engine">Rendering Engine</h4>
<ul>
<li>HTML, CSS로 작성된 마크업 코드들을 콘텐츠로서 웹 페이지에 렌더링 하는 역할<h4 id="javascript-engine">Javascript Engine</h4>
</li>
<li>Javascript로 작성한 코드를 해석하고 실행하는 <strong>인터프리터</strong></li>
</ul>
<h3 id="javascript-engine-1">Javascript Engine</h3>
<ul>
<li>Call Stack</li>
<li>Task Queue(Event Queue)</li>
<li>Heap<h4 id="call-stack">Call Stack</h4>
</li>
<li>자바스크립트는 <strong>단 하나의 호출 스택</strong>을 사용함.</li>
<li>하나의 함수가 실행되면, 이 함수가 끝날 때 까지는 다른 어떤 함수도 실행될 수 없음.</li>
<li>요청이 들어올 때마다 해당 요청을 순차적으로 호출 스택에 담아 처리한다.</li>
</ul>
<h4 id="task-queueevent-queue">Task Queue(Event Queue)</h4>
<ul>
<li>자바스크립트 <strong>런타임 환경</strong>에서 처리해야하는 Task들을 <strong>임시 저장한는 대기 큐</strong>이다.</li>
<li>Call Stack이 비었을 때, 먼저 들어온 순서대로 수행하게 된다.</li>
<li>자바스크립트에서 <strong>비동기로 호출되는 함수</strong>들은 Task Queue에 오게 된다.</li>
<li><strong>이벤트에 의해 실행되는 함수(핸들러), 자바스크립트 엔진이 아닌 Web API영역에 따로 정의되어있는 함수</strong>들이 비동기로 실행된다.</li>
</ul>
<h4 id="heap">Heap</h4>
<ul>
<li>동적으로 생성된 객체(인스턴스)는 힙에 할당된다.</li>
<li>대부분 구조화되지 않은 &#39;더미&#39;같은 메모리 영역을 heap이라 부른다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript] 실행 컨텍스트]]></title>
            <link>https://velog.io/@yewon-july/Javascript-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@yewon-july/Javascript-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 09 Jun 2020 05:13:41 GMT</pubDate>
            <description><![CDATA[<h3 id="실행-컨텍스트란">실행 컨텍스트란?</h3>
<ul>
<li>실행 가능한 코드를 <strong>형상화</strong>하고 <strong>구분</strong>하는 <strong>추상적</strong>인 개념</li>
<li><strong>실행 가능한 코드가 실행되기 위해 필요한 환경</strong>. 일반적으로 실행 가능한 코드는 전역 코드와 함수 내 코드이다.<h3 id="실행-컨텍스트execution-context-종류">실행 컨텍스트(Execution Context) 종류</h3>
<ul>
<li>전역 실행 컨텍스트: 전역 영역에 존재하는 코드. 특정 함수 안에서 실행되는 코드가 아니라면 코드는 전역 컨텍스트에서 실행한다. 전역 실행 컨텍스트에서는 1) Window 오브젝트인 전역 컨텍스트를 생성하고 2) this를 global Object로 할당한다. </li>
<li>Eval 실행 컨텍스트: Eval 함수로 실행되는 코드 <code>eval(&#39;2+2&#39;);</code></li>
<li>함수 실행 컨텍스트: 함수가 호출될 때마다, 해당 함수에 대한 실행 컨텍스트가 생성된다. 각각의 함수들은 자신만의 실행 컨텍스트를 가지지만, <strong>함수가 호출</strong>되어야만 만들어진다.<h3 id="자바스크립트-관련-정보">자바스크립트 관련 정보</h3>
</li>
</ul>
</li>
<li>자바스크립트 엔진은 코드를 실행하기 위하여 여러가지 정보를 알고있어야 한다. 실행에 필요한 여러가지 정보란 아래와 같은 것들이 있다.<ul>
<li>변수: 전역 변수, 지역 변수, 매개 변수, 객체의 프로퍼티</li>
<li>함수 선언</li>
<li>변수의 유효범위(Scope)</li>
<li>this</li>
</ul>
</li>
<li>이와 같이 실행에 필요한 정보를 형상화하고 구분하기 위해, 자바스크립트 엔진은 실행 컨텍스트를 물리적 객체의 형태로 관리한다.</li>
</ul>
<h3 id="execution-context-단계">Execution Context 단계</h3>
<ul>
<li>Creation Phase</li>
<li>Execution Phase</li>
</ul>
<h3 id="creation-phase">Creation Phase</h3>
<h4 id="lexical-environment-컴포넌트-생성">Lexical Environment 컴포넌트 생성</h4>
<ul>
<li>identifier-variable mapping이 되는 곳이다.</li>
<li>즉, 변수와 해당 변수에 대입한 값이 매핑되는 곳이다.</li>
<li>함수 선언과 변수(let과 const)의 바인딩을 저장한다.</li>
<li>this를 결정한다.<h4 id="variable-environment-컴포넌트-생성">Variable Environment 컴포넌트 생성</h4>
</li>
<li>변수 var만 저장한다.</li>
</ul>
<h3 id="execution-phase">Execution Phase</h3>
<ul>
<li>선언했던 변수들에 값이 할당이 된다.</li>
</ul>
<h3 id="note">Note</h3>
<ul>
<li>let과 const는 실행 컨텍스트(creation phase)가 만들어 질 때 어떤 값도 가지고 있지 않으나, var은 undefined를 가지고 있다.</li>
<li>실행 컨텍스트가 만들어지는 동안, 코드는 변수와 함수 선언을 위해 스캔되기 된다. 이 때, 함수의 선언은 environment에 함수 전체가 다 저장되지만, 변수들은 기본 값으로 undefined나 아직 초기화되지 않은 상태로 저장된다.</li>
<li>이 때문에 var 변수가 선언되기 전에, undefined라는 값으로 접근할 수 있는 것이고, let이나 const는 reference error을 얻게 된다.</li>
<li>이 것을 우리는 호이스팅이라고 부른다.</li>
<li>execution phase 동안 자바 스크립트 엔진이 소스 코드에서 let 변수의 값이 선언된 곳을 찾지 못하면 undefined를 할당한다.</li>
</ul>
<p><a href="https://poiemaweb.com/js-execution-context">https://poiemaweb.com/js-execution-context</a>
<a href="https://velog.io/@imacoolgirlyo/JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Hoisting-The-Execution-Context-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-6bjsmmlmgy">https://velog.io/@imacoolgirlyo/JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Hoisting-The-Execution-Context-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-6bjsmmlmgy</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C언어]포인터의 장점]]></title>
            <link>https://velog.io/@yewon-july/%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%9D%98-%EC%9E%A5%EC%A0%90</link>
            <guid>https://velog.io/@yewon-july/%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%9D%98-%EC%9E%A5%EC%A0%90</guid>
            <pubDate>Mon, 08 Jun 2020 16:25:57 GMT</pubDate>
            <description><![CDATA[<h3 id="포인터를-사용하는-이유">포인터를 사용하는 이유</h3>
<ul>
<li>간결하고 효율적인 처리가 가능</li>
<li>더 빠른 기계어 코드 생성</li>
<li>배열, 구조체 등에 쉬운 접근</li>
<li>포인터에 대한 호출(Call by reference) 가능</li>
<li>동적 자료 객체 취급</li>
</ul>
<h3 id="포인터의-장점">포인터의 장점</h3>
<ul>
<li>메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작이 용이하다</li>
<li>Call by Reference에 의한 <strong>전역변수 사용 억제</strong></li>
<li>배열과 같은 연속 데이터에 접근과 조작이 용이</li>
<li>메모리에 직접 접근 가능</li>
</ul>
<h3 id="포인터의-단점">포인터의 단점</h3>
<ul>
<li>오류를 범하기 쉽다</li>
<li>프로그램의 이해와 버그 찾기가 어렵다</li>
<li>메모리 절대 번지 접근 시 시스템 오류 초래</li>
<li>선언만 하고 초기화를 하지 않을 경우 쓰레기 주소를 가리키고 있기 때문에 사용에 주의해야함.</li>
</ul>
<p><a href="https://qqwwee.tistory.com/entry/%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%99%80-%EA%B7%B8-%EC%9E%A5%EC%A0%90">https://qqwwee.tistory.com/entry/%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%99%80-%EA%B7%B8-%EC%9E%A5%EC%A0%90</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Front]브라우저의 동작 원리]]></title>
            <link>https://velog.io/@yewon-july/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@yewon-july/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Mon, 08 Jun 2020 14:50:29 GMT</pubDate>
            <description><![CDATA[<ol>
<li>HTML 문서를 파싱하고 DOM 트리를 구축한다.<ul>
<li>이는 무엇을 그릴지 결정하는 단계이다.</li>
</ul>
</li>
<li>CSS파일과 함께 포함된 스타일 요소를 파싱한다.</li>
<li>DOM과 파싱된 스타일 요소를 결합하여 <strong>렌더링 트리</strong>를 형성한다.</li>
<li>렌더링 트리에서 레이아웃을 실행하여 각 노드의 기하학적 형태를 계산한다.</li>
<li>개별 노드를 화면에 페인트한다. </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] RESTful API]]></title>
            <link>https://velog.io/@yewon-july/RESTful-API</link>
            <guid>https://velog.io/@yewon-july/RESTful-API</guid>
            <pubDate>Mon, 08 Jun 2020 14:37:37 GMT</pubDate>
            <description><![CDATA[<h3 id="rest-구성">REST 구성</h3>
<ul>
<li><strong>자원(Resource)</strong>: URI</li>
<li><strong>행위(Verb)</strong>: HTTP METHOD</li>
<li><strong>표현(Representations)</strong></li>
</ul>
<h3 id="6가지-원칙">6가지 원칙</h3>
<h4 id="uniform-interface">Uniform Interface</h4>
<ul>
<li>URI로 지정한 리소스에 대한 조작을 <strong>한정적인 인터페이스로 수행</strong>하는 것을 의미합니다.<h4 id="stateless">Stateless</h4>
</li>
<li>REST는 무상태성을 갖습니다. 즉, 상태에 대한 정보를 따로 저장하고 관리하지 않는다는 말입니다.</li>
<li>세션이나 쿠키 정보를 별도로 저장하지 않고, API서버는 들어오는 요청만 단순히 처리하면 됩니다.</li>
<li>이는 구현을 단순하게 만들어줍니다.<h4 id="caching">Caching</h4>
</li>
<li>이는 REST의 가장 큰 특징 중 하나입니다.</li>
<li>HTTP라는 기존 웹표준을 그대로 사용하기때문에, 웹에서 사용하는 기존 인프라를 그대로 활용할 수 있습니다.</li>
<li>따라서 HTTP의 캐싱 기능을 사용할 수 있습니다.</li>
<li>E-Tag나 Last-Modified 태그를 이용하면 캐싱 구현이 가능해집니다.<h4 id="client-server">Client-Server</h4>
</li>
<li>REST 서버는 API 제공, 클라이언트는 사용자 인증이나 세션, 로그인 정보 등을 직접 관리하는 구조로 역할이 확실히 구분됩니다.</li>
<li>서버에서 개발할 내용과 클라이언트에서 개발해야 할 내용의 구분이 확실해지면서, 서로의 의존성이 줄어들게 됩니다.<h4 id="hierarchical-system">Hierarchical System</h4>
</li>
<li>REST는 레이어 계층의 시스템입니다.</li>
<li>각 컴포넌트들은 자신과 상호작용하는 계층에 대한 지식이 없다는 것입니다.</li>
<li>이는 코드들이 독립적이며, 대체가능하거나 확장 가능하다는 것으로 이어질 수 있습니다.<h4 id="code-on-demand">Code on demand</h4>
</li>
<li>코드는 클라이언트가 그 기능을 확장할 수 있도록 다운로드 가능하여야한다는 말입니다. 하지만 이는 선택적인 요소입니다.</li>
</ul>
<h3 id="restful하게-api를-디자인한다는-것은">RESTful하게 API를 디자인한다는 것은?</h3>
<ul>
<li><strong>리소스</strong>와 <strong>행위</strong>를 명시적이고 직관적이게 분리해야 합니다.<ul>
<li>리소스는 URI로 표현되는데, 리소스가 가리키는 것은 <strong>명사</strong>로 표현되어야 합니다.</li>
<li>즉, URI는 <strong>정보의 자원을 표현</strong>해야 합니다.</li>
<li>행위는 HTTP METHOD로 표현되며, GET, POST, PUT, PATCH, DELETE가 있습니다.</li>
<li>즉, <strong>자원에 대한 행위는 HTTP METHOD로 표현</strong>합니다.</li>
</ul>
</li>
<li>Message는 Header와 Body를 명확히 분리해서 사용해야 합니다.<ul>
<li>Entity에 대한 내용은 Body에 담습니다.</li>
<li>애플리케이션 서버의 행동의 판단 근거가 되는 컨트롤 정보인 API 정보, 응답받고자 하는 MIME 타입 등은 header에 담습니다.</li>
<li>헤더와 바디는 http header와 http body로 나눌 수도 있으며, http body에 들어가는 json 구조로 분리할 수도 있습니다.</li>
</ul>
</li>
<li>API 버전을 관리합니다.<ul>
<li>특정 API를 변경할 때에는 반드시 하위호환성을 보장해야 합니다.</li>
</ul>
</li>
<li>서버와 클라이언트가 같은 방식을 사용해서 요청하도록 합니다.<ul>
<li>브라우저는 form-data 형식의 submit, 서버에서는 json 식으로의 분리보다는 하나로 통일하도록 합니다.</li>
<li>즉, URI가 플랫폼 중립적이어야 한다는 말입니다.</li>
</ul>
</li>
</ul>
<h3 id="restful-api의-장점은">RESTful API의 장점은?</h3>
<ul>
<li>OPEN API를 제공하기 쉽다.</li>
<li>멀티플랫폼 지원 및 연동이 용이하다.</li>
<li>원하는 타입으로 데이터를 주고받을 수 있다.</li>
<li>기존 웹 인프라(HTTP)를 그대로 사용할 수 있다.</li>
</ul>
<h3 id="단점은">단점은?</h3>
<ul>
<li>사용할 수 있는 메소드가 4가지 밖에 없다.</li>
<li>분산환경에는 부적합하다.</li>
<li>HTTP 통신 모델에 대해서만 지원한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[객체지향] 객체지향적 설계 원칙 5가지]]></title>
            <link>https://velog.io/@yewon-july/%EC%9B%90%EC%B9%99-5%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@yewon-july/%EC%9B%90%EC%B9%99-5%EA%B0%80%EC%A7%80</guid>
            <pubDate>Mon, 08 Jun 2020 14:06:20 GMT</pubDate>
            <description><![CDATA[<h3 id="객체-지향적-설계-원칙">객체 지향적 설계 원칙</h3>
<h4 id="srpsingle-responsibility-principle-단일-책임의-원칙">SRP(Single Responsibility Principle): 단일 책임의 원칙</h4>
<ul>
<li>클래스는 단 하나의 책임을 가져야 하며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어있어야 합니다. 또한 클래스를 변경하는 이유는 단 하나의 이유여야 합니다.</li>
<li>이는 한 클래스의 변화가 다른 클래스로의 변화로 이어지는 것으로 부터 해방시켜 줍니다.</li>
<li>응집성을 높여주 모듈간의 종속성은 낮추어줍니다.</li>
<li>나아가, 책임을 적절히 분배함으로써 코드의 가독성 향상, 유지보수의 용이라는 이점까지 누릴 수 있게 됩니다.</li>
</ul>
<h4 id="ocpopen-closed-principle-개방-폐쇄의-원칙">OCP(Open-Closed Principle): 개방 폐쇄의 원칙</h4>
<ul>
<li>확장에는 열려있어야 하나, 변경에는 닫혀있어야 합니다.</li>
<li>이는 요구사항의 변경이나 추가사항이 있더라도, 기존 구성 요소의 변경은 없도록 하면서도, 기존 구성요소를 확장해서 <strong>재사용</strong> 가능한 코드를 만드는 기반을 갖추게 해줍니다.</li>
<li>개방-폐쇄의 원칙을 가능토록 하는 중요 매커니즘은 <strong>추상화</strong>와 <strong>다형성</strong>입니다.</li>
</ul>
<h4 id="lspliskov-substitution-principle-리스코프-치환-원칙">LSP(Liskov Substitution Principle): 리스코프 치환 원칙</h4>
<ul>
<li>일반화 관계에 대한 이야기이며, 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위를 수행할 수 있어야 합니다.</li>
<li>즉, LSP를 만족하게 되면, 프로그램에서 부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스로 대체하더라도 프로그램의 의미는 변화하지 않게 됩니다.</li>
<li>&quot;is a kind of&quot;의 관계입니다.</li>
<li>이를 만족하는 간단한 방법은 <strong>재정의</strong>, 즉 <strong>오버라이드</strong>를 하지 않도록 하는 것입니다.</li>
<li>&quot;자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지않고 확장만 수행한다&quot;라는 규칙을 지키는 것입니다.</li>
</ul>
<h4 id="ispinterface-segregation-principle-인터페이스-분리-원칙">ISP(Interface Segregation Principle): 인터페이스 분리 원칙</h4>
<ul>
<li>인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 합니다.</li>
<li>즉, 범용적인 인터페이스보다는 Client가 실제로 사용하는 Interface를 만들어야한다는 의미입니다.</li>
<li>인터페이스가 지나치게 범용적으로 구현된다면, 그 인터페이스를 상속받은 클라스는 자신이 사용하지 않는 인터페이스까지 구현해야하기 때문입니다.</li>
</ul>
<h4 id="dipdependency-inversion-principle-의존-역전의-원칙">DIP(Dependency Inversion Principle): 의존 역전의 원칙</h4>
<ul>
<li>어떤 Class를 참조해야하는 상황이 생긴다면, 그 Class를 직접 참조하기보다는 그 대상의 추상 클래스를 만들어서 사용하라는 원칙입니다.</li>
<li>DIP를 만족하는 설계는 변화에 유연한 시스템이 됩니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제]Sync vs Async]]></title>
            <link>https://velog.io/@yewon-july/Sync-vs-Async</link>
            <guid>https://velog.io/@yewon-july/Sync-vs-Async</guid>
            <pubDate>Mon, 08 Jun 2020 05:32:33 GMT</pubDate>
            <description><![CDATA[<h3 id="동기와-비동기란">동기와 비동기란?</h3>
<ul>
<li>비유를 들어 설명하자면, 해야할 task가 빨래, 설거지, 청소가 있다고 하자. </li>
<li>동기적으로 처리하는 것은 빨래를 끝낸 후 설거지를, 설저기즐 끝낸 후 청소를 하는 것을 의미한다. - 비동기적으로 처리하는 것은 빨래는 빨래 대행 업체에, 설거지는 설거지 대행 업체에, 청소는 청소 대행 업체에 맡겨 놓고, 각자 처리가 완료되면 연락을 주는 것이다. 이 때, 백그라운드 스레드에서 task를 처리하는 것을 비동기라고 한다.</li>
<li>동기 프로그래밍은 <strong>메소드를 실행시킴과 동시에 반환 값이 기대되는 경우</strong>이다. 이는 메소드가 실행되었을 때, 값이 반환되기 전까지는 blocking 되어있다는 것이다.</li>
<li>비동기 프로그래밍은 동기 프로그래밍과 달리 메소드를 실행시키면, 해당 task를 이벤트 큐에 넣거나 백그라운드 스레드에게 위임하고, 바로 다음 코드를 실행하기 때문에, blocking 되어 있지 않다.</li>
</ul>
<h3 id="임계-영역critical-section">임계 영역(Critical Section)</h3>
<ul>
<li>공유하는 자원을 접근하도록 하는 코드 부분을 임계 영역이라고 한다.</li>
<li>멀티 스레딩에서 설명한 것과 같이, 이 영역에 동시에 접근하게 될 경우 문제가 생긴다.<h4 id="임계-영역-문제-해결을-위한-기본-조건">임계 영역 문제 해결을 위한 기본 조건</h4>
</li>
<li><strong>Mutual Exclusion(상호 배제)</strong><ul>
<li>P1이 Critical Section에서 실행 중이라면, 다른 Process들은 Critical Section에서 실행될 수 없다.</li>
</ul>
</li>
<li><strong>Progress(진행)</strong><ul>
<li>Critical Section에 진행중인 별도의 프로세스가 없고, 현재 별도의 동작이 없는 Process들만 Critical Section 진입 후보로 선정될 수 있다.</li>
</ul>
</li>
<li><strong>Bounded Waitiong(한정된 대기)</strong><ul>
<li>Critical Section에 진입 신청 후 받아들여지기 전까지, 다른 Process들이 Critical Section에 진입하는 횟수는 제한적이다.<h3 id="임계-영역-해결책">임계 영역 해결책</h3>
<h4 id="lock">Lock</h4>
</li>
</ul>
</li>
<li>하드웨어 기반 해결책입니다.</li>
<li>임계 영역을 Lock으로 보호하는 것입니다.(CPU, 하드웨어 수준에서 Lock을 겁니다.)<ul>
<li>Lock을 획득한 프로세스만 임계 영역으로 진입 허용이 됩니다.</li>
<li>잠겨 있지 않다면, Lock을 잠그고 임계 영역에 진입하게 됩니다.</li>
</ul>
</li>
<li>Critical Section에 진입하는 프로세스는 Lock을 획득하며, Critical Section을 빠져나올 때 Unlock함으로써, 동시 접근을 막는 것입니다.</li>
<li>이는 다중처리기 환경에서는 시간적인 효율성 측면에서 적용할 수 없습니다.<h4 id="semaphore">Semaphore</h4>
</li>
<li>이는 SW상에서 Critical Section 문제를 해결하기 위한 도구입니다.</li>
<li>프로세스의 동기화 기법으로 공유된 자원의 여러 프로세스가 동시에 접근하는 것을 막는 것입니다.</li>
<li><strong>Counting Semaphore</strong><ul>
<li>현재 공유 자원에 접근할 수 있는 스레드 또는 프로세스의 수를 나타내는 값을 두어 상호 배제를 달성하는 기법입니다.</li>
<li>자원을 사용하면 세마포어가 감소하고, 방출하면 세마포어의 개수가 늘어납니다.</li>
<li>세마포어의 변수만큼의 프로세스 또는 스레드가 접근할 수 있습니다.</li>
<li>현재 수행중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있습니다.</li>
<li>일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용합니다.</li>
</ul>
</li>
<li><strong>Binary Semaphore</strong><ul>
<li>0과 1의 값을 가지는 플래그를 사용합니다.</li>
<li><strong>MUTEX</strong>라고도 불리며, Mutual Exclusion의 줄인말입니다.</li>
<li>다중 프로세스들 사이에서의 Critical Section 문제를 해결하기 위해 사용합니다.</li>
<li>오직 1개의 프로세스 또는 스레드만이 접근할 수 있습니다.</li>
<li>락을 획득한 프로세스만이 그 락을 해제할 수 있습니다.<h4 id="mutex">Mutex</h4>
</li>
</ul>
</li>
<li>앞서 말한 Binary Semaphore과 유사하다.<h4 id="busy-waiting">Busy Waiting</h4>
</li>
<li>lock의 해제를 기다리는 동안 빈 반복문을 계속 진행하므로써, CPU에서 Context Switching이 계속 발생하게 됩니다. 프로세스가 Lock을 기다리는 동안 계속 순환(Spin)이 실행됩니다.</li>
<li>짧은 Lock을 기다리는 경우, Context Switching 비용을 절약할 수 있으나, 일반적으로는 CPU를 점유한 상태로 기다리므로 자원이 낭비되게 됩니다.</li>
<li>이를 Busy Waiting이라 부릅니다.</li>
<li>일반적으로는 Semaphore에서 임계 영역에 진입을 시도했으나, 실패한 프로세스에 대해서는 Block을 시킨 뒤, Critical Section에 자리가 나면 다시 깨우는 방식을 사용합니다.</li>
<li>이 경우 Busy Waiting으로 인한 시간 낭비 문제가 해결됩니다.<h4 id="deadlock교착상태">Deadlock(교착상태)</h4>
</li>
<li>Semaphore가 Ready Queue를 가지고 있고, 둘 이상의 프로세스가 Critical Section 진입을 무한정 기다리고 있으며, Critical Section에 있는 프로세스는 진입 대기 중인 프로세스가 실행 되어야만 빠져나올 수 있는 상황을 지칭합니다.</li>
</ul>
<h4 id="모니터">모니터</h4>
<ul>
<li>고급 언어의 설계 구조물로서, 개발자의 코드를 상호 배제하게끔 만든 추상회된 데이터 형태이다.</li>
<li>공유자원에 접근하기 위한 키 획득과 자원 사용 후 해제를 모두 처리한다.</li>
<li>참고로 세마포어는 직접 키 해제와 공유자원 접근 처리가 필요하다.</li>
</ul>
<p><a href="https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4">https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4</a></p>
]]></description>
        </item>
    </channel>
</rss>