{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/19-12-16-list-comprehension/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"ce94b98e-9db1-5231-b18e-cd9b6d91c36d","excerpt":"얼마 전 스터디에서 개별 변수를 사용하지 않고 리스트를 굳이 왜 사용해야 하느냐는 질문을 받았다. Why should we use List? 곧 크리스마스 시즌이다. 크리스마스에 할 일도 만날 사람도 있는 Louie…","html":"<p>얼마 전 스터디에서 개별 변수를 사용하지 않고 리스트를 굳이 왜 사용해야 하느냐는 질문을 받았다.</p>\n<h1 id=\"why-should-we-use-list\" style=\"position:relative;\"><a href=\"#why-should-we-use-list\" aria-label=\"why should we use list permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why should we use List?</h1>\n<p>곧 크리스마스 시즌이다. 크리스마스에 할 일도 만날 사람도 있는 Louie 는 이번 크리스마스는 좀 색다르게 지내고자 크리스마스 파티를 계획한다.</p>\n<p>파티에 사람을 초대하기 위해 크리스마스에서 혼자서 궁상 떨만한 사람들에게 연락을 돌리려고 한다.</p>\n<p>전화번호가 가득 적혀있는 수첩을 펼쳐 전화를 걸려는데, 앗 이제보니 펜이 없다. 파티 참석자 목록 작성은 펜을 찾을 때까지 미루기로 한다.</p>\n<p>결국 전화번호가 있는 수첩 귀퉁이를 접는 것으로 참석 여부를 나누기로 결정했다.</p>\n<p>일단 가장 먼저 떠오르는 Claude 에게 연락을 한다. 할 일이 당연히 없는 그였기에 파티에 참석하기로 한다. 수첩 귀퉁이를 접자.</p>\n<p>이번에는 Ta-Gong 에게 연락한다. 예상대로 선약이 있다고 한다. 전화를 끊고 Tylo 에게 연락을 하니 역시나 참석 확정이다. 또다시 귀퉁이를 접자.</p>\n<p>그렇게 스무명에게 연락을 돌렸다. 그리고 다음날, Ta-Gong 에게 연락이 와서 아마 참석이 가능할 거 같다고 한다. 부랴부랴 연락처가 적힌 수첩 페이지로 가서 귀퉁이를 접었다.</p>\n<p>그러면 총 몇명이나 오는거지? 라고 생각하며 수첩 귀퉁이를 하나씩 세어본다. 그러는 사이 Tylo 에게 연락이 와서 갑자기 참석이 힘들 거 같다고 이야기한다.</p>\n<p>다시 또 연락처가 적힌 페이지로 가서 접힌 귀퉁이를 펴준다. 그렇게 그날 파티 참석에 대해 여러 사람들이 번복한다. 접었다 폈다가를 반복하면서 수첩은 너덜너덜해진다.</p>\n<p>어쨌든 파티 참석자가 정해졌으니, 총 몇명이나 오는지 세어보려고 한다. 귀퉁이가 접힌 부분을 세는 중에 Claude 에게 연락이 온다.</p>\n<p>이 친구는 절대로 파티에 참석하지 않는다고 하지 않을텐데? 라고 생각하며 전화를 받으니, 파티에 오는 사람이 누구누구있는지 알려달라고 부탁한다.</p>\n<p>잠시만 기다려 달라고 하며 수첩 페이지를 여기저기 옮기며 이름을 불러주니, 왜 이렇게 느리게 알려주냐며 상대방이 뭐라고 한다.</p>\n<p>그러더니만 수첩에는 없는 친구들의 이름을 몇몇 말하더니 이 친구들도 함께 갈거라고 이야기한다. 여전히 펜이 없으므로 수첩 귀퉁이만 일단 접은 채로 펜을 찾는대로 거기에다 이름을 넣으려고 한다.</p>\n<p>그런데 이런 전화들이 또 여러개가 온다. 그 친구들의 이름을 다 기억하지 못할 것을 직감한 Louie 는 결국 밖으로 나가 펜을 구입한다.</p>\n<p>펜으로 크리스마스 파티 참석자 목록을 바라보며 몇명이 오는지, 누가 오는지 확연하게 알 수 있게 되었다. 또 뒤늦게 못 갈 거 같다고 연락오는 친구의 이름에는 빗금을 살짝 쳐주는 것으로 목록에서 제거하는 것이 가능해졌다. 편하다!</p>\n<h1 id=\"코드로-보는-list\" style=\"position:relative;\"><a href=\"#%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%B3%B4%EB%8A%94-list\" aria-label=\"코드로 보는 list permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>코드로 보는 list</h1>\n<p>다소 과장된 위의 이야기는 단순히 개별적인 변수로 값들을 저장하는 것보다 리스트를 사용하는 편이 더 나은 경우이다.</p>\n<p>변수를 개별적으로 사용하는 것은 변수를 일일히 선언하고 정의하여 값을 할당해주어야 하는 문제가 발생한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">name_1 <span class=\"token operator\">=</span> <span class=\"token string\">'Claude'</span>\nname_2 <span class=\"token operator\">=</span> <span class=\"token string\">'Ta-Gong'</span>\nname_3 <span class=\"token operator\">=</span> <span class=\"token string\">'Tylo'</span>\n<span class=\"token comment\"># 이런 식으로</span></code></pre></div>\n<p>게다가 위의 경우처럼 수정 사항이 생길 때 마다 해당하는 변수를 직접 찾아야 하는 경우가 생긴다.</p>\n<p>예를 들어 <code class=\"language-text\">Tylo</code> 라는 값을 가지고 있는 변수를 찾는다고 해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">name_1 <span class=\"token operator\">=</span> <span class=\"token string\">'Claude'</span>\nname_2 <span class=\"token operator\">=</span> <span class=\"token string\">'Ta-Gong'</span>\nname_3 <span class=\"token operator\">=</span> <span class=\"token string\">'Tylo'</span>\n\n<span class=\"token keyword\">if</span> name_1 <span class=\"token operator\">==</span> <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'name_1 is Tylo'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> name_2 <span class=\"token operator\">==</span> <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'name_2 is Tylo'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> name_3 <span class=\"token operator\">==</span> <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'name_3 is Tylo'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><code class=\"language-text\">Tylo</code> 란 이름을 찾는 것만으로도 벌써 조건문을 세번이나 사용해야 했다. 게다가 만약 이름을 할당하는 변수들이 늘어난다면 조건문은 그 수만큼 더 늘어나게 된다.</p>\n<p>하지만 <code class=\"language-text\">list</code> 를 이용하면 반복문을 사용하여 아주 쉽게 찾을 수가 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">name_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ta-Gong'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">for</span> name <span class=\"token keyword\">in</span> name_list<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> name <span class=\"token operator\">==</span> <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Tylo is here'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>또한 ‘Tylo’를 목록에서 지우는 것도 아주 쉽다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">name_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ta-Gong'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>name_list<span class=\"token punctuation\">)</span>\n\nname_list<span class=\"token punctuation\">.</span>remove<span class=\"token punctuation\">(</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>name_list<span class=\"token punctuation\">)</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span>, <span class=\"token string\">'Ta-Gong'</span>, <span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span>, <span class=\"token string\">'Ta-Gong'</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>그런데 뭔가 이상한 것이 보인다. 지금까지 보아오던 함수와 약간 모양새가 다른 함수인 <code class=\"language-text\">name_list.remove('Tylo')</code> 가 있다.</p>\n<p><code class=\"language-text\">name_list</code> 는 친구 이름 리스트인데 함수처럼 사용한다고? 게다가 <code class=\"language-text\">remove</code> 라는 함수는 우리가 정의내린 적이 없는 함수이다.</p>\n<p>이전에 봤던 예시 중에 <code class=\"language-text\">friend_list.append(new_friend)</code> 라는 것도 있었다. 이것의 성격 역시 <code class=\"language-text\">remove()</code> 와 성격이 비슷하다.</p>\n<p>이처럼 <code class=\"language-text\">append()</code> 나 <code class=\"language-text\">remove()</code> 같은 함수는 <code class=\"language-text\">메소드(method)</code> 라고 부른다.</p>\n<p>일반 함수와 다른 점은, 이 메소드들은 <code class=\"language-text\">list</code> 라는 <strong>자료형태</strong>, 즉 <em>리스트(list) 타입에 종속되어있는 함수</em>이다.</p>\n<p>리스트 타입에 종속되어 있기 때문에 이 메소드들은 list 타입에서만 사용이 가능하다. 즉 <code class=\"language-text\">num = 10</code> 이라고 선언한 변수 <code class=\"language-text\">num</code> 이 있다고 할 때, <code class=\"language-text\">num.append(1)</code> 나 <code class=\"language-text\">num.remove(10)</code> 와 같은 방식으로는 사용할 수 없다는 의미이다. 변수 <code class=\"language-text\">num</code> 은 정수 타입이지 리스트 타입이 아니기 때문이다. <code class=\"language-text\">band_list = ['opeth', 'coldplay', 'radiohead']</code> 라는 리스트 타입의 변수가 있을 때 <code class=\"language-text\">band_list.append('nell')</code> 처럼은 사용이 가능하다.</p>\n<h1 id=\"마치며\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\" aria-label=\"마치며 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마치며</h1>\n<p>리스트의 개념과 사용 목적에 대해 대략적으로 알아보았다. 리스트의 메소드들은 위에서 이야기 한 두 메소드 뿐만 아니라 상당히 다양하게 있으며, 또한 다수의 리스트를 사용해서 새로운 리스트를 만들어내는 것 역시 가능하다. 하지만 리스트에 익숙해지기 위해서는 앞서 예시들에도 봤듯 반복문과 조건문도 능숙하게 사용할 줄 알아야 한다. 반복문과 조건문 없이 리스트를 사용한다면 리스트의 값을 다루는 데 한계가 많기 때문이다. 따라서 이후에는 리스트의 값을 좀 더 복잡하게 조작하고 가공하는 법을 익혀볼 예정이다.</p>","frontmatter":{"title":"list 이해하기","date":"December 16, 2019"}}},"pageContext":{"slug":"/19-12-16-list-comprehension/","previous":{"fields":{"slug":"/19-12-10-lambda-expression/"},"frontmatter":{"title":"lambda expression","category":"Python","draft":false}},"next":{"fields":{"slug":"/19-12-18-list-value-control/"},"frontmatter":{"title":"list comprehension 과 map","category":"Python","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}