<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발하는 중생</title>
    <link>https://tibetsandfox.tistory.com/</link>
    <description>개발을 공부하는 중생입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 16:30:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>티베트 모래여우</managingEditor>
    <image>
      <title>개발하는 중생</title>
      <url>https://tistory1.daumcdn.net/tistory/4280587/attach/83b7835ca8fb49708f5809f2e1be26c1</url>
      <link>https://tibetsandfox.tistory.com</link>
    </image>
    <item>
      <title>세마포어(Semaphore)와 뮤텍스(Mutex)</title>
      <link>https://tibetsandfox.tistory.com/45</link>
      <description>&lt;div id=&quot;SE-9047db6f-991e-4f65-a010-a4fbd5390df3&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-bf7b6dce-3862-4404-a825-2dfce27dc189&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-d0ec7047-8ab2-4954-9221-bab99af2fd9b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;전에 파이썬의 GIL에 대해서 설명할 때 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;뮤텍스(Mutex)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라는 용어를 언급했었는데 이번에 이 뮤텍스와 뮤텍스의 상위 개념인 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;세마포어(Semaphore)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;까지 함께 다뤄보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우선 빠르게 한 줄로 요약하자면, &lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;세마포어와 뮤텍스는 프로세스 / 스레드에서 사용되는 일종의 열쇠(key)라고 생각하시면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4f9130f0-175c-440b-b107-203b84b98cf4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;뭔 개소린지 모르시겠다면, 정상입니다. 차차 자세히 설명드릴테니 우선 내려보시죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-efe05582-7828-4173-ae6f-ea804bd2f9da&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bErlFQ/btrFyRRloIs/bKgINJtw2qEqwefX86Uk7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bErlFQ/btrFyRRloIs/bKgINJtw2qEqwefX86Uk7K/img.jpg&quot; data-alt=&quot;마이 쁘레셔스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bErlFQ/btrFyRRloIs/bKgINJtw2qEqwefX86Uk7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbErlFQ%2FbtrFyRRloIs%2FbKgINJtw2qEqwefX86Uk7K%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;512&quot; height=&quot;342&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마이 쁘레셔스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-10caf816-6f0c-4876-a3c5-57ee8827a082&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-621fb04c-0591-4aa0-adab-f757c85aa623&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;사전 지식 - 임계 구역(Critical section)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-ca27f7aa-526c-405d-9075-63f26c41bf90&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;임계 구역은 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;다수의 프로세스가 데이터를 공유하며 실행되는 상황에서 각 프로세스가 공유 자원에 접근하는 코드 블록&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 의미합니다. 공유 자원이라는 말에서 대충 눈치 채셨겠지만, &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;다수의 프로세스가 동시에 공유 자원에 접근하여 사용하면 문제&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가 생기게 됩니다.(이상한 결과가 나온다던가..)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;세마포어(Semphore)란?&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-65d50948-68b0-44d7-9973-25bcb65ff6c5&quot;&gt;
&lt;p id=&quot;SE-b7600f9d-25b3-43a6-bce9-726a49afcf40&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;세마포어는 저런 임계 구역에서 발생할 수 있는 문제를 해결하기 위해 등장한 개념입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d1075b26-4e30-4184-ad68-630ddd079704&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;어떤 공유 자원에 대해 동시에 접근할 수 있는 프로세스/스레드의 수를 변수로 제한&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하여 공유 자원의 오염을 막습니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;이 변수는 운영체제나 커널에 실제로 저장되며, 각 프로세스가 이 값을 확인하고 변경할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1916544c-a3a9-4dd9-b807-4b81466c3855&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 &lt;/span&gt;&lt;span&gt;&lt;u&gt;어떤 공유 자원의 세마포어가 3이라면 해당 자원은 동시에 최대 3개의 프로세스가 접근 가능하다는 의미&lt;/u&gt;&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e838e68e-2e58-4dfe-8415-16aadebf2793&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XPi6R/btrFDfP1nJj/3R4PdJKza4lpWhxj7PKaUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XPi6R/btrFDfP1nJj/3R4PdJKza4lpWhxj7PKaUk/img.jpg&quot; data-alt=&quot;좋은건 좀 나눠씁시다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XPi6R/btrFDfP1nJj/3R4PdJKza4lpWhxj7PKaUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXPi6R%2FbtrFDfP1nJj%2F3R4PdJKza4lpWhxj7PKaUk%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;500&quot; height=&quot;646&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;좋은건 좀 나눠씁시다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-aa22412d-9124-4b42-93ec-f4baccfd3162&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7d9550ae-6ca5-4efe-be95-03532bf17963&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-795feff0-bb56-47f0-9dc2-29df101ab306&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;뮤텍스(Mutex)란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-62859807-e20e-46f1-a753-3f84aa75c609&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;뮤텍스는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;상호 배제(Mutual Exclusion)의 줄임말&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 입니다. 파이썬의 GIL이 이 뮤텍스에 속합니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;뮤텍스는 이진(Binary) 세마포어&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이기도 하며&lt;/span&gt;&lt;span&gt;&lt;u&gt; 세마포어의 특성들을 어느 정도 가지고 있지만 확연한 차이점이 존재&lt;/u&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5dd15514-2da6-4e85-b3c8-07382c57e03c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7b2ec01d-e3fd-4b55-8a65-1cece1923842&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;&amp;middot; 뮤텍스는 단 하나의 프로세스/스레드만 접근 가능하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4a051c3d-d268-4991-a4d2-8ccace26832c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; - &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;뮤텍스가 사용되는 임계 구역은 공유가 불가능한 자원&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 따라서 한번에 단 하나의 프로세스/스레드만 접근이 가능하며, &lt;/span&gt;&lt;span&gt;&lt;b&gt;사용중인 프로세스/스레드가 락(Lock)을 걸어버려 다른 프로세스/스레드의 접근을 방지&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c9bdb97-9c91-4f25-8a8e-26888a30021d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f1528fa5-bce6-47cc-ac7e-68f543b0b73e&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;&amp;middot; 뮤텍스는 프로세스단에서 관리된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-12a0ad9f-135b-483f-88cb-44435fe60a44&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; - 운영체제나 커널에 저장되고 변경되는 세마포어와는 다르게 &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;p id=&quot;SE-28c15dd6-788f-41b0-be08-a0928301404c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6519aaa6-00a1-4e68-ba75-e11ea25d0bf4&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;&amp;middot; 뮤텍스의 락(Lock)은 본인이 아니면 해제가 불가능하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b107dd16-cfd7-48e0-a8c7-ff0401d8ee96&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; - 다른 프로세스들도 자유롭게 확인하고 변경 가능했던 세마포어와는 다르게 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;뮤텍스는 락을 건 프로세스/스레드 본인이 아니면 그 락을 해제할 수 없습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2dfbcc14-2b85-4de6-b148-15de42f4aad3&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnXNXv/btrFzOGBsgS/ovLmmKKC5n1wqSrL3QS2Bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnXNXv/btrFzOGBsgS/ovLmmKKC5n1wqSrL3QS2Bk/img.jpg&quot; data-alt=&quot;단!!!!!!!!!!!!!!비!!!!!!!!!!!!꺼!!!!!!!!!!!!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnXNXv/btrFzOGBsgS/ovLmmKKC5n1wqSrL3QS2Bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnXNXv%2FbtrFzOGBsgS%2FovLmmKKC5n1wqSrL3QS2Bk%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;549&quot; height=&quot;410&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단!!!!!!!!!!!!!!비!!!!!!!!!!!!꺼!!!!!!!!!!!!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f25d2b7c-a4f4-4e12-9a52-4405bb2c5f30&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d6e4a879-24e1-4f4a-8236-aeff5ff901e7&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-799e6148-89c5-48bb-a788-71337d99a9b3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;세마포어와 뮤텍스의 차이점 요약&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-19e9cad3-a15c-490a-9d35-e2a720c85fef&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;세마포어와 뮤텍스는 흔히 &quot;화장실&quot;로 비유되곤 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-47cda533-29fe-44df-96f5-61b407b6071e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4b95ba43-d08c-460e-a420-c720db8c2eac&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;세마포어는 화장실이 여러개 있는 가게&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-513fcd6e-30f1-4b4b-a864-e79a77336bb6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 화장실이 5개&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(세마포어 값이 5)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라면 화장실을 동시에 이용할 수 있는 손님은 최대 5명입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-367bbfa4-a728-4895-86e3-738fea21f41f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;손님 한 명이 화장실에 들어갈 때마다 사용 가능한 화장실이 하나 줄어들고, 나오면 늘어납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4e56daa8-3e4e-4d3a-a1fc-f1c23ede0073&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 내가 화장실에 가고 싶은데 5개의 화장실이 전부 사용중이라면?&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(세마포어 값이 0이라면)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6346b95d-df5c-49e3-a095-f4ae3f5173c3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;당연히 들어간 사람이 나올 때 까지 기다려야 합니다.&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(사용중인 프로세스/스레드가 사용을 마칠 때 까지 대기)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-308a1b6d-b4ae-4486-adec-e3a01f10c2c7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 사람이 나오면 비로소 안도감을 느끼며 화장실을 사용하게 되는 것입니다.&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(대기중이던 프로세스가 자원을 사용하기 시작)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c8a72d17-5ed8-4b90-b221-88a68f011424&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c7074918-bfcd-4282-8156-eacce67d7b57&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9c031c49-a3ce-42d7-aeb0-5ff9214d0072&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;반면 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;뮤텍스는 좀 불편한 화장실을 가진 가게입니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;가게 내에 화장실이 단 1개밖에 없으며, 심지어 카운터에서 열쇠를 받아가야만 사용이 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-82700612-1ae6-4685-987f-1ffc1b95634c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;손님 한 명이 카운터에서 키를 받아&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(제어권 획득)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a34cec92-2598-4023-bb90-c4d432da7036&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;화장실에 들어가서 문을 잠가버린다면&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(Lock설정)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d6921c20-19c1-4a59-9f95-0a9875473bc2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그 손님이 나오기 전엔 그 누구도 화장실을 사용할 수 없습니다.&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(다른 프로세스/스레드는 대기)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b402b68c-8320-4bf4-bb26-ac3ee43d9131&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;심지어 열쇠가 없으면 들어갈 수 없으니 먼저 들어간 사람이 키를 반환하기 전까진 무작정 기다려야 합니다.&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(다른 프로세스/스레드가 Lock을 멋대로 해제할 수 없음)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-502b182f-74cb-4275-9c9d-955f552031c7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그러다 사용중이던 손님이 카운터에 열쇠를 반환하면&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(Lock 해제)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3d55eb7f-abbc-4c6c-8ebc-ac545e7aa83b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그 때서야 열쇠를 가져가서 화장실을 이용할 수 있게 됩니다.&lt;/span&gt;&lt;span style=&quot;color: #aa1f91;&quot;&gt;&lt;b&gt;(대기중이던 프로세스/스레드가 제어권 획득)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3060a215-2afb-4305-a991-5f2b9f9d9d61&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-61ff6506-7e9a-448d-94f5-0ec01acdcdce&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yB3V6/btrFDhf0lHZ/lIKRZAwydsqwaLz4ZdRKTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yB3V6/btrFDhf0lHZ/lIKRZAwydsqwaLz4ZdRKTK/img.jpg&quot; data-alt=&quot;다행히 뮤텍스는 열쇠가 부러지거나 하진 않습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yB3V6/btrFDhf0lHZ/lIKRZAwydsqwaLz4ZdRKTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyB3V6%2FbtrFDhf0lHZ%2FlIKRZAwydsqwaLz4ZdRKTK%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;600&quot; height=&quot;765&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다행히 뮤텍스는 열쇠가 부러지거나 하진 않습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>기타등등</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/45</guid>
      <comments>https://tibetsandfox.tistory.com/45#entry45comment</comments>
      <pubDate>Fri, 24 Jun 2022 01:49:55 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - if __name__ == &amp;quot;__main__&amp;quot;을 사용하는 이유(Feat. 네임스페이스)</title>
      <link>https://tibetsandfox.tistory.com/44</link>
      <description>&lt;div id=&quot;SE-374b615f-cf18-4ef3-9cda-e72c0085965d&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-567620b8-46a5-4c8e-9b31-5c791ed97f56&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-bbd3f663-4847-4766-a2cd-65a6dae48b38&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬 공부를 하다 보면 심심치않게 다음과 같은 코드를 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650982912290&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if __name__ == &quot;__main__&quot;: 
	...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;사실 딱히 진입점(C로 따지면 main함수)이랄게 없는 파이썬에서 &quot;굳이 저런걸 써야하나?&quot; 싶었던 분들이 꽤 계실 것 같습니다. 하지만 저 코드는&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 생각보다 중요한 역할을 맡고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 이를 알아보기 전에 먼저&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;네임스페이스&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;에 대해 알아봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d96751da-cf2e-43f2-af19-9be0ec82e082&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUHMMZ/btrAzbyFLHn/xDz0A7IZGkr67A1zy64p3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUHMMZ/btrAzbyFLHn/xDz0A7IZGkr67A1zy64p3k/img.jpg&quot; data-alt=&quot;대체 왜 필요한건데?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUHMMZ/btrAzbyFLHn/xDz0A7IZGkr67A1zy64p3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUHMMZ%2FbtrAzbyFLHn%2FxDz0A7IZGkr67A1zy64p3k%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;553&quot; height=&quot;451&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대체 왜 필요한건데?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a2aac6b6-f7fe-4b97-b6e1-fc0430c2c4ea&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-04d839de-1e2b-43bb-be34-ee977415ac29&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-7f49c945-ff2a-4989-841c-90b2c61d1e44&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;파이썬에서의 네임스페이스(Namespace)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-f5bbb9f5-3f12-49c1-9910-76ddc45d8f6c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우리의 영원한 친구이자 동료인 위키백과에서는 네임스페이스가 다음과 같은 뜻이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-63e85586-70fa-4654-a85d-e0c5f821ad88&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e15fa48e-4cc7-4641-8dda-b707631e0b85&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개체를 구분할 수 있는 범위&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-95b669b1-2385-4ced-a7c3-8835be9007ed&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;대황신갓키백과&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-58431495-5233-43d3-8af8-3a792e7de0da&quot;&gt;
&lt;p id=&quot;SE-dae14fb7-81eb-4196-8687-7cc131a585f7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;네. 정말 그게 다입니다. 좀 더 풀어서 설명하자면, &lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;어떤 객체를 이름으로 구분할 수 있는 범위를 의미&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-87f66890-fa4f-410c-a40e-2e5f1d66916c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여러분도 아시다시피 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;파이썬에서는 모든 것이 객체&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 그리고 그 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체들은 각자의 이름을 가지고 구분&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6ca68c2c-3df3-48bc-9e5c-91808b89fe2f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 객체를 이름만 가지고 구분하기엔 많이 아쉽습니다. 만약 그렇다면 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;모든 함수, 변수, 클래스 등의 이름을 전부 다 다르게 설정&lt;/b&gt;&lt;/span&gt;&lt;span&gt;해야 하니까요. 그렇게 하는건 일정 규모 이상에선 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;불가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0e5e4ae9-82e0-42be-a9d1-411c004b4ad2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래서 &lt;/span&gt;&lt;span&gt;&lt;s&gt;고통받을뻔한&lt;/s&gt;&lt;/span&gt;&lt;span&gt; 우리를 구원하기 위해 네임스페이스라는 개념이 존재하는 것입니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;객체마다 자신의 영향력을 행사할 수 있는 범위를 제한하여 이름의 중복을 허용&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;한 것이죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650983005546&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def func1():
    name = &quot;심춘자&quot;
def func2():
    name = &quot;김갑두&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d406259f-15a3-409b-a3de-5cef9c93662f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래서 우린 위와 같은 코드를 사용할 수 있습니다. func1과 func2의 네임스페이스는 다른 공간이며 따라서 func1의 name을 어떤 값으로 바꿔도 func2의 name에는 영향을 주지 않습니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;이러한 네임스페이스들은 locals()함수를 통해서 확인 가능&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4fa50b7e-2404-4123-8a8e-3d8fa867e76b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬에서 네임스페이스는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;크게 3가지로 구분&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d2a7dcae-3301-40ba-9561-4771c7d44963&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c1413ebc-8ee2-4938-8461-8216e8d4ff46&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;1. 지역 네임스페이스(Local namespace)&lt;/b&gt;&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;함수(메소드)별로&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 구분되는 네임스페이스&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f9177386-de17-4028-8769-08ad76765475&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;2. 글로벌 네임스페이스(Global namespace)&lt;/b&gt;&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;모듈 단위&lt;/b&gt;&lt;/span&gt;&lt;span&gt;로 구분되는 네임스페이스&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6fc5b47a-804f-42c9-b9f3-ccdb27756562&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;3. 빌트인 네임스페이스(Built-in namespace)&lt;/b&gt;&lt;/span&gt;&lt;span&gt; - 내장 함수를 포함한 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 네임스페이스&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-89bd7a31-89fa-4595-8ee4-921a2fcd27d9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어떤 객체를 참조하려고 할 때, &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;탐색 순서는 지역 -&amp;gt; 글로벌 -&amp;gt; 빌트인 순으로 탐색&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. 하지만 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;역순 참조는 불가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-7ae1577f-4d69-46c9-b73f-124fff6dbcdd&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1650983108802&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;word = &quot;무야호&quot;

def say():
    print(word)

say()
&quot;무야호&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;따라서 위와 같은 코드도 실행이 가능합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;say의 네임스페이스에 word가 존재하지 않으니 상위 네임스페이스인 전역(global)에서 word를 찾아 출력하는 모습입니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b2ee0bab-fa30-4f55-8829-c4e31c094f81&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V73cW/btrAwDpNulz/wTWDv4zDjgU6Wq6bzon1ok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V73cW/btrAwDpNulz/wTWDv4zDjgU6Wq6bzon1ok/img.jpg&quot; data-alt=&quot;하하! 찾았다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V73cW/btrAwDpNulz/wTWDv4zDjgU6Wq6bzon1ok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV73cW%2FbtrAwDpNulz%2FwTWDv4zDjgU6Wq6bzon1ok%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;550&quot; height=&quot;413&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하하! 찾았다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그래서 if __name__ == &quot;__main__&quot; 이건 대체 왜 쓰는거임&lt;/b&gt;&lt;/h3&gt;
&lt;div id=&quot;SE-609f787e-7fd4-4834-a6a2-074e69cc9483&quot;&gt;
&lt;p id=&quot;SE-dcd70769-3c56-4728-889d-193b8bcda708&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;저 __name__이라는 친구에겐 신기한 특징이 하나 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650983153633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# test1.py

print(__name__)
# 출력 : __main__&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;파이썬 파일을 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;커맨드라인이나 인터페이스를 통해 직접 실행한 경우 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;__name__에는 __main__&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이라는 값(네임스페이스)이 설정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650983169225&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# test2.py
import test1

print(test1.__name__)
# 출력 : test1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d6fed8d6-d052-4c31-878f-a52d577be549&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6f773f86-1854-49fc-bc34-34d180b970e2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 파이썬 파일을 모듈로서 사용, 즉 &lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;다른 파일에서 불러와 사용하는 경우 __name__에는 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #ff0010;&quot;&gt;&lt;b&gt;모듈 이름이 설정&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-10b61588-8c65-4c23-b02f-cf8f63b94d53&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정리하자면 if __name__ == &quot;__main__&quot; 은 &lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;해당 구문이 사용된 파이썬 파일을 직접 실행했을 때만 아래 코드를 실행하겠다&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 라는 의미입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-621d2c31-7171-400d-9e6c-752b9c418ec6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이는 파이썬 개발자들이 저지를 수 있는 실수를 막아줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650983185730&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### test1.py
print(&quot;메롱&quot;)
### test2.py
import test1

print(&quot;ㅎㅇ&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;test2.py를 실행하면 어떻게 될까요? 겉으로 보기엔 test1을 임포트만 했으니 아무런 영향이 없을 것 같지만..&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650983202730&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;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;test1에 있던 print문이 출력되는 모습&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;입니다. test1모듈에 아무런 조치를 취하지 않았기에 이런 일이 발생하게 된 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1650983212802&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;### test1.py
if __name__ == &quot;__main__&quot;:
    print(&quot;메롱&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;test1모듈에 위와 같이 __name__을 이용한 구문을 넣어주면 모듈이 임포트 되면서 실행되는 참사를 막을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-6cd5d70e-6fd8-4eb9-8457-95a153c4f1d7&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p7DW3/btrAuLu4kTT/MwHkhbGjnx9dx7v3c8xJQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p7DW3/btrAuLu4kTT/MwHkhbGjnx9dx7v3c8xJQ0/img.jpg&quot; data-alt=&quot;멈춰!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p7DW3/btrAuLu4kTT/MwHkhbGjnx9dx7v3c8xJQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7DW3%2FbtrAuLu4kTT%2FMwHkhbGjnx9dx7v3c8xJQ0%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;460&quot; height=&quot;613&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멈춰!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/44</guid>
      <comments>https://tibetsandfox.tistory.com/44#entry44comment</comments>
      <pubDate>Tue, 26 Apr 2022 23:27:23 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - GIL(Global Interpreter Lock)</title>
      <link>https://tibetsandfox.tistory.com/43</link>
      <description>&lt;div id=&quot;SE-8b2b36ca-d2f2-49da-b089-2ad8361514f0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-8291079c-e886-4c4a-af72-5a3145b7629c&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;GIL(Global Interpreter Lock) 이란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-bd8cc743-248c-482f-8ad0-2675c1981ce6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GIL은 파이썬에만 존재하는 독특한 개념으로 파이썬에서 멀티스레딩을 할 때 &lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;다수의 스레드가 동시에 파이썬 바이트 코드를 실행하지 못하게 막는 일종의 뮤텍스(Mutex)입니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d92b67e7-310d-4ebc-82a6-c204e53172e2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬으로 작성된 프로세스는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;한 시점에 하나의 스레드에만 모든 자원을 할당하고 다른 스레드는 접근할 수 없게 막아버리는데,&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 이 역할을 GIL이 수행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7124cef9-76e8-4ddc-9dcb-73f793ccc993&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉 &lt;/span&gt;&lt;span&gt;&lt;u&gt;멀티스레딩을 하더라도 파이썬에선 우리가 생각하는 것처럼 여러 스레드가 동시에 작업을 하진 않습니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-43d47f5f-2f10-4bbe-881b-a8f39fd297f2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dded2250-69fe-4c87-89db-ed3bb7710b76&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;깊게 파고들면 복잡하고 꽤 어려운 내용이니 최대한 간소화해서 핵심만 설명드리겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5ffdf7b9-f280-4abc-abec-a3eaa32ace1b&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0oTda/btrs1RIeqCy/ZHSmdEQxviW0oAPPalJyO0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0oTda/btrs1RIeqCy/ZHSmdEQxviW0oAPPalJyO0/img.jpg&quot; data-alt=&quot;이 길(GIL) 아닙니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0oTda/btrs1RIeqCy/ZHSmdEQxviW0oAPPalJyO0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0oTda%2Fbtrs1RIeqCy%2FZHSmdEQxviW0oAPPalJyO0%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;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 길(GIL) 아닙니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4e5e6a3b-e270-4065-8b2c-4298feea62a9&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-860dd852-2ca5-48aa-82c1-bdc1e7e7819f&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;파이썬에서의 멀티스레딩&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-66ce0b36-5a15-456f-aad7-4396b81b89e4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;일반적으로 멀티스레딩이라 하면 다음과 같은 상황을 기대합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-424f5652-bd48-4af9-9d7b-e59f874867ca&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baQVZB/btrsW9Do0VS/pJwqGbWsP8dVVN062oeuU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baQVZB/btrsW9Do0VS/pJwqGbWsP8dVVN062oeuU0/img.png&quot; data-alt=&quot;와! 멀티스레딩!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baQVZB/btrsW9Do0VS/pJwqGbWsP8dVVN062oeuU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaQVZB%2FbtrsW9Do0VS%2FpJwqGbWsP8dVVN062oeuU0%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;699&quot; height=&quot;658&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;와! 멀티스레딩!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d4d0a65b-fd26-4008-903f-10c67e5ea18b&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e035a29e-dfd9-4b7d-aec4-10885e0d8bab&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;말 그대로 다수의 스레드가 &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;p id=&quot;SE-d3980f84-37b4-416d-ac6a-ac78d14ba6d6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 파이썬에서는 GIL 때문에 다음과 같은 상황이 펼쳐집니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b4427ec3-d027-45a0-99cc-c06a2073edfe&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnGae/btrs3bTwCpm/ulC0zkKWDQQpcYI1c5qdyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnGae/btrs3bTwCpm/ulC0zkKWDQQpcYI1c5qdyK/img.png&quot; data-alt=&quot;멀티..스레딩?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnGae/btrs3bTwCpm/ulC0zkKWDQQpcYI1c5qdyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnGae%2Fbtrs3bTwCpm%2FulC0zkKWDQQpcYI1c5qdyK%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;773&quot; height=&quot;645&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멀티..스레딩?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a56f2bc4-82e2-45fe-a560-f55b7b84a6bd&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-28fb4cf7-2815-4b2d-b0fc-e03be1caeae0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GIL이 &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;스레드끼리 공유하는 프로세스의 자원을 이름 그대로 Global 하게 Lock 해버리고 단 하나의 스레드에만 이 자원에 접근하는 것을 허용&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-21093477-b09d-4036-a9bf-39d993c5dddd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 그림과 같이 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;멀티스레드라 하더라도 한 번에 하나의 스레드만 실행&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b32f1729-b56c-48eb-9b7d-674dbc11494a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;스레드 간에 컨텍스트 스위칭 비용을 발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시키고, &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;멀티스레드가 싱글스레드와 비슷한 성능을 보이거나 오히려 떨어지게 되는 결과&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5182b2a4-c22d-49ff-8a1f-a10e7204fd32&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;s&gt;(여럿이서 일을 할 때보다 혼자서 일을 할 때 능률이 향상된다니 파이썬은 진정한 아싸가 아닐까요)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2c3ee7b9-0a11-4de7-bb7a-9d9c8152872f&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c9e5fbda-64f0-49ee-bb04-628e2c715eae&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-9b80b033-c80d-450c-839c-45b64ece401d&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;그렇다면 파이썬에서 굳이 멀티스레딩을 할 필요가 없나요?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-828c49c5-9d62-49e3-ba91-b76a1b8b62f5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;물론 그렇다고 해서 멀티스레딩이 아예 의미 없는 것은 아닙니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4ce101fc-60e4-4eec-ab2b-f04990ab7562&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;CPU 연산이 큰 비중을 차지하는 경우는&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 상기한 것 처럼 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;멀티스레딩의 성능이 싱글스레드보다 떨어지게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-629062fa-a141-43e2-9375-8a65d967de4a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;I/O작업이 큰 비중을 차지하거나 sleep으로 일정 시간 대기해야 하는 경우 멀티스레딩이 더 좋은 성능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 보이게 됩니다. 이는&lt;/span&gt;&lt;span&gt;&lt;b&gt; 입력 대기시간이나 sleep으로 대기하는 동안 컨텍스트 스위칭&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 이루어지기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4d1e6ef9-b45b-4d1e-ac78-8afd715402e3&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZgyID/btrsW85yfzO/a1EI6Mf49VuAwy632KlRg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZgyID/btrsW85yfzO/a1EI6Mf49VuAwy632KlRg0/img.jpg&quot; data-alt=&quot;니가 잘 때 난 일한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZgyID/btrsW85yfzO/a1EI6Mf49VuAwy632KlRg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZgyID%2FbtrsW85yfzO%2Fa1EI6Mf49VuAwy632KlRg0%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;524&quot; height=&quot;500&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;니가 잘 때 난 일한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2c22bd93-5426-48ca-9d78-db22e4640ea5&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div id=&quot;SE-7e27bca0-7947-43c2-979c-fd26aa5004d0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-09750fc0-e6a4-4751-897a-3523a1d5bab2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;얘는 대체 왜 필요한건가&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-469e17a9-09f1-4dbc-99ac-a7714a87b14d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그렇다면 당연한 의문이 생깁니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;대체 GIL을 왜 사용하는걸까요?&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 쓸데없이 멀티스레딩 성능만 저하시키는 천덕꾸러기 처럼 보이는데 말이죠..&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5e7e8bc5-9111-42cf-9f32-0f0b8003dbb2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이를 이해하려면 파이썬에서 메모리를 관리하는 방법에 대해 알아야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b2895d2c-5487-4df9-8e02-5a9a988d9fda&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5aee0ddc-aae0-4de6-8f78-6226b38b10a8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여러분들도 아시다시피 &lt;/span&gt;&lt;span&gt;&lt;u&gt;파이썬에 존재하는 모든 것은 객체&lt;/u&gt;&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-34c402d4-a75c-4ab2-965a-d0154993f8aa&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 파이썬은 이러한 객체들에 대해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Reference count(참조 횟수)를 저장&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하고 있습니다. 이 값은 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;각 객체들이 참조되는 횟수를 나타내며, 참조 여부에 따라 알아서 증감&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3289ce97-6925-4b9c-972e-73bde1b1caca&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어떤 객체에 대한 모든 참조가 해제되어 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;Reference count가 0이 된다면, 파이썬의 GC(Garbage Collector)가 그 객체를 메모리에서 삭제&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8a8f1bb1-719b-4361-b23f-63e19b1b3de5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 Reference count의 값은 항상 정확해야 적절하게 GC가 처리할 수 있겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4eb6fcf9-33e1-446d-acfc-8271816aa662&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4d30fafd-0304-4f4c-96e5-54aa7198f3d3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그런데 만약 여러 스레드에서 동시에 한 객체에 접근하게 되면 어떻게 될까요? 그렇게 되면 객체의 Reference count에 대해 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;레이스 컨디션(Race Condition, 하나의 자원을 동시에 사용하게 될 때 기대하지 않은 결과가 발생하는 상황)이 발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하게 되고 이는 GC의 부적절한 행동을 야기할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e93db41d-fc19-4767-9d45-a33ae876dc5a&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PKWjw/btrs3UjHBYu/Rfks6tE4BtKkvOqKUyjY50/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PKWjw/btrs3UjHBYu/Rfks6tE4BtKkvOqKUyjY50/img.jpg&quot; data-alt=&quot;미쳐날뛰는 GC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PKWjw/btrs3UjHBYu/Rfks6tE4BtKkvOqKUyjY50/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPKWjw%2Fbtrs3UjHBYu%2FRfks6tE4BtKkvOqKUyjY50%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;500&quot; height=&quot;567&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미쳐날뛰는 GC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-33066e7a-2f44-4800-a81f-1da1ebc0af12&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-54323287-915b-4582-980b-569ef5cdc9b8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이런 잔학무도한 상황을 방지하기 위해 파이썬은 GIL을 도입하게 된 것입니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;애초에 한 스레드만 자원에 접근이 가능하다면 Race Condition이 발생할 일은 없게 되니까요.&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d82fff9c-01c5-41bb-bab1-2ac2e8973670&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e7eb56da-5bc1-4ac6-86e0-54c3e04307d8&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-0eb53e8b-2b3a-497b-8fc7-b9d0a0ab4d14&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;대처법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-b991bc30-2802-473b-9bb5-a872790c7f2f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GIL의 방해를 받지 않고 병렬 연산을 하기 위한 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;가장 대표적인 방법은 멀티 프로세싱을 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는 것입니다. &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;컨텍스트 스위칭 비용이 크다는 단점&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 있지만 프로세스는 각자 독자적인 메모리를 가지기에 GIL의 영향을 받지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-db274f91-e177-4d0e-a0ef-4f1edd0b1316&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 외에도 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;CPython이 아닌 다른 인터프리터를 사용하는 방법 또한 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. GIL은 CPython에서만 사용되기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/43</guid>
      <comments>https://tibetsandfox.tistory.com/43#entry43comment</comments>
      <pubDate>Thu, 10 Feb 2022 19:22:15 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - 매직 메소드(Magic method)</title>
      <link>https://tibetsandfox.tistory.com/42</link>
      <description>&lt;div id=&quot;SE-975b0c5e-a754-49c9-b627-1c6026403a30&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-06aeadc7-0381-4479-b455-64e359da67f7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;매직 메소드(Magic method)란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-94d507c5-1f05-476f-bf7c-dd35d89849d4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 매직 메소드는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;파이썬에서 사용되는 특별한 메소드들을 의미&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;스페셜 메소드(Special method)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;나 &lt;/span&gt;&lt;span&gt;&lt;b&gt;던더 메소드(Double UNDERscore method)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라고 부르기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이들은 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;이미 파이썬 내에 정의되어 있고, 클래스 내부에서 매직 메소드들을 오버라이딩 하여 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다. 또한 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;직접 호출해서 사용하지 않고, 정해진 규칙에 따라 알아서 호출된다는 특징&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;눈에 띄는 큰 특징이라면 역시 &lt;/span&gt;&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;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8ee94df0-3448-4953-9cd1-7fd5cabbb931&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmnehD/btrkAWjfaAt/iLNMV7KTSj0VNKBK6PQYaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmnehD/btrkAWjfaAt/iLNMV7KTSj0VNKBK6PQYaK/img.jpg&quot; data-alt=&quot;종류가 드럽게 많지만 다 외울 필요는 없습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmnehD/btrkAWjfaAt/iLNMV7KTSj0VNKBK6PQYaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmnehD%2FbtrkAWjfaAt%2FiLNMV7KTSj0VNKBK6PQYaK%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;500&quot; height=&quot;653&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;종류가 드럽게 많지만 다 외울 필요는 없습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2b83f9aa-10e7-4083-9ff6-6d8a64a4fec6&quot;&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e293ef1e-51ae-4ecc-a577-1c5e018b749c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(언더바가 붙는 다른 경우에 대해서는 이전 게시글에서 다뤘으니 궁금하신 분들은 참고 바랍니다.)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1636613072687&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬(python) - _(언더바, 언더스코어)&quot; data-og-description=&quot;파이썬에서 _(이하 '언더바'로 통일)의 역할 다른 언어와 다르게 파이썬에서 언더바는 Snake case로 네이밍을 할 때 외에도 다양한 사용처가 있습니다. 이는 아래와 같이 크게 4가지로 분류할 수 있&quot; data-og-host=&quot;tibetsandfox.tistory.com&quot; data-og-source-url=&quot;https://tibetsandfox.tistory.com/20&quot; data-og-url=&quot;https://tibetsandfox.tistory.com/20&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyro3J/hyMjq5nT5T/hrLYlgRT1Pf9OlVkj42S20/img.jpg?width=500&amp;amp;height=696&amp;amp;face=0_0_500_696,https://scrap.kakaocdn.net/dn/7NE8c/hyMjrXyihI/gde9vMkpXtg9eJ5iznji0k/img.jpg?width=500&amp;amp;height=696&amp;amp;face=0_0_500_696,https://scrap.kakaocdn.net/dn/co549M/hyMjvZWW14/JfiPjuvtPrGkkNPnuptgXk/img.jpg?width=500&amp;amp;height=696&amp;amp;face=0_0_500_696&quot;&gt;&lt;a href=&quot;https://tibetsandfox.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tibetsandfox.tistory.com/20&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyro3J/hyMjq5nT5T/hrLYlgRT1Pf9OlVkj42S20/img.jpg?width=500&amp;amp;height=696&amp;amp;face=0_0_500_696,https://scrap.kakaocdn.net/dn/7NE8c/hyMjrXyihI/gde9vMkpXtg9eJ5iznji0k/img.jpg?width=500&amp;amp;height=696&amp;amp;face=0_0_500_696,https://scrap.kakaocdn.net/dn/co549M/hyMjvZWW14/JfiPjuvtPrGkkNPnuptgXk/img.jpg?width=500&amp;amp;height=696&amp;amp;face=0_0_500_696');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파이썬(python) - _(언더바, 언더스코어)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬에서 _(이하 '언더바'로 통일)의 역할 다른 언어와 다르게 파이썬에서 언더바는 Snake case로 네이밍을 할 때 외에도 다양한 사용처가 있습니다. 이는 아래와 같이 크게 4가지로 분류할 수 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tibetsandfox.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;SE-81d0e90d-5b9e-4638-970e-e0b7fd092055&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-a02ded0a-1cfc-4bf2-9433-289b069c2338&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;어디에 쓸까?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-f20358fb-2320-43d7-bfb7-a6853a806fde&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우선 매직 메소드를 제대로 이해하기 전에 알고 넘어가야 할 것이 하나 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e4ee903a-9934-45d5-a451-e348df66c4ad&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;파이썬에 존재하는 타입들은 사실 모두 클래스&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라는 점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636613092141&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(int)     &amp;lt;class 'int'&amp;gt;
print(float)   &amp;lt;class 'float'&amp;gt;
print(str)     &amp;lt;class 'str'&amp;gt;
print(list)    &amp;lt;class 'list'&amp;gt;
print(tuple)   &amp;lt;class 'tuple'&amp;gt;
print(dict)    &amp;lt;class 'dict'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bafc47a2-1989-43eb-88c0-285142b757b9&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e4961438-2fd3-4836-9223-d50dea84862a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;뭔가 이상하지 않나요? 우리는 &lt;/span&gt;&lt;span&gt;&lt;u&gt;일상적으로 자료형끼리 연산을 사용&lt;/u&gt;&lt;/span&gt;&lt;span&gt;하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e9da54d9-f711-4c74-b1c0-8183413a6696&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터가 클래스의 인스턴스라면, &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;어떻게 인스턴스끼리 더하고(+) 빼는(-)등 연산을 할 수 있을까요?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a4dc2f60-780e-4d9a-b231-7d753549af76&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;이것을 가능하게 해 주는 것이 매직 메소드의 힘&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 미리 구현된 __add__, __sub__와 같은 &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;pre id=&quot;code_1636613123617&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(dir(int))
# 실제로 int클래스에 dir을 사용해보면 수많은 매직 메소드가 반겨준다.
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', 
'__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__',
'__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', 
'__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__',
 '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', 
'__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__',
 '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__',
 '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__',
 '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',
 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 
'numerator', 'real', 'to_bytes']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;즉 1+1 과 같은 연산을 하게 되면 내부적으로 int 클래스 내에 구현되어있는 __add__ 매직 메소드가 호출되어 미리 정의된 기능을 수행하는 거라고 생각하시면 됩니다. (자세한 예시는 아래에서 다루겠습니다.)&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-401870e1-7c4f-46d2-ba8a-82b8a8e48841&quot;&gt;
&lt;p id=&quot;SE-20732949-c591-45f6-a2ad-f83f6a7d6837&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;물론 매직 메소드가 연산만을 위해 존재하진 않습니다. 매직 메소드는 많은 종류가 존재하며 사용 목적에 따라 알맞은 메소드를 구현해서 사용하시면 됩니다. 대표적으로 자주 보는&lt;/span&gt;&lt;span&gt;&lt;b&gt; __init__ 메소드도 매직 메소드&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e47bc9ae-6882-4a24-9970-f05a37821bd6&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nh91U/btrkw5PcVFh/aqgl91DKxKfZDKkBbP9kZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nh91U/btrkw5PcVFh/aqgl91DKxKfZDKkBbP9kZ1/img.jpg&quot; data-alt=&quot;너로 정했다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nh91U/btrkw5PcVFh/aqgl91DKxKfZDKkBbP9kZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNh91U%2Fbtrkw5PcVFh%2Faqgl91DKxKfZDKkBbP9kZ1%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;597&quot; height=&quot;453&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;너로 정했다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-7d45afd1-456d-4fb4-86dd-5c5e9c90a9bd&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b9d5330d-0a1e-4a52-8bdb-15450fbbdc61&quot;&gt;
&lt;p id=&quot;SE-71d2d4eb-7a9f-4f5c-8da8-b2282b61d9d2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;종류가 꽤 많으니 대표적으로 몇 가지만 기술하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3879fd1a-2ed9-4760-b2e2-2e3c003777ff&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-d4de972d-2609-42b2-9cfb-a45b93a46191&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__new__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-096f7936-ac2d-48f4-a7c7-77fe54285936&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체를 생성할 때 가장 먼저 실행되는 메소드&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. __init__보다 먼저 실행되는게 특징이고 새로 생성된 객체를 반환합니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;첫 번째 인자로 클래스 자신이 넘어옵니다.&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt; 특수한 상황이 아니면 잘 사용하지 않는 메소드 입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-143ec17b-7afe-4621-bf97-7d4e42f4aa87&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-114245df-3d2a-4e8f-bdbb-7a912f9ed212&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-bbd64407-5e83-478c-9b02-1b418b20daf9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 우리가 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;보통 생성자라고 부르는 메소드&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. __new__ 메소드로 인해 객체가 생성되고 나면 호출됩니다. &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;데이터를 초기화 하는등의 목적으로 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5c0689d7-732e-4223-ae25-4c977dc85b2b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-d71949d5-58a3-481e-8ab9-cb5dd2ef0916&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__del__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-ff6c56f1-c69d-4637-87f9-f1bb3445fa4d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체가 소멸될 때 호출&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-51c8f4c2-a8d6-49ce-863a-d132790e0c15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-baaf42fd-4522-4012-b7f0-36d2b83f2240&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__str__, __repr__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-c5efa79e-69d8-4f9c-8a77-8dda270064f9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체의 문자열 표현을 위해 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다. 자세한 내용은 이전 포스팅을 참조해 주세요.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636613212617&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬(python) - __str__과 __repr__의 차이&quot; data-og-description=&quot;개요 파이썬 클래스의 매직 메소드(Magic Method)중 하나인 __str__ 메소드와 __repr__ 메소드의 차이점에 대해 다뤄보겠습니다. 두 메소드는 겉으로 보기에 같은 기능을 하는 것처럼 보이지만 미묘한 &quot; data-og-host=&quot;tibetsandfox.tistory.com&quot; data-og-source-url=&quot;https://tibetsandfox.tistory.com/39&quot; data-og-url=&quot;https://tibetsandfox.tistory.com/39&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ypdph/hyMjAmF8tf/26W2MJAGWAwfQhDCIIZpLK/img.jpg?width=773&amp;amp;height=429&amp;amp;face=0_0_773_429,https://scrap.kakaocdn.net/dn/ij1nE/hyMjzgXIJ4/OhXXMwwmHs9CSEmVY6Wg00/img.jpg?width=773&amp;amp;height=429&amp;amp;face=0_0_773_429,https://scrap.kakaocdn.net/dn/cKqqGX/hyMjAGXKIt/dmlKIX9COKx38xYQ56z9Wk/img.jpg?width=773&amp;amp;height=429&amp;amp;face=0_0_773_429&quot;&gt;&lt;a href=&quot;https://tibetsandfox.tistory.com/39&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tibetsandfox.tistory.com/39&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ypdph/hyMjAmF8tf/26W2MJAGWAwfQhDCIIZpLK/img.jpg?width=773&amp;amp;height=429&amp;amp;face=0_0_773_429,https://scrap.kakaocdn.net/dn/ij1nE/hyMjzgXIJ4/OhXXMwwmHs9CSEmVY6Wg00/img.jpg?width=773&amp;amp;height=429&amp;amp;face=0_0_773_429,https://scrap.kakaocdn.net/dn/cKqqGX/hyMjAGXKIt/dmlKIX9COKx38xYQ56z9Wk/img.jpg?width=773&amp;amp;height=429&amp;amp;face=0_0_773_429');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파이썬(python) - __str__과 __repr__의 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요 파이썬 클래스의 매직 메소드(Magic Method)중 하나인 __str__ 메소드와 __repr__ 메소드의 차이점에 대해 다뤄보겠습니다. 두 메소드는 겉으로 보기에 같은 기능을 하는 것처럼 보이지만 미묘한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tibetsandfox.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-19f7416a-e7cd-49d2-ac2b-40d8c84622b1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;__iter__&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-18839d4d-31f0-447f-a685-bd526f3bf545&quot;&gt;
&lt;p id=&quot;SE-4b2dbb99-b6fd-407c-8210-66044c182088&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; iterable한 객체를 만들때 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. 이 메소드가 구현되었다면 그 객체는 iterable하다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-355f4656-c0c0-41a4-ae1f-fb5df9826e38&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-0fa2d783-33ce-4cff-a00c-fbc55a966590&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__next__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-bb9032f4-8e9a-48d1-8590-063146fe55c3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; iterator를 만들 때 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. 위의 __iter__메소드와 같이 구현하면 그 객체는 iterable한 iterator가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-69729ee8-2c11-497e-b6ee-00f4159c42fe&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-449ecc83-8df4-4936-be76-90d7e86fb1ff&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;__len__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-997db2ea-238e-4e16-a91d-5123f6a560a8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체의 길이를 반환할 때 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. len()함수가 내부적으로 객체의 이 메소드를 호출합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bf43f746-dc19-487f-92db-4c46caef6b29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-9b5f7eec-705f-4c8b-bce1-b39e3430c676&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__bool__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-b96398f8-f77b-4d5a-90f0-c25f1a5b0662&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체의 boolean 표현을 나타낼 때 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-95b7b05a-a27d-47f7-8f05-aedd36243e85&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-0321b564-4a32-44fc-b8b5-a74452a9800e&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;__add__, __sub__, __mul__, __truediv__&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-4f996ce2-a4a4-4508-a5b4-06f28908f8da&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 각각&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; +, -, *, / 기호에 매핑되어 해당 연산을 할 때 호출&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f2802600-8b65-42ca-8310-1b3077f423bb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bd4e99cd-dec5-4c94-9bbf-dfd948dc7e3d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 외에도 많은 종류의 매직 메소드가 존재하니 한번쯤 찾아보시길 권합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-ad151faf-2754-4de7-b2e2-81a621bb7ee9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-ac7639dc-218a-48bf-a764-a78e361876dc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;간단하게 사용법을 익히기 위해 커스텀 클래스를 만들고, 그 클래스의 인스턴스로 사칙연산을 할 수 있게 만들어 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636613280072&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Fruit(object):
    def __init__(self, name, price):
        self._name = name
        self._price = price
        

apple = Fruit(&quot;사과&quot;, 100000)
durian = Fruit(&quot;두리안&quot;, 50000)
print(apple + durian) # TypeError 발생
print(apple._price + durian._price) # 작동은 하지만..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;우선 Fruit 라는 클래스를 만들고, 속성으로 _name과 _price를 지정해 주었습니다. &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;그리고 해당 클래스의 인스턴스, apple과 durian을 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;아직 과일 객체끼리 연산을 할 수는 없습니다.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 직접 속성에 접근하여 연산을 할 순 있지만, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;u&gt;매번 그러기엔 너무 번거롭습니다.&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 알아서 _price 속성을 기준으로 사칙연산이 된다면 참 좋을 것 같은데 말이죠..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;매직 메소드 구현으로 이를 가능하게 해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636613352308&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Fruit(object):
    def __init__(self, name, price):
        self._name = name
        self._price = price

    def __add__(self, target):
        return self._price + target._price

    def __sub__(self, target):
        return self._price - target._price

    def __mul__(self, target):
        return self._price * target._price

    def __truediv__(self, target):
        return self._price / target._price


apple = Fruit(&quot;사과&quot;, 100000)
durian = Fruit(&quot;두리안&quot;, 50000)

print(apple + durian) # 150000
print(apple - durian) # 50000
print(apple * durian) # 5000000000
print(apple / durian) # 2.0
print(f&quot;{apple}와 {durian}&quot;) # 사과와 두리안&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;각각 연산자에 매핑되는 매직 메소드들을 구현했습니다. &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;따라서 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;직접 객체끼리 연산을 하더라도 알아서 _price 속성을 기준으로 연산&lt;/span&gt;&lt;/b&gt;하는것을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;덤으로&lt;b&gt; __str__메소드도 구현하여 객체의 문자열 표현을 _name 속성&lt;/b&gt;으로 해 주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이렇게 필요한 연산이나 상황에 맞게 매직 메소드를 구현하면 객체를 좀 더 멋지게 다룰 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b5979871-0ac1-49bf-8979-0241347c93c0&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9RXmf/btrkwn9Z8vj/xZF6u6rceY9UVWFkcbt5Fk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9RXmf/btrkwn9Z8vj/xZF6u6rceY9UVWFkcbt5Fk/img.jpg&quot; data-alt=&quot;존나 멋지군?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9RXmf/btrkwn9Z8vj/xZF6u6rceY9UVWFkcbt5Fk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9RXmf%2Fbtrkwn9Z8vj%2FxZF6u6rceY9UVWFkcbt5Fk%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;500&quot; height=&quot;749&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;존나 멋지군?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8bae07aa-debf-4d3b-b982-17eb5a57119e&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-f585e87b-067e-4222-82b0-1571c2017907&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5b944742-8758-4a0f-bbc1-3ea9806d2d67&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/42</guid>
      <comments>https://tibetsandfox.tistory.com/42#entry42comment</comments>
      <pubDate>Thu, 11 Nov 2021 15:50:02 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - 클래스(class)의 특징</title>
      <link>https://tibetsandfox.tistory.com/40</link>
      <description>&lt;h3 id=&quot;SE-14d49c6c-6264-42d7-939f-433002103176&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-e40bb7db-e64a-4f4d-b0a7-8a17b3c01b5a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번 포스트에서는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;파이썬에서 클래스가 가지는 특징&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에 대해 다뤄보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클래스가 무엇인지, 어떻게 선언하는지 등 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;기초적인 내용은 다루지 않으므로 유의&lt;/b&gt;&lt;/span&gt;&lt;span&gt;해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;567&quot; data-height=&quot;440&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;440&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbmLIa/btrjR7Nn6A0/sKe3pvWQ7oU3uKoPy3LQDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbmLIa/btrjR7Nn6A0/sKe3pvWQ7oU3uKoPy3LQDk/img.jpg&quot; data-alt=&quot;걱정마세요. 구글신께서 다 알려주신답니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbmLIa/btrjR7Nn6A0/sKe3pvWQ7oU3uKoPy3LQDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbmLIa%2FbtrjR7Nn6A0%2FsKe3pvWQ7oU3uKoPy3LQDk%2Fimg.jpg&quot; data-width=&quot;567&quot; data-height=&quot;440&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;440&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;걱정마세요. 구글신께서 다 알려주신답니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-d4dc32ed-a9f7-4870-a91a-c51e007f9ee0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;클래스의 특징&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;SE-0e6856ef-4995-4e6d-8fb8-569c2f8b037b&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;1. 모든 클래스는 기본적으로 object 클래스를 상속받고 있다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-f402281e-3c03-470a-9829-0cfcde83162e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- objcet 클래스는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;최상위 클래스&lt;/b&gt;&lt;/span&gt;&lt;span&gt;로서 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;파이썬에서 선언되는 모든 클래스는 기본적으로 object 클래스를 자동으로 상속&lt;/b&gt;&lt;/span&gt;&lt;span&gt;받습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003477216&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class test: # 1
    pass

class test(): # 2
    pass

class test(object): # 3
    pass&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-03bde1f6-4ede-4481-945d-b75f67f1982d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 위의 세 가지 방법 중 어떤 방법을 사용하더라도 생성되는 클래스에 차이는 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9439d8db-592b-4f6e-b669-e3516d515050&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;1번, 2번 방법은 구 버전 파이썬(정확히는 파이썬 2의 2.2 이후 버전)에서 호환성 관련 문제&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 일으킵니다. 따라서 &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;호환성에 중점을 둬야 한다면 3번 방법으로 클래스를 선언&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-16614d6f-99b1-4067-95f9-d262c8d54170&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5f573e07-670e-4b3e-9619-e748b41f7bff&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;object 클래스는&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 특수한 메소드(매직 메소드)와 특수한 속성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 가지고 있습니다. 다른 기능이 있는 것은 아니지만 이&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; built-in 되어있는 메소드와 속성을 오버라이딩 하여 원하는 동작을&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 하게끔 만들 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-65e33a0f-87ac-43ec-acd5-e0ada59df61b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-f17511ed-e21a-4556-bbd3-6c5d1529b0e2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;2. 파이썬의 모든 자료형은 사실 클래스다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-003f93ca-e0d5-4d8e-8321-1ac3879e5bdb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;파이썬에 존재하는 모든 자료형은 클래스로서 존재&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. 따라서 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;어떤 데이터가 있을 때, 그 데이터는 자기가 속하는 자료형의 인스턴스&lt;/b&gt;&lt;/span&gt;&lt;span&gt;가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003495865&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(type(int))
# &amp;lt;class 'type'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-5a6fe65b-8b3a-4b4a-9ac0-1a8f445f9891&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;type에 int를 넣어서 출력하면 이렇게 클래스라고 알려줍니다. 이는 다른 자료형도 마찬가지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003504386&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(isinstance(1, int))   # True
print(isinstance(&quot;hi&quot;, str))# True&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-0053d148-6c37-4250-9c26-9ec72e5f9e82&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;isinstance로 확인해보면 True를 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003514927&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(dir(int))
# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', 
'__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', 
'__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', 
'__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', 
'__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', 
'__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', 
'__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', 
'__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', 
'__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 
'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 
'real', 'to_bytes']&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-eb24e8d4-3721-4c50-82a2-b8493b3d2cc2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;dir에 int를 넣어서 출력해보았습니다. 정말 많은 매직 메소드들을 가지고 있죠? 이를 통해 &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;자료형 클래스 또한 object 클래스를 상속받고 있음&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-83ba7b66-8ce5-4a56-9ffb-53d0b008b98f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;같은 자료형끼리 연산할 때 내부적으로 __add__, __mul__과 같은 매직 메소드를 사용하는데 이 내용은 추후 매직 메소드에 대해 다룰 때 다시 설명드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;457&quot; data-height=&quot;609&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;667&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bekvvL/btrjP1NIqP1/M6RJkXa2h7pbpT1Sl0e9TK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bekvvL/btrjP1NIqP1/M6RJkXa2h7pbpT1Sl0e9TK/img.jpg&quot; data-alt=&quot;다 외울 필요는 없으니 겁먹지 마세요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bekvvL/btrjP1NIqP1/M6RJkXa2h7pbpT1Sl0e9TK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbekvvL%2FbtrjP1NIqP1%2FM6RJkXa2h7pbpT1Sl0e9TK%2Fimg.jpg&quot; data-width=&quot;457&quot; data-height=&quot;609&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;667&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다 외울 필요는 없으니 겁먹지 마세요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&quot;SE-efdaa400-5afe-4f6d-b34b-679f5f2d7e00&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;3. 내부 메소드를 인스턴스 메소드(Instance method), 클래스 메소드(Class method), 스태틱 메소드(Static method)로 구분할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-0e0b8c3f-9945-4f05-bdcc-be01892cbf44&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 선언 방법과 목적에 따라 &lt;/span&gt;&lt;span&gt;&lt;b&gt;메소드를 3가지로 구분&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a27a7b7a-9f92-4203-9c95-61d3c3f8da7e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;(클래스 변수 : 클래스 전체에서 전역으로 사용되는 값. &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;생성된 모든 인스턴스에서 값을 공유&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;한다.)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d4bda4af-00ad-4432-a4b9-8f1097a096e0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;(인스턴스 변수: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;인스턴스마다 독립된 값을 가지는 변수.&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; 하나의 인스턴스에서 값을 변경해도 다른 인스턴스에 영향을 미치지 않는다.)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003578252&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test(object):
    age = 10 # 클래스 변수

    def __init__(self, name):
        self._name = name # 인스턴스 변수

    def say_hi(self):                  # 3-1. 인스턴스 메소드
        print(f&quot;hi, I'm {self._name}&quot;)

    @classmethod
    def greeting(cls):                 # 3-2. 클래스 메소드
        print(f&quot;I'm {cls.age} years old&quot;)

    @staticmethod                      # 3-3. 스태틱 메소드
    def good_bye():
        print(&quot;bye bye&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-77f8b599-d6f3-4a60-b370-b8bd92b96cd6&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;3-1. 인스턴스 메소드(Instance method)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4cf44ecd-2c93-4c43-a112-cd22285dde52&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ 일반적으로 가장 많이 사용하게 되는 유형입니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;클래스를 통해 생성한 인스턴스에서 호출&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다. 클래스가 object 클래스를 무조건 상속받듯이 인스턴스 메소드는&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 첫 번째 인자로 무조건 객체 자신을 넘겨받게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;(예시에서는 self가 객체 자신이 됩니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1350475a-80a3-4a4e-8734-557f7a208844&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 넘겨받은&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; self 인자를 통해 __init__에서 정의한 인스턴스 변수에 접근&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f14cfade-83e0-4606-b617-10fabb19d386&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;각 객체는 독립적이므로 인스턴스 메소드를 통한 행동은 메소드를 호출한 객체에게만 영향&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 미칩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003596792&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test(object):
    def __init__(self, name):
        self._name = name

    def print_name(self):  # _name 출력
        print(self._name)

    def change_name(self, name):  # _name 변경
        self._name = name


test1 = Test(&quot;A&quot;)
test2 = Test(&quot;B&quot;)
test1.print_name()  # A
test2.print_name()  # B

test2.change_name(&quot;C&quot;)  # test2의 _name을 C로 변경

test1.print_name()  # A
test2.print_name()  # C&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-47254f0e-52f2-4f7c-bd73-59e8c702abc4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;test1과 test2 객체를 생성하고 test2의 _name 값만 인스턴스 메소드를 이용해 바꾸었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-120747e7-725c-40c9-bfdd-45ead822a1f8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;test1의 _name 값은 변하지 않고 test2의 값만 변한 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9e97ff14-e6d1-4f64-b153-d09d1869c5b6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3d415a7e-be02-40a5-9cff-7b77aade9ce9&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;3-2. 클래스 메소드(Class method)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dfcb439b-b2a2-4d02-8fbd-919c8c396838&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ 클래스 메소드는 &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;p id=&quot;SE-313d9f12-ca1f-49ba-a18d-d3aa028cceeb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;@classmethod&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 라는 데코레이터를 사용하여 선언할 수 있습니다. 인스턴스 메소드처럼 첫 번째 인자로 무언가가 넘어오는데, 이는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;클래스 자신을 의미&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.(위의 예시에선 cls) 따라서 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;클래스 메소드는 인스턴스 변수나 메소드에 접근할 수 없지만&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;대신 클래스 변수에 접근이 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003616999&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test(object):
    money = 100

    @classmethod
    def add_money(cls, value):
        cls.money += value

test = Test()
test2 = Test()

print(test.money)  # 100
Test.add_money(100)
print(test2.money) # 200&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-b899ee96-e7b3-4fe3-8b51-cf4f46317192&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Test 클래스를 이용해 인스턴스를 2개 만들고 두 인스턴스를 통해 클래스 변수를 출력하였습니다. 첫 번째 print는 100을, 두 번째 print는 200을 출력하는 것으로 보아 확실히 같은 값을 공유하는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003626742&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test(object):
    def __init__(self, name, age) -&amp;gt; None:
        self._name = name
        self._age = age

    @classmethod
    def create(cls, name, age):
        return cls(name, age)


test1 = Test(&quot;춘삼이&quot;, 12)
test2 = Test.create(&quot;덕팔이&quot;, 11)

print(isinstance(test1, Test)) # True
print(isinstance(test2, Test)) # True&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-bcabd9c8-fc2d-4351-bb7b-413d0fb809e7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한 첫 번째 인자가 클래스 자신이라는 것을 활용해 클래스 메소드로 인스턴스를 직접 생성할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5f96055b-d5c6-469d-b427-63a9f35100c9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8f13b7b4-bc51-4557-93d9-32ffa7b53583&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;3-3. 스태틱 메소드(Static method)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d4d8d13c-8c43-4c0f-8f4f-b40649236450&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ 스태틱 메소드는 &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;p id=&quot;SE-dbf76a2c-f7a4-431f-8adc-a50ff1f3e213&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;@staticmethod&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 데코레이터를 이용해 선언할 수 있습니다. 언뜻 보면 클래스 메소드와 비슷해 보이지만 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;스태틱 메소드는 기본 인자로 넘어오는것이 아무것도 없습니다&lt;/b&gt;&lt;/span&gt;&lt;span&gt;. 따라서 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;스태틱 메소드는 다른 외부적인 상태에 영향을 미치지 않는 순수 함수(pure function)로서 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;유틸리티 적인 측면&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;이 강하다고 생각하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636003648063&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Test(object):
    
    @staticmethod
    def join_str(*args):
        return &quot;&quot;.join(args)


test = Test.join_str(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;)
print(test)&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-f071d360-52b4-4993-803f-861283f05b31&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;스태틱 메소드 join_str은 전적으로 args인자에만 의존합니다. 따라서&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 같은 값을 넣으면 항상 같은 결과를 반환&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. 이렇게 &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;인스턴스나 클래스 자체에 아무런 영향을 미치지 않을 때 스태틱 메소드를 사용&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;480&quot; data-height=&quot;360&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBVa7/btrjQKd4khn/zsWRMgEumNjrkkr9T3NFI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBVa7/btrjQKd4khn/zsWRMgEumNjrkkr9T3NFI0/img.jpg&quot; data-alt=&quot;참고로 이 스태틱 아닙니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBVa7/btrjQKd4khn/zsWRMgEumNjrkkr9T3NFI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBVa7%2FbtrjQKd4khn%2FzsWRMgEumNjrkkr9T3NFI0%2Fimg.jpg&quot; data-width=&quot;480&quot; data-height=&quot;360&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;참고로 이 스태틱 아닙니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/40</guid>
      <comments>https://tibetsandfox.tistory.com/40#entry40comment</comments>
      <pubDate>Thu, 4 Nov 2021 14:27:54 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - __str__과 __repr__의 차이</title>
      <link>https://tibetsandfox.tistory.com/39</link>
      <description>&lt;h3 id=&quot;SE-40e3b74b-3a4f-43e6-abda-619664dde51f&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-167f2e68-aa9e-48c6-a81a-40608c1b2f0f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬 클래스의 매직 메소드(Magic Method)중 하나인 __str__ 메소드와 __repr__ 메소드의 차이점에 대해 다뤄보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 메소드는 겉으로 보기에 같은 기능을 하는 것처럼 보이지만&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt; 미묘한 차이&lt;/span&gt;&lt;span&gt;가 있습니다. 따라서 그 차이점을 잘 알아두시는 것이 &lt;/span&gt;&lt;span&gt;&lt;s&gt;(어디가서 아는척 좀 해보기에)&lt;/s&gt;&lt;/span&gt;&lt;span&gt;좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;693&quot; data-height=&quot;384&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;429&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duTWd0/btrjjsscTha/SILTEuTXsFWZHTnbpzwOKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duTWd0/btrjjsscTha/SILTEuTXsFWZHTnbpzwOKK/img.jpg&quot; data-alt=&quot;그렇다고 진짜 아는척하고 다니면 미움받습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duTWd0/btrjjsscTha/SILTEuTXsFWZHTnbpzwOKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduTWd0%2FbtrjjsscTha%2FSILTEuTXsFWZHTnbpzwOKK%2Fimg.jpg&quot; data-width=&quot;693&quot; data-height=&quot;384&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;429&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그렇다고 진짜 아는척하고 다니면 미움받습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-91c9e15b-3c40-403f-8bd4-086a52271be7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;공통점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-40ed62c1-c93f-4da0-b28e-d178ae8482ac&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 메소드는 모두 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;&quot;객체를 문자열로 반환&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;한다는 공통점이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5d2ec2fa-f60f-4276-9d33-eeeee5b26efe&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉 사용하는 목적에는 차이가 있지만 결국 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;객체가 어떤 타입을 가졌던 간에 그것을 문자열로서 반환&lt;/b&gt;&lt;/span&gt;&lt;span&gt;한다는 점이 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a880259d-10bb-4927-b823-be4a3d636379&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;많고 많은 자료형 중 하필 &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;p id=&quot;SE-bddcad81-f246-458d-a170-91c01e1bfd22&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 객체를 문자열이 아니라 이진법으로 표현했다면.. 상상만 해도 더럽네요.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-669497d8-6ac4-476f-8386-bc101d53d1ec&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;차이점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-006b243d-77e6-4dac-9bfe-f0eb39e3de61&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그렇다면 두 메소드의 차이점은 과연 무엇일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8a32ddb2-d00e-48f8-b7c3-51b195bb0654&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위에서 잠깐 언급했듯이 두 메소드는&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt; 서로 다른 목적&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 두고 만들어졌습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6ae69803-5778-460a-be90-14df01037a77&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우선 __str__메소드에 대해 알아봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-931b19be-582c-4281-8584-e5ed707cafcf&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-56181b2a-f096-4f00-bf55-b6f4a69de60c&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;__str__ 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c2c408b5-5b3e-4e67-8b01-29e87f851abc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;결론부터 말하자면 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;__str__ 메소드는 interface로서의 역할을 수행하기 위해 존재&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8f35ac3c-c82e-4b26-9566-dc096ded39a1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;서로 다른 타입을 가진 데이터끼리 상호작용 할 때 문자열로 변환시킴으로서 상호간의 호환&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 가능하도록 만들어줍니다. 즉 &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;사용자에 좀 더 초점&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;이 맞춰져 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ebc49187-35de-480a-a932-41d3d46665e4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가장 쉬운 예시는 print문이 되겠네요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1635567403549&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 1
b = 'hi'
c = [1,2,3]

print(a,b,c) # 1 hi [1,2,3]&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-d7a45452-6281-4105-97f3-ad9c50cad937&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로 print는 내부적으로 str 메소드를 호출합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b9728331-48a0-4765-bb0b-f706938a3c75&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서로 다른 타입의 데이터임에도 불구하고 오류 없이 잘 작동하죠? __str__ 메소드를 통해&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;pre id=&quot;code_1635567418914&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class test:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f&quot;Hello, my name is {self.name}&quot;


a = 1
b = &quot;hi&quot;
c = [1, 2, 3]
test_ = test(&quot;fox&quot;)

print(a, b, c, test_)
# 1 hi [1, 2, 3] Hello, my name is fox 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-4f65eaea-049e-469a-a622-17bf30bba379&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위의 예제에 커스텀 클래스와 인스턴스를 하나 생성하고 print에 같이 넣어보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d0345829-f7fb-4542-a816-22b802090368&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;역시나 오류 없이 잘 작동되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-78c68722-8e86-4d5d-954d-45b6ff54a093&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c215dacd-b677-4ef7-962c-562037d93351&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;__repr__ 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-395f4679-992e-4f0d-bbf7-d72ab97eb50f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;__repr__ 메소드는 심플합니다. 이 메소드는 말 그대로 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;'객체를 문자열로 표현'하기 위해 존재&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;개발자에 초점&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span&gt;이 맞춰져 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-40114285-2886-4cfb-8da4-a1b315129135&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체를 문자열로 표현했다는 말 그대로&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; __repr__의 반환 값은 eval 함수에 사용 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하며, 이를 활용하여 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;새로운 객체를 만들어 내는 것도 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;__str__ 메소드의 반환 값은 eval 함수에 사용할 수 없습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-cd2f4c8e-cb83-415b-88ab-4c6502239585&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;여담&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-03ba79ab-36bb-4245-a677-caf8937c4e21&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 파이썬에 존재하는 str() 메소드와 repr()메소드에 객체를 주고 실행하면 내부적으로 해당 객체의 __str__ 메소드와 __repr__ 메소드를 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-13e5e2ca-d8c0-423c-bdc9-d2e7fa20ad17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dad36dce-4024-4ecd-9ba2-de3c2a3178af&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. __str__ 메소드를 정의하지 않았다면 __repr__ 메소드가 대신 쓰입니다. __str__ 메소드가 정의되었다면 __str__ 메소드를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2a23ca03-2d10-4797-9038-f096629558a2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cda31627-b827-4bf2-89cd-4af3dbb5bc1a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. __str__메소드는 정의되었는데 __repr__ 메소드를 정의하지 않은 상태로 repr()메소드를 사용하면 __str__메소드를 대신 사용하지 않고 __repr__ 메소드의 디폴트 값을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e313d224-9023-4a6d-917b-640b45adfd1c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-322fc3aa-1473-4585-9d43-d081a29fad68&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4. __str__ 메소드의 반환값은&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt; informal&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, __repr__ 메소드의 반환값은 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;formal &lt;/b&gt;&lt;/span&gt;&lt;span&gt;하다고 표현하기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e3bf3bf5-9040-482e-8895-491c503aeedf&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;521&quot; data-height=&quot;478&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pGPOP/btrjkyMgmQX/d6mIB4Rt6QAdSEmKebhH4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pGPOP/btrjkyMgmQX/d6mIB4Rt6QAdSEmKebhH4k/img.jpg&quot; data-alt=&quot;이제 뭐가 다른지 구분이 되시나요?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pGPOP/btrjkyMgmQX/d6mIB4Rt6QAdSEmKebhH4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpGPOP%2FbtrjkyMgmQX%2Fd6mIB4Rt6QAdSEmKebhH4k%2Fimg.jpg&quot; data-width=&quot;521&quot; data-height=&quot;478&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이제 뭐가 다른지 구분이 되시나요?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/39</guid>
      <comments>https://tibetsandfox.tistory.com/39#entry39comment</comments>
      <pubDate>Sat, 30 Oct 2021 13:17:29 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - Anconda의 필수 명령어들</title>
      <link>https://tibetsandfox.tistory.com/37</link>
      <description>&lt;h3 id=&quot;SE-fab3fb39-8e5e-4eb6-a06c-d0c28ba215f7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;시작하기 전에&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-d73760c4-490b-4deb-8f66-a390f1bbf36b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 파이썬에서의 아나콘다(Anaconda)가 무엇인지 잘 모르시는 분, 아직 설치를 못 하신 분은 이전 게시글을 먼저 확인해 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;하술할 명령어들 중 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;괄호() 안의 값들은 선택사항&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626971792928&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬(python) - 아나콘다(Anaconda)란?&quot; data-og-description=&quot;아나콘다(Anaconda)란? 아나콘다는 머신러닝이나 데이터 분석 등에 사용하는 여러가지 패키지가 기본적으로 포함되어있는 파이썬 배포판입니다. 때문에 해당 분야를 파이썬으로 접근하고자 할 때&quot; data-og-host=&quot;tibetsandfox.tistory.com&quot; data-og-source-url=&quot;https://tibetsandfox.tistory.com/36&quot; data-og-url=&quot;https://tibetsandfox.tistory.com/36&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wlUXl/hyKXZIQ9Wl/fW7k1b4L79xb6ydGjRZTu0/img.jpg?width=773&amp;amp;height=514&amp;amp;face=0_0_773_514,https://scrap.kakaocdn.net/dn/QISD6/hyKZdyLaac/klepnBQOEoKzQbIJgZbmQk/img.jpg?width=773&amp;amp;height=514&amp;amp;face=0_0_773_514,https://scrap.kakaocdn.net/dn/cbvlpK/hyKX0Vlequ/NTFFNe421XrQkhhmL4pEu1/img.jpg?width=773&amp;amp;height=514&amp;amp;face=0_0_773_514&quot;&gt;&lt;a href=&quot;https://tibetsandfox.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tibetsandfox.tistory.com/36&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wlUXl/hyKXZIQ9Wl/fW7k1b4L79xb6ydGjRZTu0/img.jpg?width=773&amp;amp;height=514&amp;amp;face=0_0_773_514,https://scrap.kakaocdn.net/dn/QISD6/hyKZdyLaac/klepnBQOEoKzQbIJgZbmQk/img.jpg?width=773&amp;amp;height=514&amp;amp;face=0_0_773_514,https://scrap.kakaocdn.net/dn/cbvlpK/hyKX0Vlequ/NTFFNe421XrQkhhmL4pEu1/img.jpg?width=773&amp;amp;height=514&amp;amp;face=0_0_773_514');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;파이썬(python) - 아나콘다(Anaconda)란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아나콘다(Anaconda)란? 아나콘다는 머신러닝이나 데이터 분석 등에 사용하는 여러가지 패키지가 기본적으로 포함되어있는 파이썬 배포판입니다. 때문에 해당 분야를 파이썬으로 접근하고자 할 때&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tibetsandfox.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-b1e403bc-3b1f-4d49-ba8c-4265817d056d&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;기본 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1626971820835&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda --version&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-09cccf29-51ee-4487-add8-550d8a6d97d1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;pre id=&quot;code_1626971826998&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda info&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-12fb3841-429b-4a38-97d1-02fc5e7376e8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;pre id=&quot;code_1626971833286&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda update conda&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-0c5f6a29-a2d4-4919-9aef-db36dbba1c43&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;conda를 최신 버전으로 업데이트&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-e69607fc-e817-49e7-8d12-3903ba31db88&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;패키지 관련 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1626971849111&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda install 패키지명(=버전) (패키지명2) (패키지명3)...&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-c919e3d8-dcde-4491-90b7-596fe0139dc2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;패키지를 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;띄어쓰기로 구분하여 여러개의 패키지를 한꺼번에 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bf891285-52b0-4fd8-88cf-537c3dc0ca8f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;패키지명 뒤에 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;=와 버전을 명시&lt;/b&gt;&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;p id=&quot;SE-3289b288-330d-4d30-9129-d9f72f2a53c9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ conda install numpy=1.1 명령어 실행시 numpy를 1.1버전으로 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-259d3cbf-3aa2-44c5-98eb-93764b035c77&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;이렇게 설치한 패키지는&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 현재 활성화 된 가상 환경에 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다. 만약&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;활성화된 가상 환경이 없다면&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; 기본 환경인 base, 즉 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;전역으로 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f96a2c6a-b840-49a6-a0e5-b08524348031&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;u&gt;pip로 패키지를 설치할 수도 있으나 conda 명령어로 패키지를 설치하는 것과 pip로 설치하는 것은 약간의 차이가 있습니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-efbc2fdd-ecef-4ffd-8ce6-812acc1a1b5e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ&lt;/span&gt;&lt;span&gt;&lt;b&gt; conda 명령어를 쓰면 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;파이썬 패키지가 아니어도 설치가 가능&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;하고, &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;의존성을 가진 패키지가 다 같이 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aa730214-9933-4311-89ae-fd7d781c4835&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ pip를 쓰면 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;파이썬 패키지만&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;설치가 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하고, &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;지정한 패키지만 단독으로 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-85a8fc66-f07d-4b0b-9511-881902c85781&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ 좀 더 자세한 차이에 대해서는 하단 링크를 참고해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626971884454&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Anaconda | Understanding Conda and Pip&quot; data-og-description=&quot;Conda and pip are often considered as being nearly identical. Although some of the functionality of these two tools overlap, they were designed and should be used for different purposes. Pip is the Python Packaging Authority&amp;rsquo;s recommended tool for instal&quot; data-og-host=&quot;www.anaconda.com&quot; data-og-source-url=&quot;https://www.anaconda.com/blog/understanding-conda-and-pip&quot; data-og-url=&quot;https://www.anaconda.com/blog/understanding-conda-and-pip&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bT0Xnb/hyKXWZHDq1/dbjDt9GeV6F5KU2D6Z3YAK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cbNmHW/hyKXP0Ayuu/sq55XwiUNX4c7G27cfGfa0/img.jpg?width=796&amp;amp;height=418&amp;amp;face=0_0_796_418&quot;&gt;&lt;a href=&quot;https://www.anaconda.com/blog/understanding-conda-and-pip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.anaconda.com/blog/understanding-conda-and-pip&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bT0Xnb/hyKXWZHDq1/dbjDt9GeV6F5KU2D6Z3YAK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cbNmHW/hyKXP0Ayuu/sq55XwiUNX4c7G27cfGfa0/img.jpg?width=796&amp;amp;height=418&amp;amp;face=0_0_796_418');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Anaconda | Understanding Conda and Pip&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Conda and pip are often considered as being nearly identical. Although some of the functionality of these two tools overlap, they were designed and should be used for different purposes. Pip is the Python Packaging Authority&amp;rsquo;s recommended tool for instal&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.anaconda.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626971894163&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda install -n 가상환경이름 패키지명&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-4a223d57-bf2e-4621-8bc8-f1bbe54a44b0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;지정한 가상 환경에 패키지를 설치합니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;활성화 된 가상 환경과 무관&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971901263&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda update 패키지명&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-55f8a961-6ab2-4c4e-89a5-c85168ba18ba&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;설치된&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; 패키지를 업데이트&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971905971&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda update --all&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-24ae6f94-95e5-47d4-ae8a-6aff43236d4e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;pre id=&quot;code_1626971911027&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda list (패키지명) (-n 가상환경이름)&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-1cc03091-3cdb-44d3-8042-286422f133df&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;p id=&quot;SE-664b2613-1389-4b25-bd98-d85a6ccd899b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 뒤에 &lt;/span&gt;&lt;span&gt;&lt;b&gt;패키지명을 인수로 추가&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하면 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;해당 패키지가 현재 가상 환경에 설치되어있는지&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 알 수 있습니다. 만약 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;설치된 패키지일 경우 해당 패키지에 대한 간단한 정보&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 같이 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c707f90e-83de-457b-9678-6f5fa626a080&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 맨 뒤에 &lt;/span&gt;&lt;span&gt;&lt;b&gt;가상 환경 이름을 인수로 추가&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하면 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;해당 가상 환경에 설치된 패키지의 목록&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 보여줍니다. 위의 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;패키지명 인수와 같이 사용 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971921017&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda search 패키지명&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-67bf35a6-7bb4-473e-bb6a-a07f37bb8e88&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;conda 저장소 내에 패키지가 존재하는지 검색&lt;/b&gt;&lt;/span&gt;&lt;span&gt;해 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c29bffc9-9037-4a04-9c1a-bf421fd40566&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 존재하는 패키지일 경우 어떤 버전이 존재하는지 주루룩 나오지만 존재하지 않는 패키지일 경우 에러가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971927635&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda remove (-n 가상환경이름) 패키지명&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-f795ab8b-ef38-4bd8-8857-54cbc77034fe&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;p id=&quot;SE-1bb614dd-42fb-4a4b-bd90-9f889b1589bc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;가상 환경 이름을 인수로 줄 경우&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;해당 가상 환경에 설치된 패키지를 삭제&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하고, 따로 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;지정하지 않으면 현재 활성화 된 가상 환경에서 패키지를 삭제&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-90aa7901-5577-4459-96ff-53b7e7b4dfd9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;가상 환경 관련 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1626971963099&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda create -n 가상환경이름 (python=파이썬버전) (anaconda)&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-445ce347-0aee-4d9d-8c83-9c32893b9015&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;p id=&quot;SE-621f20b4-f756-4a98-989d-91c4dfd5c7af&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 가상환경이름 뒤에 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;python=버전 을 인수로 추가하면 해당 버전의 파이썬으로 가상 환경을 생성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-479973ba-22e2-4878-9420-45e5189f5a88&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ㄴ ex) conda create -n hi python=3.7 &lt;/span&gt;&lt;span&gt;&lt;u&gt;명령어 실행 시 파이썬 3.7버전을 사용하는 가상 환경이 생성&lt;/u&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a545b692-a05d-4667-b9cd-85a9336ad973&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 맨 뒤에 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;anaconda를 인수로 추가하면 base에 설치된 패키지를 기본으로 다 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971971318&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda create --clone 대상가상환경이름 -n 가상환경이름&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-38b0413c-2fdc-4d2f-9975-2d6ea65e234b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;가상 환경을 복사&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;복사된 가상 환경은 대상의 패키지를 그대로 가지게 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971975900&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda env list conda info --envs&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-942ee868-8be8-4b4e-b417-27d0dbce5cdd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;pre id=&quot;code_1626971980988&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(conda) activate 가상환경이름&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-3e392aaf-6dd1-4bbf-8a21-a63aebe7da5c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&lt;b&gt;지정한 이름의 가상 환경을 활성화&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 합니다. conda 부분은 생략 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626971985166&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-8edab4d0-660d-4300-a51e-da9e436f54ac&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;pre id=&quot;code_1626971991189&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda remove -n 가상환경이름 --all conda env remove -n 가상환경이름&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-da0c5129-48d4-479b-b44f-533a88381461&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- &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;p id=&quot;SE-ba2b57df-70ba-46f1-aac6-c219804a1dae&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/37</guid>
      <comments>https://tibetsandfox.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 23 Jul 2021 01:40:04 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(python) - 아나콘다(Anaconda)란?</title>
      <link>https://tibetsandfox.tistory.com/36</link>
      <description>&lt;h3 id=&quot;SE-8cd8e24d-687c-4dd0-acd7-2a0400ce268c&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;아나콘다(Anaconda)란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-94e860ac-76f5-42fc-804f-19cfdecb2864&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아나콘다는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;머신러닝이나 데이터 분석 등에 사용하는 여러가지 패키지가 기본적으로 포함되어있는 파이썬 배포판입니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 때문에 해당 분야를 파이썬으로 접근하고자 할 때 세팅이 매우 간단해집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한 아나콘다는&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 파이썬 가상 환경을 구축하는데도 유용하게 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;내부적으로 conda라는 환경/패키지 관리자가 존재&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하며 이 conda를 통해 패키지를 설치하거나 가상 환경을 관리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;570&quot; data-height=&quot;378&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;514&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brlcOq/btq9Y6j3mBc/43GQOp7oXbu8poQKsA9dm1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brlcOq/btq9Y6j3mBc/43GQOp7oXbu8poQKsA9dm1/img.jpg&quot; data-alt=&quot;비단뱀(python)에 이어 아나콘다라니..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brlcOq/btq9Y6j3mBc/43GQOp7oXbu8poQKsA9dm1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrlcOq%2Fbtq9Y6j3mBc%2F43GQOp7oXbu8poQKsA9dm1%2Fimg.jpg&quot; data-width=&quot;570&quot; data-height=&quot;378&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;514&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비단뱀(python)에 이어 아나콘다라니..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-2bfb915d-a807-4255-96be-a40d3ba0f17b&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;아나콘다를 써야 하는 이유?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-2379d848-a290-4db0-ba85-a0d85c1788a0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;공식 홈페이지에서 설치한 파이썬은 패키지 관리자인&lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt; pip를 제외한 어떤 패키지도 추가로 설치되지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-43c83d67-16b0-4784-a6be-d0393c24e932&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;필요한 패키지를 하나하나 손수 설치&lt;/u&gt;&lt;/span&gt;&lt;span&gt;&lt;u&gt;해야 하며 가상 환경도 virtualenv등을 따로 사용해서 구축&lt;/u&gt;&lt;/span&gt;&lt;span&gt;해야 하죠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e48eb0a1-6272-4102-8398-f33c84de6a93&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;물론 &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;p id=&quot;SE-f3cd178a-0400-4c97-985f-cd3b48ae3d29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 머신러닝과 데이터 분석의 입지가 나날이 커지고 두 분야에서 파이썬이 강세를 보이는 현재 시점에선 당장은 필요없을지 몰라도&lt;/span&gt;&lt;span&gt;&lt;b&gt; 나중을 생각하면 아나콘다를 써서 나쁠 것은 없겠죠?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5c43df83-ff6b-4baf-9b5b-331e1d719685&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여차하면 그냥 가상 환경 관리자로만 써도 유용하게 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5677746d-e87d-4a05-8191-1f0fdeb015f4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;기본 용량이 크다는 것이 아나콘다의 단점&lt;/b&gt;&lt;/span&gt;&lt;span&gt;으로 꼽히는데, 이게 마음에 걸리시는 분들은 설치된 패키지의 수를 줄여 용량이 크다는 단점을 보완한 &lt;/span&gt;&lt;span&gt;&lt;b&gt;미니콘다(miniconda)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라는 것도 있으니 살펴보시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;693&quot; data-height=&quot;329&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;368&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1w8n/btq92ymmsIe/KlJjUycTT7oi9vYJxtaqOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1w8n/btq92ymmsIe/KlJjUycTT7oi9vYJxtaqOk/img.jpg&quot; data-alt=&quot;아나콘다와 미니콘다?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1w8n/btq92ymmsIe/KlJjUycTT7oi9vYJxtaqOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1w8n%2Fbtq92ymmsIe%2FKlJjUycTT7oi9vYJxtaqOk%2Fimg.jpg&quot; data-width=&quot;693&quot; data-height=&quot;329&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;368&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아나콘다와 미니콘다?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-f1895eaf-d644-46c7-8544-480f1f40df75&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;아나콘다 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-b3a208ce-399d-496d-b759-d69a510fda28&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;주의사항 : 파이썬이 이미 설치되어 있으신 분들은 반드시 삭제 후 아나콘다를 설치 해 주세요! 중복으로 설치할 경우 환경 변수 충돌 등으로 문제를 일으킬 수 있습니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5bd98fc7-7dd4-4e16-97c8-0dd1ce8fa3d1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;단, macOS나 리눅스를 이용하시는 분들은 기본 설치된 파이썬을 무시하고 설치하시면 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-312a9160-5c4f-46d4-8815-b49e86bf5e0c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-877f27d1-17aa-41aa-b688-b4fb5d740c72&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 먼저 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://www.anaconda.com/products/individual&quot;&gt;https://www.anaconda.com/products/individual&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 에서 아나콘다 설치 파일을 다운받습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626708161643&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Anaconda | Individual Edition&quot; data-og-description=&quot;Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.&quot; data-og-host=&quot;www.anaconda.com&quot; data-og-source-url=&quot;https://www.anaconda.com/products/individual&quot; data-og-url=&quot;https://www.anaconda.com/products/individual&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dyiFZy/hyKWPSDtxq/YJXky3a3b25vcYMKVetDIk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dAe6E7/hyKWIzeSir/AGf3WAmeBVzBHyywgdJb4k/img.jpg?width=796&amp;amp;height=418&amp;amp;face=0_0_796_418,https://scrap.kakaocdn.net/dn/bhftkG/hyKWSPnka5/8JYB8k5pAAxcwrKh2eBNO1/img.jpg?width=650&amp;amp;height=650&amp;amp;face=0_0_650_650&quot;&gt;&lt;a href=&quot;https://www.anaconda.com/products/individual&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.anaconda.com/products/individual&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dyiFZy/hyKWPSDtxq/YJXky3a3b25vcYMKVetDIk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dAe6E7/hyKWIzeSir/AGf3WAmeBVzBHyywgdJb4k/img.jpg?width=796&amp;amp;height=418&amp;amp;face=0_0_796_418,https://scrap.kakaocdn.net/dn/bhftkG/hyKWSPnka5/8JYB8k5pAAxcwrKh2eBNO1/img.jpg?width=650&amp;amp;height=650&amp;amp;face=0_0_650_650');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Anaconda | Individual Edition&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.anaconda.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;SE-a8ee8497-98a9-499c-9618-ba8840c8af8d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자신에게 맞는 운영 체제에 원하는 파이썬 버전으로 다운받으시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-2823bbf9-b7ee-4c5b-9c29-97401ddc4747&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 설치 파일을 실행하고 쭉쭉쭉 다음으로 넘깁니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;494&quot; data-height=&quot;384&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3Eh7/btq91pDnSKF/N8YkeZDiHQm7i3SVkTVVb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3Eh7/btq91pDnSKF/N8YkeZDiHQm7i3SVkTVVb0/img.png&quot; data-alt=&quot;2.9GB의 위엄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3Eh7/btq91pDnSKF/N8YkeZDiHQm7i3SVkTVVb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3Eh7%2Fbtq91pDnSKF%2FN8YkeZDiHQm7i3SVkTVVb0%2Fimg.png&quot; data-width=&quot;494&quot; data-height=&quot;384&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2.9GB의 위엄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-7df0097f-33e6-4d23-b325-6586eee4e155&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설치 경로는 필요하신 분만 변경하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;495&quot; data-height=&quot;384&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDH0Yz/btq94rAeJXn/bSKuFSgS3QrFKZjzy9kUIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDH0Yz/btq94rAeJXn/bSKuFSgS3QrFKZjzy9kUIK/img.png&quot; data-alt=&quot;빨간 글씨에 쫄지마세요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDH0Yz/btq94rAeJXn/bSKuFSgS3QrFKZjzy9kUIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDH0Yz%2Fbtq94rAeJXn%2FbSKuFSgS3QrFKZjzy9kUIK%2Fimg.png&quot; data-width=&quot;495&quot; data-height=&quot;384&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빨간 글씨에 쫄지마세요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-9316599f-7e43-48d0-bfa3-28629bc7c5c6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음으로 넘어가면 체크박스가 두 개 있을겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b2eea6d0-a3b1-42ba-bf51-f0848efeedc0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;첫 번째 옵션은 기본으로 해제되어 있을텐데, 이걸 꼭 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;체크&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해주세요!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e9751f01-b8c1-42d9-bf58-68d58cbd860b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0095e9;&quot;&gt;&lt;b&gt;해당 옵션은 환경변수에 아나콘다를 등록하는 옵션&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이며 이 옵션을 체크하지 않고 설치하면 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;매번 아나콘다 콘솔을 따로 띄워서 명령어를 사용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해야 합니다. (아니면 수동으로 환경변수를 등록해야 합니다) 어느쪽이든 귀찮은건 매한가지니 꼭 환경변수 등록 옵션을 체크하고 설치합시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;493&quot; data-height=&quot;385&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;385&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yeMBd/btq90mz8DP7/w9uIYrhkXEKM5sDneLkUy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yeMBd/btq90mz8DP7/w9uIYrhkXEKM5sDneLkUy1/img.png&quot; data-alt=&quot;끄읕&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yeMBd/btq90mz8DP7/w9uIYrhkXEKM5sDneLkUy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyeMBd%2Fbtq90mz8DP7%2Fw9uIYrhkXEKM5sDneLkUy1%2Fimg.png&quot; data-width=&quot;493&quot; data-height=&quot;385&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;385&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;끄읕&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-382eedfa-41d4-4e76-8e08-9d5f78353d4c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 후 인스톨이 진행되고 또 적당히 넘기다 보면 설치가 완전히 끝납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ce31a550-3be6-4004-a890-304b064cdc9a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설치가 잘 되었는지 확인해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626708202404&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda --version&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-16ba37d2-f44e-4bc7-90b2-09e7b13d9554&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령 프롬프트를 하나 띄우고 위 명령어를 입력해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;260&quot; data-height=&quot;41&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;41&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wTozt/btq9Y6EioLl/6hWkNHd9oZrFh1PXXv5hHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wTozt/btq9Y6EioLl/6hWkNHd9oZrFh1PXXv5hHk/img.png&quot; data-alt=&quot;버전 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wTozt/btq9Y6EioLl/6hWkNHd9oZrFh1PXXv5hHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwTozt%2Fbtq9Y6EioLl%2F6hWkNHd9oZrFh1PXXv5hHk%2Fimg.png&quot; data-width=&quot;260&quot; data-height=&quot;41&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;41&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버전 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-570a5e38-8ffb-4144-ad22-9792b511ba9c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같이 버전이 나온다면 설치가 정상적으로 된 것입니다. 만세!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6dc3d8f9-effd-4922-a94d-e5ede8bf3430&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아나콘다의 명령어 및 가상 환경 구축은 다음 글에서 다루겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;409&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7rlO7/btq9Y5MahLa/opk8Hq6vecDZFqhiz5ETb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7rlO7/btq9Y5MahLa/opk8Hq6vecDZFqhiz5ETb1/img.jpg&quot; data-alt=&quot;그때까지 안-녕 ​&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7rlO7/btq9Y5MahLa/opk8Hq6vecDZFqhiz5ETb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7rlO7%2Fbtq9Y5MahLa%2Fopk8Hq6vecDZFqhiz5ETb1%2Fimg.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;409&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그때까지 안-녕 ​&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/36</guid>
      <comments>https://tibetsandfox.tistory.com/36#entry36comment</comments>
      <pubDate>Tue, 20 Jul 2021 00:23:35 +0900</pubDate>
    </item>
    <item>
      <title>Optimistic UI란?</title>
      <link>https://tibetsandfox.tistory.com/35</link>
      <description>&lt;h3 id=&quot;SE-3656df7f-0c44-4bec-9dd0-52dcf27630b9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-8f3c5f9f-10b0-4c53-b75b-a35ea6004a64&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SWR을 공부하던 중 Optimistic UI라는 용어를 보게 되어 간략히 정리해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-add0851a-ffee-4751-889b-2a7a54707d98&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-a53dedaa-3521-4d39-85d8-f5dc17698961&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;Optimistic UI란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-eff674d9-07ca-423c-a2ff-45c6c92112c3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Optimistic UI(낙관적인 UI?)는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;특정 요청이 성공 할 것이라 가정을 하고 먼저 그 요청의 결과를 보여주는 방식의 UI&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. &lt;/span&gt;&lt;span&gt;&lt;u&gt;어떤 요청이 아주 높은 확률(100%는 아니더라도)로 성공한다는 보장이 있을 때, 그리고 그 요청이 너무 늦지 않은 시간 안에 응답이 온다는 보장&lt;/u&gt;&lt;/span&gt;&lt;span&gt;이 있을 때 사용할 수 있는 UI라고 생각하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;한 줄로 요약하면&lt;/span&gt;&lt;span&gt;&lt;b&gt; '안 봐도 비디오'&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 정도가 되겠네요&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;480&quot; data-height=&quot;360&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VqEFT/btq9DnNziF9/63cVT0OkmJHp0hi8DvKXWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VqEFT/btq9DnNziF9/63cVT0OkmJHp0hi8DvKXWK/img.jpg&quot; data-alt=&quot;결과가 다~ 예상이 됩니다 결과가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VqEFT/btq9DnNziF9/63cVT0OkmJHp0hi8DvKXWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVqEFT%2Fbtq9DnNziF9%2F63cVT0OkmJHp0hi8DvKXWK%2Fimg.jpg&quot; data-width=&quot;480&quot; data-height=&quot;360&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과가 다~ 예상이 됩니다 결과가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;SE-a974e997-6acf-41cd-b5da-c41b4762f4c1&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;Optimistic UI를 사용하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-4806f91c-c063-4888-b29b-edfc8e45cdc6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;요청의 응답이 도착하기도 전에 미리 그 결과를 예측해서 보여주기 때문에 &lt;/span&gt;&lt;span&gt;&lt;b&gt;유저 입장에서는 마치 즉각적으로 응답이 오는 것처럼 느껴지게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 이는 곧&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt; 사용자 경험에 긍정적인 영향&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 주겠지요?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6dd6a30a-8339-45f6-ac6d-1b1f8c15f659&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;대표적으로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;페이스북의 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;좋아요 버튼&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 Optimistic UI로 동작하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;129&quot; data-height=&quot;147&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;105&quot; data-filename=&quot;blob&quot; width=&quot;157&quot; height=&quot;180&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/otuH1/btq9GtzPmLc/K3d1ZCdk3EhEntykim9zwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/otuH1/btq9GtzPmLc/K3d1ZCdk3EhEntykim9zwK/img.png&quot; data-alt=&quot;즉시라기엔 미묘한 시간&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/otuH1/btq9GtzPmLc/K3d1ZCdk3EhEntykim9zwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FotuH1%2Fbtq9GtzPmLc%2FK3d1ZCdk3EhEntykim9zwK%2Fimg.png&quot; data-width=&quot;129&quot; data-height=&quot;147&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;105&quot; data-filename=&quot;blob&quot; width=&quot;157&quot; height=&quot;180&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;즉시라기엔 미묘한 시간&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-f0ba244f-f42d-437d-878c-cc231fa8c2dd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;좋아요 버튼을 누른 순간 즉각적으로 UI에 변화가 반영되지만, 개발자 도구의 network 탭에서 확인 해 보면 미묘하게 요청을 주고 응답을 받는 시간이 존재함을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4d15d0b8-eef0-442d-8c28-fb9b1b5c9d29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-c15873b4-da96-4167-98bb-799ab6ccde70&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-d96a7a30-d66c-4c5a-85aa-c4ad1d0b7bbc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Optimistic UI는 상당히 유용하지만 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;혹시 모를 에러 발생에 대비하는 로직은 반드시 구성 해 두어야 합니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f6edf491-6af7-4053-8d16-ad5e9d61d0b4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;요청이 정말 예기치 못한 상황으로 실패하는 경우도 있기 마련이고, &lt;/span&gt;&lt;span&gt;&lt;b&gt;이에 대한 대비가 없을 경우 사용자 입장에서는 분명 요청이 성공한 것처럼 보였는데 실제로는 실패한, 어이없는 상황을 마주&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하게 됩니다. &lt;/span&gt;&lt;span&gt;&lt;s&gt;그리고 높은 확률로 서비스에서 이탈을..&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;495&quot; data-height=&quot;277&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;168&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLW9vQ/btq9DmHR9B7/ehvFnbO5NFAx0XKcDhgHJ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLW9vQ/btq9DmHR9B7/ehvFnbO5NFAx0XKcDhgHJ1/img.jpg&quot; data-alt=&quot;서비스 개판이내요 탈퇴함미다 ㅂㅂ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLW9vQ/btq9DmHR9B7/ehvFnbO5NFAx0XKcDhgHJ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLW9vQ%2Fbtq9DmHR9B7%2FehvFnbO5NFAx0XKcDhgHJ1%2Fimg.jpg&quot; data-width=&quot;495&quot; data-height=&quot;277&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;168&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서비스 개판이내요 탈퇴함미다 ㅂㅂ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/35</guid>
      <comments>https://tibetsandfox.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 16 Jul 2021 01:01:16 +0900</pubDate>
    </item>
    <item>
      <title>파이썬(Python) - 가상 환경(Virtual Environments)</title>
      <link>https://tibetsandfox.tistory.com/34</link>
      <description>&lt;h3 id=&quot;SE-6b3d0922-a046-4a04-934f-353e3633abfa&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;가상 환경(Virtual Environments)이란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-1e52d3b9-e747-427a-a375-709be919a2f6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffef34; color: #0078cb;&quot;&gt;&lt;b&gt;가상 환경은 독립적인 파이썬 실행 환경&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 의미합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7d15b3db-f00b-4436-a380-b1f2497b823d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;각각의 &lt;/span&gt;&lt;span&gt;&lt;u&gt;가상 환경은 다른 환경에 영향을 미치지 않으며 각자 다른 종류와 버전의 패키지를 가질 수 있습니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게만 얘기하면 이해하기 힘드니 가상 환경이 왜 필요한지부터 어떤 문제를 해결해주는지 알아봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;519&quot; data-height=&quot;288&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ruUqG/btq8F7Fa9qk/iftUw0sKb9YPp0Uy3skJVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ruUqG/btq8F7Fa9qk/iftUw0sKb9YPp0Uy3skJVK/img.jpg&quot; data-alt=&quot;이름은 가상 환경이지만 매트릭스마냥 거창한 것은 아닙니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ruUqG/btq8F7Fa9qk/iftUw0sKb9YPp0Uy3skJVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FruUqG%2Fbtq8F7Fa9qk%2FiftUw0sKb9YPp0Uy3skJVK%2Fimg.jpg&quot; data-width=&quot;519&quot; data-height=&quot;288&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이름은 가상 환경이지만 매트릭스마냥 거창한 것은 아닙니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-7b7f4b09-50ab-4938-ab32-91fcf283a18d&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;가상 환경이 왜 필요한가?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-e2bc5263-d3de-4819-bd4e-2b2846d149d8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우리는 파이썬을 설치할때 기본적으로 같이 딸려오는 패키지 매니저인 &lt;/span&gt;&lt;span&gt;&lt;b&gt;pip를 이용해서 필요한 패키지를 설치할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 이렇게 pip로 설치한 패키지는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;전역으로 설치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;되기 때문에 그 어떤 파이썬 스크립트라도 제약 없이 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f9b1d0b1-b544-4427-a8bd-409e6d3099ba&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어 pip로 Numpy 모듈을 설치했다면 모든 파이썬 스크립트에서 Numpy 모듈을 사용할 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;693&quot; data-height=&quot;446&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;498&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeDLBj/btq8GnVi9ER/5Mk4Kr4R9WMlHoZ0GmMkAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeDLBj/btq8GnVi9ER/5Mk4Kr4R9WMlHoZ0GmMkAk/img.png&quot; data-alt=&quot;대충 이런 느낌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeDLBj/btq8GnVi9ER/5Mk4Kr4R9WMlHoZ0GmMkAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeDLBj%2Fbtq8GnVi9ER%2F5Mk4Kr4R9WMlHoZ0GmMkAk%2Fimg.png&quot; data-width=&quot;693&quot; data-height=&quot;446&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;498&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대충 이런 느낌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-45970d70-4c48-4637-866f-b6478fc97d37&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 프로젝트를 단 하나만 진행한다면 전역으로 패키지를 설치한다 한들 크게 문제될 것은 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9e877d53-4233-4497-8ef1-a404ceee11e8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 &lt;/span&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;프로젝트가 여러개일 경우 문제가 발생할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 예시를 하나 말씀드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6686cfee-5c10-4e9e-a2d2-1d550cdc7c6c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-145047aa-d42c-41e2-b553-51609c8f218f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 여러분은 pip로 Django 3.0 버전을 전역으로 설치한 다음 이를 이용하여 웹 서비스를 하나 만들었습니다. 생각보다 만족스러운 서비스였기에 여러분은 계속해서 유지보수 하기로 마음먹은 상황입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f4959282-4560-4980-9b3a-e874b8dbf7a3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 시간이 흘러 Django 3.1 버전이 배포되었고, 여러분은 3.1 버전으로 장고를 업데이트 합니다. 그리고 새로운 프로젝트를 시작하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-670d4900-c7e9-4815-beb8-7ab08614e377&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. 그런데 맙소사, 전에 만든 프로젝트가 갑자기 동작을 안합니다. 알고 보니 Django 3.0 버전과 3.1 버전은 호환이 되지 않는다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8a6b86a2-2d23-4286-bf84-921fc6101134&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4. 새로운 프로젝트도 진척이 꽤 된 상황. 여러분은 진퇴양난에 빠져버렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;(단순한 예시입니다! 실제로 Django 3.0 버전과 3.1 버전이 호환이 안되는 것은 아닙니다.)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;500&quot; data-height=&quot;616&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;616&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eekNEX/btq8IgtT9ZF/wfkoq6V5GoJrDkQjgSsBu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eekNEX/btq8IgtT9ZF/wfkoq6V5GoJrDkQjgSsBu1/img.jpg&quot; data-alt=&quot;대충 이런 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eekNEX/btq8IgtT9ZF/wfkoq6V5GoJrDkQjgSsBu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeekNEX%2Fbtq8IgtT9ZF%2Fwfkoq6V5GoJrDkQjgSsBu1%2Fimg.jpg&quot; data-width=&quot;500&quot; data-height=&quot;616&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;616&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대충 이런 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-78c58451-e615-4ea3-b146-7c6e1815d2c5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 무슨 문제가 발생하는지 아시겠나요?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-431cd276-13ae-4674-8a99-3e208cba1019&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ff0010;&quot;&gt;&lt;b&gt;이전에 만든 프로젝트의 패키지가 다른 버전의 패키지와 호환이 되지 않을 때 상당히 곤란해집니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 패키지는 꾸준히 업데이트 되기 때문에 언제든지 이런 문제가 발생할 수 있죠. &lt;/span&gt;&lt;span&gt;&lt;s&gt;(업데이트를 안하면 해결되는거 아닌가요? 라는 질문은 넣어두세요..)&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;SE-4fafab7b-63a9-4373-937b-86c464bb7c01&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;가상 환경의 활용과 모듈&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-047d1e2b-f274-4bcf-a4ef-554f2769fc72&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가상 환경은 상술한 문제를 해결해 줍니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f491c399-bf4a-4b12-90fe-dfadb6cec8e4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;각자 독립된 개발 환경을 제공해 주기 때문에 어떤 프로젝트는 구버전 패키지를, 어떤 프로젝트는 최신버전 패키지를 사용하는 식의 개발&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 가능해지는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d73086ea-2ebc-4b0a-95c4-f213f6c58137&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e0c263a8-7535-4ddb-b741-2f16ab57a7b8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉 그림으로 나타내면 대충 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-width=&quot;693&quot; data-height=&quot;395&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;442&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCNovL/btq8HsO738f/fVkyjhA3oeWy9ZbVGBh710/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCNovL/btq8HsO738f/fVkyjhA3oeWy9ZbVGBh710/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCNovL/btq8HsO738f/fVkyjhA3oeWy9ZbVGBh710/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCNovL%2Fbtq8HsO738f%2FfVkyjhA3oeWy9ZbVGBh710%2Fimg.png&quot; data-width=&quot;693&quot; data-height=&quot;395&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;442&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-3ef73fb9-34e8-4fbd-9a30-5254088c3449&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로, &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;파이썬 인터프리터 버전도 가상 환경에 포함&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-13185d66-c362-4f7b-9515-975f05ef5dc6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 &lt;/span&gt;&lt;span&gt;&lt;b&gt;가상 환경에 따라 파이썬 자체의 버전도 분리가 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하며, 어떤 &lt;/span&gt;&lt;span&gt;&lt;u&gt;가상 환경을 실행중일 때 파이썬 인터프리터를 실행하면 가상 환경에 설치된 파이썬 인터프리터를 실행&lt;/u&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-831cc0c8-6a34-4a2e-9a35-bd455c8ef147&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 가상 환경을 관리할 수 있는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;모듈은 대표적으로 venv, virtualenv, pipenv, conda &lt;/b&gt;&lt;/span&gt;&lt;span&gt;가 있으며 필자는 현재 conda를 사용하여 가상 환경을 관리하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7145739a-b70e-4f9f-bf32-8fc10a4dfd55&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(conda에 대해서는 다른 글에서 따로 다루겠습니다.)&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬</category>
      <author>티베트 모래여우</author>
      <guid isPermaLink="true">https://tibetsandfox.tistory.com/34</guid>
      <comments>https://tibetsandfox.tistory.com/34#entry34comment</comments>
      <pubDate>Sat, 3 Jul 2021 01:32:12 +0900</pubDate>
    </item>
  </channel>
</rss>