<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>sunghoyaaa</title>
    <link>https://banana-master.tistory.com/</link>
    <description>문의메일 : mail@sunghoyaaa.com</description>
    <language>ko</language>
    <pubDate>Wed, 11 Mar 2026 09:19:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sunghoyaaa</managingEditor>
    <image>
      <title>sunghoyaaa</title>
      <url>https://tistory1.daumcdn.net/tistory/5837851/attach/142ea4cbddd64aed9728b18d9a484785</url>
      <link>https://banana-master.tistory.com</link>
    </image>
    <item>
      <title>RAID: 데이터를 안전하게, 더 빠르게! 저장 장치 활용의 핵심 기술</title>
      <link>https://banana-master.tistory.com/69</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;김성호 (1).png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwuDq/btsPp0KovP4/To3g3FJ6bWcqkYJRq4Oc3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwuDq/btsPp0KovP4/To3g3FJ6bWcqkYJRq4Oc3k/img.png&quot; data-alt=&quot;혼자 공부하는 컴퓨터구조 + 운영체제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwuDq/btsPp0KovP4/To3g3FJ6bWcqkYJRq4Oc3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxwuDq%2FbtsPp0KovP4%2FTo3g3FJ6bWcqkYJRq4Oc3k%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;500&quot; height=&quot;500&quot; data-filename=&quot;김성호 (1).png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 컴퓨터구조 + 운영체제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공컴운) 14기의 3주차 과제를 포함하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RAID란 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID는 'Redundant Array of Independent Disks'의 줄임말로, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;독립적인 여러 개의 디스크를 마치 하나의 큰 디스크처럼 작동&lt;/b&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;b&gt;데이터 안전성 향상&lt;/b&gt;: 디스크 하나가 고장 나더라도 데이터를 보호하고 복구할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 향상&lt;/b&gt;: 여러 디스크가 동시에 작동하여 데이터 읽기/쓰기 속도를 높일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 1TB 하드디스크 4개를 RAID로 구성하면 단순히 4TB 하나의 하드디스크를 사용하는 것보다 훨씬 뛰어난 성능과 안전성을 기대할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다양한 RAID 레벨: 목적에 맞는 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID는 구성 방식에 따라 여러 '레벨'로 나뉘며, 각 레벨마다 장단점이 명확합니다. 주요 RAID 레벨을 살펴보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. RAID 0 (스트라이핑): 속도에 올인!&lt;/h4&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;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 여러 디스크에서 동시에 읽고 쓰기 때문에 &lt;b&gt;압도적인 입출력 속도 향상&lt;/b&gt;을 경험할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 디스크 중 단 하나라도 고장 나면 &lt;b&gt;모든 데이터를 잃을 수 있어 데이터 안전성이 매우 낮습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. RAID 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;b&gt;작동 방식&lt;/b&gt;: 원본 데이터를 다른 디스크에 완벽하게 복사하여 저장합니다. 마치 거울처럼 데이터를 복제한다고 해서 '미러링'이라고 불립니다.&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;b&gt;단점&lt;/b&gt;: 원본과 복사본에 동시에 데이터를 써야 하므로 쓰기 속도가 느릴 수 있으며, 동일한 데이터를 두 번 저장하기 때문에 &lt;b&gt;실제 사용 가능한 용량이 절반으로 줄어들어 비용 효율성이 낮습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. RAID 4: 패리티를 활용한 효율적인 안전성&lt;/h4&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;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: RAID 1보다 적은 디스크로도 데이터를 안전하게 보관할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 패리티 정보를 저장하는 디스크에 모든 쓰기 작업이 집중되어 &lt;b&gt;병목 현상이 발생할 수 있습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. RAID 5: RAID 4의 단점 보완&lt;/h4&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;: RAID 4의 단점인 패리티 디스크의 병목 현상을 해결하기 위해 &lt;b&gt;패리티 정보를 여러 디스크에 분산하여 저장&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: RAID 4보다 효율적이며, 데이터 안전성과 성능의 균형이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. RAID 6: 더욱 강력한 데이터 보호&lt;/h4&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;b&gt;두 가지 종류의 패리티 정보&lt;/b&gt;를 사용하여 오류 검출 및 복구 능력을 한층 강화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: RAID 5보다 &lt;b&gt;데이터 안전성이 더욱 높습니다.&lt;/b&gt; 디스크 두 개가 동시에 고장 나도 데이터를 보호할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 두 종류의 패리티 정보를 써야 하므로 쓰기 속도가 RAID 5보다 느릴 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3주차 숙제&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/50K6A/btsPqQ1hr4o/70m15Zx2M7zyzXUZzkSOSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/50K6A/btsPqQ1hr4o/70m15Zx2M7zyzXUZzkSOSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/50K6A/btsPqQ1hr4o/70m15Zx2M7zyzXUZzkSOSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F50K6A%2FbtsPqQ1hr4o%2F70m15Zx2M7zyzXUZzkSOSk%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;1017&quot; height=&quot;326&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;326&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;</description>
      <category>RAID</category>
      <category>혼공컴운</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/69</guid>
      <comments>https://banana-master.tistory.com/69#entry69comment</comments>
      <pubDate>Sun, 20 Jul 2025 20:35:55 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] 코어와 스레드, 멀티 코어와 멀티 스레드 완벽 이해하기</title>
      <link>https://banana-master.tistory.com/68</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;김성호 (1).png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b92K9b/btsPfuZsC4E/BSrfKX64MlpEn02c5D4uc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b92K9b/btsPfuZsC4E/BSrfKX64MlpEn02c5D4uc0/img.png&quot; data-alt=&quot;혼자 공부하는 컴퓨터구조 + 운영체제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b92K9b/btsPfuZsC4E/BSrfKX64MlpEn02c5D4uc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb92K9b%2FbtsPfuZsC4E%2FBSrfKX64MlpEn02c5D4uc0%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;500&quot; height=&quot;500&quot; data-filename=&quot;김성호 (1).png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 컴퓨터구조 + 운영체제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공컴운) 14기의 2주차 과제를 포함하고 있습니다.&lt;/span&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;코어(Core)란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코어는 CPU 내부에서 실제로 연산을 수행하는 물리적인 처리 단위입니다. 쉽게 말해, 코어는 컴퓨터의 &quot;두뇌&quot;라고 할 수 있습니다. 하나의 코어는 한 번에 하나의 명령어를 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 하나의 CPU에 하나의 코어만 있었지만, 기술이 발전하면서 하나의 CPU 칩 안에 여러 개의 코어를 집적할 수 있게 되었습니다. 이를 멀티 코어 프로세서라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일상생활 비유&lt;/b&gt;: 코어를 요리사라고 생각해보세요. 한 명의 요리사(싱글 코어)는 한 번에 하나의 요리만 만들 수 있지만, 여러 명의 요리사(멀티 코어)가 있으면 동시에 여러 요리를 만들 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스레드(Thread)란?&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;b&gt;일상생활 비유&lt;/b&gt;: 스레드를 요리 레시피라고 생각해보세요. 한 명의 요리사(코어)가 여러 개의 레시피(스레드)를 번갈아가며 실행할 수 있습니다. 파스타를 끓이는 동안 샐러드를 만들고, 샐러드를 만드는 동안 소스를 준비하는 것처럼 말이죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하드웨어 스레드 vs 소프트웨어 스레드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 구분을 해야 합니다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하드웨어 스레드 (Hardware Thread)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 스레드는 물리적 코어가 동시에 처리할 수 있는 명령어 스트림의 개수입니다. 인텔의 하이퍼스레딩(Hyper-threading) 기술이나 AMD의 SMT(Simultaneous Multithreading) 기술을 통해 하나의 물리적 코어가 두 개의 하드웨어 스레드를 지원할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소프트웨어 스레드 (Software Thread)&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;p data-ke-size=&quot;size16&quot;&gt;멀티 코어는 하나의 CPU 칩 안에 여러 개의 물리적 코어가 있는 것을 의미합니다. 현재 대부분의 컴퓨터는 최소 듀얼 코어(2개)부터 시작해서 많게는 수십 개의 코어를 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&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;&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;/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;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;/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;/ul&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;h3 data-ke-size=&quot;size23&quot;&gt;멀티 스레드의 장점&lt;/h3&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;b&gt;경제성&lt;/b&gt;: 새로운 프로세스를 생성하는 것보다 스레드를 생성하는 것이 시스템 자원을 덜 소모합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 스레드 프로그래밍 예시&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// TypeScript에서의 멀티 스레드 예시 (Worker 사용)
class DownloadManager {
    private downloadFile(filename: string): Promise&amp;lt;string&amp;gt; {
        return new Promise((resolve) =&amp;gt; {
            console.log(`다운로드 시작: ${filename}`);

            // 다운로드 시뮬레이션 - 실제로는 네트워크 요청
            setTimeout(() =&amp;gt; {
                console.log(`다운로드 완료: ${filename}`);
                resolve(`${filename} 다운로드 성공`);
            }, 2000);
        });
    }

    // 여러 파일을 동시에 다운로드하는 메서드
    async downloadMultipleFiles(filenames: string[]): Promise&amp;lt;string[]&amp;gt; {
        // Promise.all을 사용하여 모든 다운로드를 동시에 시작
        const downloadPromises = filenames.map(filename =&amp;gt; 
            this.downloadFile(filename)
        );

        // 모든 다운로드가 완료될 때까지 대기
        return await Promise.all(downloadPromises);
    }
}

// 사용 예시
async function main() {
    const downloader = new DownloadManager();
    const files = ['파일1.zip', '파일2.zip', '파일3.zip'];

    try {
        // 모든 파일을 동시에 다운로드 시작
        const results = await downloader.downloadMultipleFiles(files);
        console.log('모든 다운로드 완료:', results);
    } catch (error) {
        console.error('다운로드 중 오류:', error);
    }
}

main();&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코어와 스레드의 관계&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1:1 관계가 아닌 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 착각하는 것 중 하나는 &quot;4코어 CPU는 4개의 스레드만 실행할 수 있다&quot;는 것입니다. 하지만 실제로는 그렇지 않습니다.&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;b&gt;컨텍스트 스위칭&lt;/b&gt;: 스레드 간 전환을 컨텍스트 스위칭이라고 하며, 이 과정에서 CPU 레지스터의 값들이 저장되고 복원됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최적의 스레드 개수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 CPU 집약적인 작업의 경우 &quot;코어 수 = 스레드 수&quot;가 가장 효율적입니다. 하지만 I/O 작업이 많은 경우에는 더 많은 스레드를 사용하는 것이 유리할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 최적 스레드 개수 계산 예시
class ThreadPoolManager {
    private readonly availableProcessors: number;

    constructor() {
        // Node.js에서 사용 가능한 CPU 코어 수 확인
        this.availableProcessors = require('os').cpus().length;
    }

    // CPU 집약적 작업을 위한 스레드 풀 크기
    getCpuIntensiveThreadCount(): number {
        return this.availableProcessors;
    }

    // I/O 집약적 작업을 위한 스레드 풀 크기
    getIoIntensiveThreadCount(): number {
        return this.availableProcessors * 2;
    }

    // 혼합 작업을 위한 적응형 스레드 풀 크기
    getAdaptiveThreadCount(ioRatio: number): number {
        return Math.floor(this.availableProcessors * (1 + ioRatio));
    }
}

// 사용 예시
const threadManager = new ThreadPoolManager();
console.log(`CPU 집약적 작업 스레드 수: ${threadManager.getCpuIntensiveThreadCount()}`);
console.log(`I/O 집약적 작업 스레드 수: ${threadManager.getIoIntensiveThreadCount()}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시성 vs 병렬성&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동시성(Concurrency)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시성은 여러 작업이 논리적으로 동시에 실행되는 것처럼 보이는 것입니다. 싱글 코어 시스템에서도 시분할을 통해 동시성을 구현할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;병렬성(Parallelism)&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;b&gt;핵심 차이점&lt;/b&gt;: 동시성은 &quot;동시에 다루는 것&quot;이고, 병렬성은 &quot;동시에 실행하는 것&quot;입니다.&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. 스레드 안전성 (Thread Safety)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 스레드가 공유 자원에 접근할 때 발생할 수 있는 문제를 방지해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 스레드 안전하지 않은 예시
class UnsafeCounter {
    private count: number = 0;

    // 여러 스레드가 동시에 실행하면 경쟁 조건(race condition) 발생 가능
    increment(): void {
        this.count++; // 읽기 -&amp;gt; 증가 -&amp;gt; 쓰기 과정이 원자적이지 않음
    }

    getCount(): number {
        return this.count;
    }
}

// 스레드 안전한 예시 (뮤텍스 패턴 사용)
class SafeCounter {
    private count: number = 0;
    private mutex: boolean = false; // 간단한 뮤텍스 구현

    // 동기화를 통해 한 번에 하나의 스레드만 접근 가능
    async increment(): Promise&amp;lt;void&amp;gt; {
        // 뮤텍스 획득 대기
        while (this.mutex) {
            await new Promise(resolve =&amp;gt; setTimeout(resolve, 1));
        }

        this.mutex = true; // 뮤텍스 잠금
        try {
            this.count++; // 임계 구역
        } finally {
            this.mutex = false; // 뮤텍스 해제
        }
    }

    getCount(): number {
        return this.count;
    }
}

// 더 현대적인 방법: Promise 기반 큐를 사용한 동기화
class ModernSafeCounter {
    private count: number = 0;
    private operationQueue: Promise&amp;lt;void&amp;gt; = Promise.resolve();

    increment(): Promise&amp;lt;void&amp;gt; {
        // 모든 증가 연산을 순차적으로 실행하도록 큐에 추가
        this.operationQueue = this.operationQueue.then(() =&amp;gt; {
            this.count++;
        });
        return this.operationQueue;
    }

    getCount(): number {
        return this.count;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 데드락 (Deadlock)&lt;/h3&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;b&gt;CPU 바운드 작업&lt;/b&gt;: 코어 수만큼 스레드를 생성하는 것이 최적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;I/O 바운드 작업&lt;/b&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;하이퍼스레딩과 SMT&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔의 하이퍼스레딩과 AMD의 SMT 기술은 하나의 물리적 코어가 두 개의 논리적 코어로 작동하게 합니다. 이를 통해 코어 활용률을 높일 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이기종 멀티 코어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARM의 big.LITTLE 아키텍처처럼 성능 코어와 효율 코어를 결합한 설계가 모바일 기기에서 주목받고 있습니다.&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;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 비동기 프로그래밍 예시
class AsyncTaskManager {
    // 여러 비동기 작업을 동시에 처리
    async processMultipleTasks(): Promise&amp;lt;void&amp;gt; {
        // 각 작업을 비동기적으로 실행
        const task1 = this.processData(&quot;데이터1&quot;);
        const task2 = this.processData(&quot;데이터2&quot;);
        const task3 = this.processData(&quot;데이터3&quot;);

        // 모든 작업이 완료될 때까지 대기
        const results = await Promise.all([task1, task2, task3]);

        console.log('모든 작업 완료:', results);
    }

    // 개별 비동기 작업
    private async processData(data: string): Promise&amp;lt;string&amp;gt; {
        return new Promise((resolve) =&amp;gt; {
            // 비동기 작업 시뮬레이션
            setTimeout(() =&amp;gt; {
                console.log(`${data} 처리 완료`);
                resolve(`${data} 결과`);
            }, Math.random() * 1000);
        });
    }

    // 순차적 처리 vs 병렬 처리 비교
    async sequentialProcessing(items: string[]): Promise&amp;lt;string[]&amp;gt; {
        const results: string[] = [];

        // 순차적 처리 - 각 작업이 끝날 때까지 다음 작업 대기
        for (const item of items) {
            const result = await this.processData(item);
            results.push(result);
        }

        return results;
    }

    async parallelProcessing(items: string[]): Promise&amp;lt;string[]&amp;gt; {
        // 병렬 처리 - 모든 작업을 동시에 시작
        const promises = items.map(item =&amp;gt; this.processData(item));
        return await Promise.all(promises);
    }
}

// Worker를 사용한 진정한 멀티 스레드 구현
class WorkerManager {
    private workerPool: Worker[] = [];
    private taskQueue: Array&amp;lt;{
        data: any;
        resolve: (result: any) =&amp;gt; void;
        reject: (error: Error) =&amp;gt; void;
    }&amp;gt; = [];

    constructor(workerCount: number) {
        // 워커 풀 초기화
        for (let i = 0; i &amp;lt; workerCount; i++) {
            const worker = new Worker('./worker.js');
            worker.onmessage = (event) =&amp;gt; {
                this.handleWorkerMessage(event);
            };
            this.workerPool.push(worker);
        }
    }

    // 작업을 워커에게 할당
    async executeTask(data: any): Promise&amp;lt;any&amp;gt; {
        return new Promise((resolve, reject) =&amp;gt; {
            const availableWorker = this.workerPool.find(w =&amp;gt; !w.busy);

            if (availableWorker) {
                this.assignTaskToWorker(availableWorker, data, resolve, reject);
            } else {
                // 사용 가능한 워커가 없으면 큐에 추가
                this.taskQueue.push({ data, resolve, reject });
            }
        });
    }

    private assignTaskToWorker(
        worker: Worker &amp;amp; { busy?: boolean },
        data: any,
        resolve: (result: any) =&amp;gt; void,
        reject: (error: Error) =&amp;gt; void
    ): void {
        worker.busy = true;
        worker.postMessage(data);

        // 워커 응답 처리 (실제 구현에서는 더 복잡한 메시지 매칭 필요)
        worker.onmessage = (event) =&amp;gt; {
            worker.busy = false;
            resolve(event.data);

            // 큐에 대기 중인 작업이 있으면 할당
            if (this.taskQueue.length &amp;gt; 0) {
                const nextTask = this.taskQueue.shift()!;
                this.assignTaskToWorker(worker, nextTask.data, nextTask.resolve, nextTask.reject);
            }
        };
    }

    private handleWorkerMessage(event: MessageEvent): void {
        // 워커로부터 메시지 처리
        console.log('워커에서 결과 수신:', event.data);
    }
}&lt;/code&gt;&lt;/pre&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;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2주차 숙제&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wh36E/btsPfhTDbG2/Syp9t3NfR2ot1cVABaaiqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wh36E/btsPfhTDbG2/Syp9t3NfR2ot1cVABaaiqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wh36E/btsPfhTDbG2/Syp9t3NfR2ot1cVABaaiqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWh36E%2FbtsPfhTDbG2%2FSyp9t3NfR2ot1cVABaaiqK%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;1183&quot; height=&quot;419&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공학습단/혼공컴운</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/68</guid>
      <comments>https://banana-master.tistory.com/68#entry68comment</comments>
      <pubDate>Sun, 13 Jul 2025 17:29:16 +0900</pubDate>
    </item>
    <item>
      <title>[혼공컴운] 스택(Stack)과 큐(Queue)</title>
      <link>https://banana-master.tistory.com/67</link>
      <description>&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;개념 설명&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;▶ 스택 (Stack)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 스택은 뒤로 넣고 뒤로 금방하는 (Last-In First-Out, &lt;b&gt;LIFO&lt;/b&gt;) 구조.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;복소 가능 작업&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;push&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 인접 값을 스택의 끝에 추가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;pop&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 스택의 끝에서 값 개발 (제거)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;매우 간단하고 다른 자료구 구성의 기원이 되기도 함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;불필요한 값 감지 불가 (LIFO)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;▶ 큐 (Queue)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 큐는 지난시점에 넣고 지나지 않은 순서대로 가지고 가는 (First-In First-Out, &lt;b&gt;FIFO&lt;/b&gt;) 구조.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;복소 가능 작업&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;enqueue&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 값을 큐 끝에 추가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;dequeue&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 큐 첫번째 값 개발 (제거)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;일정 순서대로 값 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;역순서처리 불가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;TypeScript로 스택 구현&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;// 스택 구현
class Stack&amp;lt;T&amp;gt; {
  private items: T[] = [];

  // push: 값을 뒤에 넣기
  push = (item: T): void =&amp;gt; {
    this.items.push(item);
  };

  // pop: 뒤에서 값 개발
  pop = (): T | undefined =&amp;gt; {
    return this.items.pop();
  };

  // peek: 최근 값
  peek = (): T | undefined =&amp;gt; {
    return this.items[this.items.length - 1];
  };

  // isEmpty: 빈 상태 확인
  isEmpty = (): boolean =&amp;gt; {
    return this.items.length === 0;
  };
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;TypeScript로 큐 구현&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;// 큐 구현
class Queue&amp;lt;T&amp;gt; {
  private items: T[] = [];

  // enqueue: 끝에 값 추가
  enqueue = (item: T): void =&amp;gt; {
    this.items.push(item);
  };

  // dequeue: 첫번째 값 개발
  dequeue = (): T | undefined =&amp;gt; {
    return this.items.shift();
  };

  // front: 첫번째 값 확인
  front = (): T | undefined =&amp;gt; {
    return this.items[0];
  };

  // isEmpty: 빈 상태 확인
  isEmpty = (): boolean =&amp;gt; {
    return this.items.length === 0;
  };
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;const stack = new Stack&amp;lt;number&amp;gt;();
stack.push(10);
stack.push(20);
console.log(stack.pop()); // 20

const queue = new Queue&amp;lt;string&amp;gt;();
queue.enqueue(&quot;A&quot;);
queue.enqueue(&quot;B&quot;);
console.log(queue.dequeue()); // &quot;A&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1주차 숙제&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CjCeu/btsO5GlpXuY/HdzePNF1zLI1upSInK8Mek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CjCeu/btsO5GlpXuY/HdzePNF1zLI1upSInK8Mek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CjCeu/btsO5GlpXuY/HdzePNF1zLI1upSInK8Mek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCjCeu%2FbtsO5GlpXuY%2FHdzePNF1zLI1upSInK8Mek%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;1055&quot; height=&quot;329&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공학습단/혼공컴운</category>
      <category>스택</category>
      <category>큐</category>
      <category>혼공컴운</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/67</guid>
      <comments>https://banana-master.tistory.com/67#entry67comment</comments>
      <pubDate>Sun, 6 Jul 2025 15:56:46 +0900</pubDate>
    </item>
    <item>
      <title>[혼공파] Beautiful Soup &amp;amp; Flask 로  기상청 날씨 정보 훔치기</title>
      <link>https://banana-master.tistory.com/66</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;1749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mxp6T/btsMt6lvPtR/r7AZko6oN7VvsyfGWK4aT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mxp6T/btsMt6lvPtR/r7AZko6oN7VvsyfGWK4aT1/img.jpg&quot; data-alt=&quot;혼자 공부하는 파이썬 (개정판)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mxp6T/btsMt6lvPtR/r7AZko6oN7VvsyfGWK4aT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmxp6T%2FbtsMt6lvPtR%2Fr7AZko6oN7VvsyfGWK4aT1%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;247&quot; height=&quot;338&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 파이썬 (개정판)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공파) 13기의 6주차 과제를 포함하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Flask와 BeautifulSoup 간단 소개&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Flask&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;는 가벼운 웹 프레임워크로&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;간단한 웹 애플리케이션을 빠르게 개발할 수 있는 도구&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;BeautifulSoup&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;은 HTML/XML을 파싱하여&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;웹 크롤링을 쉽게 할 수 있도록 도와주는 라이브러리&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740317901322&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

class WeatherScraper:
  &quot;&quot;&quot;기상청 날씨 데이터를 가져와 처리하는 클래스&quot;&quot;&quot;

  def __init__(self, url: str):
    &quot;&quot;&quot;생성자: 가져올 URL을 설정&quot;&quot;&quot;
    self.url = url
    self.soup = None

  def fetch_weather_data(self):
    &quot;&quot;&quot;웹에서 데이터를 가져와 BeautifulSoup으로 분석&quot;&quot;&quot;
    response = request.urlopen(self.url)
    self.soup = BeautifulSoup(response, &quot;html.parser&quot;)

  # 파일로 저장하는 이유는 디버그 용도
  # print()함수로 사용해서 확인하니까 너무 길어서 짤림...
  def save_to_file(self, filename: str = &quot;result.html&quot;):
    &quot;&quot;&quot;파싱된 데이터를 파일로 저장&quot;&quot;&quot;
    if self.soup:
      with open(filename, &quot;w&quot;, encoding=&quot;utf-8&quot;) as file:
        file.write(str(self.soup))

  def parse_weather(self) -&amp;gt; str:
    &quot;&quot;&quot;HTML 문서 전체를 생성하여 반환&quot;&quot;&quot;

    if not self.soup:
      return &quot;&amp;lt;p&amp;gt;날씨 데이터를 불러오지 못했습니다.&amp;lt;/p&amp;gt;&quot;

    output = &quot;&quot;&quot;
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
      &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
      &amp;lt;title&amp;gt;[혼공파] - 6주차 과제&amp;lt;/title&amp;gt;
      &amp;lt;style&amp;gt;
        body { font-family: Arial, sans-serif; margin: 20px; }
        h1 { color: darkblue; }
        h3 { color: darkred; }
        hr { border: 0; height: 1px; background: gray; margin: 10px 0; }
      &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
      &amp;lt;h1&amp;gt;[혼공파] 6주차 마지막 과제&amp;lt;/h1&amp;gt;
    &quot;&quot;&quot;

    # header 태그 가져오기 (존재하면 출력)
    header_tag = self.soup.select(&quot;header&quot;)
    # html이니까 br 태그로 줄 바꿈 해주기
    # select는 return 타입이 array임
    header_text = &quot;&amp;lt;br /&amp;gt;&quot;.join([tag.get_text(strip=True) for tag in header_tag]) if header_tag else &quot;헤더 정보 없음&quot;

    output += f&quot;&amp;lt;strong&amp;gt;{header_text}&amp;lt;/strong&amp;gt;&amp;lt;hr/&amp;gt;&quot;

    # 지역별 날씨 정보 추가
    # location 별로 나눠져 있음
    for location in self.soup.select(&quot;location&quot;):
      city = location.select_one(&quot;city&quot;).string
      weather = location.select_one(&quot;wf&quot;).string
      min_temp = location.select_one(&quot;tmn&quot;).string
      max_temp = location.select_one(&quot;tmx&quot;).string

      output += f&quot;&amp;lt;h3&amp;gt;{city}&amp;lt;/h3&amp;gt;&quot;
      output += f&quot;&amp;lt;p&amp;gt;날씨: {weather}&amp;lt;/p&amp;gt;&quot;
      output += f&quot;&amp;lt;p&amp;gt;최저/최고 기온: {min_temp}/{max_temp}&amp;lt;/p&amp;gt;&quot;
      output += &quot;&amp;lt;hr /&amp;gt;&quot;

    # HTML 마무으리
    output += &quot;&quot;&quot;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
    &quot;&quot;&quot;

    return output

# Flask 웹 서버 생성
app = Flask(__name__)

# 루트 경로로 실행
@app.route(&quot;/&quot;)
def hello():
  &quot;&quot;&quot;Flask 라우트에서 WeatherScraper(클래스)를 활용하여 HTML 반환&quot;&quot;&quot;
  scraper = WeatherScraper(&quot;http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108&quot;)
  scraper.fetch_weather_data()
  scraper.save_to_file()  # result.html 파일 저장
  return scraper.parse_weather()  # HTML 문서 전체 반환&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;beautiful_flask.py&lt;/b&gt; 와 다른 점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot; data-end=&quot;3830&quot; data-start=&quot;3769&quot;&gt;WeatherScraper&lt;span&gt;&amp;nbsp;&lt;/span&gt;클래스를 사용하여 데이터를 가져오고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파싱하는 기능을 모듈화&lt;/b&gt;했습니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot; data-end=&quot;3915&quot; data-start=&quot;3831&quot;&gt;지역, 날씨, 최저/최고 기온 데이터 외에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTML&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;head&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;RSS에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;header&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터를 포함&lt;/b&gt;했습니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot; data-end=&quot;3985&quot; data-start=&quot;3916&quot;&gt;print()를 사용해서 데이터를 확인하려 했지만, 응답 컨텐츠가 너무 길어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파일로 저장하여 디버깅&lt;/b&gt;했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1740318804618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export FLASK_APP=&amp;lt;파일명&amp;gt;.py # ./beautiful_soup
flask run
http://127.0.0.1:5000&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-23 오후 10.56.29.png&quot; data-origin-width=&quot;3354&quot; data-origin-height=&quot;1852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzoQj3/btsMt8KmA93/WTtvDhaY2sKK9BvzLfJkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzoQj3/btsMt8KmA93/WTtvDhaY2sKK9BvzLfJkkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzoQj3/btsMt8KmA93/WTtvDhaY2sKK9BvzLfJkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzoQj3%2FbtsMt8KmA93%2FWTtvDhaY2sKK9BvzLfJkkk%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;3354&quot; height=&quot;1852&quot; data-filename=&quot;스크린샷 2025-02-23 오후 10.56.29.png&quot; data-origin-width=&quot;3354&quot; data-origin-height=&quot;1852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공학습단/혼공파</category>
      <category>파이썬</category>
      <category>혼공파</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/66</guid>
      <comments>https://banana-master.tistory.com/66#entry66comment</comments>
      <pubDate>Sun, 23 Feb 2025 23:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[혼공파] 파이썬 구문 오류(SyntaxError)와 예외(Exception)의 차이점</title>
      <link>https://banana-master.tistory.com/65</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;1749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K3VG8/btsMlo0A5qN/2czfUIK0FKMQ1qcidJPXK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K3VG8/btsMlo0A5qN/2czfUIK0FKMQ1qcidJPXK1/img.jpg&quot; data-alt=&quot;혼자 공부하는 파이썬 (개정판)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K3VG8/btsMlo0A5qN/2czfUIK0FKMQ1qcidJPXK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK3VG8%2FbtsMlo0A5qN%2F2czfUIK0FKMQ1qcidJPXK1%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;247&quot; height=&quot;338&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 파이썬 (개정판)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공파) 13기의 5주차 과제를 포함하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 언어로든 프로그래밍을 하다 보면 구문 &lt;b&gt;오류(SyntaxError)&lt;/b&gt;와 &lt;b&gt;예외(Exception)&lt;/b&gt;를 자주 만나게 됩니다. 이 둘은 모두 코드 실행을 멈추게 만들지만, 발생 원인과 처리 방식이 다릅니다. 이번 글에서는 &lt;b&gt;구문 오류&lt;/b&gt;와 &lt;b&gt;예외&lt;/b&gt;의 차이를 이해하고, 이를 효과적으로 처리하는 방법을 살펴보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 구문 오류(SyntaxError)란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구문 오류(SyntaxError)&lt;/b&gt;는 코드가 문법적으로 올바르지 않을 때 발생하는 오류입니다. 파이썬 인터프리터는 실행 전에 &lt;b&gt;구문 분석(parsing) 과정&lt;/b&gt;을 거치는데, 이때 문법에 맞지 않는 코드가 발견되면 SyntaxError가 발생하며 실행이 중단됩니다. 주로 IDE의 코드 빨간줄인 경우 구문 오류 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;SyntaxError: 문법 오류&lt;/li&gt;
&lt;li&gt;IndentationError: 들여쓰기 오류&lt;/li&gt;
&lt;li&gt;TabError: 탭과 공백 혼용 오류&lt;/li&gt;
&lt;li&gt;EOL while scanning string literal: 문자열 리터럴이 닫히지 않았을 때 발생&lt;/li&gt;
&lt;li&gt;Unexpected character after line continuation character: 줄바꿈 문자(\) 이후 잘못된 문자가 올 때 발생&lt;/li&gt;
&lt;li&gt;Invalid syntax: 잘못된 문법 구조 사용 시 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 예외(Exception)란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예외(Exception)&lt;/b&gt;는 코드가 문법적으로는 올바르지만, 실행 도중 발생하는 오류입니다. 예를 들어, 0으로 나누거나 존재하지 않는 파일을 열려고 하면 예외가 발생합니다. 하지만 예외는 try-except 문을 사용해 적절히 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;ZeroDivisionError: 0으로 나누기 오류&lt;/li&gt;
&lt;li&gt;FileNotFoundError: 존재하지 않는 파일을 열려 할 때 발생&lt;/li&gt;
&lt;li&gt;TypeError: 잘못된 타입의 연산 수행&lt;/li&gt;
&lt;li&gt;ValueError: 부적절한 값을 함수에 전달했을 때 발생&lt;/li&gt;
&lt;li&gt;IndexError: 리스트 또는 튜플의 범위를 초과했을 때 발생&lt;/li&gt;
&lt;li&gt;KeyError: 딕셔너리에 존재하지 않는 키를 참조할 때 발생&lt;/li&gt;
&lt;li&gt;AttributeError: 존재하지 않는 속성을 접근하려 할 때 발생&lt;/li&gt;
&lt;li&gt;NameError: 정의되지 않은 변수를 참조했을 때 발생&lt;/li&gt;
&lt;li&gt;ImportError: 모듈 임포트 실패&lt;/li&gt;
&lt;li&gt;RuntimeError: 일반적인 실행 중 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 구문 오류와 예외의 주요 차이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구분 구문 오류(SyntaxError) 예외(Exception)&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;코드 실행 중(runtime)&lt;/td&gt;
&lt;/tr&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;print(&quot;Hello&quot; (괄호 누락)&lt;/td&gt;
&lt;td&gt;10 / 0 (0으로 나누기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;처리 가능 여부&lt;/td&gt;
&lt;td&gt;try-except로 처리 불가능&lt;/td&gt;
&lt;td&gt;try-except로 처리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 예시&lt;/h3&gt;
&lt;pre id=&quot;code_1739705669310&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SyntaxError 예제
# 문법적으로 잘못된 코드 예시 (괄호 닫기 누락)
# 이 코드는 실행 자체가 되지 않음
# print(&quot;Hello&quot;  

# 올바른 예제
print(&quot;Hello&quot;)  # 정상 실행

# 예외(Exception) 예제
# 실행 중 발생하는 오류는 try-except로 처리 가능
try:
    result = 10 / 0  # ZeroDivisionError 발생
except ZeroDivisionError as e:
    print(f&quot;예외 발생: {e}&quot;)

try:
    numbers = [1, 2, 3]
    print(numbers[5])  # IndexError 발생 (범위를 초과한 인덱스 접근)
except IndexError as e:
    print(f&quot;예외 발생: {e}&quot;)

try:
    value = int(&quot;hello&quot;)  # ValueError 발생 (문자열을 숫자로 변환 실패)
except ValueError as e:
    print(f&quot;예외 발생: {e}&quot;)
    
try:
    x = int(&quot;hello&quot;)  # ValueError 발생
except Exception as e:  # 모든 예외를 처리하는 기본 예외 클래스
    print(f&quot;예외 발생: {e}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;59&quot; data-start=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;예외 처리는 크게 두 가지 방식으로 접근할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;250&quot; data-start=&quot;60&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;152&quot; data-start=&quot;60&quot;&gt;&lt;b&gt;구체적인 예외를 명시적으로 처리하는 방법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;152&quot; data-start=&quot;95&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;130&quot; data-start=&quot;95&quot;&gt;특정 예외를 따로 처리하여 원인을 명확하게 파악할 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;152&quot; data-start=&quot;134&quot;&gt;예외별로 다른 대응이 가능함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;250&quot; data-start=&quot;154&quot;&gt;&lt;b&gt;Exception을 사용해 한 번에 처리하는 방법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;250&quot; data-start=&quot;196&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;224&quot; data-start=&quot;196&quot;&gt;다양한 예외를 일괄적으로 잡아 코드가 간결해짐.&lt;/li&gt;
&lt;li data-end=&quot;250&quot; data-start=&quot;228&quot;&gt;예상치 못한 예외도 처리할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;406&quot; data-start=&quot;252&quot; data-ke-size=&quot;size16&quot;&gt;이러한 구조는 &lt;b&gt;if, elif, else 문법과 비슷하게 이해할 수 있습니다.&lt;/b&gt;&lt;br /&gt;즉, &lt;b&gt;명시적으로 예외를 처리하고 (if, elif) 마지막에 Exception을 설정해 두면 (else) 예상치 못한 예외 상황을 대비할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 &lt;b&gt;구문 오류(SyntaxError)&lt;/b&gt;는 코드 실행 전에 문법적으로 잘못되었을 때 발생하며, try-except로 처리할 수 없습니다. 반면, &lt;b&gt;예외(Exception)&lt;/b&gt;는 실행 중 발생하는 오류이며, try-except를 사용해 적절히 처리할 수 있습니다.&lt;/p&gt;</description>
      <category>혼공학습단/혼공파</category>
      <category>파이썬</category>
      <category>혼공파</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/65</guid>
      <comments>https://banana-master.tistory.com/65#entry65comment</comments>
      <pubDate>Sun, 16 Feb 2025 20:42:25 +0900</pubDate>
    </item>
    <item>
      <title>[혼공파] Python의 매개변수와 기본 매개변수, 가변 매개변수 이해하기</title>
      <link>https://banana-master.tistory.com/64</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;1749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vQZox/btsMa5aFLtP/EAOiLKkf1biEkGkJPO9rE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQZox/btsMa5aFLtP/EAOiLKkf1biEkGkJPO9rE0/img.jpg&quot; data-alt=&quot;혼자 공부하는 파이썬 (개정판)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQZox/btsMa5aFLtP/EAOiLKkf1biEkGkJPO9rE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQZox%2FbtsMa5aFLtP%2FEAOiLKkf1biEkGkJPO9rE0%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;247&quot; height=&quot;338&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 파이썬 (개정판)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공파) 13기의 4주차 과제를 포함하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python에서는 함수를 정의할 때 매개변수를 활용하여 다양한 방식으로 값을 전달할 수 있습니다. 본 글에서는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;일반 매개변수, 기본 매개변수, 가변 매개변수&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에 대해 알아보고 각각의 예제와 함께 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. 매개변수 (Parameters)란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;매개변수는 함수를 정의할 때 함수가 외부에서 값을 받을 수 있도록 설정하는 변수입니다. 함수를 호출할 때 매개변수에 값을 전달하면 함수 내부에서 해당 값을 활용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 두 수를 더하는 함수 정의
def add(a, b):
    return a + b

# 함수 호출
result = add(3, 5)
print(result)  # 출력: 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 코드에서 &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;는 매개변수이며, 함수가 호출될 때 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;과 &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;가 각각 &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;에 전달됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. 기본 매개변수 (Default Parameters)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 매개변수란 특정 인자를 전달하지 않았을 때 기본값을 사용할 수 있도록 설정된 매개변수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 기본값을 가지는 함수 정의
def greet(name=&quot;Minions&quot;):
    print(f&quot;Hello, {name}!&quot;)

# 매개변수 값을 전달하는 경우
greet(&quot;Bob&quot;)  # 출력: Hello, Bob!

# 매개변수를 전달하지 않는 경우
greet()  # 출력: Hello, Minions!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 코드에서 &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt; 매개변수의 기본값을 &quot;Minions&quot;로 설정하여 인자를 전달하지 않아도 기본적으로 &quot;Minions&quot;가 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. 가변 매개변수 (*args, **kwargs)&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.1 가변 위치 매개변수 (*args)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;*args&lt;/span&gt;&lt;span&gt;는 여러 개의 위치 인자를 받을 수 있도록 하는 매개변수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 여러 개의 숫자를 더하는 함수
def add_all(*args):
    return sum(args)

print(add_all(1, 2, 3))  # 출력: 6
print(add_all(4, 5, 6, 7, 8))  # 출력: 30&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;*args&lt;/span&gt;&lt;span&gt;는 튜플 형태로 여러 개의 인자를 받아 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.2 가변 키워드 매개변수 (**kwargs)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;**kwargs&lt;/span&gt;&lt;span&gt;는 여러 개의 키워드 인자를 받을 수 있도록 하는 매개변수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 사용자 정보를 출력하는 함수
def user_info(**kwargs):
    for key, value in kwargs.items():
        print(f&quot;{key}: {value}&quot;)

user_info(name=&quot;Minions&quot;, eat=&quot;Banana&quot;, color=&quot;Yellow&quot;)

# 결과
# name: Minions
# eat: Banana
# color: Yellow&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;span&gt;**kwargs&lt;/span&gt;&lt;span&gt;는 딕셔너리 형태로 여러 개의 키워드 인자를 받아 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. 매개변수 조합하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python에서는 일반 매개변수, 기본 매개변수, 가변 매개변수를 조합하여 사용할 수 있습니다. 하지만 올바른 순서로 정의해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 다양한 매개변수를 조합한 함수
def custom_function(a, b=10, *args, **kwargs):
    print(f&quot;a: {a}&quot;)
    print(f&quot;b: {b}&quot;)
    print(f&quot;args: {args}&quot;)
    print(f&quot;kwargs: {kwargs}&quot;)

custom_function(5, 20, 1, 2, 3, name=&quot;Minions&quot;, age=28)

# 결과
# a: 5
# b: 20
# args: (1, 2, 3)
# kwargs: {'name': 'Minions', 'age': 28}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 코드에서는 위치 인자, 기본 인자, 가변 위치 인자, 가변 키워드 인자를 모두 사용할 수 있도록 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;여기서부터는 혼공파의 4주차 과제입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: left;&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;. 287 &lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;[직접 해보는 손코딩&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;: 범위 내부의 정수를 모두 더하는 함수&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;] 실행 후 코드가 입력된 화면 및 실행 결과 화면 캡처하기&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739098656501&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 함수를 선언합니다.
def sum_all(start, end):
    # 변수를 선언합니다.
    output = 0
    # 반복문을 돌려 숫자를 더합니다.
    for i in range(start, end + 1):
        output += i
    # 리턴합니다.
    return output
    

# 함수를 호출합니다.
print(&quot;0 to 100:&quot;, sum_all(0, 100))
print(&quot;0 to 1000&quot;, sum_all(0, 1000))
print(&quot;50 to 100:&quot;, sum_all(50, 100))
print(&quot;500 to 1000:&quot;, sum_all(500, 1000))&lt;/code&gt;&lt;/pre&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oVlJ1/btsMaTnWr6U/pvcRAinNPcaKLnG0aZ1ivK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oVlJ1/btsMaTnWr6U/pvcRAinNPcaKLnG0aZ1ivK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oVlJ1/btsMaTnWr6U/pvcRAinNPcaKLnG0aZ1ivK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoVlJ1%2FbtsMaTnWr6U%2FpvcRAinNPcaKLnG0aZ1ivK%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;403&quot; height=&quot;238&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>혼공학습단/혼공파</category>
      <category>파이썬</category>
      <category>혼공파</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/64</guid>
      <comments>https://banana-master.tistory.com/64#entry64comment</comments>
      <pubDate>Sun, 9 Feb 2025 20:04:06 +0900</pubDate>
    </item>
    <item>
      <title>[혼공파] Python 자료형: 리스트, 딕셔너리, 범위형 자료형</title>
      <link>https://banana-master.tistory.com/63</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;1749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2kZRJ/btsL2aWeDmr/6VbdkcUb5Jf0XvUE8Y1O30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2kZRJ/btsL2aWeDmr/6VbdkcUb5Jf0XvUE8Y1O30/img.jpg&quot; data-alt=&quot;혼자 공부하는 파이썬 (개정판)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2kZRJ/btsL2aWeDmr/6VbdkcUb5Jf0XvUE8Y1O30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2kZRJ%2FbtsL2aWeDmr%2F6VbdkcUb5Jf0XvUE8Y1O30%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;247&quot; height=&quot;338&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 파이썬 (개정판)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공파) 13기의 3주차 과제를 포함하고있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python은 다양한 데이터를 다루기 위한 강력한 자료형을 제공합니다. 이 글에서는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;리스트(List)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;b&gt;딕셔너리(Dictionary)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, 그리고 &lt;/span&gt;&lt;span&gt;&lt;b&gt;범위형(Range)&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 자료형의 특징과 사용법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1. 리스트 (List)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리스트는 순서가 있는 값들의 모음으로, 대괄호(&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt;)로 정의됩니다. Python의 리스트는 변경 가능(mutable)하며, 다양한 자료형의 값을 함께 담을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;주요 특징&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;순서가 있음&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 리스트는 순서를 유지하며, 인덱스를 통해 값에 접근할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;가변성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 값을 추가, 삭제, 수정할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;다양한 자료형 혼합 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 정수, 문자열, 리스트 등 다양한 자료형을 한 리스트에 담을 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;리스트 생성&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리스트를 생성하는 방법은 간단하며, 빈 리스트부터 초기값이 있는 리스트까지 다양하게 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 빈 리스트 생성
minions = []

# 초기 값이 있는 리스트 생성
minions_names = [&quot;Kevin&quot;, &quot;Stuart&quot;, &quot;Bob&quot;]
mixed = [&quot;Banana&quot;, 42, [&quot;Gru&quot;, &quot;Dr.Nefario&quot;]]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;주요 메서드와 예시&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리스트의 조작 방법은 다양하며, 데이터를 효율적으로 처리할 수 있도록 도와줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;# 값 추가
minions_names.append(&quot;Dave&quot;)  # [&quot;Kevin&quot;, &quot;Stuart&quot;, &quot;Bob&quot;, &quot;Dave&quot;]

# 값 삽입
minions_names.insert(1, &quot;Jerry&quot;)  # [&quot;Kevin&quot;, &quot;Jerry&quot;, &quot;Stuart&quot;, &quot;Bob&quot;, &quot;Dave&quot;]

# 값 삭제
minions_names.remove(&quot;Jerry&quot;)  # [&quot;Kevin&quot;, &quot;Stuart&quot;, &quot;Bob&quot;, &quot;Dave&quot;]

# 정렬
minions_names.sort()  # 오름차순 정렬
minions_names.sort(reverse=True)  # 내림차순 정렬

# 리스트 컴프리헨션
uppercase_names = [name.upper() for name in minions_names]  # [&quot;KEVIN&quot;, &quot;STUART&quot;, &quot;BOB&quot;, &quot;DAVE&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리스트 컴프리헨션은 반복문과 조건문을 활용해 간결하게 리스트를 생성할 수 있는 강력한 도구입니다. 예를 들어, 리스트의 모든 값을 대문자로 변환하는 작업을 한 줄로 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. 딕셔너리 (Dictionary)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딕셔너리는 키-값(key-value) 쌍의 모음으로, 중괄호(&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;)를 사용하여 정의됩니다. 키를 통해 값을 빠르게 조회할 수 있는 자료형입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;주요 특징&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;키(Key)는 고유해야 함&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 중복된 키는 허용되지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;값(Value)는 중복 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 값에는 어떤 자료형이든 올 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;순서 유지&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: Python 3.7부터 삽입 순서가 유지됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;딕셔너리 생성&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딕셔너리는 구조화된 데이터를 저장하는 데 유용합니다. 키를 사용하여 데이터를 효율적으로 관리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# 빈 딕셔너리 생성
minion_profile = {}

# 초기 값이 있는 딕셔너리 생성
minion_profile = {
    &quot;name&quot;: &quot;Kevin&quot;,
    &quot;age&quot;: 7,
    &quot;hobbies&quot;: [&quot;dancing&quot;, &quot;eating bananas&quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;주요 메서드와 예시&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딕셔너리는 키-값 쌍을 조작할 수 있는 다양한 메서드를 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# 값 추가 및 수정
minion_profile[&quot;city&quot;] = &quot;Minionville&quot;
minion_profile[&quot;age&quot;] = 8

# 값 삭제
minion_profile.pop(&quot;city&quot;)  # {&quot;name&quot;: &quot;Kevin&quot;, &quot;age&quot;: 8, &quot;hobbies&quot;: [&quot;dancing&quot;, &quot;eating bananas&quot;]}

# 키와 값 조회
keys = minion_profile.keys()  # dict_keys(['name', 'age', 'hobbies'])
values = minion_profile.values()  # dict_values(['Kevin', 8, ['dancing', 'eating bananas']])
items = minion_profile.items()  # dict_items([('name', 'Kevin'), ('age', 8), ('hobbies', ['dancing', 'eating bananas'])])

# 딕셔너리 컴프리헨션
hobby_lengths = {key: len(value) if isinstance(value, list) else len(str(value)) for key, value in minion_profile.items()}  # {'name': 5, 'age': 1, 'hobbies': 2}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딕셔너리 컴프리헨션을 사용하면 조건에 따라 값을 동적으로 변환하거나 필터링할 수 있습니다. 위 예제에서는 각 키의 값의 길이를 계산해 새로운 딕셔너리를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. 범위형 (Range)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;는 주로 반복문에서 사용되는 자료형으로, 특정 범위의 숫자 시퀀스를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;주요 특징&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;순차적인 정수 생성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 시작 값부터 종료 값 직전까지 정수를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;메모리 효율성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 실제로 값을 저장하지 않고, 필요할 때 값을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;불변성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 생성된 &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt; 객체는 변경할 수 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;범위형 생성&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;범위형은 반복 작업이나 간격 계산에 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 기본 사용법
minion_ids = range(5)  # 0부터 4까지

# 시작과 종료값 지정
special_minion_ids = range(1, 6)  # 1부터 5까지

# 간격 지정
even_minion_ids = range(0, 10, 2)  # 0, 2, 4, 6, 8&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;범위형 활용&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;반복문과 결합하거나 특정 조건을 기반으로 범위형을 조작할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 리스트로 변환
list_minion_ids = list(minion_ids)  # [0, 1, 2, 3, 4]

# 반복문에서 사용
for id in special_minion_ids:
    print(f&quot;Minion ID: {id}&quot;)  # Minion ID: 1, 2, 3, 4, 5

# 필터링과 결합
filtered_ids = [id for id in even_minion_ids if id % 4 == 0]  # [0, 4, 8]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;메모리 효율적인 &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt; 객체는 리스트 변환 없이도 반복문에서 사용할 수 있습니다. 필요에 따라 리스트로 변환하거나 조건을 적용해 특정 값을 필터링할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4. 리스트, 딕셔너리, 범위형 비교&lt;/span&gt;&lt;/h3&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;span&gt;&lt;b&gt;리스트&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;순서 있음, 가변적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;값 목록 저장 및 조작&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;딕셔너리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;키-값 쌍, 순서 있음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;구조화된 데이터 저장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;범위형&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;정수 시퀀스 생성, 불변적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;반복문 및 간격 계산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;결론&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python의 리스트, 딕셔너리, 그리고 범위형 자료형은 데이터를 저장하고 조작하는 데 매우 유용한 도구입니다. 각각의 자료형은 고유한 장점과 특징을 가지며, 적재적소에 활용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>혼공학습단/혼공파</category>
      <category>파이썬</category>
      <category>혼공파</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/63</guid>
      <comments>https://banana-master.tistory.com/63#entry63comment</comments>
      <pubDate>Sat, 25 Jan 2025 23:00:12 +0900</pubDate>
    </item>
    <item>
      <title>[혼공파] 띠 계산 프로그램: 세 가지 구현 방식 비교</title>
      <link>https://banana-master.tistory.com/62</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;1749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMm2LY/btsLQ5oLfNA/f2TG1ugYbccrEOmnoL63EK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMm2LY/btsLQ5oLfNA/f2TG1ugYbccrEOmnoL63EK/img.jpg&quot; data-alt=&quot;혼자 공부하는 파이썬 (개정판)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMm2LY/btsLQ5oLfNA/f2TG1ugYbccrEOmnoL63EK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMm2LY%2FbtsLQ5oLfNA%2Ff2TG1ugYbccrEOmnoL63EK%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;247&quot; height=&quot;338&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 파이썬 (개정판)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공파) 13기의 2주차 과제를 포함하고있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. if - elif &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;문을 활용한 구현&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736986916598&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str_input = input(&quot;태어난 해를 입력해주세요&amp;gt; &quot;)
birth_year = int(str_input)

if birth_year % 12 == 0:
    print('원숭이 띠입니다.')
elif birth_year % 12 == 1:
    print('닭 띠입니다.')
elif birth_year % 12 == 2:
    print('개 띠입니다.')
elif birth_year % 12 == 3:
    print('돼지 띠입니다.')
elif birth_year % 12 == 4:
    print('쥐 띠입니다.')
elif birth_year % 12 == 5:
    print('소 띠입니다.')
elif birth_year % 12 == 6:
    print('호랑이 띠입니다.')
elif birth_year % 12 == 7:
    print('토끼 띠입니다.')
elif birth_year % 12 == 8:
    print('용 띠입니다.')
elif birth_year % 12 == 9:
    print('뱀 띠입니다.')
elif birth_year % 12 == 10:
    print('말 띠입니다.')
elif birth_year % 12 == 11:
    print('양 띠입니다.')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;br /&gt;if-elif&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조는 조건을 순차적으로 평가하며, 첫 번째로&lt;span&gt;&amp;nbsp;&lt;/span&gt;True가 되는 조건을 실행합니다. 조건의 흐름이 명확하여 로직을 이해하고 수정하기 쉽습니다.&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; 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;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; 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;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;리스트를 활용한 구현&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736986991012&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str_input = input(&quot;태어난 해를 입력해주세요&amp;gt; &quot;)
birth_year = int(str_input)

animals = [
    '원숭이', '닭', '개', '돼지', 
    '쥐', '소', '범', '토끼', 
    '용', '뱀', '말', '양'
]

animal = animals[birth_year % 12]
print(f'{animal} 띠입니다.')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;br /&gt;리스트를 사용하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;태어난 해 % 12&lt;span&gt;&amp;nbsp;&lt;/span&gt;값을 인덱스로 활용하여 동물 이름을 바로 조회할 수 있습니다. 조건문을 반복적으로 작성하지 않아도 되므로 코드가 간결하고 효율적입니다.&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; 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;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; 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;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;딕셔너리를 활용한 구현&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736987069761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str_input = input(&quot;태어난 해를 입력해주세요&amp;gt; &quot;)
birth_year = int(str_input)

animal_dict = {
    0: '원숭이',
    1: '닭',
    2: '개',
    3: '돼지',
    4: '쥐',
    5: '소',
    6: '범',
    7: '토끼',
    8: '용',
    9: '뱀',
    10: '말',
    11: '양'
}

animal = animal_dict[birth_year % 12]
print(f'{animal} 띠입니다.')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;br /&gt;딕셔너리는 키-값 쌍으로 구성된 자료구조로, 특정 키에 해당하는 값을 빠르게 검색할 수 있습니다. 조건과 결과가 명확히 매핑되어야 하는 경우 딕셔너리를 사용하면 효율적입니다.&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; 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;/ul&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 초기화가 필요하며, 조건이 동적이거나 복잡한 경우에는 적합하지 않을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;4. 세 가지 방식 비교&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;if-elif&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;단순하고 직관적&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;조건이 많아질수록 코드 길이가 길어지고 유지보수가 어려울 수 있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;리스트&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;간결하고 규칙적인 조건 처리에 적합&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;연속적이지 않은 조건을 처리하기에는 부적합, 범위 초과 주의 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;딕셔너리&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;조건과 결과를 명확히 매핑할 수 있고 확장성이 높음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;초기 데이터 구성 필요, 동적 조건 처리에 적합하지 않음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;5. 어떤 방법을 선택할까?&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b&gt;if-elif&lt;/b&gt;: 조건이 적고 논리적인 흐름을 순차적으로 표현해야 하는 경우.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b&gt;리스트&lt;/b&gt;: 조건이 숫자 인덱스를 기반으로 규칙적이고 간단한 경우.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b&gt;딕셔너리&lt;/b&gt;: 조건과 결과가 명확히 매핑되는 경우. 특히 대량의 데이터 검색이 필요한 경우.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>혼공학습단/혼공파</category>
      <category>Python</category>
      <category>파이썬</category>
      <category>혼공파</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/62</guid>
      <comments>https://banana-master.tistory.com/62#entry62comment</comments>
      <pubDate>Sun, 19 Jan 2025 14:43:16 +0900</pubDate>
    </item>
    <item>
      <title>[혼공파] print 함수 톺아보기</title>
      <link>https://banana-master.tistory.com/61</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;1749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE1dsk/btsLFKYX8Cj/UzACybCCqhjV1D9hNaxrCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE1dsk/btsLFKYX8Cj/UzACybCCqhjV1D9hNaxrCK/img.jpg&quot; data-alt=&quot;혼자 공부하는 파이썬 (개정판)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE1dsk/btsLFKYX8Cj/UzACybCCqhjV1D9hNaxrCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE1dsk%2FbtsLFKYX8Cj%2FUzACybCCqhjV1D9hNaxrCK%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;247&quot; height=&quot;338&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;혼자 공부하는 파이썬 (개정판)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 게시글은 혼공학습단(혼공파) 13기의 1주차 과제를 포함하고있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&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;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;print()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수의 기본 사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;print()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수는 값을 출력하기 위해 사용됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736289776178&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;안녕하세요, Python!&quot;) # 출력: 안녕하세요, Python!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;쉼표로&amp;nbsp;여러&amp;nbsp;값을&amp;nbsp;구분하여&amp;nbsp;출력할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736289789677&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;이름:&quot;, &quot;성호&quot;, &quot;나이:&quot;, 25) # 출력: 이름: 성호 나이: 25&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;print()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수의 파라미터&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736290916922&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;help(print)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736290906606&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Help on built-in function print in module builtins:

print(*args, sep=' ', end='\n', file=None, flush=False)
    Prints the values to a stream, or to sys.stdout by default.

    sep
      string inserted between values, default a space.
    end
      string appended after the last value, default a newline.
    file
      a file-like object (stream); defaults to the current sys.stdout.
    flush
      whether to forcibly flush the stream.&lt;/code&gt;&lt;/pre&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;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 style=&quot;color: #000000;&quot;&gt;print()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수는 하나 이상의 값을 출력할 수 있는 Python의 내장 함수입니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;*args: 여러 개의 값을 가변 위치 인수 형태로 받을 수 있습니다. 예를 들어,&lt;span&gt;&amp;nbsp;&lt;/span&gt;print(1, 2, 3)처럼 쉼표로 구분된 값들을 전달할 수 있습니다.&lt;/li&gt;
&lt;/ul&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;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;sep&lt;span&gt;&amp;nbsp;&lt;/span&gt;(구분자)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&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;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736289905543&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Python&quot;, &quot;is&quot;, &quot;awesome&quot;, sep=&quot;-&quot;) # 출력: Python-is-awesome&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;end&lt;span&gt;&amp;nbsp;&lt;/span&gt;(끝 문자열)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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 style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 출력이 끝난 후 추가로 삽입할 문자열을 지정합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b&gt;기본값&lt;/b&gt;: 줄바꿈 ('\n')&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736289954809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Hello&quot;, end=&quot; &quot;) print(&quot;World&quot;) # 출력: Hello World&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;file&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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 style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 출력 대상을 지정합니다. 기본적으로 표준 출력(sys.stdout, 일반적으로 콘솔)에 출력되지만, 파일 객체를 전달하여 출력 내용을 파일에 저장할 수도 있습니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b&gt;기본값&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;sys.stdout&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736290011591&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;output.txt&quot;, &quot;w&quot;) as f:
    print(&quot;파일에 출력됩니다.&quot;, file=f)
# 파일에 &quot;파일에 출력됩니다.&quot;라는 텍스트가 저장됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4)&lt;span&gt;&amp;nbsp;&lt;/span&gt;flush&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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 style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;: 출력 내용을 즉시 스트림에 강제로 내보낼지 여부를 결정합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b&gt;기본값&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;False&lt;span&gt;&amp;nbsp;&lt;/span&gt;(스트림이 자동으로 관리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736290084675&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time

for i in range(5):
    print(i, end=&quot; &quot;, flush=True)
    time.sleep(1)
# 출력: 0 1 2 3 4 (1초 간격으로 출력)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 여러 줄 출력&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;print()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수는 이스케이프 문자를 사용해 여러 줄을 출력할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736290160908&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;안녕하세요,\nPython입니다.&quot;)
# 출력:
# 안녕하세요,
# Python입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또는 삼중 따옴표(&quot;&quot;&quot;)를 활용하여 더 깔끔하게 작성할 수도 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736290235940&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;&quot;&quot;
안녕하세요,
Python입니다.
&quot;&quot;&quot;)
# 출력:
# 
# 안녕하세요,
# Python입니다.
#&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼중따옴표(&quot;&quot;&quot;)에 '\' 기호를 추가(&quot;&quot;&quot;\)하면 의도하지 않은 공백을 방지할 수 있습니다&lt;/p&gt;
&lt;pre id=&quot;code_1736290569437&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;&quot;&quot;\
안녕하세요,
Python입니다.
&quot;&quot;&quot;)
# 출력:
# 안녕하세요,
# Python입니다.&lt;/code&gt;&lt;/pre&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. f-string과 함께 사용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Python 3.6부터 도입된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;f-string&lt;/b&gt;을 사용하면 문자열 포매팅이 훨씬 직관적입니다.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre id=&quot;code_1736290280572&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name = &quot;성호&quot;
age = 25
print(f&quot;이름: {name}, 나이: {age}&quot;)
# 출력: 이름: 성호, 나이: 25&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;f-string은 수식도 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736290299455&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a, b = 5, 3
print(f&quot;{a} + {b} = {a + b}&quot;)
# 출력: 5 + 3 = 8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;print()를 활용한 디버깅&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;print()는 디버깅에도 자주 사용됩니다. 특히, 변수 값을 확인하거나 실행 흐름을 추적할 때 유용합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1736290334871&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def calculate(x, y):
    print(f&quot;x: {x}, y: {y}&quot;)  # 디버깅용 출력
    return x + y

result = calculate(5, 10)
print(f&quot;결과: {result}&quot;)
# 출력:
# x: 5, y: 10
# 결과: 15&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;print()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수는 단순히 값을 출력하는 데 그치지 않고, 다양한 매개변수를 통해 커스터마이징된 출력이 가능합니다. 또한 디버깅, 파일 출력, 실시간 로깅 등 다양한 상황에서 유용하게 사용됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로그램의 실행 결과를 예측해보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1736288239874&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;# 연습문제&quot;)
print(&quot;\\\\\\\\&quot;)
print(&quot;-&quot; * 8)&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1736288724736&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 연습문제
\\\\
--------&lt;/code&gt;&lt;/pre&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 style=&quot;color: #000000;&quot;&gt;print(&quot;# 연습문제&quot;)는 문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;# 연습문제를 출력합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;print(&quot;\\\\\\\\&quot;):
&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;span&gt;&amp;nbsp;&lt;/span&gt;\\\\는 두 개의 백슬래시(\\)로 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;print(&quot;-&quot; * 8):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;-&quot;를 8번 반복한 결과를 출력합니다.&lt;/li&gt;
&lt;li&gt;결과적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;--------가 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다음 프로그램을 실행결과를 예측해보세요. 오류가 발생하면 왜 발생하는지 작성해보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1736288372825&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;안녕하세요&quot;[1])
print(&quot;안녕하세요&quot;[2])
print(&quot;안녕하세요&quot;[3])
print(&quot;안녕하세요&quot;[4])
print(&quot;안녕하세요&quot;[5])&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1736288698205&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;녕
하
세
요
IndexError: string index out of range&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-08 오전 7.34.29.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxH4p5/btsLF3KsHME/2Dr6pmmw9fvv0q7FE03c10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxH4p5/btsLF3KsHME/2Dr6pmmw9fvv0q7FE03c10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxH4p5/btsLF3KsHME/2Dr6pmmw9fvv0q7FE03c10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxH4p5%2FbtsLF3KsHME%2F2Dr6pmmw9fvv0q7FE03c10%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;321&quot; height=&quot;97&quot; data-filename=&quot;스크린샷 2025-01-08 오전 7.34.29.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&quot;안녕하세요&quot;[1]:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;안녕하세요&quot;에서 인덱스는 0부터 시작합니다.&lt;/li&gt;
&lt;li&gt;인덱스&lt;span&gt;&amp;nbsp;&lt;/span&gt;1은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;녕&quot;에 해당합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&quot;안녕하세요&quot;[2]와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;안녕하세요&quot;[3]&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;안녕하세요&quot;[4]는 각각&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;하&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;세&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;요&quot;에 해당합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&quot;안녕하세요&quot;[5]:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;안녕하세요&quot;의 길이는 5이지만, 유효한 인덱스는&lt;span&gt;&amp;nbsp;&lt;/span&gt;0 ~ 4입니다.&lt;/li&gt;
&lt;li&gt;인덱스&lt;span&gt;&amp;nbsp;&lt;/span&gt;5는 문자열 범위를 벗어나므로 &lt;b&gt;IndexError&lt;/b&gt;가 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 다음 프로그램의 실행결과를 예측해보세요&lt;/p&gt;
&lt;pre id=&quot;code_1736288439525&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;안녕하세요&quot;[1:3])
print(&quot;안녕하세요&quot;[2:4])
print(&quot;안녕하세요&quot;[1:])
print(&quot;안녕하세요&quot;[:3])&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1736288619078&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;녕하
하세요
녕하세요
안녕하&lt;/code&gt;&lt;/pre&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 style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&quot;안녕하세요&quot;[1:3]:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;슬라이싱은&lt;span&gt;&amp;nbsp;&lt;/span&gt;[시작:끝]&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식으로 동작하며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;끝&lt;span&gt;&amp;nbsp;&lt;/span&gt;인덱스는 포함되지 않습니다.&lt;/li&gt;
&lt;li&gt;인덱스&lt;span&gt;&amp;nbsp;&lt;/span&gt;1부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;3&lt;span&gt;&amp;nbsp;&lt;/span&gt;이전(즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;1과&lt;span&gt;&amp;nbsp;&lt;/span&gt;2)까지의 문자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;녕하&quot;가 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&quot;안녕하세요&quot;[2:4]:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인덱스&lt;span&gt;&amp;nbsp;&lt;/span&gt;2부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;4&lt;span&gt;&amp;nbsp;&lt;/span&gt;이전(즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;2와&lt;span&gt;&amp;nbsp;&lt;/span&gt;3)까지의 문자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;하세요&quot;가 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&quot;안녕하세요&quot;[1:]:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 인덱스가&lt;span&gt;&amp;nbsp;&lt;/span&gt;1이고 끝 인덱스가 생략된 경우,&lt;span&gt;&amp;nbsp;&lt;/span&gt;1부터 문자열 끝까지 슬라이싱합니다.&lt;/li&gt;
&lt;li&gt;결과적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;녕하세요&quot;가 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&quot;안녕하세요&quot;[:3]:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 인덱스가 생략된 경우, 문자열 처음부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;3&lt;span&gt;&amp;nbsp;&lt;/span&gt;이전(즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;0,&lt;span&gt;&amp;nbsp;&lt;/span&gt;1,&lt;span&gt;&amp;nbsp;&lt;/span&gt;2)까지 슬라이싱합니다.&lt;/li&gt;
&lt;li&gt;결과적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;안녕하&quot;가 출력됩니다.&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;/div&gt;
&lt;/div&gt;</description>
      <category>혼공학습단/혼공파</category>
      <category>Python</category>
      <category>혼공파</category>
      <category>혼공학습단</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/61</guid>
      <comments>https://banana-master.tistory.com/61#entry61comment</comments>
      <pubDate>Wed, 8 Jan 2025 08:23:16 +0900</pubDate>
    </item>
    <item>
      <title>Swap Memory 이해하기</title>
      <link>https://banana-master.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 시스템을 운영할 때, &lt;b&gt;Swap Memory&lt;/b&gt;라는 용어를 처음 들었습니다. Swap 메모리는 물리적 메모리(RAM)가 부족할 때 시스템이 디스크 공간을 활용하여 메모리를 대체하는 방식입니다. 이 글에서는 Swap 메모리의 개념과 활용 방법, 그리고 설정 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS EC2 t2.micro에서의 Swap Memory 경험&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS EC2의 t2.micro(1GB RAM) 인스턴스를 사용하면서 프로젝트 빌드 실패 문제를 겪었습니다. CloudWatch를 이용해 확인해 보니 CPU 사용률이 99%로 유지되었고, 메모리 사용량이 문제일 가능성이 있다는 것을 알게 되었습니다. 이 과정에서 Swap 메모리를 처음 알게 되었고, 이를 적용한 결과 문제를 성공적으로 해결할 수 있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-21 오후 3.30.28.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbXuv7/btsLrIGoIi7/07pi0MOEwhBTMxrx7eehvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbXuv7/btsLrIGoIi7/07pi0MOEwhBTMxrx7eehvk/img.png&quot; data-alt=&quot;Cloud Watch로 확인한 CPU 사용률&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbXuv7/btsLrIGoIi7/07pi0MOEwhBTMxrx7eehvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbXuv7%2FbtsLrIGoIi7%2F07pi0MOEwhBTMxrx7eehvk%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;348&quot; height=&quot;222&quot; data-filename=&quot;스크린샷 2024-12-21 오후 3.30.28.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloud Watch로 확인한 CPU 사용률&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Swap Memory란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swap Memory는 물리적 메모리(RAM)가 부족할 때, 운영체제가 디스크의 특정 공간을 임시 메모리로 사용하는 기술입니다. 이는 시스템이 메모리를 효율적으로 사용하도록 돕고, 과도한 메모리 사용으로 인해 발생할 수 있는 시스템 충돌을 방지합니다.&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;&lt;b&gt;RAM보다 속도가 느림&lt;/b&gt;: Swap 메모리는 디스크를 사용하므로 RAM에 비해 데이터 읽기/쓰기 속도가 훨씬 느립니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리 부족 시 사용됨&lt;/b&gt;: 시스템에서 RAM이 가득 차면 Swap 영역을 사용하기 시작합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디스크 I/O에 의존&lt;/b&gt;: Swap 사용 시 디스크 입출력이 발생하므로 디스크 성능이 중요한 역할을 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연한 메모리 관리&lt;/b&gt;: 시스템이 메모리 부족 상태에서도 프로그램을 종료하지 않고 실행 상태를 유지할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Swap Memory의 장점&lt;/h4&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;/li&gt;
&lt;li&gt;&lt;b&gt;저비용 확장 가능성&lt;/b&gt;: 추가 RAM을 구매하지 않고도 디스크 공간만으로 메모리 부족 문제를 완화할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Swap Memory의 단점&lt;/h4&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;: RAM보다 속도가 느리기 때문에 Swap 메모리를 과도하게 사용할 경우 시스템 성능이 크게 저하될 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디스크 의존성&lt;/b&gt;: 디스크 수명에 영향을 미칠 수 있으며, 특히 SSD를 사용하는 경우 주의가 필요합니다. SSD는 쓰기 작업의 수명이 제한되어 있어 Swap 사용이 디스크의 수명을 단축시킬 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Swap Memory의 필요성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 메모리 부족 상황 대응&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리적 메모리가 부족한 경우, Swap 메모리는 프로그램이 계속 실행되도록 지원합니다. 이는 서버나 워크스테이션에서 특히 유용합니다. 예를 들어, 여러 사용자가 동시에 작업하거나 대규모 데이터를 처리하는 환경에서 RAM이 부족할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사례: AWS EC2 t2.micro 환경에서 Swap 활용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 무료로 제공되는 AWS EC2 t2.micro 인스턴스(1GB RAM)를 사용하는 경우, 제한된 메모리로 인해 메모리 부족 상황이 자주 발생할 수 있습니다. Swap Memory를 설정하면 이러한 환경에서도 안정적으로 애플리케이션을 실행할 수 있습니다.&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;Swap 메모리는 RAM의 과부하로 인해 발생할 수 있는 시스템 충돌을 방지하여 안정성을 향상시킵니다. 메모리 부족으로 인해 발생할 수 있는 &quot;Out of Memory&quot;(OOM) 에러를 방지하는 데 중요한 역할을 합니다.&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;특정 시점에 메모리 사용량이 급증하는 경우 Swap 메모리는 RAM을 보완하며, 시스템이 원활히 작동할 수 있도록 지원합니다. 이는 메모리 사용량이 일정하지 않은 애플리케이션에 유용합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Swap Memory가 불필요한 경우&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충분한 물리적 메모리가 설치된 시스템에서는 Swap 메모리의 필요성이 낮아질 수 있습니다.&lt;/li&gt;
&lt;li&gt;고성능을 요구하는 작업(예: 데이터베이스 처리)에서는 Swap 사용이 성능에 부정적 영향을 줄 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Swap Memory의 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Swap 확인하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 시스템에서 Swap 메모리가 설정되어 있는지 확인하려면 다음 명령어를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;sudo swapon --show&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Swap 메모리가 설정되어 있지 않다면, 아무것도 출력되지 않습니다.&lt;/p&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. Swap 파일 생성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Swap 파일을 생성하고 활성화하는 과정입니다. (위 명령어는 2GB 크기의 Swap 파일을 생성합니다.)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo fallocate -l 2G /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Swap 파일 권한 설정&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;sudo chmod 600 /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Swap 영역 초기화&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;sudo mkswap /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5 . Swap 활성화&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;sudo swapon /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 부팅 시 Swap 자동 활성화&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Swap 메모리 사용 모니터링&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swap 메모리 사용량은 다음 명령어로 모니터링할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;free -h&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 더 자세한 정보를 얻으려면.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;vmstat&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스왑 메모리는 물리적 메모리가 부족한 상황에서 시스템 안정성을 유지하고 성능 저하를 완화할 수 있는 유용한 도구입니다. 특히 AWS의 EC2 t2.micro(Free tier)같은 제한된 리소스 환경에서 스왑 메모리를 활용하면 비용 효율적으로 문제를 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이는 어디까지나 &lt;b&gt;임시방편적인 해결책&lt;/b&gt;입니다. 스왑 메모리는 SSD나 하드 디스크의 공간을 사용하기 때문에 RAM에 비해 접근 속도가 느리며, 과도한 사용은 시스템 성능의 심각한 저하를 초래할 수 있습니다.&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>Linux</category>
      <category>Linux</category>
      <category>swap memory</category>
      <category>메모리가 부족할 때</category>
      <author>sunghoyaaa</author>
      <guid isPermaLink="true">https://banana-master.tistory.com/60</guid>
      <comments>https://banana-master.tistory.com/60#entry60comment</comments>
      <pubDate>Sat, 21 Dec 2024 15:33:09 +0900</pubDate>
    </item>
  </channel>
</rss>