<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Chaeyoon Kim - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/korean/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Chaeyoon Kim - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/korean/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 08:27:47 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/korean/news/author/chaeyoon/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 좋은 커밋 메세지 작성하는 법: 실용적인 깃(Git) 가이드 ]]>
                </title>
                <description>
                    <![CDATA[  쓸모 있는 개정 이력을 생성하기 위해 조직과 팀은 가장 먼저, 사용할 커밋 메세지 규칙에 동의해야 합니다. 이것은 개인 프로젝트도 마찬가지죠. 최근에 저는 Hashnode [https://hashnode.com/]에 **"직장에서 어떤 커밋 메세지 규칙을 사용하고 있는지"**라는 질문을 해봤는데, 몇몇 커뮤니티 유저들로부터 그들이 직장에서 또는 개인 프로젝트를 위해 사용하는 규칙에 관한 훌륭한 답변을 받았습니다. 이 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/writing-good-commit-messages-a-practical-guide/</link>
                <guid isPermaLink="false">643fa8df38553505e52529ce</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Wed, 02 Aug 2023 20:35:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/07/article-banner.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/writing-good-commit-messages-a-practical-guide/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Write Good Commit Messages: A Practical Git Guide</a>
      </p><!--kg-card-begin: markdown--><p><img src="https://www.freecodecamp.org/news/content/images/size/w1000/2019/11/article-banner.png" alt="Writing Good Commit Messages: A Practical Guide" width="600" height="400" loading="lazy"></p>
<h5 id="">쓸모 있는 개정 이력을 생성하기 위해 조직과 팀은 가장 먼저, 사용할 커밋 메세지 규칙에 동의해야 합니다. 이것은 개인 프로젝트도 마찬가지죠.</h5>
<p>최근에 저는 <a href="https://hashnode.com/">Hashnode</a>에 **"직장에서 어떤 커밋 메세지 규칙을 사용하고 있는지"**라는 질문을 해봤는데, 몇몇 커뮤니티 유저들로부터 그들이 직장에서 또는 개인 프로젝트를 위해 사용하는 규칙에 관한 훌륭한 답변을 받았습니다.</p>
<p>이 글을 통해 저는 좋은 커밋 메세지 작성하는 법과 우리가 왜 이 작성법을 따라야 하는지에 대해 설명하겠습니다.</p>
<p>이 글은 다른 글들과 함께 <a href="https://blog.bolajiayodeji.com/writing-good-commit-messages-a-practical-guide">제 블로그</a>에도 게시되었습니다.</p>
<h2 id="">깃으로 버전 컨트롤하기</h2>
<p>버전 컨트롤 소프트웨어는 현대 사회 소프트웨어 개발자 실무에 중요한 부분입니다.</p>
<p>여태껏 <a href="https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F">깃</a>은 세계에서 가장 광범위하게 사용되는 버전 컨트롤 시스템입니다. 깃은 리눅스 운영 시스템 커널의 유명 개발자인 <a href="https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%88%84%EC%8A%A4_%ED%86%A0%EB%A5%B4%EB%B0%9C%EC%8A%A4">리누스 토르발스</a>가 2005년 최초로 개발한 오픈 소스 프로젝트이며, 배포된 이후 활발히 유지돼 왔습니다.</p>
<p>깃이 처음이신가요? 공식 가이드 문서 <a href="https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%84%A4%EC%B9%98">시작하기</a> 또는 지난 대화에서 제가 드린 <a href="https://slides.com/bolajiayodeji/introduction-to-version-control-with-git-and-github">슬라이드</a>를 확인해보세요.</p>
<h2 id="">커밋 메세지란?</h2>
<p><strong>커밋</strong> 명령어는 깃 안에 staging(번역자 주: 커밋으로 저장소에 기록할 수정사항을 대기상태로 만들기)을 한 이후 로컬 리포지토리(repository)에 발생한 변화를 저장하는 데 사용됩니다. 그러나 깃에서 변경점들을 저장하기 이전에 깃에게 사용자가 만든 수 많은 수정사항 중 어떤 변경점을 저장하고 싶은 것인지 말해야 합니다. 변경점들을 구분하기 위해 굉장히 좋은 방법은 바로 <strong>커밋 메세지</strong>를 추가하는 것입니다.</p>
<h3 id="">커밋 옵션들</h3>
<ul>
<li><strong>-m</strong><br>
해당 옵션은 커밋 메세지를 설정합니다.</li>
</ul>
<pre><code class="language-bash">git add static/admin/config.yml
git commit -m "Setup multiple roles for netlify-cms git gateway"
</code></pre>
<ul>
<li><strong>-a 또는 -all</strong><br>
해당 옵션은 (새로운 걸 포함한) 모든 tracked, modified, 또는 deleted 상태의 파일들을 자동으로 커밋합니다.</li>
</ul>
<pre><code class="language-bash">git commit -a -m "Add a new role for netlify-cms git gateway"
</code></pre>
<ul>
<li><strong>--amend</strong><br>
해당 옵션은 현재 staged된 변경 사항 또는 새 커밋 메세지로 마지막 커밋을 다시 작성하며 아직 원격 저장소에 푸시되지 않은 커밋에서만 실행해야 합니다.</li>
</ul>
<pre><code class="language-bash">git add .
git commit --amend -m "Update roles for netlify-cms git gateway"
</code></pre>
<h2 id="">좋은 커밋 메세지를 써야 하는 이유</h2>
<p>어쩌면 당신은 "이건 그냥 개인 프로젝트일 뿐"이라 말할지도 몰라요. 그렇죠, 지금은 혼자 일하니까요. 하지만 어떤 팀과 함께 일할 때나 오픈 소스에 기여할 때는 어떻게 될까요?</p>
<p>잘 작성된 깃 커밋 메세지는 해당 프로젝트에서 작업하는 다른 개발자들에게 새로운 내용이나 수정사항에 대한 배경을 소통하는 최고의 방법이며 실제로 미래의 당신 스스로에게도 남겨두는 방법입니다.</p>
<p>오래된 프로젝트 중 하나에 <code>git log</code>를 실행해보고 프로젝트 초기부터 사용한 "이상한" 커밋 메세지를 발견한 적 있나요? 과거에 어떠한 작업을 왜 했는지 이해하기 어려울 수도 있고, 이 글을 좀 더 일찍 읽었길 바랄 것입니다 $:)$.</p>
<p>커밋 메세지는 어떤 변화가 왜 만들어졌는지 적절히 소통할 수 있고, 커밋 메세지의 중요성을 깨닫게 되면 개발 및 협업 작업을 더 효율적이게 할 수 있습니다.</p>
<h2 id="">깃으로 커밋 메세지 작성하는 법</h2>
<p>이전에 저는 제 개인 프로젝트에서 <code>git commit -m "Fix X to allow Y to use Z"</code>으로 어떤 제목만 적고 추가 설명은 없는 방식만 사용하였습니다. 이 방식은 <code>git commit -m "Fix typo in README.md"</code>와 같은 작고 명확한 수정사항들을 커밋할 때 적합합니다. 하지만 좀 더 큰 규모의 작업 같은 경우에는 부연설명을 추가할 필요가 있을 것입니다.</p>
<h3 id="">에디터를 활용한 방법</h3>
<p>아무런 메세지나 옵션 없이 <code>git commit</code>을 실행하면 커밋 메세지를 작성할 수 있는 기본 텍스트 에디터가 열릴 것입니다.</p>
<p>기본 에디터를 설정하려면 다음과 같은 명령어를 실행합니다.</p>
<pre><code class="language-bash">git config --global core.editor nano
</code></pre>
<p>명령어를 실행하면 깃에 기본 에디터를 nano로 설정하는 것입니다. "nano"를 "emacs", "vim", 또는 무엇이든 선호하는 에디터로 변경하세요.</p>
<p>열린 에디터 안의 첫번째 줄은 제목(및 짧은 설명)이 되고, 빈 줄 하나를 띄운 후 그 외 모든 것들이 본문 및 부연 설명으로 저장됩니다.</p>
<pre><code>&lt;Summarize change(s) in around 50 characters or less&gt;

&lt;More detailed explanatory description of the change wrapped into about 72
characters&gt;
</code></pre>
<h3 id="commandline">커맨드라인(Command Line)을 활용한 방법</h3>
<pre><code class="language-bash">git commit -m "Subject" -m "Description..."
</code></pre>
<p>첫번째 <code>-m</code> 옵션은 제목 및 짧은 설명을 가르키고 다음 <code>-m</code> 옵션은 본문 및 부연 설명을 가르킵니다.</p>
<h2 id="">좋은 커밋 메세지 작성하는 법</h2>
<p>다양한 팀과 개발자들이 좋은 커밋 메세지를 작성하기 위해 따르는 몇 가지 규칙이 있습니다. 저는 커밋 메세지를 작성하기 위한 몇 가지 일반적인 규칙과 팁에 대해서만 간략히 설명할테니 여러분이 따르고 싶은 관습을 스스로 결정하시면 됩니다. 그리고 만약 어떤 회사에서 일하거나 오픈 소스에 기여한다면 그 기관이나 프로젝트의 커밋 메세지 작성 방식을 따라 적용해야 합니다 $:)$.</p>
<p>일관성을 위해 직장 업무 볼 때는 하나의 커밋 메세지 작성법을, 개인 프로젝트일 때는 다른 방식을 사용할 수 있으며, 또한 방식 자체가 때에 따라 바뀔 수도 있습니다.</p>
<p><a href="https://hashnode.com/post/which-commit-message-convention-do-you-use-at-work-ck3e4jbdd00zyo4s1h7mc7e0g">이곳</a>에서 몇 가지 굉장한 커밋 메세지 작성법을 꼭 확인해보세요. 누군가 결정을 내리는데 도움이 될지도 모르니 본인만의 작성 규칙에 대해 적어놓아도 좋습니다.</p>
<p><a href="https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html">여기</a>에는 팀 포프(Tim Pope)가 작성한 매우 좋은 커밋 메세지 양식이 있습니다.</p>
<pre><code>(영어의 경우 대문자로) 50자 이내 짧은 요약

만약에 필요하다면 보다 자세한 설명을 여기에 쓴다. 내용은 72자 내외에서 마무리하는 것을 권장한다. 어떤 맥락에서는 첫번째 줄은 이메일의 제목처럼 취급되고 나머지가 본문으로 간주된다. 빈 칸 한 줄은 본문과 요약문 및 제목을 구분하기 위한 것으로 본문 전체를 생략하지 않은 이상 필수로 있어야 한다; rebase같은 도구들은 이 본문과 요약문 사이에 빈 칸 한 줄이 없으면 혼란스러워하는 경우도 있다.

커밋 메세지는 명령형으로 적자: 예를 들어 "Fix bug"로 적어야지 "Fixed bug"나 "Fixes bug"가 아니다. 이러한 관습은 git merge나 git revert와 같은 명령어에 의해 생성된 커밋 메세지와 일치하게 된다.

추가 문장들은 빈 칸 한 줄 뒤에 따라온다.

- 글머리 기호가 있어도 괜찮다

- 글머리는 통상적으로 하이픈(-)이나 별(*) 기호 뒤에 한 칸 띄우는 것으로 사용되고 문단과 문단 사이에는 빈 칸 한 줄을 띄우는 것으로 사용되지만 그 외 다양한 법이 존재한다

- 들여쓰기를 사용하자

이슈 트래커를 사용한다면 가장 마지막에 레퍼런스 번호를 이런 식으로 적자.

Resolves: #123
</code></pre>
<p>정말 보기 좋지 않나요? 여기 여러분의 메세지도 좋게 만들 수 있는 방법입니다.</p>
<ol>
<li>커밋의 종류를 명시하라.</li>
</ol>
<ul>
<li>feat: 어떤 특정 어플리케이션에 더할 새로운 feature</li>
<li>fix: 어떤 오류 해결(fix)</li>
<li>style: 스타일과 연관된 feature나 업데이트들</li>
<li>refactor: 코드 베이스의 특정 부분을 재정렬(refactoring)</li>
<li>test: 테스트와 관련된 모든 것</li>
<li>docs: 문서화에 관한 모든 것</li>
<li>chore: 정규 코드 유지보수.</li>
</ul>
<p>또한 커밋 종류를 표현하기 위해 이모티콘을 사용할 수도 있습니다.</p>
<ol start="2">
<li>제목을 본문으로부터 빈 칸 한 줄 띄워 구분하라</li>
<li>커밋 메세지는 어떠한 공백오류(whitespace errors)를 포함하지 않아야 한다</li>
<li>불필요한 구두점을 삭제하라</li>
<li>제목 행을 마침표(.)로 끝맺지 마라</li>
<li>(영어일 경우) 제목 행과 매 문단의 시작을 대문자로 하라</li>
<li>제목 행에는 명령어를 사용하라</li>
<li>본문 영역은 적용한 변경 사항과 그것을 만든 이유에 대해 설명하기 위해 활용하라</li>
<li>검토자들이 본래 문제가 무엇이었는지 이해하고 있을 것이라 가정하지 말고 그것을 더해 적어라</li>
<li>본인의 코드가 설명 없이도 괜찮다고 생각하지 마라</li>
<li>소속되어 있는 팀의 정해진 커밋 규칙을 따르라</li>
</ol>
<h2 id="">마치며</h2>
<p>커밋 메세지에서 가장 중요한 것은 반드시 명확하고 의미가 있어야 한다는 것입니다. 장기적으로 좋은 커밋 메세지를 작성하는 것은 커밋 메세지 작성자가 얼마나 좋은 협력자인지를 보여줍니다. 좋은 커밋 메세지를 작성하여 얻는 이점들은 팀 내에서만 국한되는 것이 아니라 개발자 본인, 또한 미래의 컨트리뷰터(contributors)에게까지 영향을 끼칩니다.</p>
<p>깃에 대해 더 배우고 전문적인 "버전 관리자"가 되고 싶나요? 여기 참고자료들을 확인해보세요:</p>
<ul>
<li><a href="https://try.github.io/">https://try.github.io/</a></li>
<li><a href="https://git-scm.com/book/en/v2">https://git-scm.com/book/en/v2</a></li>
<li><a href="https://www.git-tower.com/learn/">https://www.git-tower.com/learn/</a></li>
<li><a href="https://learngitbranching.js.org/">https://learngitbranching.js.org/</a></li>
<li><a href="https://github.com/commitizen/cz-cli">https://github.com/commitizen/cz-cli</a></li>
</ul>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 파이썬 유닛 테스팅(Unit Testing) 소개 ]]>
                </title>
                <description>
                    <![CDATA[ 얼마간의 코드 작성을 방금 끝내고나서 무엇을 해야 하는지 궁금할 것입니다. 풀 리퀘스트(pull request)를 제출하고 팀원들에게 코드 리뷰를 받을 것인가요? 또는 일일이 코드를 모두 테스트 해 볼 것인가요? 두 가지 사항 모두 반드시 해야 합니다만 추가 단계가 하나 더 있습니다: 작성한 코드에 유닛 테스트를 해서 코드가 작성된 의도대로 동작하는지 확실히 해야 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/paisseon-yunis-teseuting-unit-testing-sogae/</link>
                <guid isPermaLink="false">6418954f23c0b9e3b0d23d4f</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Mon, 20 Mar 2023 20:20:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/03/image-45-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/an-introduction-to-testing-in-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">An Introduction to Unit Testing in Python</a>
      </p><!--kg-card-begin: markdown--><h4 id="pullrequest"><em><em>얼마간의 코드 작성을 방금 끝내고나서 무엇을 해야 하는지 궁금할 것입니다. 풀 리퀘스트(pull request)를 제출하고 팀원들에게 코드 리뷰를 받을 것인가요? 또는 일일이 코드를 모두 테스트 해 볼 것인가요?</em></em></h4>
<h5 id=""><em>두 가지 사항 모두 반드시 해야 합니다만 추가 단계가 하나 더 있습니다: 작성한 코드에 유닛 테스트를 해서 코드가 작성된 의도대로 동작하는지 확실히 해야 합니다.</em></h5>
<p>유닛 테스트는 통과 또는 실패할 수 있어서, 그 자체로 코드를 점검하는 훌륭한 기법입니다. 이번 튜토리얼에서는 파이썬으로 유닛 테스트를 작성하는 방법을 보여줄텐데 그러면 여러분은 스스로의 프로젝트에 이것을 적용하는게 얼마나 쉬운지 알게 될 것입니다.</p>
<h3 id="">시작하기</h3>
<p>테스팅을 이해하는 가장 좋은 방법은 스스로 실험해보는 것입니다. 그러한 목적에 맞춰 name_function.py라는 파일 안에 간단한 함수를 작성하여 이름과 성을 가져오고 풀네임을 반환하도록 할 것입니다.</p>
<pre><code class="language-python">#Generate a formatted full name
def formatted_name(first_name, last_name):
   full_name = first_name + ' ' + last_name
   return full_name.title()
</code></pre>
<p>formatted_name() 함수는 이름과 성을 가져와 풀 네임을 형성하기 위해 두 단어 사이 빈칸을 두고 결합합니다. 그리고나서 모든 단어의 첫번째 문자를 대문자로 변환합니다. 이 코드가 작동하는지 확인하려면 이 함수 안에 사용할 몇 가지 코드를 작성해야 합니다. names.py 안에 몇 가지 간단한 코드를 작성해서 사용자들로부터 그들의 이름과 성을 입력하도록 하게끔 할 것입니다:</p>
<pre><code class="language-python">from name_function import formatted_name

print("Please enter the first and last names or enter x to E[x]it.")

while True:
   first_name = input("Please enter the first name: ")
   if first_name == "x":
       print("Good bye.")
       break

   last_name = input("Please enter the last name: ")
   if last_name == "x":
       print("Good bye.")
       break

   result = formatted_name(first_name, last_name)
   print("Formatted name is: " + result + ".")
</code></pre>
<p>이 코드는 name_function.py에서 formatted_name()를 불러와서 실행하고 사용자에게 성과 이름을 연달아 입력하게끔 허용한 다음 풀네임을 형성하여 보여줍니다.</p>
<h2 id="">유닛 테스트와 테스트 케이스</h2>
<p>파이썬 표준 라이브러리에는 unittest라고 불리는 모듈이 있어서 코드를 테스팅하는 도구를 포함하고 있습니다. 유닛 테스트는 모든 기능의 모든 특정 부분 동작이 올바른지 확인하고 나머지 부분을 훨씬 쉽게 통합합니다.</p>
<p>테스트 케이스는 하나의 기능이 의도한대로 동작하는지, 기능이 스스로를 잘 찾아내고 상황을 다룰 수 있을 것이라 예상된 전체 범위의 상황 속에서 잘 동작한다고 증명하는 유닛 테스트의 컬렉션(collection)입니다. 테스트 케이스는 어떤 함수가 사용자로부터 받을 수 있는 모든 가능한 종류의 입력을 고려해야만 하고, 그러므로 그러한 상황 각각을 대표하는 테스트를 포함해야만 합니다.</p>
<h2 id="">테스트 진행</h2>
<p>테스트를 작성하는 통상적인 시나리오들입니다:</p>
<p>우선 테스트 파일을 하나 생성해야 합니다. 그리고나서 unittest 모듈을 불러와 unittest.TestCase로부터 상속받는 테스팅 클래스를 정의하고, 마지막으로 함수의 행동에 대한 모든 경우를 테스트하는 일련의 메소드들을 작성합니다.</p>
<p>아래 코드를 한 줄씩 설명하겠습니다:</p>
<pre><code class="language-python">import unittest
from name_function import formatted_name

class NamesTestCase(unittest.TestCase):

   def test_first_last_name(self):
       result = formatted_name("pete", "seeger")
       self.assertEqual(result, "Pete Seeger")
</code></pre>
<p>첫번째로 unittest와 테스트 하고 싶은 함수, formatted_name()을 불러와야 합니다. 그리고나서 클래스 하나를 생성하는데 예를 들어 NamesTestCase라고 부르는 함수를 우리의 formatted_name() 기능에 대한 테스트를 포함하는 것이 될 수 있습니다. 이 클래스는 unittest.TestCase 클래스에서 상속받습니다.</p>
<p>NamesTestCase는 formatted_name()의 한 부분을 테스트하는 하나의 메소드를 포함하고 있습니다. 이 메소드를 test_first_last_name()이라 부를 수 있습니다.</p>
<blockquote>
<p>"test_"로 시작하는 모든 메소드들이 test_name_function.py를 실행할 때 자동으로 실행될 것을 기억하세요.</p>
</blockquote>
<p>test_first_last_name() 테스트 메소드 안에서, 테스트를 하고 싶은 함수를 부르고 반환 값을 저장합니다. 이 예제에서 우리는 formatted_name()을 "pete", "seeger"라는 인수(arguments)로 호출할 것이며 반환 값을 결과에 저장할 것입니다.</p>
<p>마지막 줄에서 우리는 선언 메소드를 사용할 것입니다. 선언 메소드는 우리가 받은 결과가 예상했던 결과와 일치하는지 검증합니다. 그리고 이 케이스에서 우리는 formatted_name() 함수가 각각의 첫번째 글자가 대문자로 지정된 풀네임을 받을 것을 알고 있고, 그래서 우리는 "Pete Seeger"라는 결과를 예상합니다. 이를 확인하기 위해서 unittest의 assertEqual() 메소드가 사용되었습니다.</p>
<pre><code class="language-python">self.assertEqual(result, “Pete Seeger”)
</code></pre>
<p>해당 라인은 기본적으로 의미하길: 결과 값을 "Pete Seeger"와 비교하고 만약 그 둘이 동일하면 OK, 일치하지 않으면 알려달라는 것을 뜻합니다.</p>
<p>test_name_function.py를 실행하면서 테스트가 통과했다는 OK 사인을 받을 것을 예상합니다.</p>
<pre><code class="language-python">Ran 1 test in 0.001s

OK
</code></pre>
<h2 id="">테스트 실패</h2>
<p>테스트에 실패하는게 어떤 것인지 보여주기 위해 formatted_name() 함수를 새로운 미들 네임 매개변수를 포함하는 것으로 수정하겠습니다.</p>
<p>그래서 이와 같은 함수를 다시 작성합니다:</p>
<pre><code class="language-python">#Generate a formatted full name including a middle name
def formatted_name(first_name, last_name, middle_name):
   full_name = first_name + ' ' + middle_name + ' ' + last_name
   return full_name.title()
</code></pre>
<p>해당 버전의 formatted_name()은 미들 네임을 가진 사람들을 위해 작동할 것이지만 테스트 할 때 함수가 미들 네임이 없는 사람들 대상으로는 동작하지 않는 것을 보게 될 것입니다.</p>
<p>그래서 test_name_function.py를 실행할 때 이와 같은 결과 값을 얻을 것입니다:</p>
<pre><code class="language-python">Error
Traceback (most recent call last):

File “test_name_function.py”, line 7, in test_first_last_name
    result = formatted_name(“pete”, “seeger”)

TypeError: formatted_name() missing 1 required positional argument: ‘middle_name’

Ran 1 test in 0.002s

FAILED (errors=1)
</code></pre>
<p>결과 값에서 어떤 부분에 테스트가 실패했는지 알기 위해 필요한 모든 걸 말해주는 정보들을 보게 될 것입니다.</p>
<ul>
<li>결과 값 첫번째 항목이 Error이며 테스트 케이스 안에 적어도 하나의 테스트가 에러 결과를 냈다는 것을 알려줍니다.</li>
<li>다음으로는 에러가 발생한 파일과 메소드를 보게 될 것입니다.</li>
<li>그 다음으로 에러가 발생한 줄을 보게 될 것입니다.</li>
<li>그리고 어떤 종류의 에러인지, 이번 경우에는 우리가 "middle_name" 매개변수를 찾을 수 없다는 것을 알 수 있습니다.</li>
<li>테스트 실행 횟수를 볼 수 있으며 테스트를 완료하기 위해 필요했던 시간, 그리고 에러가 발생한 횟수와 함께 테스트 상태를 대표하는 문자 메세지를 보게 될 것입니다.</li>
</ul>
<h2 id="">테스트 실패시 해야 하는 일</h2>
<blockquote>
<p>테스트에 통과한다는 것은 함수가 예상된 대로 동작한다는 뜻입니다. 하지만 테스트에 실패한다는 것은 앞으로 더 재미있는 것이 있다는 걸 뜻합니다.</p>
</blockquote>
<p>코드를 개선하는 대신 테스트를 변경하는 걸 선호하는 프로그래머들을 몇몇 봐 왔습니다 - 하지만 그러지 마세요. 문제를 고치는데 약간의 시간을 더 투자하면 코드를 더 잘 이해하게 될 것이고 장기적으로 봤을 때는 결국 시간을 줄이게 될 것입니다.</p>
<p>이번 예제에서 우리의 함수 formatted_name()은 먼저 두 개의 파라미터(parameters)를 요구했고, 이제 그것은 하나의 추가 요소(미들 네임)를 더 요구하는 것으로 재작성 되었습니다. 우리의 함수에 미들 네임을 더하는 것은 그 행동이 바라는 것을 동작하지 않게 합니다. 아이디어가 테스트를 변경하지 않겠다는 것이므로 가장 좋은 해결책은 미들 네임 여부를 선택할 수 있게 만드는 것입니다.</p>
<p>우리가 이 아이디어를 실행하면 예를 들어 "Pete Seeger"처럼 이름과 성이 사용되었을 때 테스트를 통과하게 만들 수 있고, 예를 들어 "Raymond Red Reddington"처럼 이름과 성, 미들네임까지 사용되었을 때도 테스트를 잘 통과하게 할 수 있습니다. 그러니 formatted_name() 코드를 한번 더 수정해 봅시다:</p>
<pre><code class="language-python">#Generate a formatted full name including a middle name
def formatted_name(first_name, last_name, middle_name=''):
   if len(middle_name) &gt; 0:
       full_name = first_name + ' ' + middle_name + ' ' + last_name
   else:
       full_name = first_name + ' ' + last_name
   return full_name.title()
</code></pre>
<p>이제 함수는 미들 네임이 있는 이름과 없는 이름 모두에게 동작할 것입니다.</p>
<p>그리고 확실히 하기 위해 "Pete Seeger"로 여전히 동작하는지 테스트를 다시 실행합니다:</p>
<pre><code class="language-python">Ran 1 test in 0.001s

OK
</code></pre>
<blockquote>
<p>그리고 이것이 제가 여러분에게 보여주고자 했던 것입니다. 코드를 테스트에 맞게 고치는 것이 다른 식으로 돌아가는 것보다 항상 더 나은 결과를 보여줍니다. 이제 미들 네임을 가지고 있는 이름들을 위해 새로운 테스트를 더해봅니다.</p>
</blockquote>
<h2 id="">새로운 테스트 더하기</h2>
<p>NamesTestCase 클래스에 미들 네임을 테스트하는 새로운 메소드를 작성합니다:</p>
<pre><code class="language-python">import unittest
from name_function import formatted_name

class NamesTestCase(unittest.TestCase):

    def test_first_last_name(self):
        result = formatted_name("pete", "seeger")
        self.assertEqual(result, "Pete Seeger")

    def test_first_last_middle_name(self):
        result = formatted_name("raymond", "reddington", "red")
        self.assertEqual(result, "Raymond Red Reddington")
</code></pre>
<p>테스트를 실행하면 통과할 것입니다:</p>
<pre><code>Ran 2 tests in 0.001s

OK
</code></pre>
<blockquote>
<p>Bra gjort!<br>
(역주: 스웨던어) 잘했어요!</p>
</blockquote>
<p>여러분은 함수가 미들 네임을 가진 이름 또는 미들 네임을 가지지 않은 이름을 이용해 동작하는지 점검하는 테스트를 작성했습니다. 파이썬 테스팅에 대해 더 많이 이야기할 파트 2를 기대해주세요.</p>
<p>읽어주셔서 감사합니다! 이와 같은 글을 여기 제 프리코드캠프 프로필에서 더 많이 확인해보세요: <a href="https://www.freecodecamp.org/news/author/goran/">https://www.freecodecamp.org/news/author/goran/</a> 그리고 제 깃허브 페이지에 다른 재미있는 것들도 찾아보세요: <a href="https://github.com/GoranAviani">https://github.com/GoranAviani</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 파이썬에서 엑셀파일을 생성 읽기, 업데이트, 검색하는 방법 ]]>
                </title>
                <description>
                    <![CDATA[ 이 글은 파이썬으로 엑셀 파일을 작업하는 방법과 특정 데이터를 수정하는 방법을 자세하게 보여줄 것입니다. 먼저 우리는 CSV 파일들을 읽고 쓰고 업데이트하는 방법을 배울 것입니다. 그리고나서 엑셀(xlsx) 파일들을 읽거나 스프레드 시트로 필터링 하고, 행/열을 검색하고 셀(cell)을 업데이트 하는 방법을 살펴 볼 것입니다. 가장 간편한 스프레드시트(spreadsheet) 형태인 CSV로 시작해봅니다. 파트 1 - ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/how-to-create-read-update-and-search-through-excel-files-using-python/</link>
                <guid isPermaLink="false">63ea8f8e35fac40657f4959d</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Tue, 14 Mar 2023 08:29:52 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/03/1_REWATbNLWv5uvpB0UKedEQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/how-to-create-read-update-and-search-through-excel-files-using-python-c70680d811d4/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to create, read, update and search through Excel files using Python</a>
      </p><!--kg-card-begin: markdown--><h5 id="">이 글은 파이썬으로 엑셀 파일을 작업하는 방법과 특정 데이터를 수정하는 방법을 자세하게 보여줄 것입니다.</h5>
<p>먼저 우리는 CSV 파일들을 읽고 쓰고 업데이트하는 방법을 배울 것입니다. 그리고나서 엑셀(xlsx) 파일들을 읽거나 스프레드 시트로 필터링 하고, 행/열을 검색하고 셀(cell)을 업데이트 하는 방법을 살펴 볼 것입니다.</p>
<p>가장 간편한 스프레드시트(spreadsheet) 형태인 CSV로 시작해봅니다.</p>
<h2 id="1csv">파트 1 - CSV 파일</h2>
<p>CSV 파일은 쉼표로 구분된 값(comma-separated values)을 가진 파일로써 간단한 문자 데이터가 행열을 갖춘 형태(tabluar format)로 보여질 수 있습니다. 어떠한 스프레드시트 프로그램에서도 사용할 수 있는데 예를 들어 마이크로소프트 오피스 엑셀, 구글 스프레드시트, 또는 LibreOffice Calc 등이 있습니다.</p>
<p>하지만 CSV 파일들은 다른 스프레드시트 파일과 같진 않은데, 왜냐하면 사용자로 하여금 셀이나 행/열, 또는 수식을 저장하게 허용하지 않기 때문입니다. 이러한 한계는 파일 하나당 하나의 시트만 저장할 수 있게 허용하는 것으로도 나타납니다. 이 글의 첫번째 파트는 Python 3와 표준 라이브러리 모듈인 CSV를 이용해서 CSV 파일을 생성하는 방법을 보여드리고자 합니다.</p>
<p>이 튜토리얼은 두 개의 깃허브(GitHub) 리포들(repositories)과 이 튜토리얼 두번째 파트의 (특정 목적이 되도록 업데이트되고 수정된) 코드를 실제로 사용하는 라이브 웹 어플리케이션으로 끝나게 될 것입니다.</p>
<h2 id="csv">CSV 파일에 작성하기</h2>
<p>첫번째로 새로운 파이썬 파일을 열고 파이썬 CSV 모듈을 불러오세요.</p>
<pre><code>import csv
</code></pre>
<h3 id="csv">CSV 모듈</h3>
<p>CSV 모듈은 모든 필수 메소드들을 내장(built in)하여 포함합니다. 그 안에는:</p>
<ul>
<li>csv.reader</li>
<li>csv.writer</li>
<li>csv.DictReader</li>
<li>csv.DictWriter</li>
<li>그리고 기타 등등이 포함되어 있습니다.</li>
</ul>
<p>이번 가이드에서 우리는 writer, DictWriter, DectReader 메소드에 초점을 맞출 것입니다. 이것들은 사용자들이 어떤 CSV 파일을 수정하고 변경하여 저장된 데이터를 조작하도록 허용합니다.</p>
<p>첫번째 단계에서 우리는 파일 이름을 정의하고 하나의 변수로 저장하는 것이 필요합니다. 반드시 헤더와 데이터 정보가 일치하게 해야 합니다.</p>
<pre><code class="language-python">filename = "imdb_top_4.csv"
header = ("Rank", "Rating", "Title")
data = [
(1, 9.2, "The Shawshank Redemption(1994)"),
(2, 9.2, "The Godfather(1972)"),
(3, 9, "The Godfather: Part II(1974)"),
(4, 8.9, "Pulp Fiction(1994)")
]
</code></pre>
<p>이제 우리는 세 개의 변수(<em>header</em>, <em>data</em>, <em>filename</em>)를 받아오게 될 <em>writer</em>라는 이름의 어떤 함수를 생성해야 합니다.</p>
<pre><code class="language-python">def writer(header, data, filename):
  pass
</code></pre>
<p>그 다음 단계는 <em>writer</em> 함수를 수정하여 어떤 파일을 생성하고 <em>header</em>, <em>data</em> 변수에서 데이터를 가져오게 하는 방법입니다. 이것은 <em>header</em> 변수의 첫번째 행을 작성하고 이어서 그 다음 <em>data</em> 변수의 네 줄을 작성하는 것으로 완료됩니다 (네 줄이 있는 이유는 배열(list) 안에 네 개의 튜플(tuples)이 있기 때문입니다).</p>
<pre><code class="language-python">def writer(header, data, filename):
  with open (filename, "w", newline = "") as csvfile:
    movies = csv.writer(csvfile)
    movies.writerow(header)
    for x in data:
      movies.writerow(x)
</code></pre>
<blockquote>
<p><a href="https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters">공식 파이썬 문서</a>에서 csv.writer 메소드가 동작하는 방법을 설명하고 있습니다. 정말 시간을 내서 읽어보길 추천드려요.</p>
</blockquote>
<p><strong>짜잔!</strong> imdb_top_4.csv라는 첫번째 파일을 생성하였습니다. 선호하는 스프레트시트 도구로 이 파일을 열어보면 아래와 같이 보일 것입니다:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*DuYsqu8EFzU15u_0HgNDKg.png" alt="1*DuYsqu8EFzU15u_0HgNDKg" width="333" height="118" loading="lazy"></p>
<h5 align="center">결과를 보기 위해 LebreOffice Calc를 사용한 모습.</h5>
<p>해당 결과는 다른 도구에서 파일을 열어본다면 아래와 같이 쓰여져 있을 수도 있습니다:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*Q0U_MBj6mr3ekidC299lbQ.png" alt="1*Q0U_MBj6mr3ekidC299lbQ" width="357" height="143" loading="lazy"></p>
<h5 align="center">결과를 보기 위해 SublimeText를 사용한 모습.</h5>
<h2 id="csv">CSV 파일 수정</h2>
<p>이 파일을 수정하기 위해서는 <em>updater</em>라는 이름의 새로운 함수를 만들어서 <em>filename</em>이라는 하나의 변수만 받아오게 할 것입니다.</p>
<pre><code class="language-python">def updater(filename):
    with open(filename, newline= "") as file:
        readData = [row for row in csv.DictReader(file)]
        # print(readData)
        readData[0]['Rating'] = '9.4'
        # print(readData)

    readHeader = readData[0].keys()
    writer(readHeader, readData, filename, "update")
</code></pre>
<p>이 함수는 먼저 <em>filename</em> 변수에 정의된 파일을을 열고 그 다음에 <em>readData</em>라고 이름된 변수 안에 파일로부터 읽어온 모든 데이터를 저장합니다. 두번째 단계는 새로운 변수를 강제로 입력하고 그것을 <em>readData[0]['rating']</em> 위치에 있는 구 데이터 대신 바꿔 넣기 위한 방법입니다.</p>
<p>이 함수의 마지막 단계는 사용자가 어떤 수정을 하고 있다는 것을 말하는 새로운 변수 <em>update</em>를 더하여 <em>writer</em> 함수를 호출하는 것입니다.</p>
<blockquote>
<p>csv.DictReader 관련 더 많은 내용은 <a href="https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters">여기</a> 파이썬 공식 문서에 설명되어 있습니다.</p>
</blockquote>
<p><em>writer</em>가 새로운 변수로 작동하게 하려면 <em>writer</em>가 정의된 모든 곳에 새로운 변수를 추가 해줘야 합니다. <em>writer</em> 함수를 처음 호출한 지점으로 돌아가서 "write"를 새로운 변수로 더해주세요:</p>
<pre><code class="language-python">writer(header, data, filename, "write")
</code></pre>
<p>바로 아래 writer 함수가 <em>updater</em>를 호출하고 <em>filename</em> 변수를 그 안으로 넘겨 주는 것을 찾으세요:</p>
<pre><code class="language-python">writer(header, data, filename, "write")
updater(filename)
</code></pre>
<p>이제 우리는 <em>writer</em> 함수가 <em>option</em>이라는 이름의 새로운 변수를 받아오게 변경해야 합니다:</p>
<pre><code class="language-python">def writer(header, data, filename, option):
</code></pre>
<p>이제부터 우리는 <em>writer</em> 함수에서 서로 다른 두 개의 옵션들(<em>write</em>와 <em>update</em>)을 받아오길 예상하겠습니다. 이것 때문에 우리는 두 개의 if문을 더해서 이렇게 설정한 새로운 기능을 지원하도록 해야 합니다. <em>if option == "write": 아래 함수</em> 첫번째 부분은 이미 기존에 알고 있는 내용입니다. 코드의 <em>elif option == "update":</em> 영역과 바로 아래에 쓰여진 <em>else</em> 부분 코드를 더하기만 하면 됩니다:</p>
<pre><code class="language-python">def writer(header, data, filename, option):
        with open (filename, "w", newline = "") as csvfile:
            if option == "write":

                movies = csv.writer(csvfile)
                movies.writerow(header)
                for x in data:
                    movies.writerow(x)
            elif option == "update":
                writer = csv.DictWriter(csvfile, fieldnames = header)
                writer.writeheader()
                writer.writerows(data)
            else:
                print("Option is not known")
</code></pre>
<p><strong>만세!</strong> 완성했어요!</p>
<p>이제 코드는 아래와 같이 보일 것입니다:<br>
<img src="https://cdn-media-1.freecodecamp.org/images/0*vPoREgLGJU8VmB5k" alt="0*vPoREgLGJU8VmB5k" width="800" height="776" loading="lazy"></p>
<h5 align="center">코드; 입출력을 담당하는 main 함수 아래 writer와 updater 함수가 있습니다. writer 함수는 csv 파일을 불러올 때 write와 update옵션을 같이 선택할 수 있도록 if-elif-else문을 사용합니다. 반면 updater 함수는 filename 변수 하나만 가지고 있으며 readData[0]['rating'] 위치에 있는 데이터를 강제로 변경합니다. </h5>
<p>이곳에서 코드를 찾으실 수도 있습니다: <a href="https://github.com/GoranAviani/CSV-Viewer-and-Editor">https://github.com/GoranAviani/CSV-Viewer-and-Editor</a></p>
<p>이 글을 첫번째 파트에서 우리는 CSV 파일을 어떻게 다루는지 보았습니다. 파일 하나를 생성해서 수정해 보았습니다.</p>
<h2 id="2xlsx">파트 2 - 엑셀(xlsx) 파일</h2>
<p>주말 몇 번에 이어 이 프로젝트를 진행하고 있습니다. 처음 시작은 저희 회사에 이와 같은 솔루션이 필요해서였습니다. 첫번째 생각은 이 해결책을 직접 저희 회사 시스템에 구축하는 것이었으나, 그러면 저는 글에 아무것도 쓰지 못하겠네요 그렇죠?</p>
<p>저는 Python 3와 <em>openpyxl</em> 라이브러리를 사용해 솔루션을 만들었습니다. 제가 <em>openpyxl</em> 을 선택한 이유는 워크시트(worksheets)를 생성하고 불러와 업데이트하고 이름을 변경하거나 삭제하는 데 있어서 완벽한 솔루션이기 때문입니다. 또한 우리가 행렬을 읽고 쓰고, 셀을 병합하거나 병합 해제하고, 파이썬 엑셀 차트를 만드는 등의 기능을 허용하는 방법입니다.</p>
<h2 id="openpyxl">Openpyxl 용어와 기본 정보</h2>
<ul>
<li>Workbook은 Openpyxl에서 엑셀 파일 이름입니다.</li>
<li>하나의 workbook은 기본 하나 (이상 여러개) sheet로 구성됩니다. sheet는 이름으로 참조됩니다.</li>
<li>하나의 sheet는 숫자 1부터 시작하는 행(가로 선)과 문자 A로 시작하는 열(세로 선)로 구성됩니다.</li>
<li>행렬은 격자 구조를 이루어 셀을 형성하고 그 안에 어떤 데이터 (수치 또는 문자 값) 또는 공식을 담을 수 있습니다.</li>
</ul>
<blockquote>
<p>Openpyxl은 문서화가 잘 되어 있으니 <a href="https://openpyxl.readthedocs.io/en/stable/">여기</a>를 한번 살펴보시길 추천드립니다.</p>
</blockquote>
<p>첫번째 단계는 파이썬 환경을 열고 터미널 안에 <em>openpyxl</em> 을 설치하는 것입니다:</p>
<pre><code class="language-python">pip install openpyxl
</code></pre>
<p>다음으로 <em>openpyxl</em> 을 프로젝트 안에 불러와서 <em>theFile</em> 변수로 workbook을 실행합니다.</p>
<pre><code class="language-python">import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
print(theFile.sheetnames)
currentSheet = theFile['customers 1']
print(currentSheet['B4'].value)
</code></pre>
<p>보시다시피 이 코드는 모든 sheet를 이름으로 출력합니다. 그리고나서 "customers 1"이라고 이름 붙여진 sheet를 선택해 <em>currentSheet</em> 변수로 저장합니다. 마지막 줄에서 코드는 "customers 1" sheet의 B4 자리에 위치하는 값을 출력합니다.</p>
<p>이 코드는 의도한 대로 동작하긴 하지만 매우 하드 코딩(hard coded)되어 있습니다. 좀 더 동적으로 만들기 위해 우리는 이러한 기능을 하는 코드를 작성하게 될 것입니다:</p>
<ul>
<li>파일을 읽는다</li>
<li>모든 sheet의 이름을 가져온다</li>
<li>모든 sheet를 돌아 순환한다</li>
<li>마지막 단계에서 코드는 workbook 안에서 각각 찾아낸 sheet의 B4 영역에 위치한 값을 출력한다.</li>
</ul>
<pre><code class="language-python">import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


for x in allSheetNames:
    print("Current sheet name is {}" .format(x))
    currentSheet = theFile[x]
    print(currentSheet['B4'].value)
</code></pre>
<p>이전보다는 나아졌지만 여전히 하드 코딩된 솔루션이고 여전히 우리가 B4 셀을 찾아볼 것이라는 걸 가정하고 있습니다, 바보같이 말이죠.</p>
<p>제가 예상하기에 당신의 프로젝트는 어떤 특정 값을 위해 엑셀 파일에 있는 모든 sheet 내부를 검색할 필요가 있을 것입니다. 이를 위해 우리는 "ABCDEF" 범위 안에 하나의 for 반복문을 더한 다음 셀 이름과 값을 간단히 출력하게 할 것입니다.</p>
<pre><code class="language-python">import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
    # print(currentSheet['B4'].value)

    #print max numbers of wors and colums for each sheet
    #print(currentSheet.max_row)
    #print(currentSheet.max_column)

    for row in range(1, currentSheet.max_row + 1):
        #print(row)
        for column in "ABCDEF":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            #print(cell_name)
            print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
</code></pre>
<p>우리는 "for row in range.." 반복문을 도입하여 이를 실행했습니다. for 반복문 안에 범위는 1번 행에 있는 셀에서부터 시작해서 sheet에 있는 최대 값 행까지로 정의되었습니다. 두번째 for 반복문은 사전에 정해진 열 이름 "ABCDEF" 안에서 검색을 수행합니다. 두번째 구문 안에서 우리는 셀의 위치(열 이름과 행 번호 모두)와 그 값을 보여주게 될 것입니다.</p>
<p>그러나, 이 글에서 저의 과제는 "telephone"이라 이름지어진 특정 열을 찾아서 해당 열의 모든 행을 훑어 가는 것입니다. 이를 위해 우리는 코드를 아래와 같이 수정할 필요가 있습니다.</p>
<pre><code class="language-python">import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


def find_specific_cell():
    for row in range(1, currentSheet.max_row + 1):
        for column in "ABCDEFGHIJKL":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            if currentSheet[cell_name].value == "telephone":
                #print("{1} cell is located on {0}" .format(cell_name, currentSheet[cell_name].value))
                print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
                return cell_name

for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
</code></pre>
<p>이 수정된 코드는 모든 sheet에 모든 값을 훑어 보고 바로 전에 한 것과 같이 행의 범위가 동적이며 열의 범위가 정적입니다. 이 코드는 셀을 통해 반복되고 어떤 문자 값 "telephone"을 가지고 있는 셀을 찾게 됩니다. 한번 코드가 특정 값을 찾고 나면 사용자에게 어느 셀 안에 그 문자가 위치하고 있는지 알려줍니다. 코드는 이와 같은 행동을 그 엑셀 파일 안 모든 sheet 안에 있는 모든 셀에게 수행합니다.</p>
<p>다음 단계는 특정 값이 있는 모든 행을 훑고 값을 출력하는 법입니다.</p>
<pre><code class="language-python">import openpyxl

theFile = openpyxl.load_workbook('Customers1.xlsx')
allSheetNames = theFile.sheetnames

print("All sheet names {} " .format(theFile.sheetnames))


def find_specific_cell():
    for row in range(1, currentSheet.max_row + 1):
        for column in "ABCDEFGHIJKL":  # Here you can add or reduce the columns
            cell_name = "{}{}".format(column, row)
            if currentSheet[cell_name].value == "telephone":
                #print("{1} cell is located on {0}" .format(cell_name, currentSheet[cell_name].value))
                print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))
                return cell_name

def get_column_letter(specificCellLetter):
    letter = specificCellLetter[0:-1]
    print(letter)
    return letter

def get_all_values_by_cell_letter(letter):
    for row in range(1, currentSheet.max_row + 1):
        for column in letter:
            cell_name = "{}{}".format(column, row)
            #print(cell_name)
            print("cell position {} has value {}".format(cell_name, currentSheet[cell_name].value))



for sheet in allSheetNames:
    print("Current sheet name is {}" .format(sheet))
    currentSheet = theFile[sheet]
    specificCellLetter = (find_specific_cell())
    letter = get_column_letter(specificCellLetter)

    get_all_values_by_cell_letter(letter)
</code></pre>
<p>어떤 열의 문자를 찾는 <em>get_column_letter</em> 라는 이름의 함수를 더하여 완성되었습니다. 어떤 열의 문자를 찾은 다음에는 해당 특정 열의 모든 행을 돌아 순환합니다. 해당 셀들의 모든 값을 출력하게 될 <em>get_all_values_by_cell_letter</em> 함수를 통해 완성되었습니다.</p>
<h2 id="">마무리하며</h2>
<p>아주 잘 했어요! 이 다음에 할 수 있는 많은 것들이 있습니다. 저의 계획은 어떤 온라인 앱을 만들어서 어떤 문자 박스에서 가져온 모든 스웨덴 전화번호를 표준화 하고 사용자에게는 같은 문자 박스에서 결과를 단지 복사만 할 수 있는 가능성을 제공하는 것이었습니다. 제 계획의 두번째 단계는 엑셀 파일을 업로드를 지원하는 웹 어플리케이션 기능을 확장해서 그 파일들 안에 있는 전화번호를 가공(즉, 스웨덴 양식으로 표준화)하고 가공된 파일을 사용자에게 되돌려 주는 것을 제안하는 것이었습니다.</p>
<p>읽어주셔서 감사합니다! 개인 Medium 프로필에서 더 많은 글을 확인하세요:<a href="https://medium.com/@goranaviani">https://medium.com/@goranaviani</a> 그리고 깃허브 페이지에서는 제가 만든 다른 재미있는 것들을 찾을 수 있습니다: <a href="https://github.com/GoranAviani">https://github.com/GoranAviani</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 6살 아이에게 객체 지향 프로그래밍 개념 설명하는 방법 ]]>
                </title>
                <description>
                    <![CDATA[ 잡 인터뷰에서 항상 질문받는 상투적 질문들이 같은 말을 계속해서 반복하고 있다는 것을 눈치채셨나요? 무슨 말인지 아실 거라고 믿어요. 예를 들어:  * 5년 전에 당신은 무엇을 보고있습니까?    또는 심지어:  * 당신의 가장 큰 약점은 무엇이라 생각합니까? 잠깐 쉬어볼게요. 이러한 질문에 대답하고 있는게 큰 약점일까 생각할 정도에요! ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/6sal-aiege-gaegce-jihyang-peurogeuraeming-gaenyeom-seolmyeonghaneun-bangbeob/</link>
                <guid isPermaLink="false">63e92cd335fac40657f49580</guid>
                
                    <category>
                        <![CDATA[ Programming ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Mon, 13 Feb 2023 05:36:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/02/1_EirXoYV7GgRi4frvcW-b0A.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to explain object-oriented programming concepts to a 6-year-old</a>
      </p><!--kg-card-begin: markdown--><p>잡 인터뷰에서 항상 질문받는 상투적 질문들이 같은 말을 계속해서 반복하고 있다는 것을 눈치채셨나요?</p>
<p>무슨 말인지 아실 거라고 믿어요.</p>
<p>예를 들어:</p>
<ul>
<li>5년 전에 당신은 무엇을 보고있습니까?<br>
또는 심지어:</li>
<li>당신의 가장 큰 약점은 무엇이라 생각합니까?</li>
</ul>
<p>잠깐 쉬어볼게요. 이러한 질문에 대답하고 있는게 큰 약점일까 생각할 정도에요! 어쨌든 이건 제가 말하려는 건 아니구요.</p>
<p>이와 같은 질문들이 진부할도 수 있지만 중요한 이유는 그것들이 당신에 대한 실마리를 주기 때문입니다. 당신의 현재 마음가짐, 태도, 관점들이요.</p>
<p>대답할 때는 반드시 주의해야 하는데 아마도 그 무언가를 나중에 후회할 수도 있기 때문입니다. 오늘 저는 프로그래밍 세계에서 비슷한 종류의 질문 한 가지에 대해 이야기하려 합니다:</p>
<ul>
<li>객체 지향 프로그래밍의 주요 목적은 무엇인가요?</li>
</ul>
<p>저는 이 질문을 받기도 하고 주기도 한 양쪽 입장에 있어왔습니다. 이것은 꽤 자주 질문되는 주제 중 하나이기 때문에 몰라서는 안됩니다.</p>
<p>주니어와 신입 단계의 개발자라면 보통 대답해야만 합니다. 왜냐면 면접관들이 다음 세 가지를 말하기 쉬운 방법이기 때문입니다:</p>
<ol>
<li><strong>후보자가 이번 인터뷰를 준비했는가?</strong><br>
즉각적인 대답을 듣는다면 추가점입니다 - 면접에 진지한 접근을 보여주니까요.</li>
<li><strong>후보자가 튜토리얼 단계를 지났는가?</strong><br>
객체 지향 프로그래밍(OOP)의 원리에 대해 이해하는 것은 당신이 튜토리얼에서 복사 붙여넣기를 하는 단계를 넘어섰다는 것을 보여줍니다 - 이미 그러한 것들을 더 높은 관점에서 보고 있으니까요.</li>
<li><strong>후보자의 이해도가 깊고 좁은가?</strong><br>
이 질문에 대한 완성 수준은 종종 <strong>대부분의 다른 주제</strong>에 대한 완성 수준과 동일합니다. 저를 믿어보세요.</li>
</ol>
<p>객체 지향 프로그래밍의 네 가지 원리는 <strong>캡슐화(encapsulation)</strong>, <strong>추상화(abstraction)</strong>, <strong>상속(inheritance)</strong>, **다형성(polymorphism)**입니다.</p>
<p>이러한 단어들은 어쩌면 주니어 개발자에게 무섭게 들릴지도 모르겠습니다. 또한 위키피디아의 복잡하고, 과도하게 긴 설명들이 종종 혼란을 가중시키곤 합니다.</p>
<p>제가 각각의 개념에 대해 간단하고 짧으면서도 명료한 설명을 전달하고 싶어하는 이유입니다. 어쩌면 아이에게 설명하는 것 처럼 들릴수도 있지만 사실은 제가 인터뷰를 볼 때 이러한 대답들을 정말 듣고 싶습니다.</p>
<h3 id="encapsulation">캡슐화(encapsulation)</h3>
<p>우리가 어떤 프로그램을 가지고 있다고 합시다. -프로그램 안에 정의된 규칙에 따라서- 서로 전달을 주고 받는 몇 가지 논리적으로 다른 객체들을 가지고 있습니다.</p>
<p>캡슐화는 각각의 객체들이 클래스 안에서 그들의 상태를 프라이빗(private) 유지할 때 획득할 수 있습니다. 다른 객체들이 그 상태에 대한 직접 접근할 수 없습니다. 대신 그들은 -메소드라고 불리는- 퍼블릭(public) 함수 목록만을 호출할 수 있습니다.</p>
<p>그래서 객체는 자신의 상태를 메소드를 통해 관리합니다 - 그리고 어떤 다른 클래스라도 예외적으로 허용되지 않는 이상 그것을 건드릴 수 없습니다. 만약 해당 객체와 전달을 주고받고 싶다면 제공된 메소드를 사용해야만 합니다. 하지만 (기본적으로) 그 상태를 변경할 수 없습니다.</p>
<p>작은 심즈(Sims) 게임을 만들고 있다고 가정해봅시다. 사람들이 있고 고양이 한 마리가 있습니다. 다른 사람들과 고양이들이 각자 소통합니다. 우리는 캡슐화를 적용하고 싶으니 모든 "고양이" 로직을 <code>Cat</code> 클래스 안에 캡슐화 합니다. 아마 아래와 같이 보일 것입니다:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/M4t8zW9U71xeKSlzT2o8WO47mdzrWkNa4rWv" alt="고양이 프로그램을 도표 흐름으로 보여주고 있다. Cat은 Sleep, Play, Feed 각각으로 자신의 상태를 전송한다." width="800" height="522" loading="lazy"></p>
<h6 align="center">고양이를 먹일 수 있습니다. 그러나 고양이가 얼마나 배가 고픈지는 직접 변경할 수 없습니다.</h6>
<p>여기 고양이의 "상태"는 <strong>프라이빗 변수(private variables)</strong> <code>mood</code>, <code>hungry</code>, <code>energy</code>입니다. 또한 프라이빗 메소드 <code>meow()</code>를 가지고 있습니다. 원할 때마다 호출할 수 있고 그 외 다른 클래스들은 meow를 할 때 고양이를 말할 수 없습니다.</p>
<p>그들이 할 수 있는 것은 **퍼블릭 메소드(public methods)**안에 정의된 <code>sleep()</code>, <code>play()</code>, <code>feed()</code>입니다. 각각은 내부 상태를 어떤 식으로 수정하고 어쩌면 <code>meow()</code>를 불러올 수도 있습니다. 그렇게 프라이빗 상태와 퍼블릭 메소드 사이 결합이 만들어집니다.</p>
<p>이것이 캡슐화입니다.</p>
<h3 id="abstraction">추상화(abstraction)</h3>
<p>추상화는 캡슐화에 자연적 연장으로 생각될 수 있습니다.</p>
<p>객체 지향 디자인에서 프로그램들은 종종 엄청나게 큽니다. 그리고 구분된 객체들이 서로 다른 것들과 많이 소통합니다. 그래서 이와 같은 대규모 코드 베이스(codebase)를 수년 동안 -도중에 변경하면서- 유지하는 것은 어렵습니다.</p>
<p>추상화는 이러한 문제를 쉽게 하기 위한 개념입니다.</p>
<p>추상화를 적용한다는 것은 각각의 객체가 반드시 그를 사용하는 하나의 상위 개념 동작 방식(mechanism)에<strong>만</strong> 노출되어야 합니다.</p>
<p>동작 방식은 내부 구현 상세 내용을 숨겨야만 합니다. 다른 객체들에게 연관된 동작들만 밝혀야 합니다.</p>
<p>생각해봅시다 - 커피 머신 하나를요. 후드 아래에서 많은 것을 하고 시끄러운 소리를 만들어냅니다. 그러나 당신이 해야 하는 일이라고는 커피를 넣고 버튼을 누를는 것이 전부입니다.</p>
<p>동작 방법은 선호하도록 사용하기 쉬워야만하고 시간이 지날 수록 거의 바뀌지 않아야만 합니다. 이것을 어떠한 다른 클래스라도 그게 어떻게 일하는지 "알지" 못하는 채로 호출하는 퍼블릭 메소드들의 작은 집합이라고 생각하세요.</p>
<p>추상화의 또 다른 실생활 예제요?<br>
휴대폰을 어떻게 사용하는지 생각해보세요:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/hiX0NQOcZFShroq-a3FM5pFP2LV4UUI5mLle" alt="휴대폰 사용 개념을 도식화하여 보여주고 있다. 휴대폰은 사람을 바라보고 간단한 동작을 취하라고 하지만 실제 뒤에서는 홈 버튼, 볼륨 버튼, 충전 입력 각각에 대한 기능이 세분화된다." width="796" height="451" loading="lazy"></p>
<h6 align="center">휴대폰은 복잡합니다. 그러나 그걸 사용하는 것은 간단합니다.</h6>
<p>휴대폰과 상호 작용은 단지 몇 개의 버튼을 사용하는 것 뿐입니다. 후드 아래 어떤 일이 일어나고 있냐구요? 당신이 알 필요가 없습니다 - 구현 상세 내용은 숨겨져 있습니다. 알아야 할 것은 짧은 동작 집합일 뿐입니다.</p>
<p>구현은 바뀌지만 -예를 들어, 소프트웨어 업데이트처럼- 당신이 사용하는 추상화에 극히 드문 영향을 미칩니다.</p>
<h3 id="inheritance">상속(inheritance)</h3>
<p>자, 캡슐화와 추상화가 어떻게 우리가 대규모 코드 베이스를 개발하고 유지하는데 도움이 될 수 있는지 보았습니다.</p>
<p>그런데 혹시 객체 지향 프로그래밍 디자인의 또 다른 흔한 문제를 알고 있나요?</p>
<p>객체는 종종 매우 비슷합니다. 그것들은 일반 로직을 공유합니다. 그러나 그것이 <strong>완전히</strong> 같지는 않습니다. 어...</p>
<p>그래서 우리는 어떻게 일반 로직을 재 사용하고 독자적인 로직을 별개의 클래스 안에 추출할 수 있을까요? 이것을 달성하기 위한 방법 한 가지가 상속입니다.</p>
<p>이것은 또다른 (부모) 클래스에서부터 파생된 하나의 (자녀) 클래스를 만드는 것을 의미합니다. 이런 방식으로 우리는 계층을 형성합니다.</p>
<p>자녀 클래스는 부모 클래스의 모든 필드와 메소드를 (공통 부분) 재 사용하고 자체적인 것을 (독립 부분) 구현할 수 있습니다.</p>
<p>예를 들어:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZIm7lFjlrKeMWxcH8fqBapNkuSJIxW9-t9yf" alt="선생님(Teacher)과 학생(Student)의 관계를 도표로 설명하고 있다. 두 가지 모두는 사람(Person)에 속하고, 선생님(Teacher)은 사립 선생님과 공립 선생님 두 가지로 나뉠 수 있다." width="800" height="502" loading="lazy"></p>
<h6 align="center">사립 선생님은 Teacher 종류의 하나입니다. 그리고 Teacher는 Person의 한 종류입니다.</h6>
<p>만약 우리 프로그램이 공립과 사립 선생님들 뿐만 아니라 학생과 같은 다른 종류의 사람들을 함께 관리할 필요가 있다면, 우리는 이 클래스 계층을 구현할 수 있습니다.</p>
<p>이러한 방식으로 각각의 클래스는 부모 클래스에서 일반 로직을 재활용하면서 그들에게 필요한 것만을 추가할 수 있습니다.</p>
<h3 id="polymorphism">다형성(polymorphism)</h3>
<p>가장 복잡한 단어에 다다랐습니다! 다형성은 그리스어로 "다향한 형태"를 의미합니다.</p>
<p>자, 우리는 이미 상속의 힘을 알고 그걸 기쁘게 사용합니다. 그런데 여기 이 문제가 나타납니다.</p>
<p>부모 클래스가 그로부터 상속된 몇 개의 자녀 클래스를 가지고 있다고 해 봅시다. 때때로 우리는 모든 이러한 클래스들이 혼합되어 담겨있는 컬렉션(collection) -예를 들어 리스트-을 사용하고 싶을 수 있습니다. 또는 우리가 부모 클래스를 위해 구현된 어떤 메소드를 가지고 있는데 그것을 자녀 클래스를 통해서도 사용하고 싶은 것입니다.</p>
<p>이것은 다형성을 사용함으로써 해결할 수 있습니다.</p>
<p>간단히 말해 다형성이란 어떤 클래스를 클래스의 부모 클래스와 정확히 동일하게 사용하여 혼합된 타입에 대한 혼란이 발생하지 않도록 하는 방법을 제공합니다. 그러나 각자의 자녀 클래스들은 그 자체로 자신의 메소드를 유지합니다.</p>
<p>이것은 보통 어떤 (부모) 인터페이스를 재사용하도록 정의를 내리면서 발생합니다. 이 방법은 많은 일반 메소드들을 그려냅니다. 그리고나서 각각의 자녀 클래스들이 그 자신의 버전으로 이 메소드를 구현합니다.</p>
<p>언제든지 어떤 컬렉션 (예를 들어 리스트) 또는 어떤 메소드가 (공통의 메소드가 정의되어진) 부모 클래스 타입의 객체를 기대할 때마다, 언어는 공통 메소드의 올바른 구현 통해 계산하는지만 -어떤 자녀 클래스가 전달되든지 상관없이- 신경 쓰면 됩니다.</p>
<p>기하학 도형들을 구현한 스케치를 살펴보세요. 도형들은 면적과 둘레를 계산하기 위해 일반 인터페이스를 재사용합니다:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/8GySv1U8Kh9nVVyiTqv5cDuWZC7p0uARVeF0" alt="삼각형과 원, 사각형 도형이 모여 각자 인터페이스를 참조하고 있는 그림이다." width="800" height="599" loading="lazy"></p>
<h6 align="center">삼각형, 원, 사각형은 이제 같은 모음집 안에 사용될 수 있습니다.</h6>
<p>부모 <code>Figure Interface</code>를 상속하는 세 가지 도형을 가지는 것으로써 <code>triangles</code>, <code>circles</code>, <code>rectangles</code>이 혼합된 배열을 생성할 수 있습니다. 그리고 그들을 같은 형태의 객체로 취급합니다.</p>
<p>그러면 이 배열이 어떤 구성 요소의 면적을 계산하려 할 때, 올바른 메소드가 찾아지고 실행됩니다. 만약 그 구성 요소가 삼각형이라면 삼각형의 <code>CalculateSurface()</code>가 호출됩니다. 만약 그것이 원이라면 원의 <code>CalculateSurface()</code>가 호출되고 하는 식입니다.</p>
<p>어떤 도형이 스스로의 매개 변수(parameter)를 이용해 동작하는 함수를 가지고 있다면 세 번씩 -삼각형, 원, 사각형을 위해 각각 한번씩- 정의할 필요가 없습니다.</p>
<p>정의를 한번하고 <code>Figure</code>를 변수(argument)로 받아들일 수 있습니다. 삼각형, 원, 또는 사각형 어떤 것을 통과하던지 -그것들이 <code>CalculateParameter()</code>를 구현한다는 전제하에서- 그들의 종류는 상관 없습니다.</p>
<p>도움이 되었으면 좋겠습니다. 잡 인터뷰에서 이것과 정확히 같은 설명을 직접 사용할 수 있습니다.</p>
<p>만약 여전히 무언가 이해하기 어렵다면 아래 댓글로 질문하는 걸 망설이지 마세요.</p>
<h3 id="">다음 단계는?</h3>
<p>항상 인터뷰 질문에 오르는 고전적인 것들 중 한가지를 대답할 수 있게 준비된 것은 대단한 일입니다 - 그러나 때때로 인터뷰 자체를 받지 못할 수 있겠죠.</p>
<p>다음으로, 저는 고용인들이 주니어 개발자에게서 어떤 것을 보고 싶어하는지에, 구직 활동을 할 때 여럿 중에서 어떻게 돋보일 수 있는지 초점을 맞춰보려 합니다.</p>
<p>지켜봐주세요.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/PWiBgy57Ye32At-VBM3qIcWdVJQ01Td-ILKl" alt="커피챗: 커피 한잔 사 주세요 로고" width="181" height="41" loading="lazy"></p>
<h6 align="center">즐겁게 읽으셨나요? 응원하고 싶다면 커피 한 잔 사 주세요 :)</h6>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git 이해하는 방법: 기초 명령어, 팁, 요령에 대한 소개 ]]>
                </title>
                <description>
                    <![CDATA[ 저는 최근에 한 동료의 멘토가 되었습니다. 그리고 제 멘티가 깃(Git)에 대해 몇 가지 상황을 물어보았습니다. 이 글은 제 동료를 위한 것입니다! 추신: 우리가 시작할 때 이 글을 썼어야 하는건데 이제 지금이라도 도움되길 바랍니다! 그리고 기억하세요: 어떤 것을 배우기 위한 가장 좋은 방법은 스스로 해 보는 것입니다. 그리고 내 멘토는 언제나 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/understanding-git-basics-commands-tips-tricks/</link>
                <guid isPermaLink="false">63dd2a3641a99b065fb5ab52</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Mon, 06 Feb 2023 08:35:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/02/brandon-green-321795-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/understanding-git-basics-commands-tips-tricks/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to understand Git: an intro to basic commands, tips, and tricks</a>
      </p><!--kg-card-begin: markdown--><h3 id="git">저는 최근에 한 동료의 멘토가 되었습니다. 그리고 제 멘티가 깃(Git)에 대해 몇 가지 상황을 물어보았습니다. 이 글은 제 동료를 위한 것입니다! 추신: 우리가 시작할 때 이 글을 썼어야 하는건데 이제 지금이라도 도움되길 바랍니다!</h3>
<p>그리고 기억하세요: 어떤 것을 배우기 위한 가장 좋은 방법은 스스로 해 보는 것입니다. 그리고 내 멘토는 언제나 내게 말하곤 합니다: Udaraj!</p>
<h2 id="basics">기초(Basics)</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0-2GkM1pvDmnI2ksUM.png" alt="깃 로고" width="600" height="400" loading="lazy"></p>
<h3 id="git">그래서 왜 깃(Git)이 그렇게 중요할까요?</h3>
<p>먼저, 깃의 위키피디아 페이지 첫번째 줄을 인용해서 시작해 봅시다:</p>
<blockquote>
<p>"_*깃([긷])*은 <a href="https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%8C%8C%EC%9D%BC">컴퓨터 파일</a>의 변화를 추적하고 여러 사람들 사이에서 그 파일을 조정하는 <a href="https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC">버전 관리</a> 시스템입니다._"</p>
</blockquote>
<p>이것은 다시 말해서 깃의 가장 기본적이고 중요한 기능이 여러 팀에게 동시에 같은 프로젝트로 코드를 더하게 (그리고 통합)하게 허용한다는 걸 의미합니다. 이러한 능력을 프로젝트에 더함으로써 팀을 더 효율적이게 하고 더 큰 규모의 프로젝트나 더 복잡한 문제들에 일할 수 있는 능력을 제공합니다.</p>
<p>깃이 정말 잘하는 또 다른 많은 것들이 있습니다: 변경점을 원복, 새로운 기능을 더하기 위한 새 브랜치(branches) 생성, 병합 시 발생하는 충돌(conflict) 해결 등을 허용합니다.</p>
<h3 id="">깃이 동작하는 법</h3>
<p>깃은 <strong>저장소(repositories)</strong> 안에 프로젝트를 저장합니다. **커밋(Commits)**이 프로젝트로 만들어지면 깃에게 여러분이 생성한 새로운 코드나 변경한 코드에 대해 만족하는지 말해줄 것입니다.</p>
<p>새로운 코드/변경점들은 브랜치에 커밋됩니다. 대부분의 일은 다른 브랜치에 커밋되고 그 다음 마스터 브랜치로 병합됩니다. 이에 대한 모든 것은 프로젝트로 같은 디렉토리(directory) 안이지만 <strong>.git</strong>이라고 불리는 하위 폴더 안에 저장됩니다.</p>
<p>동료와 코드를 공유하기 위해서는 여러분이 저장소로 변경점을 **푸쉬(push)**합니다. 동료로부터 새로운 코드를 얻어오려면 저장소로부터 변경점을 **풀(pull)**합니다.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0-SBz94SjR2tbvFY6n.jpg" alt="공용 깃 저장 서비스 사례: Bitbucket, GitHub, Gitlab" width="600" height="400" loading="lazy"></p>
<h3 id="githubgitlabbitbucket">그러면 GitHub, GitLab, Bitbucket은 무엇일까요?</h3>
<p>질문해줘서 고마워요! 이러한 종류의 어플리케이션들은 저장소 관리(repository management) 서비스라고 불립니다. 현대 소프트웨어 개발에 중요한 역할을 수행합니다.</p>
<p>깃과 깃허브가 많은 회사들에서 지향하는 버전 관리 솔루션입니다만, 깃허브는 GitLab이나 Bitbucket과 같은 강력<br>
한 경쟁자들을 가집니다. 하지만 만약 깃허브를 사용하는 방법을 알고 있다면 GitLab이나 Bitbucket으로 일하는데 아무 문제가 없을 것입니다.</p>
<p>그래서 요점은: 깃은 도구이고 깃허브는 깃을 사용하는 프로젝트를 위한 서비스입니다.</p>
<h3 id="">흥미로운 프로젝트를 탐색하고 다른 개발자들과 연결하려면 어디로 가야할까요?</h3>
<p>깃허브, GitLab, Bitbucket은 공용 저장소 검색 기능과 다른 사용자들을 쉽게 팔로우 가능하게 하는 기능을 가지고 있습니다.</p>
<p>이제 어째서 왜 깃과 깃허브(또는 GitLab/Bitbucket)이 중요한지 보이시나요? 명령어에 대해 이야기 하기 전에 이야기 드릴 남은 한가지는 깃을 사용할 때 항상 따라야 하는 몇 가지 간단한 규칙입니다:</p>
<ul>
<li>규칙 1: 모든 새로운 프로젝트마다 깃 저장소를 생성하라</li>
<li>규칙 2: 모든 새로운 기능마다 새로운 브랜치을 생성하라</li>
</ul>
<h2 id="">명령어</h2>
<p>깃을 시작하기 위해서는 컴퓨터에 반드시 깃을 가지고 있어야 합니다. 설치하지 않았다면 <a href="https://git-scm.com/">여기</a>로 가서 지시사항들을 따라하면 됩니다.</p>
<h3 id="gitinit">새로운 깃 저장소 초기 설정: Git init</h3>
<p>모든 코드 내용은 저장소 안에 추적됩니다. 깃 저장소를 초기 설정하려면 해당 프로젝트 폴더 안에 이 명령어를 사용하세요. 이것이 .git 폴더를 만들어 줄 것입니다.</p>
<pre><code>git init
</code></pre>
<h3 id="gitadd">Git add</h3>
<p>이 명령어는 하나 또는 모든 변경 파일들을 본 무대 영역으로 더합니다.</p>
<p>어떤 하나의 특정 파일을 올리기 위해서는:</p>
<pre><code>git add filename.py
</code></pre>
<p>신규 또는 수정되거나 삭제된 파일들을 올리기 위해서는:</p>
<pre><code>git add -A
</code></pre>
<p>신규 또는 수정 파일들을 올리기 위해서는:</p>
<pre><code>git add .
</code></pre>
<p>수정 또는 삭제된 파일들을 올리기 위해서는:</p>
<pre><code>git add -u
</code></pre>
<h3 id="gitcommit">Git commit</h3>
<p>이 명령어는 버전 이력을 파일 안에 기록합니다. -m이 뜻하는 것은 어떤 커밋 메세지가 뒤따른다는 의미입니다. 이 메세지는 커스텀이며 반드시 이것을 동료에게 알리는 용도로 또는 미래의 스스로에게 무엇이 해당 커밋 안에 더해졌는지 알리기 위해 사용해야 합니다.</p>
<pre><code>git commit -m "your text"
</code></pre>
<h3 id="gitstatus">Git status</h3>
<p>이 명령어는 파일들을 초록색과 빨간색으로 리스트해 줄 것입니다. 초록색 파일들은 무대로 올려졌지만 아직 커밋되지 않은 것들입니다. 빨간색으로 표시된 파일들은 무대로 아직 올려지지 않은 것들입니다.</p>
<pre><code>git status
</code></pre>
<h2 id="">브랜치에 작업하는 것</h2>
<h3 id="gitbranchbranch_name">Git branch branch_name</h3>
<p>이것은 새 브랜치를 생성합니다:</p>
<pre><code>git branch branch_name
</code></pre>
<h3 id="gitcheckoutbranch_name">Git checkout branch_name</h3>
<p>어떤 브랜치에서 다른 브랜치로 변경하려면:</p>
<pre><code>git checkout branch_name
</code></pre>
<h3 id="gitcheckoutbbranch_name">Git checkout -b branch_name</h3>
<p>새로운 브랜치를 생성하고 그것으로 자동 전환하려면:</p>
<pre><code>git checkout -b branch_name
</code></pre>
<p>이것은 간략하게:</p>
<pre><code>git branch branch_name
git checkout branch_name
</code></pre>
<p>입니다.</p>
<h3 id="gitbranch">Git branch</h3>
<p>모든 브랜치를 리스트하고 현재 어떤 브랜치에 있는지 확인하려면:</p>
<pre><code>git branch
</code></pre>
<h3 id="gitlog">Git log</h3>
<p>이 명령어는 현재 브랜치에서 모든 버전 이력을 리스트해줄 것입니다:</p>
<pre><code>git log
</code></pre>
<h2 id="pushpull">Push와 Pull</h2>
<h3 id="gitpush">Git push</h3>
<p>이 명령어는 커밋된 변경점들을 원격 저장소에 보냅니다:</p>
<pre><code>git push
</code></pre>
<h3 id="gitpull">Git pull</h3>
<p>원격 저장소에서 개인 컴퓨터로 변경점들을 가져오려면:</p>
<pre><code>git pull
</code></pre>
<p>더 많은 명령어들과 해당 목록에 대한 상세 설명들을 알고 싶다면 공식 <a href="https://git-scm.com/docs/">깃 문서</a>를 확인하길 추천합니다.</p>
<h2 id="tiptricks">유용한 정보 (Tip &amp; Tricks)</h2>
<h3 id="">커밋되지 않은 모든 변경점을 보낼 때</h3>
<p>문자 그대로 이 명령어는 커밋되지 않은 모든 변경점을 보냅니다:</p>
<pre><code>git reset --hard
</code></pre>
<h3 id="">개인 컴퓨터에서는 삭제하지 않고 깃에서만 파일을 삭제</h3>
<p>종종 "git add" 명령어를 사용하면서 추가하지 않고 싶어했던 파일을 더해버릴 수도 있습니다.</p>
<p>"git add"를 사용하는 동안 주의하지 않는다면 커밋하기 원하지 않았던 파일을 더하게 될지도 모릅니다. 파일의 기록 버전(staged version)을 반드시 삭제해야 하고, 그리고나서 파일에 .gitignore를 추가하여 같은 실수를 두번 하는 일을 방지할 수 있습니다:</p>
<pre><code>git reset file_name
echo filename &gt;&gt; .gitignore
</code></pre>
<h3 id="">커밋 메세지 수정</h3>
<p>커밋 메세지를 수정하는 건 굉장히 쉽습니다:</p>
<pre><code>git commit --amend -m "New message"
</code></pre>
<p>지금까지 읽어주셔서 감사합니다! 저의 freeCodeCamp 프로필에서 더 많은 글을 확인하세요: <a href="https://www.freecodecamp.org/news/author/goran/">https://www.freecodecamp.org/news/author/goran/</a> 그리고 제 깃허브 페이지에 만들어둔 재미있는 것들을 확인해 보세요: <a href="https://github.com/GoranAviani">https://github.com/GoranAviani</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 초보자를 위한 25가지 파이썬 프로젝트 – 파이썬 코딩을 시작하기 좋은 쉬운 아이디어들 ]]>
                </title>
                <description>
                    <![CDATA[ 새로운 프로그래밍 언어를 배우는 가장 좋은 방법은 그 언어를 사용한 프로젝트를 만드는 것입니다. 제가 파이썬에서 초급자가 하기 좋은 25가지 프로젝트 튜토리얼 목록을 생성하였습니다. 튜토리얼에 대한 저의 조언은 비디오를 보고 프로젝트를 만들어서 그것을 분해하고 여러분만의 방식으로 다시 만드는 것입니다. 새로운 기능을 추가하거나 다른 방법을 사용해 보세요. 그렇게 하면 당신이 정말로 개념을 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/python-projects-for-beginners/</link>
                <guid isPermaLink="false">63dd29e141a99b065fb5ab48</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Mon, 06 Feb 2023 08:34:34 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/02/hitesh-choudhary-D9Zow2REm8U-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/python-projects-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">25 Python Projects for Beginners – Easy Ideas to Get Started Coding Python</a>
      </p><!--kg-card-begin: markdown--><p>새로운 프로그래밍 언어를 배우는 가장 좋은 방법은 그 언어를 사용한 프로젝트를 만드는 것입니다.</p>
<p>제가 파이썬에서 초급자가 하기 좋은 25가지 프로젝트 튜토리얼 목록을 생성하였습니다.</p>
<p>튜토리얼에 대한 저의 조언은 비디오를 보고 프로젝트를 만들어서 그것을 분해하고 여러분만의 방식으로 다시 만드는 것입니다. 새로운 기능을 추가하거나 다른 방법을 사용해 보세요.</p>
<p>그렇게 하면 당신이 정말로 개념을 이해했는지 확인할 수 있습니다.</p>
<p>아래 나열된 프로젝트 목록 중 어떤 것을 클릭하면 상세 해당 영역으로 이동할 수 있습니다.</p>
<p>만약 파이썬 기초에 익숙하지 않다면 <a href="https://www.youtube.com/watch?v=rfscVS0vtbw">여기 freeCodeCamp의 파이썬 튜토리얼 초급편</a>을 보세요.</p>
<h3 id="">만들 수 있는 파이썬 프로젝트 목록</h3>
<ol>
<li><a href="#example01">매드 립스(Mad Libs)</a></li>
<li><a href="#example02">숫자 맞추기 게임 (컴퓨터)</a></li>
<li><a href="#example03">숫자 맞추기 게임 (사용자)</a></li>
<li><a href="#example04">가위 바위 보</a></li>
<li><a href="#example05">행맨(Hangman)</a></li>
<li><a href="#example06">카운트다운 타이머</a></li>
<li><a href="#example07">암호 생성기</a></li>
<li><a href="#example08">QR 코드 인코더 / 디코더</a></li>
<li><a href="#example09">틱택토(Tic-Tac-Toe)</a></li>
<li><a href="#example10">틱택토(Tic-Tac-Toe) AI</a></li>
<li><a href="#example11">이진 검색(Binary Search)</a></li>
<li><a href="#example12">지뢰제거기</a></li>
<li><a href="#example13">스도쿠 풀기</a></li>
<li><a href="#example14">파이썬으로 사진 조작</a></li>
<li><a href="#example15">마르코프 체인(Markov Chain) 텍스트 작성기</a></li>
<li><a href="#example16">퐁(Pong)</a></li>
<li><a href="#example17">뱀(Snake)</a></li>
<li><a href="#example18">커넥트 4(Connect Four)</a></li>
<li><a href="#example19">테트리스</a></li>
<li><a href="#example20">온라인 멀티플레이어 게임</a></li>
<li><a href="#example21">웹 스크래핑 프로그램</a></li>
<li><a href="#example22">대량 파일 이름 변경</a></li>
<li><a href="#example23">날씨 프로그램</a></li>
<li><a href="#example24">파이썬으로 디스코드 봇 코딩 - 클라우드에서 무료로 호스트</a></li>
<li><a href="#example25">우주 침략자 게임</a></li>
</ol>
<h3 id="h3idexample01madlibsh3"></h3><h3 id="example01">매드 립스(Mad Libs)</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=100s">Kylie Ying의 튜토리얼</a>에서는 사용자 입력값을 얻는 것과 f-문자열(f-strings)을 다루는 것, 그리고 콘솔에 출력된 결과값을 보는 방법에 대해 배울 것입니다.</p>
<p>이것은 파이썬에서 문자열 연결을 하는 일을 익숙하게 하는 좋은 시작 프로젝트입니다.</p>
<h3 id="h3idexample02h3"></h3><h3 id="example02">숫자 맞추기 게임 (컴퓨터)</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=414s">Kylie Ying의 튜토리얼</a>에서 <a href="https://docs.python.org/3/library/random.html">파이썬 랜덤 모듈(random module)</a>을 다루거나 함수를 만들고 while문과 조건문을 다룬다든지 사용자 입력값을 받는 방법에 대해 배울 것입니다.</p>
<h3 id="h3idexample03h3"></h3><h3 id="example03">숫자 맞추기 게임 (사용자)</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=797s">Kylie Ying의 튜토리얼</a>에서 컴퓨터가 정확한 숫자를 맞춰야 하는 숫자 맞추기 게임을 만들 것입니다. <a href="https://docs.python.org/3/library/random.html">파이썬 랜덤 모듈(random module)</a>을 다루거나 함수를 만들고 while문과 조건문을 다룬다든지 사용자 입력값을 받는 일을 할 것입니다.</p>
<h3 id="h3idexample04h3"></h3><h3 id="example04">가위 바위 보</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=1274s">Kylie Ying의 튜토리얼</a>에서 <code>random.choice()</code>와 if문을 다루고, 사용자 입력값을 받는 일을 할 것입니다. 이것은 조건문이나 함수와 같은 기초를 다지는데 도움이 되는 좋은 프로젝트입니다.</p>
<h3 id="h3idexample05hangmanh3"></h3><h3 id="example05">행맨(Hangman)</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=1465s">Kylie Ying의 튜토리얼</a>에서 딕셔너리(dictionaries), 리스트(list), 중첩 조건문(nested if statements)을 다루는 법을 배울 것입니다. 또한 문자열과 파이썬 랜덤 모듈(random modules)를 다루는 법도 배울 것입니다.</p>
<h3 id="h3idexample06h3"></h3><h3 id="example06">카운트다운 타이머</h3>
<p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=1992s">Code With Tomi 튜토리얼</a>에서 파이썬 <code>time</code> 모듈을 사용하여 카운트다운 타이머를 만드는 법을 배울 것입니다. 이것은 파이썬에서 while문을 다루는데 익숙하게 하는 좋은 시작 프로젝트입니다.</p>
<h3 id="h3idexample07h3"></h3><h3 id="example07">비밀번호 생성기</h3>
<p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=2531s">Code With Tomi 튜토리얼</a>에서 랜덤 비밀번호 생성기를 만드는 법을 배울 것입니다. 사용자로부터 비밀번호에 들어갈 숫자와 길이에 대한 데이터를 받아서 랜덤 문자가 들어간 비밀번호 모음을 출력할 것입니다.</p>
<p>이 프로젝트는 <code>for loop</code>와 <code>random</code> 파이썬 모듈을 다루는 연습을 더 많이 제공할 것입니다.</p>
<h3 id="h3idexample08qrh3"></h3><h3 id="example08">QR 코드 인코더 / 디코더</h3>
<p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=3192s">Code With Tomi 튜토리얼</a>에서 나만의 QR 코드를 만들고 부호화(encode)/해독(decode)하는 법을 배울 것입니다. 이 프로젝트는 <code>qrcode</code> 라이브러리를 사용합니다.</p>
<p>이것은 입문자가 다른 파이썬 모듈을 다루고 설치하는 것을 익숙하게 하는 좋은 프로젝트입니다.</p>
<h3 id="h3idexample09tictactoeh3"></h3><h3 id="example09">틱택토(Tic-Tac-Toe)</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=2153s">Kylie Ying의 튜토리얼</a>에서 커맨드 라인으로 다양한 플레이어와 함께하는 틱택토 게임을 만드는 법을 배울 것입니다. 파이썬의 <code>time</code>, <code>math</code> 모듈을 다루는 법을 배우면서 중첩 조건문(nested if statements) 연습을 이어서 하게 될 것입니다.</p>
<h3 id="h3idexample10tictactoeaih3"></h3><h3 id="example10">틱택토(Tic-Tac-Toe) AI</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=3599s">Kylie Ying의 튜토리얼</a>에서 컴퓨터가 절대 지지 않는 틱택토 게임을 만드는 법을 배울 것입니다. 이 프로젝트는 의사 결정을 위해 사용되는 재귀 알고리즘인 미니맥스(minimax, 번역가 주: 추정되는 최대 손실을 최소화 하는 기법) 알고리즘을 활용합니다.</p>
<h3 id="h3idexample11binarysearchh3"></h3><h3 id="example11">이진 검색(Binary Search)</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=4553s">Kylie Ying의 튜토리얼</a>에서 이진 검색(binary search)라고 불리는 분할 정복(divide and conquer) 알고리즘을 구현하는 법을 배울 것입니다. 이것은 구직 면접에 자주 나오는 검색 알고리즘이기 때문에 코드로 어떻게 구현하는지를 아는 것이 중요합니다.</p>
<h3 id="h3idexample12h3"></h3><h3 id="example12">지뢰제거기</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=5236s">Kylie Ying의 튜토리얼</a>에서 고전 지뢰제거기 게임을 커맨드 라인에 만들 것입니다. 이 프로젝트는 반복문과 클래스에 초점을 맞춥니다.</p>
<h3 id="h3idexample13h3"></h3><h3 id="example13">스도쿠 문제 해결 프로그램</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=6715s">Kylie Ying의 튜토리얼</a>에서 역추적(backtracking) 기술을 활용한 스도쿠 문제 해결 프로그램을 만드는 법을 배울 것입니다. 역추적은 문제를 해결하기 위해 모든 가능한 조합을 검색하는 재귀 기술입니다.</p>
<h3 id="h3idexample14h3"></h3><h3 id="example14">파이썬으로 사진 조작</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=7534s">Kylie Ying의 튜토리얼</a>에서 이미지 필터를 생성하여 사진의 명도와 밝기, 흐림 효과(blur)를 변경하는 법을 배울 것입니다. 프로젝트를 시작하기 전에 <a href="https://github.com/kying18/pyphotoshop">시작 파일들</a>을 다운받아야 합니다.</p>
<h3 id="h3idexample15markovchainh3"></h3><h3 id="example15">마르코프 체인(Markov Chain) 텍스트 작곡가</h3>
<p><a href="https://www.youtube.com/watch?v=8ext9G7xspg&amp;t=9109s">Kylie Ying의 튜토리얼</a>에서 마르코프 체인(Markov Chain) 그래프 모델에 대해 배우고 노래 가사 관계에 어떻게 적용될 수 있는지 배울 것입니다. 이 프로젝트는 파이썬으로 인공 지능을 시작하는데 좋습니다.</p>
<h3 id="h3idexample16pongh3"></h3><h3 id="example16">퐁(Pong)</h3>
<p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=78s">Christian Thompson의 튜토리얼</a>에서 파이썬으로 고전 퐁(pong) 게임을 재현하는 법을 배울 것입니다. 게임용 그래픽을 생성하는데 뛰어난 <code>os</code>와 <code>turtle</code> 파이썬 모듈을 사용하게 될 것입니다.</p>
<h3 id="h3idexample17snakeh3"></h3><h3 id="example17">뱀(Snake)</h3>
<p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=2736s">Tech with Tim 튜토리얼</a>에서 파이썬으로 고전 뱀(snake) 게임을 재현하는 법을 배울 것입니다. 이 프로젝트는 객체 지향 프로그래밍을 사용하고 게임을 만드는데 대중적인 파이썬 모듈인 Pygame을 사용합니다.</p>
<h3 id="h3idexample184connectfourh3"></h3><h3 id="example18">커넥트 4(Connect Four)</h3>
<p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=5697s">Keith Galli 튜토리얼</a>에서 고전 커넥트 4(connect four) 게임을 만드는 법을 배울 것입니다. 이 프로젝트는 <code>numpy</code>, <code>math</code>, <code>pygame</code>, 그리고 <code>sys</code> 파이썬 모듈을 활용합니다.</p>
<p>이 프로젝트는 이전에 몇 가지 작은 입문자용 파이썬 프로젝트를 만들었을 때 좋습니다. 어떠한 파이썬 프로젝트를 하지 않았다면 목록에 앞서 언급한 프로젝트들 중 하나를 시작하고 나서 이것을 작업하길 추천합니다.</p>
<h3 id="h3idexample19h3"></h3><h3 id="example19">테트리스</h3>
<p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=9756s">Tech with Tim 튜토리얼</a>에서 고전 테트리스 게임을 재현하는 법을 배울 것입니다. 이 프로젝트는 Pygame을 활용하고 초보 개발자들이 다음 단계로 실력을 끌어올리는데 좋습니다.</p>
<h3 id="h3idexample20h3"></h3><h3 id="example20">온라인 멀티플레이어 게임</h3>
<p><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc&amp;t=15732s">Tech with Tim 튜토리얼</a>에서 전 세계 어느 누구와 함께 플레이 할 수 있는 온라인 멀티플레이어 게임을 만드는 법을 배울 것입니다. 이 프로젝트는 소켓과 네트워킹, Pygame을 다루는데 좋은 입문 단계입니다.</p>
<h3 id="h3idexample21h3"></h3><h3 id="example21">웹 스크래핑 프로그램</h3>
<p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=37s">Code With Tomi 튜토리얼</a>에서 웹 스크래핑을 통해 사용자에게 깃허브(GitHub) 사용자 링크를 입력으로 받아 프로필 이미지 링크를 출력하는 법을 배우게 될 것입니다. 웹 스크래핑이란 웹 페이지에서 데이터를 수집하는 기술입니다.</p>
<h3 id="h3idexample22h3"></h3><h3 id="example22">대량 파일 이름 변경</h3>
<p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=833s">Code With Tomi 튜토리얼</a>에서 내 컴퓨터 어느 폴더에 접속하여 파이썬 코드에 적힌 조건들에 따라 파일 이름을 바꾸는 프로그램을 만드는 법을 배우게 될 것입니다.</p>
<h3 id="h3idexample23h3"></h3><h3 id="example23">날씨 프로그램</h3>
<p><a href="https://www.youtube.com/watch?v=SqvVm3QiQVk&amp;t=1494s">Code With Tomi 튜토리얼</a>에서 사용자의 데이터를 특정 위치에 따라 수집하여 제공된 위치에 따른 날씨 상세 정보를 출력하는 프로그램을 만드는 법을 배우게 될 것입니다. 이것은 API에서 데이터를 받아오는 법을 배우는 것을 시작하는데 좋은 프로젝트입니다.</p>
<h3 id="h3idexample24both3"></h3><h3 id="example24">파이썬으로 디스코드 봇(bot) 코딩 - 클라우드에서 무료로 호스트</h3>
<p><a href="https://www.youtube.com/watch?v=SPTfmiYiuok">Beau Carnes 튜토리얼</a>에서 사람들이 온라인 상에서 함께 어울리고 대화할 수 있는 플랫폼인 디스코드(Discord)에서 당신만의 봇(bot)을 만드는 법을 배우게 될 것입니다. 이 프로젝트는 Discord API와 Replit IDE를 사용해 작업하는 법을 가르쳐 줄 것입니다.</p>
<p>이 비디오가 공개된 후 Replit은 프로그램에 환경 변수를 저장하는 방법을 변경했습니다. Replit에 환경 변수를 올바르게 저장하는 방법에 대한 <a href="https://forum.freecodecamp.org/t/steps-on-how-to-setup-environment-variable-for-fcc-python-bot-tutorial/473303">튜토리얼</a>을 읽어보세요.</p>
<h3 id="h3idexample25h3"></h3><h3 id="example25">우주 침략자 게임</h3>
<p><a href="https://www.youtube.com/watch?v=FfWpgLFMI7w">buildwithpython 튜토리얼</a>에서 Pygame을 이용해 우주 침략자 게임을 만드는 법을 배우게 될 것입니다. 게임 루프(loops), 충돌 감지, 키 입력 이벤트 등과 같이 게임 개발에서 기본적인 많은 것들을 배우게 될 것입니다.</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 파이썬 if __name__ == __main__ 을 코드 예제로 설명 ]]>
                </title>
                <description>
                    <![CDATA[ 파이썬 인터프리터(interpreter)가 파이썬 파일을 읽을 때 몇 가지 특별 변수를 먼저 설정합니다. 그리고나서 파일의 코드를 실행합니다. 특별 변수 중 하나는 __name__이라고 합니다. 이 글을 순서대로 따라서 코드 문단을 읽어본다면 if __name__ == "__main__"를 어떻게 사용하고 이것이 왜 중요한지 배우게 될 것입니다. 파이썬 모듈 설명 파이썬 파일은 모듈을 호출하는데 .py 파일 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/untitled-2/</link>
                <guid isPermaLink="false">63d82ec341a99b065fb5aad2</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Wed, 01 Feb 2023 09:25:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/01/5f9c99de740569d1a4ca2229.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/if-name-main-python-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python if __name__ == __main__ Explained with Code Examples</a>
      </p><!--kg-card-begin: markdown--><h4 id="interpreter">파이썬 인터프리터(interpreter)가 파이썬 파일을 읽을 때 몇 가지 특별 변수를 먼저 설정합니다. 그리고나서 파일의 코드를 실행합니다.</h4>
<p>특별 변수 중 하나는 <code>__name__</code>이라고 합니다.</p>
<p>이 글을 순서대로 따라서 코드 문단을 읽어본다면 <code>if __name__ == "__main__"</code>를 어떻게 사용하고 이것이 왜 중요한지 배우게 될 것입니다.</p>
<h2 id="">파이썬 모듈 설명</h2>
<p>파이썬 파일은 모듈을 호출하는데 <code>.py</code> 파일 확장자에 의해 식별됩니다. 하나의 모듈은 함수와 클래스, 변수를 정의할 수 있습니다.</p>
<p>그래서 인터프리터가 모듈을 메인 프로그램에서 실행한다면 <code>__name__</code> 변수는 <code>__main__</code>으로 설정될 것입니다.</p>
<p>하지만 코드가 다른 모듈로부터 모듈을 불러오고 있다면 <code>__name__</code> 변수는 그 모듈의 이름대로 설정될 것입니다.</p>
<p>예제를 살펴봅시다. <code>file_one.py</code>라는 이름으로 파이썬 모듈을 생성하고 그 안에 아래 코드를 붙여넣으세요:</p>
<pre><code># Python file one module

print("File one __name__ is set to: {}" .format(__name__))
</code></pre>
<h6 align="center">file_one.py</h6>
<p>이 파일을 실행하면 우리가 이야기하던 것이 무엇인지 정확히 보게 될 것입니다. 이 모듈의 변수 <code>__name__</code>은 <code>__main__</code>으로 설정됩니다:</p>
<pre><code>File one __name__ is set to: __main__
</code></pre>
<p>이제 <code>file_two.py</code>라는 이름으로 다른 파일을 더하고 그 안에 아래 코드를 붙여넣으세요:</p>
<pre><code># Python module to import

print("File two __name__ is set to: {}" .format(__name__))
</code></pre>
<h6 align="center">file_two.py</h6>
<p>또한 <code>file_one.py</code> 안의 코드를 아래와 같이 수정하여 우리가 <code>file_two.py</code> 모듈을 불러올 수 있도록 하세요:</p>
<pre><code># Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))
</code></pre>
<h6 align="center">file_one.py</h6>
<p><code>file_one</code> 코드를 다시 실행하면 <code>file_one</code>안에 있던 <code>__name__</code> 변수가 바뀌지 않고 여전히 <code>__main__</code>으로 설정되어 남아있는 것을 보여줄 것입니다. 그러나 이제 <code>file_two</code>안에 있던 <code>__name__</code> 변수가 모듈 이름, 즉 <code>file_two</code>로 설정되었습니다.</p>
<p>결과는 아래와 같아 보여야 합니다:</p>
<pre><code>File two __name__ is set to: file_two
File one __name__ is set to: __main__
</code></pre>
<p>하지만 <code>file_two</code>를 직접 실행하면 그 이름이 <code>__main__</code>으로 설정된 것을 보게 될 것입니다:</p>
<pre><code>File two __name__ is set to: __main__
</code></pre>
<p>실행하는 파일/모듈을 위한 변수 <code>__name__</code>은 항상 <code>__main__</code>으로 될 것입니다. 그러나 모든 다른 모듈에서 불러들여지는 <code>__name__</code> 변수는 그 자신의 모듈 이름으로 설정될 것입니다.</p>
<h2 id="">파이썬 파일 이름을 정하는 관습</h2>
<p>일반적으로 <code>__name__</code>과 <code>__main__</code>을 사용하는 방법은 아래와 같이 보입니다:</p>
<pre><code>if __name__ == "__main__":
   Do something here

</code></pre>
<p>이것이 실제로 동작하는 법을 보고 해당 변수들을 실제로 어떻게 사용할지 봅시다.</p>
<p><code>file_one</code>과 <code>file_two</code>를 아래와 같이 수정하세요:</p>
<p><code>file_one</code>:</p>
<pre><code># Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")
</code></pre>
<h6 align="center">file_one.py</h6>
<p><code>file_two</code>:</p>
<pre><code># Python module to import

print("File two __name__ is set to: {}" .format(__name__))

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
</code></pre>
<h6 align="center">file_two.py</h6>
<p>다시 <code>file_one</code>을 실행하면 프로그램이 두개의 모듈 중 어느 것이 <code>__main__</code>인지 인식하고 우리의 첫번째 <code>if else</code>문에 따라 코드를 실행하는 것을 보게 될 것입니다.</p>
<p>결과는 아래와 같아 보여야 합니다:</p>
<pre><code>File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
</code></pre>
<p>이제 <code>file_two</code>를 실행하여 <code>__name__</code>변수가 <code>__main__</code>으로 설정된 것을 보게 될 것입니다:</p>
<pre><code>File two __name__ is set to: __main__
File two executed when ran directly
</code></pre>
<p>이와 같은 모듈을 불러와서 실행할 때는 그 안의 함수들을 불러오게 되고 최상단 코드가 실행될 것입니다.</p>
<p>이 과정이 실행되는 것을 보기 위해, 파일을 아래와 같이 수정하세요:</p>
<p><code>file_one</code>:</p>
<pre><code># Python module to execute
import file_two

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
else:
   print("File one executed when imported")
</code></pre>
<h6 align="center">file_one.py</h6>
<p><code>file_two</code>:</p>
<pre><code># Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
</code></pre>
<h6 align="center">file_two.py</h6>
<p>이제 함수들이 읽혀졌을 테지만 실행되진 않았습니다.</p>
<p>이들 함수들 중 하나를 실행하기 위해서 <code>file_one</code>의 <code>if __name__ == "__main__"</code> 부분을 아래와 같이 보이게 수정하세요:</p>
<pre><code>if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
else:
   print("File one executed when imported")
</code></pre>
<p><code>file_one</code>을 실행하면 아래와 같은 것을 보게 될 것입니다:</p>
<pre><code>File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
</code></pre>
<p>또한 불러온 파일에서 함수를 실행할 수도 있습니다. 이를 위해서 <code>file_one</code>의 <code>if __name__ == "__main__"</code> 부분을 아래와 같이 보이게 수정하세요:</p>
<pre><code>if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   file_two.function_three()
else:
   print("File one executed when imported")
</code></pre>
<p>그러면 아래와 같은 결과를 기대할 수 있습니다:</p>
<pre><code>File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
Function three is executed
</code></pre>
<p>(우리는 2개를 사용하고 있지만) 만약 <code>file_two</code> 모듈이 정말 많은 함수들을 가지고 있어 파일이 크고 우리가 그 모든 것들을 불러오고 싶지는 않다고 해 봅니다. <code>file_two</code>를 아래와 같이 보이게 수정하세요:</p>
<pre><code># Python module to import

print("File two __name__ is set to: {}" .format(__name__))

def function_three():
   print("Function three is executed")

def function_four():
   print("Function four is executed")

if __name__ == "__main__":
   print("File two executed when ran directly")
else:
   print("File two executed when imported")
</code></pre>
<h6 align="center">file_two.py</h6>
<p>그리고 해당 모듈에서 특정한 함수를 불러오기 위해서 <code>file_one</code> 안에 <code>from</code> 불러오기(import) 단락을 사용하세요:</p>
<pre><code># Python module to execute
from file_two import function_three

print("File one __name__ is set to: {}" .format(__name__))

def function_one():
   print("Function one is executed")

def function_two():
   print("Function two is executed")

if __name__ == "__main__":
   print("File one executed when ran directly")
   function_two()
   function_three()
else:
   print("File one executed when imported")
</code></pre>
<h6 align="center">file_one.py</h6>
<h2 id="">결론</h2>
<p>어떤 파일을 메인 프로그램으로 실행할 수 있는지 또는 다른 모듈에 의해 불러오게 할 것인지에 따라 <code>__name__</code> 변수를 위한 정말 좋은 활용 사례가 있습니다. 우리는 모듈들을 불러올 때 코드 일부분들을 실행하게 허용하거나 막기 위해서 <code>if __name__ == "__main__"</code>을 사용할 수 있습니다.</p>
<p>파이썬 인터프리터가 파일을 읽을 때 <code>__name__</code> 변수는 해당 모듈이 실행된다면 <code>__main__</code>으로 설정되고 해당 모듈을 불러오는 것이라면 모듈의 이름으로 설정됩니다. 파일을 읽으면 모든 상위 레벨 코드를 실행되지만 함수와 클래스들은 (불러와지기만 할 뿐이라) 실행되지 않습니다.</p>
<p>Bra gjort! (스웨덴어로 "아주 잘했다"를 의미합니다!)</p>
<p>이와 같은 글이 저의 <a href="https://www.freecodecamp.org/news/author/goran/">freeCodeCamp 프로필</a>과 <a href="https://medium.com/@goranaviani">Medium 프로필</a>에 더 많이 있고 <a href="https://github.com/GoranAviani">깃허브(GitHub) 페이지</a>에는 만들어둔 다른 재미있는 것들이 있으니 확인해 보세요.</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 파이썬 List .remove() - 파이썬 리스트에서 항목을 제거하는 방법 ]]>
                </title>
                <description>
                    <![CDATA[ 이 글에서는 파이썬 내장 함수 remove() list 메소드를 사용하는 법을 배우게 될 것입니다. 마지막에 이르면 파이썬에서 리스트 안에 항목을 제거하기 위해 remove()를 사용하는 법을 알게 될 것입니다. 우리가 다룰 내용들은:  1. remove() 메소드의 문법(syntax)  2. remove()를 사용하여 리스트의 구성요소를 제거  3. remove()는 어떤 항목의 첫번째 발생 경우만 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/paisseon-list-remove-paisseon-baeyeoleseo-hangmogeul-jegeohaneun-bangbeob/</link>
                <guid isPermaLink="false">63d42abc7a7b73070e797263</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Sat, 28 Jan 2023 22:50:35 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/01/pexels-pavel-danilyuk-5496463.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/python-list-remove-how-to-remove-an-item-from-a-list-in-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python List .remove() - How to Remove an Item from a List in Python</a>
      </p><!--kg-card-begin: markdown--><h3 id="removelist">이 글에서는 파이썬 내장 함수 <code>remove()</code> list 메소드를 사용하는 법을 배우게 될 것입니다.</h3>
<p>마지막에 이르면 파이썬에서 리스트 안에 항목을 제거하기 위해 <code>remove()</code>를 사용하는 법을 알게 될 것입니다.</p>
<p>우리가 다룰 내용들은:</p>
<ol>
<li><code>remove()</code> 메소드의 문법(syntax)</li>
<li><code>remove()</code>를 사용하여 리스트의 구성요소를 제거</li>
<li><code>remove()</code>는 어떤 항목의 첫번째 발생 경우만 삭제; 어떤 항목이 발생하는 모든 경우를 제거하는 방법</li>
</ol>
<h2 id="remove"><code>remove()</code> 메소드 - 문법 개요</h2>
<p><code>remove()</code> 메소드는 파이썬에서 리스트 안에 항목을 제거할 수 있는 방법 중 하나입니다.</p>
<p><code>remove()</code> 메소드는 리스트에서 항목을 <strong>값</strong>으로 삭제하며, 인덱스 번호로는 삭제하지 않습니다.</p>
<p><code>remove()</code> 메소드의 일반적인 문법(syntax)는 아래와 같습니다:</p>
<pre><code>list_name.remove(value)
</code></pre>
<p>구체적으로 살펴보면:</p>
<ul>
<li><code>list_name</code>은 작업하고자하는 리스트 이름입니다.</li>
<li><code>remove()</code>는 파이썬에 내장된 리스트 메소드 중 하나입니다.</li>
<li><code>remove()</code>는 하나의 <strong>필수</strong> 인수(argument)를 받습니다. 이를 제공하지 않으면 <code>TypeError</code>를, 구체적으로는<code>TypeError: list.remove() takes exactly one argument (0 given) </code>를 받게 됩니다.</li>
<li><code>value</code>는 <code>list_name</code>에서 제거하고 싶은 항목의 특정 값입니다.</li>
</ul>
<p><code>remove()</code> 메소드는 제거된 값을 반환하지 않고 그 대신 반환 값이 없다는 뜻의 <code>None</code>을 반환합니다.</p>
<p>인덱스 번호를 통해 항목을 삭제해야 하거나 어떤 이유로든 제거된 값을 반환 (저장)하고 싶다면 <a href="https://www.freecodecamp.org/news/python-pop-how-to-pop-from-a-list-or-an-array-in-python/"><code>pop()</code> 메소드</a>를 대신 사용하세요.</p>
<h2 id="remove">파이썬에서 <code>remove()</code> 메소드를 사용해 리스트에서 구성요소를 삭제하는 방법</h2>
<p><code>remove()</code> 메소드를 사용해 리스트에서 구성요소를 삭제하기 위해서는 해당 구성요소의 값을 특정하고 메소드에 인자로 넘기면 됩니다.</p>
<p><code>remove()</code>는 그 값을 찾기 위해 리스트을 검색하고 값을 삭제할 것입니다.</p>
<pre><code class="language-{python}">#original list
programming_languages = ["JavaScript", "Python", "Java", "C++"]

#print original list
print(programming_languages)

# remove the value 'JavaScript' from the list
programming_languages.remove("JavaScript")

#print updated list
print(programming_languages)

#output

#['JavaScript', 'Python', 'Java', 'C++']
#['Python', 'Java', 'C++']
</code></pre>
<p>만약 리스트 안에 포함되어 있지 않은 값을 특정한다면 에러를 - 구체적으로는 <code>ValueError</code>를 받을 것입니다:</p>
<pre><code class="language-{python}">programming_languages = ["JavaScript", "Python", "Java", "C++"]

#I want to remove the value 'React'
programming_languages.remove("React")

#print list
print(programming_languages)

#output

# line 5, in &lt;module&gt;
#programming_languages.remove("React")
#ValueError: list.remove(x): x not in list
</code></pre>
<p>에러가 발생하는 것을 방지하기 위해 첫번째로 할 수 있는 일은 <code>in</code> 키워드를 사용하여 리스트 안에 삭제하고자 하는 해당 값으로 시작하는 항목이 있는지 확인하는 것입니다.</p>
<p>논리 값(Boolean value) - 리스트 안에 항목이 있다면 <code>True</code>를, 해당 값이 리스트 안에 없다면 <code>False</code>를 반환할 것입니다.</p>
<pre><code class="language-{python}">programming_languages = ["JavaScript", "Python", "Java", "C++"]

#check if 'React' is in the 'programming_languages' list
print("React" in programming_languages)

#output
#False
</code></pre>
<p>에러를 방지하기 위한 다른 방법은 조건문을 생성해서 "만약 이 값이 리스트 안에 있으면 삭제하라. 존재하지 않으면 리스트 안에 포함되어 있지 않다고 말하는 메세지를 보여라"고 할 수 있습니다.</p>
<pre><code class="language-{python}">programming_languages = ["JavaScript", "Python", "Java", "C++"]

if "React" in programming_languages:
    programming_languages.remove("React")
else:
    print("This value does not exist")

#output
#This value does not exist
</code></pre>
<p>이제 존재하지 않는 특정한 값을 삭제하려다 파이썬 에러를 얻는 대신 작업하고 있는 리스트 안에 삭제하고 싶은 항목이 없다고 말하는 메세지를 돌려 받을 것입니다.</p>
<h2 id="remove"><code>remove()</code> 메소드는 어떤 항목의 첫번째 발생 경우만 제거</h2>
<p><code>remove()</code> 메소드를 사용할 때 유념해야 할 것은 어떤 항목의 <strong>첫번째*</strong> 발생 경우만 검색하고 삭제할 것이라는 점입니다.</p>
<p>이것은 메소드 인자로 넘긴 값을 가진 항목이 리스트 안에 하나 이상 존재한다면 첫번째 발생 경우만 삭제될 것을 의미합니다.</p>
<p>아래 예제를 살펴봅시다:</p>
<pre><code class="language-{python}">programming_languages = ["JavaScript", "Python", "Java", "Python", "C++", "Python"]

programming_languages.remove("Python")

print(programming_languages)

#output
#['JavaScript', 'Java', 'Python', 'C++', 'Python']
</code></pre>
<p>위의 코드에서 리스트 안에 <code>Python</code>이라는 값을 가진 항목은 세 차례 나타납니다.</p>
<p><code>remove()</code>가 사용되었을 때 첫번째 일치하는 인스턴스(instance)만 삭제됩니다 - <code>JavaScript</code> 값 다음에 나오고 <code>Java</code> 값 앞에 있던 것 말입니다.</p>
<p>나머지 두 번의 <code>Python</code> 발생들은 리스트 안에 그대로 있습니다.</p>
<p>만약 어떤 항목이 발생하는 모든 경우를 제거하고 싶으면 어떻게 할까요?</p>
<p>다시 말하자면 특정한 항목의 첫번째 인스턴스만을 삭제하고 싶지 않을 경우도 있을 수 있습니다. 그리고 이것은 <code>remove()</code> 단독으로 사용해서는 이룰 수 없습니다</p>
<h2 id="">파이썬 리스트 안에 어떤 항목에 해당하는 모든 인스턴스를 제거하는 방법</h2>
<p>리스트 안에 어떤 항목에 해당하는 모든 인스턴스를 제거하는 방법 중 하나는 리스트 축약(list comprehension)을 활용하는 것입니다.</p>
<p>리스트 축약이란 존재하고 있는 리스트로부터 새로운 리스트을 생성하거나 부분리스트(sublist)을 생성하는 것입니다.</p>
<p>이는 원본 리스트을 수정하지 않지만 설정한 조건을 만족하는 새로운 것을 대신 생성하게 될 것입니다.</p>
<pre><code class="language-{python}">#original list
programming_languages = ["JavaScript", "Python", "Java", "Python", "C++", "Python"]

#sublist created with list comprehension
programming_languages_updated = [value for value in programming_languages if value != "Python"]


#print original list
print(programming_languages)

#print  new sublist that doesn't contain 'Python'
print(programming_languages_updated)

#output

#['JavaScript', 'Python', 'Java', 'Python', 'C++', 'Python']
#['JavaScript', 'Java', 'C++']
</code></pre>
<p>위의 예제에서 원본 리스트 <code>programming_languages</code>이 있습니다.</p>
<p>그리고 새로운 리스트(또는 부분리스트)이 반환되었습니다.</p>
<p>부분리스트 안에 포함된 항목들은 조건을 만족해야만 합니다. 조건은 '원본 리스트 안에 <code>Python</code>이라는 값이 있는 항목이 있으면' 부분리스트에 일부가 되지 않는다는 것입니다.</p>
<p>이번에는 새로운 리스트을 만들고 싶지 않지만 대신 기존에 존재하던 리스트을 *대체(in-place)*하고 싶다고 해 본다면, 리스트 축약에 슬라이스(slice) 지정을 합하여 사용하세요.</p>
<p>슬라이스 지정이 되어 있을 때 리스트에서 특정 부분 (또는 슬라이스)를 수정하고 교체할 수 있습니다.</p>
<p>전체 리스트을 교체하기 위해서는 슬라이스 문법(slicing syntax) <code>[:]</code>를 리스트 축약과 같이 사용하세요.</p>
<p>리스트 축약은 <code>Python</code>이라는 값을 가진 어떤 항목이라도 더 이상 리스트 안에 자리할 수 없다는 조건을 설정합니다.</p>
<pre><code class="language-{python}">programming_languages = ["JavaScript", "Python", "Java", "Python", "C++", "Python"]

programming_languages[:] = (value for value in programming_languages if value != "Python")

print(programming_languages)

#output

#['JavaScript', 'Java', 'C++']
</code></pre>
<h2 id="">결론</h2>
<p>완성했어요! 파이썬에서 <code>remove()</code> 메소드를 사용하여 리스트 항목을 삭제하는 방법을 알게 되었습니다. 또한 파이썬에서 리스트 안에 어떤 항목에 해당하는 모든 인스턴스를 제거하는 몇 가지 방법을 보았습니다.</p>
<p>이 글이 유용하면 좋겠네요.</p>
<p>파이썬 프로그래밍 언어에 대해 더 배우기 위해서는 freeCodeCamp의 <a href="https://www.freecodecamp.org/learn/scientific-computing-with-python/">Scientific Computing with Python Certification</a>을 확인하세요.</p>
<p>기초부터 시작해서 상호작용하며 초급자 친화적인 방법으로 배우게 될 것입니다. 또한 마지막에는 실습에서 5개의 프로젝트를 완성하여 배운 것을 보충하게 될 것입니다.</p>
<p>읽어주셔서 감사하고 코딩 재밌게 하세요 😊!</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 파이썬 문자열에서 문자 삭제하기 – How to Delete Characters from Strings ]]>
                </title>
                <description>
                    <![CDATA[ 파이썬에서는 문자열(string)에서 제거하고 싶은 어떤 문자(characters)를 특정하고 새로 수정된 문자열 결과를 반환하기 위해  replace()와 translate() 메소드를 사용할 수 있습니다. 문자열은 변경할 수 없는 속성을 가지기 때문에 기존 문자열은 수정되지 않을 것임을 기억하는 게 중요합니다. 이 글에서는 코드 예제들을 사용하여 replace()와 translate() 메소드를 사용하는 법을 보여줄 것입니다. 파이썬 replace() 메소드 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/paisseon-munjayeoleseo-munja-sagjehagi-how-to-delete-characters-from-strings/</link>
                <guid isPermaLink="false">63b13a3cea0d15062eda2086</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Sat, 28 Jan 2023 22:49:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/01/fotis-fotopoulos-LJ9KY8pIH3E-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/python-remove-character-from-a-string-how-to-delete-characters-from-strings/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python Remove Character from a String – How to Delete Characters from Strings</a>
      </p><!--kg-card-begin: markdown--><h3 id="stringcharactersreplacetranslate">파이썬에서는 문자열(string)에서 제거하고 싶은 어떤 문자(characters)를 특정하고 새로 수정된 문자열 결과를 반환하기 위해 <code>replace()</code>와 <code>translate()</code> 메소드를 사용할 수 있습니다.</h3>
<p>문자열은 변경할 수 없는 속성을 가지기 때문에 기존 문자열은 수정되지 않을 것임을 기억하는 게 중요합니다.</p>
<p>이 글에서는 코드 예제들을 사용하여 <code>replace()</code>와 <code>translate()</code> 메소드를 사용하는 법을 보여줄 것입니다.</p>
<h2 id="replace">파이썬 replace() 메소드 사용하는 법</h2>
<p><code>replace()</code> 메소드의 기본 문법(syntax)는 이와 같습니다.</p>
<pre><code>str.replace(old_str, new_str[, optional_max])
</code></pre>
<p><code>old_str</code> 매개변수(parameter)는 교체하고 싶은 부분문자열을 의미합니다.</p>
<p><code>new_str</code> 매개변수는 새로 사용하고 싶은 부분문자열을 의미합니다.</p>
<p><code>optional_max</code> 매개변수는 교체할 부분문자열을 새로운 부분문자열로 최대 몇 번이나 변경할지 횟수를 의미합니다.</p>
<p><code>replace()</code>메소드의 반환 값은 기존 문자열을 복사하여 교체할 문자열을 새로운 문자열로 바꾼 것입니다.</p>
<h3 id="replace">파이썬 replace() 예제</h3>
<p>몇가지 예제들을 살펴보겠습니다.</p>
<p>첫번째 예제에서는 제 이름이 지정된 <code>developer</code>라는 문자열을 가지고 있습니다.</p>
<pre><code>developer = 'Jessica Wilkins'
</code></pre>
<p>저의 성을 지우고 싶다면 <code>replace()</code> 메소드를 이런 식으로 사용할 수 있습니다:</p>
<pre><code>developer.replace('Wilkins', '')
</code></pre>
<p>이것은 컴퓨터에게 문자열 <code>Wilkins</code>를 가지고 빈칸으로 교체하라고 말합니다.</p>
<p>결과값을 출력한다면 아래와 같이 얻게 될 것입니다:</p>
<pre><code>print(developer.replace('Wilkins', ''))
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screen-Shot-2022-03-06-at-8.41.55-PM.png" alt="예제사진01" width="600" height="400" loading="lazy"></p>
<p>문자열은 변경할 수 없는 속성을 가지기 때문에 기존 문자열은 수정되지 않을 것임을 기억하는 게 중요합니다. <code>replace()</code> 메소드는 새로운 문자열을 반환할 것입니다.</p>
<p>다음 예제에서는 제 이름에서 문자 <code>s</code>를 삭제하길 원하는 횟수를 지정하기 위해 <code>optional_max</code> 매개변수를 사용하고 싶습니다.</p>
<pre><code>developer.replace('s', '', 2)
</code></pre>
<p>해당 코드 라인은 문자열 <code>Jessica Wilkins</code>에서 문자 <code>s</code>를 두 번만 삭제하라고 말합니다.</p>
<p>결과값을 출력한다면 아래와 같이 보일 것입니다:</p>
<pre><code>print(developer.replace('s', '', 2))
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screen-Shot-2022-03-06-at-8.55.22-PM.png" alt="print(developer.replace('s', '', 2)) 코드가 실행 되어 Jessica Wilkins라는 문자열이 Jeica Wilkins가 된 결과 모습" width="600" height="400" loading="lazy"></p>
<h2 id="translate">파이썬 translate() 메소드 사용하는 방법</h2>
<p>문자열에서 문자를 제거하는 또다른 방법은 <code>translate()</code> 메소드를 사용하는 것입니다. 이 메소드는 각각의 문자에서 교체할 문자열을 번역 테이블(translation table)에 연결(map)하여 새로운 문자열로 번역한 것을 반환한 것입니다.</p>
<p>파이썬 <code>translate()</code> 메소드의 기본 문법(syntax)는 이와 같습니다.</p>
<pre><code>str.translate(table)
</code></pre>
<h3 id="translate">파이썬 translate() 예제</h3>
<p>translate() 메소드를 더 잘 이해하기 위해 몇가지 예제들을 살펴보겠습니다.</p>
<p>이번 예제에서는 <code>Jessica Wilkins</code>에서 문자 <code>i</code>에 해당하는 모든 경우를 삭제하고 싶습니다.</p>
<p>우리는 먼저 문자 <code>i</code>의 유니코드 포인트 값을 얻기 위해 파이썬 내장 함수 <code>ord()</code>를 이용해야 합니다. <code>ord()</code> 함수는 숫자값을 반환할 것입니다.</p>
<pre><code>ord('i')
</code></pre>
<p>테이블에서 우리는 <code>None</code> 값을 배정해 컴퓨터가 <code>i</code>를 공백으로 교체할 것을 알게 만들 필요가 있습니다.</p>
<pre><code>{ord('i'): None}
</code></pre>
<p>이제 <code>translate()</code> 메소드 안에 우리 테이블을 사용합니다.</p>
<pre><code>developer.translate({ord('i'): None})
</code></pre>
<p>결과값을 출력한다면 아래와 같이 보일 것입니다:</p>
<pre><code>developer = 'Jessica Wilkins'

print(developer.translate({ord('i'): None}))
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screen-Shot-2022-03-06-at-10.24.52-PM.png" alt="print(developer.translate({ord('i'): None})) 코드가 실행 되어 Jessica Wilkins라는 문자열이 Jessca Wlkns가 된 결과 모습" width="600" height="400" loading="lazy"></p>
<p>다음 예제에서는 문자 <code>e</code>, <code>s</code>, <code>i</code>가 제거된 새로운 문자열을 반환하고 싶습니다. 이를 위해 우리는 우리의 테이블 매개변수에서 순환기(iterator)를 사용할 수 있습니다.</p>
<pre><code>{ord(letter): None for letter in 'esi'}
</code></pre>
<p>해당 코드 라인은 컴퓨터에게 <code>e</code>, <code>s</code>, <code>i</code>가 발생하는 모든 경우를 찾아서 <code>None</code>으로 교체하라고 말합니다.</p>
<p>결과값을 출력한다면 아래와 같이 보일 것입니다:</p>
<pre><code>developer = 'Jessica Wilkins'

print(developer.translate({ord(letter): None for letter in 'esi'}))
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screen-Shot-2022-03-06-at-10.37.10-PM.png" alt="print(developer.translate({ord(letter): None for letter in 'esi'}))가 실행되어 Jessica Wilkins가 Jca Wlkn가 된 결과 모습" width="600" height="400" loading="lazy"></p>
<h2 id="">결론</h2>
<p>파이썬에서는 문자열(string)에서 제거하고 싶은 어떤 문자(characters)를 특정하고 새로 수정된 문자열 결과를 반환하기 위해 <code>replace()</code>와 <code>translate()</code> 메소드를 사용할 수 있습니다.</p>
<p>문자열은 변경할 수 없는 속성을 가지기 때문에 기존 문자열은 수정되지 않을 것임을 기억하는 게 중요합니다.</p>
<p><code>replace()</code> 메소드의 기본 문법(syntax)는 이와 같습니다.</p>
<pre><code>str.replace(old_str, new_str[, optional_max])
</code></pre>
<p><code>replace()</code>메소드의 반환 값은 기존 문자열을 복사하여 교체할 문자열을 새로운 문자열로 바꾼 것입니다.</p>
<p>문자열에서 문자를 제거하는 또다른 방법은 <code>translate()</code> 메소드를 사용하는 것입니다. 이 메소드는 각각의 문자에서 교체할 문자열을 번역 테이블(translation table)에 연결(map)하여 새로운 문자열로 번역한 것을 반환한 것입니다.</p>
<p>파이썬 <code>translate()</code> 메소드의 기본 문법(syntax)는 이와 같습니다.</p>
<pre><code>str.translate(table)
</code></pre>
<p>이 글을 재미있게 읽었길 바라고 당신의 파이썬 항해에 행운을 빌겠습니다.</p>
<!--kg-card-end: markdown--><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Pandas를 사용한 데이터 분석 - Pandas Dataframe에서 행을 제거하는 방법 ]]>
                </title>
                <description>
                    <![CDATA[ Pandas Dataframe은 행과 열에 데이터를 저장할 수 있는 2차원 데이터 구조입니다. 데이터를 분석할 때 무척 유용합니다. Dataframe에 데이터 기록 목록을 가지고 있을 때, 모델의 필요성과 분석을 학습할 때 목표에 따라서 특정 행을 제거해야 할 수도 있습니다. 이번 튜토리얼에서는 Pandas dataframe에서 일련의 행을 어떻게 제거하는지 배울 것입니다. 열을 제거하는 방법을 배우기 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/untitled/</link>
                <guid isPermaLink="false">637ba6154d426206f9a4fbb1</guid>
                
                    <category>
                        <![CDATA[ Data Analytics ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Tue, 22 Nov 2022 14:26:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/11/pic_cut_lemons.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/drop-list-of-rows-from-pandas-dataframe/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Data Analytics with Pandas – How to Drop a List of Rows from a Pandas Dataframe</a>
      </p><!--kg-card-begin: markdown--><h4 id="pandasdataframe2">Pandas Dataframe은 행과 열에 데이터를 저장할 수 있는 2차원 데이터 구조입니다. 데이터를 분석할 때 무척 유용합니다.</h4>
<p>Dataframe에 데이터 기록 목록을 가지고 있을 때, 모델의 필요성과 분석을 학습할 때 목표에 따라서 특정 행을 제거해야 할 수도 있습니다.</p>
<p>이번 튜토리얼에서는 Pandas dataframe에서 일련의 행을 어떻게 제거하는지 배울 것입니다.</p>
<p>열을 제거하는 방법을 배우기 위해서는 이 글을 참고하세요: <a href="https://www.stackvidhya.com/drop-column-in-pandas/">How to Drop Columns in Pandas</a></p>
<h3 id="pandasdataframe">Pandas Dataframe에서 행 또는 열을 제거하는 법</h3>
<p>Dataframe에서 행 또는 열을 제거하려면 dataframe에서 사용가능한 <code>drop()</code> 메소드를 이용해야 합니다. <code>drop()</code> 메소드에 대해서 <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html">여기 공식 문서</a>에서 상세히 읽을 수 있습니다.</p>
<p><em>Dataframe Axis(축)</em></p>
<ul>
<li>행은 <code>axis=0</code>으로 나타내고</li>
<li>열은 <code>axis=1</code>으로 나타납니다.</li>
</ul>
<p><em>Dataframe Labels(표기)</em></p>
<ul>
<li>행은 기본적으로 0으로 시작하는 인덱스 번호로 표기되고</li>
<li>열은 이름을 이용하여 표기됩니다.</li>
</ul>
<p><em>Drop() 메소드 매개변수</em></p>
<ul>
<li><code>index</code> - 삭제할 행의 목록</li>
<li><code>axis=0</code> - dataframe의 행이 삭제될 것이라는 표기</li>
<li><code>inplace=True</code> - 삭제 연산 중에 새로운 dataframe 객체를 생성하는 대신 동일한 dataframe에서 제거 연산을 실행합니다.</li>
</ul>
<h3 id="pandasdataframe">Pandas DataFrame 예제</h3>
<p>예시 dataframe은 <em>product_name</em>, <em>Unit_Price</em>, <em>No_Of_Units</em>, <em>Available_Quantity</em>, <em>Available_Since_Date</em> 열을 포함하고 있습니다. 또한 결측값(missing values)을 표기하는데 사용된 NaN 값이 있는 행도 있습니다.</p>
<pre><code class="language-python">import pandas as pd
data = {"product_name":["Keyboard","Mouse", "Monitor", "CPU","CPU", "Speakers",pd.NaT],
        "Unit_Price":[500,200, 5000.235, 10000.550, 10000.550, 250.50,None],
        "No_Of_Units":[5,5, 10, 20, 20, 8,pd.NaT],
        "Available_Quantity":[5,6,10,"Not Available","Not Available", pd.NaT,pd.NaT],
        "Available_Since_Date":['11/5/2021', '4/23/2021', '08/21/2021','09/18/2021','09/18/2021','01/05/2021',pd.NaT]
       }
df = pd.DataFrame(data)
df
</code></pre>
<p>Dataframe은 이렇게 보일 것입니다:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
<pre><code>.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</code></pre>
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>product_name</th>
      <th>Unit_Price</th>
      <th>No_Of_Units</th>
      <th>Available_Quantity</th>
      <th>Available_Since_Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Keyboard</td>
      <td>500.000</td>
      <td>5</td>
      <td>5</td>
      <td>11/5/2021</td>
    </tr>
    <tr>
      <th>1</th>
      <td>Mouse</td>
      <td>200.000</td>
      <td>5</td>
      <td>6</td>
      <td>4/23/2021</td>
    </tr>
    <tr>
      <th>2</th>
      <td>Monitor</td>
      <td>5000.235</td>
      <td>10</td>
      <td>10</td>
      <td>08/21/2021</td>
    </tr>
    <tr>
      <th>3</th>
      <td>CPU</td>
      <td>10000.550</td>
      <td>20</td>
      <td>Not Available</td>
      <td>09/18/2021</td>
    </tr>
    <tr>
      <th>4</th>
      <td>CPU</td>
      <td>10000.550</td>
      <td>20</td>
      <td>Not Available</td>
      <td>09/18/2021</td>
    </tr>
    <tr>
      <th>5</th>
      <td>Speakers</td>
      <td>250.500</td>
      <td>8</td>
      <td>NaT</td>
      <td>01/05/2021</td>
    </tr>
    <tr>
      <th>6</th>
      <td>NaT</td>
      <td>NaN</td>
      <td>NaT</td>
      <td>NaT</td>
      <td>NaT</td>
    </tr>
  </tbody>
</table>
</div><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>그리고 우리가 만든 예시 dataframe과 같습니다.<br>
각각의 제거 작업 후 dataframe을 일반 <code>HTML</code> 표 형태로 출력하는 <code>df</code>를 이용해서 dataframe을 출력할 것입니다.<br>
Dataframe을 다른 시각적 형태로 출력하는 방법에 대해서는 여기 <a href="https://www.stackvidhya.com/pretty-print-dataframe/">Pretty Print a Dataframe</a>에서 읽을 수 있습니다.<br>
다음으로, 행을 제거하는 다른 활용 사례들을 배우겠습니다.</p>
<h3 id="pandas">Pandas에서 인덱스를 이용해 행을 삭제하는 법</h3>
<p>Pandas에서 인덱스 목록을 <code>drop()</code> 메소드의 매개변수로 넘겨서 일련의 행을 제거할 수 있습니다.</p>
<pre><code class="language-python">df.drop([5,6], axis=0, inplace=True)
df
</code></pre>
<p>이 코드에서,</p>
<ul>
<li><code>[5,6]</code>은 당신이 제거하고 싶은 인덱스를</li>
<li><code>axis=0</code>은 dataframe에서 행이 제거된다는 표기를</li>
<li><code>inplace=True</code>는 동일한 dataframe에서 삭제 연산을 실행합니다.</li>
</ul>
<p>인덱스 5와 6을 가진 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
<pre><code>.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</code></pre>
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>product_name</th>
      <th>Unit_Price</th>
      <th>No_Of_Units</th>
      <th>Available_Quantity</th>
      <th>Available_Since_Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Keyboard</td>
      <td>500.000</td>
      <td>5</td>
      <td>5</td>
      <td>11/5/2021</td>
    </tr>
    <tr>
      <th>1</th>
      <td>Mouse</td>
      <td>200.000</td>
      <td>5</td>
      <td>6</td>
      <td>4/23/2021</td>
    </tr>
    <tr>
      <th>2</th>
      <td>Monitor</td>
      <td>5000.235</td>
      <td>10</td>
      <td>10</td>
      <td>08/21/2021</td>
    </tr>
    <tr>
      <th>3</th>
      <td>CPU</td>
      <td>10000.550</td>
      <td>20</td>
      <td>Not Available</td>
      <td>09/18/2021</td>
    </tr>
    <tr>
      <th>4</th>
      <td>CPU</td>
      <td>10000.550</td>
      <td>20</td>
      <td>Not Available</td>
      <td>09/18/2021</td>
    </tr>
  </tbody>
</table>
</div><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>이것이 특정 인덱스를 가지고 행을 제거할 수 있는 방법입니다.<br>
다음으로, 인덱스 범위를 삭제하는 것에 대해 배우겠습니다.</p>
<h3 id="pandas">Pandas에서 인덱스 범위를 이용해 행을 삭제하는 방법</h3>
<p>특정 범위 안에 포함된 일련의 행을 삭제할 수 있습니다.<br>
범위라는 것은 하한선과 상한선을 가진 값들의 세트입니다.<br>
이 방법은 특정 범위의 데이터를 제외한 예시 데이터셋을 생성하길 원할 때 유용할 수도 있습니다.<br>
Dataframe에 <code>df.index()</code> 메소드를 사용하여 행의 범위를 생성할 수 있습니다. 그리고나서 그 범위를 <code>drop()</code> 메소드로 넘겨 아래와 같이 행을 삭제할 수 있습니다.</p>
<pre><code class="language-python">df.drop(df.index[2:4], inplace=True)
df
</code></pre>
<p>이 코드에서 수행하는 동작입니다:</p>
<ul>
<li><code>df.index[2:4]</code>가 2에서 4까지 행의 범위를 생성합니다. 범위의 하한선은 포함되어 있고 상한선은 제외됩니다. 다시 말해서 2행과 3행이 제거 되고 4행은 제거되지 <em>않는다</em>는 의미입니다.</li>
<li><code>inplace=True</code>는 동일한 dataframe에서 삭제 연산을 실행합니다.</li>
</ul>
<p>2에서 4 사이 범위안의 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
<pre><code>.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</code></pre>
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>product_name</th>
      <th>Unit_Price</th>
      <th>No_Of_Units</th>
      <th>Available_Quantity</th>
      <th>Available_Since_Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Keyboard</td>
      <td>500.00</td>
      <td>5</td>
      <td>5</td>
      <td>11/5/2021</td>
    </tr>
    <tr>
      <th>1</th>
      <td>Mouse</td>
      <td>200.00</td>
      <td>5</td>
      <td>6</td>
      <td>4/23/2021</td>
    </tr>
    <tr>
      <th>4</th>
      <td>CPU</td>
      <td>10000.55</td>
      <td>20</td>
      <td>Not Available</td>
      <td>09/18/2021</td>
    </tr>
  </tbody>
</table>
</div><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>이것이 (인덱스) 범위를 이용해서 dataframe안에 일련의 행을 삭제할 수 있는지 방법입니다.</p>
<h2 id="pandas">Pandas에서 인덱스 이후 모든 행을 삭제하는 방법</h2>
<p><code>iloc[]</code>을 이용하려 특정 인덱스 이후 모든 행을 삭제할 수 있습니다.<br>
<code>iloc[]</code>은 양수 인덱스를 사용하여 행을 선택하기 위해 사용할 수 있습니다. 시작점과 끝점을 <code>:</code>으로 구분시켜 명시할 수 있습니다. 예를 들어, <code>2:3</code>을 2행부터 3행까지 선택하기 위해 사용할 수 있습니다. 만약 모든 행을 선택하고 싶다면 그냥 <code>:</code>을 <code>iloc[]</code>에 사용하실 수 있습니다.</p>
<p>이 방법은 당신이 데이터셋을 학습(training)과 시험(testing) 목적으로 나누고자 할 때 유용할 수도 있습니다.<br>
0부터 인덱스 2까지 행을 선택하기 위해 아래를 사용하세요. 이것은 인덱스 2 이후 행을 삭제하는 결과를 냅니다.</p>
<pre><code class="language-python">df = df.iloc[:2]
df
</code></pre>
<p>이 코드에서, <code>:2</code>는 인덱스 2에 이르기까지 행을 선택합니다.</p>
<p>이것이 특정 인덱스 이후 모든 행을 삭제할 수 있는지 방법입니다.<br>
인덱스 2 이후 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }
<pre><code>.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</code></pre>
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>product_name</th>
      <th>Unit_Price</th>
      <th>No_Of_Units</th>
      <th>Available_Quantity</th>
      <th>Available_Since_Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Keyboard</td>
      <td>500.0</td>
      <td>5</td>
      <td>5</td>
      <td>11/5/2021</td>
    </tr>
    <tr>
      <th>1</th>
      <td>Mouse</td>
      <td>200.0</td>
      <td>5</td>
      <td>6</td>
      <td>4/23/2021</td>
    </tr>
  </tbody>
</table>
</div><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>이것이 특정 인덱스 이후 모든 행을 삭제할 수 있는지 방법입니다.</p>
<p>다음으로, 조건을 가진 행을 삭제하는 방법에 대해 배우겠습니다.</p>
<h3 id="pandas">Pandas에서 여러 조건을 가진 행을 삭제하는 법</h3>
<p>Dataframe에서 특정 조건을 기반으로 행을 삭제할 수 있습니다.<br>
예를 들어, 열의 값이 <em>X</em>보다 크고 <em>Y</em>보다 작은 행을 삭제할 수 있습니다.<br>
이 방법은 당신이 데이터셋을 특정 값을 가진 열을 무시하고 생성하고자 할 때 유용할 수도 있습니다.<br>
지정 조건을 기반으로 행을 삭제하기 위해서는, 특정 조건을 전달하는 행의 인덱스를 선택하고 그 인덱스를 <code>drop()</code> 메소드로 넘깁니다.</p>
<pre><code class="language-python">df.drop(df[(df['Unit_Price'] &gt;400) &amp; (df['Unit_Price'] &lt; 600)].index, inplace=True)
df
</code></pre>
<p>이 코드에서,</p>
<ul>
<li><code>(df['Unit_Price'] &gt;400) &amp; (df['Unit_Price'] &lt; 600)</code>은 행을 삭제하기 위한 조건이고</li>
<li><code>df[].index</code>는 조건을 넘기는 행의 인덱스를 선택하며</li>
<li><code>inplace=True</code>는 새로운 것(dataframe)을 만드는 대신 동일한 dataframe에서 삭제 연산을 실행합니다.</li>
</ul>
<p><code>unit_price</code>가 400보다 크고 600보다 작은 것을 가진 조건에 해당하는 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:</p>
<p>이것이 지정 조건을 이용해서 dataframe의 행을 삭제할 수 있는지 방법입니다.</p>
<h2 id="">결론</h2>
<p>요약하면 이 글에서 Pandas dataframe에서 <code>drop()</code> 메소드가 무엇인지 배웠습니다. 또한 어떻게 dataframe 행렬들이 표기되는지 볼 수 있었습니다. 마지막으로 어떻게 인덱스 및 인덱스 범위, 그리고 조건들을 기반으로 행을 삭제하는 방법을 배웠습니다.</p>
<p>이 글을 좋아한다면 편하게 공유하세요.</p>
<h2 id="">좋아할지도 모르는 글</h2>
<ul>
<li><a href="https://www.stackvidhya.com/add-column-to-dataframe/">How to Add a Column to a Dataframe in Pandas</a></li>
<li><a href="https://www.stackvidhya.com/rename-columns-in-pandas/">How to Rename a Column in Pandas</a></li>
</ul>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ AppData - Windows 10에서 AppData 폴더를 찾는 방법 ]]>
                </title>
                <description>
                    <![CDATA[ AppData 폴더는 당신의 윈도우 컴퓨터에 있는 어플리케이션에 고유한 어플리케이션 설정, 파일, 데이터를 포함하고 있습니다. 윈도우 파일 탐색기에서는 기본적으로 숨김 처리 되어 있으며 3개의 숨겨진 하위 폴더를 가지고 있습니다: Local, LocalLow, Roaming. 이 폴더를 매우 자주 이용하지는 않겠지만 당신의 중요한 파일이 자리잡고 있는 곳입니다. 예를 들어, 즐겨찾기나 저장된 세션 같은 것들이요. ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/appdata-windows-10eseo-appdata-poldeoreul-cajneun-bangbeob/</link>
                <guid isPermaLink="false">6375f802ae55f30622fe2e51</guid>
                
                    <category>
                        <![CDATA[ Windows 10 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chaeyoon Kim ]]>
                </dc:creator>
                <pubDate>Tue, 22 Nov 2022 14:11:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/11/pic_notebook.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/appdata-where-to-find-the-appdata-folder-in-windows-10/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">AppData – Where to Find the AppData Folder in Windows 10</a>
      </p><!--kg-card-begin: markdown--><h3 id="appdata3locallocallowroaming">AppData 폴더는 당신의 윈도우 컴퓨터에 있는 어플리케이션에 고유한 어플리케이션 설정, 파일, 데이터를 포함하고 있습니다. 윈도우 파일 탐색기에서는 기본적으로 숨김 처리 되어 있으며 3개의 숨겨진 하위 폴더를 가지고 있습니다: Local, LocalLow, Roaming.</h3>
<p>이 폴더를 매우 자주 이용하지는 않겠지만 당신의 중요한 파일이 자리잡고 있는 곳입니다. 예를 들어, 즐겨찾기나 저장된 세션 같은 것들이요.</p>
<p>이번 안내글에서는 윈도우에 AppData 폴더를 어떻게 찾아서 숨김을 풀고 접근할 수 있는지 배우게 될 것입니다.</p>
<h2 id="appdata">AppData 폴더는 무엇일까요?</h2>
<p>윈도우 어플리케이션들은 종종 설정이나 임시 데이터를 AppData 폴더에 저장합니다. 윈도우 사용자 계정마다 각각의 AppData 폴더를 가지고 있습니다. 앞서 언급한 것처럼 AppData 안에는 3개의 하위 폴더가 있습니다 - Local, LocalLow, Roaming.</p>
<p>Local 폴더는 단일 윈도우 시스템 하나에 특정한 데이터를 저장하는데 사용되고, 이 말은 즉 여러 개의 컴퓨터 사이에서 데이터가 동기화되지 않는다는 것을 의미합니다.</p>
<p>LocalLow 폴더는 Local 폴더와 동일합니다만, 예를 들어 Mozilla Firefox(웹 브라우저)를 프라이빗 모드로 사용할 때처럼 어플리케이션이 낮은 단계 무결성으로 제한적인 보안 설정 상황을 구동할 때 사용된다는 차이가 있습니다.</p>
<p>Roaming 폴더는 여러 윈도우 시스템을 아울러 동기화 할 수 있는 데이터를 저장하는데 사용됩니다. 이는 종종 즐겨찾기나 저장된 비밀번호 같은 설정들을 저장하는데 사용됩니다.</p>
<h2 id="appdata">AppData 폴더를 어떻게 찾아 볼까요?</h2>
<p>AppData 폴더에 접근할 수 있는 두 가지 방법이 있습니다. 단계별로 찾아가거나 또는 "AppData" 변수 이름을 사용하는 것입니다.</p>
<p>C 드라이브에 있는 사용자 폴더 안으로 단계별로 찾아가 AppData 폴더를 볼 수 있습니다. 제 경우에는 경로가 C:\Users\ADMIN입니다.</p>
<p>다음으로 상단에 위치한 "View(보기)" 메뉴에 가서 아래 보이는 것처럼 "Hidden items(숨김 항목)"을 선택합니다:<br>
<img src="https://www.freecodecamp.org/news/content/images/2020/07/Screenshot_373.png" alt="폴더 사진" width="600" height="400" loading="lazy"></p>
<p>이제 User(사용자) 폴더 안에서 AppData 폴더를 볼 수 있을 것입니다.</p>
<p>AppData 시스템 변수를 이용해 곧바로 AppData 폴더에 접근할 수도 있습니다. 윈도우 검색에서 아래 보이는 것처럼 "Run(실행)"을 찾거나 키보드에서 윈도우 키와 R 버튼을 눌러 Run(실행) 앱을 엽니다.<br>
<img src="https://www.freecodecamp.org/news/content/images/2020/07/Screenshot_374.png" alt="검색 사진" width="600" height="400" loading="lazy"></p>
<p>Run(실행) 앱 글자 상자에 "%AppData%"을 입력하고 OK(확인)을 선택합니다. 그러면 윈도우는 AppData 폴더 안에 있는 Roaming 폴더를 직접 열 것입니다.<br>
<img src="https://www.freecodecamp.org/news/content/images/2020/07/Screenshot_375.png" alt="실행 사진" width="600" height="400" loading="lazy"></p>
<h2 id="">마무리</h2>
<p>이번 안내글을 읽고 컴퓨터에서 AppData 폴더를 찾을 수 있길 바랄게요.</p>
<p>통상적으로 AppData 폴더 안에 있는 데이터를 걱정할 필요는 없습니다 - 그렇기 때문에 기본적으로 숨겨져 있습니다. 어플리케이션 개발자가 어플리케이션에 필요한 데이터를 저장하는 데만 사용됩니다.</p>
<p>일상적인 윈도우 이용자들은 만약 어플리케이션 데이터를 백업할 경우에만 AppData 폴더에 접근하거나 보게 될 것입니다.</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
