<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>R.silver</title>
    <link>https://spongerice.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 21:53:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>R.silver</managingEditor>
    <image>
      <title>R.silver</title>
      <url>https://tistory1.daumcdn.net/tistory/2424333/attach/cbcc31233ac74886983e7c4fe453bef1</url>
      <link>https://spongerice.tistory.com</link>
    </image>
    <item>
      <title>[Programmers] 연속된 부분 수열의 합 (Python)</title>
      <link>https://spongerice.tistory.com/216</link>
      <description>&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot;&gt;코딩테스트 연습 - 연속된 부분 수열의 합 | 프로그래머스 스쿨 (programmers.co.kr)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721109696254&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmeN5Q/hyWzxga4GT/VHDMWRs3jYiPmvDzGtfvAk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ctJgjE/hyWzucJ0CQ/xbVqvKLdahKG9QpTk5Ktl0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmeN5Q/hyWzxga4GT/VHDMWRs3jYiPmvDzGtfvAk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ctJgjE/hyWzucJ0CQ/xbVqvKLdahKG9QpTk5Ktl0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt;핵심 내용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;합이 k인 부분 수열의 시작 인덱스와 마지막 인덱스를 반환&lt;br /&gt;- 합이 k 인 부분 수열이 여러 개 일 경우 길이가 짧은 수열 반환&lt;br /&gt;- 길이가 짧은 수열이 여러 개인 경우 시작 인덱스가 작은 수열 반환&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PyNFl/btsICmyrJ6S/2vplMkvQKLk62y3BDsXc1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PyNFl/btsICmyrJ6S/2vplMkvQKLk62y3BDsXc1K/img.png&quot; data-alt=&quot;입출력 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PyNFl/btsICmyrJ6S/2vplMkvQKLk62y3BDsXc1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPyNFl%2FbtsICmyrJ6S%2F2vplMkvQKLk62y3BDsXc1K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;286&quot; height=&quot;150&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입출력 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;해결 아이디어&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형: 투포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. start 포인터를 기준으로 end 포인터를 이동시킨다 (for 문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 만약 부분 수열의 합이 k라면 (시작 인덱스, 마지막 인덱스, 배열의 길이)의 값을 ans에 추가한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 만약 부분 수열이 합이 k 보다 작다면, 현재 end 위치의 값을 더해주고 end 값을 이동시킨다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 만약 부분 수열의 합이 k 보다 크다면, while 조건을 만족하지 못하고 다음 start 분기로 이동한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 길이를 기준으로 정렬한 뒤 결과를 반환한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt;주의할 점&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- while 조건, 인덱스 범위를 주의해야 한다&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Python)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt;&lt;span&gt; sol1) start를 for 문을 사용하여 이동&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1721111415624&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sequence, k):
    n = len(sequence)
    end = 0
    total = 0
    ans = []
    
    # start를 기준으로 인덱스 이동 
    for start in range(n):
        while total &amp;lt; k and end &amp;lt; n:
            total += sequence[end] # 현재 까지 부분 수열의 합 계산
            end += 1 # 인덱스 이동 
            
        # 조건 만족시 
        if total == k:
            ans.append((start, end -1, end - 1 - start)) # start, end, 길이
        
        # total &amp;gt; k or end &amp;gt;= n 이면 
        total -= sequence[start] # start 이동 전 값 빼주기 
    
    # 길이를 기준으로 정렬 
    ans.sort(key = lambda x: x[2])
    # 시작 인덱스와 마지막 인덱스만 반환
    return ans[0][:2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt; sol2) &lt;/span&gt;start와 end를 직접 이동&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1721111808293&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sequence, k):
        n = len(sequence)
        start, end, sum = 0, 0, sequence[0]
        ans = [0, float('inf')]
        
        while start &amp;lt;= end and end &amp;lt; n:
            # 1. 현재 수열의 합 &amp;lt; k
            # end += 1
            if sum &amp;lt; k and end &amp;lt; n-1: # end += 1 할 것이기에 범위 체크
                end += 1
                sum += sequence[end]
            
            # 2. 현재 수열의 합 &amp;gt; k
            # start += 1
            elif sum &amp;gt; k:
                sum -= sequence[start]
                start += 1
                
            # 3. 현재 수열의 합 == k
            elif sum == k:
                # 기존에 등록된 수열의 길이와 비교 
                # 같으면 인덱스 작은 것을 등록해야 하기에 갱신하지 않는다
                if ans[1] - ans[0] &amp;gt; end - start: 
                    ans = [start, end]
                
                # sum = k를 만족하는 더 짧은 수열이 있을 수 있기에 start += 1 
                sum -= sequence[start]
                start += 1
            
            # 4. (1, 2, 3) 조건을 만족하지 못했는데 end를 갱신하지 못해 무한루프인 경우 방지
            else:
                if end == n-1:
                    break
                
        return ans&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithm/Programmers</category>
      <category>투포인터</category>
      <category>프로그래머스</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/216</guid>
      <comments>https://spongerice.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 16 Jul 2024 15:39:42 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 리코쳇 로봇 (Python)</title>
      <link>https://spongerice.tistory.com/215</link>
      <description>&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/169199&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/169199&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720695607844&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/169199&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eacGWw/hyWzB9CAbP/RfyeY9Cmbz4olK4RnD3bf0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/nwQFV/hyWzpVEIvD/KJB2NvJskAhfEra5egJibK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/169199&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/169199&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eacGWw/hyWzB9CAbP/RfyeY9Cmbz4olK4RnD3bf0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/nwQFV/hyWzpVEIvD/KJB2NvJskAhfEra5egJibK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt;핵심 내용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;상, 하, 좌, 우 4방향 중 하나를 선택해서&lt;br /&gt;게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 미끄러져 이동하는 것을 한 번의 이동으로 친다.&amp;nbsp;&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;해결 아이디어&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형: BFS&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tEzrb/btsIvtsllQp/FQF7nHkSYNyFOLzjNWLy2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tEzrb/btsIvtsllQp/FQF7nHkSYNyFOLzjNWLy2k/img.png&quot; data-alt=&quot;초기 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tEzrb/btsIvtsllQp/FQF7nHkSYNyFOLzjNWLy2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtEzrb%2FbtsIvtsllQp%2FFQF7nHkSYNyFOLzjNWLy2k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;252&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R에서 시작하여 &lt;b&gt;미끄러져 이동&lt;/b&gt;하며 G에 도착해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 일반적인 최단거리 BFS 문제에서 이동 거리(방식)를 조정해 주면 된다!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVUjeW/btsIxlfgjBJ/kmlCegvKOQ7nSdV2bYsyX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVUjeW/btsIxlfgjBJ/kmlCegvKOQ7nSdV2bYsyX1/img.png&quot; data-alt=&quot;매 턴 로봇의 도착 위치 (3턴 까지 표시)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVUjeW/btsIxlfgjBJ/kmlCegvKOQ7nSdV2bYsyX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVUjeW%2FbtsIxlfgjBJ%2FkmlCegvKOQ7nSdV2bYsyX1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;257&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;매 턴 로봇의 도착 위치 (3턴 까지 표시)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림과 같이 로봇의 도착 위치를 표시할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로봇의 현재 위치에서 상하좌우 중 이동 가능한 위치로 이동 시키며 경로를 확인하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도착 위치를 visited 배열에 이동 횟수로 표시하며 이동한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt; 주의 할 점&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1720697221322&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    # 이동 함수 - 한 번에 미끌어지듯 이동
    def move(x, y, dx, dy):
        nx, ny = x + dx, y + dy
        while in_range(nx, ny) and board[nx][ny] != 'D':
            nx += dx
            ny += dy
            
        return nx - dx, ny - dy # D 위치에서 while 문이 정지되므로 한 칸씩 뒤로 가야 한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 상하좌우 한 칸씩 이동하는 bfs함수에서는 nx, ny의 위치를 &lt;b&gt;nx, ny = x + dx, y + dy&lt;/b&gt;로 잡아주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 리코렛 로봇은 장애물에 닿을 때까지 미끄러지듯 이동해야 하므로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애물에 닿을 때 까지 dx, dy 방향으로 이동하는 함수를 작성했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(dx, dy의 방향을 따라 장애물(범위 벗어남, D)을 만나기 전까지 이동하는 코드)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Python)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1720697183426&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque
def solution(board):
    n = len(board)
    m = len(board[0])
    
    dxs, dys = [0, 0, 1, -1], [-1, 1, 0, 0]
    
    # 로봇 초기 위치 등록
    for i in range(n):    
        for j in range(m):
            if board[i][j] == 'R':
                rx, ry = i, j
    
    # bfs 사전 준비
    q = deque()
    q.append((rx, ry))
    visited = [[0 for _ in range(m)] for _ in range(n)]
    visited[rx][ry] = 1
    
    # 범위 체크 함수
    def in_range(x, y):
        if x &amp;lt; 0 or x &amp;gt;= n or y &amp;lt; 0 or y &amp;gt;= m:
            return False
        return True
    
    # 이동 함수 - 한 번에 미끌어지듯 이동
    def move(x, y, dx, dy):
        nx, ny = x + dx, y + dy
        while in_range(nx, ny) and board[nx][ny] != 'D':
            nx += dx
            ny += dy
            
        return nx - dx, ny - dy
    
    def bfs():
        while q:
            x, y = q.popleft()
            for dx, dy in zip(dxs, dys):
                nx, ny = move(x, y, dx, dy) # nx, ny = x + dx, y + dy를 변경
                if in_range(nx, ny) and not visited[nx][ny] and board[nx][ny] != 'D':
                    q.append((nx, ny))
                    visited[nx][ny] = visited[x][y] + 1
                    
                    # 종료 조건
                    if board[nx][ny] == 'G':
                        return visited[x][y]
        
        # G 만나지 못하면 -1 리턴
        return -1
    
    ans = bfs()
    
    return ans&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  유사 문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준_13460 구슬 탈출 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13460&quot;&gt;13460번: 구슬 탈출 2 (acmicpc.net)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준_7562 나이트의 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7562&quot;&gt;7562번: 나이트의 이동 (acmicpc.net)&lt;/a&gt;&lt;/p&gt;</description>
      <category>algorithm/Programmers</category>
      <category>bfs</category>
      <category>상하좌우 이동</category>
      <category>프로그래머스</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/215</guid>
      <comments>https://spongerice.tistory.com/215#entry215comment</comments>
      <pubDate>Thu, 11 Jul 2024 20:32:45 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 두 원 사이의 정수 쌍(Python, Java)</title>
      <link>https://spongerice.tistory.com/214</link>
      <description>&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181187&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/181187&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720080292599&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181187&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsgxUR/hyWrKN3slF/QQErg0f7Hp8uIMRqo3x3Ak/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/lA8nN/hyWvUO4foJ/DJ30NG9HP53in0tPvv4VG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181187&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181187&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsgxUR/hyWrKN3slF/QQErg0f7Hp8uIMRqo3x3Ak/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/lA8nN/hyWvUO4foJ/DJ30NG9HP53in0tPvv4VG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt;핵심 내용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sLIU5/btsInu5FQNG/Xo0NhUGc1UgfBstXAAEqwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sLIU5/btsInu5FQNG/Xo0NhUGc1UgfBstXAAEqwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sLIU5/btsInu5FQNG/Xo0NhUGc1UgfBstXAAEqwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsLIU5%2FbtsInu5FQNG%2FXo0NhUGc1UgfBstXAAEqwK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;352&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;두 원 사이의 x, y 좌표 모두 정수인 점의 개수 반환하기&amp;nbsp;&lt;br /&gt;(각 원위의 점도 세어야 한다)&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;해결 아이디어&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&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;1. i를 1부터 r2까지 반복하며 해당 x 좌표에서의 원 1, 원 2의 y 좌표를 구한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. x가 i 일 때 두 원 사이 y 값의 최대 값은 math.sqrt(math.pow(r2, 2) - math.pow(i, 2))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. x가 i 일 때 두 원 사이 y 값의 최소 값은 math.sqrt(math.pow(r1, 2) - math.pow(i, 2))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 최대 값과 최솟값 사이의 정수의 개수를 세어 더해주면 된다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjjaY/btsInjJ5OpK/IxRcc5FkFMkgeViXppnLk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjjaY/btsInjJ5OpK/IxRcc5FkFMkgeViXppnLk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjjaY/btsInjJ5OpK/IxRcc5FkFMkgeViXppnLk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjjaY%2FbtsInjJ5OpK%2FIxRcc5FkFMkgeViXppnLk1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;762&quot; height=&quot;461&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt; 주의 할 점&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1. 1사분면의 값만 구한 뒤 *4&amp;nbsp; 하기&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;2. 축 위의 값이 중복되지 않도록 i의 범위는 1부터 시작하기&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;3. a &amp;lt;= x &amp;lt;= b를 만족하는 정수 x의 개수&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 예) 1.2 &amp;lt;= x &amp;lt;= 5.4를 만족하는 정수 x의 개수는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2 &amp;lt;= x &amp;lt;= 5 를 만족하는 정수 x의 개수와 동일하다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; =&amp;gt; math.floor(a) - math.ceil(b) + 1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Python)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1720081021002&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import math
def solution(r1, r2):
    ans = 0

    for i in range(1, r2 + 1):
        # i 보다 r1이 작아 mn의 값이 음수가 되는 것 방지
        if i &amp;lt;= r1:
            mn = math.sqrt(math.pow(r1, 2) - math.pow(i, 2))
        else:
            mn = 0

        mx = math.sqrt(math.pow(r2, 2) - math.pow(i, 2))

        ans += (math.floor(mx) - math.ceil(mn) + 1)

    ans *= 4

    return ans&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Java)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1720081038301&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package programmers.lv2;
import java.util.*;

public class 두_원_사이의_정수_쌍 {

    class Solution {
        public long solution(int r1, int r2) {
            long ans = 0;

            // x: i일 때 r1원 내부의 정수의 개수
            // cnt = Math.floor((Math.sqrt(Math.pow(r1, 2) - Math.pow(i, 2))))

            for (int i = 1; i &amp;lt;= r2; i++) {
                double mn = Math.sqrt(Math.pow(r1, 2) - Math.pow(i, 2));
                double mx = Math.sqrt(Math.pow(r2, 2) - Math.pow(i, 2));

                ans += (long)Math.floor(mx) - (long)Math.ceil(mn) + 1;
            }
            ans *= 4;

            return ans;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/Programmers</category>
      <category>Lv2</category>
      <category>수학</category>
      <category>프로그래머스</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/214</guid>
      <comments>https://spongerice.tistory.com/214#entry214comment</comments>
      <pubDate>Thu, 4 Jul 2024 17:19:18 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 요격 시스템 (Python, Java)</title>
      <link>https://spongerice.tistory.com/213</link>
      <description>&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181188&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/181188&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719994770913&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181188&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zpEAD/hyWrQtSyAw/SiEksjKJBkteccIDQkanQk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c9Xcpa/hyWvJzOVOF/QEEL0lv8Bab8LsjlUp80eK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181188&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/181188&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zpEAD/hyWrQtSyAw/SiEksjKJBkteccIDQkanQk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/c9Xcpa/hyWvJzOVOF/QEEL0lv8Bab8LsjlUp80eK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt;핵심 내용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DkDOj/btsIlQHzbV9/okURzXvfhEXJLfZoPCGgbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DkDOj/btsIlQHzbV9/okURzXvfhEXJLfZoPCGgbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DkDOj/btsIlQHzbV9/okURzXvfhEXJLfZoPCGgbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDkDOj%2FbtsIlQHzbV9%2FokURzXvfhEXJLfZoPCGgbk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;596&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;A 나라 미사일: x 축에 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;평행&lt;/b&gt;&lt;/span&gt;한 직선 형태의 모양&lt;br /&gt;&lt;br /&gt;B 나라 미사일: x 축에 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;수직 한&lt;/b&gt;&lt;/span&gt; 직선 형태의 모양, 발사된 미사일은 해당 x 좌표에 걸쳐 있는 모든 미사일 관통 가능&lt;br /&gt;(단, 개구간이기에 s, e에서 발사하는 미사일로는 요격 불가, x가 실수인 곳에서 발사 가능)&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;해결 아이디어&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형: 그리디, 정렬&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;  구조&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. targets을 e 기준으로 오름차순 정렬&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. targets을 돌며 해당 인덱스[i]의 s가 저장된 인덱스[idx]의 e 보다 크거나 같은지 확인&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이전에 등장한 e가 다음에 등장한 s 보다 작다면 둘은 겹치지 않는다 (아래 그림 참조)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 조건을 만족한다면 idx를 현재 인덱스로 갱신하고, cnt += 1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;3985&quot; data-origin-height=&quot;1856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bygPKX/btsIm3MULXr/0GwnPDsTHTYIilqmHucBzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bygPKX/btsIm3MULXr/0GwnPDsTHTYIilqmHucBzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bygPKX/btsIm3MULXr/0GwnPDsTHTYIilqmHucBzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbygPKX%2FbtsIm3MULXr%2F0GwnPDsTHTYIilqmHucBzK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;3985&quot; height=&quot;1856&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;3985&quot; data-origin-height=&quot;1856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Python)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719996365864&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(targets):
	# 1. [0] 기준 정렬
    targets.sort(key=lambda x: (x[1], x[0]))

	# 2. 한 번에 요격할 수 있는지 판단
    idx, cnt = 0, 1 # // 모두 한 번에 요격 가능하면 미사일의 최솟값은 1
    for i in range(1, len(targets)):
    	# 한 번에 요격 불가 (같은 x 상에 있지 않음)
        if targets[idx][1] &amp;lt;= targets[i][0]:
            cnt += 1
            idx = i

    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Java)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719996377971&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package programmers.lv2;

public class 요격_시스템 {
    import java.util.*;

    class Solution {
        public int solution(int[][] targets) {
            // 1. [0] 기준 정렬
            Arrays.sort(targets, (o1, o2) -&amp;gt; (o1[1] - o2[1]));

            // 2. 한 번에 요격할 수 있는지 판단
            int idx = 0;
            int cnt = 1; // 모두 한 번에 요격 가능하면 미사일의 최솟값은 1

            for (int i = 1 ; i &amp;lt; targets.length; i++){
                // 한 번에 요격 불가 (같은 x 상에 있지 않음)
                if (targets[idx][1] &amp;lt;= targets[i][0]) {
                    idx = i;
                    cnt += 1;
                }
            }
            return cnt;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithm/Programmers</category>
      <category>그리디</category>
      <category>정렬</category>
      <category>프로그래머스</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/213</guid>
      <comments>https://spongerice.tistory.com/213#entry213comment</comments>
      <pubDate>Wed, 3 Jul 2024 17:47:39 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 등굣길 (Python, Java)</title>
      <link>https://spongerice.tistory.com/212</link>
      <description>&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42898&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42898&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719920086991&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42898&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cC5fuC/hyWrSZmS9a/s2lkKS5hKek5Z5US5hIOtk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bEpu56/hyWvXrbDMs/BL5NZK4SnLM14CgTxoXnk0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42898&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42898&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cC5fuC/hyWrSZmS9a/s2lkKS5hKek5Z5US5hIOtk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bEpu56/hyWvXrbDMs/BL5NZK4SnLM14CgTxoXnk0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt;핵심 내용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;&lt;span style=&quot;color: #f89009;&quot;&gt;오른쪽과 아래쪽&lt;/span&gt;&quot;으로만 움직여 &lt;br /&gt;집에서 학교까지 갈 수 있는 최단경로의 개수를 &quot;&lt;span style=&quot;color: #f89009;&quot;&gt;1,000,000,007&lt;/span&gt;&quot;로 나눈 나머지 return&lt;/blockquote&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;해결 아이디어&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형: DP&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 위치&lt;span style=&quot;color: #f89009;&quot;&gt;(i, j)&lt;/span&gt;에서 경로의 값이 최대가 되려면 왼쪽&lt;span style=&quot;color: #f89009;&quot;&gt;(i, j-1)&lt;/span&gt; 혹은 위&lt;span style=&quot;color: #f89009;&quot;&gt;(i-1, j)&lt;/span&gt;에서 와야 한다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3r7u/btsIkjJ1FWI/IMvZS8LgRfbRurxQjopqh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3r7u/btsIkjJ1FWI/IMvZS8LgRfbRurxQjopqh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3r7u/btsIkjJ1FWI/IMvZS8LgRfbRurxQjopqh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3r7u%2FbtsIkjJ1FWI%2FIMvZS8LgRfbRurxQjopqh1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;400&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; dp 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. dp 정의&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (i, j) 위치까지 올 수 있는 최단 경로의 개수&amp;nbsp;&lt;/p&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;b&gt;2. dp 초기화&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 집의 위치: (0, 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위에서만 접근 가능한 위치 (왼쪽에서 올 수 없는 위치): (i, 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽에서만 접근 가능한 위치 (위에서 올 수 없는 위치): (0, j)&lt;/p&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;b&gt;3. 점화식&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1719920672189&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (웅덩이가 아니면):
	dp[i][j] = dp[i][j-1] + dp[i-1][j]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 주의할 것&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. puddles은 행과 열의 위치가 바뀌어 전달된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. % 연산을 해서 return 해야 한다 (문제 조건 잘 읽기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연산 중간에 % 연산을 해 주어야 시간 초과가 나지 않는다 (모듈러 연산 법칙 활용)&lt;/p&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;/p&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;code&gt;(A + B) % p = ((A % p) + (B % p)) % p
(A * B) % p = ((A % p) * (B % p)) % p
(A - B) % p = ((A % p) - (B % p) + p) % p&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Python)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719921037690&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(m, n, puddles):
    # 0. board 채우기 (1: 웅덩이)
    board = [[0 for _ in range(m)] for _ in range(n)]

    for p in puddles:
        if p != []:
            board[p[1] - 1][p[0] - 1] = 1

    # 1.dp 정의
    dp = [[0 for _ in range(m)] for _ in range(n)]

    # 2. 초기화
    # 2-1. 원점 - 출발 지점에는 웅덩이가 없음
    dp[0][0] = 1

	# 2-2. (i, 0) - 위에서만 올 수 있음
    for i in range(n):
        if board[i][0]:
            break
        dp[i][0] = 1

	# 2-2. (0, j) - 왼쪽에서만 올 수 있음
    for j in range(m):
        if board[0][j]:
            break
        dp[0][j] = 1

    # 3. 점화식
    for i in range(1, n):
        for j in range(1, m):
        	# 왼쪽, 위쪽에서 온 값 더하기
            if not board[i][j]: # 웅덩이라면 
                dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 1000000007
	
    // 4. output
    return dp[n - 1][m - 1] % 1000000007&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Java)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1719920942018&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(int m, int n, int[][] puddles) {
        // 0. board 채우기 (1: 웅덩이)
        int[][] board = new int[n][m];
        if (puddles[0].length &amp;gt; 0){
            for (int i = 0 ; i &amp;lt; puddles.length; i++) {
                board[puddles[i][1] - 1][puddles[i][0] - 1] = 1;
            }
        }        
                
        // 1. dp 정의 
        int[][] dp = new int[n][m];
        
        // 2. 초기화
        // 2-1. 원점 - 출발 지점에는 웅덩이가 없음
        dp[0][0] = 1;
        
        // 2-2. (i, 0) - 위에서만 올 수 있음
        for (int i = 0 ; i &amp;lt; n; i++) {
            if (board[i][0] == 1) {
                break;
            }
            dp[i][0] = 1;
        }
            
        
        // 2-2. (0, j) - 왼쪽에서만 올 수 있음
        for (int j = 0 ; j &amp;lt; m; j++){
            if(board[0][j] == 1) {
                break;
            }
            dp[0][j] = 1;
        }
            
        
        // 3. 점화식 
        for (int i = 1; i &amp;lt; n; i++) {
            for (int j = 1; j &amp;lt; m; j++) {
                // 왼쪽, 위쪽에서 온 값 더하기
                if (board[i][j] == 0) // 웅덩이라면 비워두기
                    dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % 1000000007;
            }
        }
        
        // debug - 그대로 제출하면 시간 초과 (주의)
        // for (int i = 0 ; i &amp;lt; n; i++) {
        //     for (int j = 0 ; j &amp;lt; m; j++) {
        //         System.out.printf(&quot;%d &quot;, dp[i][j]);
        //     }
        //     System.out.println();
        // }
        
        // 4. output
        return dp[n-1][m-1] % 1000000007;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/Programmers</category>
      <category>DP</category>
      <category>모듈러 연산</category>
      <category>프로그래머스</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/212</guid>
      <comments>https://spongerice.tistory.com/212#entry212comment</comments>
      <pubDate>Tue, 2 Jul 2024 20:54:18 +0900</pubDate>
    </item>
    <item>
      <title>[programmers] 정수 삼각형 - Python, Java</title>
      <link>https://spongerice.tistory.com/211</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43105?language=python3&quot; target=&quot;_self&quot;&gt;&lt;span&gt;코딩테스트 연습 - 정수 삼각형 | 프로그래머스 스쿨 (programmers.co.kr)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;프로그래머스&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43105?language=python3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bm5aBc/hyWvH9zKlC/Y9uIkqbepmUYIlEJcxUKb1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cYXt13/hyWvUVmSxY/Mn2rB2Z6fQ5kSAjMiEsALk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot; data-og-url=&quot;https://programmers.co.kr/&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43105?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bm5aBc/hyWvH9zKlC/Y9uIkqbepmUYIlEJcxUKb1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cYXt13/hyWvUVmSxY/Mn2rB2Z6fQ5kSAjMiEsALk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✨&lt;b&gt;핵심 내용&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- 거쳐간 숫자의 &lt;span style=&quot;color: #f89009;&quot;&gt;합이 가장 큰&lt;/span&gt; 경우 찾기&amp;nbsp;&lt;br /&gt;- 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 &quot;&lt;span style=&quot;color: #f89009;&quot;&gt;오른쪽 또는 왼쪽&lt;/span&gt;&quot;으로만 이동 가능&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;b&gt;해결 아이디어&lt;/b&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형: DP&lt;br /&gt;&amp;nbsp;&lt;br /&gt;현재 위치&lt;span style=&quot;color: #f89009;&quot;&gt;(i, j)&lt;/span&gt;에서 최댓값이 되려면&lt;br /&gt;왼쪽 위&lt;span style=&quot;color: #f89009;&quot;&gt;(i-1, j-1)&lt;/span&gt; vs 오른쪽 위&lt;span style=&quot;color: #f89009;&quot;&gt;(i-1, j)&lt;/span&gt; 중 어느 방향으로 와야 최댓값이 되는지 찾기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JIJQ2/btsIkzZbiT5/LSgC3ErV3f9mIzmkKmM0C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JIJQ2/btsIkzZbiT5/LSgC3ErV3f9mIzmkKmM0C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JIJQ2/btsIkzZbiT5/LSgC3ErV3f9mIzmkKmM0C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJIJQ2%2FbtsIkzZbiT5%2FLSgC3ErV3f9mIzmkKmM0C0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;368&quot; height=&quot;300&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Python)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;def solution(triangle):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = len(triangle)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = len(triangle[n - 1])

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 1. dp 정의 - (i, j) 위치까지의 경로 중 숫자의 합의 최댓값
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp = [[0 for _ in range(n)] for _ in range(m)]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 2. dp 초기화
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 2-1. dp[0][0] 초기화
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[0][0] = triangle[0][0]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(1, n):
        # // 2-2. dp[i][0] 초기화
        dp[i][0] = dp[i - 1][0] + triangle[i][0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
        # //2-3. dp[i][cnt] 초기화
        dp[i][i] = dp[i - 1][i - 1] + triangle[i][i]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 3. 점화식
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(2, n):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in range(1, i):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + triangle[i][j]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return max(dp[n - 1])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅&lt;b&gt;정답 코드 (Java)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class Solution {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int solution(int[][] triangle) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int n = triangle.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int m = triangle[n-1].length;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 1. dp 정의 - (i, j) 위치까지의 경로 중 숫자의 합의 최댓값
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int[][] dp = new int[n][m];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 2. dp 초기화
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 2-1. dp[0][0] 초기화
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[0][0] = triangle[0][0];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 1 ; i &amp;lt; n; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 2-2. dp[i][0] 초기화
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[i][0] = dp[i-1][0] + triangle[i][0];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//2-3. dp[i][cnt] 초기화
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[i][i] = dp[i-1][i-1] + triangle[i][i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 3. 점화식
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 2; i &amp;lt; n; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int j = 1; j &amp;lt; i; j++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 4. output
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int mx = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int j = 0; j &amp;lt; m; j++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mx = Math.max(mx, dp[n-1][j]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return mx;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/Programmers</category>
      <category>DP</category>
      <category>Java</category>
      <category>Python</category>
      <category>프로그래머스</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/211</guid>
      <comments>https://spongerice.tistory.com/211#entry211comment</comments>
      <pubDate>Mon, 1 Jul 2024 20:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[softeer] 통근버스 출발 순서 검증하기 - python, java</title>
      <link>https://spongerice.tistory.com/210</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TjPFj/btsIgiqSL3d/4wKktsQfTrqnFOQvcHYGnK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TjPFj/btsIgiqSL3d/4wKktsQfTrqnFOQvcHYGnK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TjPFj/btsIgiqSL3d/4wKktsQfTrqnFOQvcHYGnK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTjPFj%2FbtsIgiqSL3d%2F4wKktsQfTrqnFOQvcHYGnK%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;377&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://softeer.ai/practice/6257/history?questionType=ALGORITHM&quot;&gt;Softeer - 현대자동차그룹 SW인재확보플랫폼&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719558254997&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Softeer - 현대자동차그룹 SW인재확보플랫폼&quot; data-og-description=&quot;&quot; data-og-host=&quot;softeer.ai&quot; data-og-source-url=&quot;https://softeer.ai/practice/6257/history?questionType=ALGORITHM&quot; data-og-url=&quot;https://softeer.ai/practice/6257/history?questionType=ALGORITHM&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://softeer.ai/practice/6257/history?questionType=ALGORITHM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://softeer.ai/practice/6257/history?questionType=ALGORITHM&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Softeer - 현대자동차그룹 SW인재확보플랫폼&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;softeer.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✨핵심 내용&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;nums[i] &amp;lt; nums[j] and nums[i] &amp;gt; nums[k] 를 만족하는 배열을 찾아 개수를 세기&lt;br /&gt;&lt;br /&gt;제약 조건: 3 &amp;lt;= N &amp;lt;= 5000 인 정수&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 해결 아이디어&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 3중 for 문 사용 (시간 초과)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 가능한 조합을 만들고, if 문으로 문제 조건을 판단 -&amp;gt; O(n^3) 시간 복잡도로 시간 초과!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 백트레킹 (시간 초과)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 조합을 백트래킹을 활용하여 만들고 조건 판단 -&amp;gt; O(n^3) 시간 복잡도로 시간 초과!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 누적합 (정답)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt; 제약 조건이 3 &amp;lt;= N &amp;lt;= 5000으로 걸려 있기에 O(n^2) 이하 풀이 법을 생각해야 한다.&lt;/span&gt;&lt;/p&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;color: #000000;&quot;&gt;i와 k의 조합을 기준으로 nums[i]와 nums[k] 사이의 nums[i] 보다 큰 값의 개수를 세는 방법을 사용할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&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;b&gt;1. nums[i] &amp;lt; nums[k] 라면&lt;/b&gt;&lt;br /&gt;nums[k] &amp;lt; nums[i] &amp;lt; nums[j] 라는 조건에는 맞지 않으나&lt;br /&gt;i&amp;nbsp;이후에&amp;nbsp;등장하는&amp;nbsp;nums[i]&amp;nbsp;보다&amp;nbsp;큰&amp;nbsp;수에&amp;nbsp;해당한다.&amp;nbsp;(bigger&amp;nbsp;+=&amp;nbsp;1) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. nums[i] &amp;gt; nums[k] 라면&lt;/b&gt;&lt;br /&gt;문제의 조건의 일부에 해당한다.&lt;br /&gt;그러나&amp;nbsp;i&amp;nbsp;와&amp;nbsp;k&amp;nbsp;사이에&amp;nbsp;등장한&amp;nbsp;nums[i]&amp;nbsp;보다&amp;nbsp;큰&amp;nbsp;수&amp;nbsp;(bigger)를&amp;nbsp;더해&amp;nbsp;값(ans)을&amp;nbsp;갱신하는&amp;nbsp;과정을&amp;nbsp;통해&amp;nbsp;문제의&amp;nbsp;조건을&amp;nbsp;모두&amp;nbsp;만족시킬&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅정답 코드 (python)&lt;/h3&gt;
&lt;pre id=&quot;code_1719559571135&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
n = int(input())
nums = list(map(int, input().split()))
ans = 0

for i in range(n):
    bigger = 0
    for k in range(i + 1, n):
        if nums[i] &amp;lt; nums[k]: # 조건에 안맞음, a[i] 보다 큰 수라는 것만 체크
            bigger += 1
        else: # 조건에 맞음 - 기존에 세었던 a[i] 보다 큰 값들 더해주기
            ans += bigger

print(ans)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅정답 코드 (java)&lt;/h3&gt;
&lt;pre id=&quot;code_1719560107227&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static int n;
    static int[] nums;
    static int bigger;
    static long ans; // 자료형 주의!
    
    public static void main(String[] args) throws IOException{
        // input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        
        nums = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i &amp;lt; n; i++){
            nums[i] = Integer.parseInt(st.nextToken());    
        }

        // 누적합
        for(int i = 0 ; i &amp;lt; n; i++) {
            bigger = 0;
            for (int k = i + 1; k &amp;lt; n; k++) {
                if (nums[i] &amp;lt; nums[k]) // 조건에 안맞음, a[i] 보다 큰 수라는 것만 체크
                    bigger += 1;
                else // 조건에 맞음 - 기존에 세었던 a[i] 보다 큰 값들 더해주기
                    ans += bigger;
            }
        }

        // output
        System.out.println(ans);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/Softeer</category>
      <category>HSAT</category>
      <category>누적합</category>
      <category>소프티어</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/210</guid>
      <comments>https://spongerice.tistory.com/210#entry210comment</comments>
      <pubDate>Sat, 29 Jun 2024 14:59:18 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 면접 예상 질문 &amp;amp; 답변 모음 - 인터럽트(interrupt)</title>
      <link>https://spongerice.tistory.com/208</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &lt;span data-token-index=&quot;0&quot;&gt;2. 인터럽트가 무엇인지 설명해 주세요&lt;/span&gt; &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트는 cpu의 작업을 방해하는 신호로 명령어 사이클이 끊어지는 상황을 의미합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령어 사이클: 하나의 명령어를 처리하는 정형화된 흐름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트는 동기 인터럽트와 비동기 인터럽트로 구분할 수 있습니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;a. &lt;b&gt;동기 인터럽트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예) cpu가 실행하는 프로그램상의 오류&lt;/li&gt;
&lt;li&gt;CPU에 의해 발생하는 인터럽트로 &lt;b&gt;예외 (exception)이라고&lt;/b&gt; 부릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;b. &lt;b&gt;비동기 인터럽트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예) cpu가 요구한 작업을 마친 입출력 장치가 보내는 완료 알림&lt;/li&gt;
&lt;li&gt;예) 입출력 장치가 입력을 받은 후 이를 처리하기 위한 입력 알림&lt;/li&gt;
&lt;li&gt;주로 입출력 장치에 의해 발생하는 인터럽트로 &lt;b&gt;하드웨어 인터럽트라고&lt;/b&gt; 부릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2-1.&amp;nbsp;인터럽트는&amp;nbsp;어떻게&amp;nbsp;처리하나요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 신호가 발생했을 때 cpu는 &lt;b&gt;인터럽트 플래그&lt;/b&gt;를 통해 현재 인터럽트를 받아들일 수 있는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트를 받아들일 수 있다면, cpu는 현재 &lt;b&gt;작업을 백업&lt;/b&gt;하고, 인터럽트 벡터를 참조하여 &lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt;을 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 서비스 루틴이 끝나면 cpu는 백업해 둔 작업을 &lt;b&gt;복구하여 실행을 재개&lt;/b&gt;합니다.&lt;/p&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;u&gt;&lt;b&gt;하드웨어 인터럽트 처리 순서&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입출력장치가 cpu로 &lt;b&gt;인터럽트 요청 신호&lt;/b&gt;를 보냅니다.&lt;/li&gt;
&lt;li&gt;실행 사이클이 끝나고 명령어 인출 전 &lt;b&gt;cpu 인터럽트 여부&lt;/b&gt;를 확인합니다.&lt;/li&gt;
&lt;li&gt;인터럽트 요청을 확인하고, &lt;b&gt;인터럽트 플래그&lt;/b&gt;를 통해 현재 인터럽트를 받아들일 수 있는지 확인합니다.&lt;/li&gt;
&lt;li&gt;인터럽트를 받아들일 수 있다면 cpu는 &lt;b&gt;현재 작업을 백업&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;인터럽트 벡터를 참조하여 &lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt;을 실행합니다.&lt;/li&gt;
&lt;li&gt;인터럽트 서비스 루틴이 끝나면 백업해 둔 작업을 &lt;b&gt;복구하여 실행&lt;/b&gt;을 재개합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;인터럽트 요청 신호&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트를 &lt;b&gt;요청&lt;/b&gt;하는 신호입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 인터럽트 플래그가 활성화되어 있어야 합니다.&lt;/p&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;u&gt;&lt;b&gt;인터럽트 플래그&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 인터럽트를 &lt;b&gt;받아들일지 결정&lt;/b&gt;하는 플래그입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 플래그가 비활성화되어 있다면 인터럽트 요청이 무시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 정전, 하드웨어 고장으로 인한 인터럽트 등 막을 수 없는 인터럽트는 우선순위가 높아 플래그에 관계없이 인터럽트가 받아들여집니다.&lt;/p&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;u&gt;&lt;b&gt;인터럽트 서비스 루틴 (ISR)&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트를 처리하기 위한 프로그램으로 &lt;b&gt;인터럽트를 처리하는 방법&lt;/b&gt;이 담겨 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 핸들러라고도 불립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu가 인터럽트를 처리한다는 것은 인터럽트 서비스 루틴을 실행하고 이전작업으로 다시 돌아온다는 것을 의미합니다.&lt;/p&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;u&gt;&lt;b&gt;인터럽트 벡터&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 서비스 루틴을 식별하기 위한 정보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 벡터로 서비스 루틴의 시작 주소를 알 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2-2. Polling 방식에 대해 설명해 주세요. &lt;/b&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현이 쉽지만, 신호가 들어올 때까지 루프를 돌기에 시스템 자원을 많이 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바쁜 대기라고도 부릅니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 2-3. HW / SW 인터럽트에 대해 설명해 주세요. &lt;/b&gt;&lt;/p&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;u&gt;&lt;b&gt;하드웨어 인터럽트&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 인터럽트는 주로 입출력 장치에 의해 발생하는 인터럽트를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 방식으로 작동됩니다.&lt;/p&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;u&gt;&lt;b&gt;소프트웨어 인터럽트&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 인터럽트는 프로그램 코드 혹은 운영체제의 명령어로 발생하는 인터럽트를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜(system call), 트랩(trap)은 소프트웨어 인터럽트의 일종입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화 방식으로 작동됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt; 2-4. 동시에 두 개 이상의 인터럽트가 발생하면, 어떻게 처리해야 하나요? &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시에 인터럽트가 발생하면 cpu는 인터럽트 우선순위를 기준으로 인터럽트를 처리합니다. 이때, 선점형 방식으로 동작합니다.&lt;/p&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;u&gt;&lt;b&gt;인터럽트 처리 절차&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인터럽트 요청 중 &lt;b&gt;가장 높은 우선순위&lt;/b&gt;를 가진 인터럽트를 식별합니다.&lt;/li&gt;
&lt;li&gt;현재 작업 중인 작업의 &lt;b&gt;상태를 저장&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;우선순위 순서대로 &lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt; 혹은 인터럽트 핸들러가 실행됩니다.&lt;/li&gt;
&lt;li&gt;인터럽트 처리 중 더 높은 우선순위의 인터럽트가 발생한다면 해당 인터럽트가 처리됩니다. (중첩 인터럽트 처리)&lt;/li&gt;
&lt;li&gt;인터럽트 처리가 모두 완료되었다면 이전에 저장한 작업을 &lt;b&gt;복원&lt;/b&gt;하여 작업을 재개합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;a href=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot;&gt;VSFe/Tech-Interview (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711515698864&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - VSFe/Tech-Interview&quot; data-og-description=&quot;Contribute to VSFe/Tech-Interview development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot; data-og-url=&quot;https://github.com/VSFe/Tech-Interview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wbZuT/hyVDxPgGVr/HDfQ97uJjx6WSKJgtRoVbk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wbZuT/hyVDxPgGVr/HDfQ97uJjx6WSKJgtRoVbk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - VSFe/Tech-Interview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to VSFe/Tech-Interview development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[cs] 기술면접준비</category>
      <category>cs</category>
      <category>면접 질문</category>
      <category>운영체제</category>
      <category>인터럽트</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/208</guid>
      <comments>https://spongerice.tistory.com/208#entry208comment</comments>
      <pubDate>Wed, 27 Mar 2024 14:03:26 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 면접 예상 질문 &amp;amp; 답변 모음 - 시스템 콜(system call)</title>
      <link>https://spongerice.tistory.com/207</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;1. 시스템 콜이 무엇인지 설명해 주세요&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜은 사용자 모드에서 운영체제 서비스를 제공받기 위한 요청으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜 요청시 사용자 모드에서 커널 모드로 전환되어 cpu 자원에 접근할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이중 모드: cpu가 명령어를 실행하는 모드를 &quot;사용자 모드&quot;와 &quot;커널 모드&quot;로 구분하는 방식&amp;nbsp;&lt;br /&gt;&lt;br /&gt;- 사용자 모드&lt;br /&gt;: 운영체제 서비스를 제공받을 수 없는 실행 모드&amp;nbsp;&lt;br /&gt;: 커널 영역의 코드를 실행할 수 없는 모드 (자원 접근 불가)&lt;br /&gt;&lt;br /&gt;- 커널 모드&amp;nbsp;&lt;br /&gt;: 운영체제 서비스를 제공받을 수 있는 실행 모드&amp;nbsp;&lt;br /&gt;: 커멀 영역의 코드를 실행할 수 있는 모드 (자원 접근 명령어 실행 가능)&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;1-1. 우리가 사용하는 시스템 콜의 예시를 들어주세요 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 시스템 콜으로 fork(), exec(), wait(), exit()가 존재합니다.&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;- fork()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 프로세스를 생성하는 시스템 콜입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fork()를 통해 자신의 복사본을 자식 프로세스로 생성합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 자식 프로세스를 위한 메모리가 새롭게 할당됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 프로세스는 부모 프로세스의 자원을 상속받습니다. (PID와 저장된 메모리의 위치는 다름)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- exec()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 공간을 다른 프로세스 내용으로 교체하는 시스템 콜입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fork()를 통해 생성된 자식 프로세스는 exec() 시스템 콜을 통해 새로운 프로세스로 전환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리가 새롭게 할당되지 않고, exec()을 호출한 프로세스는 새로운 프로세스에 의해 덮어쓰기 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- wait()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자식 프로세스가 종료될 때 까지 대기하는 시스템 콜입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 함수를 사용하여 부모, 자식의 종료시점을 동시화 시킬 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로세스의 종료 상태가 저장되는 항목들은 부모 프로세스가 wait()을 호출할 때까지 남아있다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 75px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;좀비(zombie) 프로세스&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;고아(orhpan) 프로세스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 38px;&quot;&gt;종료되었지만 부모 프로세스가 wait() 함수를 호출하지 않은 프로세스&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 38px;&quot;&gt;부모 프로세스가 자식 프로세스가 종료되기 전 먼저 종료되어 wait()을 호출 할 수 없는 프로세스&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- exit()&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로세스를 종료하는 시스템 콜입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 자원을 반납한 뒤 부로프로세스에게 종료 상태를 나타내는 인자를 전달합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt; 1-2. 시스템&amp;nbsp;콜이,&amp;nbsp;운영체제에서&amp;nbsp;어떤&amp;nbsp;과정으로&amp;nbsp;실행되는지&amp;nbsp;설명해&amp;nbsp;주세요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜은 소프트웨어 인터럽트 방식으로 실행됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 제어가 인터럽트 벡터를 통해 운영체제 내의 서비스 루틴으로 전달됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 커널은 명령을 검사하여 어떤 시스템 콜이 발생하였는지 결정합니다.&amp;nbsp;&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;style3&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;1-3. 시스템&amp;nbsp;콜의&amp;nbsp;유형에&amp;nbsp;대해&amp;nbsp;설명해&amp;nbsp;주세요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜의 유형에는 &quot;프로세스 제어&quot;, &quot;파일 조작&quot;, &quot;장치 조작&quot;, &quot;정보 유지 보수&quot;, &quot;통신&quot;, &quot;보호&quot; 등으로 분류할 수 있습니다.&amp;nbsp;&lt;/p&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;b&gt;프로세스 제어&lt;span&gt;(Process Control)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;끝내기(end), 중지(abort)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;적재(load), 실행(execute)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;프로세스 생성(create process)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;프로세스 속성 획득과 설정(get process attribute and set process attribute)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;시간 대기(wait time)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;사건 대기(wait event)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;사건을 알림(signal event)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;메모리 할당 및 해제 : malloc, free&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 조작&lt;span&gt;(File Manipulation)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;파일 생성(create file), 파일 삭제(delete file)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;열기(open), 닫기(close)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;읽기(read), 쓰기(write), 위치 변경(reposition)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;파일 속성 획득 및 설정(get file attribute and set file attribute)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장치 관리&lt;span&gt;(Devide Management)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;장치를 요구(request devices), 장치를 방출release device)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;읽기, 쓰기, 위치 변경&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;장치 속성 획득, 장치 속성 설정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;장치의 논리적 부착(attach) 또는 분리(detach)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정보 유지&lt;span&gt;(Information Maintenance)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;시간과 날짜의 설정과 획득(time)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;시스템 데이터의 설정과 획득(date)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;프로세스 파일, 장치 속성의 획득 및 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;통신&lt;span&gt;(Communication)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;통신 연결의 생성, 제거&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;메시지의 송신, 수신&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;상태 정보 전달&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span&gt;원격 장치의 부착 및 분리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;보호(Protection)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;get file Permissions&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;set file permissions&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;1-4. 운영체제의&amp;nbsp;Dual&amp;nbsp;Mode&amp;nbsp;에&amp;nbsp;대해&amp;nbsp;설명해&amp;nbsp;주세요. &lt;/span&gt;&lt;/p&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&gt;시스템과 시스템 자원을 보호하기 커널모드와 유저모드로 구분하여 실행되는 작업을 구분하는 방식을 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&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;b&gt;&lt;span&gt;&lt;span&gt;커널 모드&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&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;컴퓨터 자원에 직접 접근이 가능한 모드입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;하드웨어 명령어, cpu 명령어를 사용할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;유저 모드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 자원에 직접 접근이 불가능한 모드입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;제한된 자원에만 접근할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;유저 애플리케이션 코드가 실행되는 모드입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;커널 모드로 전환을 요청할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt; 1-5. 왜&amp;nbsp;유저모드와&amp;nbsp;커널모드를&amp;nbsp;구분해야&amp;nbsp;하나요? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt; 1-6. 서로&amp;nbsp;다른&amp;nbsp;시스템&amp;nbsp;콜을&amp;nbsp;어떻게&amp;nbsp;구분할&amp;nbsp;수&amp;nbsp;있을까요? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 시스템 콜에는 번호가 할당됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 콜 인터페이스에서 관리되는 시스템 콜 테이블과 해당 시스템 콜 번호를 매핑하여 해당 함수를 실행합니다.&amp;nbsp;&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;style1&quot; /&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;a href=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot;&gt;VSFe/Tech-Interview (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1709118154335&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - VSFe/Tech-Interview&quot; data-og-description=&quot;Contribute to VSFe/Tech-Interview development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot; data-og-url=&quot;https://github.com/VSFe/Tech-Interview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cV9RAC/hyVukAz4yC/k8YjfmmpuL7hKqLb6DkYkK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/VSFe/Tech-Interview/tree/main?tab=readme-ov-file&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cV9RAC/hyVukAz4yC/k8YjfmmpuL7hKqLb6DkYkK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - VSFe/Tech-Interview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to VSFe/Tech-Interview development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[cs] 기술면접준비</category>
      <category>기술면접</category>
      <category>듀얼 모드</category>
      <category>시스템 콜</category>
      <category>운영체제</category>
      <category>커널 모드</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/207</guid>
      <comments>https://spongerice.tistory.com/207#entry207comment</comments>
      <pubDate>Wed, 28 Feb 2024 21:43:31 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 11기] 혼공 챌린지 완주 후기</title>
      <link>https://spongerice.tistory.com/206</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQ7in/btsEQcO6jm1/BFric8cgnerr1vdcrD1ZE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQ7in/btsEQcO6jm1/BFric8cgnerr1vdcrD1ZE1/img.png&quot; data-alt=&quot;혼공 학습단 11기 모집&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQ7in/btsEQcO6jm1/BFric8cgnerr1vdcrD1ZE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQ7in%2FbtsEQcO6jm1%2FBFric8cgnerr1vdcrD1ZE1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;380&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼공 학습단 11기 모집&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기간: 2024년 1월 2일 ~ 2월 15일 (약 6주)&lt;/li&gt;
&lt;li&gt;선택 교재: 혼자 공부하는 컴퓨터 구조 + 운영체제&amp;nbsp;&lt;/li&gt;
&lt;li&gt;관련 링크: &lt;a href=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot;&gt;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내 &amp;raquo; 혼자 공부하는 책 (hanbit.co.kr)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1707976796507&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내&quot; data-og-description=&quot;&amp;nbsp; 안녕하세요, 한빛미디어 혼공학습단의  &amp;zwj;♀️혼공족장 &amp;zwj;♀️입니다. 혼공학습단 활동과 도서별 커리큘럼 안내 드립니다. &amp;nbsp; 11기 활동 기간 1주차: 1월 2일 ~ 1월 7일 2주차: 1월 8일 ~ 1월 14&quot; data-og-host=&quot;hongong.hanbit.co.kr&quot; data-og-source-url=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot; data-og-url=&quot;https://hongong.hanbit.co.kr/?kboard_content_redirect=142&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bCwRly/hyVjjXJaWK/Yt5SkwpncI8TxaH55sISoK/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080,https://scrap.kakaocdn.net/dn/cHqhoX/hyVm0oGRMM/c1iOHWyWdDI0HbiLbkOXr1/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080&quot;&gt;&lt;a href=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bCwRly/hyVjjXJaWK/Yt5SkwpncI8TxaH55sISoK/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080,https://scrap.kakaocdn.net/dn/cHqhoX/hyVm0oGRMM/c1iOHWyWdDI0HbiLbkOXr1/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 안녕하세요, 한빛미디어 혼공학습단의  &amp;zwj;♀️혼공족장 &amp;zwj;♀️입니다. 혼공학습단 활동과 도서별 커리큘럼 안내 드립니다. &amp;nbsp; 11기 활동 기간 1주차: 1월 2일 ~ 1월 7일 2주차: 1월 8일 ~ 1월 14&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hongong.hanbit.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24년 1월 1주차 부터 약 6주간 혼공학습단 11기에 참여했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적인 취업 준비에 앞서 전공 지식을 다시 한번 복습하면 좋을 것 같아 신청하게 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21년에 혼공 학습단 6기에 참여했던 기억도 나서 더 열심히 참여할 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼공 학습단 6기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/124&quot;&gt;[혼공 학습단 6기] 혼자 공부하는 자바_나만의 혼공 노트 공유하기 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707977265886&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공 학습단 6기] 혼자 공부하는 자바_나만의 혼공 노트 공유하기&quot; data-og-description=&quot;#혼공챌린지 #혼종자 #혼공단 방학 동안 혼공 챌린지에 참여하며 자바를 공부했던 노트들을 공유합니다. 그동안 작성하여 업로드했던 필기 포스팅은 챌린지 미션과 함께 제출했기에 이전까지 &quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/124&quot; data-og-url=&quot;https://spongerice.tistory.com/124&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h4gdT/hyVmVAUINV/BUEWwKIlbJuy9ALpT3pvxK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bTiOiE/hyVjcEifzr/SBMmw7VI9gwlSubWkfDwu0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/6SlQr/hyVm3lpUsd/ERX6hE0WVKF1O5zTauNpB1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/124&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/124&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h4gdT/hyVmVAUINV/BUEWwKIlbJuy9ALpT3pvxK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bTiOiE/hyVjcEifzr/SBMmw7VI9gwlSubWkfDwu0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/6SlQr/hyVm3lpUsd/ERX6hE0WVKF1O5zTauNpB1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공 학습단 6기] 혼자 공부하는 자바_나만의 혼공 노트 공유하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;#혼공챌린지 #혼종자 #혼공단 방학 동안 혼공 챌린지에 참여하며 자바를 공부했던 노트들을 공유합니다. 그동안 작성하여 업로드했던 필기 포스팅은 챌린지 미션과 함께 제출했기에 이전까지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 혼자 공부하는 것 보다 함께 하는 것이 동기 부여와 목표 달성에 좋은 것 같아요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼공챌린지 덕분에 중간에 포기하지 않고 한 권의 책을 완독 할 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;주차별 미션&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cklQR8/btsESnh3X5Y/ORyL4HxPfkqpmX7BwAp1c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cklQR8/btsESnh3X5Y/ORyL4HxPfkqpmX7BwAp1c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cklQR8/btsESnh3X5Y/ORyL4HxPfkqpmX7BwAp1c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcklQR8%2FbtsESnh3X5Y%2FORyL4HxPfkqpmX7BwAp1c1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;437&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&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;a href=&quot;https://spongerice.tistory.com/189&quot;&gt;[혼공학습단 11기] 혼공컴운 1주차 미션 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707977302768&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공학습단 11기] 혼공컴운 1주차 미션&quot; data-og-description=&quot;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내 &amp;raquo; 혼자 공부하는 책 (hanbit.co.kr) [혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내 안녕하세요, 한빛미디어 혼공학습단의  &amp;zwj;♀️&quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/189&quot; data-og-url=&quot;https://spongerice.tistory.com/189&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/badHBZ/hyVm12cxyJ/KFoulBsbX00UKwOAl0Icz0/img.png?width=800&amp;amp;height=511&amp;amp;face=0_0_800_511,https://scrap.kakaocdn.net/dn/NPEk7/hyVmT4aml1/IKvyhhaiK2SJwLTeFXKTkk/img.png?width=800&amp;amp;height=511&amp;amp;face=0_0_800_511,https://scrap.kakaocdn.net/dn/zcx2V/hyVmQ0FXdx/g3xU4Sl4DSpsnvuICJ5B50/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/189&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/badHBZ/hyVm12cxyJ/KFoulBsbX00UKwOAl0Icz0/img.png?width=800&amp;amp;height=511&amp;amp;face=0_0_800_511,https://scrap.kakaocdn.net/dn/NPEk7/hyVmT4aml1/IKvyhhaiK2SJwLTeFXKTkk/img.png?width=800&amp;amp;height=511&amp;amp;face=0_0_800_511,https://scrap.kakaocdn.net/dn/zcx2V/hyVmQ0FXdx/g3xU4Sl4DSpsnvuICJ5B50/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 혼공컴운 1주차 미션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내 &amp;raquo; 혼자 공부하는 책 (hanbit.co.kr) [혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내 안녕하세요, 한빛미디어 혼공학습단의  &amp;zwj;♀️&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1주차에는 컴퓨터 구조가 무엇인지, 컴퓨터에 사용되는 데이터와 명령어를 어떤 방식으로 표기하는 방법을 배웠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기초적인 부분이라 대충 보고 넘어가기 쉬운데 내용을 하나씩 정리하며 탄탄하게 기초를 다질 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 학습할 내용들에 기반이 되는 부분이라 꼼꼼하게 공부한 것이 많은 도움이 되었습니다.&amp;nbsp;&lt;/p&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;a href=&quot;https://spongerice.tistory.com/192&quot;&gt;[혼공학습단 11기] 혼공컴운 2주차 미션 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707977505319&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공학습단 11기] 혼공컴운 2주차 미션&quot; data-og-description=&quot;기본 미션 1. P.125 확인 문제 2번 문제 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워보세요 [프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터] (1): 연산 결과 혹은 CPU 상&quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/192&quot; data-og-url=&quot;https://spongerice.tistory.com/192&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LHJCP/hyVm4YVHXb/ihvDGGM9nGHCdcQsKVYmn1/img.png?width=300&amp;amp;height=170&amp;amp;face=0_0_300_170,https://scrap.kakaocdn.net/dn/EUhTq/hyVm1umstl/PCAKaWtqFUKy50xwSJB140/img.png?width=300&amp;amp;height=170&amp;amp;face=0_0_300_170,https://scrap.kakaocdn.net/dn/eYOzc/hyVjikfgeM/HkVFQkUmgoI5W1uAN9OwrK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/192&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/192&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LHJCP/hyVm4YVHXb/ihvDGGM9nGHCdcQsKVYmn1/img.png?width=300&amp;amp;height=170&amp;amp;face=0_0_300_170,https://scrap.kakaocdn.net/dn/EUhTq/hyVm1umstl/PCAKaWtqFUKy50xwSJB140/img.png?width=300&amp;amp;height=170&amp;amp;face=0_0_300_170,https://scrap.kakaocdn.net/dn/eYOzc/hyVjikfgeM/HkVFQkUmgoI5W1uAN9OwrK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 혼공컴운 2주차 미션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본 미션 1. P.125 확인 문제 2번 문제 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워보세요 [프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터] (1): 연산 결과 혹은 CPU 상&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2주차에는 컴퓨터의 핵심 부품인 cpu에 대해 자세히 공부하는 시간이었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 장치와 작동 원리들을 학습하며 컴퓨터에 더 다가갈 수 있었습니다.&amp;nbsp;&lt;/p&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;a href=&quot;https://spongerice.tistory.com/196&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spongerice.tistory.com/196&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707977619871&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공학습단 11기] 혼공컴운 3주차 미션&quot; data-og-description=&quot;기본 미션 1. P.185 확인 문제 3번 문제 3. 다음 설명을 읽고 SRAM에 대한 설명인지 DRAM에 대한 설명인지 쓰세요. [보기| SRAM, DRAM] - 주로 캐시 메모리로 활용됩니다. [ (1) ] - 주로 주기억장치로 활용됩&quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/196&quot; data-og-url=&quot;https://spongerice.tistory.com/196&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/w6iGU/hyVjjKbszs/XMMGzwvxBK5d2KozgVp0pK/img.png?width=734&amp;amp;height=612&amp;amp;face=0_0_734_612,https://scrap.kakaocdn.net/dn/bdfwRp/hyVm0CdTod/cNy0uOyK7cQHAco7wLnUI1/img.png?width=734&amp;amp;height=612&amp;amp;face=0_0_734_612,https://scrap.kakaocdn.net/dn/be43IK/hyVmUWjdBu/mE0Fjta0lgZ3sYKtOS2je0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/196&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/196&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/w6iGU/hyVjjKbszs/XMMGzwvxBK5d2KozgVp0pK/img.png?width=734&amp;amp;height=612&amp;amp;face=0_0_734_612,https://scrap.kakaocdn.net/dn/bdfwRp/hyVm0CdTod/cNy0uOyK7cQHAco7wLnUI1/img.png?width=734&amp;amp;height=612&amp;amp;face=0_0_734_612,https://scrap.kakaocdn.net/dn/be43IK/hyVmUWjdBu/mE0Fjta0lgZ3sYKtOS2je0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 혼공컴운 3주차 미션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본 미션 1. P.185 확인 문제 3번 문제 3. 다음 설명을 읽고 SRAM에 대한 설명인지 DRAM에 대한 설명인지 쓰세요. [보기| SRAM, DRAM] - 주로 캐시 메모리로 활용됩니다. [ (1) ] - 주로 주기억장치로 활용됩&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3주차에는 cpu를 제외한 다른 부품들의 작동 방식에 대해 학습하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양이 많아 조금 힘들었지만 그동안 잊고 있던 컴퓨터 장치들에 대해 학습할 수 있어 의미 있던 시간이었습니다.&amp;nbsp;&lt;/p&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;a href=&quot;https://spongerice.tistory.com/200&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spongerice.tistory.com/200&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707977776028&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공학습단 11기] 혼공컴운 4주차 미션&quot; data-og-description=&quot;기본 미션 1. P.304 확인 문제 1번 문제 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. 1부터 5까지 올바른 상태를 적어보세요 정답 생성 상태 준비 상태 실행 상태 종료 상태 &quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/200&quot; data-og-url=&quot;https://spongerice.tistory.com/200&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/baeO8S/hyVjfVms7a/iUYnLlRA3IedmJuM2PnUZk/img.png?width=459&amp;amp;height=223&amp;amp;face=0_0_459_223,https://scrap.kakaocdn.net/dn/RWGb9/hyVmQ7rBMn/s7vQ9ZXGEBSkKjH3mABLH0/img.png?width=459&amp;amp;height=223&amp;amp;face=0_0_459_223,https://scrap.kakaocdn.net/dn/7SzSU/hyVjnMBMT2/AvCDgUcoYOX61piGwcVza1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/200&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/200&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/baeO8S/hyVjfVms7a/iUYnLlRA3IedmJuM2PnUZk/img.png?width=459&amp;amp;height=223&amp;amp;face=0_0_459_223,https://scrap.kakaocdn.net/dn/RWGb9/hyVmQ7rBMn/s7vQ9ZXGEBSkKjH3mABLH0/img.png?width=459&amp;amp;height=223&amp;amp;face=0_0_459_223,https://scrap.kakaocdn.net/dn/7SzSU/hyVjnMBMT2/AvCDgUcoYOX61piGwcVza1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 혼공컴운 4주차 미션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본 미션 1. P.304 확인 문제 1번 문제 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. 1부터 5까지 올바른 상태를 적어보세요 정답 생성 상태 준비 상태 실행 상태 종료 상태&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4주차에는 컴퓨터 구조를 넘어 운영체제를 학습하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스, 스레드와 같이 헷갈릴 수 있는 용어를 명확하게 학습하고 스케줄링 방식에 대해 학습하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 단원에서 cpu의 동작 과정을 학습하였기에 보다 쉽게 이해할 수 있었습니다.&amp;nbsp;&lt;/p&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;a href=&quot;https://spongerice.tistory.com/202&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spongerice.tistory.com/202&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707977972567&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공 학습단 11기] 5주차 미션&quot; data-og-description=&quot;기본 미션 p.363 확인 문제 1번 1. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요. ① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹&quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/202&quot; data-og-url=&quot;https://spongerice.tistory.com/202&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VI12a/hyVm206VNF/kkS32kKREh7IQFGxkA3Pn0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jepDD/hyVm0WwGIQ/emH6HtHEiBQdzAKoMYSBb0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/lhrXh/hyVmZ4of7E/s8sB1ffLO8AZqiqkndUV2k/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/202&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/202&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VI12a/hyVm206VNF/kkS32kKREh7IQFGxkA3Pn0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jepDD/hyVm0WwGIQ/emH6HtHEiBQdzAKoMYSBb0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/lhrXh/hyVmZ4of7E/s8sB1ffLO8AZqiqkndUV2k/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공 학습단 11기] 5주차 미션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본 미션 p.363 확인 문제 1번 1. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요. ① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5주 차에는 프로세스 동기화와 교착 상태에 대해 학습하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 면접에서 교착 상태에 대한 질문에 명확한 답을 하지 못한 경험이 있어서...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 면접에서는 반드시 명확하게 이야기해야 한다는 생각으로! 더욱 신경 써서 공부하였습니다.&amp;nbsp;&lt;/p&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;/p&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;a href=&quot;https://spongerice.tistory.com/205&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spongerice.tistory.com/205&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707978138860&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공 학습단 11기] 6주차 미션&quot; data-og-description=&quot;기본 미션 p.400 확인 문제 1번 1. 메모리 할당 방식에 대한 설명으로 올바른 것을 다음 보기에서 찾아 써 보세요. (보기) 최초 적합, 최적 적합, 최악 접합 (①): 최초로 발견한 적재 가능한 빈 공간&quot; data-og-host=&quot;spongerice.tistory.com&quot; data-og-source-url=&quot;https://spongerice.tistory.com/205&quot; data-og-url=&quot;https://spongerice.tistory.com/205&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jP3Yt/hyVjmmBjqD/bWC7ctuCfDR77sF1MqEy8k/img.png?width=800&amp;amp;height=1130&amp;amp;face=0_0_800_1130,https://scrap.kakaocdn.net/dn/XK0U2/hyVm36MXLe/CuG4qnwKpBxv7fFMkVQS50/img.png?width=800&amp;amp;height=1130&amp;amp;face=0_0_800_1130,https://scrap.kakaocdn.net/dn/cUYYEF/hyVjhS7wPM/xsunMD5pn1zuXYKsjdQSj0/img.png?width=960&amp;amp;height=1357&amp;amp;face=0_0_960_1357&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/205&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spongerice.tistory.com/205&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jP3Yt/hyVjmmBjqD/bWC7ctuCfDR77sF1MqEy8k/img.png?width=800&amp;amp;height=1130&amp;amp;face=0_0_800_1130,https://scrap.kakaocdn.net/dn/XK0U2/hyVm36MXLe/CuG4qnwKpBxv7fFMkVQS50/img.png?width=800&amp;amp;height=1130&amp;amp;face=0_0_800_1130,https://scrap.kakaocdn.net/dn/cUYYEF/hyVjhS7wPM/xsunMD5pn1zuXYKsjdQSj0/img.png?width=960&amp;amp;height=1357&amp;amp;face=0_0_960_1357');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공 학습단 11기] 6주차 미션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본 미션 p.400 확인 문제 1번 1. 메모리 할당 방식에 대한 설명으로 올바른 것을 다음 보기에서 찾아 써 보세요. (보기) 최초 적합, 최적 적합, 최악 접합 (①): 최초로 발견한 적재 가능한 빈 공간&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spongerice.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 주차인 6주 차에는 가상 메모리와 파일 시스템에 대해 학습하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 메모리 부분은 계산도 복잡하고 꽤나 머리 아픈 부분이라 생각하고 있었는데&amp;nbsp;&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;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6주 동안 한 권의 책을 완독 하며 컴퓨터 구조, 운영체제의 지식을 체계적으로 학습할 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 혼공학습단 덕분에 블로그에 학습한 내용을 정리하는 습관이 생긴 것 같아요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종종 공부한 내용을 정리해서 블로그에 올려보려 합니다!&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 분들이 올리시는 글들 보면서 여러 공부 방식과 접근 방식도 학습할 수 있어서 좋았어요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 혼공족장님께서 각 주차별 미션에 정성스런 댓글도 남겨주시고 간식도 많이 주셔서 더 힘내서 완주할 수 있었습니다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 취준생을 위한 깜짝 설 선물 이벤트도 당첨되어 교재도 받았습니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 교재 후기도 조만간에 업로드 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다~~&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <category>혼공챌린지</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/206</guid>
      <comments>https://spongerice.tistory.com/206#entry206comment</comments>
      <pubDate>Thu, 15 Feb 2024 15:33:15 +0900</pubDate>
    </item>
    <item>
      <title>[혼공 학습단 11기] 6주차 미션</title>
      <link>https://spongerice.tistory.com/205</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;기본 미션&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;p.400 확인 문제 1번&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 메모리 할당 방식에 대한 설명으로 올바른 것을 다음 보기에서 찾아 써 보세요.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(보기) 최초 적합, 최적 적합, 최악 접합&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(①): 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(②): 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(③): 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;정답&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;① : 최초 적합&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;②: 최악 적합&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;③: 최적 적합&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;해설&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;메모리 할당 방식&lt;/span&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;u&gt;최소 적합&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적재할 수 있는 공간을 발견하면 바로 그 공간에 프로세스 배치&amp;nbsp;&lt;/li&gt;
&lt;li&gt;검색 최소화, 빠른 할당&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;최적 적합&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적재할 수 있는 공간 중 가장 작은 공간에 프로세스 배치&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;최악 적합&lt;/u&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적재할 수 있는 공간 중 가장 큰 공간에 프로세스 배치&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;선택 미션&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;Ch.14(14-3) 프로세스가 사용할 수 있는 프레임이 3개 있고, 페이지 참조열이 '2313523423' 일 때 LRU 페이지 교체 알고리즘으로 이 페이지를 참조한다면 몇 번의 페이지 폴트가 발생하는지 풀어보기&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;정답&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3회&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;풀이&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZepS6/btsETWcNJUZ/3OsiIK18PaMltp5KSI8gB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZepS6/btsETWcNJUZ/3OsiIK18PaMltp5KSI8gB1/img.png&quot; data-alt=&quot;LRU 페이지 교체 알고리즘 작동 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZepS6/btsETWcNJUZ/3OsiIK18PaMltp5KSI8gB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZepS6%2FbtsETWcNJUZ%2F3OsiIK18PaMltp5KSI8gB1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;1357&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1357&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LRU 페이지 교체 알고리즘 작동 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em;&quot;&gt;추가 개념 - 페이지 교체 알고리즘&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행할 페이지를 담을 공간을 만들기 위해 기존의 페이지를 보조기억장치로 내보낼 때 사용&amp;nbsp;&lt;/li&gt;
&lt;li&gt;찾아낼 페이지를 결정하는 방법&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;페이지 참조열&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 폴트 횟수를 알 수 있는 정보&amp;nbsp;&lt;/li&gt;
&lt;li&gt;cpu가 참조하는 페이지들 중 연속된 페이지를 생략한 페이지열&amp;nbsp;&lt;/li&gt;
&lt;li&gt;2 2 2 3 5 5 3 3 7 -&amp;gt; 2 3 5 3 7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;FIFO 페이지 교체 알고리즘&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리에 가장 먼저 올라온 페이지부터 내쫓는 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUKapi/btsEVgB3KkQ/6JnBzpYLZKcl4MBs9gnSW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUKapi/btsEVgB3KkQ/6JnBzpYLZKcl4MBs9gnSW1/img.png&quot; data-alt=&quot;FIFO 페이지 교체 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUKapi/btsEVgB3KkQ/6JnBzpYLZKcl4MBs9gnSW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUKapi%2FbtsEVgB3KkQ%2F6JnBzpYLZKcl4MBs9gnSW1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;214&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FIFO 페이지 교체 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 내내 사용할 페이지이지만 먼저 적재되어 쫓아내면 좋지 않다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 2차 기회 페이지 교체 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; FIFO 방식에 참조비트를 사용하여 기회를 한 번 더 주는 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;최적 페이지 교체 알고리즘&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU에 의해 참조되는 횟수를 고려하는 페이지 교체 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래 남아야 할 페이지: 자주 사용될 페이지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랫동안 사용되지 않을 페이지: 자주 사용되지 않을 페이지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 오랜 기간 머물렀다고 내쫓는 것은 비합리적&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b34G4P/btsETYV1kzV/coeuMLBvsCug1ty4W9VAH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b34G4P/btsETYV1kzV/coeuMLBvsCug1ty4W9VAH1/img.png&quot; data-alt=&quot;최적 페이지 교체 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b34G4P/btsETYV1kzV/coeuMLBvsCug1ty4W9VAH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb34G4P%2FbtsETYV1kzV%2FcoeuMLBvsCug1ty4W9VAH1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;208&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최적 페이지 교체 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;LRU 페이지 교체 알고리즘&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 오랫동안 사용되지 않은 페이지를 교체하는 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zQyEC/btsERlkmO3l/MDg1NjyODik79Ia8auo800/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zQyEC/btsERlkmO3l/MDg1NjyODik79Ia8auo800/img.png&quot; data-alt=&quot;LRU 페이지 교체 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zQyEC/btsERlkmO3l/MDg1NjyODik79Ia8auo800/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzQyEC%2FbtsERlkmO3l%2FMDg1NjyODik79Ia8auo800%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;213&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LRU 페이지 교체 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>혼공컴운</category>
      <category>혼공학습단</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/205</guid>
      <comments>https://spongerice.tistory.com/205#entry205comment</comments>
      <pubDate>Thu, 15 Feb 2024 14:15:48 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 14. 가상 메모리</title>
      <link>https://spongerice.tistory.com/204</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;14-1. 연속 메모리 할당&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연속 메모리 할당: 프로세스에 연속적인 메모리 공간을 할당하는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;스와핑&lt;/span&gt;&lt;/span&gt;&lt;/p&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;u&gt;스왑 영역&lt;/u&gt;: 프로세스들이 쫒겨나는 보조기억장치의 일부 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;u&gt;스왑 아웃&lt;/u&gt;: 현재 실행되지 않는 프로세스가 스왑 영역으로 옮겨지는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;u&gt;스왑 인&lt;/u&gt;: 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것 (이전과 다른 메모리 주소에 적재될 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 실제 메모리 크기보다 요구하는 메모리가 클 때 활용 가능&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyzIj/btsETp0e8IL/k2mYCBRDneSFRhnKKWiXNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyzIj/btsETp0e8IL/k2mYCBRDneSFRhnKKWiXNK/img.png&quot; data-alt=&quot;스와핑&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyzIj/btsETp0e8IL/k2mYCBRDneSFRhnKKWiXNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkyzIj%2FbtsETp0e8IL%2Fk2mYCBRDneSFRhnKKWiXNK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;303&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스와핑&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;메모리 할당&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;최소 적합&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적재할 수 있는 공간을 발견하면 바로 그 공간에 프로세스 배치&amp;nbsp;&lt;/li&gt;
&lt;li&gt;검색 최소화, 빠른 할당&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;최적 적합&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적재할 수 있는 공간 중 가장 작은 공간에 프로세스 배치&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;최악 적합&lt;/u&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적재할 수 있는 공간 중 가장 큰 공간에 프로세스 배치&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;외부 단편화&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 연속으로 할당 할 때 생기는 문제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 외부에 생기는 빈 공간 (적재할 프로세스의 크기보다 작아 적재가 불가능) -&amp;gt; 메모리 낭비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결 방법&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 메모리 압축 (메모리 조각 모음) : 여기저기 흩어져 있는 공간을 하나로 모으는 방식&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 오버헤드, 시스템 중지&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 페이징/세그멘테이션 기법&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;14-2. 페이징을 통한 가상 메모리 관리&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행할 프로그램의 일부만 메모리에 적재하여 실제 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;페이징이란&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;u&gt;페이지&lt;/u&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;color: #f89009;&quot;&gt;프로세스&lt;/span&gt;의 논리 주소 공간을 일정한 크기로 자른 것&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;프레임&lt;/u&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;color: #f89009;&quot;&gt;메모리&lt;/span&gt;의 주소 공간을 페이지 크기로 자른 것&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 프로세스를 페이지 단위로 자르고, 메모리를 프레임 단위(페이지와 동일)로 자르고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지를 프레임에 할당하는 방식&amp;nbsp;&amp;nbsp;&lt;/p&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;color: #f89009;&quot;&gt;페이지 단위로 스와핑&lt;/span&gt;된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;페이지 테이블 &lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 페이지가 어디에 적재되었는지 찾을 수 있음&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 테이블 베이스 레지스터 (PTBR)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 테이블이 적재된 메모리 공간을 담은 레지스터&amp;nbsp;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FUSkI/btsES0TZ2Xp/1fnKJ0epSLTpkaz4iPqcfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FUSkI/btsES0TZ2Xp/1fnKJ0epSLTpkaz4iPqcfK/img.png&quot; data-alt=&quot;페이지 프레임 레지스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FUSkI/btsES0TZ2Xp/1fnKJ0epSLTpkaz4iPqcfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFUSkI%2FbtsES0TZ2Xp%2F1fnKJ0epSLTpkaz4iPqcfK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;202&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;페이지 프레임 레지스터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;TLB&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 테이블 캐시&amp;nbsp;&lt;/li&gt;
&lt;li&gt;페이지 테이블의 일부를 참조 지역성에 근거하여 저장&amp;nbsp;&lt;/li&gt;
&lt;li&gt;페이지 테이블을 메모리에 두었을 때 메모리 접근 시간이 두 배로 늘어나는 것을 막는 방법 (1. 페이지 테이블 보기, 2. 프레임 접근하기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;TLB 히트&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발생한 논리주소에 대한 페이지 번호가 TLB에 있을 경우&amp;nbsp;&lt;/li&gt;
&lt;li&gt;메모리에 접근하지 않아도 된다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;TLB 미스&lt;/u&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TLB에 페이지 번호가 없어 메모리 내의 페이지 테이블에 접근하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;내부 단편화&lt;/span&gt;&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;페이징에서의 주소 변환&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 접근하고자 하는 페이지/프레임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 해당 주소가 얼마나 떨어져 있는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 주소에 접근하려면 이 두 가지 정보가 필요함&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;페이지 번호&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접근할 페이지 번호&lt;/li&gt;
&lt;li&gt;어떤 프레임에 할당 되었는지 알 수 있음&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;변위&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접근 주소가 프레임의 시작 번지로부터 얼마나 떨어져 있는지&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 논리 주소 &amp;lt;페이지 번호, 변위&amp;gt; -&amp;gt; 물리 주소 &amp;lt;프레임 번호, 변위&amp;gt;로 변환&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임 번호 시작 주소 + 변위 =&amp;gt; 실제로 적재되어 있는 공간&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;페이지 테이블 엔트리 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;u&gt;유효 비트&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 페이지 접근 가능 여부 제공&amp;nbsp;&lt;/li&gt;
&lt;li&gt;0: 적재 x, 1: 적재 o&lt;/li&gt;
&lt;li&gt;페이지 폴트 : 적재되어 있지 않은 페이지로 접근할 때 발생하는 예외&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터럽트와 유사한 방식으로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;보호 비트&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;읽고 쓰기 가능 여부 제공&lt;/li&gt;
&lt;li&gt;rwx&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;참조 비트&lt;/u&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cpu가 접근한 적 있는지 여부 제공&amp;nbsp;&lt;/li&gt;
&lt;li&gt;1: 접근 한 적 있음, 0: 접근한 적 없음&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;수정 비트 (더티 비트)&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 페이지에 데이터를 쓴 적이 있는지&amp;nbsp;&lt;/li&gt;
&lt;li&gt;1: 변경 된 적 있음, 0: 변경된 적 없음&amp;nbsp;&lt;/li&gt;
&lt;li&gt;페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지 알려주는 역할&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;14-3. 페이지 교체와 프레임 할당&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;요구 페이징&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 페이지만을 메모리에 적재하는 기법&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. cpu 가 특정 페이지에 접근하는 명령어 실행&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 해당 페이지가 현재 메모리에 있을 경우 cpu는 페이지가 적재된 프레임에 접근한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 해당 페이지가 현재 메모리에 없을 경우 페이지 폴트가 발생한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 페이지 폴트를 처리한다 (해당 페이지를 메모리로 적재하고, 유효 비트를 1로 설정한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 1번 부터 다시 수행한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;순수 요구 페이징&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아무런 페이지도 메모리에 적재하지 않고 실행부터 하는 것&amp;nbsp;&lt;/li&gt;
&lt;li&gt;첫 명령어 부터 페이지 폴트 발생&amp;nbsp;&lt;/li&gt;
&lt;li&gt;적재 이후로는 페이지 폴트 발생 빈도가 낮아짐&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;페이지 교체 알고리즘 &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행할 페이지를 담을 공간을 만들기 위해 기존의 페이지를 보조기억장치로 내보낼 때 사용&amp;nbsp;&lt;/li&gt;
&lt;li&gt;찾아낼 페이지를 결정하는 방법&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;페이지 참조열&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 폴트 횟수를 알 수 있는 정보&amp;nbsp;&lt;/li&gt;
&lt;li&gt;cpu가 참조하는 페이지들 중 연속된 페이지를 생략한 페이지열&amp;nbsp;&lt;/li&gt;
&lt;li&gt;2 2 2 3 5 5 3 3 7 -&amp;gt; 2 3 5 3 7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;FIFO 페이지 교체 알고리즘&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리에 가장 먼저 올라온 페이지부터 내쫓는 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciCnvG/btsEVcM5GIo/ESp4xBvhgkoJm6q5cu2Ki0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciCnvG/btsEVcM5GIo/ESp4xBvhgkoJm6q5cu2Ki0/img.png&quot; data-alt=&quot;FIFO 페이지 교체 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciCnvG/btsEVcM5GIo/ESp4xBvhgkoJm6q5cu2Ki0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciCnvG%2FbtsEVcM5GIo%2FESp4xBvhgkoJm6q5cu2Ki0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;214&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FIFO 페이지 교체 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 내내 사용할 페이지이지만 먼저 적재되어 쫓아내면 좋지 않다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 2차 기회 페이지 교체 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; FIFO 방식에 참조비트를 사용하여 기회를 한 번 더 주는 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;최적 페이지 교체 알고리즘&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU에 의해 참조되는 횟수를 고려하는 페이지 교체 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래 남아야 할 페이지: 자주 사용될 페이지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랫동안 사용되지 않을 페이지: 자주 사용되지 않을 페이지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 오랜 기간 머물렀다고 내쫓는 것은 비합리적&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BmH7Z/btsETnO9kyp/MLTPYUuH5KIDIDFauVxRyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BmH7Z/btsETnO9kyp/MLTPYUuH5KIDIDFauVxRyk/img.png&quot; data-alt=&quot;최적 페이지 교체 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BmH7Z/btsETnO9kyp/MLTPYUuH5KIDIDFauVxRyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBmH7Z%2FbtsETnO9kyp%2FMLTPYUuH5KIDIDFauVxRyk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;208&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최적 페이지 교체 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;LRU 페이지 교체 알고리즘&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 오랫동안 사용되지 않은 페이지를 교체하는 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWi8MJ/btsEVIdWasF/avfaJcMTFzIHp9ASswodz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWi8MJ/btsEVIdWasF/avfaJcMTFzIHp9ASswodz0/img.png&quot; data-alt=&quot;LRU 페이지 교체 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWi8MJ/btsEVIdWasF/avfaJcMTFzIHp9ASswodz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWi8MJ%2FbtsEVIdWasF%2FavfaJcMTFzIHp9ASswodz0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;213&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LRU 페이지 교체 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;스래싱과 프레임 할당&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 폴트가 자주 발생하는 이유&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 나쁜 페이지 교체 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프로세스가 사용할 수 있는 프레임 수가 적을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;스래싱&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이징에 소요되는 시간이 프로세스가 실제 실행되는 시간보다 커 성능이 저해되는 문제&lt;u&gt;&lt;/u&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티프로그래밍의 정도&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리에서 동시에 실행되는 프로세스의 수&amp;nbsp;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프레임 할당 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스들이 무리없이 실행될 수 있는 최소한의 프레임 수를 파악하여 할당하는 방식&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;균등 할당 (정적 할당)&lt;/u&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 프로세스에게 동일한 개수의 프레임을 할당&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;비례 할당 (정적 할당)&lt;/u&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 크기에 비례하여 프레임을 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;작업 집합 모델 (동적 할당)&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 일정 기간 동안 참조한 페이지 집합 (작업 집합)을 기억하여 프레임 할당&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;페이지 폴트 빈도&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 폴드율이 높으면 해당 프로세스는 너무 적은 프레임을 가지고 있는 것 (폴트의 상한과 하한을 정함)&lt;/li&gt;
&lt;li&gt;해당 내용을 기반으로 프레임 할당&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>가상메모리</category>
      <category>페이지 교체</category>
      <category>페이징</category>
      <category>프레임</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/204</guid>
      <comments>https://spongerice.tistory.com/204#entry204comment</comments>
      <pubDate>Thu, 15 Feb 2024 14:05:42 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 13. 교착 상태</title>
      <link>https://spongerice.tistory.com/203</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;13-1. 교착 상태란&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 교착 상태: 두 개 이상의 프로세스가 자원을 기다리며 진행이 멈춰 버리는 현상&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;식사하는 철학자 문제 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동그란 원탁에 5명의 철학자, 5개의 음식, 5개의 포크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음식은 2개의 포크로 먹을 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식사 진행 순서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 왼쪽 포크가 사용 가능하면 집어 든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 오른쪽 포크가 사용 가능하면 집어 든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 포크 2개를 집어 들면 정해진 시간 동안 식사를 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 식사 시간이 끝나면 오른쪽 포크를 내려놓는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 왼쪽 포크를 내려 놓는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 1 ~ 5 과정을 반복한다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 철학자가 동시에 포크를 들어 식사를 하면 어떤 철학자도 식사를 할 수 없다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모든 철학자는 다른 철학자가 포크를 내려놓을 때까지 기다려야 한다&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style6&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;프로세스 / 스레드&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;자원&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;대기&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;임계 구역&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;철학자&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;포크&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;생각&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;포크&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;자원 할당 그래프&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 원: 프로세스, 사각형: 자원의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 점: 사용할 수 있는 자원의 개수는 사각형 내에 점으로 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 화살표 (자원 -&amp;gt; 프로세스): 자원을 사용중일 때&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 화살표 (프로세스 -&amp;gt; 자원): 자원을 대기 중일 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AkE59/btsEqV6B0mQ/ZQN3FHzvKgBKnyFeW8dwQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AkE59/btsEqV6B0mQ/ZQN3FHzvKgBKnyFeW8dwQK/img.png&quot; data-alt=&quot;식사하는 철학자 문제 자원 할당 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AkE59/btsEqV6B0mQ/ZQN3FHzvKgBKnyFeW8dwQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAkE59%2FbtsEqV6B0mQ%2FZQN3FHzvKgBKnyFeW8dwQK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;299&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;식사하는 철학자 문제 자원 할당 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 교착 상태가 일어난 그래프는 자원 할당 그래프가 원의 형태를 띤다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;교착 상태 발생 조건&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상호 배제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 점유와 대기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 비선점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 원형 대기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 상호 배제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 점유와 대기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 비선점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다른 프로세스의 자원을 강제로 빼앗을 수 없는 상태&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 원형 대기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;13-2. 교착 상태 해결 방법&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예방, 회피, 검출, 회복&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;교착 상태 예방&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;교착 상태 필요 조건 4가지 중 하나를 충족하지 못하게 하면 된다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 상호 배제 제거&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 자원을 사용 가능하게 만든다 (현실적으로는 힘듦)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 점유 대기 제거&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;포크를 두 개 동시에 들게 하거나, 아예 들지 못하게 하는 것&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 한 프로세스에 필요한 자원을 몰아주는 방식으로 동작&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필요해도 대기해야 하고, 사용하지 않으면서 오래 할당받는 자원을 다수 양산하기에 활용률이 낮음&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자원을 많이 사용하는 프로세스가 불리해짐 (기아 발생 가능)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 비선점 제거&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이용중인 프로세스에서 자원을 뺏을 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;교착 상태는 일어나지 않음&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선점하여 사용할 수 있는 자원에 대해서는 효과적 (cpu) 그러나 범용성이 떨어짐&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 원형 대기 제거&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 자원의 번호를 붙이고, 오름차순으로 자원 할당&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5번 포크를 집어 들고 1번 포크를 집어 들 수 없음&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수많은 자원에 번호를 붙이는 건 쉽지 않음, 자원의 활용률이 떨어질 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 교착 상태 발생 조건을 제거하여 방지하는 방식은 여러 부작용이 생긴다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;교착 상태 회피&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;교착 상태를 한정된 자원의 무분별한 할당으로 인해 발생한다고 간주하여 문제 해결 (방지)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로세스에 배분할 수 있는 자원의 양을 고려하여 &lt;span style=&quot;color: #f89009;&quot;&gt;교착 상태가 발생하지 않을 정도로 자원을 배분&lt;/span&gt;하는 방식&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 안전 상태: 교착 상태가 발생하지 않고, 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 불안전 상태: 교착 상태가 발생할 수도 있는 상황&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 안전 순서열: 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 안전 상태: 안전 순서열대로 자원을 배분하여 교착 상태가 발생하지 않는 상태&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 불안전 상태: 안전 순서열이 없는 상태, 교착 상태 발생 가능&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;교착 상태 검출 후 회복&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;교착 상태 발생을 인정하고 조치하는 방법&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 선점을 통한 회복&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;교착 상태가 해결될 때 까지 한 프로세스씩 자원을 몰아주는 방식&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 프로세스 강제 종료를 통한 회복&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 확실한 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모두 강제 종료 (모든 작업 내역 잃을 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 교착 상태가 없어질 때 까지 하나씩 강제 종료 (교착 상태 확인 시 오버헤드 발생)&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 타조 알고리즘&amp;nbsp;&lt;/h4&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>교착상태</category>
      <category>식사하는 철학자</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/203</guid>
      <comments>https://spongerice.tistory.com/203#entry203comment</comments>
      <pubDate>Mon, 5 Feb 2024 15:22:47 +0900</pubDate>
    </item>
    <item>
      <title>[혼공 학습단 11기] 5주차 미션</title>
      <link>https://spongerice.tistory.com/202</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;기본 미션&lt;/h2&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;p.363 확인 문제 1번&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;② 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;④ 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;정답&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.&amp;nbsp;&lt;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;해설&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 뮤텍스 락은 자물쇠를 이용하여 임계 구역에 진입하는 방식으로 상호 배제를 위한 동기화를 이룸&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 잠그고 -&amp;gt; 사용하고 -&amp;gt; 풀고&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;② 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 세마포: 공유 자원이 여러 개 있는 일반적인 상황에 활용 가능&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용 가능한 공유 자원의 개수를 나타내는 전역 변수 s 사용&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용 가능 자원 개수를 0으로 두고&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 먼저 실행 할 프로세스 뒤에 signal 함수, 다음에 실행될 프로세스 앞에 wait 함수 작성&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- wait으로 대기를 걸기에 먼저 실행될 수 없다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;④ &lt;span style=&quot;color: #f89009;&quot;&gt;세마포&lt;/span&gt;를 이용하면 반드시 &lt;span style=&quot;color: #f89009;&quot;&gt;바쁜 대기&lt;/span&gt;를 해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[세마포를 통한 빠른 대기 문제 해결 방법]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바쁜 대기 시 cpu 주기가 낭비된다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; wait() 함수에서 사용할 수 있는 자원이 없을 경우, 해당 프로세스 상태를 대기로 전환&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 해당 프로세스의 PCB를 세마포어 대기 큐에 넣음&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 한 프로세스 작업이 끝나고 signal()이 호출되면&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 대기중인 프로세스를 대기 큐에서 제거하고 프로세스 상태를 준비 큐로 바꾼 뒤 준비큐로 옮김&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707110032048&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 빠른 대기 문제 해결 

def wait():
	s -= 1 # 확인 전 감소 
    if (s &amp;lt; 0): # 사용할 수 있는 자원이 없음 
    	add this process to Queue # PCB를 대기 큐에 삽입 
        sleep(); # 대기 상태 
        
def signal():
	s += 1 
	if (s &amp;lt;= 0): # 먼저 감소시키고, 증가시켜서 0이 될 수 있음 (프로세스 3개, s: 2 생각해보기) 
    	remove a process p from Queue # 대기큐에서 프로세스 제거 
        wakeup(p) # 대기 -&amp;gt; 준비&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;선택 미션&lt;/h2&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;Ch12(12-1) 임계 구역, 상호 배제 개념을 정리하기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;공유 자원과 임계 구역&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공유 자원: 전역 변수, 파일. io 장치, 보조기억장치 등 공유되는 자원&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임계 구역: 동시에 실행하면 문제가 발생하는 코드에 접근하는 코드 영역&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;레이스 컨디션: 임계구역 코드를 동시 다발적으로 실행하여 문제가 발생하는 경우 (데이터 일관성 문제 발생)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 개 이상의 프로세스가 임계 구역에 진입하려면 대기가 필요&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;임계 구역 문제 해결 원칙&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 상호 배제: 한 프로세스가 임계 구역에 들어갔다면 다른 프로세스는 임계구역에 들어갈 수 없다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 진행: 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 유한 대기: 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어갈 수 있다 (무한정 대기 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;임계 구역 문제 해결 방법&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 뮤텍스 락&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 락을 걸고, 임계 구역에 진입하고, 락을 해제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 세마포어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 임계 구역이 여러 개 일 때 사용 가능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대기/진입 확인 후, 임계 구역에 진입하고, 사용 후 신호 보내기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 모니터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건 변수를 활용하여 동기화&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공유 자원과 접근 인터페이스를 묶어 관리&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>동기화</category>
      <category>모니터</category>
      <category>뮤텍스</category>
      <category>세마포어</category>
      <category>임계구역</category>
      <category>혼공챌린지</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/202</guid>
      <comments>https://spongerice.tistory.com/202#entry202comment</comments>
      <pubDate>Mon, 5 Feb 2024 14:20:59 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 12. 프로세스 동기화</title>
      <link>https://spongerice.tistory.com/201</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;12-1. 동기화란&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화 목적: 협력하는 프로세스들의 실행 순서와 자원의 일관성을 보장하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;동기화의 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;협력적인 프로세스를 올바르게 실행하기 위해서 프로세스 사이의 수행 시기를 맞추는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로세스 동기화: 프로세스 사이의 수행 시기를 맞추는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 실행 순서 제어 동기화: 올바른 순서대로 실행&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. 상호 배제 동기화: 동시 접근 불가 프로세스에 한 프로세스만 접근&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 실행 순서 제어를 위한 동기화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽고, 쓰는 프로세스가 있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기 프로세스는 쓰기 프로세스 뒤에 와야 한다&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 상호 배제를 위한 동기화&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 프로세스가 올바르게 종료되지 않고 다른 프로세스가 접근한다면 올바르지 못한 값이 나올 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;process A: 2만 원 입금, process B: 5만 원 입금, 현재 잔액: 10만 원&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;각 프로세스는 잔액 읽기 -&amp;gt; 입금 -&amp;gt; 저장의 과정을 거침&lt;br /&gt;만약 A 프로세스가 입금 중이고 저장 과정을 거치지 않았는데&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;B 프로세스가 작업을 시작한다면&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2만원 입금 (A프로세스 작업)이 제대로 실행되지 않음&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 동시에 접근해서는 안된다&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;생산자와 소비자 문제&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생산자 프로세스: 물건을 계속 생산하는 프로세스 (총합 += 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소비자 프로세스: 물건을 계속 소비하는 프로세스 (총합 -= 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총합: 공유되는 데이터&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 과정을 코드로 작성한 뒤 여러 번 반복 실행하면 올바른 결과를 받지 못할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 프로세스가 제대로 동기화 되지 않았기 때문! (동시에 접근하면 안 되는 자원에 동시에 접근했기에 발생한 문제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(생산자의 작업이 끝나기 전에 소비하고, 소비자의 작업이 끝나기 전에 생산했기 때문)&lt;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;공유 자원과 임계 구역&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 자원: 전역 변수, 파일. io 장치, 보조기억장치 등 공유되는 자원&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임계 구역: 동시에 실행하면 문제가 발생하는 코드에 접근하는 코드 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이스 컨디션: 임계구역 코드를 동시 다발적으로 실행하여 문제가 발생하는 경우 (데이터 일관성 문제 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개 이상의 프로세스가 임계 구역에 진입하려면 대기가 필요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;임계 구역 문제 해결 원칙&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상호 배제: 한 프로세스가 임계 구역에 들어갔다면 다른 프로세스는 임계구역에 들어갈 수 없다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 진행: 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 유한 대기: 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어갈 수 있다 (무한정 대기 X)&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;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;12-2. 동기화 기법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;뮤텍스 락&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상호 배제를 위한 동기화 도구&amp;nbsp;&lt;/p&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;/p&gt;
&lt;pre id=&quot;code_1707107140292&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lock = True # 자물쇠- 전역 변수 
aquire() # 임계 구역 잠그기 
release() # 임계 구역 잠금 해제

###### 
# aquire() - 임계 구역에 들어가기 전 호출
# 1. 잠겨 있다면, 열릴때까지 반복적으로 확인 
# 2. 열려 있다면, 임계 구역 잠그기 
def acquire():
	while (look == True): # 열릴때까지 확인 
    ...
    lock = True # 잠그기


# release() - 임계 구역에서 작업 후 호출
# 1. 잠금 해제 
def release():
	lock = False # 잠금 해제 

###### 
# acquire(), release()를 임계 구역 전후로 호출함으로써 하나의 프로세스만 임계 구역에 진입 가능 

acquire() # 진입 전 
# 임계 구역 
relese() # 진입 후&lt;/code&gt;&lt;/pre&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임계 구역에 진입 불가 - 락 획득 불가 (대기)&lt;/li&gt;
&lt;li&gt;임계 구역 진입 가능 - 락 획득 가능 (임계 구역 잠그고 작업 진행)&lt;/li&gt;
&lt;li&gt;임계 구역 빠져 나올 때 - 락 해제&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 바쁜 대기: 락이 풀릴 때까지 계속 반복하며 확인하는 것 (while (look == True):)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;세마포어&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stop, go 신호로 관리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 자원이 여러 개 있을 경우 여러 개의 프로세스가 각각 공유 자원에 접근이 가능해야 한다 (각 공유 자원에는 하나만 접근 가능해도) - 탈의실이 3개 있는 경우 떠올리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707108328167&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s = 0 # 사용 가능한 공유 자원의 개수 - 임계 구역에 진입할 수 있는 프로세스의 개수 
wait() # 들어가도 되는지, 대기해야 하는지 알려주는 함수 
signal() # 임계 구역 앞에서 대기하는 프로세스에게 go 신호를 주는 함수 

#####
wait() # 임계 구역 진입 전 호출 
# 임계 구역 
signal() # 임계 구역 진입 후 호출 

##### 
def wait():
 	# 임계 구역에 진입할 수 있는 프로세스의 개수가 0 이하면, 사용 가능 자원 반복확인	
	while s &amp;lt;= 0:
    	continue
    s -= 1 # s가 1 이상이면, s를 하나 감소시키고 임계 구역 진입 
    
    
 def signal():
 	s += 1 # 작업 종료 후 s 1 증가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2개의 자원에 3개의 프로세스 p1, p2, p3가 접근한다면&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. p1 wait() 실행, 현재 s : 2 -&amp;gt; s -= 1 -&amp;gt; 임계 구역 진입&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. p2 wait() 실행, 현재 s:1 -&amp;gt; s -= 1 -&amp;gt; 임계 구역 진입&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. p3 wait() 실행, 현재 s: 0 (진입 불가) -&amp;gt; 무한히 반복하며 s 확인&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. p1 작업 종료 후 signal() 호출 -&amp;gt; s+= 1&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;5. p3 s &amp;gt; 0 확인 -&amp;gt; s -= 1 -&amp;gt; 임계 구역 진입&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;빠른 대기 문제 해결 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바쁜 대기 시 cpu 주기가 낭비된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; wait() 함수에서 사용할 수 있는 자원이 없을 경우, 해당 프로세스 상태를 대기로 전환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 해당 프로세스 PCB를 세마포어 대기 큐에 넣음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 한 프로세스 작업이 끝나고 signal()이 호출되면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 대기중인 프로세스를 대기 큐에서 제거하고 프로세스 상태를 준비 큐로 바꾼 뒤 준비큐로 옮김&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707109206154&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 빠른 대기 문제 해결 

def wait():
	s -= 1 # 확인 전 감소 
    if (s &amp;lt; 0): # 사용할 수 있는 자원이 없음 
    	add this process to Queue # PCB를 대기 큐에 삽입 
        sleep(); # 대기 상태 
        
def signal():
	s += 1 
	if (s &amp;lt;= 0): # 먼저 감소시키고, 증가시켜서 0이 될 수 있음 (프로세스 3개, s: 2 생각해보기) 
    	remove a process p from Queue # 대기큐에서 프로세스 제거 
        wakeup(p) # 대기 -&amp;gt; 준비&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세마포어로 프로세스 순서 제어하는 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s = 0 으로 두고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 실행 할 프로세스 뒤에 signal 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 실행할 프로세스 앞에 wait 함수&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wait이 있기 때문에 먼저 실행될 수 없음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;모니터&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 반드시 인터페이스를 통해서만 자원 접근 가능&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건 변수: 프로세스, 스레드의 실행 순서를 제어하기 위해 사용&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>모니터</category>
      <category>뮤텍스락</category>
      <category>세마포어</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/201</guid>
      <comments>https://spongerice.tistory.com/201#entry201comment</comments>
      <pubDate>Mon, 5 Feb 2024 14:06:29 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 11기] 혼공컴운 4주차 미션</title>
      <link>https://spongerice.tistory.com/200</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 미션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. P.304 확인 문제 1번&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. 1부터 5까지 올바른 상태를 적어보세요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA2Ena/btsD9AQm1ns/VErIxyfUJBYunQKemSk5R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA2Ena/btsD9AQm1ns/VErIxyfUJBYunQKemSk5R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA2Ena/btsD9AQm1ns/VErIxyfUJBYunQKemSk5R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA2Ena%2FbtsD9AQm1ns%2FVErIxyfUJBYunQKemSk5R1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;179&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;생성 상태&lt;/li&gt;
&lt;li&gt;준비 상태&lt;/li&gt;
&lt;li&gt;실행 상태&lt;/li&gt;
&lt;li&gt;종료 상태&lt;/li&gt;
&lt;li&gt;대기 상태&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해설&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4BVX/btsEeFbj6fj/1kMEaKiECOAFfkASfYDBMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4BVX/btsEeFbj6fj/1kMEaKiECOAFfkASfYDBMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4BVX/btsEeFbj6fj/1kMEaKiECOAFfkASfYDBMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4BVX%2FbtsEeFbj6fj%2F1kMEaKiECOAFfkASfYDBMK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;223&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로세스 상태&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 생성 상태 (new)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 생성중인 상태&lt;br /&gt;메모리에 적재되어 PCB를 할당 받은 상태&lt;br /&gt;실행할 준비가 되면 준비 상태로 이동&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 준비 상태 (ready)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu 할당 차례를 기다리는 상태&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 실행 상태 (running)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu를 할당 받아 실행중인 샅애&lt;br /&gt;할당된 시간 동안만 cpu 사용 가능&lt;br /&gt;할당된 시간을 모두 사용한다면 다시 준비 상태로 이동&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 대기 상태 (blocked)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력장치의 작업을 기다리는 상태&lt;br /&gt;입출력 작업이 완료되면 준비 상태로 변경&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 종료 상태 (terminated)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스가 종료된 상태&lt;br /&gt;PCB, 프로세스가 사용한 메모리 정리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;선택 미션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A -&amp;gt; B -&amp;gt; C -&amp;gt; D&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해설&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선입 선처리 스케줄링 방식은 준비 큐에 삽입된 순서대로 프로세스들을 처리하는 방식으로 가장 먼저 삽입된 A 프로세스부터 순서대로 CPU를 할당 받는다&amp;nbsp;&amp;nbsp;&lt;/p&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;b&gt;FCFS 스케줄링&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비&amp;nbsp;큐에&amp;nbsp;삽입된&amp;nbsp;순서대로&amp;nbsp;프로세스들을&amp;nbsp;처리하는&amp;nbsp;비선점형&amp;nbsp;스케줄링&amp;nbsp;&lt;br /&gt;프로세스&amp;nbsp;대기&amp;nbsp;시간이&amp;nbsp;매우&amp;nbsp;길어질&amp;nbsp;수&amp;nbsp;있음&amp;nbsp;&lt;br /&gt;-&amp;nbsp;호위&amp;nbsp;효과&amp;nbsp;&lt;br /&gt;CPU를&amp;nbsp;오래&amp;nbsp;사용하는&amp;nbsp;프로세스가&amp;nbsp;먼저&amp;nbsp;도착하여&amp;nbsp;다른&amp;nbsp;프로세스의&amp;nbsp;대기&amp;nbsp;시간이&amp;nbsp;기다리는&amp;nbsp;현상&amp;nbsp;&lt;br /&gt;예)&amp;nbsp;2ms&amp;nbsp;를&amp;nbsp;실행하기&amp;nbsp;위해&amp;nbsp;22ms&amp;nbsp;대기&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>혼공챌린지</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/200</guid>
      <comments>https://spongerice.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 30 Jan 2024 20:03:31 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 11. CPU 스케줄링</title>
      <link>https://spongerice.tistory.com/199</link>
      <description>&lt;h2&gt;11-1. CPU 스케줄링 개요&lt;/h2&gt;
&lt;p&gt;운영체제가 프로세스들에게 CPU 자원을 배분 하는 것&lt;br&gt;PCB에 명시되어 있음&lt;/p&gt;
&lt;h3&gt;프로세스 우선순위&lt;/h3&gt;
&lt;p&gt;우선순위가 높은 프로세스를 먼저 처리하는 것이 효율적&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;입출력 집중 프로세스&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;입출력이 많은 프로세스 
예) 비디오 재생, 디스크 백업 등
실행 상태보다 입출력을 위한 대기 상태에 많이 머무름&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CPU 집중 프로세스&lt;br&gt;  CPU 작업이 많은 프로세스&lt;br&gt;  예) 수학연산, 컴파일, 그래픽 처리 등&lt;br&gt;  대기 상태보다 실행 상태에 많이 머무름&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CPU 버스트&lt;br&gt;  CPU를 사용하는 작업 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;입출력 버스트 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;입출력장치를 기다리는 작업&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CPU 집중 프로세스와 입출력 집중 프로세스가 동일한 빈도로 CPU를 사용하는 것은 비합리적&lt;br&gt;입출력 집중 프로세스를 빨리 실행시켜 입출력 장치를 끊임없이 작동시키고 CPU 집중 프로세스에 집중적으로 CPU를 할당하는 것이 더 효율적&lt;br&gt;입출력 작업을 완료하기 전까지 입출력 집중 프로세스는 대기 상태이기 때문&lt;/p&gt;
&lt;h3&gt;스케줄링 큐&lt;/h3&gt;
&lt;p&gt;프로세스들을 순서대로 줄 세우는 것&lt;br&gt;이때 큐 사용 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;준비 큐&lt;pre&gt;&lt;code&gt;CPU를 이용하고 싶은 프로세스들이 서는 줄 &lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;대기 큐&lt;br&gt;입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄&lt;br&gt;OS는 PCB들이 큐에 삽입된 순서대로 꺼내어 실행하되, 우선순위가 높은 프로세스를 먼저 실행 &lt;h3&gt;선점형과 비선점형 스케줄링&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;선점형 스케줄링 &lt;pre&gt;&lt;code&gt;운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 방식 
자원 독점을 막고 자원을 골고루 배분 할 수 있다 
문맥 교환 과정에서 오버헤드 발생 &lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;비선점형 스케줄링 &lt;pre&gt;&lt;code&gt;프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까지 다른 프로세스가 끼어들 수 없는 방식 
문백 교환에서 발생하는 오버헤드가 적다 
골고루 자원을 사용할 수 없다 \&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;11-2. CPU 스케줄링 알고리즘&lt;/h2&gt;
&lt;h3&gt;스케줄링 알고리즘의 종류&lt;/h3&gt;
&lt;h4&gt;1. FCFS 스케줄링&lt;/h4&gt;
&lt;p&gt;선입 선처리 스케줄&lt;br&gt;준비 큐에 삽입된 순서대로 프로세스들을 처리하는 비선점형 스케줄링&lt;br&gt;프로세스 대기 시간이 매우 길어질 수 있음 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;호위 효과&lt;br&gt;  CPU를 오래 사용하는 프로세스가 먼저 도착하여 다른 프로세스의 대기 시간이 기다리는 현상&lt;br&gt;  예) 2ms 를 실행하기 위해 22ms 대기 &lt;/p&gt;
&lt;h4&gt;2. SJF 스케줄링&lt;/h4&gt;
&lt;p&gt;최단 작업 우선 스케줄링&lt;br&gt;준비 큐에 삽입된 프로세스 중 CPU 사용 시간의 길이가 가장 짧은 프로세스부터 실행하는 방식&lt;br&gt;호위 효과를 방지할 수 있음&lt;br&gt;기본적으로 비선점형이지만, 선점형으로 구현할 수도 있음 &lt;/p&gt;
&lt;h4&gt;3. RR 스케줄링&lt;/h4&gt;
&lt;p&gt;라운드 로빈 스케줄링&lt;br&gt;FCFS + 타임 슬라이스 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;타임 슬라이스 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU를 사용할 수 있는 시간&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;입력 순서대로 정해신 시간(타임 슬라이스)만큼만 CPU를 사용할 수 있는 선점형 스케줄링 방식&lt;br&gt;프로세스가 완료되지 않았다면 큐의 맨 뒤에 삽입 &lt;/p&gt;
&lt;h4&gt;4. SRT 스케줄링&lt;/h4&gt;
&lt;p&gt;최소 잔여 시간 우선 스케줄링&lt;br&gt;SJF + RR&lt;br&gt;잔여시간이 짧은 프로세스부터 실행하되, 타임 슬라이스만큼만 CPU 사용 가능 &lt;/p&gt;
&lt;h4&gt;5. 우선순위 스케줄링&lt;/h4&gt;
&lt;p&gt;프로세스에 우선순위를 부여하고 가장 높은 우선순위 프로세스부터 실행&lt;br&gt;우선순위가 같으면 FCFS&lt;br&gt;SJF, SRT 은 우선순위 스케줄링의 일종&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;기아 현상&lt;br&gt;  우선순위가 낮은 프로세스는 실행이 계속 연기될 수 있음 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;에이징&lt;br&gt;  기아현상을 방지하기 위한 대표적인 방식&lt;br&gt;  오래 대기한 프로세스의 우선순위를 높이는 방식 &lt;/p&gt;
&lt;h4&gt;6. 다단계 큐 스케줄링&lt;/h4&gt;
&lt;p&gt;우선순위 스케줄링의 발전된 형태&lt;br&gt;우선순위별로 준비큐를 여러 개 사용하는 방식&lt;br&gt;프로세스 유형별로 우선순위를 구분하여 실행하는 것이 편리해짐&lt;br&gt;각 큐에서 적절한 스케줄링 방식을 활용할 수 있음 &lt;/p&gt;
&lt;h4&gt;7. 다단계 피드백 큐 스케줄링&lt;/h4&gt;
&lt;p&gt;다단계 큐 스케줄링의 발전된 형태 (기아현상 방지)&lt;br&gt;프로세스가 큐 사이를 이동할 수 있음&lt;br&gt;새롭게 준비 상태가 된 프로세스가 있다면 우선순위가 가장 높은 우선순위 큐에 삽입되고 타임 슬라이스 동안 실행&lt;br&gt;해당 큐에서 끝마치지 못했다면 다음 우선순위큐에 삽입 (점점 우선순위가 낮아짐)&lt;br&gt;낮은 우선순위 큐에서 기아 현상이 발생했다면 우선순위가 높은 큐로 이동시키는 에이징 방식을 활용할 수 있다 &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>CPU스케줄링</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/199</guid>
      <comments>https://spongerice.tistory.com/199#entry199comment</comments>
      <pubDate>Tue, 30 Jan 2024 19:57:51 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 10. 프로세스와 스레드</title>
      <link>https://spongerice.tistory.com/198</link>
      <description>&lt;h2&gt;10-1. 프로세스 개요&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;포그라운드 프로세스&lt;br&gt;  사용자가 볼 수 있는 공간에서 실행되는 프로세스 &lt;/li&gt;
&lt;li&gt;백그라운드 프로세스&lt;br&gt;  사용자가 볼 수 없는 공간에서 실행되는 프로세스 &lt;ul&gt;
&lt;li&gt;데몬(유닉스), 서비스(윈도우)&lt;br&gt;  사용자와 상호작용하지 않고 정해진 일 만 수행하는 백그라운드 프로세스 &lt;h3&gt;프로세스 제어 블록 (PCB)&lt;/h3&gt;
빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 cpu와 같은 지원을 배분할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스와 관련된 정보를 저장하는 자료구조 &lt;/li&gt;
&lt;li&gt;커널 영역에 생성 &lt;/li&gt;
&lt;li&gt;특정 프로세스 식별, 처리 정보 저장&lt;/li&gt;
&lt;li&gt;프로세스 생성시 만들어지고, 실행이 끝나면 폐기&lt;br&gt;  새로운 프로세스 생성 == PCB 생성&lt;br&gt;  프로세스 종료 == PCB 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;PCB에 저장되는 항목&lt;/h4&gt;
&lt;h4&gt;1. 프로세스 ID (PID)&lt;/h4&gt;
&lt;p&gt;프로세스 식별 번호 &lt;/p&gt;
&lt;h4&gt;2. 레지스터 값&lt;/h4&gt;
&lt;p&gt;해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값&lt;br&gt;프로세스 실행시 이전까지 사용했던 레지스터의 중간 값을 복원하기 위해 &lt;/p&gt;
&lt;h4&gt;3. 프로세스 상태&lt;/h4&gt;
&lt;p&gt;입출력장치 사용 대기, CPU 사용 대기 등 파악 &lt;/p&gt;
&lt;h4&gt;4. CPU 스케줄링 정보&lt;/h4&gt;
&lt;p&gt;언제 어떤 순서로 CPU 할당받을지&lt;/p&gt;
&lt;h4&gt;5. 메모리 관리 정보&lt;/h4&gt;
&lt;p&gt;프로세스가 저장된 메모리 주소&lt;br&gt;베이스 레지스터 , 한계 레지스터, 페이지 테이블 정보 등이 담김 &lt;/p&gt;
&lt;h4&gt;6. 사용한 파일과 입출력장치 목록&lt;/h4&gt;
&lt;p&gt;어떤 입출력장치가 해당 프로세스에 할당 되었는지, 어떤 파일을 열었는지&lt;/p&gt;
&lt;h3&gt;문맥 교환&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;문맥&lt;pre&gt;&lt;code&gt;하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
PCB에 저장되는 정보들 
인터럽트 발생시 PCB에 문맥을 백업함 &lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;문맥 교환&lt;pre&gt;&lt;code&gt;기존 프로세스의 문맥을 PCB에 백업하고, 새 프로세스의 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것 &lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;프로세스의 메모리 영역&lt;/h3&gt;
&lt;/li&gt;
&lt;li&gt;정적 할당 영역: 크기가 고정된 영역&lt;/li&gt;
&lt;li&gt;동적 할당 영역: 크기가 고정되지 않은 영역&lt;h4&gt;정적 할당 영역 - 1. 코드 영역&lt;/h4&gt;
== 텍스트 영역&lt;br&gt;실행할 수 있는 코드 (기계어로 이루어진 명령어) 저장&lt;br&gt;CPU가 실행할 명령어가 담겨있기에 쓰기 금기 (읽기 전용 공간)&lt;h4&gt;정적 할당 영역 - 2. 데이터 영역&lt;/h4&gt;
프로그램이 실행되는 동안 유지할 데이터 저장 (대표적으로 전역 변수)&lt;h4&gt;동적 할당 영역 - 1. 힙 영역&lt;/h4&gt;
프로그래머가 직접 할당할 수 있는 저장 공간 (할당 후 반환)&lt;/li&gt;
&lt;li&gt;메모리 누수: 반환하지 않아 메모리에 계속 남아 메모리가 낭비되는 것&lt;br&gt;낮은 주소 -&amp;gt; 높은 주소 &lt;h4&gt;동적 할당 영역 - 2. 스택 영역&lt;/h4&gt;
데이터를 일시적으로 저장하는 공간 (대표적으로 매개변수, 지역변수)&lt;br&gt;높은 주소 -&amp;gt; 낮은 주소&lt;h2&gt;10-2. 프로세스 상태와 계층 구조&lt;/h2&gt;
&lt;h3&gt;프로세스 상태&lt;/h3&gt;
&lt;h4&gt;1. 생성 상태 (new)&lt;/h4&gt;
프로세스를 생성중인 상태&lt;br&gt;메모리에 적재되어 PCB를 할당 받은 상태&lt;br&gt;실행할 준비가 되면 준비 상태로 이동 &lt;h4&gt;2. 준비 상태 (ready)&lt;/h4&gt;
cpu 할당 차례를 기다리는 상태 &lt;h4&gt;3. 실행 상태 (running)&lt;/h4&gt;
cpu를 할당 받아 실행중인 샅애&lt;br&gt;할당된 시간 동안만 cpu 사용 가능&lt;br&gt;할당된 시간을 모두 사용한다면 다시 준비 상태로 이동 &lt;h4&gt;4. 대기 상태 (blocked)&lt;/h4&gt;
입출력장치의 작업을 기다리는 상태&lt;br&gt;입출력 작업이 완료되면 준비 상태로 변경&lt;h4&gt;5. 종료 상태 (terminated)&lt;/h4&gt;
프로세스가 종료된 상태&lt;br&gt;PCB, 프로세스가 사용한 메모리 정리&lt;br&gt;![[Pasted image 20240130141057.png]]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;프로세스 계층 구조&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;부모 프로세스: 새 프로세스를 생성한 프로세스 &lt;/li&gt;
&lt;li&gt;자식 프로세스: 부모 프로세스에 의해 생성된 프로세스 &lt;/li&gt;
&lt;li&gt;PPID: 부모 프로세스의 PID&lt;h3&gt;프로세스 생성 기법&lt;/h3&gt;
fork, exec는 시스템 콜&lt;/li&gt;
&lt;li&gt;fork&lt;br&gt;  복사본을 자식 프로세스로 생성&lt;br&gt;  생성된 프로세스는 부모 프로세스의 자원을 상속 받음 (PID와 저장된 메모리 위치는 다름)&lt;/li&gt;
&lt;li&gt;exec&lt;br&gt;  메모리 공간을 다른 프로그램으로 교체&lt;br&gt;  fork로 복사본이 만들어진 이후 자식 프로세스는 exec 시스템 콜을 통해 새로운 프로그램을 전환&lt;br&gt;  코드 영역, 데이터 영역이 실행할 프로그램의 내용으로 바뀜, 나머지 영역은 초기화 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;10-3. 스레드&lt;/h2&gt;
&lt;p&gt;프로세스를 구성하는 실행의 흐름 단위 &lt;/p&gt;
&lt;h3&gt;프로세스와 스레드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;단일 스레드 프로세스&lt;pre&gt;&lt;code&gt;하나의 실행 흐름을 가진 프로세스 &lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;스레드&lt;br&gt;  하나의 프로세스가 한 번에 여러 일을 동시에 처리 할 수 있게 함&lt;br&gt;  프로세스를 구성하는 실행 단위 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다&lt;br&gt;=&amp;gt; 프로세스: 실행되는 프로그램&lt;br&gt;=&amp;gt; 스레드: 프로세스를 구성하는 실행의 흐름 단위 &lt;/p&gt;
&lt;h2&gt;멀티프로세스와 멀티스레드&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;멀티프로세스: 여러 프로세스를 동시에 실행하는 것 &lt;/li&gt;
&lt;li&gt;멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것&lt;br&gt;프로세스끼리는 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유함 -&amp;gt; 협력과 통신에 유리&lt;br&gt;그러나 멀티 스레드 환경에서 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다&lt;/li&gt;
&lt;li&gt;IPC: 프로세스 간 통신 (자원을 공유하고 주고 받는 것)&lt;ul&gt;
&lt;li&gt;파일 &lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>스레드</category>
      <category>프로세스</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/198</guid>
      <comments>https://spongerice.tistory.com/198#entry198comment</comments>
      <pubDate>Tue, 30 Jan 2024 19:56:43 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 09. 운영체제 시작하기</title>
      <link>https://spongerice.tistory.com/197</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;09-1. 운영체제를 알아야 하는 이유&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;운영체제란&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(시스템) 자원: 프로그램 실행에 필요한 요소들
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cpu, 메모리, 보조기억장치, 입출력 장치와 같은 부품&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널 영역: 부팅시 운영체제가 적재되어 실행되는 공간&lt;/li&gt;
&lt;li&gt;사용자 영역: 응용 프로그램이 적재되는 공간 (커널 영역을 제외한 나머지 공간)운영체제를 알아야 하는 이유운영체제를 통해 하드웨어의 상태, 코드 실행 상태, 문제 상황 등을 파악할 수 있기 때문&lt;br /&gt;하드웨어와 프로그램을 깊이 이해할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;09-2. 운영체제의 큰 그림&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;운영체제의 심장, 커널&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 인터페이스: 커널에 포함되지 않는, 사용자와 상호작용할 수 있는 통로]응용 프로그램들이 자원에 접근하려 할 때 자신을 통해서만 접근하도록 하여 자원을 보호하는 방법&lt;/li&gt;
&lt;li&gt;이중 모드와 시스템 호출&lt;/li&gt;
&lt;li&gt;이중 모드&lt;br /&gt;cpu가 명령어를 실행하는 모드를 &quot;사용자 모드&quot;, &quot;커널 모드&quot;로 구분하는 방식&lt;/li&gt;
&lt;li&gt;사용자 모드&lt;br /&gt;운영체제 서비스를 제공 받을 수 없는 실행 모드.&lt;br /&gt;커널 영역의 코드를 실행할 수 없는 모드 =&amp;gt; 자원에 접근할 수 없음&lt;/li&gt;
&lt;li&gt;커널 모드&lt;br /&gt;운영체제 서비스를 제공받을 수 있는 실행 모드.&lt;br /&gt;커널 영역의 코드를 실행할 수 있는 모드 =&amp;gt; 자원 접근 가능 (자원 접근 명령어 실행 가능)&lt;/li&gt;
&lt;li&gt;시스템 호출 (system call)&lt;br /&gt;운영체제 서비스를 제공받기 위한 요청&lt;br /&gt;사용자 모드 -&amp;gt; 시스템 콜 호출 -&amp;gt; 커널 모드 전환&lt;br /&gt;일종의 인터럽트 (소프트웨어 인터럽트)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;운영체제의 핵심 서비스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 프로세스 관리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스: 실행 중인 프로세스&lt;br /&gt;일반적으로 하나의 cpu는 하나의 프로세스만 실행할 수 있다&lt;br /&gt;운영체제는 다양한 프로세스를 관리하고 실행한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 자원 접근 및 할당&lt;/h4&gt;
&lt;h5&gt;- cpu&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu 스케줄링&lt;/p&gt;
&lt;h5&gt;- 메모리&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 할당, 부족시 극복&lt;/p&gt;
&lt;h5&gt;- 입출력장치&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽스 서비스 루틴&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 파일 시스템 관리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보조기억 장치 속 데이터&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>운영체제</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/197</guid>
      <comments>https://spongerice.tistory.com/197#entry197comment</comments>
      <pubDate>Tue, 30 Jan 2024 19:42:55 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 11기] 혼공컴운 3주차 미션</title>
      <link>https://spongerice.tistory.com/196</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;기본 미션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;1. P.185 확인 문제 3번&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;다음&amp;nbsp;설명을&amp;nbsp;읽고&amp;nbsp;SRAM에&amp;nbsp;대한&amp;nbsp;설명인지&amp;nbsp;DRAM에&amp;nbsp;대한&amp;nbsp;설명인지&amp;nbsp;쓰세요.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[보기|&amp;nbsp;SRAM,&amp;nbsp;DRAM]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;주로&amp;nbsp;캐시&amp;nbsp;메모리로&amp;nbsp;활용됩니다.&amp;nbsp;[&amp;nbsp;(1)&amp;nbsp;]&lt;br /&gt;-&amp;nbsp;주로&amp;nbsp;주기억장치로&amp;nbsp;활용됩니다.&amp;nbsp;[&amp;nbsp;(2)&amp;nbsp;]&lt;br /&gt;-&amp;nbsp;대용량화하기&amp;nbsp;유리합니다.&amp;nbsp;[&amp;nbsp;(3)&amp;nbsp;]&lt;br /&gt;-&amp;nbsp;집적도가&amp;nbsp;상대적으로&amp;nbsp;낮습니다.&amp;nbsp;[&amp;nbsp;(4)&amp;nbsp;]&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;SRAM&lt;br /&gt;2.&amp;nbsp;DRAM&lt;br /&gt;3.&amp;nbsp;DRAM&lt;br /&gt;4.&amp;nbsp;SRAM&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해설&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DRAM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dynamic RAM&lt;br /&gt;저장된&amp;nbsp;데이터가&amp;nbsp;동적으로&amp;nbsp;변하는(사라지는)&amp;nbsp;RAM&lt;br /&gt;데이터의&amp;nbsp;소멸을&amp;nbsp;막기&amp;nbsp;위해&amp;nbsp;일정&amp;nbsp;주기로&amp;nbsp;데이터를&amp;nbsp;재활성화(다시&amp;nbsp;저장)&amp;nbsp;해야&amp;nbsp;한다&amp;nbsp;&lt;br /&gt;소비전력이&amp;nbsp;비교적&amp;nbsp;낮고,&amp;nbsp;저렴하고,&amp;nbsp;집적도가&amp;nbsp;높기에&amp;nbsp;일반적으로&amp;nbsp;사용하는&amp;nbsp;메모리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SRAM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static RAM&lt;br /&gt;저장된&amp;nbsp;데이터가&amp;nbsp;변하지&amp;nbsp;않는&amp;nbsp;RAM&lt;br /&gt;시간이&amp;nbsp;지나도&amp;nbsp;데이터가&amp;nbsp;사라지지&amp;nbsp;않음&amp;nbsp;(데이터를&amp;nbsp;재활성&amp;nbsp;할&amp;nbsp;필요&amp;nbsp;없음)&lt;br /&gt;DRAM&amp;nbsp;보다&amp;nbsp;일반적으로&amp;nbsp;속도가&amp;nbsp;빠름&amp;nbsp;&lt;br /&gt;SRAM도&amp;nbsp;전원이&amp;nbsp;공급되지&amp;nbsp;않으면&amp;nbsp;저장된&amp;nbsp;내용이&amp;nbsp;날아간다&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;2. P.205&amp;nbsp;확인&amp;nbsp;문제&amp;nbsp;1번&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. P.155 확인 문제 4번&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;보기에&amp;nbsp;있는&amp;nbsp;저장&amp;nbsp;장치들로&amp;nbsp;저장&amp;nbsp;장치&amp;nbsp;계층&amp;nbsp;구조&amp;nbsp;도식도를&amp;nbsp;채우세요.&amp;nbsp;&amp;nbsp;&lt;br /&gt;[보기|&amp;nbsp;메모리,&amp;nbsp;보조기억장치,&amp;nbsp;캐시&amp;nbsp;메모리,&amp;nbsp;레지스터]&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNjTC/btsDHly7LiQ/3di4CaenyjWFKtRXg6WdrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNjTC/btsDHly7LiQ/3di4CaenyjWFKtRXg6WdrK/img.png&quot; data-alt=&quot;저장 장치 계층 구조 도식도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNjTC/btsDHly7LiQ/3di4CaenyjWFKtRXg6WdrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNjTC%2FbtsDHly7LiQ%2F3di4CaenyjWFKtRXg6WdrK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;260&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저장 장치 계층 구조 도식도&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;레지스터&amp;nbsp;&lt;br /&gt;2.&amp;nbsp;캐시메모리&lt;br /&gt;3.&amp;nbsp;메모리&lt;br /&gt;4. 보조기억장치&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해설&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메모리 계층 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리속도와&amp;nbsp;용량에&amp;nbsp;따라&amp;nbsp;메모리를&amp;nbsp;나누어&amp;nbsp;둔&amp;nbsp;구조&lt;br /&gt;일반적으로&amp;nbsp;처리&amp;nbsp;속도가&amp;nbsp;빠르면&amp;nbsp;가격이&amp;nbsp;비싸고&amp;nbsp;용량이&amp;nbsp;적고,&lt;br /&gt;처리속도가&amp;nbsp;느리면&amp;nbsp;가격이&amp;nbsp;저렴하고&amp;nbsp;용량이&amp;nbsp;크다&amp;nbsp;&lt;br /&gt;&lt;br /&gt;가격이&amp;nbsp;비싼,&amp;nbsp;용량이&amp;nbsp;적은,&amp;nbsp;속도가&amp;nbsp;빠른&amp;nbsp;순서&lt;br /&gt;레지스터&amp;nbsp;&amp;gt;&amp;nbsp;캐시메모리&amp;nbsp;&amp;gt;&amp;nbsp;메인&amp;nbsp;메모리&amp;nbsp;&amp;gt;&amp;nbsp;보조&amp;nbsp;기억&amp;nbsp;장치&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;선택 미션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;Ch.07(07-1) RAID의 정의와 종류를 간단히 정리해 보기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;RAID의 정의&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여러 개의 물리적 보조 기억장치를 마치 하나의 논리적 보조 기억장치처럼 사용하는 기술&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;RAID의 종류&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;구성 방식에 따라 RAID 0~6으로 나뉨&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 0 (striping)&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;같은 규격의 디스크를 병렬로 연결 (여러 디스크에 동시 접근)&lt;br /&gt;데이터를 여러 갈래로 나누어 저장 (중복/백업 없음, 스프라이핑)&lt;br /&gt;4개의 디스크로 구성된 RAID 0 &amp;rarr; 입출력 속도가 4배 (이론적)&lt;br /&gt;장애 발생 시 데이터 손실 &amp;rarr; RAID 1, 5, 6과 함께 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나 고장 나도 데이터 다 날아감&lt;/li&gt;
&lt;li&gt;나누어 속도를 높이는 목적임&lt;/li&gt;
&lt;li&gt;성능 향상 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 1(mirroring)&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;장애 복구 목적&lt;br /&gt;하나의 데이터 2개의 디스크에 나누어 저장(장애 시 백업 디스크)&lt;br /&gt;동일한 데이터가 여러 디스크에 복사 (미러링)&lt;br /&gt;같은 크기의 디스크를 최소 2개 이상 필요 (짝수 개의 디스크로 구성)&lt;br /&gt;같은 내요을 두 번 저장하기 때문에 속도가 느려질 수 있음&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 2&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오류 검출 기능: ECC (error correction code)를 별도의 디스크에 저장&lt;br /&gt;비트별로 나누어 저장, 장애가 발생 시 ECC를 이용하여 데이터 복구&lt;br /&gt;n개의 디스크에 대해 오류 교정 코드를 저장하기 위한 n-1개의 추가 디스크를 필요&lt;br /&gt;RAID 1보다는 작은 저장 공간을 요구하지만 오류 교정 코드를 계산하는데 많은 시간을 소비하여 잘 사용되지 않음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 복사하지 않고 ECC만 가짐&lt;/li&gt;
&lt;li&gt;1개가 고장 났을 때 ECC를 사용하여 3개 복구 가능 &amp;rarr; ECC기법으로 1개 덜 사용 가능 (비용 절감)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 3&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;섹터 단위로 데이터를 나누어 저장&lt;br /&gt;N-way 패리티 비트를 구성한 후 테이터 디스크가 아닌 별도의 디스크에 보관함으로써 장애 발생 시 오류를 복구&lt;br /&gt;RAID 3에서 추가되는 디스크의 양은 4개의 디스크당 1개 정도&lt;br /&gt;추가되는 디스크의 양은 적지만 N-way 패리티 비트를 구성하는 데 필요한 계산 량이 많음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복구 시간이 많이 걸리고 복구량이 적음&lt;/li&gt;
&lt;li&gt;raid2보다 안 좋음&lt;/li&gt;
&lt;li&gt;복구 비용이 적음 ECC 적게 사용해서&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 4&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3과 유사하나 섹터가 아닌 블록 단위로 저장&lt;br /&gt;데이터가 저장되는 디스크와 패리티 비트가 저장되는 디스크 (진한 초록)만 동작한다는 것이 장점&lt;br /&gt;3과 마찬가지로 패리티 비트를 추가하기 위한 계산량이 많지만 추가되는 디스크의 양은 적음&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 5&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;패리티 비트를 여러 디스크에 분산하여 보관함&lt;br /&gt;패리티 비트 디스크의 병목 현상을 완화&lt;br /&gt;한 디스크에 장애가 발생하면 다른 디스크에 있는 패리티 비트를 이용하여 데이터를 복구할 수 있음&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- RAID 6&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5와 같은 방식, 패리티 비트가 2 &amp;rarr; 디스크 2개의 장애를 복구&lt;br /&gt;패리티 비트를 2개씩 운영하기 땜누에 RAID 5보다 계산량이 많고 4개의 디스크당 2개의 추가 디스크가 필요하다는 단점, 비용이 큼&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>혼공챌린지</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/196</guid>
      <comments>https://spongerice.tistory.com/196#entry196comment</comments>
      <pubDate>Sun, 21 Jan 2024 18:22:22 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chatper 08. 입출력 장치</title>
      <link>https://spongerice.tistory.com/195</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;08-1. 장치 컨트롤러와 장치 드라이버&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;장치 컨트롤러&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;너무 다양하다&lt;/li&gt;
&lt;li&gt;cpu에 비해 속도가 매우 느리다&lt;br /&gt;이러한 이유로 입출력 장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러라는 하드웨어를 통해 연결된다&lt;br /&gt;장치 컨트롤러는 입출력 제어기, 입출력 모듈 등으로 다양하게 불린다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 문제 해결 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cpu와 입출력장치 간의 통신 중계&lt;/li&gt;
&lt;li&gt;오류 검출&lt;/li&gt;
&lt;li&gt;데이터 버퍼링&lt;br /&gt;: 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 공간에 저장하여 전송률을 비슷하게 맞추는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;장치 컨트롤러의 내부 구조&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cpu와 입출력 장치 사이에 주고받을 데이터가 담기는 레지스터&lt;/li&gt;
&lt;li&gt;버퍼역할을 함&lt;/li&gt;
&lt;li&gt;주고 받는 데이터가 많은 입출력 장치에서는 레지스터 대신 RAM을 사용&lt;br /&gt;상태 레지스터&lt;/li&gt;
&lt;li&gt;입출력 작업을 할 준비가 되었는지, 작업이 완료되었는지, 오류가 없는지 등의 상태 정보를 저장&lt;br /&gt;제어 레지스터&lt;/li&gt;
&lt;li&gt;입출력 장치가 수행할 내용에 대한 정보와 명령 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 레지스터 들에 담긴 값들은 버스를 타고 cpu나 다른 입출력 장치로 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;장치 드라이버&lt;/span&gt;&lt;/p&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;br /&gt;장치 컨트롤러: 하드웨어적인 통로&lt;br /&gt;장치 드라이버: 소프트에어적인 통로&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;08-2. 다양한 입출력 방법&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;프로그램 입출력 &lt;/span&gt;&lt;/p&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;br /&gt;cpu가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 cpu는 입출력 장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 작업 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;메모리에 저장된 정보를 하드 디스크에 백업하는 예시 &lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;cpu는 하드디스크 컨트롤러의 제어 레지스터에 쓰기 명령 보냄&lt;/li&gt;
&lt;li&gt;하드 디스크 컨트롤러가 하드 디스크의 상태 확인, 준비되었다면 상태 레지스터에 준비되었다고 표시&lt;/li&gt;
&lt;li&gt;cpu는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부 확인. 준비 되었다면 백업할 메모리의 정보를 데이터 레지스터에 씀, 쓰기가 끝나면 작업 종료 (끝나지 않았다면 1번부터 반복)&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;메모리 맵 입출력 &lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;고립형 입출력 &lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;인터럽트 기반 입출력 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 컨트롤러가 입출력 작업을 끝낸 뒤 cpu에게 인터럽트 요청 신호를 보내면 cpu는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴 실행&lt;br /&gt;-&amp;gt; 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력이라 함&lt;br /&gt;cf) 풀링: 입출력 상태, 처리할 데이터를 주기적으로 확인하는 방법 (cpu에 부담이 큼)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&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;/li&gt;
&lt;li&gt;우선순위가 높은 인터럽트 순으로 처리하는 방법&lt;br /&gt;프로그래머블 인터럽트 컨트롤러 (PIC) - 인터럽트 요청들의 우선순위를 판별한 뒤 cpu에 처리해야 할 하드웨어 인터럽트가 무엇인지 알려주는 장치PIC의 다중 인터럽트 처리 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;장치 컨트롤러에서 인터럽트 요청 신호들을 받아들임&lt;/li&gt;
&lt;li&gt;인터럽트 우선순위를 판단한 뒤 cpu에 처리해야 할 인터럽트 요청 신호를 보냄&lt;/li&gt;
&lt;li&gt;cpu는 pic에 인터럽트 확인 신호를 보냄&lt;/li&gt;
&lt;li&gt;데이터 버스를 통해 cpu에 인터럽트 벡터를 보냄&lt;/li&gt;
&lt;li&gt;인터럽트 벡터를 통해 요청의 주체를 알게 되고, 해당 장치의 인터럽트 서비스 루틴 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;DMA 입출력&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 장치와 메모리가 cpu를 거치지 않고 상호작용할 수 있는 방법&lt;br /&gt;직접 메모리에 접근할 수 있는 입출력 기능&lt;br /&gt;DMA 컨트롤러라는 하드웨어 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;DMA 입출력 과정 &lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;cpu는 dma 컨트롤러에 입출력장치의 주소, 수행할 연산, 메모리의 주소 등과 같ㅇ느 정보로 입출력 작업 명령&lt;/li&gt;
&lt;li&gt;dma 컨트롤러는 cpu 장치 컨트롤러와 상호작용하며 입출력 작업 수행, 필요시 dma 컨트롤러는 메모리에 직접 접근하여 정보를 읽고 씀&lt;/li&gt;
&lt;li&gt;입출력 작업이 끝나면 dma 컨트롤러는 cpu에 인터럽트를 걸어 작업이 끝났음을 알림&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;입출력 버스&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpu, 메모리, dma 컨트롤러, 장치 컨트롤러가 모두 같은 버스를 공유하는 구성에서는 dma를 위해 메모리에 접근할 때마다 시스템 버스를 두 번 사용하는 부작용 발생&lt;br /&gt;이 문제는 dma 컨트롤러와 장치 컨트롤러들을 입출력 버스라는 별도에 버스로 연결하여 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>입출력장치</category>
      <category>혼공챌린지</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/195</guid>
      <comments>https://spongerice.tistory.com/195#entry195comment</comments>
      <pubDate>Sun, 21 Jan 2024 18:12:10 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chatper 07. 보조기억장치</title>
      <link>https://spongerice.tistory.com/194</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;07-1. 다양한 보조기억장치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;하드디스크&lt;/span&gt;&lt;/span&gt;&lt;/p&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;br /&gt;자기적인 방식으로 데이터를 저장하는 보조기억장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색 시간: 접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간&lt;br /&gt;회전 지연: 헤드가 있는 곳으로 플래터를 회전시키는 시간&lt;br /&gt;전송 시간: 하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;플래시 메모리 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USB, SD카드, SSD&lt;br /&gt;전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반 저장 장치&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;07-2. RAID의 정의와 종류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;RAID의 정의&lt;/span&gt;&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;RAID의 종류&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 방식에 따라 RAID 0~6으로 나뉨&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 0 (striping)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 규격의 디스크를 병렬로 연결 (여러 디스크에 동시 접근)&lt;br /&gt;데이터를 여러 갈래로 나누어 저장 (중복/백업 없음, 스프라이핑)&lt;br /&gt;4개의 디스크로 구성된 RAID 0 &amp;rarr; 입출력 속도가 4배 (이론적)&lt;br /&gt;장애 발생 시 데이터 손실 &amp;rarr; RAID 1, 5, 6과 함께 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나 고장 나도 데이터 다 날아감&lt;/li&gt;
&lt;li&gt;나누어 속도를 높이는 목적임&lt;/li&gt;
&lt;li&gt;성능 향상 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 1(mirroring)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애 복구 목적&lt;br /&gt;하나의 데이터 2개의 디스크에 나누어 저장(장애 시 백업 디스크)&lt;br /&gt;동일한 데이터가 여러 디스크에 복사 (미러링)&lt;br /&gt;같은 크기의 디스크를 최소 2개 이상 필요 (짝수 개의 디스크로 구성)&lt;br /&gt;같은 내요을 두 번 저장하기 때문에 속도가 느려질 수 있음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 2&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류 검출 기능: ECC (error correction code)를 별도의 디스크에 저장&lt;br /&gt;비트별로 나누어 저장, 장애가 발생 시 ECC를 이용하여 데이터 복구&lt;br /&gt;n개의 디스크에 대해 오류 교정 코드를 저장하기 위한 n-1개의 추가 디스크를 필요&lt;br /&gt;RAID 1보다는 작은 저장 공간을 요구하지만 오류 교정 코드를 계산하는데 많은 시간을 소비하여 잘 사용되지 않음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 복사하지 않고 ECC만 가짐&lt;/li&gt;
&lt;li&gt;1개가 고장 났을 때 ECC를 사용하여 3개 복구 가능 &amp;rarr; ECC기법으로 1개 덜 사용 가능 (비용 절감)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 3&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섹터 단위로 데이터를 나누어 저장&lt;br /&gt;N-way 패리티 비트를 구성한 후 테이터 디스크가 아닌 별도의 디스크에 보관함으로써 장애 발생 시 오류를 복구&lt;br /&gt;RAID 3에서 추가되는 디스크의 양은 4개의 디스크당 1개 정도&lt;br /&gt;추가되는 디스크의 양은 적지만 N-way 패리티 비트를 구성하는 데 필요한 계산 량이 많음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복구 시간이 많이 걸리고 복구량이 적음&lt;/li&gt;
&lt;li&gt;raid2보다 안 좋음&lt;/li&gt;
&lt;li&gt;복구 비용이 적음 ECC 적게 사용해서&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 4&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3과 유사하나 섹터가 아닌 블록 단위로 저장&lt;br /&gt;데이터가 저장되는 디스크와 패리티 비트가 저장되는 디스크 (진한 초록)만 동작한다는 것이 장점&lt;br /&gt;3과 마찬가지로 패리티 비트를 추가하기 위한 계산량이 많지만 추가되는 디스크의 양은 적음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 5&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패리티 비트를 여러 디스크에 분산하여 보관함&lt;br /&gt;패리티 비트 디스크의 병목 현상을 완화&lt;br /&gt;한 디스크에 장애가 발생하면 다른 디스크에 있는 패리티 비트를 이용하여 데이터를 복구할 수 있음&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- RAID 6&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5와 같은 방식, 패리티 비트가 2 &amp;rarr; 디스크 2개의 장애를 복구&lt;br /&gt;패리티 비트를 2개씩 운영하기 땜누에 RAID 5보다 계산량이 많고 4개의 디스크당 2개의 추가 디스크가 필요하다는 단점, 비용이 큼&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>RAID</category>
      <category>보조기억장치</category>
      <category>혼공챌린지</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/194</guid>
      <comments>https://spongerice.tistory.com/194#entry194comment</comments>
      <pubDate>Sun, 21 Jan 2024 18:06:10 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chatper 06. 메모리와 캐시 메모리</title>
      <link>https://spongerice.tistory.com/193</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;06-1. RAM의 특징과 종류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;DRAM&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dynamic RAM&lt;br /&gt;저장된 데이터가 동적으로 변하는(사라지는) RAM&lt;br /&gt;데이터의 소멸을 막기 위해 일정 주기로 데이터를 재활성화(다시 저장) 해야 한다&lt;br /&gt;소비전력이 비교적 낮고, 저렴하고, 집적도가 높기에 일반적으로 사용하는 메모리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;SRAM&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static RAM&lt;br /&gt;저장된 데이터가 변하지 않는 RAM&lt;br /&gt;시간이 지나도 데이터가 사라지지 않음 (데이터를 재활성 할 필요 없음)&lt;br /&gt;DRAM 보다 일반적으로 속도가 빠름&lt;br /&gt;SRAM도 전원이 공급되지 않으면 저장된 내용이 날아간다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;SDRAM&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클럭 신호와 동기화된 발전된 형태의 DRAM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;DDR SDRAM&lt;/span&gt;&lt;/span&gt;&lt;/p&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;br /&gt;대역폭을 넓혀 속도를 빠르게 만든 SDRAM&lt;br /&gt;한 클럭당 하나씩 데이터를 주고받을 수 있는 SDRAM을 SDSDRAM이라 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;06-2. 메모리의 주소 공간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;물리 주소와 논리 주소&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리에 저장된 정보는 시시각각 변하기에 CPU와 실행 중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 다 알지 못한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;물리 주소&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;논리 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 프로그램 각각에 부여된 0번지부터 시작되는 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 관리 장치 (MMU): 논리 주소와 물리 주소 간의 변환, CPU와 주소 버스 사이에 위치&lt;br /&gt;베이스 레지스터: 프로그램의 가장 작은 물리주소 (프로그램의 첫 물리 주소)를 저장하는 곳&lt;br /&gt;논리 주소: 프로그램의 시작점으로부터 떨어진 거리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;메모리 보호 기법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한계 레제스터: 다른 프로그램 영역을 침범할 수 있는 명령어는 위험 -&amp;gt; 논리 주소 범위를 벗어나는 명령어 실행을 방지하고 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법&lt;br /&gt;베이스 레지스터: 실행중인 프로그램의 가장 작은 물리 주소 저장&lt;br /&gt;한계 레지스터: 논리 주소의 최대 크기 저장&lt;br /&gt;프로그램의 물리 주소 범위 : 베이스 레지스터 값 &amp;lt;= 물리 주소 범위 &amp;lt; 베이스 레지스터 값 + 한계 레지스터 값&lt;br /&gt;CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값 보다 커서는 안된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;06-3. 캐시 메모리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;캐시 메모리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU와 메모리 사이에 위치하여 CPU 연산속도와 메모리 접근 속도 차이를 줄이기 위해 사용&lt;br /&gt;L1 캐시: 코어와 가장 가까운 캐시 메모리 (L1(코어 내부) -&amp;gt; L2(코어 내부) -&amp;gt; L3(코어 외부))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;참조 지역성의 원리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 히트: 자주 사용될 것으로 예측한 데이터가 실제로 맞아 캐시 메모리 내 데이터가 CPU에 활용될 경우&lt;br /&gt;캐시 미스: 자주 사용될 것으로 예측하여 캐시 메모리에 저장했지만 예측이 틀려 필요 데이터를 직접 가져와야 하는 경우&lt;br /&gt;캐시 적중률 = 캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)&lt;br /&gt;평균적인 적중률: 85% ~ 95% 이상&lt;br /&gt;참조 지역성 원리: CPU가 사용할 법한 데이터 (CPU가 메모리에 접근한느 주된 경향을 바탕으로 만들어진 원리)&lt;br /&gt;1. CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다&lt;br /&gt;2. CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>메모리</category>
      <category>캐시메모리</category>
      <category>혼공챌린지</category>
      <category>혼공컴운</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/193</guid>
      <comments>https://spongerice.tistory.com/193#entry193comment</comments>
      <pubDate>Sun, 21 Jan 2024 18:01:03 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 11기] 혼공컴운 2주차 미션</title>
      <link>https://spongerice.tistory.com/192</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;기본 미션&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;1. P.125 확인 문제 2번&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워보세요&lt;br /&gt;[프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(1): 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터&lt;/li&gt;
&lt;li&gt;(2): 메모리에서 가져올 명령어의 주소를 저장하는 레지스터&lt;/li&gt;
&lt;li&gt;(3): 데이터와 주소를 모두 저장할 수 있는 레지스터&lt;/li&gt;
&lt;li&gt;(4): 해석할 명령어를 저장하는 레지스터&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 플래그 레지스터&lt;br /&gt;(2) 프로그램 카운터&lt;br /&gt;(3) 범용 레지스터&lt;br /&gt;(4) 명령어 레지스터&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해설&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;반드시 알아야 할 레지스터&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로그램 카운터 (PC)&lt;br /&gt;메모리에서 가져올 명령어의 주소 저장&lt;br /&gt;(== 명령어 포인터)&lt;/li&gt;
&lt;li&gt;명령어 레지스터&lt;br /&gt;메모리에서 읽어 들인 명령어를 저장하는 레지스터&lt;br /&gt;제어장치는 명령어 레지스터 속 명령어를 받아들이고, 해석한 뒤 제어 신호를 내보냄&lt;/li&gt;
&lt;li&gt;메모리 주소 레지스터&lt;br /&gt;메모리의 주소를 저장하는 레지스터&lt;br /&gt;CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 사용&lt;/li&gt;
&lt;li&gt;메모리 버퍼 레지스터&lt;br /&gt;메모리와 주고 받을 값(데이터, 명령어)을 저장하는 레지스터&lt;br /&gt;메모리에 쓰고 싶은 값, 전달받은 값 저장&lt;br /&gt;데이터 버스로 값을 주고 받을 때 사용&lt;/li&gt;
&lt;li&gt;범용 레지스터&lt;br /&gt;다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터&lt;/li&gt;
&lt;li&gt;플래스 레지스터&lt;br /&gt;연산 결과, CPU 상태에 대한 부가 정보 등을 저장하는 레지스터&lt;/li&gt;
&lt;li&gt;스택 포인터&lt;br /&gt;스택 주소 지정 방식에 사용되는 레지스터&lt;/li&gt;
&lt;li&gt;베이스 레지스터&lt;br /&gt;변위 주소 지정 방식에 사용되는 레지스터&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;2. P.155 확인 문제 4번&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 그림은 멀티코어 CPU를 간략하게 도식화한 그림입니다. 빈칸에 알맞은 용어를 써 넣으세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQX10/btsDkTQl6Ec/FGh4W0OSFsUyxayse5hU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQX10/btsDkTQl6Ec/FGh4W0OSFsUyxayse5hU01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQX10/btsDkTQl6Ec/FGh4W0OSFsUyxayse5hU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQX10%2FbtsDkTQl6Ec%2FFGh4W0OSFsUyxayse5hU01%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;170&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코어&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해설&lt;/b&gt;&lt;/h4&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코어: CPU 내부에서 명령어를 실행하는 부품&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오늘날의 CPU는 명령어를 실행하는 여러 개 포함하는 부품으로 범위가 확대되었다.&lt;br /&gt;이전 CPU 정의인 명령어를 실행하는 부품을 오늘날 '코어'라고 부른다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;선택 미션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;Ch.05 (05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spongerice.tistory.com/191&quot;&gt;[혼공 컴운] chapter 05. CPU 성능 향상 기법 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;코어와 멀티코어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클럭 속도를 높이는 방식 외에 CPU의 성능을 높이는 방법&lt;br /&gt;-&amp;gt; CPU의 코어, 스레드 수 늘리기&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 코어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 내부에서 명령어를 실행하는 부품&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 멀티코어 CPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(== 멀티코어 프로세서)&lt;br /&gt;CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 안에 코어가 몇 개 포함되어 있는지에 따라 싱글코어, 듀얼 코어 등으로 나뉨&lt;br /&gt;그러나 CPU 코어수와 연산 속도는 비례하지 않음&lt;br /&gt;처리할 연산이 적절하게 분배되어야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐가 연산 속도에 큰 영향을 미친다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어적 스레드&lt;/li&gt;
&lt;li&gt;소프트웨어적 스레드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;gt; 하드웨어적 스레드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 코어가 동시에 처리하는 명령어 단위&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티스레드 프로세서 (== 멀티스레드 CPU)&lt;br /&gt;하나의 코어로 여러 명령어를 동시에 처리하는 CPU&lt;/li&gt;
&lt;li&gt;하이퍼스레딩&lt;br /&gt;인텔의 멀티스레드 기술하나의 프로그램에서 독립적으로 실행되는 단위&lt;/li&gt;
&lt;li&gt;&amp;gt; 소프트웨어적 스레드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1코어 1 스레드 CPU는 여러 스레드로 만들어진 프로그램을 실행할 수 있다.&lt;br /&gt;-&amp;gt; 1코어 1 스레드 : 하드웨어적 스레드&lt;br /&gt;-&amp;gt; 여러 스레드로 만들어진 프로그램: 소프트웨어적 스레드&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;gt; 멀티스레드 프로세서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 코어로 여러 명령어를 동시에 처리하는 CPU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 된다&lt;br /&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;br /&gt;(== 하드웨어 스레드)&lt;br /&gt;프로그램 입장에서 하드웨어 스레드는 '한 번에 하나의 명령어를 처리하는 CPU'와 다름없음&lt;br /&gt;2 코어 4 스레드는 한 번에 4개의 명령어를 처리할 수 있지만, 프로그램 입장에서는 한 번에 하나의 명령어를 처리하는 CPU가 4개인 것처럼 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코어: 명령어를 실행할 수 있는 하드웨어 부품&lt;/li&gt;
&lt;li&gt;스레드: 명령어를 실행하는 단위&lt;/li&gt;
&lt;li&gt;멀티코어 프로세서: 명령어를 실행할 수 있는 하드웨어 부품이 CPU 안에 2개 이상 있는 CPU&lt;/li&gt;
&lt;li&gt;멀티스레드 프로세서: 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>미션</category>
      <category>혼공컴운</category>
      <category>혼공학습단</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/192</guid>
      <comments>https://spongerice.tistory.com/192#entry192comment</comments>
      <pubDate>Fri, 12 Jan 2024 12:09:14 +0900</pubDate>
    </item>
    <item>
      <title>[혼공 컴운] chapter 05. CPU 성능 향상 기법</title>
      <link>https://spongerice.tistory.com/191</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;05-1. 빠른 CPU를 위한 설계 기법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;클럭&lt;/span&gt;&lt;/span&gt;&lt;/p&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;br /&gt;-&amp;gt; 클럭 신호가 빠르게 반복되면 CPU를 비롯한 컴퓨터 부품들은 더 빠른 박자에 맞추어 움직임&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 클럭 속도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hz 단위로 측정&lt;/li&gt;
&lt;li&gt;CPU로 속도 단위&lt;/li&gt;
&lt;li&gt;클럭 속도가 높을수록 CPU의 성능이 좋음&lt;/li&gt;
&lt;li&gt;클럭 속도는 일정하지 않다. 유연하게 속도를 변화시킬 수 있다.&lt;/li&gt;
&lt;li&gt;오버클럭킹: 최대 클럭 속도를 강제로 끌어올리는 기법&lt;/li&gt;
&lt;li&gt;클럭 속도를 무작정 높이면 발열 문제가 심각해짐&lt;/li&gt;
&lt;li&gt;클럭 속도만으로 CPU의 성능을 높이는 것은 한계가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;코어와 멀티코어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클럭 속도를 높이는 방식 외에 CPU의 성능을 높이는 방법&lt;br /&gt;-&amp;gt; CPU의 코어, 스레드 수 늘리기&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 코어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 내부에서 명령어를 실행하는 부품&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 멀티코어 CPU&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(== 멀티코어 프로세서)&lt;br /&gt;CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 안에 코어가 몇 개 포함되어 있는지에 따라 싱글코어, 듀얼 코어 등으로 나뉨&lt;br /&gt;그러나 CPU 코어수와 연산 속도는 비례하지 않음&lt;br /&gt;처리할 연산이 적절하게 분배되어야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐가 연산 속도에 큰 영향을 미친다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어적 스레드&lt;/li&gt;
&lt;li&gt;소프트웨어적 스레드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 하드웨어적 스레드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 코어가 동시에 처리하는 명령어 단위&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티스레드 프로세서 (== 멀티스레드 CPU)&lt;br /&gt;하나의 코어로 여러 명령어를 동시에 처리하는 CPU&lt;/li&gt;
&lt;li&gt;하이퍼스레딩&lt;br /&gt;인텔의 멀티스레드 기술하나의 프로그램에서 독립적으로 실행되는 단위&lt;/li&gt;
&lt;li&gt;&amp;gt; 소프트웨어적 스레드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1코어 1 스레드 CPU는 여러 스레드로 만들어진 프로그램을 실행할 수 있다.&lt;br /&gt;-&amp;gt; 1코어 1 스레드 : 하드웨어적 스레드&lt;br /&gt;-&amp;gt; 여러 스레드로 만들어진 프로그램: 소프트웨어적 스레드&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 멀티스레드 프로세서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 코어로 여러 명령어를 동시에 처리하는 CPU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 된다&lt;br /&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;br /&gt;(== 하드웨어 스레드)&lt;br /&gt;프로그램 입장에서 하드웨어 스레드는 '한 번에 하나의 명령어를 처리하는 CPU'와 다름없음&lt;br /&gt;2 코어 4 스레드는 한 번에 4개의 명령어를 처리할 수 있지만, 프로그램 입장에서는 한 번에 하나의 명령어를 처리하는 CPU가 4개인 것처럼 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코어: 명령어를 실행할 수 있는 하드웨어 부품&lt;/li&gt;
&lt;li&gt;스레드: 명령어를 실행하는 단위&lt;/li&gt;
&lt;li&gt;멀티코어 프로세서: 명령어를 실행할 수 있는 하드웨어 부품이 CPU 안에 2개 이상 있는 CPU&lt;/li&gt;
&lt;li&gt;멀티스레드 프로세서: 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;05-2. 명령어 병렬 처리 기법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령어 병렬 처리 기법(ILP)&lt;br /&gt;명령어를 동시에 처리하여 CPU를 쉬지 않고 작동시키는 기법&lt;/li&gt;
&lt;li&gt;대표적인 병렬 처리 기법&lt;br /&gt;명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;명령어 파이프라인&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;명령어 인출 (Instruction Fetch)&lt;/li&gt;
&lt;li&gt;명령어 해석 (Instruction Decode)&lt;/li&gt;
&lt;li&gt;명령어 실행 (Execute Instruction)&lt;/li&gt;
&lt;li&gt;결과 저장 (Write Back)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 단계가 겹치지만 않으면 CPU는 각 단계를 동시에 실행할 수 있다.&lt;br /&gt;-&amp;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;br /&gt;명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법&lt;/li&gt;
&lt;li&gt;파이프라인 위험&lt;br /&gt;파이프라이닝에서 특정 상황에서 성능 향상에 실패하는 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 위험&lt;/li&gt;
&lt;li&gt;제어 위험&lt;/li&gt;
&lt;li&gt;구조적 위험&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 데이터 위험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 간 '데이터 의존성'에 의해 발생&lt;br /&gt;명령어 간 순서가 있는 경우 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) A = B + C, D = A + E 일 경우 두 번째 명령어를 실행하기 위해서는 첫 번째 명령어가 반드시 수행되어야 한다. -&amp;gt; 명령어 1과 2는 의존적이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 의존적인 두 명령어를 동시에 실행하려 할 때 파이프라인이 제대로 작동하지 않는 상황 =&amp;gt; 데이터 위험&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 제어 위험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 프로그램 카운터는 현재 실행 중인 명령어의 다음 주소로 갱신된다.&lt;br /&gt;프로그램 카운터 값에 갑작스러운 변화가 생길 때 명령어 파이프라인에 미리 처리 중이던 명령어가 쓸모 없어진다. =&amp;gt; 제어 위험&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 기술&lt;/b&gt;&lt;br /&gt;분기 예측&lt;br /&gt;프로그램이 어디로 분기할지 미리 예측한 후 해당 주소를 인출하는 기술&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 구조적 위험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(== 자원 위험)&lt;br /&gt;명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 CPU 부품을 사용하려 할 때 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;슈퍼 스칼라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조&lt;br /&gt;공장 생산 라인을 여러 개 두는 것과 같음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;슈퍼스칼라 프로세서 (슈퍼스칼라 CPU)&lt;br /&gt;슈퍼스칼라 구조로 명령어 처리가 가능한 CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적으로는 파이프라인 개수와 프로그램 처리 속도가 비례함&lt;br /&gt;그러나 파이프라인 위험 등의 예상치 못한 문제가 있어 반드시 비례하지는 않음&lt;br /&gt;이 때문에 슈퍼스칼라 방식을 사용한 CPU는 파이프라인 위험을 방지하기 이해 고도로 설계되어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;비순차적 명령어 처리 (OoOE)&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;OoOE&lt;br /&gt;Out-if-order execution&lt;br /&gt;파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 순차적으로만 실행하지 않고&lt;br /&gt;데이터 의존성이 전혀 없어 순서를 바꾸어도 수행 결과에 영향이 없는 명령어들을 먼저 실행하는 명령어 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;05-3. CISC와 RISC&lt;/h2&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;br /&gt;파이프라이닝에 유리한 명령어가 있다면 효율적으로 파이프라이닝 기법을 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISA&lt;br /&gt;일종의 CPU 언어&lt;br /&gt;하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속&lt;/li&gt;
&lt;li&gt;CISC, RISC&lt;br /&gt;ISA를 기반으로 설계된 명령어 (파이프라이닝에 유리하게 설계)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;명령어 집합&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(== 명령어 집합 구조 (ISA))&lt;br /&gt;CPU가 이해할 수 있는 명령어들의 모임&lt;br /&gt;CPU마다 ISA가 다를 수 있다&lt;br /&gt;명령어들이 달라지면 어셈블리어도 달라진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;CISC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Complex Instruction Set Computer&lt;br /&gt;복잡하고 다양한 수의 가변 명령어 집합을 활용하는 컴퓨터(CPU)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) x86, x86-64 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 &lt;b&gt;가변 길이 명령어를 활용&lt;/b&gt;&lt;br /&gt;다양하고 강력한 명령어 활용 -&amp;gt; 적은 수의 명령어로도 프로그램 실행 가능&lt;br /&gt;(명령어 수가 적다 == 컴파일된 프로그램의 크기가 작다. 같은 소스코드를 컴파일해도 CPU마다 생성되는 실행 파일의 크기가 다르다)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적은 수의 명령어로도 프로그램 실행 가능&lt;/li&gt;
&lt;li&gt;메모리 공간 절약 가능&lt;/li&gt;
&lt;li&gt;&amp;gt; 치명적인 단점&lt;/li&gt;
&lt;li&gt;명령어의 규격화가 어려워 파이프라이닝이 어려움&lt;br /&gt;명령어의 크기와 실행되기까지의 시간이 일정하지 않음 (명령어가 복잡, 다양해서)&lt;br /&gt;명령어 하나를 실행하는 데에 여러 클럭 주기가 필요함 (명령어가 복잡해서)&lt;/li&gt;
&lt;li&gt;명령어 파이프라인 활용을 위한 이상적인 명령어는 각 단계에 소요되는 시간이 동일해야 함&lt;br /&gt;그래야 공장의 생산 라인처럼 결과를 낼 수 있다&lt;br /&gt;그러나 CISC는 명령어 수행 시간이 길고 다르기에 파이프라인이 효율적으로 명령어를 처리하기 어려움&lt;/li&gt;
&lt;li&gt;대다수의 복잡한 명령어들은 사용 빈도가 낮음&lt;br /&gt;실제로 자주 사용되는 명령어만 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 파이프라이닝을 위해 &lt;b&gt;명령어 길이와 수행 시간이 짧고 규격화되어&lt;/b&gt; 있어야 한다.&lt;br /&gt;=&amp;gt; 자주 쓰이는 &lt;b&gt;기본적인 명령어를 작고 빠르게&lt;/b&gt; 만들어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;RISC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reduced Instruction Set Computer&lt;br /&gt;단순하고 적은 수의 고정 길이 명령어 집합을 사용하는 컴퓨터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CISC에 비해&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적은 명령어 수&lt;/li&gt;
&lt;li&gt;짧은 명령어&lt;/li&gt;
&lt;li&gt;규격화된 명령어 (되도록 1 클럭 내외로 실행 -&amp;gt; 파이프라이닝에 최적화)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 고정 길이 명령어 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 접근을 단순화, 최소화하는 대신 레지스터 적극 활용&lt;br /&gt;일반적인 경우보다 범용 레지스터 개수도 많음&lt;br /&gt;하지만 명령어 개수가 적기에 CISC보다 많은 명령어로 프로그램을 작동시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;height: 138px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;th style=&quot;height: 18px;&quot;&gt;CISC&lt;/th&gt;
&lt;th style=&quot;height: 18px;&quot;&gt;RISC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;복잡하고 다양한 명령어&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;단순하고 적은 명령어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;가변 길이 명령어&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;고정 길이 명령어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;다양한 주소 지정 방식&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;적은 주소 지정 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;프로그램을 이루는 명령어의 수가 적음&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;프로그램을 이루는 명령어의 수가 많음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;여러 클럭에 걸쳐 명령어 수행&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;1클럭 내외로 명령어 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;파이프라이닝 하기 어려움&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;파이프라이닝 하기 쉬움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>cisc</category>
      <category>risc</category>
      <category>병령처리기법</category>
      <category>스레드</category>
      <category>운영체제</category>
      <category>컴퓨터구조</category>
      <category>코어</category>
      <category>혼자공부하는</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/191</guid>
      <comments>https://spongerice.tistory.com/191#entry191comment</comments>
      <pubDate>Fri, 12 Jan 2024 12:03:05 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 04. CPU의 작동 원리</title>
      <link>https://spongerice.tistory.com/190</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;| 참고 도서: 혼자 공부하는 컴퓨터 구조+운영체제&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;04-1. ALU와 제어 장치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ALU&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU에서 계산을 하는 부품&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레지스터를 통해 &lt;b&gt;피연산자와 제어 신호&lt;/b&gt;를 받아들인다.&lt;br /&gt;피연산자와 제어신호를 바탕으로 다양한 연산 수행&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; ALU의 결과 값을 레지스터에 우선 저장하는 이유&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU에서 레지스터에 접근하는 속도는 메모리에 접근하는 속도보다 빠르다&lt;/li&gt;
&lt;li&gt;접근 속도를 줄여 프로그램의 실행 속도를 높이기 위해 메모리가 아닌 레지스터에 연산의 결괏값을 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 플래그 (flag)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;br /&gt;플래그는 플래그 레지스터에 저장된다.&lt;br /&gt;플래그 레지스터를 통해 연산 결과에 대한 추가적인 정보를 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제어장치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어 신호를 내보내고, 명령어를 해석하는 부품&lt;br /&gt;(제어 신호: 부품을 관리하고 작동시키기 위한 일종의 전기 신호)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 제어장치가 받아들이는 정보&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클럭 신호&lt;br /&gt;클럭 : 컴퓨터의 시간 단위&lt;br /&gt;컴퓨터의 모든 부품이 한 클럭마다 작동&lt;/li&gt;
&lt;li&gt;해석할 명령어&lt;br /&gt;명령어 레지스터: 해설할 명령어가 저장되는 장치&lt;br /&gt;명령어 레지스터로부터 명령어를 받아들이고 해석 -&amp;gt; 제어 신호 발생&lt;/li&gt;
&lt;li&gt;플래그 레지스터 속 플래그의 값&lt;/li&gt;
&lt;li&gt;제어 버스로 전달된 제어 신호&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 제어장치가 내보내는 정보&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CPU 외부에 전달하는 제어 신호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리에 저장하는 제어 신호&lt;/li&gt;
&lt;li&gt;입출력장치(보조기억장치)에 전달하는 제어 신호&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU 내부에 전달하는 제어 신호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ALU에 전달하는 제어신호 (수행할 연산 지시)&lt;/li&gt;
&lt;li&gt;레지스터에 전달하는 제어신호 (레지스터 간 데이터 이동, 저장된 명령어 해석)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;04-2. 레지스터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 속 명령어, 데이터는 실행 전후로 반드시 레지스터에 저장된다.&lt;br /&gt;-&amp;gt; 레지스터디 저장된 값을 잘 관찰하면 프로그램의 실행 흐름을 파악할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반드시 알아야 할 레지스터&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로그램 카운터 (PC)&lt;br /&gt;메모리에서 가져올 명령어의 주소 저장&lt;br /&gt;(== 명령어 포인터)&lt;/li&gt;
&lt;li&gt;명령어 레지스터&lt;br /&gt;메모리에서 읽어 들인 명령어를 저장하는 레지스터&lt;br /&gt;제어장치는 명령어 레지스터 속 명령어를 받아들이고, 해석한 뒤 제어 신호를 내보냄&lt;/li&gt;
&lt;li&gt;메모리 주소 레지스터&lt;br /&gt;메모리의 주소를 저장하는 레지스터&lt;br /&gt;CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 사용&lt;/li&gt;
&lt;li&gt;메모리 버퍼 레지스터&lt;br /&gt;메모리와 주고 받을 값(데이터, 명령어)을 저장하는 레지스터&lt;br /&gt;메모리에 쓰고 싶은 값, 전달받은 값 저장&lt;br /&gt;데이터 버스로 값을 주고 받을 때 사용&lt;/li&gt;
&lt;li&gt;범용 레지스터&lt;br /&gt;다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터&lt;/li&gt;
&lt;li&gt;플래스 레지스터&lt;br /&gt;연산 결과, CPU 상태에 대한 부가 정보 등을 저장하는 레지스터&lt;/li&gt;
&lt;li&gt;스택 포인터&lt;br /&gt;스택 주소 지정 방식에 사용되는 레지스터&lt;/li&gt;
&lt;li&gt;베이스 레지스터&lt;br /&gt;변위 주소 지정 방식에 사용되는 레지스터&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;특정 레지스터를 이용한 주소 지정 방법(1): 스택 주소 지정 방식&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 스택 주소 지정 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;li&gt;스택 영역: 메모리 속 스택처럼 사용하도록 지정된 영역특정 레지스터를 이용한 주소 지정 방법(2): 변위 주소 지정 방식오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식&lt;br /&gt;프로그램 카운터와 베이스 레지스터가 사용된다&lt;/li&gt;
&lt;li&gt;변위 주소 지정 방식 명령어 = 연산 코드 + 레지스터 + 오퍼랜드&lt;br /&gt;오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라&lt;br /&gt;&quot;&lt;b&gt;상대 주소 지정 방식&lt;/b&gt;&quot;, &quot;&lt;b&gt;베이스 레지스터 주소 지정 방식&lt;/b&gt;&quot;으로 나뉜다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 상대 주소 지정 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;li&gt;예) 오퍼랜드 : +3 -&amp;gt; 프로그램 카운터에 저장된 주소에 + 3 번지에 가서 연산코드에 저장된 연산 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt;&amp;nbsp; 베이스 레지스터 주소 지정 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;li&gt;오퍼랜드: 기준 주소로부터 떨어진 거리&lt;br /&gt;=&amp;gt; 베이스 레지스터 속 기준 주소로부터 얼마나 떨어진 주소에 접근할 것인지 연산하여 유효 주소를 얻어내는 방식&lt;/li&gt;
&lt;li&gt;예) 베이스 레지스터 : 200, 오퍼랜드: 50 -&amp;gt; 200 + 50 번지에 접근하여 연산을 수행하라&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;04-3. 명령어 사이클과 인터럽트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령어 사이클: 하나의 명령어를 처리하는 정형화된 흐름&lt;/li&gt;
&lt;li&gt;인터럽트: 명령어 사이클이 끊어지는 상황&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;명령어 사이클&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 속 명령어들이 반복되어 실행되는 일정한 주기&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인출 사이클&lt;br /&gt;메모리에 있는 명령어를 CPU로 가지고 오는 단계&lt;/li&gt;
&lt;li&gt;실행 사이클&lt;br /&gt;CPU로 가져온 명령어를 실행하는 단계&lt;/li&gt;
&lt;li&gt;간접 사이클&lt;br /&gt;명령어를 실행하기 위해 메모리에 접근하는 단계&lt;br /&gt;예) 간접 주소 방식을 사용할 때 명령어를 실행하기 위해서는 메모리에 접근하여 유효 주소를 찾아야 한다. 이때 간접 사이클 단계 진입&lt;/li&gt;
&lt;li&gt;인터럽트&lt;br /&gt;CPU의 작업을 방해하는 신호
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;동기 인터럽트&lt;/b&gt; &lt;br /&gt;CPU에&amp;nbsp;의해&amp;nbsp;발생하는&amp;nbsp;인터럽트&amp;nbsp;&lt;br /&gt;예)&amp;nbsp;CPU가&amp;nbsp;실행하는&amp;nbsp;프로그래밍상의&amp;nbsp;오류&amp;nbsp;&lt;br /&gt;&lt;b&gt;예외(exception)&lt;/b&gt;라고 부른다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비동기 인터럽트&lt;/b&gt; &lt;br /&gt;주로&amp;nbsp;입출력장치에&amp;nbsp;의해&amp;nbsp;발생하는&amp;nbsp;인터럽트&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;예) CPU가 요구한 작업을 마친 입출력 장치가 보내는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;완료 알림&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;예) 입출력장치가 입력을 받으들였을 때 이를 처리하기 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;입력 알림&lt;/b&gt;&lt;br /&gt;&lt;b&gt;하드웨어 인터럽트&lt;/b&gt;라고 부른다. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 하드웨어 인터럽트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림과 같은 인터럽트&lt;br /&gt;입출력 작업 중에도 CPU가 효율적인 작업을 할 수 있도록 함&lt;br /&gt;(알림이 올 때 까지 입출력장치를 확인하지 않아도 된다. 인터럽트가 올 때만 확인하면 된다.)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;gt; 하드웨어 인터럽트 처리 순서&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입출력장치가 CPU로 &lt;b&gt;인터럽트 요청 신호&lt;/b&gt;를 보냄&lt;/li&gt;
&lt;li&gt;실행 사이클이 끝나고 명령어 인출 전 CPU는 항상 인터럽트 여부를 확인&lt;/li&gt;
&lt;li&gt;인터럽트 요청을 확인하고 &lt;b&gt;인터럽트 플래그&lt;/b&gt;를 통해 현재 인터럽트를 받아들일 수 있는지 확인&lt;/li&gt;
&lt;li&gt;인터럽트를 받아 들일 수 있다면 CPU는 현재 작업 백업&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터럽트 벡터&lt;/b&gt;를 참조하여 &lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt;을 실행&lt;/li&gt;
&lt;li&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;b&gt;인터럽트 요청 신호&lt;/b&gt;&lt;br /&gt;인터럽트를 요청하는 신호&lt;br /&gt;인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 &lt;b&gt;인터럽트 플래그&lt;/b&gt;가 활성화 되어 있어야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터럽트 플래그&lt;/b&gt;&lt;br /&gt;하드웨어 인터럽트를 받아들일지 말지 결정하는 플래그&lt;br /&gt;인터럽트 플래그가 불가능으로 설정되어 있다면 인터럽트가 와도 무시된다.&lt;br /&gt;하지만 정전, 하드웨어 고장으로 인한 인터럽트 등 막을 수 없는 인터럽트는 우선순위가 높아 인터럽트 플래그에 관계 없이 인터럽트가 받아들여진다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터럽트 서비스 루틴 (ISR)&lt;/b&gt;&lt;br /&gt;인터럽트를 처리하기 위한 프로그램&lt;br /&gt;&lt;b&gt;인터럽트 핸들러&lt;/b&gt;라고도 부른다.&lt;br /&gt;해당 인터럽트를 어떻게 처리해야 할지에 대한 정보가 담긴 프로그램&lt;/li&gt;
&lt;li&gt;CPU가 인터럽트를 처리한다 == 인터럽트 서비스 루틴을 실행하고 이전 작업으로 다시 돌아온다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터럽트 벡터&lt;/b&gt;&lt;br /&gt;인터럽트 서비스 루틴을 식별하기 위한 정보&lt;br /&gt;인터럽트 벡터로 인터럽트 서비스 루틴의 시작 주소를 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 인터럽트 신호 발생 -&amp;gt; 인터럽트 플래그가 활성화 되어 있다면 -&amp;gt; 작업을 백업(스택 영역에)하고, 인터럽트 벡터 참조하여 인터럽트 서비스 루틴 실행 -&amp;gt; 백업 해둔 작업 복구 -&amp;gt; 이전 작업 재개&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>ALU</category>
      <category>레지스터</category>
      <category>명령어 사이클</category>
      <category>운영체제</category>
      <category>인터럽트</category>
      <category>제어장치</category>
      <category>컴퓨터구조</category>
      <category>혼자공부하는</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/190</guid>
      <comments>https://spongerice.tistory.com/190#entry190comment</comments>
      <pubDate>Wed, 10 Jan 2024 16:17:42 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 11기] 혼공컴운 1주차 미션</title>
      <link>https://spongerice.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot;&gt;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내 &amp;raquo; 혼자 공부하는 책 (hanbit.co.kr)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704432678334&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내&quot; data-og-description=&quot;&amp;nbsp; 안녕하세요, 한빛미디어 혼공학습단의  &amp;zwj;♀️혼공족장 &amp;zwj;♀️입니다. 혼공학습단 활동과 도서별 커리큘럼 안내 드립니다. &amp;nbsp; 11기 활동 기간 1주차: 1월 2일 ~ 1월 7일 2주차: 1월 8일 ~ 1월 14&quot; data-og-host=&quot;hongong.hanbit.co.kr&quot; data-og-source-url=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot; data-og-url=&quot;https://hongong.hanbit.co.kr/?kboard_content_redirect=142&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5yJTP/hyUXXnfieJ/mLcea8s1ufOv6zRDGKFwnK/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080,https://scrap.kakaocdn.net/dn/uMd4f/hyU2oDu6Ln/AoeMoVmQmsa7mcuKjuE2I1/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080&quot;&gt;&lt;a href=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hongong.hanbit.co.kr/%ed%98%bc%ea%b3%b5-%ea%b2%8c%ec%8b%9c%ed%8c%90/?uid=142&amp;amp;mod=document&amp;amp;pageid=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5yJTP/hyUXXnfieJ/mLcea8s1ufOv6zRDGKFwnK/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080,https://scrap.kakaocdn.net/dn/uMd4f/hyU2oDu6Ln/AoeMoVmQmsa7mcuKjuE2I1/img.png?width=1080&amp;amp;height=1080&amp;amp;face=0_0_1080_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[혼공학습단 11기] 스터디 활동과 도서별 커리큘럼 안내&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 안녕하세요, 한빛미디어 혼공학습단의  &amp;zwj;♀️혼공족장 &amp;zwj;♀️입니다. 혼공학습단 활동과 도서별 커리큘럼 안내 드립니다. &amp;nbsp; 11기 활동 기간 1주차: 1월 2일 ~ 1월 7일 2주차: 1월 8일 ~ 1월 14&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hongong.hanbit.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqkksN/btsC8UgegQh/mW0RPkDCBMhROlzy8aS121/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqkksN/btsC8UgegQh/mW0RPkDCBMhROlzy8aS121/img.png&quot; data-alt=&quot;주차별 미션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqkksN/btsC8UgegQh/mW0RPkDCBMhROlzy8aS121/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqkksN%2FbtsC8UgegQh%2FmW0RPkDCBMhROlzy8aS121%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;857&quot; height=&quot;548&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주차별 미션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;1주차 기본 미션&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. P.51 확인 문제 3번&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&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;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정답&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;메모리&lt;/span&gt; (P.40 참고)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해설&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;메모리&lt;/span&gt;는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다.&lt;br /&gt;그렇기에 만약 프로그램이 실행되기 위해서는 반드시&lt;span style=&quot;color: #f89009;&quot;&gt;메모리&lt;/span&gt;에 해당 프로그램의 명령어와 데이터가 저장되어 있어야 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. P.65 확인 문제 3번&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1101의 음수를 2의 보수 표현법으로 구해보세요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정답&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0011&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해설&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;2의 보수&lt;/span&gt; 표현법: 이진수로 음수를 표현하는 방법&lt;br /&gt;&lt;br /&gt;[과정]&amp;nbsp;&lt;br /&gt;1. 모든 0과 1을 &lt;span style=&quot;color: #f89009;&quot;&gt;뒤집기&lt;/span&gt;&lt;br /&gt;2. 뒤집은 수에 &lt;span style=&quot;color: #f89009;&quot;&gt;1 더하기&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-&amp;gt; 1101 -&amp;gt; 0010 -&amp;gt; 0010 + 0001 -&amp;gt; &lt;span style=&quot;color: #f89009;&quot;&gt;0011&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1주차 선택 미션&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;P.100의 스택과 큐의 개념을 정리하기&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스택 (stack)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한쪽 끝이 막혀있는 저장 공간&lt;br /&gt;막혀 있지 않은 부분으로 데이터를 저장하고, 데이터를 빼내는 방식&lt;br /&gt;-&amp;gt; &lt;b&gt;LIFO 방식: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 17.0929%; height: 187px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignCenter&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot;&gt;&lt;b&gt; in &amp;darr;&amp;darr; &amp;uarr;&amp;uarr;out &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot;&gt;data 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot;&gt;data 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot;&gt;data 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;push # 새로운 데이터 저장 
pop # 데이터 출력 (가장 마지막에 넣은 데이터 출력)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;큐 (queue)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양쪽이 뚫려 있는 저장 공간&lt;br /&gt;한쪽으로 데이터를 저장하고, 다른쪽으로 데이터를 꺼내는 방식&lt;br /&gt;-&amp;gt; &lt;b&gt;FIFO 방식: 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식 (선입 선출)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 16.5116%; height: 235px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignCenter&quot; data-ke-style=&quot;style7&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt; &amp;darr;&amp;darr; in &amp;darr;&amp;darr; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px; text-align: center;&quot;&gt;data 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px; text-align: center;&quot;&gt;data 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px; text-align: center;&quot;&gt;data 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;darr;&amp;darr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;out&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;darr;&amp;darr;&lt;/span&gt; &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;push # 새로운 데이터 저장 
pop # 데이터 출력 (가장 처음에 넣은 데이터 출력) &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>11기</category>
      <category>알고리즘</category>
      <category>컴퓨터구조</category>
      <category>혼공학습단</category>
      <category>혼자공부하는</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/189</guid>
      <comments>https://spongerice.tistory.com/189#entry189comment</comments>
      <pubDate>Fri, 5 Jan 2024 14:43:20 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 03. 명령어</title>
      <link>https://spongerice.tistory.com/188</link>
      <description>&lt;h2&gt;03-1. 소스 코드와 명령어&lt;/h2&gt;
&lt;h3&gt;고급 언어와 저급 언어&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;고급 언어: 사람을 위한 언어 &lt;/li&gt;
&lt;li&gt;저급 언어: 컴퓨터를 위한 언어 &lt;ul&gt;
&lt;li&gt;예) 기계어, 어셈블리어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기계어: 0과 1의 명령어 비트로 이루어진 언어 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;고급 언어로 작성된 소스 코드는 반드시 저급 언어(명령어)로 변환되어야 한다 &lt;/p&gt;
&lt;h3&gt;컴파일 언어와 인터프리터 언어&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;컴파일 방식: 소스 코드 전체를 저급 언어로 변환 -&amp;gt; 목적코드 생성&lt;/li&gt;
&lt;li&gt;인터프리터 방식: 소스 코드를 한 줄씩 실행 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;목적 파일 vs 실행 파일&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;목적 파일: 목적 코드로 이루어진 파일 &lt;/li&gt;
&lt;li&gt;실행 파일: 실행 코드로 이루어진 파일 &lt;/li&gt;
&lt;li&gt;링킹: 목적 코드를 실행 코드로 변환하는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;03-2. 명령어의 구조&lt;/h2&gt;
&lt;h3&gt;연산 코드와 오퍼랜드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;명령어 = 연산 코드 + 오퍼랜드&lt;/li&gt;
&lt;li&gt;연산 코드 (== 연산자): 명령어가 수행할 연산 &lt;/li&gt;
&lt;li&gt;오퍼랜드 (== 피연산자): 연산에 사용할 데이터, 데이터가 저장된 위치&lt;/li&gt;
&lt;li&gt;연산 코드 필드: 연산 코드가 담기는 영역 &lt;/li&gt;
&lt;li&gt;오퍼랜드 필드: 오퍼랜드가 담기는 영역 &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;오퍼 랜드&lt;/h5&gt;
&lt;p&gt;연산에 사용할 데이터, 데이터가 저장된 위치&lt;br&gt;오퍼랜드 필드 == 주소 필드 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0-주소 명령어: 오퍼랜드 0개인 명령어&lt;/li&gt;
&lt;li&gt;1-주소 명령어: 오퍼랜드가 1개인 명령어&lt;br&gt;0~3까지 존재 &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;연산 코드&lt;/h5&gt;
&lt;p&gt;명령어가 수행할 연산 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;데이터 전송 &lt;ul&gt;
&lt;li&gt;move, store, load(fetch), push, pop&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;산술/논리 연산 &lt;ul&gt;
&lt;li&gt;add/substract/multiply/divide&lt;/li&gt;
&lt;li&gt;increment/decrement&lt;/li&gt;
&lt;li&gt;and/or/not&lt;/li&gt;
&lt;li&gt;compare&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;제어 흐름 변경 &lt;ul&gt;
&lt;li&gt;jump&lt;/li&gt;
&lt;li&gt;conditional jump&lt;/li&gt;
&lt;li&gt;halt&lt;/li&gt;
&lt;li&gt;call&lt;/li&gt;
&lt;li&gt;return &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;입출력 제어 &lt;ul&gt;
&lt;li&gt;read(input)&lt;/li&gt;
&lt;li&gt;write(output)&lt;/li&gt;
&lt;li&gt;start io&lt;/li&gt;
&lt;li&gt;test io&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;주소 지정 방식&lt;/h3&gt;
&lt;p&gt;오퍼랜드와 연산 코드를 담을 수 있는 공간은 한정되어 있음&lt;br&gt;오퍼랜드의 값을 다 담기 보다 주소를 활용하여 데이터의 위치를 가르킴 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;유효 주소: 연산의 대상이 되는 데이터가 저장된 위치&lt;/li&gt;
&lt;li&gt;주소 지정 방식: 연산에 사용된 데이터의 위치를 주소를 사용하여 찾는 방법 &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;다양한 주소 지정 방식&lt;/h4&gt;
&lt;h5&gt;즉시 주소 지정 방식&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;연산에 사용할 데이터 저장&lt;br&gt;연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시&lt;br&gt;연산에 사용할 데이터들을 메모리, 레지스터로부터 찾는 과정이 없기에 다른 방식들 보다 빠르다 &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;직접 주소 지정 방식&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;유효 주소 (메모리 주소) 저장&lt;br&gt;오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식&lt;br&gt;즉시 주소 지정 방식보다 표현할 수 있는 데이터의 크기가 커짐&lt;br&gt;그러나 여전히 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 있다 &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;간접 주소 지정 방식&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;유효 주소의 주소 저장&lt;br&gt;유효 주소의 주소를 오퍼랜드 필드에 명시&lt;br&gt;표현할 수 있는 유효 주소의 범위가 직접 주소 지정 방식 보다 넓어짐&lt;br&gt;그러나 두 번의 메모리 접근이 필요하여 앞서 설명한 방식들보다 느림 &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;레지스터 주소 지정 방식&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;유효 주소 (레지스터 이름) 저장&lt;br&gt;직접 주소 지정 방식과 유사하게 레지스터를 오퍼랜드 필드에 직접 명시&lt;br&gt;cpu  외부 메모리에 접근하는 것 보다 빠름&lt;br&gt;표현할 수 잇는 레지스터 크기에 제한이 생길 수 있음 &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;레지스터 간접 주소 지정 방식&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;유효 주소를 저장한 레지스터 저장&lt;br&gt;연산에 사용될 데이터를 메모리에 저장하고&lt;br&gt;그 주소를 레지스터에 담고&lt;br&gt;그 주소를 오퍼랜드 필드에 저장하는 방식&lt;br&gt;간접 주소 지정 방식 보다 바르다 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;+) 스택과 큐&lt;/h2&gt;
&lt;h3&gt;스택 (stack)&lt;/h3&gt;
&lt;p&gt;한쪽 끝이 막혀있는 저장 공간&lt;br&gt;막혀 있지 않은 부분으로 데이터를 저장하고, 데이터를 빼내는 방식&lt;br&gt;-&amp;gt; &lt;strong&gt;LIFO 방식: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)&lt;/strong&gt;   &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;in ↓↓ ↑↑out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;push # 새로운 데이터 저장 
pop # 데이터 출력 (가장 마지막에 넣은 데이터 출력)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;큐 (queue)&lt;/h3&gt;
&lt;p&gt;양쪽이 뚫려 있는 저장 공간&lt;br&gt;한쪽으로 데이터를 저장하고, 다른쪽으로 데이터를 꺼내는 방식&lt;br&gt;-&amp;gt; &lt;strong&gt;FIFO 방식: 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식 (선입 선출)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;↓↓ in ↓↓&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;↓↓ &lt;strong&gt;out&lt;/strong&gt; ↓↓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;push # 새로운 데이터 저장 
pop # 데이터 출력 (가장 처음에 넣은 데이터 출력) &lt;/code&gt;&lt;/pre&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>운영체제</category>
      <category>컴퓨터구조</category>
      <category>혼자공부하는</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/188</guid>
      <comments>https://spongerice.tistory.com/188#entry188comment</comments>
      <pubDate>Fri, 5 Jan 2024 14:28:24 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 02. 데이터</title>
      <link>https://spongerice.tistory.com/187</link>
      <description>&lt;p&gt;| 참고 도서: 혼자 공부하는 컴퓨터 구조+운영체제&lt;/p&gt;
&lt;h2&gt;02-1. 0과 1로 숫자를 표현하는 방법&lt;/h2&gt;
&lt;h3&gt;정보 단위&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;비트 (bit): 가장 작은 정보 단위 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;바이트(byte): 8비트 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;킬로바이트(kB): 1000byte&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;메가바이트(MB): 1000kB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;기가바이트(GB): 1000MB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;테라바이트(TB): 1000GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;워드: CPU가 한 번에 처리할 수 있는 데이터의 크기  &lt;/p&gt;
&lt;h3&gt;이진법&lt;/h3&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;이진법: 0과 1으로 모든 숫자를 표현 하는 방법&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;음수 표현: 2의 보수법 + flag 사용 &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;십육진법&lt;/h3&gt;
&lt;p&gt;이진법으로 모든 숫자를 표현하면 숫자의 길이가 너무 길어짐 &amp;amp; 이진법으로 변환하기 쉬움-&amp;gt; 십육진법으로 해결&lt;br&gt;15를 넘어가는 시점에서 올림&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0x--으로 표시 &lt;/li&gt;
&lt;li&gt;이진수 -&amp;gt; 십육진수: 네자리씩 십육진수로 변환하고 이어 붙이기  &lt;/li&gt;
&lt;li&gt;십육진수 -&amp;gt; 이진수: 한 자리씩 이진수로 변환하고 이어 붙이기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;02-2. 0과 1로 문자를 표현하는 방법&lt;/h2&gt;
&lt;h3&gt;문자 집합과 인코딩&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;문자 집합: 컴퓨터가 인식하고 표현할 수 있는 문자의 모음 &lt;/li&gt;
&lt;li&gt;문자 인코딩: 문자를 0과 1로 면환하기 &lt;/li&gt;
&lt;li&gt;문자 디코딩: 0과 1을 문자로 변환하기 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;아스키 코드&lt;/h3&gt;
&lt;p&gt;초창기 문자 집합 중 하나&lt;br&gt;영어 알파벳, 아라비아 숫자, 일부 특수 문자 포함&lt;br&gt;7비트로 표현 -&amp;gt; 128개의 문자 표현 가능 &lt;/p&gt;
&lt;h3&gt;EUC-KR&lt;/h3&gt;
&lt;p&gt;대표적인 완성형 인코딩 방식&lt;br&gt;초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드 부여 &lt;/p&gt;
&lt;p&gt;한글을 표현하기 위한 두 가지 인코딩 방식&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;완성형 인코딩: 초성, 중성, 종성의 조합으로 이루어진 완성된 글자에 고유한 코드를 부여하는 방식 &lt;/li&gt;
&lt;li&gt;조합형 인코딩: 초성, 중성, 종성에 각각 코드를 부여하여 이들의 조합으로 글자 코드를 완성하는 방식 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CP949&lt;/h3&gt;
&lt;p&gt;DUC-KR이 모든 한글 문자를 표현할 수 없기에 등장한 인코딩 방식&lt;br&gt;그러나 한글 전체를 표현하기에는 부족&lt;/p&gt;
&lt;h3&gt;유니코드와 UTF-8&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;유니코드: 모든 언어를 아우르는 문자 집합&lt;/li&gt;
&lt;li&gt;UTF-8: 유니코드를 인코딩 하는 방식 &lt;/li&gt;
&lt;/ul&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>운영체제</category>
      <category>컴퓨터구조</category>
      <category>혼자공부하는</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/187</guid>
      <comments>https://spongerice.tistory.com/187#entry187comment</comments>
      <pubDate>Fri, 5 Jan 2024 14:27:07 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] chapter 01. 컴퓨터 구조 시작하기</title>
      <link>https://spongerice.tistory.com/186</link>
      <description>&lt;p&gt;| 참고 도서: 혼자 공부하는 컴퓨터 구조+운영체제&lt;/p&gt;
&lt;h2&gt;01-1. 컴퓨터 구조를 알아야 하는 이유&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;컴퓨터 구조 이해를 통해 문제 해결 능력 향상 &lt;/li&gt;
&lt;li&gt;성능/용량/비용을 고려하여 개발 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;01-2. 컴퓨터 구조의 큰 그림&lt;/h2&gt;
&lt;h3&gt;컴퓨터 구조 지식&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;컴퓨터가 이해하는 정보 &lt;/li&gt;
&lt;li&gt;컴퓨터의 네 가지 핵심 부품 &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;컴퓨터가 이해하는 정보&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터: 0 과 1로 이루어진 정보&lt;/li&gt;
&lt;li&gt;명령어: 데이터를 움직이고 컴퓨터를 작동시키는 정보&lt;br&gt;=&amp;gt; 명령어: 컴퓨터 작동 정보, 데이터: 재료 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;컴퓨터의 4가지 핵심 부품&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;중앙처리장치 (CPU)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;주기억장치 (메모리 - RAM, ROM, ...)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;보조기억장치&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;입출력장치 &lt;/p&gt;
&lt;h4&gt;1. 메모리&lt;/h4&gt;
&lt;p&gt;현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품&lt;br&gt;=&amp;gt; 실행되기 위해서는 반드시 메모리에 프로그램이 저장되어 있어야 한다 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;주소: 메모리 속 값의 위치 정보 &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 한다&lt;br&gt;메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다&lt;br&gt;메모리에 저장된 값의 위치는 주소로 알 수 있다 &lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;2. CPU&lt;/h4&gt;
&lt;p&gt;메모리에 저장된 명령어를 읽어 들이고, 읽은 명령어를 해석, 실행하는 부품&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ALU: 계산하는 부품&lt;/li&gt;
&lt;li&gt;레지스터: CPU 내부의 작은 임시 저장 장치, 정보 임시 저장 &lt;/li&gt;
&lt;li&gt;제어장치: 제어 신호를 내보내고 명령어를 해석하는 장치 &lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;CPU는 메모리에 저장된 값을 읽어 들이고, 해석, 실행하는 장치이다&lt;br&gt;CPU에는 ALU, 레지스터, 제어장치가 있다&lt;br&gt;ALU는 계산 장치, 레지스터는 임시 저장 장치, 제어장치는 제어 신호를 보내고 명령어를 해석하는 장치 &lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;3. 보조기억장치&lt;/h4&gt;
&lt;p&gt;메모리보다 크기가 크고 전원이 꺼져도 내용을 잃지 않는 저장 장치 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;주기억장치: 실행할 데이터 &lt;/li&gt;
&lt;li&gt;보조기억장치: 보관할 데이터 &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. 입출력장치&lt;/h4&gt;
&lt;p&gt;컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치 &lt;/p&gt;
&lt;h4&gt;5. 메인보드와 시스템 버스&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;메인 보드 (마더보드): 컴퓨터의 핵심 부품들을 연결하는 판 &lt;/li&gt;
&lt;li&gt;시스템 버스: 메인보드에 연결된 보드와 정보를 주고 받는 통로 (4가지 핵심 부품 연결)&lt;ul&gt;
&lt;li&gt;주소 버스: 주소를 주고 받는 통로&lt;/li&gt;
&lt;li&gt;데이터 버스: 명령어, 데이터를 주고 받는 통로 &lt;/li&gt;
&lt;li&gt;제어 버스: 제어 신호를 주고 받는 통로 &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제</category>
      <category>운영체제</category>
      <category>컴퓨터구조</category>
      <category>혼자공부하는</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/186</guid>
      <comments>https://spongerice.tistory.com/186#entry186comment</comments>
      <pubDate>Fri, 5 Jan 2024 14:25:46 +0900</pubDate>
    </item>
    <item>
      <title>인증용 테스트 글</title>
      <link>https://spongerice.tistory.com/185</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코드트리 아이디: parkeb555&lt;/p&gt;</description>
      <category>algorithm/codetree</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/185</guid>
      <comments>https://spongerice.tistory.com/185#entry185comment</comments>
      <pubDate>Wed, 30 Aug 2023 23:37:11 +0900</pubDate>
    </item>
    <item>
      <title>BFS</title>
      <link>https://spongerice.tistory.com/184</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;Breadth First Search&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너비 우선 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가까운 노드부터 탐색하는 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐 자료구로를 사용하는 것이 정석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(인접한 노드를 큐에 넣으면 먼저 들어온 것이 먼저 나가게 되므로 가까운 노드부터 탐색할 수 있다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;사용하는 경우 (유형)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결된 그래프를 탐색하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최단 거리(최소 횟수)를 구하는 경우 (현재 노드에서 가까운 곳을 먼저 찾기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프의 규모가 크지 않고 시작 지점으로부터 대상이 멀지 않은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf) 경로의 특징을 저장하는 경우에는 DFS 사용 (BFS는 경로의 특징을 가질 수 없다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;동작 방식&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;탐색 시작 노드를 큐에 삽입하고 방문 처리&lt;/li&gt;
&lt;li&gt;큐에서 노드를 꺼내 인접 노드 중 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리&lt;/li&gt;
&lt;li&gt;2번을 더 이상 수행할 수 없을 때까지 반복&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;code&amp;nbsp;&lt;/h2&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 스택을 사용하기에 
# deque 라이브러리를 사용하는 것이 좋다 
from collections import deque

def bfs(graph, start, visited):
    # 큐 생성 
    queue = deque([start])
    # 방문 처리 
    visited[start] = True

    # 큐에 값이 있다면 
    while queue:
        # 가장 먼저 들어온 노드 출력 
        v = queue.popleft()
        print(v, end = ' ')
        # 인접한 노드 모두 방문 
        for i in graph[v]:
            # 방문하지 않은 노드라면 
            if not visited[i]:
                # 큐에 추가
                queue.append(i)
                # 방문처리 
                visited[i] = True

graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

visited = [False] * 9

bfs(graph, 1, visited)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1260&quot;&gt;1260번: DFS와 BFS&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682387811680&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1260번: DFS와 BFS&quot; data-og-description=&quot;첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1260&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1260&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btJ4Yq/hySoFbbrpF/jrt4205mCv37krevkCPSD0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1260&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1260&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btJ4Yq/hySoFbbrpF/jrt4205mCv37krevkCPSD0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1260번: DFS와 BFS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;2178번: 미로 탐색&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682387814110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2178번: 미로 탐색&quot; data-og-description=&quot;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kZqCX/hySotPlYY7/SfscW1FUJtKJM31iFWbr70/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kZqCX/hySotPlYY7/SfscW1FUJtKJM31iFWbr70/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2178번: 미로 탐색&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/기본 지식</category>
      <category>bfs</category>
      <category>breadth first search</category>
      <category>너비우선탐색</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/184</guid>
      <comments>https://spongerice.tistory.com/184#entry184comment</comments>
      <pubDate>Tue, 25 Apr 2023 10:57:34 +0900</pubDate>
    </item>
    <item>
      <title>2468_안전 영역</title>
      <link>https://spongerice.tistory.com/183</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2468&quot;&gt;2468번: 안전 영역 (acmicpc.net)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682347056793&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2468번: 안전 영역&quot; data-og-description=&quot;재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2468&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2468&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jMa19/hySoGOg3yW/PjjojjvZ1OuvSE1O21UKZ0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2468&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2468&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jMa19/hySoGOg3yW/PjjojjvZ1OuvSE1O21UKZ0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2468번: 안전 영역&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방식&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상하좌우를 돌며 내린 비의 양보다 높은 곳이 있는지 파악한다 -&amp;gt; DFS 활용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 높다면 방문처리 한 뒤 return True&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 낮다면 return False&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 가장 높은 지역 크기 만큼 반복 (내리는 비의 양)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;주의할 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 재귀 함수 범위에 주의하자&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682347303735&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 재귀 함수 범위를 늘려주는 코드 
import sys
sys.setrecursionlimit(10**7)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 제공된 graph를 사용하여 방문처리를 하는 것보단 새로운 방문 배열을 만들어 활용하자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;graph를 복사하는 방향으로 처리하는 것 보다 간편하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 확인할 비의 양의 범위를 (가장 낮은 지대 ~ 가장 높은 지대 + 1)으로 지정한다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 낮은 지대보다 적은 양의 비가 내렸을 때를 판단할 수없다 -&amp;gt; (0 ~ 가장 높은 지대 + 1)의 범위로 돌리자!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;정답 코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1682347568770&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 재귀함수 범위 늘리기
import sys
sys.setrecursionlimit(10**7)

n = int(input())
graph = []
for _ in range(n):
    graph.append(list(map(int, input().split())))

res = []

# 상하좌우돌며 제시된 값보다 큰 연결된 지역 확인
def dfs(x, y, rain, visited):
    # 예외처리
    if x &amp;lt; 0 or x &amp;gt;= n or y &amp;lt; 0 or y &amp;gt;= n:
        return False

    # 상하좌우 돌기
    if graph[x][y] &amp;gt; rain and visited[x][y] == False:
        # 방문처리
        visited[x][y] = True
        dfs(x, y - 1, rain, visited)
        dfs(x, y + 1, rain, visited)
        dfs(x - 1, y, rain, visited)
        dfs(x + 1, y, rain, visited)
        return True
    return False

maximun = max(map(max, graph))
# minimum = min(map(min, graph))

    # minimum 부터 반복하면 minimum 보다 작은 값일 때 판단할 수 없음
# for k in range(minimum, maximun + 1):
for rain in range(maximun + 1):
    visited = [([False] * (n + 1)) for _ in range(n + 1)]
    cnt = 0
    for i in range(n):
        for j in range(n):
            if dfs(i, j, rain, visited):
                cnt += 1
    res.append(cnt)

print(max(res))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithm/Baekjoon</category>
      <category>2468</category>
      <category>dfs</category>
      <category>백준</category>
      <category>안전 영역</category>
      <category>코딩테스트</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/183</guid>
      <comments>https://spongerice.tistory.com/183#entry183comment</comments>
      <pubDate>Mon, 24 Apr 2023 23:47:11 +0900</pubDate>
    </item>
    <item>
      <title>2667_단지번호붙이기</title>
      <link>https://spongerice.tistory.com/182</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2667&quot;&gt;2667번: 단지번호붙이기 (acmicpc.net)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682333023281&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2667번: 단지번호붙이기&quot; data-og-description=&quot;&amp;lt;그림 1&amp;gt;과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2667&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2667&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ytqeo/hySot2hAmi/tdFsatiFkyPLNVd2QKi6a0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2667&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2667&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ytqeo/hySot2hAmi/tdFsatiFkyPLNVd2QKi6a0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2667번: 단지번호붙이기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;그림 1&amp;gt;과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상하좌우를 모두 돌며 집이 연결되어 있는지 확인 -&amp;gt; DFS 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 노드 == 1이면 0으로 변경하고 상, 하, 좌, 우 확인 후 return True&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 노드 == 0 이면 return False&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. global 변수를 사용하여 상하좌우 확인할 때 집의 개수 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;주의 할 점&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 상하좌우를 확인 할 때 범위를 넘어갈 수 있으므로 미리 예외 처리 하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. graph 값 int 로 변환하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;정답 코드&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1682333655002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# dfs
# 1. 단지 수 세기
# 2. 단지 내 집의 개수를 오름차순 출력

# 입력 받기
n = int(input())
graph = []
for _ in range(n):
    graph.append(list(input()))

# 단지 내 집의 수 계산 변수
cnt = 0
# 결과를 담을 리스트
result = []

def dfs(x,y):
    global cnt
    # 예외처리
    if x &amp;lt; 0 or x &amp;gt;= n or y &amp;lt; 0 or y &amp;gt;= n:
        return False
    # 1이면 방문
    if int(graph[x][y]) == 1:
        cnt += 1
        # 방문 처리
        graph[x][y] = 0
        dfs(x, y - 1)
        dfs(x, y + 1)
        dfs(x - 1, y)
        dfs(x + 1, y)
        return True
    return False

for i in range(n):
    for j in range(n):
        if dfs(i, j):
            result.append(cnt)
            cnt = 0

result.sort()
print(len(result))
for i in result:
    print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/Baekjoon</category>
      <category>2667</category>
      <category>dfs</category>
      <category>단지번호붙이기</category>
      <category>백준</category>
      <category>코딩테스트</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/182</guid>
      <comments>https://spongerice.tistory.com/182#entry182comment</comments>
      <pubDate>Mon, 24 Apr 2023 19:55:21 +0900</pubDate>
    </item>
    <item>
      <title>DFS</title>
      <link>https://spongerice.tistory.com/181</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;Depth First Search&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊이 우선 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프의 깊은 부분을 우선적으로 탐색하는 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 경로로 탐색하다가 특정 상황에서 최대한 깊숙히 들어가 노드를 방문한 뒤, 다시 돌아가 다른 경로로 탐색하는 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기로 넘어가기 전 해당 분기를 완벽하게 탐색하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS 보단 느리다 (단순 검색 속도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백트래킹과 연관된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;DFS를 사용하는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 노드를 방문하고자 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순회를 하고자 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로에 특징을 저장해야 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 대상 그래프가 클 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf) 최단거리는 BFS가 유리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;동작 방식&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;탐색 시작 노드를 스택에 삽입하고 방문 처리&lt;/li&gt;
&lt;li&gt;스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리&lt;/li&gt;
&lt;li&gt;방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼냄&lt;/li&gt;
&lt;li&gt;2번을 더 이상 수행할 수 없을 때 까지 반복&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;방문 처리&lt;br /&gt;&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문처리로 인해 각 노드를 한 번씩만 처리할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;시간 복잡도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(N), N: 데이터의 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;code&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;def dfs(graph, v, visited):
    visited[v] = True # 방문 처리 
    print(v, end=' ') # 방문 노드 출력 
    for i in graph[v]: # 인접 노드 방문 
        if not visited[i] # 방문 한 적이 없으면 
            dfs(graph, i, visited) # dfs 호출 

graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

visitd = [False] * 9

dfs(graph, 1, visited)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1260&quot;&gt;1260번: DFS와 BFS&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682310429818&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1260번: DFS와 BFS&quot; data-og-description=&quot;첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1260&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1260&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OHelz/hySoCkn0xF/6rATR9DpYSet8ZquEFW111/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1260&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1260&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OHelz/hySoCkn0xF/6rATR9DpYSet8ZquEFW111/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1260번: DFS와 BFS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;2178번: 미로 탐색&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682310432579&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2178번: 미로 탐색&quot; data-og-description=&quot;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RhGov/hySozgTCnf/rDOK0AvBpNZsI1VbGkbWh1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RhGov/hySozgTCnf/rDOK0AvBpNZsI1VbGkbWh1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2178번: 미로 탐색&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/기본 지식</category>
      <category>dfs</category>
      <category>깊이우선탐색</category>
      <category>알고리즘</category>
      <category>코딩테스트</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/181</guid>
      <comments>https://spongerice.tistory.com/181#entry181comment</comments>
      <pubDate>Mon, 24 Apr 2023 13:27:51 +0900</pubDate>
    </item>
    <item>
      <title>android 버튼으로 unity 실행하기</title>
      <link>https://spongerice.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 프로젝트에서 버튼을 누르면 유니티가 실행되도록 하는 방법&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 유니티에서 게임을 export 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 안드로이드에서 export 한 게임을 Library로 추가한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 추가한 Library를 안드로이드 액티비티와 연결한다&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Unity에서 게임 export 하는 방법&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 유니티 접속&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. file &amp;rarr; build setting &amp;rarr; android &amp;rarr; player setting&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R6uUv/btr9AkW6oqz/jE0LwUfhKo58AXyPpM9tm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R6uUv/btr9AkW6oqz/jE0LwUfhKo58AXyPpM9tm0/img.png&quot; data-alt=&quot;player setting&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R6uUv/btr9AkW6oqz/jE0LwUfhKo58AXyPpM9tm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR6uUv%2Fbtr9AkW6oqz%2FjE0LwUfhKo58AXyPpM9tm0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1433&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1433&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;player setting&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진과 같이 설정해 준다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 이름 변경해주는 것도 잊지 말아야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. x 로 페이지 나가기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. export 설정해서 추출하기&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb5HFc/btr9AkbGvMh/zZJQ8UWO6sOT1XaKJI4qn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb5HFc/btr9AkbGvMh/zZJQ8UWO6sOT1XaKJI4qn0/img.png&quot; data-alt=&quot;unity export&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb5HFc/btr9AkbGvMh/zZJQ8UWO6sOT1XaKJI4qn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb5HFc%2Fbtr9AkbGvMh%2FzZJQ8UWO6sOT1XaKJI4qn0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1893&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1893&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;unity export&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;export 한 게임을 안드로이드에서 library로 추가하는 방법&amp;nbsp;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;build.gradle (project)에 아래 코드 추가&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1681271902701&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  flatDir {
      dirs &quot;${project(':unityLibrary').projectDir}/libs&quot;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. build.gradle (app)에 아래 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1681271920791&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// dependency 아래 
implementation project(':unityLibrary')
implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1681271936623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 추가 
minSdk 22 //== unity 에서 설정한 minSdk 값으로 설정 해야 한다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. gradle.properties 에 아래 코드 추가&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681271964980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#### unity
unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. local.properties에 아래 코드 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 컴퓨터에 설치된 sdk, ndk의 위치를 작성해야 한다&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681272009096&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sdk.dir=C\:\\Users\\pebis\\AppData\\Local\\Android\\Sdk
ndk.dir=C\:\\Users\\pebis\\AppData\\Local\\Android\\Sdk\\ndk\\25.2.9519653&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 윈도우 주소 명기법, 맥은 다른 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. setting.gradle에 아래 코드 추가&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681272072502&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// unity library 추가하는 코드 
include ':unityLibrary'
// export 한 게임의 unityLibrary 디렉토리 위치를 명시 - 컴퓨터에 따라 다름
project(':unityLibrary').projectDir=new File(&quot;C:\\CookAndroid\\Project\\UnityTest\\unityLibrary&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;export 한 파일 안에 unityLibrary 디렉토리의 위치를 명시하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. snyc 맞추고 build 하면 unityLibrary가 추가된다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kO4d9/btr9MpoW6wy/hQkVJZJb9PuyGq7JisadmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kO4d9/btr9MpoW6wy/hQkVJZJb9PuyGq7JisadmK/img.png&quot; data-alt=&quot;추가된 unityLirary&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kO4d9/btr9MpoW6wy/hQkVJZJb9PuyGq7JisadmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkO4d9%2Fbtr9MpoW6wy%2FhQkVJZJb9PuyGq7JisadmK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;442&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2433&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추가된 unityLirary&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가한 library를 안드로이드 activity와 연결하는 방법&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. unityLibrary/java 아래에 unityPlayerActivity가 존재&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 액티비티를 안드로이드 액티비티와 연결하면 된다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBfLqt/btr9zwcJ7it/eKI4NnFVBSjCMKnwKnkaa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBfLqt/btr9zwcJ7it/eKI4NnFVBSjCMKnwKnkaa0/img.png&quot; data-alt=&quot;unityPlayerActivity&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBfLqt/btr9zwcJ7it/eKI4NnFVBSjCMKnwKnkaa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBfLqt%2Fbtr9zwcJ7it%2FeKI4NnFVBSjCMKnwKnkaa0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;347&quot; height=&quot;290&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1673&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;unityPlayerActivity&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1681272398949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 예시 코드 - java
// UnityHandlerActivity에서 버튼을 누르면 UnityPlayerActivity (게임) 실행 

public class UnityHandlerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unity_handler);

        Button buttonClick = findViewById(R.id.button);
        buttonClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(UnityHandlerActivity.this, UnityPlayerActivity.class);
                startActivity(intent);
            }
        });
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결과&amp;nbsp;&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/437210981&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/ngUuR/hySe6UMYgz/wKKkhrXKwIwnLHRTUWCdtk/img.jpg?width=1080&amp;amp;height=1920&amp;amp;face=0_0_1080_1920,https://scrap.kakaocdn.net/dn/hnzpD/hySeWkjZw7/UFvROSSrNRctsuODnMLsl0/img.jpg?width=1080&amp;amp;height=1920&amp;amp;face=0_0_1080_1920&quot; data-video-width=&quot;420&quot; data-video-height=&quot;747&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;1529&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/437210981?service=daum_tistory&quot; width=&quot;420&quot; height=&quot;747&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고 자료&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/sf54tOAkmzU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/sf54tOAkmzU&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=sf54tOAkmzU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/lStTO/hySgkw8UbS/zRSjAT80l7SSO6NMjQRi9k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=92_526_146_586&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/sf54tOAkmzU&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>mobile/android</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/180</guid>
      <comments>https://spongerice.tistory.com/180#entry180comment</comments>
      <pubDate>Wed, 12 Apr 2023 13:10:23 +0900</pubDate>
    </item>
    <item>
      <title>[자바의 정석] chapter06. 객체지향 프로그래밍1 (2)</title>
      <link>https://spongerice.tistory.com/178</link>
      <description>&lt;h1&gt;오버로딩 (overloading)&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오버로딩이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것 &amp;rArr; 메서드 오버로딩&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오버로딩의 조건&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드 이름이 같아야 한다&lt;/li&gt;
&lt;li&gt;매개변수의 개수 또는 타입이 달라야 한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름이 같더라도 매개변수가 다르기에 메서드가 구분될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건을 만족시키지 않으면 중복 정의로 간주되어 컴파일 에러가 발생한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환 타입을 통해서만 구별되므로 반환타입은 영향을 미치지 않는다 (반환타입만 다르면 함수 중복으로 간주된다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수의 순서가 다르더라도 오버로딩된다&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;// 오버로딩 가능 
long add (int a, long b);
long add (long a, int b);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 매개변수의 순서를 외우지 않아도 되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add(3,3)과 같이 호출할 경우 어느 메서드가 호출된 것인지 판단할 수 없어 컴파일 에러가 발생한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오버로딩의 예&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;println&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수로 지정하는 값의 타입에 따라 호출되는 println 메서드가 달라진다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오버로딩의 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 이름으로만 구별된다면 한 클래스내의 메서드들은 모두 이름이 달라야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 println 메서드는 매개변수의 타입에 따라 println(), printlnBoolean(), printlnChar() 등으로 구별 되어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 오버로딩을 통해 여러 메서드들을 하나의 메서드로 정의할 수 있다면 기억하기 쉽고, 이름을 짧게 할 수 있어 오류의 가능성을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 장점은 메서드의 이름을 절약할 수 있다는 것이다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가변인자(varargs)와 오버로딩&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 개수를 동적으로 지정해줄 수 있는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입... 변수명 의 형식으로 선언&lt;/p&gt;
&lt;pre class=&quot;nimrod&quot;&gt;&lt;code&gt;public PrintStream printf(String format, Object... args) {...}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변인자는 항상 마지막에 선언해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변인자인지 아닌지 구별할 방법이 없기에 컴파일 에러가 발생한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변인자를 사용하여 선언된 메서드를 호출할 때 인자를 개수를 가변적으로 할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(없어도 되고, 배열을 넣어도 된다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변인자는 내부적으로 배열을 사용하기에 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다 (비효율적)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터로 배열 vs 가변인자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 파라미터로 배열을 준다면 반드시 인자를 주어야 하기에 인자를 생략할 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 가변인자로 파라미터를 준다면 인자가 없어도 되기에 인자를 생략할 수 있다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의할 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변인자를 선언한 메서드를 오버로딩하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서들를 호출했을 때 구분되지 못하는 경우가 발생하기에 주의해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하면 가변인자를 사용한 메서드는 오버로딩하지 않는 것이 좋다&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;static String concatenate (String delim, String... args) {
	String result = &quot;&quot;;
	for (String str: args) {
		result += str + delim;
	}
	return result;
}

static String concatenate (String... args) {
	return concatenate(&quot;&quot;, args);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 함수를 구별할 수 없기에 컴파일 에러가 발생한다&lt;/p&gt;
&lt;h1&gt;생성자 (Constructor)&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;생성자란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스가 생성될 때 호출되는 &lt;b&gt;인스턴스 초기화 메서드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수의 초기화 작업에 주로 사용되며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성시 실행되어야 할 작업을 위해서도 사용된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드와 유사하지만 리턴값이 없다는 것이 다르다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;생성자는 리턴 값이 없다&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;클래스이름(타입 변수명, 타입 변수명, ...) {
	// 인스턴스 생성시 수행될 코드, 
	// 주로 인스턴스 변수의 초기화 코드를 적는다
}

// 매개변수가 없는 생성자 
class Card {
	Card() {
	...
	}

// 매개변수가 있는 생성자 
class Card(String k, int num) {
	...
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자 new가 인스턴스를 생성하는 것이지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자가 인스턴스를 생성하는 것이 아니다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인스턴스를 생성하는 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Card c = new Card();&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;new 연산자에 의해 메모리(heap)에 Card 클래스의 인스턴스가 생성&lt;/li&gt;
&lt;li&gt;생성자 Card()가 호출되어 수행&lt;/li&gt;
&lt;li&gt;연산자 new의 결과로, 생성된 Card의 인스턴스 주소가 반환되어 참조변수 c에 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new Card()에서 Card()가 생성자였던 것!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 생성자 (default constructor)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일시 소스파일(*.java)에 생성자가 하나도 정의되어 있지 않은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일러는 자동적으로 아래와 같은 기본 생성자를 추가하여 컴파일한다&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;클래스이름() {}

// example
Card {]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별히 초기화되는 작업이 필요하지 않다면 컴파일러가 제공하는 기본 생성자를 사용하는 것도 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 기본 생성자는 정의되어 있는 &lt;b&gt;생성자가 하나도 없을 경우에만 생성&lt;/b&gt;되므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 생성자를 사용하고 싶다면 직접 정의해주어야 한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;매개변수가 있는 생성자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자도 메서드처럼 매개변수를 선언하여 인스턴스의 초기화 작업에 사용할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각기 다른 값으로 초기화되어야 하는 경우에 매개변수가 있는 생성자를 사용하면 된다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;코드를 간결하고 직관적으로 작성할 수 있다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스를 작성할 때 다양한 생성자를 제겅하여 인스턴스 생성 후에 별도로 초기화를 하지 않도록 하는 것이 바람직하다&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class Car {
	String color;
	String gearType;
	int door;

	Car() {} // 자동으로 기본 생성자가 생성되지 않기에 직접 추가 
	Car(String c, String g, int d) {
		color = c;
		gearType = g;
		door = d;
		}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;생성자에서 다른 생성자 호출하기 - this(), this&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 클래스의 멤버들 간에 서로 호출할 수 있는 것 처럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 간에도 서로 호출이 가능하다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성자의 이름으로 클래스 이름 대신 this를 사용&lt;/li&gt;
&lt;li&gt;한 생성자에서 다른 생성자를 호출할 대에는 &lt;b&gt;반드시 첫 줄&lt;/b&gt;에서만 호출 가능&lt;/li&gt;
&lt;li&gt;(생성자 내에서 초기화 작업 도중 다른 생성자를 호출하면, 호출된 다른 생성자 내에서도 멤버변수들을 초기화 하므로 다른 생성자들을 호출하기 이전의 초기화 작업이 무의미해진다)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊어서 서로 호출하도록 하여 유기적으로 연결해주면 더 좋은 코드를 얻을 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정이 필요한 경우 보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;Car() {
	this (&quot;white&quot;, &quot;auto&quot;, 4); // Car(String color, String gearType, int door) 호출
}

Car(String color, String gearType, int door) {
	this.color = color;
	this.gearType = gearType;
	this.door = door;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;this&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 자신을 가리키는 참조변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this 를 통해 인스턴스 변수에 접근할 수 있다 (인스턴스멤버만 사용 가능 - static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수 있기에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;staic 메서드는 인스턴스와 관련 없는 작업을 하므로 인스턴스에 대한 정보가 필요없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자의 매개변수로 선언된 변수의 이름과 생성자의 매개변수로 생성된 변수의 이름이 동일한 경우에는 인스턴스 변수 this를 사용하여 구분해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this.color: 인스턴스 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;color: 매개변수로 정의된 지역변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기에 매개변수와 인스턴스 변수의 이름이 일치하는 경우가 자주 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 경우에는 매개 변수의 이름을 다르게 하는 것 보다 this를 사용하여 구별되도록 하는 것이 더 명확하고 이해하기 쉽다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;aside&amp;gt;   this - 참조변수 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/aside&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;aside&amp;gt;   this(). this(매개변수) - 생성자 생성자, 같음 클래스의 다른 생성자를 호출할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/aside&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘은 비슷하게 생겼지만 완전히 다른 것 (참조변수와 생성자)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;생성자를 이용한 인스턴스의 복사&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용하고 있는 인스턴스와 같은 상태의 인스턴스를 만들고 싶을 때 생성자를 활용할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 인스턴스가 같은 상태이다 == 인스턴스의 모든 인스턴스 변수가 동일한 값을 가지고 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스의 상태를 전혀 모르더라도 인스턴스를 복사할 수 있다&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;class Car {
	...
	// 인스턴스의 복사를 위한 생성자 
	Car(Car c) {
		color = c.color;
		gearType = c.gearType;
		door = c.door;
	}
	...

	// 기존 생성자를 활용한 복사 생성자 
	Car(Car c) {
		this(c.color, c.gearType, c.door);
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;변수의 초기화&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변수의 초기화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수를 선언하고 처음으로 값을 저장하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기화를 하지 않으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버변수는 기본값으로 초기화되지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역변수는 반드시 사용자가 초기화 해주어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;aside&amp;gt;   멤버변수와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/aside&amp;gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멤버변수의 초기화 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명시적 초기화 (explicit initialization)&lt;/li&gt;
&lt;li&gt;생성자 (constructor)&lt;/li&gt;
&lt;li&gt;초기화 블럭(initialization block)클래스 초기화 블럭; 클래스변수를 초기화 하는데 사용&lt;/li&gt;
&lt;li&gt;인스턴스 초기화 블럭: 인스턴스변수를 초기화 하는데 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;명시적 초기화 (explicit initalization)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수를 선언과 동시에 초기화 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 초기화 방법 중 가장 우선적으로 고려&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;초기화 블럭(initialization block)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스 초기화 블럭인스턴스를 생성할 때 마다 (생성자와 같이, 생성자보다 먼저)&lt;/li&gt;
&lt;li&gt;인스턴스변수의 복잡한 초기화에 사용&lt;/li&gt;
&lt;li&gt;클래스 초기화 블럭클래스가 메모리에 로딩될 때 한번만 수행&lt;/li&gt;
&lt;li&gt;클래스 변수의 복잡한 초기화에 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스가 처음 로딩될 때 클래스 변수들이 자동적으로 메모리에 만들어지고, 곧바로 클래스 초기화블럭이 클래스변수들을 초기화&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;클래스 내에 블럭을 만들고 코드 작성&lt;/li&gt;
&lt;li&gt;클래스 초기화 블럭&lt;/li&gt;
&lt;li&gt;인스턴스 초기화 블럭 앞에 static 붙이기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기화 블럭 내에서는 조건문, 반복문, 예외 처리 등을 자유롭게 사용할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시적 초기화로 부족한 경우 초기화 블럭을 사용&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;class InitBlock {
	static { 
		//클래스 초기화 블럭 
	}
	{
		//인스턴스 초기화 블럭
	}
	...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수의 초기화는 주로 생성자를 이용하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행되어야 하는 코드를 넣는다&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;{
	// 인스턴스 초기화 블럭 
	// 모든 생성자에서 사용되는 코드
	count++;
	serialNo = count;
}

Car() {
	color = &quot;white&quot;;
	gearType = &quot;Auto&quot;;
}

Car(String color, String gearType) {
	this.color = color; 
	this.gearType = gearType;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 중복을 줄여 오류의 가능성을 줄여준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재사용성을 높이고 중복이 제거된다 &amp;rArr; 객체 지향 프로그래밍이 추구하는 목표&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멤버변수의 초기화 시기와 순서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 변수 인스턴스 변수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;초기화 시점&lt;/td&gt;
&lt;td&gt;단 한번 클래스가 처음 로딩될 때&lt;/td&gt;
&lt;td&gt;인스턴스가 생성될 때마다 각 인스턴스별로 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;초기화 순서&lt;/td&gt;
&lt;td&gt;기본값 &amp;rarr; 명시적초기화 &amp;rarr; 클래스 초기화 블럭&lt;/td&gt;
&lt;td&gt;기본값 &amp;rarr; 명시적 초기화 &amp;rarr; 생성자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class InitTest {
	// 명시적 초기화 
	static int cv = 1;
	int iv = 1;

	// 클래스 초기화 블럭 
	static { cv = 2; }
	// 인스턴스 초기화 
	{ iv = 2; }
	// 생성자 
	InitTest() {
		iv = 3;
	}
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Language/[Java] 자바의 정석</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/178</guid>
      <comments>https://spongerice.tistory.com/178#entry178comment</comments>
      <pubDate>Fri, 10 Feb 2023 14:13:49 +0900</pubDate>
    </item>
    <item>
      <title>[자바의 정석] chapter06. 객체지향 프로그래밍1 (1)</title>
      <link>https://spongerice.tistory.com/177</link>
      <description>&lt;h1&gt;객체지향언어&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체지향언어의 역사&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 이론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체지향언어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;li&gt;새로운 코드를 작성할 때 기존의 코들를 이용하여 쉽게 작성할 수 있다&lt;/li&gt;
&lt;li&gt;코드의 관리가 용이하다&lt;/li&gt;
&lt;li&gt;코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다&lt;/li&gt;
&lt;li&gt;신뢰성이 높은 프로그래밍을 가능하게 한다&lt;/li&gt;
&lt;li&gt;제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 재사용성이 높고 유지보수가 용이하다라는 특징은 프로그램 개발, 유지보수에 드는 시간과 비용을 획기적으로 개선하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재사용성, 유지보수, 중복 코드 제거라는 3가지 관점에서 객체 지향 개념을 이해한다면 보다 쉽게 접근 가능&lt;/p&gt;
&lt;h1&gt;클래스와 객체&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스와 객체의 정의와 용도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 객체의 설계도, 틀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 생성하는 데에 클래스가 사용되며, 객체는 클래스에 정의된 대로 생성됨&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 정의해 놓은 것&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스 용도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 생성하는 데 사용&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로그래밍에서 객체&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스에 정의된 내용대로 메모리에 생성된 것&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체의 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 존재하는 것, 사물 혹은 개념&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체의 용도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 가지고 있는 기능과 속성에 따라 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유,무형의 객체가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 객체를 생성되는 데 사용하는 것일 분 객체 자체는 아니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tv 설계서가 tv가 아닌 것과 같이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 사용하기 위해서는 클래스로부터 객체를 생성하는 과정이 선행되어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 특성으로 클래스를 한 번만 잘 만들어 둔다면 객체를 생성할 때마다 고민하지 않아도 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 사용하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDK는 유용한 클래스를 기본적으로 제공한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체와 인스턴스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스로 객체 만들기== 인스턴스화 (instantiate)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스로 만든 객체 == 인스턴스 (instance)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스와 객체는 동일한 의미이지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체는 모든 인스턴스를 대표하는 포괄적 의미, 인스턴스는 어떤 클래스로부터 만들어 진 것인지를 강조하는 보다 구체적인 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 &amp;rarr; 인스턴스화 &amp;rarr; 인스턴스(객체)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체의 구성요소 - 속성과 기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 == 속성과 기능의 집합 == 객체의 멤버 (member)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 == 객체를 정의한 것 &amp;rArr; 클래스에는 객체의 모든 속성과 기능의 정의 되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;속성 &amp;rarr; 멤버 변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기능 &amp;rarr; 메서드&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인스턴스의 생성과 사용&lt;/h2&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;// 인스턴스 생성
클래스 변수명; // 객체를 참조하기 위한 참조변수 선언 
변수명 = new 클래스명(); // 객체 생성 후 객체의 주소를 참조변수에 저장 

Tv t;
t = new Tv();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 변수를 생성만 하고 인스턴스를 생성하지 않고 연결하지 않으면, 해당 참조 변수로 아무 것도 할 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new() 코드를 작성해주어야 클래스의 인스턴스가 메모리의 빈 공간에 생성된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;li&gt;객체 생성&lt;/li&gt;
&lt;li&gt;객체의 주소를 참조 변수에 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인스턴스는 오직 참조변수를 통해서만 다룰 수 있으며&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참조변수의 타입은 인스턴스의 타입과 일치해야 한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 클래스로부터 생성되었더라고 각 인스턴스의 속성(멤버변수)는 서로 다른 값을 유지할 수 있다&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;...
Tv t1 = new Tv();
Tv t2 = new Tv();

t2 = t1; // t1, t2는 동일한 인스턴스를 가리킴
// t2가 가리키던 인스턴스는 더 이상 사용할 수 없다 
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조변수에는 하나의 값(주소)만이 저장될 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 이상의 참조변수가 하나의 인스턴스를 참조하는 것은 가능하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 참조변수가 여러 개의 인스턴스를 가지는 것은 불가능하다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;객체 배열&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 배열로 묶는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 주소가 저장된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;Tv t1, t2, t3;

Tv [] tvArr = new Tv[3]; // 객체 배열 - 아직 객체가 저장되지 않았음 
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 배열의 각 요소는 참조변수의 기본값인 null로 자동 초기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 배열의 칸에 객체의 주소를 저장할 수 있다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 많이 받는 질문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 배열만 생성해 두고 객체를 생성햇는데 에러가 발생합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 객체 배열을 생성하고 객체를 넣어야 한다&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;Tv [] tvArr = new tvArr[3]; // 객체 배열 생성 

// 객체를 각 요소에 저장 
// 방법 1 - 각 인덱스에 직접 접근 
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

// 방법 2 - 배열의 초기화 블럭 사용 
Tv[] tvArr = {new Tv(), new Tv(), new Tv()};

// 방법 3 - for 문 사용 
for (int i = 0 ; i &amp;lt; 3; i ++) 
	tvArr[i] = new Tv();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열에는 한 종류의 객체만 저장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 종류의 객체를 하나의 배열에 저장하기 위해서는&amp;hellip;?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 다형성(polymorphism) 사용&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스의 또 다른 정의&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 클래스 - 데이터와 함수의 결합&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수: 하나의 데이터를 저장할 수 있는 공간&lt;/li&gt;
&lt;li&gt;배열: 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간&lt;/li&gt;
&lt;li&gt;구조체: 서로 관련된 여러 데이터를 종류에 관계없이 하나으 ㅣ집합으로 저장할 수 있는 공간&lt;/li&gt;
&lt;li&gt;클래스: 데이터와 함수의 결합 (구조체 + 함수)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 클래스 - 사용자정의 타입 (user-defined type)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 정의 타입: 프로그래머가 서로 관련된 변수를 묶어 하나의 타입으로 새로 추가하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본형의 개수가 8개로 정해져 있지만 참조형의 개수가 정해져 있지 않은 이유&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;// 비객체지향적 코드 
// 매번 시 분 초를 각각 정의해주어야 한다 
int hour1, hour2, hour3;
int minute1, minute2, minute3;
float second1, second2, second3;

int [] hour = new int[3];
int [] minute = new int [3];
float [] second = new float[3];
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;// 객체지향적 코드 
// 시 분 초를 하나의 클래스로 묶어 정의 
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();

Time [] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시, 분, 초 데이터를 하나로 묶는 것을 넘어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 데이터의 제약 조건까지 모두 반영할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(추가 제약 조건 - 시분초의 범위 제약)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 언어가 아닌 언어에서는 추가적인 조건까지 반영하기 쉽지 않다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 언어에서 제어자를 사용한다면 위와 같은 추가 제약 조건들을 설정할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어자를 통해 직접 멤버 변수에 값을 지정하는 것을 허용하지 않고, 메서드를 통해서만 값을 변경할 수 있도록 할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public class Time {
	private int hour;
	private int minute;
	private float second;

	public int getHour() {return hour;}
	public int getMinute() {return minute;}
	public float getSecond() {return second;}

	// 직접 값 변경하는 거 제어 &amp;amp; 유효성 검증 
	public void setHour(int h) {
		if (h &amp;lt; 0 || h &amp;gt; 23) return;
		hour = h;
	}

	public void getMinute(int m) {
		if (m &amp;lt; 0 || m &amp;gt; 59) return;
		minute= h;
	}

	public void getSecond(int s) {
		if (s &amp;lt; 0 || s &amp;gt; 23) return;
		second= s;
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;변수와 메서드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;선언위치에 따른 변수의 종류&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변수의 종류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 변수, 인스턴스 변수, 지역 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 변수가 선언된 위치가 변수의 종류를 결정한다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지역변수멤버 변수를 제외한 나머지 변수들은 모두 지역변수&lt;/li&gt;
&lt;li&gt;메서드 영역에 선언된 변수&lt;/li&gt;
&lt;li&gt;클래스 변수&lt;/li&gt;
&lt;li&gt;static이 붙은 멤버 변수&lt;/li&gt;
&lt;li&gt;인스턴스 변수&lt;/li&gt;
&lt;li&gt;static 이 붙지 않은 변수&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Var
{
	int iv; // 인스턴스 변수 
	static int cv; // 클래스 변수 

	void method()
	{
		int lv = 0; // 지역 변수 
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;변수의 종류 선언 위치 생성시기&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;calss variable&lt;/td&gt;
&lt;td&gt;class area&lt;/td&gt;
&lt;td&gt;클래스가 메모리에 올라갈 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;instance variable&lt;/td&gt;
&lt;td&gt;class area&lt;/td&gt;
&lt;td&gt;인스턴스가 생성되었을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;local variable&lt;/td&gt;
&lt;td&gt;class area를 제외한 영역&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;(메서드, 생성자, 초기화 블럭 내부)&lt;/td&gt;
&lt;td&gt;변수 선언문이 수행되었을 때&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 인스턴스 변수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 영역에 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스의 인스턴스를 생성할 때 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수의 값을 불러오기 위해서는 인스턴스를 생성해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스마다 고유한 상태를 유지해야 한느 경우, 인스턴스 변수로 선언&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 클래스 변수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수 앞에 static 키워드 붙여 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 인스턴스들이 공통적인 값을 유지해야 하는 속성일 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(클래스를 저장하는 변수라는 의미가 아님)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 변수는 인스턴스를 생성하지 않고도 바로 사용할 수 있다&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// 클래스 변수 사용 방법
클래스이름.클래스변수
Var.cv; // Var 클래스의 클래스 변수 cv 사용 
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스가 메모리에 로딩될 때 생성되어 종료될 때 까지 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public을 붙이면 전역변수 성격을 갖는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조변수의 선언, 객체의 생성 등 클래스 정보가 필요할 때 메모리에 클래스가 로딩된다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 지역 변수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매서드 내에서만 사용 가능한 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 종료되면 소멸되어 사용불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블럭을 벗어나면 소멸되어 사용할 수 없다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스 변수와 인스턴스 변수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 카드를 클래스로 정의할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무늬 숫자는 인스턴스 변수로 정의,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카드의 크기는 클래스 변수로 정의하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(모든 카드들이 카드의 크기를 공유하기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수는 인스턴스.변수명 으로 사용하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 변수는 클래스명.변수명으로 사용한다 (클래스 변수를 인스턴스명.클래스변수명 으로도 사용할 수 있지만 혼동할 수 있기에 클래스명.변수명으로 사용하는 것이 바람직하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메서드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 작업을 수행하는 일련의 문장들을 하나로 묶은것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값, 출력값 모두 없을 수도 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 내부적으로 어떤 과정을 거쳐 결과를 내는 지는 전혀 몰라도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오직 입, 출력 값만 알면 된다 (메서드를 블랙 박스라고 부르는 이유)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드를 사용하는 이유&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;높은 재사용성 (reusabiliy)다른 프로그램에서도 사용할 수 있다&lt;/li&gt;
&lt;li&gt;한번 만들어 둔 메서드는 몇 번이고 호출 할 수 있으며,&lt;/li&gt;
&lt;li&gt;중복된 코드의 제거소스코드의 길이도 짧아지고, 수정해야 할 코드의 양 또한 줄어들어 오류가 발생할 가능성도 줄어든다&lt;/li&gt;
&lt;li&gt;반복되는 문장들을 하나의 메서드로 작성하여 중복된 코드를 제거할 수 있다&lt;/li&gt;
&lt;li&gt;프로그램의 구조화main 메서드는 프로그램의 전체 흐름이 한 눈에 들어올 정도로 단순하게 구조화 하는 것이 중요하다&lt;/li&gt;
&lt;li&gt;내용이 없는 메서드를 작업 단위로 만들어 놓고, 하나씩 완성해나가는 것도 좋은 방법&lt;/li&gt;
&lt;li&gt;큰 규모의 프로그램에서는 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화 시키는 것이 필수적이다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메서드의 선언과 구현&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 = 선언부 + 구현부&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;// 선언부 
반환타입 메서드이름 (타입변수명, 타입변수명, ...)
// 구현부 
{
		// 메서드 호출시 수행될 코드
}

int add(int a, int b) {
	int result = a + b;
	return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드 선언부 (method declaration, method header)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 선언부 = 메서드 이름 + 매개변수 선언 + 반환타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언부가 변경되면 호출되는 모든 곳도 변경해야 하기 때문&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매개변수 선언 (parameter declaration)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 작업을 수행하는 데 필요한 값들을 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 값의 개수만큼 선언하여 쉼표로 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 변수의 타입이 같아도 변수의 타입을 생략할 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력해야 할 값의 개수가 많은 경우 배열이나, 참조변수를 사용하면 된다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드의 이름 (method name)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명명규칙을 반영하여 메서드의 이름을 작성하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동사인 경우가 많으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름만으로 메서드의 기능을 알 수 있도록 함축적으로 작성하는 것이 좋다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반환 타입 (return type)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 작업 결과의 타입을 적는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환 값이 없으면 void를 적는다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드의 구현부(method body_&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 선언부 다음에 오는 괄호 == 메서드의 구현부&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;return 문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환 타입이 void가 아닌 경우 구현부 안에 return 반환값;을 반드시 작성해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return 타입은 반환타입과 일치하거나 자동 형변환이 가능한 것이어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 하나의 값만 반환할 수 있다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지역 변수 (local variable)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 안에 선연된 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수도 매서드 내에 선언된 것이므로 지역변수이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 메서드에 선언되었다면 변수의 이름이 같더라도 다른 변수이다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메서드의 호출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드를 호출해야만 구현부의 문장들이 수행된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 메서드는 프로그램 실행 시 os에 의해 자동적으로 호출된다&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// 메서드 호출 방법 
메서드이름 (값1, 값2, ...); 

int res = add(3, 5);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인자 (argument)와 매개변수 (parameter)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드를 호출할 때 지정해주는 값인 인자의 개수는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출된 메서드에 선언된 매개변수의 수와 일치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나 자동형변환이 가능한 것이어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환 타입이 void 가 아닌 경우 반환 값을 대입연산자로 변수에 저장하는 것이 보통이지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장하지 않아도 괜찮다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메서드의 실행 흐름&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만 static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출 할 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스에 선언된 메서드를 호출하기 위해서는 클래스의 인스턴스를 생성한 뒤 참조변수를 통해 호출해야 한다&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;MyMath mm = new MyMath();
int res = mm.add(1,3); // 호출한 자리를 반환값이 대신하고 변수에 저장된다 
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main 메서드에서 add 메서드를 호출한다&lt;/li&gt;
&lt;li&gt;호출시 지정한 인자들이 add의 매개변수 a, b에 복사 (대입)된다&lt;/li&gt;
&lt;li&gt;메서드 add의 괄호 안에 있는 문장들이 순서대로 실행된다&lt;/li&gt;
&lt;li&gt;메서드 add의 모든 문장이 실행되거나 , return 문을 만나면 호출한 메서드로 돌아와 이후의 문장들을 실행한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 호출되면 지금까지 실행중이던 메서드는 실행을 잠시 멈추고, 해당 메서드의 작업이 마무리 되면 다시 실행된다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;return 문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 반환값을 필수로 작성해주어야 하지만 컴파일러가 마지막에 return; 을 자동적으로 추가하기 때문에 필수로 작성하지 않아도 괜찮다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 반환값이 void가 아닌 경우에는 반드시 return 문을 작성해야 한다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반환값(return value)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환값으로 반드시 변수가 와야 하는 것은 아니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식이 와도 상관 없다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매개변수의 유효성 검사&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 구현부를 작성할 대 가장 먼저 해야 하는 일은 매개변수의 값의 유효성을 검사하는 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드를 작성할 때 호출하는 사람이 잘 넘기겠지 라는 생각을 절대로 가져서는 안된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입만 맞으면 어떠한 값이라도 넘어올 수 있기 때문에 가능한 모든 경우의 수에 대해 대비한 코드를 작성해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적절하지 않은 값이 매개변수를 통해 넘어온다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수의 값을 보정하던가, return을 사용하여 작업을 중단해야 한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JVM의 메모리 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응용프로그램이 실행되면, JVM은 시스템으로부터 메모리를 할당받고, 용도에 따라 여러 영역으로 나누어 관리한다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 메서드 영억&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스 파일 (*.class)을 읽어 분석하여 클래스에 대한 정보 (class data)를 이곳에 저장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 그 클래스의 클래스 변수도 함께 저장된다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 힙(heap)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스가 생성되는 공간 (인스턴스 변수들이 생성되는 공간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중 생성되는 모든 인스턴스는 이곳에 생성된다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 호출스택(call stack 또는 execution stack)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 작업에 필요한 메모리 공간 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드가 호출되면 호출된 메서드를 위한 메모리 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 중간중간 지역변수 (매개변수 포함) 들과 연산의 중간 결과 등을 저장하는 데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 마치면 할당된 메모리공간은 반환되어 비워짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 메서드를 위한 작업 공간은 서로 구분되며, stack 처럼 쌓인다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 메서드가 stack 영역에 들어오면 기존 메서드는 작업을 중단하고 새로 들어온 메서들를 작동시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출스택에 가장 상위에 있는 메서드가 현재 실행중인 메서드이며, 나머지는 대기상태 메서드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;호출스택의 특징&lt;/b&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;/li&gt;
&lt;li&gt;메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다&lt;/li&gt;
&lt;li&gt;호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다&lt;/li&gt;
&lt;li&gt;아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환타입이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller) 에게 반환한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본형 매개변수와 참조형 매개변수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사하여 넘겨준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수 타입이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본형이면 값이 복사되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조형이면 인스턴스 주소가 복사된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조형의 경우 인스턴스 주소가 복사되는 것이기에 변수의 값을 읽고 변경할 수 있다 (기본형은 읽기만 가능)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Data {int x;}

... 
Data d = new Data();
d.x = 10;
change(d.x); // 200 - 복사된 값의 값이 변경됨 (원본은 변경 안됨)
System.out.println(d.x); // 10 - 그대로 

...

// 기본형 변수의 값을 변경
static void change(int x) {
	x = 200;
	System.out.println(x);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Data {int x;}

... 
Data d = new Data();
d.x = 10;
change(d); // 200 - 객체 차제를 넘김
System.out.println(d.x); // 200 - 객체에 저장된 값이 변경됨 

...

// 매개변수를 참조형으로 선언 
// 참조형 변수의 값을 변경 
static void change(Data d) {
	d.x = 200;
	System.out.println(d.x);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조형 매개변수를 활용하면 반환값이 없어도 메서드의 실행결과를 얻어올 수 있다&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;int add (int a, int b) {
	return a + b; 
}

void add (int a, int b, int [] result) {
	result[0] = a + b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참조형 반환타입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환타입 또한 참조형이 될 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 참조형 타임의 값은 객체의 주소이므로 정수의 값이 반환되는 것 일 뿐이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;반환타입이 참조형이라는 것은&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;메서드가 객체의 주소를 반환한다는 것을 의미&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;class Data {int a;}

... main ...

Data d = new Data();
d.x = 10;

Data d2 = copy(d);

...

static Data copy(Data d) {
	Data tmp = new Data();
	tmp.x = d.x;

	return tmpl
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;재귀 호출 (recursive call)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 내부에서 메서드 자신을 호출하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 입장에선느 자기 자신을 호출하는 것이나 다른 메서드를 호출하는 것이나 동일하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호출된 메서드는 call by value를 통해 원래의 값이 아닌 복사된 값으로 작업, 호출된 메서드와 관계없이 독립적인 작업이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 호출에서 종료 조건이 없다면 무한히 반복되기 때문에 종료조건을 잊지 않고 작성해야 한다 재귀 호출은 반복문과 유사하기에 대부분의 재귀호출은 반복문으로 작성하는 것이 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(그렇다면 반복문을 재귀로 변경하는 것도 가능하다는 소리!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문보다 재귀호출의 수행시간이 더 오래걸린다 (매개변수 복사, 종류 후 복귀할 주소 저장 등등 필요)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재귀호출을 사용하는 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리적 간결함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 호출은 비효율적이므로 재귀호출에 드는 비용보다 재귀호출의 간결함이 주는 이득이 충분히 큰 경우에만 사용해야 한다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스 메서드 (static 메서드)와 인스턴스 메서드&lt;/h2&gt;
&lt;p&gt;클래스 메서드 인스턴스 메서드&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;staic 키워드 사용&lt;/td&gt;
&lt;td&gt;static 키워드 미사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 메서드도 클래스 변수와 마찬가지로 객체를 생성하지 않고도 클래스이름.메서드이름(매개변수) 형태로 호출이 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수는 인스턴스를 생성해야만 만들어지므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 메서드 역시 인스턴스를 생성해야만 호출할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반면에 인스턴스와 관계없는 (인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드 (static 메서드)로 정의한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 변수를 사용하지 않는다고 반드시 클래스 메서드로 정의해야 하는 것은 아니지만 특별한 이유가 없는 한 그렇게 하는 것이 좋다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다&lt;/li&gt;
&lt;li&gt;클래스 변수 (static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다&lt;/li&gt;
&lt;li&gt;클래스가 메모리에 올라갈 때 이미 자동적으로 생성&lt;/li&gt;
&lt;li&gt;클래스 메서드 (static 메서드)는 인스턴스 변수를 사용할 수 없다클래스 메서드는 인스턴스가 없어도 사용 가능하기에 인스턴스 변수가 존재하지 않을 수도 있다하지만 인스턴스 변수나 인스턴스메서드에서 static이 붙은 멤버를 사용하는 것은 가능하다&lt;/li&gt;
&lt;li&gt;그래서 클래스 메서드에 인스턴스 메서드 사용을 금지하는 것이다&lt;/li&gt;
&lt;li&gt;인스턴스 변수는 인스턴스가 반드시 존재해야 한다&lt;/li&gt;
&lt;li&gt;메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다static 을 붙이지 않은 인스턴스 메서드는 실행 시 호출되어야 할 메서드를 찾는 과정이 필요하기에 시간이 더 걸린다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 있으면 staitc&lt;/li&gt;
&lt;li&gt;작성한 메서드 중 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드의 static을 붙을 것을 고려한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메서드 호출 시간이 짧아지므로 성능이 향상된다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) Math 클래스의 메서드는 모두 클래스 메서드 (인스턴스 변수 없고, 수행하는데 필요한 모든 값들을 매개변수로 받아 처리)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스 멤버와 인스턴스 멤버간의 참조와 호출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 멤버가 인스턴스 멤버를 참조, 호출하기 위해서는 인스턴스를 생성해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;∵ 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하짐나, 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기에&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// 아래와 같이 축약 가능 
int result = new MemberCall().instanceMethod1();

// 이 경우 참조변수를 사용하지 않았기 땜누에 생성된 MemberCall 인스턴스는 더 이상 사용 불가 
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Language/[Java] 자바의 정석</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/177</guid>
      <comments>https://spongerice.tistory.com/177#entry177comment</comments>
      <pubDate>Fri, 10 Feb 2023 14:13:15 +0900</pubDate>
    </item>
    <item>
      <title>[자바의 정석] chapter 05. 배열 array</title>
      <link>https://spongerice.tistory.com/176</link>
      <description>&lt;h1&gt;배열 (array)&lt;/h1&gt;
&lt;h2&gt;배열(array)이란?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;같은 타입&lt;/strong&gt;의 여러 변수를 하나의 묶음으로 다루는 것 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 5개의 int를 저장할 수 있는 배열
int [] score = new int[5];
// score은 배열을 다루는 데 필요한 참조 변수 O, 저장공간 X &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저장공간이 연속적으로 배치되어 있다 &lt;/p&gt;
&lt;h2&gt;배열의 선언과 생성&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 선언 방법 1
// 타입 [] 변수이름;
int [] score;

// 선언 방법 2
// 타입 변수이름[];
int score[]; &lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;배열의 생성&lt;/h3&gt;
&lt;p&gt;배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간을 만드는 것 &lt;/p&gt;
&lt;p&gt;매열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다 &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;선언&lt;/th&gt;
&lt;th&gt;생성&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;참조 변수를 위한 공간 할당&lt;/td&gt;
&lt;td&gt;값을 저장할 수 있는 공간 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방법&lt;/td&gt;
&lt;td&gt;타입 [] 변수이름;&lt;/td&gt;
&lt;td&gt;변수이름 = new 타입 [길이];&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;td&gt;int [] score;&lt;/td&gt;
&lt;td&gt;score = new int[5];&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 선언과 동시에 생성하는 방법 
int [] score = new int [5];&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;배열의 길이와 인덱스&lt;/h2&gt;
&lt;p&gt;배열의 요소(elememt): 생성된 배열의 각 저장공간 &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;/p&gt;
&lt;h3&gt;배열의 길이&lt;/h3&gt;
&lt;p&gt;배열의 길이는 양의 정수여야 하며, 최대값은 int 형 타입의 최대값이다 &lt;/p&gt;
&lt;p&gt;길이가 0인 배열을 생성 할 수도 있다 → 꽤나 유용한 방법 (이후에 나옴)&lt;/p&gt;
&lt;h3&gt;배열이름.length&lt;/h3&gt;
&lt;p&gt;JVM이 모든 배열의 길이를 별도로 관리한다 &lt;/p&gt;
&lt;p&gt;&lt;code&gt;배열이름.length&lt;/code&gt;을 통해 배열의 길이에 대한 정보를 얻을 수 있다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int [] arr = new int [5];
int tmp = arr.length;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;배열의 길이는 한 번 설정하면 변경할 수 없기에 &lt;code&gt;배열이름.length&lt;/code&gt;는 상수이다 &lt;/p&gt;
&lt;p&gt;for 문의 조건식에 배열의 길이를 직접 작성하는 것 보다 &lt;code&gt;배열이름.length&lt;/code&gt; 을 사용하는 것이 좋다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int [] score = new int [5];

for (int i = 0 ; i &amp;lt; score.length; i++ ) {
        System.out.println(score[i]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;배열의 길이 변경하기&lt;/h3&gt;
&lt;p&gt;배열의 공간의 부족한 경우에는 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;더 큰 길이의 새로운 배열을 생성하고&lt;/li&gt;
&lt;li&gt;기존 배열의 내용을 새로운 배열에 복사한다 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;처음부터 배열의 길이를 넉넉하게 잡아 배열을 새로 생성하는 상황이 적게 발생하도록 해야 한다 &lt;/p&gt;
&lt;p&gt;(기존 길이의 2배 정도가 좋다) &lt;/p&gt;
&lt;h2&gt;배열의 초기화&lt;/h2&gt;
&lt;p&gt;배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화된다 &lt;/p&gt;
&lt;p&gt;원하는 값으로 초기화 하고 싶을 땐 각 요소에 접근하여 값을 지정하면 된다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;인덱스로 접근 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt; int [] score = new int [5];
 score [0] = 100;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for 문으로 인덱스 접근 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt; for (int i = 0 ; i &amp;lt; score.length; i++) 
     score[i] = i * 10  + 50;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;초기화 문법 사용 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt; int [] score = new int [] {1, 2, 3, 4, 5}; //배열의 길이를 명시하지 않아도 된다 

 // new 타입[] 생략 - 배열의 선언과 생성을 함께 하는 경우만 가능 
 // parameter로 int 배열을 받는 경우에도 동일 
 int [] score = {1, 2, 3, 4, 5};

 // 괄호 안에 아무 것도 넣지 않으면 길이가 0인 배열 생성 
 // 참조변수의 기본값은 null, 배열을 가리키는 참조변수는 null 대신 길이가 0인 배열로 초기화한다 
 int [] score = new int[0];
 int [] score = new int [] {};
 int [] score = {};&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;배열의 출력&lt;/h3&gt;
&lt;p&gt;배열에 저장된 값을 확인할 때도 for문을 사용하면 된다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;for 문 사용 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt; int [] iArr= {1, 2, 3, 4, 5};

 for (int i = 0; i &amp;lt; iArr.length; i++ ) {
     System.out.println(iArr[i]);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arrays.toString(배열이름)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt; int [] iArr ={1, 2, 3, 4, 5};

 System.out.println(Arrays.toString(iArr));
 // [1, 2, 3, 4, 5]

 System.out.println(iArr);
 // I@123123bb -&amp;gt; 타입@주소 
 // char 배열은 예외적으로 바로 배열의 값을 출력할 수 있다 &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;배열의 복사&lt;/h2&gt;
&lt;h3&gt;for 문을 이용&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int [] arr = new int [5];
int [] tmp = new int [arr.length * 2];

for (int i = 0 ; i &amp;lt; arr.length; i++)
    tmp[i] = arr[i]; // arr의 값 복사 

arr = tmp; // 참조 변수 arr이 tmp를 가리키도록 변경 -&amp;gt; arr와 tmp가 같은 배열을 가리킴
// 배열은 참조변수를 통해서만 접근 할 수있기에 자신을 가리키는 참조 변수가 없는 배열은
// 사용할 수 없다 -&amp;gt; 쓸모가 없어지면 JVM의 가비지 컬렉터에 의해 자동적으로 제거 &lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;System.arraycopy()를 이용&lt;/h3&gt;
&lt;p&gt;지정된 범위의 값들을 한 번에 통째로 복사 &lt;/p&gt;
&lt;p&gt;각 요소들이 연속적으로 저장되어 잇다는 배열의 특성 때문에 가능 &lt;/p&gt;
&lt;p&gt;for 문 보다 효율적이다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// num[0] 에서 numNum[0] 으로 num.length 개의 데이터를 복사 
// 크기 주의 (여유 공간이 없으면 error 발생)
System.arraycopy(num, 0, newNum, 0, num.length);&lt;/code&gt;&lt;/pre&gt;
&lt;h2&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;p&gt;정렬하기 &lt;/p&gt;
&lt;p&gt;빈도수 구하기 &lt;/p&gt;
&lt;p&gt;등등 &lt;/p&gt;
&lt;h1&gt;String 배열&lt;/h1&gt;
&lt;h2&gt;String 배열의 선언과 생성&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;String [] name = new String [3]; // 각 요소는 null로 초기화 &lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;String 배열의 초기화&lt;/h2&gt;
&lt;p&gt;int 배열과 동일한 방법으로 초기화 &lt;/p&gt;
&lt;p&gt;배열의 각 요소에 문자열을 지정하면 된다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;String [] name = new String [3];
name [0] = &amp;quot;Park&amp;quot;; // 원래 name[0] = new String(&amp;quot;Park&amp;quot;)이어야 하지만 String 은 예외

String [] name2 = new String[] {&amp;quot;Park&amp;quot;, &amp;quot;kim&amp;quot;};
String [] name3 = {&amp;quot;Park&amp;quot;, &amp;quot;kim&amp;quot;}; // new String[] 생략 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;String 배열과 같이 기본형 배열이 아닌 경우 배열에 저장되는 것은 객체의 주소이다 &lt;/p&gt;
&lt;h2&gt;char 배열과 String 클래스&lt;/h2&gt;
&lt;p&gt;문자열은 char 배열과 동일한 의미 &lt;/p&gt;
&lt;p&gt;그러나 자바에서는 char 배열이 아닌 String 클래스를 이용하여 문자열을 처리한다 &lt;/p&gt;
&lt;p&gt;→ char 배열에서 여러 기능을 추가한 것이 String 클래스이기 때문 &lt;/p&gt;
&lt;p&gt;중요! String 객체는 읽을 수만 있을 뿐 내용을 변경할 수는 없다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;String str = &amp;quot;java&amp;quot;;
str = str + &amp;quot;8&amp;quot;; // 문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성됨 
System.out.println(str); &lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;char 배열과 String 클래스의 변환&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;char [] chArr = {&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;, &amp;#39;C&amp;#39;};
String str = new String(chArr); // char -&amp;gt; String
char[] tmp = str.toCharArray(); // String -&amp;gt; char &lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;커맨드 라인을 통해 입력 받기&lt;/h2&gt;
&lt;p&gt;프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;c:\jdk1.8\work&amp;gt;java MainTest abc 123 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;커맨드라인을 통해 입력된 두 문자열은 String 배열에 담겨 MainTes 클래스의 main 메서드의 매개변수( args)에 전달된다 &lt;/p&gt;
&lt;p&gt;공백으로 구분되기에 공백이 있는 경우 &lt;code&gt;“&lt;/code&gt;로 감싸야 한다 &lt;/p&gt;
&lt;p&gt;커맨드라인에 매개변수를 입력하지 않으면 크기가 0인 배열이 생성되어 args.length의 값은 0이 된다. 매개변수가 입력되지 않아 배열을 생성하지 않으면 args의 값이 null이 될 것이고 args를 사용하는 모든 코드에서 에러가 발생한다 &lt;/p&gt;
&lt;p&gt;그러나 JVM이 입력된 매개변수가 없을 때 null 대신 크기가 0인 배열을 생성해서 args에 전달하여 오류가 발생하지 않게 되었다 &lt;/p&gt;
&lt;h1&gt;다차원 배열&lt;/h1&gt;
&lt;h2&gt;2차원 배열의 선원과 인덱스&lt;/h2&gt;
&lt;p&gt;2차원 배열은 배열의 배열의 값으로 되어 있다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 방법 1
int [][] score;

// 방법 2
int score [][];

// 방법 3
int [] score [];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;주로 테이블 형태의 데이터를 담는데 사용된다 &lt;/p&gt;
&lt;h3&gt;2차원 배열의 index&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;배열이름[행idx][열idx]&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;2차원 배열의 초기화&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int [][] arr = new int [][] {{1, 2, 3}, {4, 5, 6}};
int [][] arr = {{1, 2, 3}, {4, 5, 6}}; // 줄 바꿈 해주는 것이 좋다 &lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;System.out.println(arr.length); // 2 -&amp;gt; 배열의 배열이라는 것을 생각하면 된다 
System.out.println(arr[0].length); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;가변 배열&lt;/h2&gt;
&lt;p&gt;2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 설정할 수 있다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int [][] score = new int [5][]; // 두번째 차원의 길이 지정 안함 
score [0] = new int[3]; // 다른 크기로 생성 가능 
score [1] = new int[2];
score [2] = new int[6];&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;다차원 배열의 활용&lt;/h2&gt;
&lt;p&gt;좌표에 x 표하기 &lt;/p&gt;
&lt;p&gt;빙고 &lt;/p&gt;
&lt;p&gt;행렬의 곱셈&lt;/p&gt;
&lt;p&gt;단어 맞추기&lt;/p&gt;</description>
      <category>Language/[Java] 자바의 정석</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/176</guid>
      <comments>https://spongerice.tistory.com/176#entry176comment</comments>
      <pubDate>Fri, 10 Feb 2023 14:12:21 +0900</pubDate>
    </item>
    <item>
      <title>[자바의 정석] chapter 04. 조건문과 반복문 (if, switch, for, while, statement)</title>
      <link>https://spongerice.tistory.com/175</link>
      <description>&lt;h1&gt;chap 04. 조건문과 반복문&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;제어문 (control statement)&lt;br&gt;프로그램의 흐름을 바꾸는 역할&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h1&gt;1. 조건문 - if, switch&lt;/h1&gt;
&lt;p&gt;조건식 + {}으로 구성 &lt;/p&gt;
&lt;p&gt;조건식의 연산결과에 따라 실행할 문장이 달라져 프로그램의 실행흐름을 변경할 수 있다 &lt;/p&gt;
&lt;h2&gt;1.1 if 문&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;조건문이 true이면 {} 안의 문장 수행&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;if (조건식) {
    // 조건식 == true 일 때 실행 
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;조건식&lt;/h3&gt;
&lt;p&gt;일반적으로 비교연산자와 논리연산자로 구성 &lt;/p&gt;
&lt;p&gt;등가 연산자 (==) 대신 대입 연산자 (=)를 사용하지 않도록 주의하자 &lt;/p&gt;
&lt;p&gt;조건식의 결과는 반드시 true, false가 되어야 한다 &lt;/p&gt;
&lt;h3&gt;블럭 {}&lt;/h3&gt;
&lt;p&gt;{}을 사용하여 여러 문장을 하나의 단위로 묶을 수 있다 &lt;/p&gt;
&lt;p&gt;이것을 블럭이라 한다 &lt;/p&gt;
&lt;p&gt;&lt;code&gt;}&lt;/code&gt; 다음에 &lt;code&gt;;&lt;/code&gt;을 붙이지 않는다는 것에 주의하자 &lt;/p&gt;
&lt;p&gt;블럭 안의 문장들은 탭으로 들여쓰기 하는 것이 좋다 &lt;/p&gt;
&lt;p&gt;블럭 안에 한 문장만 넣거나 문장을 넣지 않을 수 있는데 이 때는 괄호를 생략할 수 있다 (혹은 한 줄로 작성할 수 있다) &lt;/p&gt;
&lt;p&gt;그러나 생략하지 않고 작성하는 것이 좋다. &lt;/p&gt;
&lt;p&gt;이후에 새로운 문장이 추가 될 때 수정이 용이하기 때문이다. (실수 주의!)&lt;/p&gt;
&lt;h2&gt;1.2 if-else 문&lt;/h2&gt;
&lt;p&gt;조건식의 결과가 false 일 때, else 블럭의 문장이 실행된다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;if (조건식) {
    // 조건식 == true 일 때 실행될 문장
} else {
    // 조건식 == false 일 때 실행될 문장 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두 개의 if문을 항상 if-else 문으로 변경할 수 있는 것은 아니다 &lt;/p&gt;
&lt;p&gt;그러나 변경이 가능하다면 변경하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;조건식 검사 횟수를 줄일 수 있기에 효율적이고, 간결하게 코드를 작성할 수 있다. &lt;/p&gt;
&lt;h2&gt;1.3 if-else if문&lt;/h2&gt;
&lt;p&gt;처리해야 할 경우가 세가지 이상일 때 사용 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;if (조건식1) {
    // 조건식1 == true 일 때 실행될 문장
} else if (조건식2) {
    // 조건식2 == true 일 때 실행될 문장
}
else { // 생략 가능 
    // 어느 조건도 만족하지 못할 때 실행될 문장 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;if-else if문이 여러개의 if문을 합쳐놓은 것이지만 &lt;/p&gt;
&lt;p&gt;조건식을 바꾸지 않고 여러 개의 if문으로 쪼개 두기만 하면 전혀 다른 코드가 된다는 것에 주의하자 &lt;/p&gt;
&lt;h2&gt;1.4 중첩 if문&lt;/h2&gt;
&lt;p&gt;if문 블럭 내에 또 다른 if문을 포함시키는 것 &lt;/p&gt;
&lt;p&gt;중첩 횟수의 제한은 없다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;if (조건식1) {
    // 조건식1 == true 일 때 실행될 문장
    if(조건식2) {
        // 조건식 1, 2가 모두 true 일 때 수행
    } else {
        // 조건식1 == ture &amp;amp;&amp;amp; 조건식2 == false 일 때 수행 
} else {
    // 조건식1 == false 일 때 수행
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;중첩 if문은 들여쓰기를 명확히하여 if문의 범위가 명확히 구분되도록 하는 것이 중요하다 &lt;/p&gt;
&lt;p&gt;괄호문 생략에 더욱 주의가 필요하다 &lt;/p&gt;
&lt;p&gt;바깥쪽의 if문과 안쪽의 if문이 엉켜 의도한 바와 다른 결과를 낼 수 있기 때문이다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// ex1 
if (num &amp;gt;=0)
    if(num!=0)
        sign = &amp;#39;+&amp;#39;l
else 
    sign = &amp;#39;-&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ex1의 else 문은 바깥쪽에 속한 것 처럼 보이지만 괄호가 없기에 가장 가까운 if문에 속하게 된다.&lt;/p&gt;
&lt;p&gt;그 결과 원래 의도와는 다르게 ex2 코드와 같이 동작하게 된다 &lt;/p&gt;
&lt;p&gt;그렇기에 중첩 if문을 작성할 경우 괄호를 넣어 블럭간의 관계를 확실하게 하는 것이 중요하다 &lt;/p&gt;
&lt;h2&gt;1.5 switch 문&lt;/h2&gt;
&lt;p&gt;if문은 경우의 수가 많아질 수록 else-if를 계속 추가해야 하기에 복잡해지고 여러개의 조건식을 계산 해야 하므로 처리 시간도 많이 걸린다. &lt;/p&gt;
&lt;p&gt;이에 비해  switch문은 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현 또한 간결하다 &lt;/p&gt;
&lt;p&gt;그렇기에 경우의 수가 많은 경우 switch문으로 작성하는 것이 좋다 &lt;/p&gt;
&lt;p&gt;다만, switch문에는 제약 조건이 있기에 경우의 수가 많아도 if문으로 작성해야 하는 경우가 존재한다 &lt;/p&gt;
&lt;p&gt;switch문의 작동 순서 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;조건식 계산 &lt;/li&gt;
&lt;li&gt;조건식의 결과와 일치하는 case 문으로 이동 &lt;/li&gt;
&lt;li&gt;이후의 문장 수행 &lt;/li&gt;
&lt;li&gt;break 문이나 switch문의 끝을 만나면 switch문 전체를 빠져 나간다 &lt;/li&gt;
&lt;li&gt;만약 조건식의 결과가 일치하는 case 문이 하나도 없다면 default 문으로 이동한다 (생략 가능)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;switch문에서 break문은 각 case 의 영역을 구분하는 역할을 한다. &lt;/p&gt;
&lt;p&gt;그렇기에 break를 생략하면 case 간의 구분이 없어지므로 다른 break문을 ㅁ나나거나 switch문의 마지막 블럭을 만날 때 까지 나오는 모든 문장을 수행한다&lt;/p&gt;
&lt;p&gt;break문을 생략하지 않도록 주의하자 &lt;/p&gt;
&lt;p&gt;그러나 의도적으로 break 문을 생략하는 경우도 있는데 그 예시는 아래와 같다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 등급에 맞는 권한을 부여하는 코드 
switch (level) {
    case 3: 
        grantDelete(); // 삭제 권한
    case 2: 
        grantWrite(); //쓰기 권한 
    case 1:
        grantRead(); // 읽기 권한 
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;switch 문의 제약 조건&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;switch문의 조건식은 결과 값이 반드시 정수여야 하며, 이 값과 일치하는 case문으로 이동하기에 case 문의 값 역시 정수여야 한다. &lt;/li&gt;
&lt;li&gt;case 의 조건이 중복되어서는 안된다 &lt;/li&gt;
&lt;li&gt;case 문은 반드시 상수여야 한다 (변수, 실수, 문자열은 안된다)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;⇒ 정리 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;switch문의 조건식의 결과는 정수 또는 문자열이어야 한다. &lt;/li&gt;
&lt;li&gt;case 문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;만약 조건문에서 부등식이 사용된다면 if문을 switch문으로 변경할 수 없게 된다 &lt;/p&gt;
&lt;p&gt;또한 조건식의 결과가 실수가 된다면 정수 값으로 변환하여 작성해주어야 한다 &lt;/p&gt;
&lt;h3&gt;switch문의 중첩&lt;/h3&gt;
&lt;p&gt;switch문도 중첩이 가능하다&lt;/p&gt;
&lt;p&gt;break문을 빼먹지 않도록 주의하자 &lt;/p&gt;
&lt;h1&gt;2. 반복문 - for, while, do-while&lt;/h1&gt;
&lt;p&gt;주어진 조건을 반복하는 동안 주어진 문장들을 반복적으로 수행한다 &lt;/p&gt;
&lt;p&gt;for 문과 while문은 어느 경우에나 서로 변환이 가능하여 어느 것을 선택해도 괜찮으나, &lt;/p&gt;
&lt;p&gt;for 문은 주로 반복횟수를 알고 있을 때 사용한다 &lt;/p&gt;
&lt;h2&gt;2.1 for문&lt;/h2&gt;
&lt;p&gt;반복 횟수를 알고 있을 때 for 문을 사용하면 적합하다. &lt;/p&gt;
&lt;h3&gt;for 문의 구조와 수행순서&lt;/h3&gt;
&lt;p&gt;초기화, 조건식, 증감식, 블럭 으로 구성되어 있다&lt;/p&gt;
&lt;p&gt;조건문이 true인 동안 블럭 내의 문장을 반복하다 거짓이되면 반복문을 벗어난다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;for (초기화;조건식;증감식) {
    // 조건식이 true 일 경우 동작 
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;초기화&lt;/h3&gt;
&lt;p&gt;반복문의 사용될 변수를 초기화 하는 부분이며 처음에 한 번만 수행된다 &lt;/p&gt;
&lt;p&gt;둘 이상의 변수가 필요할 경우 comma(,)를 사용하여 변수를 구분한다&lt;/p&gt;
&lt;p&gt;이때, 두 변수의 타입이 같아야 한다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;for (int i = 1, j = 0; i &amp;lt; 10; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;조건식&lt;/h3&gt;
&lt;p&gt;조건식의 값이 true이면 반복을 계속 진행하고 &lt;/p&gt;
&lt;p&gt;false 이면 반복을 중단하고, for문을 벗어난다. &lt;/p&gt;
&lt;p&gt;주의! &lt;/p&gt;
&lt;p&gt;조건식을 잘못 작성하면 블럭 내의 문장이 한번도 수행되지 않거나, 영원히 반복될 수 있다 &lt;/p&gt;
&lt;h3&gt;증감식&lt;/h3&gt;
&lt;p&gt;반복문을 제어하는 변수의 값을 증가, 감소시키는 식 &lt;/p&gt;
&lt;p&gt;매 반복마다 변수의 값이 증감식에 의해 점진적으로 변하다가 조건식이 fasle가 되어 for 문을 벗어나게 된다 &lt;/p&gt;
&lt;p&gt;주로 &lt;code&gt;++&lt;/code&gt;연산자가 사용되지만 &lt;code&gt;--&lt;/code&gt; , &lt;code&gt;+=&lt;/code&gt; &lt;code&gt;-=&lt;/code&gt; 등 다양한 연산자가 사용될 수 있다  &lt;/p&gt;
&lt;p&gt;증감식도 comma(&lt;code&gt;,&lt;/code&gt;)를 사용하여 두 분장을 하나로 이어 사용할 수 있다 &lt;/p&gt;
&lt;p&gt;초기화, 조건식, 증감식은 모두 생략 할 수 있다. &lt;/p&gt;
&lt;p&gt;조건식이 생략된 경우 항상 true가 되어 무한 반복문이 된다 &lt;/p&gt;
&lt;p&gt;이 경우 블럭 안에 if 문을 넣어 조건을 만족할 때 블럭을 빠져 나올 수 있도록 해야 한다 &lt;/p&gt;
&lt;p&gt;여러개의 변수를 초기화와 증감식에 사용할 수 있지만 사용되는 변수의 수가 적은 것이 더 효율적이고 간단하다. &lt;/p&gt;
&lt;p&gt;변수들의 관계를 잘 파악하여 불필요한 변수의 사용을 줄이는 것이 좋다 &lt;/p&gt;
&lt;p&gt;나머지 연산자 (&lt;code&gt;%&lt;/code&gt;) 는 특정 범위의 값들을 순환하며 반복하고&lt;/p&gt;
&lt;p&gt;나누기 연산자 (&lt;code&gt;/&lt;/code&gt;) 는 같은 값이 연속적으로 반복된다 &lt;/p&gt;
&lt;h3&gt;중첩 for 문&lt;/h3&gt;
&lt;p&gt;for 문 안에 다른 for 문을 포함시킬 수 있다&lt;/p&gt;
&lt;h3&gt;향상된 for문 (enhanced for statement)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;for (타입 변수명 : 배열 또는 컬렉션) {
        // 반복할 문장 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;배열 또는 컬렉션에 저장된 값을 하나씩 반복하며 변수에 저장하기에&lt;/p&gt;
&lt;p&gt;타입은 반드시 &lt;code&gt;배열 또는 컬렉션의 요소 타입&lt;/code&gt;이어야 한다. &lt;/p&gt;
&lt;p&gt;반복문의 괄호 안에서는 해당 변수를 사용하여 코드를 작성한다 &lt;/p&gt;
&lt;p&gt;// python의 for문을 생각하면 이해하기 쉽다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;for (int tmp: arr) {
    System.out.println(tmp);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.2 while 문&lt;/h2&gt;
&lt;p&gt;조건식이 true인 동안 블럭 내의 문장을 반복한다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;while (조건식) {
    // 조건식 == true 일 동안 반복 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for문과 while문은 항상 서로 변환이 가능하다 &lt;/p&gt;
&lt;p&gt;초기화나 증감식이 필요하지 않은 경우라면 while문이 더욱 적합하다 &lt;/p&gt;
&lt;h3&gt;while 문의 조건식은 생략 불가&lt;/h3&gt;
&lt;p&gt;조건식이 없다면 error 발생 → 항상 참이되도록 하고 싶으면 &lt;code&gt;true&lt;/code&gt;를 넣으면 된다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 무한 반복문 
while (true) {}
for (;;) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;무한 반복문은 반드시 블럭 안에 종료 조건을 넣어서 빠져나올 수 있게 해야 한다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;반복문을 사용하여 지연시간 주는 방법&lt;/strong&gt; &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;for (int i = 0 ; i &amp;lt; 2_000_000_000; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;흔히 하는 실수&lt;/strong&gt; &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;for(int i = 0; i &amp;lt; 10; i++ )**;** // 실수로 &amp;#39;;&amp;#39; 을 찍지 않도록 하자
{
    System.out.println(&amp;quot;hello&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;숫자와 &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;어떤 수를 10으로 나머지 연산하면&lt;/p&gt;
&lt;p&gt;  마지막 자리를 얻을 수 있다 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;어떤 수를 10으로 나누면&lt;/p&gt;
&lt;p&gt;  마지막 한자리가 제거된다 &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2.3 do-while문&lt;/h2&gt;
&lt;p&gt;while문의 변형으로 기본적인 구조는 while문과 동일하다 &lt;/p&gt;
&lt;p&gt;조건식과 블럭의 순서를 변경했다는 차이가 있다. &lt;/p&gt;
&lt;p&gt;블럭을 먼저 수행한 뒤 → 조건식을 평가한다 &lt;/p&gt;
&lt;p&gt;while 문은 블럭이 한 번도 수행되지 않을 수도 있지만&lt;/p&gt;
&lt;p&gt;do-while문은 최소한 한번은 실행된다. (실행을 보장한다)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;do {
    // 조건식의 연산결과가 참일 때 수행될 문장들 
} while (조건식); // &amp;#39;;&amp;#39; 필수! &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;반복적으로 사용자의 입력을 받아서 처리할 때 유용하다 &lt;/p&gt;
&lt;h2&gt;2.4 break문&lt;/h2&gt;
&lt;p&gt;자신이 포함된 가장 가까운 반복문을 벗어난다 &lt;/p&gt;
&lt;p&gt;if 문과 주로 사용되며 특정 조건을 만족하면 반복문을 벗어날 수 있도록 구성한다 &lt;/p&gt;
&lt;h2&gt;2.5 continue문&lt;/h2&gt;
&lt;p&gt;반복문 내에서만 사용될 수 있다 &lt;/p&gt;
&lt;p&gt;반복이 진행되는 도중에 continue문을 ㅁ나나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다 &lt;/p&gt;
&lt;p&gt;for 문의 경우 증감식으로 이동하고, ‘&lt;/p&gt;
&lt;p&gt;while 문과 do-while문은 조건식으로 이동한다 &lt;/p&gt;
&lt;p&gt;반복문을 벗어나지 않고 다음 반복으로 넘어가기에 break와 다른다 &lt;/p&gt;
&lt;p&gt;주로 if문과 사용되며, 특정 조건을 만족하는 경우에 continue문 이후의 문장을 수행하지 않고 다음 반복으로 넘어가 계속 진행하도록 한다 &lt;/p&gt;
&lt;p&gt;전체 반복 중 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다 &lt;/p&gt;
&lt;h2&gt;2.6 이름 붙은 반복문&lt;/h2&gt;
&lt;p&gt;break문은 근접한 단 하나의 반복문만 벗어날 수 있기에&lt;/p&gt;
&lt;p&gt;여러개의 반복문이 중첩된 경우에는 break문을 사용하여 중첩 반복문을 완전히 벗어날 수 없다 &lt;/p&gt;
&lt;p&gt;이때 중첩 반복문의 이름을 붙이고 break문과 continue문에 이름을 지정해줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다&lt;/p&gt;</description>
      <category>Language/[Java] 자바의 정석</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/175</guid>
      <comments>https://spongerice.tistory.com/175#entry175comment</comments>
      <pubDate>Wed, 18 Jan 2023 23:05:55 +0900</pubDate>
    </item>
    <item>
      <title>[자바의 정석] chapter 03. 연산자 operator</title>
      <link>https://spongerice.tistory.com/174</link>
      <description>&lt;h2&gt;1. 연산자 (operator)&lt;/h2&gt;
&lt;p&gt;연산을 수행하는 기호 &lt;/p&gt;
&lt;h3&gt;1.1 연산자와 피연산자&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;연산자 (operator)&lt;/strong&gt;:  연산을 수행하는 기호 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;피연산자 (operand)&lt;/strong&gt;:  연산의 작업 대상 (변수, 상수, 리터럴, 수식)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;연산자는 피연산자로 연산을 수행하고 나면 항상 결과 값을 반환한다&lt;/strong&gt; &lt;/p&gt;
&lt;h3&gt;1.2 식과 대입연산자&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;식:&lt;/strong&gt; 연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;식 평가&lt;/strong&gt;: 식을 계산하여 결과를 얻는 것 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;작성한 식을 프로그램에 포함시키기&lt;/strong&gt;: 식의 끝에 ‘&lt;code&gt;;&lt;/code&gt;’ 붙이기  &lt;/p&gt;
&lt;p&gt;평가된 값은 &lt;strong&gt;대입 연산자&lt;/strong&gt; ’&lt;code&gt;=&lt;/code&gt;’를 사용해야만 저장된다 &lt;/p&gt;
&lt;h3&gt;1.3 연산자의 종류&lt;/h3&gt;
&lt;p&gt;분류1. 산술, 비교, 논리, 대입 연산자 &lt;/p&gt;
&lt;p&gt;분류2. 단항, 이항, 삼항 연산자 &lt;/p&gt;
&lt;h3&gt;1.4 연산자의 우선순위와 결합 규칙&lt;/h3&gt;
&lt;p&gt;연산자가 둘 이상일 경우, 연산자의 우선순위에 의해 연산순서가 결정된다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주의해야 할 연산자 우선순위의 예와 설명&lt;/strong&gt; &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;x &amp;lt;&amp;lt; 2 + 1&lt;/code&gt; &lt;/p&gt;
&lt;p&gt; &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; 연산자는 덧셈 연산자보다 우선순위가 낮기에 해당 식은 &lt;code&gt;x &amp;lt;&amp;lt; (2+1)&lt;/code&gt;과 같다&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;data &amp;amp; 0xFF == 0&lt;/code&gt; &lt;/p&gt;
&lt;p&gt; &amp;amp; 연산자는 == 연산자보다 운선순위가 낮기에 해당 식은  &lt;code&gt;data &amp;amp; (0xFF == 0)&lt;/code&gt; 와 같다 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;x &amp;lt; -1 || x &amp;gt; 3 &amp;amp;&amp;amp; x &amp;lt; 5&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; OR 연산자는 AND 연산자보다 우선순위가 낮기에 해당 식은 &lt;code&gt;x &amp;lt; -1 || (x &amp;gt; 3 &amp;amp;&amp;amp; x &amp;lt; 5)&lt;/code&gt; 와 같다 &lt;/p&gt;
&lt;p&gt; 수식에 AND와 OR 연산자가 동시에 사용된다면 괄호를 사용하여 순위를 명확히 하는 것이 좋다 &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;+) 괄호는 연산자가 아니다. 연산자의 우선순위를 임의로 정할 때 사용하는 기호이다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;연산자의 결합 규칙&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;왼쪽 → 오른쪽: 대부분의 연산자 &lt;/p&gt;
&lt;p&gt;오른쪽 → 왼쪽: 단항 연산자, 대입 연산자 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;****&lt;/strong&gt;정리&lt;strong&gt;****&lt;/strong&gt; &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;산술 &amp;gt; 비교 &amp;gt; 논리 &amp;gt; 대입 순서로 연산이 진행된다 &lt;/li&gt;
&lt;li&gt;단항 &amp;gt; 이항 &amp;gt; 삼항 순서로 연산이 진행된다 &lt;/li&gt;
&lt;li&gt;단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽 → 오른쪽 &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.5 산술 변환 (usual arithmetic conversion)&lt;/h3&gt;
&lt;p&gt;이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하다 &lt;/p&gt;
&lt;p&gt;대부분의 경우 자동적으로 피연산자의 타입 중 큰 타입으로 형변환이 진행된다 &lt;/p&gt;
&lt;p&gt;(작은 타입으로 형변환이 될 경우 값이 손실 될 수 있다)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;산술 변환 (일반 산술 변환) 규칙&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;두 피연산자의 타입을 같게 일치시킨다 (보다 큰 타입으로 일치)&lt;/p&gt;
&lt;p&gt; 피연산자의 값 손실을 최소화 하기 위해&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;피연산자의 타입이 int 보다 작은 타입이면 int로 변환된다 &lt;/p&gt;
&lt;p&gt; 정수를 가장 효율적으로 처리하기 위해 &lt;/p&gt;
&lt;p&gt; (예를 들어 char, short은 연산 중 오버플로우가 발생할 수 있다)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;주의&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;연산결과의 타입은 피연산자의 타입과 일치한다 &lt;/p&gt;
&lt;p&gt;int / int  → int (연산결과가 실수라면 정수부 부분을 제외한 부분이 버려진다)  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. 단항 연산자&lt;/h2&gt;
&lt;h3&gt;2.1 증감 연산자 ++ --&lt;/h3&gt;
&lt;p&gt;피연산자에 저장된 값을 1 증가 도는 감소시키는 연산자 &lt;/p&gt;
&lt;p&gt;오직 대입연산자와 증감연산자만이 피연산자의 값을 변화시킨다 &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;타입&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;사용 예&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;전위형&lt;/td&gt;
&lt;td&gt;값이 참조되기 전에 증가&lt;/td&gt;
&lt;td&gt;j = ++i;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;후위형&lt;/td&gt;
&lt;td&gt;값이 참조된 후에 증가&lt;/td&gt;
&lt;td&gt;j = i++;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;증감 연산자가 수식이나 메서드 호출 중간에 포함될 때 차이가 발생한다 &lt;/p&gt;
&lt;p&gt;독립적인 하나의 문장으로 사용된 경우에는 전위형과 후위형의 차이가 없다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int i = 5, j = 0;

j = i++;
System.out.println(&amp;quot;i = &amp;quot; + i + &amp;quot;, j = &amp;quot; + j); // i = 6, j = 5

i = 5, j = 0; 
j = ++i;
System.out.println(&amp;quot;i = &amp;quot; + i + &amp;quot;, j = &amp;quot; + j); // i = 6, j = 6&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;하나의 식에서 증감연산자의 사용을 최소화하고, &lt;/p&gt;
&lt;p&gt;식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것을 피해야 한다 &lt;/p&gt;
&lt;h3&gt;2.2 부호 연산자 + -&lt;/h3&gt;
&lt;p&gt;피연산자의 부호를 반대로 변경한 결과를 반영하는 연산자 &lt;/p&gt;
&lt;p&gt;boolean, char 형을 제외한 기본형에서만 사용 가능하다   &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3. 산술 연산자&lt;/h2&gt;
&lt;p&gt;주의 할 점 위주로 서술 &lt;/p&gt;
&lt;h3&gt;3.1 사칙 연산자 +-*/&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;연산결과의 타입은 피연산자의 타입과 일치&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int a = 10;
int b = 4;

system.out.println(&amp;quot;%d / %d = %d%n&amp;quot;, a, b, a / b); // 10 / 4 = 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;나누기 연산에서 두 피연산자가 모두 int 형일 때 연산 결과도 int이기에 소수점 이하는 버려진다 &lt;/p&gt;
&lt;p&gt;올바른 연산 결과를 얻기 위해선느 피연산자 중 어느 한 쪽을 실수형으로 변경해야 한다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;system.out.println(&amp;quot;%d / %d = %d%n&amp;quot;, a, (float)b, a / (float)b); 
// 10 / 4.000000 = 2.500000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두 피연산자의 타입이 일치하지 않으면 int 타입 보다 범위가 넓은 float 타입으로 일치시킨 후 연산이 수행되기에 연산 결과가 float 형이 된다  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;0으로 나누기 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다 → ArithmeticException&lt;/p&gt;
&lt;p&gt;부동 소수점 값인 0.0f, 0.0d로 나누는 것은 가능하지만 그 결과는 Infinity이다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;명시적 형 변환이 필요한 경우 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;byte a = 10;
byte b = 20;
byte c = a + b;  // 컴파일 에러 
System.out.println(c);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;int형 보다 작은 정수형은 계산시 int형으로 변환 된 뒤 계산이 진행된다&lt;/p&gt;
&lt;p&gt;byte는 계산 시 int 형으로 변환되어 a + b의 결과는 int 형이 된다&lt;/p&gt;
&lt;p&gt;위의 코드에서 int 형인 연산 결과를 byte에 형 변환 없이 저장하려 했기에 에러가 발생했다 &lt;/p&gt;
&lt;p&gt;큰 자료형의 값을 작은 자료형의 변수에 저장하려면 명시적으로 형 변환 연산자를 사용해서 변환해주어야 한다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;byte c = (byte) (a + b);&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;형변환시 발생하는 데이터 손실 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;byte a = 10;
byte b = 30;
byte c = (byte) (a * b);
System.out.println(c); // 44&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;a * b 의 연산 결과인 300이 출력되지 않고 44가 출력되었다 &lt;/p&gt;
&lt;p&gt;이는 300이 byte가 표현할 수 있는 값의 범위를 넘어섰기에 발생한 문제로 이를 해결하기 위해서는&lt;/p&gt;
&lt;p&gt;큰 값에서 작은 값으로 형 변환을 진행할 때 충분히 큰 자료형을 사용해야 한다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;연산 결과를 넘어서는 타입 사용 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;int a = 1_000_000;
int b = 2_000_000;
long c = a * b; // 전혀 다른 값이 출력됨
System.out.println(c);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;연산 결과를 담는 long이 2X10^12을 저장하기에 충분히 크기에 문제가 발생하지 않을 것 같지만 올바르지 않은 결과가 출력된다는 문제가 발생했다 &lt;/p&gt;
&lt;p&gt;int 타입과 int 타입의 연산 결과는 int 형이기에 연산 결과가 int 형의 범위를 넘어섰기 때문이다 &lt;/p&gt;
&lt;p&gt;이미 오버플로우가 발생한 값을 아무리 long 타입에 변수에 저장해도 소용이 없다 &lt;/p&gt;
&lt;p&gt;그러므로 연산 결과가 long 형으로 자동 변환되더라도 올바르지 않은 값이 들어가게 된다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;long c = (long)a * b;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;올바른 연산 결과를 얻기 위해서는 이와 같이 변수 a 또는 b의 값을 long 형으로 형변환 해야 한다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;문자 연산 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;문자를 숫자로 변환하려면 ‘0’을 빼주면 된다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;&amp;#39;2&amp;#39; - &amp;#39;0&amp;#39; -&amp;gt; 50 - 48 -&amp;gt; 2 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;대문자를 소문자로 변경하려면 32를 빼주고, &lt;/p&gt;
&lt;p&gt;소문자를 대문자로 변경하려면 32를 더해주면 된다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;char lowerCase = &amp;#39;a&amp;#39;;
char upperCase = (char) (lowerCase - 32);&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;상수, 리터럴 간의 연산에서의 형변환 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;char c1 = &amp;#39;a&amp;#39;;
// char c2 = c1 + 1; // 컴파일 에러 
char c3 = &amp;#39;a&amp;#39; + 1; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;상수 또는 리터럴 간의 연산은 컴파일러가 컴파일 이전에 계산해서 대체함으로써 보다 효율적인 코드를 만든다 (실행 과정에서 변하는 값이 아니다)&lt;/p&gt;
&lt;p&gt;그러므로 c2는 컴파일러가 미리 계산을 할 수 없기에 형변환을 해주어야 하며,&lt;/p&gt;
&lt;p&gt;c3는 리터럴 간의 연산이기에 컴파일러가 미리 계산한다. 그러므로 c3에서는 형 변환이 필요 없다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;소수점 n자리까지 꺼내기 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;(int) (pi * 1000) / 1000f
// (int) (3141,592f) / 1000f
// 3141 / 1000f
// 3.141&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;int / int의 특성 이용 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;연산의 의 결과는 int&lt;/li&gt;
&lt;li&gt;나눗셈의 결과는 버린다&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;반올림 하기 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;(int) (pi * 1000 + 0.5) / 1000.0
// (int) (314**1,5**92f + 0.5) / 1000.0
// (int) (314**2.0**92) / 1000.0
// 314**2** / 1000.0
// 3.142&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;+) Math.round() 메서드 사용&lt;/p&gt;
&lt;p&gt;매개변수로 받은 값을 소수점 첫째자리에서 반올림하는 함수 &lt;/p&gt;
&lt;h3&gt;3.2 나머지 연산자 %&lt;/h3&gt;
&lt;p&gt;나누는 수에 0을 사용할 수 없다 &lt;/p&gt;
&lt;p&gt;음수도 허용되나, 부호가 무시되어 결과는 음수의 절대값으로 나눈 나머지의 결과와 같다 &lt;/p&gt;
&lt;p&gt;짝수, 홀수, 배수 검사 등에 사용된다    &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 비교 연산자&lt;/h2&gt;
&lt;p&gt;주로 조건문과 반목문의 조건식에 사용 &lt;/p&gt;
&lt;p&gt;연산결과는 오직 true, false 둘 중 하나이다 &lt;/p&gt;
&lt;p&gt;피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치키신 후에 비교 &lt;/p&gt;
&lt;h3&gt;4.1 대소비교 연산자 &amp;lt; &amp;gt; &amp;lt;= &amp;gt;=&lt;/h3&gt;
&lt;p&gt;boolean과 참조형을 제외한 나머지 자료형에 사용할 수 있다 &lt;/p&gt;
&lt;h3&gt;4.2 등가비교 연산자 == !=&lt;/h3&gt;
&lt;p&gt;기본형, 참조형 모두 사용 가능하다. 즉, 모든 자료형에 사용 가능하다 &lt;/p&gt;
&lt;p&gt;참조형의 경우 객체의 주소 값을 저장하기에 두 개의 피연산자 (참조변수)가 같은 객체를 가리키고 있는지를 알 수 있다 &lt;/p&gt;
&lt;p&gt;기본형과 참조형은 서로 형변환이 가능하지 않기에 등기비교 연산자로 기본형과 참조형을 비교할 수 없다 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;System.out.println(10.0 == 10.0f) // true
System.out.println(0.01 == 0.01f) // false &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;실수형은 정수형과 달리 근사값으로 저장되어 오차가 발생할 수 있기에 위와 같은 오차가 생기는 것이다 &lt;/p&gt;
&lt;p&gt;0.1f는 저장할 때 2진수로 변환하는 과정에서 오차가 발생한다 &lt;/p&gt;
&lt;p&gt;double 타입도 오차가 발생하지만 float 타입보다 적은 오차로 저장된다 &lt;/p&gt;
&lt;p&gt;float 타입과 double 타입을 비교하기 위해서는 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;double 타입을 float 으로 변환한 뒤 비교 &lt;/li&gt;
&lt;li&gt;어느 정도의 오차를 무시하고 앞 자리만 비교&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;문자열 비교&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;두 문자열을 비교할 때에는 ‘&lt;code&gt;==&lt;/code&gt;’ 가 아닌 &lt;code&gt;equlals()&lt;/code&gt; 라는 메서드를 사용해야한다 &lt;/p&gt;
&lt;p&gt;비교 연산자는 두 문자열이 완전히 같은지를 비교(주소)하는 것이기에 문자열의 내용을 비교하기 위해서는 equals()를 사용해야 한다 &lt;/p&gt;
&lt;p&gt;+) 대소문자를 구별하지 않고 비교하려면 equalsIgnoreCase() 를 사용하면 된다    &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. 논리 연산자&lt;/h2&gt;
&lt;p&gt;둘 이상의 조건을 AND, OR로 연결하여 하나의 식으로 표현할 수 있기 해준다 &lt;/p&gt;
&lt;h3&gt;5.1 논리연산자 - &amp;amp;&amp;amp;, ||, !&lt;/h3&gt;
&lt;p&gt;논리연산자는 피연산자로 boolean 형 또는 boolean 형을 결과로 하는 조건식만 허용한다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;가독성 높이기 &lt;/p&gt;
&lt;p&gt; &lt;code&gt;x &amp;gt; 10 &amp;amp;&amp;amp; x &amp;lt; 20&lt;/code&gt; → &lt;code&gt;10 &amp;lt; x &amp;amp;&amp;amp; x &amp;lt; 20&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;배수 확인 &lt;/p&gt;
&lt;p&gt; 2의 배수 또는 3의 배수이다 &lt;/p&gt;
&lt;p&gt; &lt;code&gt;i % 2 == 0 || i % 3 == 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; 2의 배수 또는 3의 배수이지만 6의 배수는 아니다 &lt;/p&gt;
&lt;p&gt; &lt;code&gt;(i % 2 == 0 || i % 3 == 0) &amp;amp;&amp;amp; i % 6 != 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; +) &amp;amp;&amp;amp;는 || 보다 우선순위가 높다 &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;효율적인 연산 (short circuit evaluation)&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;OR&lt;/p&gt;
&lt;p&gt; 좌측 피연산자가 true이면 우측 피연산자의 값은 평가하지 않는다 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AND&lt;/p&gt;
&lt;p&gt; 좌측 피연산자가 false이면 우측 피연산자의 값은 평가하지 않는다 &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이러한 특성으로 같은 조건식이더라도 피연산자의 위치에 따라 연산속도가 달라질 수 있다 &lt;/p&gt;
&lt;p&gt;예를 들어 OR 연산의 경우 연산결과가 true일 확률이 높은 피연산자를 연산자의 왼쪽에 놓아야 더 빠른 연산결과를 얻을 수 있다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;논리 부정 연산자 !&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;참과 거짓이 차례로 반복되는 특성을 활용하여 toggle button을 구현할 수 있다 &lt;/p&gt;
&lt;p&gt;조건문과 반복문의 조건식에서 주로 사용된다 &lt;/p&gt;
&lt;p&gt;논리 부정 연산자를 적절히 활용해서 보다 이해하기 쉬운 식으로 만들자 &lt;/p&gt;
&lt;h3&gt;5.3 비트 연산자 &amp;amp; | ^ ~ &amp;lt;&amp;lt; &amp;gt;&amp;gt;&lt;/h3&gt;
&lt;p&gt;피연산자를 비트단위로 논리 연산하는 연산자 &lt;/p&gt;
&lt;p&gt;피연산자로 실수는 허용하지 않으며 이진수로 변환하여 연산한다 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;|&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; 특정 비트의 값을 변경할 때 사용 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; 특정 비트의 값을 뽑아낼 때 사용 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;^&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; 간단한 암호화에 사용 &lt;/p&gt;
&lt;p&gt; (같은 값으로 두고 XOR 연산을 수행하면 원래의 값으로 돌아오는 성질 활용)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;+) 비트 연산에서도 산술 변환(타입 일치)이 일어날 수 있다 &lt;/p&gt;
&lt;p&gt;** 비트 전환 연산자 ~ **&lt;/p&gt;
&lt;p&gt;논리 부정 연산자 &lt;code&gt;!&lt;/code&gt;와 유사  &lt;/p&gt;
&lt;p&gt;1의 보수 연산자라고도 부른다 &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;양의 정수 p를 음의 정수로 변환하는 방법&lt;/p&gt;
&lt;p&gt;  &lt;code&gt;~p + 1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;음의 정수 n을 양의 정수로 변환하는 방법&lt;/p&gt;
&lt;p&gt;  &lt;code&gt;~n - 1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;~~p&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;  연산 결과가 int가 되는 것에 주의하자&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;쉬프트 연산자 &amp;lt;&amp;lt; &amp;gt;&amp;gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; 연산자의 경우 피연산자의 부호에 관계 없이 각 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채우면 된다 &lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; 연산자의 경우 오른쪽으로 이동시키기에 부호가 변경될 수 있다 &lt;/p&gt;
&lt;p&gt;이때, 부호를 유지하기 위해 왼쪽 피연산자가 음수인 경우 빈자리를 1으로 채운다 (양수일 경우 0)&lt;/p&gt;
&lt;p&gt;쉬프트 연산자는 다른 이항 연산자들과 달리 피연산자의 타입을 일치시킬 필요가 없기에 우측 피연산자에는 산술 변환이 적용되지 않는다 &lt;/p&gt;
&lt;p&gt;쉬프트 연산자는 가독성이 좋지 않기 때문에 보다 빠른 실행 속도가 요구되어지는 곳에서만 사용하는 것이 좋다 &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;6. 그 외의 연산자&lt;/h2&gt;
&lt;h3&gt;6.1 조건 연산자 ?:&lt;/h3&gt;
&lt;p&gt;세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다 &lt;/p&gt;
&lt;p&gt;첫 번째 피연산자의 조건식인 평가 결과에 따라 다른 결과를 반환한다 &lt;/p&gt;
&lt;p&gt;조건 연산자는 if문으로 변경할 수 있지만 조건 연산자를 사용하면 코드를 간결하게 작성할 수 있다&lt;/p&gt;
&lt;p&gt;중첩이 가능하나 가독성을 위해 꼭 필요한 경우에만 중첩을 사용하자 &lt;/p&gt;
&lt;h3&gt;6.2 대입연산자 = op=&lt;/h3&gt;
&lt;p&gt;변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는 데 사용한다 &lt;/p&gt;
&lt;p&gt;가장 낮은 우선순위를 가지고 있기에 식에서 가장 나중에 수행된다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lvalue 와 rvalue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lvalue&lt;/strong&gt;: 대입연산자의 왼쪽 피연산자 &lt;/p&gt;
&lt;p&gt;반드시 변수처럼 값을 변경할 수 있는 것이여야 한다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rvalue&lt;/strong&gt;: 대입연산자의 오른쪽 피연산자 &lt;/p&gt;
&lt;p&gt;변수, 식, 상수 등 모든 것이 가능하다 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;복합 대입 연산자&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;대입 연산자는 다른 연산자(op)와 결합하여 &lt;code&gt;op=&lt;/code&gt;와 같은 방식으로 사용될 수 있다&lt;/p&gt;
&lt;p&gt;예) +=, -=&lt;/p&gt;</description>
      <category>Language/[Java] 자바의 정석</category>
      <category>연산자</category>
      <category>자바의 정석</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/174</guid>
      <comments>https://spongerice.tistory.com/174#entry174comment</comments>
      <pubDate>Sun, 8 Jan 2023 16:57:37 +0900</pubDate>
    </item>
    <item>
      <title>[후니의 쉽게 쓴 시스코 네트워킹] PART 07. 라우터만 알면 네트워크 도사? -1</title>
      <link>https://spongerice.tistory.com/173</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 01. 라우터를 한마디로 말하자면...&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지능을 가진 경로 배정기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 인터넷 사용을 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서로 다른 네트워크와 통신하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 브로드캐스트 영역을 나누기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 02. 라우터는 무슨 일을 할까요?&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터가 하는 일&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. path determination (경로 설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 패킷이 목적지까지 갈 수 있는 길을 검사하고 어떤 길로 가는 것이 가장 적절한지 결정&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. swithching (스위칭)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이 결정되면 그 쪽으로 데이터 패킷을 스위칭 (스위치가 하는 일과는 다르다)&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터가 가장 좋은 길을 찾는 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해서 라우팅 테이블을 만든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 라우터는 위와 같은 기능들을 수행하기 위해서 cpu, memory, interface 등을 가지고 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 라우터는 경로 결정과 스위칭을 하는 장비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 가장 좋은 경로를 결정하기 위해 라우팅 알고리즘을 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 라우팅 알고리즘을 위해 라우팅 테이블을 생성하여 관리한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 03. 라우터는 어떻게 생긴 녀석일까요?&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장 가능성, 규모 등을 고려해서 라우터를 결정해야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 접속 포트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Ethernet&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 네트워크와 접속할 때 사용하는 인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부의 허브, 스위치 등과의 연결을 위한 포트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Serial&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAN 과의 접속을 위한 인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DSU/CSU와 연결&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 04. 라우팅 프로토콜과 라우티드 프로토콜&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*라우티드 프로토콜&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(라우터라는 자동차를 타고 여행을 떠나는 승객)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) TCP/IP, IPX, AppleTalk 등&lt;/p&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에 살며 라우티드 프로토콜들에게 목적지까지 가장 좋은 길을 갈 수 있게 해주는 역할&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우팅 프로토콜에 따라 라우터의 성능 (빠르고 안전하게)이 결정된다고 봐도 괜찮다&amp;nbsp;&lt;br /&gt;예) RIP, IGRP, OSPF, EIGRP 등&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 라우팅 테이블을 가지고 있으면서 자기가 찾아갈 경로에 대한 정보를 라우팅 테이블에 기억해 둔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목적지, 목적지까지의 경로, 어떻게 가야 하는지 등이 기록되어 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 끊임없이 업데이트된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어떤 라우팅 프로토콜을 사용하는지에 따라 최적의 경로를 찾는 방법이 달라진다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터: 자동차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우티드: 승객&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 프로토콜: 운전자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블: 목적지까지의 정보 (운전자마다 다르다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 05. static 라우팅 프로토콜과 dynamic 라우팅 프로토콜&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;스태틱 라우팅 프로토콜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번 정해놓으면 정해둔 그대로 수행하는 프로토콜&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에 사람이 일일이 경로를 입력해주는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력된 그대로 정보를 넘기면 되어 라우터 자체에 부담이 들지 않는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우팅 속도가 빨라지고, 성능이 좋아진다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리가 적게 든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우팅 테이블을 교환할 필요가 없다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크 대역폭을 절약할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 보안에도 강하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 사용?&amp;nbsp;&lt;/p&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;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;다이내믹 라우팅 프로토콜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황에 따라서 그때그때 변화가 가능한 프로토콜&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사람이 일일이 경로를 입력해주지 않아도 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그때그때 가장 좋은 길을 찾아낸다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터에 부담이 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 어떤 길이 빠른지 계산, 바뀐 정보 확인, 이정표 업데이트 등&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RIP, IGRP, OSPF, EIGRP 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 큰 네트워크에 연결된 라우터 (네트워크 센터 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 06. 라우팅 테이블에 대한 이야기&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에는 라우팅 테이블이 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*라우팅 테이블&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- show ip route (시스코 라우터 명령어)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 07. AS, 그리고 내부용과 외부용 라우팅 프로토콜&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;AS (Autonomous System)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 관리자에 의해 관리되는 라우터들의 집단&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터가 가지는 정보를 효율적으로 관리하고, 인터넷 서비스를 좀 더 간편하게 제공하기 위해 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 밖으로 나갈 대 AS에 있는 문지기 라우터 (ASBR)에게 정보를 물어봐서 밖으로 나가는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신이 속한 AS에 대한 정보만 가지고 있으면 된다 (ASBR을 사용하여 외부와 통신하는 것이기에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AS 내부에서 사용하는 라우팅프로토콜을 Interior routing protocol 또는, Interior gateway protocol (IGP)이라 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예시) RIP, IGRP, EIGRP, OSPF 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AS 외부에서 사용하는 라우팅프로토콜을 Exterior routing protocol 또는, Exterior gateway protocol (EGP)이라 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예시) EGP, BGP 등&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본사와 지사 간의 라우터를 설치해야 할 경우에는 RIP, OSPF 등의 IGP를 사용하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본사의 라우터가 인터넷 서비스 업체와 연결해서 인터넷을 사용한다면 BGP와 같은 EGP를 사용한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 BGP를 사용하는 추세 (EGP보다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/binwM6/btrU55ezqv4/aKcP0E2tF9O6juR64iwPIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/binwM6/btrU55ezqv4/aKcP0E2tF9O6juR64iwPIK/img.png&quot; data-alt=&quot;Autonomous System&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/binwM6/btrU55ezqv4/aKcP0E2tF9O6juR64iwPIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbinwM6%2FbtrU55ezqv4%2FaKcP0E2tF9O6juR64iwPIK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;430&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Autonomous System&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 08. 라우터 구성의 시작&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에 명령어를 입력하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 콘솔 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;케이블을 연결하고, putty를 사용하여 명령어 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적이고 편리한 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터에 직접 pc를 연결해야 하는 불편함&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이후에는 텔넷 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Telnet 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 IP 주소를 입력하고 네트워크에 접속하여 명령어 입력&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터를 관리할 때 가장 많이 사용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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&gt;IP 주소조차 없기에)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크 연결이 끊어질 경우 사용 불가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. AUX 포트를 통한 접속&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텔넷조차 사용이 불가능할 때 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. NMS에 의한 라우터 구성&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 구성 방법 중 가장 쉬운 방법&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. TFTP 서버로 라우터 구성&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 직접 라우터로 세팅해주는 방식은 아니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 다른 곳에서 만들어 놓은 라우터의 구성 파일을 TFTP 서버에 저장해두었다가 라우터로 다운로드해 주는 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단순형 파일 전송 프로토콜&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 09. 라우터의 중요한 몇 가지 모드&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. RXBOOT 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 패스워드를 모르는 경우, 라우터의 이미지 파일(IOS)에 문제가 생긴 경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 발생 시 복구용으로 만들어 놓은 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Setup 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터가 부팅하며 자동으로 들어가는 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. user 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'&amp;gt;'가 있는 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상태를 볼 수 있다 (핑, 트레이스 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 파일을 보거나, 구성 자체를 변경할 수 없다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. privileged 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'#'이 있는 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 운영자 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 모드에서 enable 명령어 사용하면 진입 가능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 모든 명령이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 보기, 변경하기 가능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. config 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 구성 파일을 변경하는 경우에 사용하는 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;privileged 모드에 있어야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;privileged 모드와 config 모드를 가장 많이 사용한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 10. 라우터 안에는 어떤 것들이 살까요?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHyyA0/btrVal8RFL2/zFOrMLGBTse75bW1ALnBP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHyyA0/btrVal8RFL2/zFOrMLGBTse75bW1ALnBP0/img.png&quot; data-alt=&quot;라우터의 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHyyA0/btrVal8RFL2/zFOrMLGBTse75bW1ALnBP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHyyA0%2FbtrVal8RFL2%2FzFOrMLGBTse75bW1ALnBP0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;211&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라우터의 내부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크와 라우터에 직접 연결되는 부분&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브나 스위치를 연결하는 이더넷 인터페이스 또는 DSU, CSU를 연결하는 Serial 인터페이스가 바로 이것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파워 켜짐 -&amp;gt; RAM에 운영체제 (시스코는 IOS)가 올라감 -&amp;gt; 라우팅 테이블 올라감&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*RAM에 올라가는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제, 라우팅 테이블, 구성파일, ARP 캐시니, 패스트 스위칭에 필요한 캐시 등&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*NVRAM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비휘발성 메모리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 구성 파일이 들어 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Flash 메모리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVRAM 보다 용량이 크다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IOS 이미지 파일 저장용으로 사용됨&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 11. 내가 가진 라우터의 현재 정보는 모두 이곳에!&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터들의 메모리 상태를 제대로 보고 관리하는 것이 중요하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터의 각종 정보를 보는 명령어들&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672573938907&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 라우터의 기본적인 내용 확인 
## sw 버전, interface 종류, IOS 부팅 위치 등
show version

# 인터페이스의 현재 상황까지 상세하게 알 수 있는 명령어 
show interface 

# config 파일 보기 
## 1. 메모리에서 돌아가는 실질적인 구성 파일

# 아래 4가지 명령어는 모두 동일한 명령어 
show running-configuration
sh run # 추천
write terminal 
write term

## 2. NVRAM에 저장되어 있는 백업 구성 파일 
show startup-configuration
show start # 추천
sh config

# 플래시 메모리 보기 
show flash 

# 현재 라우터의 동작 상태 
show processes cpu&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 12. 라우터 셋업 모드&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*셋업 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에 어떤 구성도 되어 있지 않은 초기 상태&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 상태로는 구성 불가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[Network] 후니의 쉽게 쓴 시스코 네트워킹</category>
      <category>as</category>
      <category>라우터</category>
      <category>라우터 모드</category>
      <category>라우티드 프로토콜</category>
      <category>라우팅 프로토콜</category>
      <category>시스코 네트워킹</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/173</guid>
      <comments>https://spongerice.tistory.com/173#entry173comment</comments>
      <pubDate>Sun, 1 Jan 2023 21:02:25 +0900</pubDate>
    </item>
    <item>
      <title>[후니의 쉽게 쓴 시스코 네트워킹] PART 06. 스위치를 켜라! - 2</title>
      <link>https://spongerice.tistory.com/172</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 13. 맥 어드레스는 어디에 저장되어 있을까요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*스위치/브리기가 맥 어드레스 사용하는 방법&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 출발지에서 들어오는 맥 어드레스를 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 맥 어드레스 테이블에 맥 어드레스 저장&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 주소 테이블에 있는 맥 어드레스를 확인하고 그 쪽 포트로 보내거나 막으면서 콜리전 도메인을 막는 역할을 함&amp;nbsp;&lt;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;(시스코) 스위치가 맥 어드레스를 저장하는 방법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. Dynamic&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자동으로 맥 어드레스를 학습하는 방법 (디폴트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 300초 (디폴트)가 지나면 자동으로 삭제됨&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Permanent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수동으로 맥 어드레스를 지정하는 방법 (static address)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자동으로 절대 지워지지 않음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 맥 어드레스를 알기 위해 Learning 과정을 거칠 필요 없음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 많이 사용되지 않는 방법&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 14. 가상의 랜(Virtual LAN)이란?&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VLAN이라고도 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치의 기능 중 요즘 가장 많이 사용됨&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*스위치의 기본적인 역할&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 콜리전 영역 분리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*VLAN의 등장 배경&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브로드 캐스트 도메인을 나누려면 라우터가 필요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*VLAN을 사용하면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 대의 스위치를 여러 대의 분리된 스위치처럼 사용할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 개의 네트워크 정보를 하나의 포트를 통해 전송할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스위치에 연결된 장비들도 브로드캐스트 도메인이 서로 다를 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XJ0C3/btrUQbzQOPr/KKouS0tJwLYgNpWk5uTbfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XJ0C3/btrUQbzQOPr/KKouS0tJwLYgNpWk5uTbfk/img.png&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;660&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.0447%; margin-right: 10px;&quot; data-widthpercent=&quot;32.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XJ0C3/btrUQbzQOPr/KKouS0tJwLYgNpWk5uTbfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXJ0C3%2FbtrUQbzQOPr%2FKKouS0tJwLYgNpWk5uTbfk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gi9fw/btrUM4VHal6/gfG9l1QoXx9UPMFwLEvkG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gi9fw/btrUM4VHal6/gfG9l1QoXx9UPMFwLEvkG1/img.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;617&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.3832%; margin-right: 10px;&quot; data-widthpercent=&quot;33.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gi9fw/btrUM4VHal6/gfG9l1QoXx9UPMFwLEvkG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGi9fw%2FbtrUM4VHal6%2FgfG9l1QoXx9UPMFwLEvkG1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsqgVU/btrUSwiTNip/DgM5j8V1NcwqqmgEYvQ2Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsqgVU/btrUSwiTNip/DgM5j8V1NcwqqmgEYvQ2Xk/img.png&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;581&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.2465%;&quot; data-widthpercent=&quot;34.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsqgVU/btrUSwiTNip/DgM5j8V1NcwqqmgEYvQ2Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsqgVU%2FbtrUSwiTNip%2FDgM5j8V1NcwqqmgEYvQ2Xk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;(1) VLAN을 적용하지 않은 경우 (2, 3) VLAN을 적용한 경우&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VALN을 적용한 경우 하나의 링크만을 사용하여 3개의 네트워크 정보를 같이 실어 보낼 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*VLAN의 이점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스위치 절약&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터에 사용될 인터페이스 감소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 15. VLAN에서 꼭 기억해야 할 몇가지&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VLAN은 스위치에서 지원하는 기능&amp;nbsp;&lt;/li&gt;
&lt;li&gt;한 대의 스위치를 여러 개의 네트워크로 나누기 위해 사용&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크를 나눈다 == 브로드캐스트 도메인을 나눈다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VLAN의 통신은 오직 라우터를 통해서만 가능하다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치 안에 스위치가 존재한다고 생각하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치의 각 포트들은 서로 다른 VLAN 중 어느곳에나 속할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Trunk Port&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 포트를 통해 서로 다른 여러 개의 VLAN을 전송할 수 있게 하는 포트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(패스트 이더넷 포트를 통해 연결)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 패킷이 전송될 때 패킷에 VLAN 정보도 같이 전달되기에 어느 VLAN에 속했는지 알 수 있다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VLAN의 통신은 오직 라우터를 통해서만 가능하다&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;스위치에서 VLAN을 나누는 방법 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. static VLAN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치의 각 포트들을 원하는 VLAN에 하나씩 배정 (일반적인 방법)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. dynamic VLAN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트에 접속하는 장비의 맥 어드레스를 보고 그 주소에 따라 VLAN을 달리 배정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이동이 잦은 사무 환경에 적합&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 16. VLAN에서의 트렁킹과 VTP (VLAN Trunking Protocol)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*트렁킹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 VLAN을 한번에 전송하는 방식&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셔틀버스처럼 모든 VLAN이 하나의 링크를 통해 다른 스위치나 라우터로 이동&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;트렁킹의 2가지 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. ISL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트렁킹에 대한 비표준 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스코에서 만든 프로토콜으로 시스코 장비끼리만 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이티브 VLAN 없음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. IEEE 802.1Q&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트렁킹에 대한 표준 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이티브 VLAN 존재&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*네이티브 VLAN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷에 VLAN 정보를 붙이지 않고 보내는 VLAN (untagged 트래픽이라고도 부른다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 스위치 네트워크 중 유일하게 하나의 VLAN만을 네이티브 VLAN으로 설정할 수 있다&amp;nbsp;&amp;nbsp;&lt;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;VTP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치들 간에 VLAN 정보를 서로 주고받아 스위치들이 가지고 있는 VLAN 정보를 항상 일치시켜주기 위한 프로토콜&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(시스코만의 프로토콜)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 만약 VTP가 지원되지 않는 스위치에서 VLAN을 추가하거나 삭제해야 할 일이 생기면 각 스위치의 구성에 들어가서 VLAN의 구성을 바꿔주어야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그러나 VTP가 지원된다면 VTP 서버에서 한 번만 VLAN정보를 설정해도 다른 스위치와의 트렁크 링크를 통해 VLAN정보를 자동으로 업데이트한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VLAN의 정보는 스위치 간 트렁크 링크를 통해서만 전달된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(스위치 간의 트렁킹 방식에 영향을 받지 않음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;VTP 간에 주고받는 메시지&lt;/span&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Summary Advertisement&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자신이 관리하는 VTP 도메인의 구성에 대한 Revision 넘버를 보낸다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 넘버를 보고 자힌의 VLAN 정보가 최신인지 아닌지 판단&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 5분마다 전송&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VLAN 구성에 변화가 생겼을 때에는 5분을 기다리지 않고 전송&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Subset Advertisement&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VLAN의 구성이 변경되거나 VTP 클라이언트로부터 Advertisement Request 메시지를 받았을 때 전송&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 VLAN의 정보가 저장되어 전달&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp; Advertisement Request&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트가 VTP summary Advertisement와 Subset Advertisement를 요청하는 용도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Advertisement Request 메시지를 VTP에 보낼 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 자신의 Revision 넘버보다 더 높은 넘버를 갖는 smmary Advertisement를 전달 받을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;VTP 도메인 이름이 바뀔 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Subset advertisement 메시지를 잃어버렸을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 스위치가 리셋 되었을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;VTP의 3가지 모드&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. VTP 서버 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VLAN 생성, 이름 바꾸기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VTP 도메인 안에 있는 나머지 스위치들에게 VTP 도메인 이름과 VLAN, configuration revision 넘버 전달&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VTP 도메인의 모든 VLAN에 정보를 NVRAM에서 관리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스위치가 꺼졌다 켜져도 VLAN 정보를 모두 가지고 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. VTP 클라이언트 모드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VTP 서버가 전달해준 VLAN 정보를 받고, 받은 정보를 자기와 연결된 다른 쪽 스위치에 전달하는 역할&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스위치가 리부팅하면 모든 VLAN 정보를 잃게 되어 VTP 서버로부터 다시 받아 와야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리가 적은 스위치에 유리한 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. VTP 트랜스페어런트 모드 (Transparent Mode)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VTP 도메인 안에 있지만 혼자 작동하는 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VLAN 생성, 삭제 가능, 다른 스위치에게 알리지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; VTP 메시지는 전달해 주되 관여하지 않는 역할&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로컬 스위치에서만 사용할 VLAN을 가진 스위치에 주로 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자신의 VLAN 정보를 MVRAM에 저장&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;*VTP Pruning&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트렁크로 이동하는 VLAN 트래픽 중에서 갈 필요가 없는 트렁크 쪽으로 트래픽이 흘러갈 경우 그 부분을 가지치기하는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가지고 있지 않은 VLAN 정보에 대한 트래픽은 브로드캐스트라도 받지 않는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 트렁크쪽의 대역폭 절약 가능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 17. VLAN의 구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VLAN 구성 순서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. VTP 도메인 이름 만들기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. VTP 모드 설정&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버, 클라이언트, 트랜스페어런트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. VTP pruning, 패스워드 설정 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 18. 실제 상황! VLAN&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*서브 인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스 하나를 다시 작게 나눈 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VLAN을 사용할 때 하나의 인터페이스로 여러 개의 네트워크와 접속하게 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이때 겉으로는 하나지만 내부적으로는 여러개의 인터페이스가 있어야 각각의 VLAN에 대한 라우팅이 가능하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[Network] 후니의 쉽게 쓴 시스코 네트워킹</category>
      <category>vlan</category>
      <category>vtp</category>
      <category>시스코 네트워킹</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/172</guid>
      <comments>https://spongerice.tistory.com/172#entry172comment</comments>
      <pubDate>Thu, 29 Dec 2022 14:24:43 +0900</pubDate>
    </item>
    <item>
      <title>[후니의 쉽게 쓴 시스코 네트워킹] PART 06. 스위치를 켜라! - 1</title>
      <link>https://spongerice.tistory.com/169</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 02. 스패닝 트리로 가는 첫 번째 관문 2가지&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*스패닝 트리 알고리즘 (STP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지/스위치에서 발생하는 루핑을 막아주기 위한 프로토콜&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출발지로부터 목적지까지의 경로가 2개 이상 존재할 때 1개의 경로만을 남기고 나머지를 끊어두었다가 경로에 문제가 생겼을 때 다시 사용하는 방법&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;브리지 ID&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지/스위치들이 통신을 할 때 서로를 확인하기 위해 하나씩 가지고 있는 번호&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(스위치도 ID가 있지만 브리지 ID라고 부른다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브리지 아이디는 16비트의 bridge priority와 48비트의 mac address로 이루어져 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여기서 사용되는 mac address는 스위치에 고정되어 있는 값으로 각 스위치의 고유 주소를 의미한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브리지 ID는 스패닝 트리 프로토콜을 수행할 때 중요하게 사용된다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj8eHA/btrUSyUOEoW/QXGhkADFtxWRYLK351okS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj8eHA/btrUSyUOEoW/QXGhkADFtxWRYLK351okS1/img.png&quot; data-alt=&quot;브리지 ID의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj8eHA/btrUSyUOEoW/QXGhkADFtxWRYLK351okS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj8eHA%2FbtrUSyUOEoW%2FQXGhkADFtxWRYLK351okS1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;143&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브리지 ID의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;Path Cost&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1,000 Mbps를 두 장비 사이의 링크 대역폭으로 나눈 값 (IEEE 802.1D 기준)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 링크의 속도(대역폭)가 빠를수록 작은 값이 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속도가 빠르면 비용이 적게 든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기가비트와 ATM등이 나오면서 기존의 path cost로 값을 구하면 소수점이 등장한다는 문제가 생겼다&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이를 해결하기 위해 Past Cost 표를 정의하여 사용하게 되었다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciD5eU/btrURQBsp8Y/eMTF8vtoCcMqE13GKjMP1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciD5eU/btrURQBsp8Y/eMTF8vtoCcMqE13GKjMP1k/img.png&quot; data-alt=&quot;path cost&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciD5eU/btrURQBsp8Y/eMTF8vtoCcMqE13GKjMP1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciD5eU%2FbtrURQBsp8Y%2FeMTF8vtoCcMqE13GKjMP1k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;288&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;path cost&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 03. 스패닝 트리를 잘하려면 3가지만 기억하세요!&lt;/h2&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스패닝 트리의 3가지 기본 동작&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 네트워크당 하나의 루트 브리지(root bridge)를 갖는다&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 루트 브리지가 아닌 나머지 모든 브리지(non root bridge)는 무조건 하나씩의 루트 포트(root port)를 갖는다&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 세그먼트(segment)당 하나씩의 데지그네이티드 포트(designated port)를 갖는다&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;1. 네트워크당 하나의 루트 브리지를 갖는다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*네트워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에 의해 나누어지는 브로드캐스트 도메인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 하나의 브로드캐스트 도메인에 하나씩의 루트 브리지가 있는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;2. 루트 브리지가 아닌 모든 브리지는 무조건 하나씩의 루프 포트를 갖는다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*루트 포트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지에 가장 빨리 갈 수 있는 포트 (즉, 루트 브리지에 가장 가까운 포트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지가 아닌 브리지들은 루트 브리지 쪽으로 가장 가까이 있는 루트 포트를 하나씩 지정해야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;3. 세그먼트당 하나씩의 지정포트를 갖는다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*세그먼트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지/스위치 간에 서로 연결된 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지/스위치가 서로 연결되어 있을 때 세그먼트에 반드시 하나의 포트는 지정 포트 (designated port)로 선출되어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 스패닝 트리 알고리즘은 위의 세 가지 규칙을 적용하여 어느 쪽 링크를 살리고, 끊을지를 결정하는 과정&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(루트 포트, 데지그네이티드 포트가 아닌 모든 포트를 막아버린다 -&amp;gt; 루트 포트, 데지그네이티드 포트를 선출하는 이유)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 04. 누가 누가 더 센가? STP에서 힘 겨루기&amp;nbsp;&lt;/h2&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스패닝 트리 순서 정하기 규칙&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 누가 더 작은 root BID를 가졌는가&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 루트 브리지까지의 path cost 값은 누가 더 작은가&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 누구의 BID가 더 낮은가&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. 누구의 포트 ID가 더 낮은가&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*BPDU (bridge protocol data unit)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지/스위치가 스패닝 트리 정보를 주고받기 위해 사용하는 특수한 프레임 (우체부 역할)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실려 있는 값들&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; root BID: 루트 브리지의 BID&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; root path cost: 루트 브리지까지 가는 경로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sender BID: 보내는 브리지의 BID&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; port ID: 어떤 포트에서 보냈는지 알게하는 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 등등&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브리지/스위치가 부팅하면 각각의 포트로 BPDU를 매 2초마다 보내며 서로의 스패닝 트리 정보를 주고받는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브리지는 BPDU를 서로 주고 받으며 누가 포트 브리지이며 어떤 포트가 루트 포트가 될지, 어떤&amp;nbsp; 포트가 데지그네이티드 포트가 될지 결정한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어떤 BPDU가 가장 좋을 지 결정할 대 스패닝 트리 순서 정하기의 4가지의 규칙을 사용한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 05. 스위치에서 대장 브리지 (root bridge) 뽑기&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대장 브리지를 뽑는 조건: 무조건 낮은 BID를 갖는 브리지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 브리지가 부팅이 되면 자신의 BID를 루트 브리지 BID로 설정해서 BPDU를 보낸다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 상대가 보낸 루트 BID 값을 비교하여 더 낮은 BID를 갖는 브리지를 루트 브리지로 설정한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 새로운 브리지가 부팅되면 자신을 루트 브리지로 설정하여 BPDU를 보낸다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다른 브리지들이 보낸 루트 BID (이전에 설정한 값)을 비교하여 루트 브리지를 선정한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*만약 새롭게 부팅시킬 브리지를 반드시 루트 브리지로 설정하고 싶다면?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 브리지의 BID를 기존 루트 브리지 BID 보다 낮은 값으로 설정하면 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이때 사용하는 것이 Bridge Priority!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 06. 졸병 브리지 (non root bridge)의 루트 포트 선출기&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root 브리지 선출 이후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 non root bridge 들은 반드시 한 개의 루트 포트 (root port)를 가져야 한다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지에 가장 가까이 있는 포트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- path cost가 가장 적게 드는 포트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대역폭이 크면 path cost는 줄어든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;path cost 가 작은 값으로 루트 포트를 설정하면 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 07. 스패닝 트리의 마지막 단계 데지그네이티드 포트 (Designated Port) 뽑기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 단계&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데지그네이티드 포트를 뽑아야 스패닝 트리에서 어떤 포트를 풀어주고 어떤 포트를 막을지 결정할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규칙 : 세그먼트 당 하나씩의 데지그네이티드 포트를 갖는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 브리지로 연결된 세그먼트당 한 개의 데지그네이티드 포트를 뽑아야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법: 세그먼트 상에서 root path cost 를cost를 비교하여 더 작은 root path cost를 가진 포트가 데지그네이티드 포트가 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지의 모든 포트들은 언제나 데지그네이티드 포트로 선정된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(root path cost가 언제나 0이 되기 때문에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 non root bridge 간의 root path cost를 비교했을 때 값이 동일하다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;section 04에서 학습한 스패닝 트리 순서정하기 규칙을 적용하여 데지그네이티드 포트를 설정한다 (4가지 단계)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHFCf/btrUN2XgLcV/vPRldliTkJQU0Syxemfte1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHFCf/btrUN2XgLcV/vPRldliTkJQU0Syxemfte1/img.png&quot; data-alt=&quot;스패닝 트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHFCf/btrUN2XgLcV/vPRldliTkJQU0Syxemfte1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHFCf%2FbtrUN2XgLcV%2FvPRldliTkJQU0Syxemfte1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;238&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스패닝 트리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 08. 스패닝 트리 프로토콜의 5가지 상태 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*스패닝 트리 만들기 요약&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 루트 브리지 뽑기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. non root bridge에서 루트 포트 뽑기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데지그네이티드 포트 뽑기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 나머지 포트를 non designated 포트로 지정하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;포트의 5가지 상태&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스패닝 트리 프로토콜을 구현하는 과정에서 모든 스위치나 브리지는 언제나 5가지 상태로 변한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Disalbed&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트가 고장나서 사용할 수 없거나 관리자가 일부러 shut down 시킨 상태&lt;/li&gt;
&lt;li&gt;데이터 전송 불가, mac address 학습 불가, BPDU 주고받기 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Blocking&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스위치를 처음 켜거나 disabled 된 포트를 다시 살렸을 때&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터 전송은 되지 않지만 BPDU만을 주고 받음&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터 전송 불가, mac address 학습 불가, BPDU 주고받기 가능&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Listening
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;blocking 상태에 있던 스위치 포트가 루트 포트나 데지그네이티드 포트로 선정될 때&amp;nbsp;&lt;/li&gt;
&lt;li&gt;언제든 blocking 상태로 변환될 수 있다 (새로운 포트가 위의 값들으로 선정되었을 때)&lt;/li&gt;
&lt;li&gt;데이터 전송 불가, mac address 학습 불가, BPDU 주고 받기 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Learning&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;listening 상태에 있던 스위치가 포워딩 딜레이 디폴트 시간인 15초 동안 상태를 유지할 때&amp;nbsp;&lt;/li&gt;
&lt;li&gt;맥 주소를 배워 맥 주소 테이블을 만든다&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터 전송 불가, mac address 학습 가능 (테이블 생성), BPDU 주고 받기 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Forwarding&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;learning 상태에서 포워딩 딜레이 디폴트 시간인 15초 동안 상태를 유지할 때&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터 프레임을 주고 받는다&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터 전송 가능, mac address 학습 가능 (테이블 생성), BPDU 주고받기 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdEFR1/btrUM5GGKVL/16hHWuoJKL1AnzB2JQ85Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdEFR1/btrUM5GGKVL/16hHWuoJKL1AnzB2JQ85Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdEFR1/btrUM5GGKVL/16hHWuoJKL1AnzB2JQ85Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdEFR1%2FbtrUM5GGKVL%2F16hHWuoJKL1AnzB2JQ85Kk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;245&quot; height=&quot;327&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 5가지 상태 변화를 통해 스위치/브리지는 링크를 막고 열며 스패닝 트리를 만든다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트의 상태 변화를 통해 경로를 열고 닫는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 09. 배운 거 써먹기 - 직접 한번 구성해 보자구요!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 루트 브리지 선출하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 루트 포트, 데지그네이티드 포트 선출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 루트 포트, 데지그네이티드 포트를 포워딩(forwarding)으로 만들기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. non designated 포트는 블로킹(blocking)으로 만들기&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지가 어느 스위치가 되느냐에 따라 링크 구성이 달라지기에 네트워크 구성시 루트 브리지 선정에 유의해야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;section 10. 스패닝 트리에 변화가 생기던 날&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스패닝 트리는 사용하던 경로에 문제가 생기면 막았던 경로 중 하나를 열어둔다&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Hello Time&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지가 얼마 만에 한 번식 헬로 BPDU를 보내는지에 대한 시간&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디폴트 값은 2초&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Max Age&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 브리지로부터 헬로 패킷을 기다리는 시간&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;max age 동안 헬로 패킷을 받지 못하면 루트 브리지가 죽었다고 생각하여 새로운 스패닝 트리를 만든다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치에서의 디폴트 값은 20초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Forwarding Delay&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지 포트가 블로킹 상태에서 포워딩 상태로 넘어갈 때까지 걸리는 시간&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디폴트 값은 15초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스닝 -&amp;gt; 러닝(forwarding delay 초 후)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;러닝 -&amp;gt; 포워딩 (forwarding delay 초 후)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 블로킹에서 포워딩으로 넘어가는 데 걸리는 시간은 forwarding dealy 시간 * 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;브리지에 문제가 생겼을 때 새로운 스패닝 트리를 만드는 방법&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 루트 브리지가 보내는 헬로 패킷을 받지 못함&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. hello time 이 지나도 아직은 문제가 없음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. max age 가 지나도 연락이 없으면 해당 포트로 헬로 패킷 받는 것을 포기한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다른 포트를 root 포트로 세팅한다 (블로킹 -&amp;gt; 리스닝 -&amp;gt; 러닝 -&amp;gt; 포워딩 : 총 forwarding delay * 2 초가 걸린다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*다른 경로를 살리는 데 걸리는 시간&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20초 + 15초 + 15초 = 50초&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 생각보다 오래 걸려서 이를 개선할 많은 방법들이 존재한다&lt;/p&gt;</description>
      <category>cs/[Network] 후니의 쉽게 쓴 시스코 네트워킹</category>
      <category>Bid</category>
      <category>BPDU</category>
      <category>스위치</category>
      <category>스패닝 트리 알고리즘</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/169</guid>
      <comments>https://spongerice.tistory.com/169#entry169comment</comments>
      <pubDate>Wed, 28 Dec 2022 20:26:46 +0900</pubDate>
    </item>
    <item>
      <title>[후니의 쉽게 쓴 시스코 네트워킹] PART 05. IP 주소로의 여행</title>
      <link>https://spongerice.tistory.com/168</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&amp;nbsp;section 01. IP 주소 이야기 - 1탄&lt;/span&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;IP 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP 프로토콜을 만들 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로토콜을 사용하는 모든 장비들을 구분해주기 위해서 만들어낸 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이진수 32자리로 되어 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 8자리 (octet) 사이에는 점을 찍는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 10진수로 나타낸 ip 주소를 다시 이진수로 변환하여 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 02. 라우터에서 IP 주소 이해하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터에 IP 주소를 배정하는 규칙&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 네트워크에 연결되는 라우터의 포트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*시리얼 인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 인터넷족으로 연결되는 인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가정에서 이더넷 인터페이스가 1개이고 시리얼 인터페이스가 2개인 라우터를 사용한다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 라우터에 부여해야 하는 IP 주소는 2개가 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이더넷 인터페이스에 부여할 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;내부에서 사용하기 위해 부여받은 IP 주소 중 하나를 배정&lt;/b&gt; (내부 네트워크에 접속되기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 시리얼 인터페이스에 부여할 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터가 접속하는 &lt;b&gt;상대편 (ISP 업체) 라우터의 시리얼 인터페이스와 동일한 IP 주소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상대편 라우터의 시리얼과 같은 네트워크가 되어야 한다 (라우터에서 인터페이스가 달라진다는 것은 네트워크가 달라진다는 뜻)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터에 부여한 주소를 PC에 재 할당하면 안 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 절대로 같은 주소를 갖는 pc가 존재해서는 안된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 03. IP 주소 이야기 - 2탄&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이야기하는 네트워크는 하나의 브로드캐스트 영역&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*브로드캐스트 영역&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 PC가 데이터를 뿌렸을 때 그 데이터를 라우터를 거치지 않고도 바로 받을 수 있는 영역&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 네트워크로 갈 때만 필요하다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 브로트 캐스트 영역&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터를 거치지 않고도 통신이 가능한 영역&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 PC 또는 장비&amp;nbsp;&lt;/p&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;b&gt;IP 주소&lt;/b&gt;는 &lt;b&gt;네트워크 부분&lt;/b&gt;과 &lt;b&gt;호스트 부분&lt;/b&gt;으로 나누어져 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 하나의 네트워크라면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP의 &lt;b&gt;네트워크 부분은 모두 같&lt;/b&gt;아야 하며, &lt;b&gt;호스트 부분은 모두 달라&lt;/b&gt;야 정상적으로 통신이 가능하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 하나의 라우터로 연결된 PC들은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 부분은 모두 같아야 하며, 호스트 부분은 모두 달라야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터가 라우팅을 할 때 IP 주소 중 네트워크 부분만을 참고한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 04. IP 주소 이야기 - 3탄&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소의 Class에 따라 어디까지가 네트워크 부분인지, 어디까지가 호스트 부분인지 나뉜다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*IP 주소를 class로 나누는 이유&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크의 크기에 따라 구분하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소를 적정하고 효율적으로 배분하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;class A&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 네트워크가 가질 수 있는 &lt;b&gt;호스트 수가 가장 많은 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 32개의 이진수 중 맨 앞쪽 하나가 항상 0으로 시작하는 것들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (0&lt;b&gt;xxx xxxx&lt;/b&gt;. xxxx xxxx. xxxx xxxx. xxxx xxxx) , bold 처리 한 부분만이 네트워크 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앞의 8비트(1 옥텟)가 네트워크 부분, 나머지 24비트 (3 옥텟)가 호스트 부분&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IP 주소 중 1부터 126으로 시작하는 네트워크&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가질 수 있는 호스트의 수: 2^24 -2 (모두 0인건 네트워크 자체를 의미, 모두 1 인건 브로드 캐스트 주소)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;class B&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 32개의 이진수 중 맨 앞이 반드시 10으로 시작하는 것들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (10&lt;b&gt;xx xxxx&lt;/b&gt;. &lt;b&gt;xxxx xxxx&lt;/b&gt;. xxxx xxxx. xxxx xxxx) , bold 처리 한 부분만이 네트워크 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앞의 16비트(2옥텟)가 네트워크 부분, 나머지 16비트 (2 옥텟)가 호스트 부분&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IP 주소 중 128부터 191으로 시작하는 네트워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가질 수 있는 호스트의 수: 2^16 -2 (모두 0 인건 네트워크 자체를 의미, 모두 1 인건 브로드 캐스트 주소)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;class C&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 32개의 이진수 중 맨 앞이 반드시 110으로 시작하는 것들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (110&lt;b&gt;x xxxx&lt;/b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;xxxx xxxx&lt;/b&gt;. &lt;b&gt;xxxx xxxx.&lt;/b&gt;&amp;nbsp;xxxx xxxx) , bold 처리 한 부분만이 네트워크 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앞의 24비트(3옥텟)가 네트워크 부분, 나머지 8비트 (1 옥텟)가 호스트 부분&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IP 주소 중 192부터 223으로 시작하는 네트워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가질 수 있는 호스트의 수: 2^8 -2 (모두 0인건 네트워크 자체를 의미, 모두 1 인건 브로드 캐스트 주소)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;class D&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티캐스트용 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내가 필요한 그룹에만 한번에 데이터를 전송할 때 사용하는 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;class E&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연구용 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 05. IP 주소의 활용&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크가 서로 다른 두 장비 간의 통신은 라우터를 통해서만 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TCP/IP 통신할 경우 라우터의 각 인터페이스 역시 IP 주소를 부여하는 것이 좋다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터의 인터페이스에 IP 주소를 부여할 때 그 인터페이스가 속한 네트워크의 주소를 부여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IP 주소를 배정할 때는 그 네트워크에 몇 개의 호스트가 접속 가능한지 확인한 수 이 호스트를 모두 포함할 수 있는지 확인해야 한다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 네트워크로 향하기 위해 거쳐야 하는 문 (외부로 통해 있는 문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이더넷 인터페이스&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*참고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우터는 인터페이스별로 각각 IP 주소를 배정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그러나 스위치와 허브는 IP 주소를 장비별로 하나씩만 배정 (관리를 위해)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스위치나 허브에 IP 주소를 배정하지 않아도 통신에 전혀 문제가 없다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 06. 서브넷 마스크 (subnet mask)의 시작&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;서브넷 마스크&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 IP 주소를 네트워크 환경에 맞게 나누어 주기 위해서 씌워주는 이진수의 조합&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커다란 네트워크 (호스트 수가 많은 네트워크)를 작은 네트워크 여러 개로 나누어 사용하기 위해 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*보충 설명&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B 주소를 받았다면 하나의 네트워크가 65,000여개의 호스트를 가진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 큰 네트워크를 구성한다면 &lt;b&gt;브로트캐스트의 영향이 너무 커서&lt;/b&gt; 통신이 불가능하다 (서브넷팅이 필요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 식료품을 사서 적당히 소분해서 사용하는 것처럼&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소를 적당히 잘라서 사용해야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IP 주소를 자를 때&lt;/b&gt; 사용하는 것이 바로 &lt;b&gt;서브넷 마스크&lt;/b&gt;이다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 부여 받은 원래 상태의 IP 주소에 서브넷 마스크를 씌워 네트워크를 나누는 것&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 브로드캐스트 영역 나누기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. IP주소 아끼기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 마스크를 하게 되면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브로드캐스트 도메인을 작게 나눌 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각각의 서브넷 간의 통신은 라우터를 통해서만 가능하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) 150.150.1.0 네트워크와 150.150.2.0 네트워크는 라우터를 통해서만 통신이 가능하다&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크 부분과 호스트 부분을 확인할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;네트워크: 서브넷 마스크가 이진수로 1인 부분&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 호스트: 서브넷 마스크가 이진수로 0인 부분&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 07. 서브넷 마스크에도 기본은 있다&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 IP 주소에는 서브넷 마스크가 따라다닌다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(호스트 주소를 전부 쓰더라도 서브넷 마스크가 따라다닌다)&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본 서브넷 마스크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서브넷 마스크&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;기본 서브넷 마스크 (Default Subnet Mask)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 ip를 가공하지 않고 (쪼개지 않고) 사용했을 때 따라다니는 마스크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 A의 디폴트 서브넷 마스크: 255.0.0.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B의 디폴트 서브넷 마스크: 255.255.0.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 C의 디폴트 서브넷 마스크: 255.255.255.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*서브넷 마스크로 네트워크 부분과 호스트 부분 구분하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP를 서브넷 마스크에 통과시키면(AND 연산) 네트워크 부분은 그대로 나오고 호스트 부분은 0이 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*새로운 서브넷 마스크 사용하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;150.150.100.1 (class B)에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 서브넷 마스크&lt;/b&gt;를 적용하면 네트워크 부분이 150.150.0.0이 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새로운 서브넷 마스크&lt;/b&gt;인 255.255.255.0을 사용한다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;150.150.100.0이 네트워크 부분이 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 class B를 사용하는 IP 주소이지만 새로운 서브넷 마스크를 사용하여 호스트 부분을 줄였다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; class B 주소를 마치 class C처럼 사용한다는 의미&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 IP 주소의 호스트 부분의 일부를 네트워크 부분으로 바꾸는 작업&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;서브네팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 주소를 서브넷 마스크를 씌워서 작은 네트워크로 만드는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*라우터 아래에서 네트워크를 또 나눈 것이 서브넷이고, 나뉜 서브넷 당 라우터를 또 두어야 한다&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 08. 서브넷 마스크의 기본 성질&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;서브넷 마스크의 성질 1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 나뉜 서브넷은 &lt;b&gt;라우터를 통해서만 통신이 가능&lt;/b&gt;하다&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다른 브로드캐스트 영역에 존재하기 때문에&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서브넷 마스크로 만들어진 네트워크&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하나의 독립된 네트워크&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;서브넷 마스크의 성질 2&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서브넷 마스크는 이진수로 썼을 때 &lt;b&gt;1이 연속적으로 나와야 한다&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;255.255.255.10 등은 사용 불가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(255.255.255.248 등은 사용 가능 1111 1111.1111 1111. 1111 1111. 1111 1000 이기에)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 09. 서브넷 마스크, 그 속으로...&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*호스트 부분이 모두 0인 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 자체를 의미&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*호스트 부분이 모두 1인 주소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브로드캐스트 주소&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;서브넷 만들기&lt;/h4&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'BinggraeMelona-Bold'; font-weight: normal;&quot;&gt;주어진 네트워크: 201.222.5.0&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'BinggraeMelona-Bold'; font-weight: normal;&quot;&gt;서브넷 요구 조건&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'BinggraeMelona-Bold'; font-weight: normal;&quot;&gt;- 서브넷당 호스트 수: 5개 이상&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 18px; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'BinggraeMelona-Bold'; font-weight: normal;&quot;&gt;- 총 서브넷 수: 20개 이상&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 디폴트 서브넷 마스크 찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 네트워크는 class C로 디&lt;b&gt;폴트 서브넷 마스크&lt;/b&gt;는 &lt;b&gt;255.255.255.0&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서브넷 마스크 구하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 당 호스트의 수가 5개 이상이 되어야 하기에 2^2는 불가, 2^3부터 가능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 호스트가 세자리의 이진수로 이루어져야 한다는 의미&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;255.255.255.ssss shhh (s: 서브넷 마스크, h: 호스트)와 같은 형식으로 서브넷 마스크가 구성되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 마스크의 특성상 서브넷 마스크는 이진수로 나타내었을 때 1이 연속적으로 나와야 하기에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 조건을 만족시키는 &lt;b&gt;서브넷 마스크&lt;/b&gt;는 &lt;b&gt;255.255.255.1111 1000&lt;/b&gt; (255.255.255.248)이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 서브넷 만들기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크 부분이 된 부분으로 (ssss s) 서브넷을 만들어나가고&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 호스트 부분이 된 부분으로 (hhh) 호스트를 만들어가면 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시)&amp;nbsp; 네트워크가 0000 0hhh인 서브넷&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;201.222.5.0000 0000 (호스트가 모두 0이므로 네트워크 자체를 의미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;201.222.5.0000 0001 -&amp;gt; 201.222.5.1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;201.222.5.0000 0111 (호스트가 모두 1이므로 브로트캐스트 주소)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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&gt;&lt;span&gt;예시와 같은 방식으로 네트워크 부분과 호스트 부분을 변경해가며 서브넷을 구성하면 된다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[Network] 후니의 쉽게 쓴 시스코 네트워킹</category>
      <category>IP class</category>
      <category>IP 주소</category>
      <category>디폴트 서브넷 마스크</category>
      <category>서브넷</category>
      <category>서브넷마스크</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/168</guid>
      <comments>https://spongerice.tistory.com/168#entry168comment</comments>
      <pubDate>Tue, 27 Dec 2022 22:44:38 +0900</pubDate>
    </item>
    <item>
      <title>[후니의 쉽게 쓴 시스코 네트워킹] PART 04. 네트워크 장비에 관한 이야기</title>
      <link>https://spongerice.tistory.com/167</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 01. 랜카드도 세팅해야 하나요?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*NIC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;network interface card (랜카드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 유저의 데이터를 케이블에 실어서 허브, 스위치, 라우터 등으로 전달&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 전달된 데이터를 CPU에게 전달&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 들어온 프레임의 목적지 MAC address를 보고 자신의 MAC address와 비교한 후 자기 것이 아니면 버린다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;설치 위치에 따른 구분&lt;/span&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데스크톱 랜카드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 데스크탑에서 사용하는 BUS 방식을&amp;nbsp; 고려하여 데스트톰 랜카드를 결정해야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노트북용 랜카드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCMCIA 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;속도에 따른 구분&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100Mbps&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10Gbps 등등&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7레이어를 지나는 동안 데이터들이 추가되고, 다양한 overhead가 존재하기에 실제로 저 정도의 속도가 나오지는 않는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;접속 케이블에 따른 구분&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;TP, BNC, AUI 포트를 가진 랜카드&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;광케이블과 접속하는 랜카드 등등&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 02. 허브 이야기 그 첫 번째&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;랜카드가 설치된 각각의 pc들은 케이블을 타고 허브에 연결된다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;같은 허브에 연결된 pc끼리는 서로 통신이 가능하다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;랜카드에 맞는 허브를 선택하는 것이 중요하다 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;(랜카드는 100 Mbps용인데 허브는 10 Mbps용이라면 속도는 10 Mbps가 된다)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜카드, 케이블, 허브만 있으면 허브에 접속된 모든 pc가 서로 통신이 가능하다 (외부로는 일단 못 나감)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;허브&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multiport Repeater&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span&gt;Multiport&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트가 많이 붙어 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Repeater&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;들어온 데이터를 그대로 재전송한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 케이블은 전송 거리에 제약이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀리 떨어진 곳으로 데이터를 전송하기 위해 들어온 데이터를 다른 곳으로 전달해주는 장비&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재는 허브가 그 역할을 대신한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 허브는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트가 여러 개 달린 장비이며, 한 포트로 들어온 데이터를 나머지 모든 포트로 뿌려주는 장비&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이더넷 허브는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSMA/CD의 적용을 받아서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 pc가 허브에 데이터를 보낼 때 다른 pc가 허브에 데이터를 보낸다면 충돌(&lt;span&gt;collision)&lt;/span&gt;이 난다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 pc에서 collision이 나면 모든 pc들이 영향을 받는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 같은 허브에 연결되어 있는 모든 pc 들은 같은 collision domain에 있다고 말한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 03. 허브의 한계&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 순간에 한 pc만 네트워크 상에서 데이터를 실어 보낼 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 한 번의 충돌이 나면 허브에 붙어 있는 모든 pc들이 영향을 받는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜리젼 도메인에 pc가 많을수록 더 많은 콜리젼이 발생한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 04. 허브 이야기 그 두 번째&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;허브의 3가지 종류&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리전트 허브, 세미 인텔리전트 허브, 더미허브&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 인텔리전트 허브&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NMS (네트워크 관리 시스템)을 통해 관리가 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-&amp;gt; 모든 데이터를 분석할 수 있고, 제어할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Auto Partition&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 자동으로 문제가 발생한 pc를 isolation 시킨다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 허브에 연결된 한 pc가 고장 나 지속적으로 메시지를 보내 네트워크에 있는 모든 pc가 통신이 불가능할 때 (CSMA/CD 특성) pc가 연결된 포트를 자동으로 찾아내어 isolation 시킨다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;요즘에는 더미 허브에도 이 기능이 있기도 하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*stackable hub&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 쌓을 수 있는 허브&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 백플레인이 빨라지고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;하나가 고장 나도 다른 장비에 영향을 미치지 않는다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NMS을 이용하여 전체 스택 장비들을 한 대의 장비처럼 관리할 수 있다&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 05. &lt;/span&gt;허브의 끝과 스위치의 시작&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브를 사용할 땐 콜리젼 도메인이 너무 커지는 상황에 주의해야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜리전 도메인을 나눠줄 수 있는 브리지 (bridge) 또는, 스위치 (switch) 장비가 출현&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 pc와 2번 pc가 통신을 하는 동시에 3번 pc와 4번 pc가 통신을 하는 상황 일 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1, 2번 pc가 통신이 끝날 때까지 기다려야 한다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 pc들이 동시에 통신할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 포트에 연결된 pc가 독자적(Dedicated)하게 10 Mbps 혹은 100 Mbps의 속도를 갖는다고 말할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;스위치&lt;/span&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포트별로 콜리젼 도메인을 나눈다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 허브가 처리할 수 없는 콜리젼 문제의 해결이 가능하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 허브에 비해 데이터를 처리하는 방법이 우수하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 전송 에러 등을 복구해주는 기능 등 여러 기능을 가지고 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포트 수 별로 차선이 만들어진다고 생각하면 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 속도가 일반적으로 허브에 비해 느리다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 모든 pc가 동일한 서버와 통신을 한다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜리젼 도메인이 나누어져 있더라도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버와의 통신은 어느 한순간에는 하나의 pc만 가능하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(서버가 한대만 존재하기 때문에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 장비가 무조건 어느 한 곳으로만 향하는 경우에는 허브나 스위치의 속도 차가 별로 안 난다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 요즘 스위치 가격이 저렴해지고, 네트워크 사용자들이 인터넷을 사용하여 많은 데이터를 주고받기에 허브보다는 스위치를 많이 사용한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 06. 험한 세상의 브리지(다리?) 되어 그대 지키리&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치를 이해하기 위해서는 브리지를 이해해야 한다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용하는 것이 브리지이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;브리지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브로 만들어진 콜리젼 도메인 사이를 반으로 나누고 중간에 다리를 놓는 것&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통과해야 한다면 통과하게 하여 콜리젼 도메인을 나누어 준다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 스위치는 브리지와 유사한 역할을 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 07. 브리지/스위치의 기능&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;box-sizing: border-box; margin: 0px; ;border: #C0C0C0 5px solid; padding: 10px;&quot;&gt;&lt;span&gt;1. Learning: 배운다&lt;br /&gt;&lt;/span&gt;&lt;span&gt;2. Flooding: 모르면 들어온 포트를 제외한 다른 모든 포트로 뿌린다&lt;br /&gt;&lt;/span&gt;&lt;span&gt;3. Forwarding: 해당 포트로 건네준다&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;4. Filtering: 다른 포트로는 못 건너가게 막는다 &lt;br /&gt;&lt;/span&gt;&lt;span&gt;5. Aging: 나이를 먹는다&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;1. Learning&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pc가 통신을 위해 프레임을 보내면 해당 pc의 mac address를 읽어서 자신의 mac address 테이블에 저장해 둔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 다른 pc가 해당 pc에게 통신할 경우 자신의 브리지 테이블을 참고하여 다리를 건너게 할 것인지 아닌지를 결정한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 프레임을 받아서 출발지의 mac address를 확인하고 브리지 테이블에 정보를 써 둔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;2. Flooding&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출발지를 제외한 나머지 포트로 데이터를 전송하는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 들어온 프레임에 적힌 mac address가 브리지 테이블에 저장된 것이 아니라면 브리지는 어디로 데이터를 보내야 할지 모른다&amp;nbsp; (한 번도 해당 주소로 통신을 한 적이 없기에 주소를 배우지 못했다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이럴 때 들어온 브리지는 포트를 제외한 모든 포트로 데이터를 전송한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브로드캐스트나 멀티캐스트에도 발생한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;3. Forwarding&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 목적지가 어디인지 알고 있고 (브리지 테이블에 저장됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 목적지가 출발지와 다른 세그먼트에 존재할 경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 해당 포트 쪽으로만 프레임을 뿌린다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 이상 통신을 하여 목적지를 알고 있을 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;cf) foolding - 다리를 건너지만 모두에게 뿌린다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forwarding - 다리를 건너지만 해당 포트로만 뿌린다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;4. Filtering&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜리젼 도메인을 나누는 역할&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 브리지가 목적지의 mac address를 알고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 출발지와 목적지가 같은 세그먼트에 있을 경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 다리를 막아 콜리젼 도메인을 나눈다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이 자리에 브리지 대신에 허브가 놓여 있었다면 이러한 콜리젼 도메인이 분리되지 않아 동시에 통신할 수 없다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;5. Aging&lt;/span&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지 테이블에 저장된 내용 중 오래된 내용을 삭제하여 저장 공간을 유지하는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- mac address를 브리지 테이블에 저장하고 나면 aging이 가동되어 저장한 뒤 300초 (기본 값)가 지나도록 해당 주소를 가진 프레임이 들어오지 않으면 브리지 테이블에서 삭제한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 타이머가 끝나기 전에 브리지로 들어오면 타이머를 리셋하고 처음부터 다시 카운트한다 =&amp;gt; aging 타이머를 refresh 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;스위치와 브리지의 차이점&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 가격: 스위치 &amp;gt; 브리지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 인기: 스위치 &amp;gt; 브리지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 스위치는 처리 방식이 하드웨어로 이루어진다 (ASIC - 처리 방식을 칩에 구워 만듦)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 스위치는 서로 다른 속도를 연결해줄 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 스위치는 브리지에 비해 제공하는 포트 수가 많다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 스위치는 cut-through, store-and-forward 방식을 사용하지만 브리지는 오직 store-and-forward 방식을 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section 08. &lt;/span&gt;&lt;/span&gt;Looping(뺑뺑이)는 왜 생길까요?&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;Looping (루핑)&lt;/span&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임이 네트워크 상에서 무한정으로 뺑뺑 도는 현상&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크가 조용해지기를 기다리기만 할 뿐 데이터 전송이 불가능한 상태&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브리지, 스위치 디자인에서 가장 주의해야 하는 사항&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 두 호스트 사이에 스위치/브리지가 2개 있다면 루핑이 발생할 수 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(하나의 경로가 끊어져도 다른 경로를 사용할 수 있도록 하기 위해 2개 만들었다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CSMA/CD 특성으로 네트워크가 무용지물 상태가 된다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;스패닝 트리 알고리즘 (spanning tree alforithm)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루핑을 방지하는 알고리즘&amp;nbsp;&lt;/p&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&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;Fault Tolerant&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장애 대비책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 이중 구조를 의미하고 전체 네트워크가 하나의 지점에서 발생한 장애로 인해 영향을 받는 것을 방지하기 위한 대비책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;Load Balancing&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드를 분산하는 것 (속도가 빨라짐)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 로드 밸런싱을 fault tolerant가 가능하지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fault tolerant는 load balancing이 안 되는 경우도 있다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼동하기 쉬우니 주의!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;09. 스패닝 트리되지 않는 스위치는 팥 없는 찐빵!&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;스패닝 트리 &lt;span&gt;(spanning tree)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 경로에 문제가 생기면 막아놓은 경로를 풀어서 데이터를 전송 (시간 소요됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 스위치는 스패닝 트리 알고리즘을 지원한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;전통적인 스패닝 트리 알고리즘의 약점을 보완한 방법&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약점: 기존 경로에 문제가 발생했을 때 되돌아가는데 1분 이상 소요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시스코의 이더 채널(ether-channel): 여러 개의 링크가 마치 하나의 링크처럼 인식되게 하는 기술&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 패스트 이더 채널, 기가 이더 채널: 이더 채널의 속도 차이&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 업링크 패스트 (uplink fast): 복구가 2~3초 안에 되도록 하는 기술&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;section&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;10. 라우팅이냐, 스위칭이냐&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치는 라우터에 비해 가격이 싸고, 속도가 빠르고, 구성이 편리하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 스위치만 사용한다면 풀리지 않는 문제들이 있다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;라우터 역할 1. 브로드캐스트&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브리지/스위치를 사용하면 콜리젼 도메인 영역이 줄어든다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHaWsS/btrUHMGm22B/OzC7Njk0v2ohNHc7uCScuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHaWsS/btrUHMGm22B/OzC7Njk0v2ohNHc7uCScuk/img.png&quot; data-alt=&quot;스위치만 사용한 경우 - 브로드캐스트 도메인이 커진다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHaWsS/btrUHMGm22B/OzC7Njk0v2ohNHc7uCScuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHaWsS%2FbtrUHMGm22B%2FOzC7Njk0v2ohNHc7uCScuk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;376&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스위치만 사용한 경우 - 브로드캐스트 도메인이 커진다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그러나 브로드캐스트 도메인은 커진다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnXtIO/btrUKXf3qKG/N2FFCai33DkyiQiyijURFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnXtIO/btrUKXf3qKG/N2FFCai33DkyiQiyijURFk/img.png&quot; data-alt=&quot;라우터를 사용한 경우 - 브로드캐스트 도메인이 작아진다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnXtIO/btrUKXf3qKG/N2FFCai33DkyiQiyijURFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnXtIO%2FbtrUKXf3qKG%2FN2FFCai33DkyiQiyijURFk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;356&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라우터를 사용한 경우 - 브로드캐스트 도메인이 작아진다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이걸 나눠주는 역할이 라우터&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;라우터 역할 2. 로드 분배&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 경로를 가지고 있기에 데이터가 여러 경로로 날아갈 수 있다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;span&gt;라우터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;역할 3. QoS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quality of Service&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜이나 데이터의 크기, 중요도 등 여러 상황에 따라 트래픽의 전송 순서 조정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[Network] 후니의 쉽게 쓴 시스코 네트워킹</category>
      <category>looping</category>
      <category>네트워크 장비</category>
      <category>라우터</category>
      <category>랜카드</category>
      <category>브리지</category>
      <category>스위치</category>
      <category>스패닝 트리</category>
      <category>콜리젼 도메인</category>
      <category>허브</category>
      <category>후니의 쉽게 쓴 시스코 네트워킹</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/167</guid>
      <comments>https://spongerice.tistory.com/167#entry167comment</comments>
      <pubDate>Mon, 26 Dec 2022 22:55:35 +0900</pubDate>
    </item>
    <item>
      <title>[후니의 쉽게 쓴 시스코 네트워킹] PART 03. TCP/IP와의 만남</title>
      <link>https://spongerice.tistory.com/166</link>
      <description>&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;TCP/IP&lt;/span&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 사용하기 위한 프로토롤&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 인터넷에서의 공용어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 네트워크에 접속되는 호스트들을 고유의 주소를 가지고 있어서 자신이 속해 있는 네트워크뿐만 아니라 다른 네트워크에 연결되어 있는 호스트까지도 서로 데이터를 주고받을 수 있도록 만들어져 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. ip 주소가 같으면 안된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 네트워크별로 동일한 네트워크 부분을 가져야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span&gt;네트워크별로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서브넷 마스크를 동일하게 가져야 한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;IP&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전 세계에서 나만이 가지고 있는 것&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원칙적으로는 같은 주소를 사용하면 ip 주소가 충돌 난다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 현재 사용할 수 있는 ip 주소를 거의 다 사용했기에 각자가 다른 ip 주소를 사용한다는 것이 어려워짐&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT 방식 혹은 PAT 방식등을 사용하여 ip 주소를 공유한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*NAT 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;network address translation&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 네트워크에서는 공인되지 않은 ip 주소 사용, 인터넷으로 나갈 때만 공인된 ip 주소 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*PAT 방식&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;port address translation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 ip주소를 가지고 여러명이 인터넷에 접속하며 포트 번호만을 변경하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*NIC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;network information center&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공인된 ip 주소를 나눠주고 관리해주는 기관&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*DHCP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dynamic host configuration protocol&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 ip 주소를 배정해 주는 것 (다 쓰고 나면 회수한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 네트워크에서 사용 가능한 모든 ip 주소를 &lt;span&gt;DHCP&lt;/span&gt;가 가지고 있는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트 pc가 켜지면 네트워크에 ip 주소를 달라고 브로드캐스트를 뿌린다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 요청을 받은 DHCP 서버는 클라이언트에게 자신이 관리하는 ip 주소 중 하나를 자동으로 할당한다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;os, 라우터 등에서 기본적으로 제공하는 기능&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs/[Network] 후니의 쉽게 쓴 시스코 네트워킹</category>
      <category>DHCP</category>
      <category>IP</category>
      <category>NAT 방식</category>
      <category>nic</category>
      <category>PAT 방식</category>
      <category>TCP/IP</category>
      <category>후니의 쉽게 쓴 시스코 네트워킹</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/166</guid>
      <comments>https://spongerice.tistory.com/166#entry166comment</comments>
      <pubDate>Mon, 26 Dec 2022 19:43:05 +0900</pubDate>
    </item>
    <item>
      <title>[Girls In ICT 2022] 참여 &amp;amp; 수상 후기</title>
      <link>https://spongerice.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon&quot;&gt;Girls in ICT 2022 해커톤 - Ericsson (ericssonlg.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669621954634&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Girls in ICT 2022 해커톤&quot; data-og-description=&quot;에릭슨엘지는 ICT 리더로서 균형적이며 다양성을 포용하는 ICT 산업계를 만들어가기 위해 여성의 STEAM 교육을 장려하고 ICT 산업으로의 진로 개발을 응원하기 위해 Girls in ICT 해커톤을 개최합니다.&quot; data-og-host=&quot;www.ericssonlg.com&quot; data-og-source-url=&quot;https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon&quot; data-og-url=&quot;https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tzP8p/hyQHW7xgfV/iRjynt3ANbZIiPAmbKlxk0/img.jpg?width=1500&amp;amp;height=844&amp;amp;face=0_0_1500_844&quot;&gt;&lt;a href=&quot;https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tzP8p/hyQHW7xgfV/iRjynt3ANbZIiPAmbKlxk0/img.jpg?width=1500&amp;amp;height=844&amp;amp;face=0_0_1500_844');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Girls in ICT 2022 해커톤&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;에릭슨엘지는 ICT 리더로서 균형적이며 다양성을 포용하는 ICT 산업계를 만들어가기 위해 여성의 STEAM 교육을 장려하고 ICT 산업으로의 진로 개발을 응원하기 위해 Girls in ICT 해커톤을 개최합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ericssonlg.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022.09.30 ~ 2022.11.23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Girls In ICT 2022의 시작부터 수상까지 과정을 기록한 글입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀명: Ada&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀원 닉네임: 선요, 희요, 은요 (작성자)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 해커톤은 5일이었는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비하고 준비하고 준비하다 보니 2달이 되어버렸다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;팀 결성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9월 말쯤&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선요에게서 해커톤에 함께 하자는 연락이 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전부터 함께 프로젝트를 해보고 싶었던 선요, 희요의 연락이기도 했고,&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라즈베리 파이를 사용하는 해커톤이라길래 바로 함께 하고 싶다고 답변하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 우리의 킥보드 프로젝트가 시작되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_KakaoTalk_20221128_172401080.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUA9SC/btrSmunbOzZ/26oFAro0CAIEz2oGkCnrCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUA9SC/btrSmunbOzZ/26oFAro0CAIEz2oGkCnrCk/img.png&quot; data-alt=&quot;선요의 제안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUA9SC/btrSmunbOzZ/26oFAro0CAIEz2oGkCnrCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUA9SC%2FbtrSmunbOzZ%2F26oFAro0CAIEz2oGkCnrCk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;276&quot; data-filename=&quot;edited_edited_KakaoTalk_20221128_172401080.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선요의 제안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;예선 준비&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Girls In ICT의 첫 관문인 예선을 통과하기 위해 영문으로 작성된 PPT 아이디어 제안서를 작성해야 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주제에 맞는 아이디어를 선정하고 내용을 구체화하기 위해 여러 번의 회의를 거쳤고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과 주행 법규를 어기는 전동 킥보드를 단속하는 프로그램을 만들기로 하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;본선 진출!&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 아이디어가 본선 진출 아이디어로 선정되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본선 진출 팀 10팀은 &lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;에릭슨엘지 서울 R&amp;amp;D 캠퍼스에서 진행되는 사전 교육에 참여해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;이에 우리 팀도 11월 14일 금요일에 &lt;span style=&quot;color: #242424;&quot;&gt;에릭슨엘지 서울 R&amp;amp;D 캠퍼스에 사전 교육에 참여하러 갔다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R1Kf6/btrSlouuYYZ/HN9oDcLKoyRbZVanKL5i2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R1Kf6/btrSlouuYYZ/HN9oDcLKoyRbZVanKL5i2K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221104_123449.jpg&quot; width=&quot;400&quot; style=&quot;width: 21.0747%; margin-right: 10px;&quot; data-widthpercent=&quot;21.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R1Kf6/btrSlouuYYZ/HN9oDcLKoyRbZVanKL5i2K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR1Kf6%2FbtrSlouuYYZ%2FHN9oDcLKoyRbZVanKL5i2K%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRnJv/btrSm0e8F6L/cF8UJRJAcFQv1V43hcq2nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRnJv/btrSm0e8F6L/cF8UJRJAcFQv1V43hcq2nk/img.png&quot; width=&quot;400&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1635&quot; data-origin-height=&quot;1174&quot; data-filename=&quot;edited_20221104_123525.jpg&quot; data-widthpercent=&quot;40.07&quot; style=&quot;width: 39.1336%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRnJv/btrSm0e8F6L/cF8UJRJAcFQv1V43hcq2nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRnJv%2FbtrSm0e8F6L%2FcF8UJRJAcFQv1V43hcq2nk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1635&quot; height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7f4l/btrSmvfo2SJ/zCWB3rBVc86nT3r3tzcbm0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7f4l/btrSmvfo2SJ/zCWB3rBVc86nT3r3tzcbm0/img.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; data-filename=&quot;20221104_124408.jpg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;38.35&quot; style=&quot;width: 37.4661%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7f4l/btrSmvfo2SJ/zCWB3rBVc86nT3r3tzcbm0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7f4l%2FbtrSmvfo2SJ%2FzCWB3rBVc86nT3r3tzcbm0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;친절하게 길 안내해주는 배너 &amp;amp; 눈에 잘 보이는 Ada 이름표 &amp;amp; time table&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZGktR/btrSlW5oZgf/9efzLfaKE1X72LyIXijVA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZGktR/btrSlW5oZgf/9efzLfaKE1X72LyIXijVA1/img.png&quot; width=&quot;400&quot; height=&quot;533&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221104_124458.jpg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZGktR/btrSlW5oZgf/9efzLfaKE1X72LyIXijVA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZGktR%2FbtrSlW5oZgf%2F9efzLfaKE1X72LyIXijVA1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LA1B9/btrSjpAHJGc/nfNATgMScwApAst4pPbo11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LA1B9/btrSjpAHJGc/nfNATgMScwApAst4pPbo11/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221104_151439.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LA1B9/btrSjpAHJGc/nfNATgMScwApAst4pPbo11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLA1B9%2FbtrSjpAHJGc%2FnfNATgMScwApAst4pPbo11%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Hands-on&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;오프닝 행사가 끝난 뒤 멘토님들께서 진행하시는 핸즈온 시간이 시작되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;라즈베리 파이와 각종 센서들을 팀당 1세트씩 배부받고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;멘토님을 따라 기초적인 센서 사용 법을 익혔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b91jNW/btrShItPRp5/0jtQnpZigg1zSe59faI5kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b91jNW/btrShItPRp5/0jtQnpZigg1zSe59faI5kK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221104_142254.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b91jNW/btrShItPRp5/0jtQnpZigg1zSe59faI5kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb91jNW%2FbtrShItPRp5%2F0jtQnpZigg1zSe59faI5kK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfGf9d/btrSkCfxo3d/R5P028fW7BvFfAoHyZKZh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfGf9d/btrSkCfxo3d/R5P028fW7BvFfAoHyZKZh0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221104_142258.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfGf9d/btrSkCfxo3d/R5P028fW7BvFfAoHyZKZh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfGf9d%2FbtrSkCfxo3d%2FR5P028fW7BvFfAoHyZKZh0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/stmwy/btrShHn9Qpx/xJm4qor6pXhkBmkmm7Aq81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/stmwy/btrShHn9Qpx/xJm4qor6pXhkBmkmm7Aq81/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221104_152434.jpg&quot; data-widthpercent=&quot;33.34&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/stmwy/btrShHn9Qpx/xJm4qor6pXhkBmkmm7Aq81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fstmwy%2FbtrShHn9Qpx%2FxJm4qor6pXhkBmkmm7Aq81%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Hands-on 실습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;하나씩 실습해보며 배부받은 라즈베리와 센서에 익숙해지는 시간을 가졌다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;실습을 해보니 진짜 해커톤에 참여하고 있다는 것이 실감 났다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk8wNu/btrSlU0Pq9a/HKZq9N8npt3OGL0SWXHBR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk8wNu/btrSlU0Pq9a/HKZq9N8npt3OGL0SWXHBR1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221104_145105.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk8wNu/btrSlU0Pq9a/HKZq9N8npt3OGL0SWXHBR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk8wNu%2FbtrSlU0Pq9a%2FHKZq9N8npt3OGL0SWXHBR1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N4HzL/btrSeg5H36u/gBiR6etCipxgZO9RHM6dzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N4HzL/btrSeg5H36u/gBiR6etCipxgZO9RHM6dzk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221104_162315.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N4HzL/btrSeg5H36u/gBiR6etCipxgZO9RHM6dzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN4HzL%2FbtrSeg5H36u%2FgBiR6etCipxgZO9RHM6dzk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;인터뷰 하는 멋진 팀장님과 단체 사진 찍은 우리 팀&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;간식도 많이 챙겨주시고, 중간중간 사진도 많이 찍고, 인터뷰도 했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;사진을 이렇게 많이 찍힌 적이 없었던 것 같다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;이 상황이 신기하고 재밌었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;찰칵찰칵찰칵&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;해커톤 시작  &lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;사전 교육 행사가 끝난 뒤 바로 학교로 돌아가 개발을 시작했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424; font-family: 'Noto Serif KR';&quot;&gt;1일 차&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;해커톤 1일 차 목표는&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;앞으로의 일정 정리&amp;nbsp;&lt;/li&gt;
&lt;li&gt;횡단보도 인식 모델 찾기 (어떤 모델로 어떤 데이터셋을 사용하여 개발할지)&lt;/li&gt;
&lt;li&gt;라즈베리 파이 초기 설정&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋이 함께 앞으로 해커톤 완주를 위해 해야 할 일들을 정리하였다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선요는 라즈베리 파이 초기 설정을 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 초반에 해야 하는 일들이 가장 어려운 것 같다&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;횡단보도 인식 프로세스를 바꾸기고 하였고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라즈베리에 여러 프로그램 특히, 욜로를 설치하는 과정에서 어려움이 많았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_20221104_203314.jpg&quot; data-origin-width=&quot;1927&quot; data-origin-height=&quot;1927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0f25n/btrSlYWuQbX/XkuqUPW3lP7GGjfkBkrkOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0f25n/btrSlYWuQbX/XkuqUPW3lP7GGjfkBkrkOK/img.png&quot; data-alt=&quot;초기 계획&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0f25n/btrSlYWuQbX/XkuqUPW3lP7GGjfkBkrkOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0f25n%2FbtrSlYWuQbX%2FXkuqUPW3lP7GGjfkBkrkOK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-filename=&quot;edited_20221104_203314.jpg&quot; data-origin-width=&quot;1927&quot; data-origin-height=&quot;1927&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 계획&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2일 차&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2일 차는 토요일이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아침부터 학교에 모여 어제 미처 다 하지 못했던 일들과 계획했던 일들을 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라즈베리 파이 담당인 선요는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라즈베리 파이 초기 설정을 마무리하고 센서를 연결한 뒤 관련 코드를 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 모델 담당인 희요는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 모델을 우리의 상황에 맞추어 변경하고, 관련 데이터 셋을 가지고 학습을 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 라즈베리 파이에서 원활하게 돌아갈 수 있도록 경량화를 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버와 프론드 담당인 나는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ERD를 설계하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스와 서버를 구축하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 프론트엔드 페이지를 생성하고 라즈베리 파이에서 값을 받아와 html에 적합한 값이 보이도록 코드를 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_20221107_222312.jpg&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2YcM/btrSln3La2j/8yuCF4nwLOF6qd6AYEsj4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2YcM/btrSln3La2j/8yuCF4nwLOF6qd6AYEsj4k/img.png&quot; data-alt=&quot;변경된 계획 + 연구의 응원 메시지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2YcM/btrSln3La2j/8yuCF4nwLOF6qd6AYEsj4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2YcM%2FbtrSln3La2j%2F8yuCF4nwLOF6qd6AYEsj4k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;300&quot; data-filename=&quot;edited_20221107_222312.jpg&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;변경된 계획 + 연구의 응원 메시지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;3일 차&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;3일 차도 역시 주말이었는데&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;낮에 일이 있었던 나를 제외한 선요와 희요가 아침 일찍부터 학교에 나와 개발을 진행하였다. &lt;/span&gt;&lt;/p&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;background-color: #ffffff; color: #242424;&quot;&gt;어제 다 끝내지 못했던 작업을 마저 하고&amp;nbsp;&lt;/span&gt;&lt;/p&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;background-color: #ffffff; color: #242424;&quot;&gt;선요는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;라즈베리 파이에 웹캠, 스위치, 부저 등을 모두 연결하고, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;올바르게 작동할 수 있도록 관련 코드를 작성하였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&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;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;희요는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;라즈베리에서도 프로젝트에 적합한 속도가 나올 수 있도록 경량화 작업을 계속해서 진행하였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;또한, 인식률 향상을 위해 코드를 수정하고 변형하였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;나는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;센서로부터 읽어온 값을 저장하고 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;테이블과 이미지 형태로 화면에 출력할 수 있도록 코드를 작성하였다. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이후 센서 값들을 분석하여 표로 나타내었고, 결과를 확인할 수 있는 페이지를 생성하였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;월요일에는 수업도 있고 멘토링도 예정되어 있기에 개발할 시간이 부족할 것 같았다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그래서 힘이 들더라도 주말 동안 최대한 많은 것을 완성할 수 있도록 노력하였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;4일 차&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;열일했던 주말이 끝나고 다시 월요일이 돌아왔다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주말 동안 열심히 개발한 덕분에 월요일에는 조금 여유롭게 마무리 작업에 들어갈 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선요는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 공수해온 GPS를 연결하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인식된 값이 서버로 넘어갈 수 있도록 개발하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 라즈베리에 연결된 모든 센서들이 올바르게 작동할 수 있도록 코드를 수정하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 모델 개발이 빨리 끝나 ppt 작업을 시작하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 잘 연결되어 작동될 수 있도록 코드를 수정하였으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPS를 통해 읽어온 값을 바탕으로 추가적인 데이터 분석을 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두가 맡은 바를 마무리 지을 수 있도록 노력하였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20221106_232609.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eNdCkI/btrSmYIAIky/LJe293giHCNKbQoy7LaaC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eNdCkI/btrSmYIAIky/LJe293giHCNKbQoy7LaaC0/img.jpg&quot; data-alt=&quot;야식으로 먹은 회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eNdCkI/btrSmYIAIky/LJe293giHCNKbQoy7LaaC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNdCkI%2FbtrSmYIAIky%2FLJe293giHCNKbQoy7LaaC0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-filename=&quot;20221106_232609.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;야식으로 먹은 회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;그리고 야식으로 회를 먹었다 ㅎㅎㅎ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;맛있어서 또 사 먹을 것 같다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424; font-family: 'Noto Serif KR';&quot;&gt;5일 차&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;드디어 마지막 날이 밝아 왔다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;5일차 계획은 다음과 같다&amp;nbsp;&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;각자 개발했던 것을 하나로 모아 테스트해보기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;밖으로 나가 시연하고, 사진, 영상 촬영하기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ppt 완성하기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;영상 완성하기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;리드미 작성하기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;주석 달고 코드 정리하기&amp;nbsp;&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;일단 아침 일찍 모여 자신의 코드를 다듬고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밖으로 나가 시연을 진행하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교 근처에 있는 킥보드를 대여해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교 내부에 있는 횡단보도에서 시연을 하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 사람이 많이 없고, 차가 다른 곳보단 많지 않아 시연하기에 적합했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8k478/btrSmuHJLJ0/aOkFcT8u8EQIK6A2kPhKR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8k478/btrSmuHJLJ0/aOkFcT8u8EQIK6A2kPhKR1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221108_102607.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8k478/btrSmuHJLJ0/aOkFcT8u8EQIK6A2kPhKR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8k478%2FbtrSmuHJLJ0%2FaOkFcT8u8EQIK6A2kPhKR1%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc6Tl0/btrSmtIRbH8/Jl4KMiyHPPKjiKefokJm70/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc6Tl0/btrSmtIRbH8/Jl4KMiyHPPKjiKefokJm70/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221108_110208.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc6Tl0/btrSmtIRbH8/Jl4KMiyHPPKjiKefokJm70/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc6Tl0%2FbtrSmtIRbH8%2FJl4KMiyHPPKjiKefokJm70%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;시연 환경 구성 중 &amp;amp; 장치 연결&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20221108_110738.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QcvDn/btrSllrlnGv/5XpnJdkCEy25Yl5gXXQFYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QcvDn/btrSllrlnGv/5XpnJdkCEy25Yl5gXXQFYK/img.jpg&quot; data-alt=&quot;Ta-da! 전부 연결한 모습, 선이 너무 어지러워서 정리를 했다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QcvDn/btrSllrlnGv/5XpnJdkCEy25Yl5gXXQFYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQcvDn%2FbtrSllrlnGv%2F5XpnJdkCEy25Yl5gXXQFYK%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot; data-filename=&quot;20221108_110738.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ta-da! 전부 연결한 모습, 선이 너무 어지러워서 정리를 했다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wg3j5/btrSkExTaGn/BKyX236sRHRmY9nxqcCkv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wg3j5/btrSkExTaGn/BKyX236sRHRmY9nxqcCkv0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221108_113146.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wg3j5/btrSkExTaGn/BKyX236sRHRmY9nxqcCkv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWg3j5%2FbtrSkExTaGn%2FBKyX236sRHRmY9nxqcCkv0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvE52M/btrSkCNxxmg/PtNHSpTLtF0yWXFzLvDXL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvE52M/btrSkCNxxmg/PtNHSpTLtF0yWXFzLvDXL0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221108_113804.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvE52M/btrSkCNxxmg/PtNHSpTLtF0yWXFzLvDXL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvE52M%2FbtrSkCNxxmg%2FPtNHSpTLtF0yWXFzLvDXL0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;깔끔해진 전동 킥보드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20221108_112351.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SeJnI/btrSlGIHmk4/Jgw1uBOk0fs2r7UUE0T9f0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SeJnI/btrSlGIHmk4/Jgw1uBOk0fs2r7UUE0T9f0/img.jpg&quot; data-alt=&quot;횡단 보도 인식 성공!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SeJnI/btrSlGIHmk4/Jgw1uBOk0fs2r7UUE0T9f0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSeJnI%2FbtrSlGIHmk4%2FJgw1uBOk0fs2r7UUE0T9f0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-filename=&quot;20221108_112351.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;횡단 보도 인식 성공!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;화면이 너무 작고 밝아서 확인이 힘들지만&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;횡단보도를 올바르게 인식한 화면이다&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다행히 실내에서 테스트한 것과 동일하게&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;횡단보도 인식이 잘 되며&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;가속도 센서와 스위치가 잘 연동되어&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;전동 킥보드가 횡단보도를 주행하는지 판단할 수 있었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;1시간 반 정도 테스트를 진행하고,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;사진과 영상을 촬영하였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그동안의 노력이 헛되이 되지 않아 정말 다행이고 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #242424;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;잘 작동되어 기뻤다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20221108_185352.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yPfLh/btrSf20yZln/IbpdGLTNzOVRyqgKxBORfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yPfLh/btrSf20yZln/IbpdGLTNzOVRyqgKxBORfk/img.jpg&quot; data-alt=&quot;개기월식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yPfLh/btrSf20yZln/IbpdGLTNzOVRyqgKxBORfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyPfLh%2FbtrSf20yZln%2FIbpdGLTNzOVRyqgKxBORfk%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-filename=&quot;20221108_185352.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개기월식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 남은 작업을 시작해야 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 남은 작업은&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ppt 완성&amp;nbsp;&lt;/li&gt;
&lt;li&gt;실내 시연 영상 촬영&amp;nbsp;&lt;/li&gt;
&lt;li&gt;영상 완성&lt;/li&gt;
&lt;li&gt;코드 다듬기, 주석, 커밋 규칙에 맞추어 작성하기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;리드미 작성&amp;nbsp;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 오늘 안으로 모든 것을 끝내야 했기에 다시 일을 시작했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각자 자신의 코드를 다듬고 주석, 커밋을 규칙에 맞추어 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선요는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실내 시연 영상을 촬영하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상에 들어갈 대본을 작성하고, 영어로 녹음하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희요는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ppt를 완성하였고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상을 완성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희요를 도와 ppt를 완성하였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리드미를 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 시간 안에 모든 것을 완료하였고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 내에 제출 완료하였다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/gommy15/Ada&quot;&gt;gommy15/Ada (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669638062933&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - gommy15/Ada&quot; data-og-description=&quot;Contribute to gommy15/Ada development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/gommy15/Ada&quot; data-og-url=&quot;https://github.com/gommy15/Ada&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d32U9c/hyQJu2Lrpj/qEma6Ose2wIo7IYa94w8PK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/gommy15/Ada&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/gommy15/Ada&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d32U9c/hyQJu2Lrpj/qEma6Ose2wIo7IYa94w8PK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - gommy15/Ada&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to gommy15/Ada development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과물로 깃허브와 영상을 제출해야 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;결선&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpVPOr/btrSmsDd2uA/gB0iAA595d3wbjmDJ1fNmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpVPOr/btrSmsDd2uA/gB0iAA595d3wbjmDJ1fNmk/img.png&quot; data-alt=&quot;결선 진출 메일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpVPOr/btrSmsDd2uA/gB0iAA595d3wbjmDJ1fNmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpVPOr%2FbtrSmsDd2uA%2FgB0iAA595d3wbjmDJ1fNmk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;448&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결선 진출 메일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠 뒤 결선 결과가 메일로 전달되었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메일을 먼저 확인한 희요와 선요가 결과를 전달해줬는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 정말 기뻤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 한 단계 더 남았지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 노력하며 결과를 하나하나 만들어 나가는 것 같아서 성취감도 들고 굉장히 뿌듯했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;결선 준비&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결선에는 5팀이 올라가고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수상하기 위해서는 3팀 안에 들어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비해야 할 항목은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영어 발표&amp;nbsp;&lt;/li&gt;
&lt;li&gt;질의응답 준비&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어 발표는 내가 맡았고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함께 발표 대본을 작성하고 번역하는 과정을 반복했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 5일 전 대본을 완성하였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때부터 틈틈이 대본을 암기하기 시작했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어로 발표를 한다는 게 긴장이 되고 걱정이 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 팀원들이 응원해준 덕분에 끝까지 포기하지 않고 도전할 수 있었던 것 같다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수십 번 연습을 했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;결선 당일&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표에 대한 걱정이 더 컸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11시 10분쯤 가산디지털단지 역 앞에서 만나서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유명 초밥 맛집에 갔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표 전 어떤 걸 먹을까 하다가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금은 간단하게 먹고 싶어 초밥으로 결정하였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20221123_112953.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY3S3q/btrSf20CoMG/Zfsl3kDEo3fRX5KyJu76Nk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY3S3q/btrSf20CoMG/Zfsl3kDEo3fRX5KyJu76Nk/img.jpg&quot; data-alt=&quot;초밥&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY3S3q/btrSf20CoMG/Zfsl3kDEo3fRX5KyJu76Nk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY3S3q%2FbtrSf20CoMG%2FZfsl3kDEo3fRX5KyJu76Nk%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;300&quot; data-filename=&quot;20221123_112953.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초밥&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1시 10분 정도까지 도착했어야 했는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밥 다 먹으니깐 12시였다 ㅎㅎㅎ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 일단 들어갔는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점심시간이라 못 들어갔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근처에 카페가 많길래 사람이 적고 앉을 곳이 잇는 곳으로 들어갔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거기서 좀 쉬면서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표 연습을 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전날 학교에서 고양이를 구경하다가 넘어져서 가지고 있던 파스를 마이크삼아 발표 연습을 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카페에서 점심시간에 파스를 들고 영어로 발표하는 상황이 넘 웃겼다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 실수하지 않기 위해 계속해서 연습했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_1669205508624-11.jpg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT2NpJ/btrSlYvEwn5/65pyPo1rdlQ8Zuvwd1h3q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT2NpJ/btrSlYvEwn5/65pyPo1rdlQ8Zuvwd1h3q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT2NpJ/btrSlYvEwn5/65pyPo1rdlQ8Zuvwd1h3q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT2NpJ%2FbtrSlYvEwn5%2F65pyPo1rdlQ8Zuvwd1h3q0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;533&quot; data-filename=&quot;edited_1669205508624-11.jpg&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼추 시간이 다 되어서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결선 장소로 이동하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 다른 팀들이 도착해있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리도 얼른 준비하고 자리에 앉았다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 옷으로 갈아입고, 준비해 온 배지를 달았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 에릭슨엘지에서도 뱃지를 제공해주셔서 배지가 2개가 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wg4AP/btrSmY2YJYv/e4YPdQj298kwGrj1kzzOv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wg4AP/btrSmY2YJYv/e4YPdQj298kwGrj1kzzOv0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2175&quot; data-filename=&quot;edited_KakaoTalk_20221128_214344003.jpg&quot; width=&quot;400&quot; height=&quot;290&quot; data-widthpercent=&quot;40.99&quot; style=&quot;width: 40.0379%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wg4AP/btrSmY2YJYv/e4YPdQj298kwGrj1kzzOv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwg4AP%2FbtrSmY2YJYv%2Fe4YPdQj298kwGrj1kzzOv0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;2175&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xiDHK/btrShG39kL5/EZpgXVqdd5eroX5KjKcqO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xiDHK/btrShG39kL5/EZpgXVqdd5eroX5KjKcqO1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221121_115322.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; style=&quot;width: 21.7706%; margin-right: 10px;&quot; data-widthpercent=&quot;22.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xiDHK/btrShG39kL5/EZpgXVqdd5eroX5KjKcqO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxiDHK%2FbtrShG39kL5%2FEZpgXVqdd5eroX5KjKcqO1%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B94Lw/btrSf80PBg7/AQRKsEEo17kJZQ4ie0c2w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B94Lw/btrSf80PBg7/AQRKsEEo17kJZQ4ie0c2w0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1821&quot; data-filename=&quot;edited_20221123_131036.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;36.72&quot; style=&quot;width: 35.8659%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B94Lw/btrSf80PBg7/AQRKsEEo17kJZQ4ie0c2w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB94Lw%2FbtrSf80PBg7%2FAQRKsEEo17kJZQ4ie0c2w0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;1821&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;직접 만든 팀복 &amp;amp; 뱃지 &amp;amp; 제공해주신 뱃지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀복에 있는 사람은 우리 팀장님이다 ㅎㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인부터 전사까지 모든 과정을 직접 했기에 무엇보다 의미 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배지도 디자인부터 만드는 것까지 직접 했다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학교에 이런 것들을 무료로 만들 수 있는 공간이 있어 만들게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 학교 최고 ^&amp;amp;^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 날아가는 건 아니겠지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uniqJ/btrSlouNnk3/rqtk64Zh8fI3eUKRVPKm31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uniqJ/btrSlouNnk3/rqtk64Zh8fI3eUKRVPKm31/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221123_125746.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uniqJ/btrSlouNnk3/rqtk64Zh8fI3eUKRVPKm31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuniqJ%2FbtrSlouNnk3%2Frqtk64Zh8fI3eUKRVPKm31%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUzA9r/btrSkE5LWMi/MlHLkqISZngvlWjKsE7v71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUzA9r/btrSkE5LWMi/MlHLkqISZngvlWjKsE7v71/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221123_130145.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUzA9r/btrSkE5LWMi/MlHLkqISZngvlWjKsE7v71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUzA9r%2FbtrSkE5LWMi%2FMlHLkqISZngvlWjKsE7v71%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBlgin/btrShAW4rRT/BIOxej5L35wWnkUC2RjQC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBlgin/btrShAW4rRT/BIOxej5L35wWnkUC2RjQC1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221123_131715.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;33.34&quot; style=&quot;width: 32.5581%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBlgin/btrShAW4rRT/BIOxej5L35wWnkUC2RjQC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBlgin%2FbtrShAW4rRT%2FBIOxej5L35wWnkUC2RjQC1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;다시 만난 배너 &amp;amp; 출입증 &amp;amp; 긴장되지만 사진은 찍는다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결선 장소에 오니깐 긴장이 되기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 진짜 끝이라는 생각도 들고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어 발표도 걱정되고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 팀 개발 내용도 궁금했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 팀은 3번째 순서로 발표하게 되었는데&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝이 아니라 끝까지 긴장하고 있지 않아도 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난번 본선 때 제출한 영상을 시청한 뒤&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어 발표를 진행했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어 발표 후 심사위원 질의응답 시간이 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희요와 선요가 대답을 막힘없이 해주어서 고마웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 우리 발표가 끝났다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴장을 풀고 행사를 즐길 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에릭슨 엘지 eco님과 스웨덴 주한스웨덴대사관 과학 혁신 참사관님의 강연이 있었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직원분들의 토크쇼도 진행되었다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 의미 있고 뜻깊은 내용들이어서 좋았다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 발표가 진행되었다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 후회하지 않을 정도로 열심히 했기에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상을 받지 못하더라도 의미가 있었던 시간이라고 생각되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 처음으로 #000 팀이 수상했다.&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 수상 팀으로 Team Ada가 불렸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀이 불려서 정말 감사했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjxGoZ/btrSlVMttQt/e4UPL7KkGoTL0TqOc31QcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjxGoZ/btrSlVMttQt/e4UPL7KkGoTL0TqOc31QcK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;2323&quot; data-filename=&quot;edited_edited_20221123_165020.jpg&quot; width=&quot;500&quot; height=&quot;667&quot; data-widthpercent=&quot;42.08&quot; style=&quot;width: 41.5878%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjxGoZ/btrSlVMttQt/e4UPL7KkGoTL0TqOc31QcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjxGoZ%2FbtrSlVMttQt%2Fe4UPL7KkGoTL0TqOc31QcK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;2323&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nwU9L/btrSlUNxghZ/Mia9PWunykhhuiXLFknYXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nwU9L/btrSlUNxghZ/Mia9PWunykhhuiXLFknYXK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2250&quot; data-filename=&quot;edited_20221123_170954.jpg&quot; data-widthpercent=&quot;57.92&quot; style=&quot;width: 57.2494%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nwU9L/btrSlUNxghZ/Mia9PWunykhhuiXLFknYXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnwU9L%2FbtrSlUNxghZ%2FMia9PWunykhhuiXLFknYXK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;2250&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Best Award&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgVMnN/btrSjubi17J/8lWtdsckhyjqK8KesDgt51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgVMnN/btrSjubi17J/8lWtdsckhyjqK8KesDgt51/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; data-filename=&quot;1669205508624-1.jpg&quot; style=&quot;width: 63.2558%; margin-right: 10px;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgVMnN/btrSjubi17J/8lWtdsckhyjqK8KesDgt51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgVMnN%2FbtrSjubi17J%2F8lWtdsckhyjqK8KesDgt51%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3Owf/btrSm1k55yj/wnOEah9ak2YeE7qszIPfH0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3Owf/btrSm1k55yj/wnOEah9ak2YeE7qszIPfH0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221123_180138.jpg&quot; style=&quot;width: 35.5814%;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3Owf/btrSm1k55yj/wnOEah9ak2YeE7qszIPfH0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3Owf%2FbtrSm1k55yj%2FwnOEah9ak2YeE7qszIPfH0%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;수상 기념 회식~!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_1669323387353.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx3Lg9/btrSmZni7Ft/CXVh6qL8qpNjNQ6YEnkM5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx3Lg9/btrSmZni7Ft/CXVh6qL8qpNjNQ6YEnkM5K/img.png&quot; data-alt=&quot;현수막&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx3Lg9/btrSmZni7Ft/CXVh6qL8qpNjNQ6YEnkM5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx3Lg9%2FbtrSmZni7Ft%2FCXVh6qL8qpNjNQ6YEnkM5K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;146&quot; data-filename=&quot;edited_1669323387353.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현수막&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사하게도 정말 많은 분들께 축하받았고, 학교에 현수막도 걸리게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 걸린 모습은 보지 못했지만 조만간 현수막이 달리면 사진을 업데이트해야겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각지 못하게 참여한 해커톤에서 의미 있는 결과를 낼 수 있어서 정말 좋았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교수님, 동기들, 지인들 등등 정말 많은 사람들의 도움을 받았고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그분들이 없었다면 이런 결과를 낼 수 없었을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 Ada 팀의 희요, 선요 그리고 도움 주신 많은 분들에게 감사인사를 드리며 이 글을 마무리 지어야겠다&lt;/p&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;background-color: #ffffff; color: #242424;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #242424;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[빼먹기엔 아쉬운 기록들]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucNAj/btrSlXJXA6B/XiOBezrtYniVBQs8mUF8dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucNAj/btrSlXJXA6B/XiOBezrtYniVBQs8mUF8dK/img.png&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;610&quot; data-filename=&quot;blob&quot; data-is-animation=&quot;false&quot; style=&quot;width: 77.1447%; margin-right: 10px;&quot; data-widthpercent=&quot;78.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucNAj/btrSlXJXA6B/XiOBezrtYniVBQs8mUF8dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucNAj%2FbtrSlXJXA6B%2FXiOBezrtYniVBQs8mUF8dK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1627&quot; height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYuIse/btrShHorMvA/5olqhAJuGdfQflNwxfqeT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYuIse/btrShHorMvA/5olqhAJuGdfQflNwxfqeT0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_1669205508624-7.jpg&quot; data-widthpercent=&quot;21.95&quot; style=&quot;width: 21.6925%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYuIse/btrShHorMvA/5olqhAJuGdfQflNwxfqeT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYuIse%2FbtrShHorMvA%2F5olqhAJuGdfQflNwxfqeT0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;회의 기록 &amp;amp; 왜 찍었는지 모를 카드 찍는 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxTpcG/btrSmtPHPOg/kXxCgHKAzkHnFn6OhjBcfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxTpcG/btrSmtPHPOg/kXxCgHKAzkHnFn6OhjBcfK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-filename=&quot;edited_20221105_100754.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; data-widthpercent=&quot;33.33&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxTpcG/btrSmtPHPOg/kXxCgHKAzkHnFn6OhjBcfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxTpcG%2FbtrSmtPHPOg%2FkXxCgHKAzkHnFn6OhjBcfK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yBtoi/btrSlXjcXE5/PJMjVNm4fNHhQivs8MKRk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yBtoi/btrSlXjcXE5/PJMjVNm4fNHhQivs8MKRk1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221108_185736.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yBtoi/btrSlXjcXE5/PJMjVNm4fNHhQivs8MKRk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyBtoi%2FbtrSlXjcXE5%2FPJMjVNm4fNHhQivs8MKRk1%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IfGII/btrSmZOndLu/H06tjhR8EtFh3ksnxsXInk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IfGII/btrSmZOndLu/H06tjhR8EtFh3ksnxsXInk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-filename=&quot;20221117_205331.jpg&quot; width=&quot;400&quot; height=&quot;533&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IfGII/btrSmZOndLu/H06tjhR8EtFh3ksnxsXInk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIfGII%2FbtrSmZOndLu%2FH06tjhR8EtFh3ksnxsXInk%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;yolo 인식 확인 &amp;amp; 개기월식 &amp;amp; 숯불닭갈비&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희요의 후기 보러 가기   &lt;a href=&quot;https://velog.io/@dlgmlfo04/series/Girls-in-ICT&quot;&gt;시리즈 | Girls in ICT - developer_gom.log (velog.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670046033355&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;시리즈 | Girls in ICT -  developer_gom.log&quot; data-og-description=&quot;일주일이 지나서 쓰는 후기 기억이 나야할텐데&amp;hellip; 일단 시작해보겠다 3일 전&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dlgmlfo04/series/Girls-in-ICT&quot; data-og-url=&quot;https://velog.io/@dlgmlfo04/series/Girls-in-ICT&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c8g8S4/hyQMFwDhjO/4mWFwF4erdZE2kFkl8LZK1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/gnLNk/hyQMAhMET5/SVOpGDzBnTRmpGGgJUOAmk/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/br4uJz/hyQMyjYLi5/FGETXzbZXwTR4UEkxlpHUk/img.png?width=985&amp;amp;height=528&amp;amp;face=0_0_985_528&quot;&gt;&lt;a href=&quot;https://velog.io/@dlgmlfo04/series/Girls-in-ICT&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dlgmlfo04/series/Girls-in-ICT&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c8g8S4/hyQMFwDhjO/4mWFwF4erdZE2kFkl8LZK1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/gnLNk/hyQMAhMET5/SVOpGDzBnTRmpGGgJUOAmk/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/br4uJz/hyQMyjYLi5/FGETXzbZXwTR4UEkxlpHUk/img.png?width=985&amp;amp;height=528&amp;amp;face=0_0_985_528');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;시리즈 | Girls in ICT - developer_gom.log&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일주일이 지나서 쓰는 후기 기억이 나야할텐데&amp;hellip; 일단 시작해보겠다 3일 전&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선요의 후기 보러 가기   &lt;a href=&quot;https://dev-sunyo.tistory.com/m/7&quot;&gt;[GICT 2022] Girls in ICT 2022 해커톤 &quot;예선&quot; 후기 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670143545529&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[GICT 2022] Girls in ICT 2022 해커톤 &amp;quot;예선&amp;quot; 후기&quot; data-og-description=&quot;에릭슨 엘지에서 주최하는 공모전 Girls in ict 2022 공모전에 참가하였다. 공모전 링크이다. https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon Girls in ICT 2022 해커톤 에릭슨엘지는 ICT 리더로서 균형적&quot; data-og-host=&quot;dev-sunyo.tistory.com&quot; data-og-source-url=&quot;https://dev-sunyo.tistory.com/m/7&quot; data-og-url=&quot;https://dev-sunyo.tistory.com/7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/j1AgT/hyQNM9CeTD/V2uV3gKrYSY7kefCUEik20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/clOSiK/hyQMxsDjZi/Zlu9lvCmtc20e7hAHZlEC0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cu8RjO/hyQNKqp1No/kkOba30Nzag7V1oKQsUqW1/img.png?width=957&amp;amp;height=480&amp;amp;face=0_0_957_480&quot;&gt;&lt;a href=&quot;https://dev-sunyo.tistory.com/m/7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev-sunyo.tistory.com/m/7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/j1AgT/hyQNM9CeTD/V2uV3gKrYSY7kefCUEik20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/clOSiK/hyQMxsDjZi/Zlu9lvCmtc20e7hAHZlEC0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cu8RjO/hyQNKqp1No/kkOba30Nzag7V1oKQsUqW1/img.png?width=957&amp;amp;height=480&amp;amp;face=0_0_957_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[GICT 2022] Girls in ICT 2022 해커톤 &quot;예선&quot; 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;에릭슨 엘지에서 주최하는 공모전 Girls in ict 2022 공모전에 참가하였다. 공모전 링크이다. https://www.ericssonlg.com/ko/events/girls-in-ict-2022-hackathon Girls in ICT 2022 해커톤 에릭슨엘지는 ICT 리더로서 균형적&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev-sunyo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <category>Girls in ICT</category>
      <category>IoT</category>
      <category>결선 후기</category>
      <category>라즈베리 파이</category>
      <category>에릭슨엘지</category>
      <category>해커톤</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/165</guid>
      <comments>https://spongerice.tistory.com/165#entry165comment</comments>
      <pubDate>Mon, 28 Nov 2022 22:42:22 +0900</pubDate>
    </item>
    <item>
      <title>최댓값과 최솟값의 초깃값 지정</title>
      <link>https://spongerice.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최댓값 &amp;rarr; 최솟값을 초깃값으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최솟값 &amp;rarr; 최댓값을 초깃값으로&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sys 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템에서 지정할 수 있는 가장 크고, 작은 값을 활용&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;mx = -sys.maxsize
mn = sys.maxsize
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;float 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;float을 사용하여 무한대 값을 지정&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;mx = float('-inf')
mn = float('inf')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임의의 값 (999999 등)을 최댓값, 최솟값 등으로 설정하는 것은 가장 좋지 않은 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 임의 정밀도를 지원하여 사실상 무한대의 값을 지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마든지 지정한 값 보다 작거나, 큰 값이 들어올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 코테 문제에서 기술되어 있는 제약 조건을 확인한 뒤 기준에 맞추어 최대, 최솟값을 처리하면 된다&lt;/p&gt;</description>
      <category>algorithm/기본 지식</category>
      <category>maxsize</category>
      <category>Python</category>
      <category>sys</category>
      <category>무한대</category>
      <category>최댓값 최솟값 지정</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/164</guid>
      <comments>https://spongerice.tistory.com/164#entry164comment</comments>
      <pubDate>Fri, 23 Sep 2022 09:23:09 +0900</pubDate>
    </item>
    <item>
      <title>[python] 238. Product of Array Except Self</title>
      <link>https://spongerice.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/product-of-array-except-self/&quot;&gt;Product of Array Except Self - LeetCode&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662473813942&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Product of Array Except Self - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/product-of-array-except-self/&quot; data-og-url=&quot;https://leetcode.com/problems/product-of-array-except-self/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cEvZyB/hyPHicsAaB/muk02icMlbTrJKahk1KiFK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/product-of-array-except-self/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/product-of-array-except-self/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cEvZyB/hyPHicsAaB/muk02icMlbTrJKahk1KiFK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Product of Array Except Self - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;자신을 제외한 배열의 곱&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제시된 배열에서 자신을 제외한 값들을 곱한 값들을 리턴하는 문제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의!! 나눗셈 금지 조건 존재&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 모든 값들의 곱을 구하고 자기 자신으로 나누는 풀이는 불가!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;box-sizing: border-box; border-width: 2px 12px; border-bottom-style: solid; border-bottom-color: #C0C0C0; padding: 3px 10px; border-left-style: solid; border-left-color: #C0C0C0; margin: 5px 0px; letter-spacing: 1px;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-size: 24px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;풀이&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;옳은 풀이&amp;nbsp;&lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 값들의 곱셈 결과와&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 값들의 곱을 곱하면 올바른 풀이를 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자기 자신을 제외한 왼쪽 값들의 곱&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662474475471&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mul = 1 # 곱셈이기에 초깃값이 1이 되어야 한다 
for i in range(len(nums)):
	result.appand(mul) # 자신을 제외한 왼쪽 값들의 곱들이 들어간다 
    mul *= nums[i] # 여기서 이전 값들의 곱이 쌓인다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자기 자신을 제외한 오른쪽 값들의 곱&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662474622106&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mul = 1
for i in range(len(nums)-1, 0 -1, -1):
	# (start, stop, step) stop은 범위 미포함이라 -1 해줘야 한다 
    result[i] *= mul # 왼쪽에서 곱해져온 값에 또 곱해야 한다 
    mul *= nums[i]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 완성된 코드&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662474658109&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from typing import List
class Solution:
    def productExceptSelf(self, nums: List[int]) -&amp;gt; List[int]:
        result = []
        mul = 1
        for i in range(len(nums)):
            result.append(mul)
            mul *= nums[i]
        mul = 1

        for i in range(len(nums)-1, 0 -1, -1):
            result[i] *= mul
            mul *= nums[i]
                    return result

s = Solution()
print(s.productExceptSelf([1,2,3,4]))
print(s.productExceptSelf([-1,1,0,-3,3]))
print(s.productExceptSelf([0, 0]))
print(s.productExceptSelf([0, 4, 0]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;box-sizing: border-box; border-width: 9px; border-left-style: solid; border-left-color: #C0C0C0; padding: 1px 15px; letter-spacing: 1px; margin: 0px 0px; line-height: 1.2;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 20px; font-family: 'GmarketSansMedium'; font-weight: normal;&quot;&gt;옳지 않은 풀이 &lt;/span&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662474823902&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from typing import List
class Solution:
    def productExceptSelf(self, nums: List[int]) -&amp;gt; List[int]:
        mul = 1
        for num in nums:
            if nums.count(0) &amp;gt; 1:
                mul = 0
            if num != 0:
                mul *= num
            # 전부 0만 들어있는 배열이 들어왔을 때 오류 
            # -&amp;gt; set 으로 처리
            # set(nums) == {0}

            # 0이 2개 이상 들어있는 배열은 ?
            # 항상 값이 0이 된다 
            # if nums.count(0) &amp;gt; 1: 로 위의 질문과 한번에 처리
        for num in nums:
            if 0 in nums:
                if num != 0:
                    result.append(0)
                else:
                    result.append(mul)
            else:
                result.append(mul//num)
        return result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임 아웃이 되어 자기 자신을 제외한 배열을 인덱싱을 사용하여 만들었다&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662474935005&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from typing import List
class Solution:
	def productExceptSelf(self, nums: List[int]) -&amp;gt; List[int]:
        result = []
        for i in range(len(nums)):
            new_nums = nums[:i] + nums[i+1:]
            mul = 1
            for num in new_nums:
                mul *= num
            result.append(mul)
        return result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithm/Leetcode</category>
      <category>238. Product of Array Except Self</category>
      <category>leetcode</category>
      <category>productExceptSelf</category>
      <category>Python</category>
      <author>R.silver</author>
      <guid isPermaLink="true">https://spongerice.tistory.com/163</guid>
      <comments>https://spongerice.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 6 Sep 2022 23:36:59 +0900</pubDate>
    </item>
  </channel>
</rss>