<?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[ Alison Yoon - 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[ Alison Yoon - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/korean/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 19 May 2026 10:02:13 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/korean/news/author/alison-yoon/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 10주년을 맞이한 freeCodeCamp, 그리고 주요 자격증 업데이트 ]]>
                </title>
                <description>
                    <![CDATA[ 10년 전 오늘 샌프란시스코 아파트의 옷장 방에 앉아 freeCodeCamp의 첫 수백 줄의 코드를 작성했습니다. Quincy의 옷장 사무실당시만 해도 fCC가 코딩을 함께 배우는 전 세계 성인 커뮤니티로 빠르게 성장할 것이라고는 생각하지 못했습니다. 많은 캠퍼들 - 우리가 스스로를 부르는 방식 - 이 소프트웨어 엔지니어로 취업했고, 많은 캠퍼들이 fCC의 오픈 소스 코드에 기여했습니다. ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/freecodecamp-turns-10-major-certification-updates/</link>
                <guid isPermaLink="false">672157f9c2007e043e41eaf9</guid>
                
                    <category>
                        <![CDATA[ Community ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Thu, 31 Oct 2024 20:17:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2024/10/767f41f9-70e6-4e1c-b0d5-1927a925c9cc.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/freecodecamp-turns-10-major-curriculum-updates/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">freeCodeCamp Turns 10 + Major Certification Updates</a>
      </p><p>10년 전 오늘 샌프란시스코 아파트의 옷장 방에 앉아 freeCodeCamp의 첫 수백 줄의 코드를 작성했습니다.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730133437567/a29ae1ca-0350-4e94-b57a-296eb35dae6f.jpeg" class="kg-image" alt="Quincy's closet office" width="485" height="485" loading="lazy"><figcaption>Quincy의 옷장 사무실</figcaption></figure><p>당시만 해도 fCC가 코딩을 함께 배우는 전 세계 성인 커뮤니티로 빠르게 성장할 것이라고는 생각하지 못했습니다.</p><p>많은 캠퍼들 - 우리가 스스로를 부르는 방식 - 이 소프트웨어 엔지니어로 취업했고, 많은 캠퍼들이 fCC의 오픈 소스 코드에 기여했습니다.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730133483889/9fe0f108-361f-4384-bbb9-774b9bbe7fe2.webp" class="kg-image" alt="Campers at an NYC freeCodeCamp event" width="960" height="528" loading="lazy"></figure><p>지난 10년 동안 우리는 다음과 같은 것들을 만들어냈습니다.</p><ol><li>수학, 프로그래밍, 컴퓨터 공학을 가르치는 3,000시간 분량의 대화형 핵심 커리큘럼</li><li><a href="https://www.freecodecamp.org/korean/news/p/47b77841-e738-4d76-9c78-00c88ea1f907/freecodecamp.org/news">freecodecamp.org/news</a>에 12,000개 이상의 프로그래밍 튜토리얼과 수십 권의 전체 길이 책,</li><li>구독자 수 1,000만 명을 넘어선 무료 전체 강좌 YouTube 채널</li><li>세계에서 가장 친절하고 지지적인 프로그래밍 포럼, 그리고 유사한 Discord 서버</li></ol><p>혼자였던 팀도 35명의 교사와 엔지니어로 성장했습니다. 하지만 이는 빙산의 일각에 불과합니다. 대부분의 작업은 오픈 소스 커뮤니티 자체에 의해 수행되고 있습니다. 매일 자원봉사자들이 나타나 코드베이스를 개선하고, 새로운 오픈 러닝 리소스를 만들며, 포럼에서 서로를 돕고 있습니다.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730133557095/089e4ec6-16aa-49df-81c3-6b27c3001ed4.jpeg" class="kg-image" alt="a screenshot of the freecodecamp github repo" width="607" height="515" loading="lazy"></figure><p>이제 우리는 방금 시작했을 뿐이며, freeCodeCamp의 <strong>첫 10년</strong>에 대한 감상적인 이야기보다는 <strong>향후 10년</strong> 계획에 초점을 맞추겠습니다.</p><p>결국 우리 자선단체의 목표는 수학, 프로그래밍, 컴퓨터 공학 학습을 위한 무료 자료를 제공하는 것이며, 이를 위해 해야 할 일이 아직 <strong>많이</strong> 남아 있습니다.</p><p>이 글에서는 향후 10년의 주요 계획과 크리스마스 전까지의 주요 개선사항을 소개하겠습니다.</p><h2 id="freecodecamp-">freeCodeCamp의 통합 인증 프로그램</h2><p>새로운 가장 큰 변화는 현재 다양한 과정으로 운영되던 커리큘럼을 종합적이고 포괄적인 '인증된 풀스택 개발자(CFSD)' 인증 과정으로 통합하는 것입니다. 그리고 이와 유사한 새로운 포괄적인 인증 과정도 처음부터 개발하고 있습니다.</p><p>우리는 CompTIA, (ISC)²와 같은 확립된 개발자 인증 비영리 단체에서 영감을 얻었습니다. 우리의 인증 과정을 산업 표준 인증과 더 유사하게 전면 개편하고 있습니다.</p><p>새로운 인증 과정은 다음과 같은 특징을 가지게 될 것입니다.</p><ul><li>더욱 포괄적일 것</li><li>최종 시험을 포함할 것</li><li>종합 프로젝트를 포함할 것</li><li>3년간 유효하며 갱신 가능할 것</li></ul><p>그리고 freeCodeCamp가 만드는 모든 것처럼, 이 인증 과정 역시 <strong>완전히 무료</strong>로 제공될 것입니다.</p><p>인증된 풀스택 개발자 인증 과정 커리큘럼에는 다음과 같은 내용이 포함될 것입니다.</p><ul><li>의미 있는 HTML</li><li>접근성</li><li>CSS 기본</li><li>CSS 플렉스박스</li><li>개발자를 위한 디자인</li><li>타이포그라피</li><li>코드 편집기</li><li>JavaScript 기본</li><li>함수형 프로그래밍</li><li>고차 함수와 콜백</li><li>DOM 조작과 이벤트</li><li>웹 표준</li><li>React 기본</li><li>TypeScript 기본</li><li>테스팅 개념</li><li>Bash 스크립팅	</li><li>SQL과 관계형 데이터베이스</li><li>Git &amp; GitHub</li><li>보안과 프라이버시</li><li>Node.js</li><li>Express.js</li><li>Python 기본</li><li>알고리즘적 사고</li><li>자료 구조</li><li>객체 지향 프로그래밍</li><li>동적 프로그래밍</li><li>웹 개발자를 위한 보안</li><li>툴링과 배포</li><li>API 다루기</li><li>AI 엔지니어링 기본</li><li>개발자 취업하기</li></ul><p>그리고 많은 사람들의 요청에 따라, 우리는 핵심 커리큘럼 내에서 <strong>훨씬 더 많은</strong> 이론을 다룰 것입니다.</p><p>이전에는 우리의 인증 과정이 100% 프로젝트 구축에 초점을 맞추었습니다. 하지만 많은 캠퍼들로부터 "배우면서 하기"에 지나치게 치우쳤다는 피드백을 받았고, 이론에 대한 더 많은 설명도 필요하다는 의견이 많았습니다.</p><p>이제 freeCodeCamp의 커리큘럼만으로도 필수적인 이론을 학습할 수 있게 될 것입니다.</p><p>우리의 강사 디자인팀, 즉 Beau Carnes와 Ania Kubów가 제작한 동영상 강의를 통해 이론을 다룰 것이며, 이는 자막과 함께 제공될 것입니다.</p><p>또한 핵심 개념과 코딩 기술에 대한 이해도를 높이기 위해 많은 퀴즈도 추가했습니다. 그리고 우리의 스페이스드 리피티션 시스템과 함께 활용될 것입니다.</p><p>그리고 학습자의 자율성을 높이기 위해 보다 이른 단계부터 "빈 화면" 스타일의 코딩 실습 과제에 돌입할 것입니다.</p><p>새로운 인증된 풀스택 개발자 과정에는 다음과 같은 내용이 포함됩니다.</p><ul><li><strong><strong>64개의 워크숍</strong></strong> – HTML부터 SQL, Python까지 다양한 도구를 다루는 대화형 코딩 과정</li><li><strong><strong>513 개의 강의</strong></strong> – 컴퓨터 과학 개념을 다루는 짧은 동영상과 복습용 퀴즈</li><li><strong><strong>83개의 실습</strong></strong> – 빈 편집기에서 테스트를 통과하는 프로젝트를 구현하는 과제</li><li><strong><strong>62개의 복습 페이지</strong></strong> – 각 모듈별 주요 토픽을 정리한 자료</li><li><strong><strong>66개의 퀴즈와</strong></strong> and <strong><strong>6개의 모의고사</strong></strong> – 풀스택 개발 개념과 도구에 대한 이해도 확인</li><li><strong><strong>1개의 종합 프로젝트</strong></strong> – freeCodeCamp 커뮤니티의 검토를 받는 포트폴리오용 대규모 프로젝트</li><li><strong><strong>1회의 최종 시험</strong></strong> – 모든 준비 과정을 포괄하는 90문항의 공식 인증 시험</li></ul><p>모든 과정을 완료하면 최종 시험을 치를 자격을 얻게 됩니다. 우리는 자체 개발한 오픈 소스 시험 환경에서 지금까지 배운 모든 내용을 심층적으로 평가하는 시험을 치르게 될 것입니다.</p><p>시험에 합격하지 못한 경우에도 24시간마다 재응시할 수 있습니다. 매번 광범위한 문항 데이터베이스에서 무작위로 시험이 출제될 것입니다.</p><p>온라인 시험에서 부정행위로 거짓 혐의를 받는다는 소문을 들어보셨을 것입니다. 우리는 학업 윤리 강령을 어떻게 집행할지 깊이 고민했습니다. 이런 결정에는 항상 사람의 개입이 있을 것입니다.</p><p>아기가 울어서 자리를 비웠다고 자동으로 자격을 박탈하지 않을 것입니다. 이런 상황들을 모두 고려하여 시험을 진행할 것입니다.</p><p>합격하면 무료로 검증된 공식 인증서를 받게 됩니다. 이를 이력서나 CV에 추가하거나 LinkedIn에 게시할 수 있습니다. 이 인증서는 3년간 유효하며, 그 후에는 무료 연수 과정을 거쳐 갱신할 수 있습니다.</p><p>freeCodeCamp 커리큘럼의 주요 업데이트 내용을 3분 동영상으로 안내드립니다.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe width="560" height="315" src="https://www.youtube.com/embed/24ubTRtvNY0" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; aspect-ratio: 16 / 9; width: 720px; height: auto;" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="-3-">우리는 또 다른 3가지 인증 과정도 개발하고 있습니다</h2><p>새로운 인증된 풀스택 개발자 인증 과정이 출시되면, 우리 강사 디자인팀은 추가로 3가지 인증 과정 개발에 주력할 것입니다.</p><h3 id="-fcc-cmle-">머신러닝 엔지니어 인증 과정 (fCC-CMLE)</h3><p>이 인증 과정에서는 Python과 다양한 라이브러리를 배우게 됩니다. 또한 방대한 수학 및 이론도 학습하게 될 것입니다. 많은 프로젝트에서 직접 모델을 만들어볼 기회가 주어질 것입니다. Kylie Ying이 이미 머신러닝 엔지니어들과 협력하여 이 과정 설계를 진행하고 있습니다. 2025년에 일부 내용이 출시될 예정입니다.</p><h3 id="-fcc-csse-">소프트웨어 시스템 엔지니어 인증 과정 (fCC-CSSE)</h3><p>이 인증 과정에서는 저수준 프로그래밍과 고성능 컴퓨팅을 다룰 것입니다. C와 C++를 배우고, 자신만의 컴파일러와 검색 엔진과 같은 프로젝트를 직접 구현해볼 기회가 있습니다. 2026년에 일부 내용이 출시될 예정입니다.</p><h3 id="-fcc-cds-">데이터 과학자 인증 과정 (fCC-CDS)</h3><p>우리는 수년 동안 종합적인 데이터 과학 커리큘럼을 개발해왔습니다. 여러분도 알다시피, freeCodeCamp 커뮤니티 YouTube 채널에는 이미 Python, R과 같은 데이터 분석 도구에 대한 많은 인기 강좌가 있습니다.</p><p>데이터 과학을 가르치는 과정에서 가장 큰 과제는 이 분야에 필요한 방대한 수학을 가르치는 것입니다. 또한 프로그래밍으로 자동 채점할 수 있는 프로젝트 기반 학습을 구축해야 합니다.</p><p>우리의 목표는 박사 과정 외에 데이터 과학 교육 중 최고의 교육을 제공하는 것입니다. 이것이 가장 큰 도전과제가 될 것입니다. 하지만 우리는 그것을 해낼 수 있습니다.</p><p>2027년에 일부 내용이 출시될 예정입니다.</p><h2 id="-">이 인증 과정과 관련된 자세한 정보는 언제 제공될까요?</h2><p>우리는 현재 이에 대한 종합적인 커리큘럼 개요를 작성하고 있으며, 일부 내용을 2025년에 공개할 계획입니다.</p><h2 id="-freecodecamp-">기존의 freeCodeCamp 인증 과정은 어떻게 되나요?</h2><p>freeCodeCamp has a long tradition of preserving old coursework from legacy certs. This time is no different.</p><p>우리는 여러분이 이번 크리스마스에 출시되는 새로운 인증된 풀스택 개발자 인증 과정으로 전환하기를 권장합니다. 기존 인증 과정에서 많은 프로젝트를 이미 완료하셨을 수도 있겠지요.</p><p>그렇기 때문에 이미 기존 인증 과정을 진행 중이라면 그 과정을 계속 이어가실 수 있습니다.</p><h2 id="--1">레거시 인증은 만료되나요?</h2><p>네, 그렇습니다. 모든 레거시 인증은 2027년 12월 31일에 만료됩니다. 이는 과거에 취득한 모든 freeCodeCamp 인증서를 포함합니다.</p><p>우리는 새로운 인증된 풀스택 개발자 인증을 취득하기 전에 기존 인증을 충분히 활용할 수 있는 시간을 주고자 합니다. 그리고 3년은 충분한 기간이라고 판단했습니다.</p><p>앞으로 취득하는 인증된 풀스택 개발자 인증이나 다른 3개의 새로운 인증도 취득일로부터 3년간 유효합니다.</p><p>또한 3년 후에는 무료 연수 프로그램을 통해 인증을 갱신할 수 있습니다.</p><h2 id="-freecodecamp--1">왜 freeCodeCamp에서 시험과 인증 만료일을 도입했나요?</h2><p>다른 IT 업계 인증과 유사하게 만들기 위해서입니다. 주요 인증들은 모두 인증 시험 합격을 요구하고 있으며, 3년 후 만료됩니다.</p><p>우리의 목표는 freeCodeCamp 인증이 업계에서 표준으로 인정받을 수 있도록 하는 것입니다.</p><h2 id="freecodecamp--1">freeCodeCamp가 취업 지원이나 알선 사업을 할 계획인가요?</h2><p>아니요, 그럴 계획이 없습니다. 우리 자선 단체의 목표는 단순히 무료 학습 자료를 제공하는 것입니다. 우리는 교사가 아닌 인력을 늘리기보다는 소규모 교사진을 유지하며 집중할 계획입니다.</p><h2 id="--2">각 인증 과정 간 교과과정 중복되는 부분은 얼마나 될까요?</h2><p>일부 인증 과정에서는 몇 가지 공통 프로젝트와 강의가 공유될 예정입니다. 예를 들어, 인증된 풀스택 개발자 인증 과정에서 Python 입문 과정을 이미 완료했다면, 인증된 머신러닝 엔지니어 인증 과정에서 이를 다시 수강할 필요가 없습니다.</p><h2 id="--3">기존 인증서는 온라인에 남아있나요? 검증 링크도 계속 작동하나요?</h2><p>만료된 인증서는 여전히 프로필에 표시되며, 직접 링크도 계속 작동할 것입니다. 다만 "만료됨 [날짜]" 라고 명확히 표시될 것입니다. 이는 2027년 12월 31일 까지는 어떤 fCC 인증서에도 적용되지 않습니다.</p><h2 id="freecodecamp-org-learn-11-"><strong><strong><a href="http://freecodecamp.org/learn">freecodecamp.org/learn</a></strong> </strong>에 현재 나열된 11개 인증 과정은 어떻게 되나요?<strong><strong>?</strong></strong></h2><p>이 인증 과정들은 최소 수년간 레거시 인증 과정으로 계속 제공될 것입니다. 그 내부 교과과정 대부분은 새로운 인증 과정의 일부로 재구성되고 개선될 것입니다.</p><h2 id="--4">기존에 완료한 프로젝트를 다시 해야 하나요?</h2><p>이전 인증 과정의 일부 교과과정은 새로운 인증 과정에도 남아있을 것입니다. 대부분의 경우 이미 완료한 프로젝트를 다시 할 필요는 없을 것입니다. 이미 프로젝트를 구현했다면, 새 인증 과정을 살펴볼 때 일부 섹션이 이미 완료된 것으로 표시될 가능성이 높습니다.</p><h2 id="rust-java-nosql-">Rust, Java 등의 프로그래밍 언어나 NoSQL 데이터베이스 도구들에 대한 강의는요? </h2><p>우리는 개발자로 취업할 수 있는 최선의 기회를 제공하기 위해 핵심 커리큘럼을 가장 인기 있는 도구 중심으로 유지하고 있습니다. 즉, Python, JavaScript, SQL, Git, Linux 등이 그것입니다.</p><p>freeCodeCamp 커뮤니티 YouTube 채널과 freeCodeCamp 출판물에는 다른 인기 도구에 대한 강좌가 많이 있습니다. 이들은 추가 선택 과목으로 계속 제공될 것입니다.</p><h2 id="--5">영어 커리큘럼은 어떻게 진행되고 있나요?</h2><p>캠퍼들의 영어 실력 향상을 돕기 위해 대화형 영어 커리큘럼을 만들기 위해 열심히 작업하고 있습니다.</p><p>동영상과 대화형 연습을 통해 가르치고, 정식 인증 시험이 뒤따릅니다.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730133715267/450940c6-2799-48ac-8f8d-dbc4eece8951.jpeg" class="kg-image" alt="A screenshot of freeCodeCamp's English curriculum User Interface" width="1274" height="792" loading="lazy"></figure><p>현재 A2 레벨을 마무리하고 있으며, B1 레벨 개발에 착수했습니다.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730133738714/206d46e8-7a31-4229-b673-5c11e386cfee.png" class="kg-image" alt="A chart of CEFR levels" width="1024" height="768" loading="lazy"></figure><h2 id="--6">무료 대학 학위 프로그램은 어떻게 진행되고 있나요?</h2><p>우리는 수학 준학사 학위와 컴퓨터 공학 학사 학위를 제공하는 데 꾸준히 진척을 이루고 있습니다. 이미 2개의 수학 과목을 개발했으며, 나머지 38개 대학 수준의 과목, 강의, 실습, 시험 개발에 힘쓰고 있습니다.</p><p>freeCodeCamp에는 소규모 강사 설계팀이 있으며, 현재는 주로 인증된 풀스택 개발자 인증 과정 교과과정과 영어 인증 프로그램에 집중하고 있습니다. 이 두 가지를 완료하면 학위 프로그램 개발에 더 많은 자원을 투입할 계획입니다.</p><h2 id="10-">10년은 그저 시작에 불과합니다.</h2><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730133954038/aeb1874c-1804-4910-8088-c262aa95c5cf.jpeg" class="kg-image" alt="Some of the freeCodeCamp team in front of a Dallas public library" width="1600" height="1200" loading="lazy"></figure><p>우리 커뮤니티가 단 10년 만에 이루어낸 성과는 놀랍습니다.</p><ul><li>3,000시간 분량의 대화형 학습 자료로 이루어진 무료 커리큘럼</li><li>수천 개의 추가 선택 동영상 강좌, 서적, 튜토리얼</li><li>수만 명의 개발자로 취업한 캠퍼들</li><li>수만 명의 오픈소스와 동료 캠퍼 지원을 통해 경험을 쌓고 있는 기여자들</li></ul><p>이제 시작에 불과합니다.</p><p>전 세계 freeCodeCamp 커뮤니티에 참여해 보시기를 권장합니다. <a href="https://www.freecodecamp.org/news/freecodecamps-top-open-source-contributors-of-2024/">2024년 우수 오픈소스 기여자 목록</a>을 살펴보실 수 있습니다. 참여하고 싶으시다면 <a href="https://contribute.freecodecamp.org/">기여자 가이드</a>를 확인해 보세요.</p><p><a href="https://www.freecodecamp.org/donate">후원자가 되어주시기를 요청</a>드리며, 이미 매월 후원 중이시라면 연말 기부도 고려해 보시기 바랍니다. <a href="https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp/">세금 공제 혜택이 가능한 다양한 방법</a>이 있습니다.</p><p>궁금하신 점이나 기부금 영수증이 필요하시다면 언제든 <a href="mailto:quincy@freecodecamp.org">quincy@freecodecamp.org</a>로 연락 주시기 바랍니다.</p><p>앞으로의 10년도 기대해 주시기 바랍니다.</p><p>– Quincy<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 빅오 표기법을 설명하다. 시간과 공간의 복잡도. ]]>
                </title>
                <description>
                    <![CDATA[  빅오 표기법을 완벽히 이해하시나요? 만약 그렇다면 이 글이 면접 전에 기억을 환기 시켜주길 바랍니다. 그렇지 않다면, 걱정할 필요 없습니다. 컴퓨터 과학 분야에 함께 도전해 볼까요? 알고리즘 관련 코스들을 들어본 적이 있다면 빅오 표기법에 대해 이미 들어봤을 가능성이 큽니다. 들어보지 못한 분들을 위해, 빅오 표기법이 무엇인지 부터 다뤄보겠습니다. 그 후에 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/big-o-notation-why-it-matters-and-why-it-doesnt-1674cfa8a23c/</link>
                <guid isPermaLink="false">645dde10670e16066f8f29da</guid>
                
                    <category>
                        <![CDATA[ Big O Notation ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Fri, 12 May 2023 06:46:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/05/0_NSxbYAwcC7Qzk7PP.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/big-o-notation-why-it-matters-and-why-it-doesnt-1674cfa8a23c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Big O Notation Explained: Space and Time Complexity</a>
      </p><h1></h1><p>빅오 표기법을 완벽히 이해하시나요? 만약 그렇다면 이 글이 면접 전에 기억을 환기 시켜주길 바랍니다.<br>그렇지 않다면, 걱정할 필요 없습니다. 컴퓨터 과학 분야에 함께 도전해 볼까요?</p><p>알고리즘 관련 코스들을 들어본 적이 있다면 <strong>빅오 표기법</strong>에 대해 이미 들어봤을 가능성이 큽니다. 들어보지 못한 분들을 위해,<br>빅오 표기법이 무엇인지 부터 다뤄보겠습니다. 그 후에 뒷부분으로 갈 수록 조금 더 심화적인 내용을 다룰 것입니다.</p><p>빅오 표기법은 알고리즘의 효율성을 분석하기 위해 컴퓨터 공학자들이 쓰는 가장 기본적인 도구들 중 하나 입니다. 소프트웨어 엔지니어들도 이 개념을 잘 이해하고 있다면 도움이 될 것입니다.</p><p>이 글의 독자분들은 이미 코딩을 조금 해보신 분들이라는 전제하에 글을 썼습니다. 또한 고등학교 수준 수학의 기본적인 개념을 알아야 심화 내용을 이해할 수 있을 것입니다.<br>따라서 이런 지식이 전혀 없으신 분들에게는 조금 어려울 수 있다는 점을 양해 부탁드립니다.<br>이제 준비가 되셨다면, 시작해 보겠습니다.</p><p>이 글에서는 빅오 표기법에 대해 자세히 다룰 것입니다. 먼저 한 예시 알고리즘을 보면서 시작하겠습니다. 그런 다음에는 공식 개념을 이해하기 위해 조금 더 수학적인 개념을 알아보겠습니다.<br>일반적인 빅오 표기법의 변형형들도 살펴볼 것 입니다. 마지막으로 실질적인 상황에서 빅오 표기법이 어떤 한계들을 가질 수 있는지 보겠습니다. 목차는 아래와 같습니다.</p><h2 id="-">목차</h2><ol><li>빅오 표기법이 무엇이며 왜 중요할까</li><li>빅오 표기법의 공식적인 정의</li><li>빅오(Big-O), 리틀오(Little-o), 오메가(Omega)와 세타(Theta)</li><li>전형적인 빅오(Big-O)간의 복잡도 비교</li><li>시간과 공간의 복잡도</li><li>최선, 평균, 최악, 예상 복잡도</li><li>빅오(Big-O)가 상관 없는 이유</li><li>결론</li></ol><p>시작해 봅시다.</p><h2 id="1-">1. 빅오 표기법이 무엇이며 왜 중요할까</h2><blockquote>“빅 오 표기법은 인자가 특정한 값이나 무한대로 향할 때 함수의 극한적인 동작을 설명하는 수학적인 표기법입니다. 이것은 폴 바흐만, 에드문드 란다우 등이 고안한 기호 체계 중 하나로, 박만-란다우 표기법 또는 점근적 표기법이라고 불리는 체계에 속합니다.”</blockquote><blockquote><a href="https://en.wikipedia.org/wiki/Big_O_notation">위키피디아 영문 페이지</a>에 나온 빅오 표기법의 정의<br>간단히 말하자면 빅오 표기법이란 코드의 복잡도를 대수학 개념을 이용해 표현하는 것입니다.</blockquote><p>일반적인 예, **O(n²)**를 보며 빅오 표기법이 무엇인지 살펴보겠습니다. **"빅 오 제곱"**이라고 읽습니다. 여기에 있는 **"n"**은 <strong>입력값의 크기</strong>를 나타냅니다.<br>그리고 **“O()”**안에 있는 함수 **“g(n) = n²”**는 입력값의 크기에 따라 얼마나 알고리즘이 복잡해지는지를 알려줍니다.</p><p><strong>선택 정렬</strong> 알고리즘은 O(n²)의 복잡도를 갖고 있는 전형적인 알고리즘 입니다. 선택 정렬 알고리즘이란 주어진 배열을 반복해서 따라가며 각 인덱스 <strong>i</strong>에 있는 값이 그 정렬에서 <strong>i 번째로</strong>가장 크거나 작은 값이 되도록 하는 것 입니다.<br>아래의 <strong>CODEPEN</strong>에 이것을 시각화 시킨 예시가 있습니다.</p><p></p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_yEpRVr" src="https://codepen.io/iMultiThinker/embed/preview/yEpRVr?height=300&amp;slug-hash=yEpRVr&amp;default-tabs=js,result&amp;host=https://codepen.io" title="Embedded content" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; width: 760px; overflow: hidden;"></iframe></figure><p></p><p>이 알고리즘은 아래와 같은 코드로 나타낼 수 있습니다. 어떤 배열에서 ~번째에 있는 값이 그 배열의 ~번째로 작은 값이 되도록 하기 위해서 먼저 for 반복문을 이 배열에<br>실행합니다. 그리고 각 값에 또 다른 for 반복문을 이용해서 남은 배열 구간에서 가장 작은 값을 찾아냅니다.</p><pre><code>SelectionSort(List) {
  for(i from 0 to List.Length) {
    SmallestElement = List[i]
    for(j from i to List.Length) {
      if(SmallestElement &gt; List[j]) {
        SmallestElement = List[j]
      }
    }
    Swap(List[i], SmallestElement)
  }
}
</code></pre><p>이 예시에서 우리는 변수 **<em>List</em>**를 입력값으로 합니다. 그렇기 때문에 입력값의 크기 n은 **<em>List 라는 배열안에 있는 값들의 숫자</em>**가 됩니다.<br>if 조건문에서 조건식 안에 들어있는 구문이 실행되는데 일정한 시간이 걸린다고 가정해봅시다. 그렇다면 위의 SelectionSort 함수에서 몇번이나 코드가<br>실행되는지를 분석한다면 이 함수의 빅오 표기법을 알 수 있습니다.</p><p>일단 처음에는 가장 안에 있는 for 반복문은 그 안의 코드를 n번 실행하게 됩니다. 그 후에 **<em>i</em>**가 증가하게 되면 안에 있는 for 반복문은 n-1번 실행됩니다.<br>계속 이런식으로 결국 이 두개의 for 반복문은 마지막으로 조건이 만족되는 순간에 다다릅니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_1ajbPJXjt3z7CofVODlaCw.png" alt="선택정렬 반복문 그림" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">선택정렬 반복문 그림</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>이 반복문으로 우리는 총 합계를 구할 수 있습니다. <a href="https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF">고등학교 수준</a>의 수학으로 우리는<br>안에 있는 반복문이 1+2...+n 번 반복한다는 것을 알 수 있고 이것은 n(n-1)/2 번 이라는 식으로 나타낼 수 있습니다. 이 식을 풀게 되면 n²/2-n/2 라는 식을 얻게 됩니다.</p><p>빅오 표기법을 계산할 때에는 <strong>최고차항</strong>만 신경쓰고 나머지 계수들은 신경쓰지 않습니다. 그러므로 여기에서 우리는 점근 표기법의 값으로 n² 을 얻게 됩니다.<br>이것은 O(n²)로 표시하고 *"빅오 n의 제곱(Big O squared)*이라고 읽습니다.</p><p>그렇다면 이 **<em>최고차항</em>**이라는 것은 무엇일까요? 그리고 나머지 계수들에 대해서는 왜 신경쓰지 않아도 될까요?<br>이 이유들에 대해서는 하나씩 차근차근 알아보도록 하겠습니다. 처음에는 이해하기 어려울 수 있으나 다음 부분을 읽게 된다면 훨씬 더 이해가 잘 될 수 있을 것입니다.</p><h2 id="2-">2. 빅오 표기법의 공식적인 정의</h2><p>옛날 옛적 어떤 인도의 왕은 한 지혜로운 사람에게 상을 내리고 싶어 했습니다. 이 지혜로운 사람은<br>다른 것이 아닌 체스 판을 가득 채울 만큼의 밀알을 원했습니다.</p><p>하지만 이 사람의 조건은 이러했습니다. 체스 판의 첫번째 칸에는 1 알의 밀알을, 두번째 칸에는 2알의 밀알을, 그리고 그 다음 칸에는 4알의 밀알을...이런 식으로 체스 판의 각 칸은 바로 이전 칸에 있는 밀알의 제곱한 양으로 채워지기를 바랬습니다. 순진한 왕은 흔쾌히 수락했습니다. 아주 쉽게 들어줄 수 있는 요구라고 생각했습니다. 직접 체스 판을 이런 식으로 채워보기 전까지는 말이죠.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/0_em0jJ2rgj-ZapCef.jpg" alt="밀알과 체스 판 그림" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">밀알과 체스판, 이미지 출처 <a href="https://en.wikipedia.org/wiki/Wheat_and_chessboard_problem">위키피디아</a></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>이 왕은 지혜로운 사람에게 얼마만큼의 밀알을 주어야 했을까요? 체스 판에는 8 곱하기 8 만큼의 칸이 있습니다. 총 64칸인 셈 입니다. 그렇다면 마지막 칸에는 총 2⁶³ 알 만큼의 밀알이 있어야 합니다.<br>이를 인터넷에서 계산을 해본다면 <strong>전체 체스판에 대해</strong> 얻을 수 있는 밀알은 <strong>1.8446744*10¹⁹</strong>라는 결과가 나옵니다. 간단히 말하자면 이는 18에 0이 18개가 붙은 숫자입니다.</p><p>밀알 한 알이 0.01그램이라고 가정해본다면 총 184,467,440,737톤의 밀알을 얻게 되는 것입니다. 1천 8백 4십억톤이라면, 꽤 무거운 것이 맞죠?</p><p>보는 것처럼, 기하급수적 증가에서는 뒤로 갈 수록 숫자가 아주 빠른 속도로 커지게 됩니다. 이는 컴퓨터 알고리즘에서도 마찬가지 입니다. 무엇을 실행하기 위해 드는 노력이 입력값이 커짐에 따라 기하급수적으로 증가하게 된다면 끝에는 아주 큰 숫자가 될 수 있습니다.</p><p>곧 나오겠지만 2ⁿ의 증가률은 n² 보다 훨씬 빠릅니다. n = 64 라고 한다면 64의 제곱은 4096 입니다. 하지만 그 숫자를 거듭제곱에 넣어서 2⁶⁴ 가 된다면, 표기하기도 어려운 크기의 숫자가 됩니다.</p><p>증가율을 계산할 때 최고차항만을 보는 이유가 바로 이것입니다. 그리고 입력값 크기에 따른 시간 증가를 분석할 때에는 입력값 증가와는 관계 없이 -입력값이 증가함에 따라 같이 증가하는 것이 아니므로- 그 숫자만큼만 곱해지게 되는 계수는 우리에게 유용한 정보를 갖고 있지 않습니다.</p><p>빅오 표기법 의 공식적인 정의는 아래와 같습니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/0_cyqWw3UxODl-wqJi.jpg" alt="워싱턴 대학의 CSE 373 슬라이드에 빅오의 공식 정의가 쓰여있는 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">워싱턴 대학의 <a href="https://slideplayer.com/slide/9739625/">CSE 373 슬라이드</a></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>(역주: 슬라이드에 쓰여진 내용은 다음과 같습니다.</p><ul><li>빅오는 점근선의 상한 범위를 찾는 것이다.</li><li>빅오의 공식적인 정의는<br>f(N) = O(g(N)), 양수인 상수 c가 있다면, N₀ 는 다음과 같다.<br>모든 N ≥ N₀ 에 대해 f(N) ≤ c * g(N) 이다.</li><li>우리는 N이 커질때에 f가 어떻게 증가하는지를 구하고 싶다.</li><li>작은 N이나 상수 인자는 고려하지 않는다.</li><li>용어: "f(N)은 g(N)이 증가하는 만큼만 증가한다."<br>)</li></ul><p>공식적인 정의는 수학적 증명을 해야할 때 유용합니다. 예를 들면 선택 정렬의 시간 복잡도는 이 전 부분에서 봤던 것 처럼 f(n) = n²/2-n/2 와 같은 함수로 나타낼 수 있습니다.</p><p>만약 g(n)함수를 n²이라고 한다면, 계수 c = 1 와 N₀ = 0 을 알 수 있습니다. 여기에서 N &gt; N₀ 라는 조건이 만족하는 한, N² 는 N²/2-N/2 보다 항상 큰 값이 됩니다.<br>이는 각 함수들에서 N²/2를 빼봄으로써 쉽게 증명할 수 있습니다. 그렇다면 N²/2 &gt; - N/2 는 N &gt; 0 라는 조건에서 참이라는 걸 알 수 있습니다. 그러므로 f(n) = O(n²), 즉 선택 정렬에서는 "제곱의 시간이 걸린다(big O squared)"고 하는 결론을 낼 수 있는 것입니다.</p><p>여기에서 한가지 trick을 눈치 채셨을 수도 있습니다. 만약 g(n)을 아주 빠르게 증가하도록 한다면 O(g(n))는 항상 충분히 큰 값이 됦 것입니다. 예를 들어 어떤 다항함수가 있다면 여기에서는<br>O(2ⁿ)라고 할 수 있습니다. 왜냐하면 2ⁿ 는 결국에는 어떤 다항식보다 더 크게 증가하기 때문입니다.</p><p>수학적으로는 맞는 말입니다. 하지만 일반적으로 빅오에 대해 말할 때에는 함수의 **엄격한 제한(tight bound)**에 대해 알아야 합니다. 계속해서 다음 부분을 읽어나가면 더욱 이해 하는데에 도움이 될 겁니다.</p><p>먼저 다음 질문으로 이때까지 얼마나 이해하고 있는지 시험해 봅시다. 정답은 후에 나오는 섹션에 있습니다. 정답을 보지 않고 생각해 보세요.</p><blockquote>질문: 어떤 이미지가 2D 배열의 픽셀로 표현되어 있다. 만약 중첩 for문을 사용해서 모든 픽셀들을 반복하게 된다면 (그 뜻은 바깥의 for문이 모든 열-column-을 따라 반복할 때에<br>안에 있는 for문은 모든 행-row-을 따라 반복한다는 것이다.) 여기에서 이미지가 함수의 입력값(input)이라면 이 함수의 시간 복잡도는 무엇일까?</blockquote><h2 id="3-big-o-little-o-omega-theta-">3. 빅오(Big O), 리틀오(Little O), 오메가(Omega) &amp; 세타(Theta)</h2><blockquote>빅오: 어떤 상수 c와 N₀에 대해 N &gt; N₀ 이면서 f(N) ≤ cg(N) 인 조건을 만족할 때 “f(n) 는 O(g(n)) 이다”. (필요충분조건으로, 역도 참이다.)<br>오메가: 어떤 상수 c와 N₀에 대해 N &gt; N₀ 이면서 f(N) ≥ cg(N) 인 조건을 만족할 때 “f(n) 는 Ω(g(n)) 이다”. (필요충분조건으로, 역도 참이다.)<br>세타: f(n) 는 O(g(n)) 이면서 f(n) 는 Ω(g(n)) 인 조건을 만족할 때 “f(n) 는 Θ(g(n)) 이다”. (필요충분조건으로, 역도 참이다.)<br>리틀오: f(n) 는 O(g(n)) 이면서 f(n) 는 Θ(g(n)) 가 아닌 조건을 만족할 때 “f(n) 는 o(g(n)) 이다”. (필요충분조건으로, 역도 참이다.)<br>-빅오, 오메가, 세타, 리틀오의 공식적인 정의<br>이것을 풀어서 다시 설명하자면 다음과 같습니다.</blockquote><ul><li><strong>빅오 (O())</strong> 는 복잡도의 <strong>윗쪽 범위</strong>를 나타낸다.</li><li><strong>오메가 (Ω())</strong> 는 복잡도의 <strong>아랫쪽 범위</strong>를 나타낸다.</li><li>**세타 (Θ()) ** 는 복잡도의 <strong>정확한 범위</strong>를 나타낸다.</li><li><strong>리틀오 (o())</strong> 는 복잡도의 <strong>정확한 범위를 제외한 윗쪽 범위</strong>를 나타낸다.</li></ul><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_O-dcXbYXojkAPEnDuVZMvA.png" alt="빅오, 오메가, 세타, 리틀오의 관계 그래프 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">빅오, 오메가, 세타, 리틀오의 관계 그래프</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>예를 들면 g(n) = n² + 3n is O(n³), o(n⁴), Θ(n²) and Ω(n) 와 같은 함수로 나타낼 수 있습니다. 하지만<br>간단하게 Ω(n²) 나 O(n²) 로 표현해도 맞습니다.</p><p>일반적으로 빅 오(Big O)에 대해 이야기할 때, 우리가 실제로 의미하는 것은 세타(Theta)입니다. 분석 범위보다 훨씬 큰 상한을 제시하는 것은 의미가 없습니다. 이는 부등식을 풀 때 ∞를 큰 쪽에 놓으면 거의 항상 옳은 것과 마찬가지 입니다.</p><p>하지만 우리는 어떻게 다른 함수들 중에서 어떤 함수가 더 복잡한지를 결정할까요? 다음 섹션에서는 그것에 대해 자세히 배우게 될 것입니다.</p><h2 id="4-big-o-">4. 전형적인 빅 오(Big O)간의 복잡도 비교</h2><p>특정 함수 g(n)의 빅 오(Big O)를 찾으려 할 때, 우리는 함수의 **지배적인 항(dominant term)**에만 관심이 있습니다. 지배적인 항이란 가장 빨리 증가하는 항을 말합니다.</p><p>예를 들어, n²은 n보다 더 빨리 증가하기 때문에, g(n) = n² + 5n + 6과 같은 함수는 빅 오(n²)가 됩니다. 미적분학을 공부한 적이 있다면, 분수 다항식의 극한값을 찾는 데에 사용되는 간략한 방법과 매우 유사합니다. 극한값을 찾을 때, 분자와 분모의 지배적인 항만 고려하면 되는 것과 같습니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/0_MPwgKd4lgXACfuNt.png" alt="빅오를 보는 또 다른 방법, 표가 나와 있는 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">빅오를 보는 또 다른 방법, 이미지 출처는 <a href="https://stackoverflow.com/questions/1364444/difference-between-big-o-and-little-o-notation">스택 오버플로우</a></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>하지만 어떤 함수가 다른 함수보다 더 빠르게 증가할까요? 이에 대해 꽤 많은 규칙이 있습니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_KfZYFUT2OKfjekJlCeYvuQ.jpeg" alt="빅오를 보는 또 다른 방법, 표가 나와 있는 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">빅 오(Big O) <a href="http://bigocheatsheet.com/">치트시트</a>에서의 복잡도 증가 그림 예시</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h3 id="1-o-1-">1. O(1)이 가장 적은 복잡도를 가집니다.</h3><p>O(1)은 종종 **<em>"상수 시간(constant time)"</em>**이라고 불리며, 만약 문제를 O(1)로 해결할 수 있는 알고리즘이 있다면, 그것이 최선일 가능성이 높습니다. 일부 상황에서는 복잡도가 O(1)을 초과할 수도 있습니다. 그런 경우에는 O(1/g(n)) 상대 알고리즘을 찾아서 분석할 수 있습니다. 예를 들어, O(1/n)은 O(1/n²)보다 더 복잡합니다.</p><p>(역주: "상대 알고리즘(relative algorithm)"이란, 두 가지 이상의 알고리즘 중에서 더 효율적인 알고리즘을 선택하기 위해, 비교 대상이 되는 알고리즘을 의미합니다. 복잡도 분석에서, 하나의 알고리즘을 더 나은 다른 알고리즘과 비교하여 상대적인 성능을 평가하기 위해 사용됩니다. O(1/g(n))은 O(g(n))의 역수로, 복잡도가 낮을수록 더 나은 알고리즘이라는 의미를 갖습니다.)</p><h3 id="2-o-log-n-o-1-">2. O(log(n))는 O(1)보다는 더 복잡하지만 다항식보다는 덜 복잡합니다.</h3><p>복잡도는 종종 분할 정복 알고리즘과 관련이 있기 때문에, O(log(n))는 일반적으로 정렬 알고리즘에 도달할 수 있는 좋은 복잡도입니다. O(log(n))는 O(√n)보다 덜 복잡합니다. 왜냐하면 제곱근 함수는 지수가 0.5인 다항식으로 간주될 수 있기 때문입니다.</p><h3 id="3-">3. 다항식의 복잡도는 지수가 증가함에 따라 증가합니다.</h3><p>예를 들어, O(n⁵)는 O(n⁴)보다 더 복잡합니다. 이전 섹션에서는 다항식의 예를 많이 다루었는데, 이는 그 복잡성이 간단하기 때문입니다.</p><h3 id="4-n-">4. 계수가 n의 양의 배수인 경우, 지수 함수의 복잡도는 다항식의 복잡도보다 큽니다.</h3><p>O(2ⁿ)는 O(n⁹⁹)보다 복잡하지만, O(2ⁿ)은 실제로 O(1)보다 덜 복잡합니다. 지수와 로그의 밑(base)으로 일반적으로 2를 사용하는 이유는 컴퓨터 과학에서 일반적으로 이진(binary) 표현을 사용하기 때문입니다. 그러나 계수를 변경함으로써 지수를 변경할 수 있습니다. 로그의 밑은 별도로 지정되지 않은 경우 2로 간주됩니다.</p><h3 id="5-factorial-exponential-">5. 팩토리얼(factorial)은 지수(exponential)보다 더 높은 복잡도를 가집니다.</h3><p>만약 이유에 대해 관심이 있다면 감마 함수를 검색해보세요. 감마 함수는 팩토리얼의 해석적 연속 확장입니다. 간단한 증명은 팩토리얼과 지수 함수가 같은 수의 곱셈을 갖지만, 곱해지는 수가 팩토리얼의 경우 커지고, 지수 함수의 경우에는 일정하게 유지된다는 것입니다.<br>(역주: 해석적 연속 확장(Analytic Continuation)은 어떤 함수가 정의되어 있던 범위를 그보다 더 큰 범위로 확장하여 정의하는 것을 말합니다.)</p><h3 id="6-">6. 항을 곱하는 것</h3><p>곱셈을 할 때, 복잡성은 원래 것보다 더 커질 것이지만 더 복잡한 것을 곱하는 경우보다 더 커지지는 않습니다. 예를 들어, O(n * log(n))는 O(n)보다 더 복잡하지만 O(n²)보다는 덜 복잡합니다. 왜냐하면 O(n²) = O(n * n)이고, n은 log(n)보다 더 복잡하기 때문입니다.</p><p>이해도를 테스트하기 위해 다음 함수들을 가장 복잡한 것부터 가장 간단한 것으로 순위를 매겨보세요. 해설과 함께 정답은 나중 섹션에서 찾을 수 있습니다. 이 중 일부는 까다롭기 때문에 좀 더 깊은 수학적 이해가 필요할 수 있습니다. 해설을 보면서 이해를 높이시길 바랍니다.</p><blockquote><strong>질문:</strong> 다음 함수들을 복잡도가 가장 높은 것부터 가장 낮은 것까지 나열하세요.<br></blockquote><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_69bzUpQxBwZFLBimaMe7kQ.png" alt="여러가지 함수가 나와있는 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><a href="https://www.chegg.com/homework-help/questions-and-answers/problem-ask-refresh-knowledge-asymptotic-notations-rank-following-functions-order-growth-f-q23698273">교과서에 나온 연습문제</a>에서 가져온 예시</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p></p><blockquote><strong>섹션 2의 문제에 대한 해답:</strong><br>이것은 실제로 당신의 이해도를 시험하기 위해 만든 트릭 문제였습니다. 중첩된 for 루프가 있어서 O(n²)로 답하게 만들려는 의도였습니다. 그러나 n은 입력 크기를 나타내는 것이어야 합니다. 이미지 배열이 입력이며, 각 픽셀이 한 번씩만 반복되었기 때문에 정답은 사실 O(n)입니다. 다음 섹션에서는 이와 같은 더 많은 예시를 다룰 것입니다.</blockquote><h2 id="5-">5. 시간 및 공간 복잡도</h2><p>지금까지는 알고리즘의 시간 복잡도에 대해서만 논의해왔습니다. 즉, 프로그램이 작업을 완료하는 데 걸리는 시간만 중요하게 여겼습니다. 하지만 프로그램이 작업을 완료하는 데 사용하는 메모리 크기도 중요합니다. 공간 복잡도는 프로그램이 사용할 메모리의 크기와 관련이 있으므로 분석해야 할 중요한 요소입니다.</p><p>공간 복잡도는 시간 복잡도와 비슷하게 작동합니다. 예를 들어, 선택 정렬의 공간 복잡도는 O(1)입니다. 이는 비교를 위해 하나의 최소값과 그 인덱스만 저장하기 때문에, 최대 사용 공간이 입력 크기와 함께 증가하지 않기 때문입니다.</p><p>버킷 정렬과 같은 일부 알고리즘은 공간 복잡도는 O(n)이지만 시간 복잡도는 O(1)로 줄일 수 있습니다. 버킷 정렬은 배열의 모든 가능한 요소를 정렬 된 목록으로 만든 다음, 요소가 발견될 때마다 카운트를 증가시켜 배열을 정렬합니다. 마지막에 이 정렬된 배열은 요소의 카운트에 따라 반복된 정렬된 목록이 됩니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_GfLWx2TXS55unwqZ5-X26w.png" alt="버킷 정렬 시각화 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">버킷 정렬 시각화</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="6--1">6. 최선, 평균, 최악, 예상 복잡도</h2><p>복잡도는 최선의 경우, 최악의 경우, 평균적인 경우, 예상되는 경우로 분석될 수도 있습니다.</p><p>예를 들어 <strong>삽입 정렬</strong>을 살펴보면, 삽입 정렬은 리스트의 모든 요소를 반복해서 확인합니다. 요소가 이전 요소보다 작다면, 이전 요소보다 크기 전까지 요소를 뒤로 삽입합니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://cdn-media-1.freecodecamp.org/images/0*C9ork5K0ay7_CLBv.gif" alt="삽입 정렬 시각화 움직이는 gif 이미지" width="300" height="180" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">삽입 정렬 시각화, 이미지 출처는 <a href="https://en.wikipedia.org/wiki/Insertion_sort">위키피디아</a></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>만약 배열이 초기에 정렬되어 있다면 교환 작업이 발생하지 않습니다. 알고리즘은 배열을 한 번만 반복하며, 이는 O(n)의 시간 복잡도를 결과로 낳습니다. 따라서 삽입 정렬의 <strong>최선의 경우</strong> 시간 복잡도는 O(n)입니다. O(n)의 복잡도는 종종 <strong>선형 복잡도</strong>라고도 합니다.</p><p>어떤 알고리즘은 운이 나쁠 때가 있습니다. 예를 들어, 퀵 정렬은 원소들이 역순으로 정렬된 경우 O(n) 시간이 걸릴 수 있지만, 평균적으로는 O(n * log(n)) 시간에 배열을 정렬합니다. 일반적으로 알고리즘의 시간 복잡도를 평가할 때는 <strong>최악의 경우</strong> 성능을 고려합니다. 이에 대해서는 다음 섹션에서 더 자세히 설명하겠습니다. 퀵 정렬에 대해서도 다음 섹션에서 자세히 다룰 것입니다.</p><p>평균 복잡도는 알고리즘의 예상 성능을 설명합니다. 때때로 각 시나리오의 확률을 계산하는 것이 포함됩니다. 이러한 세부 정보를 설명하는 것은 꽤 복잡해 질 수 있기 때문에 이 글에서는 다루지 않겠습니다. 아래는 전형적인 알고리즘의 시간 및 공간 복잡도에 대한 치트 시트입니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/0_XZsrnwao98R3dGTB.png" alt="공통 알고리즘에 대한 빅 오 치트시트 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">공통 알고리즘에 대한 <a href="http://bigocheatsheet.com/">빅 오 치트시트</a></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><blockquote><strong>섹션 4의 문제에 대한 해답:</strong><br>다음 다항식들을 규칙 3에 따라 즉시 가장 복잡한 것부터 가장 간단한 것까지 순위를 매겨야 합니다. 여기서 n의 제곱근은 단순히 n의 0.5 제곱입니다.<br></blockquote><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_RKlbisO36urUbi237TjyrQ.png" class="kg-image" alt="가장 복잡한 다항식부터 순서대로 나열되어 있는 함수들의 이미지" width="600" height="400" loading="lazy"></figure><p>그러면 규칙 2와 규칙 6을 적용하여 다음과 같은 결과를 얻을 수 있습니다. 밑이 3인 로그함수는 <a href="https://www.purplemath.com/modules/logrules5.htm">로그 기본 변환</a>으로 밑이 2인 로그함수로 변환될 수 있습니다. 밑이 3인 로그함수는 여전히 밑이 2인 로그함수보다 조금 더 느리게 증가하므로 그 다음 순위가 됩니다.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_6R1jrWMGXpKxBqtEre9q8Q.png" class="kg-image" alt="3인 로그함수가 로그 기본 변환으로 밑이 2인 로그함수로 변환된 후에 위의 함수 리스트 이미지에 더해진 모습. 밑이 3인 로그함수는 변환후에도 밑이 2인 로그함수보다 느리기 때문에 뒷 부분에 나열되 있는 모습." width="600" height="400" loading="lazy"></figure><p>나머지 함수들은 조금 까다로워 보이지만, 그들의 진면목을 밝혀보고 어디에 위치시킬 수 있는지 살펴보겠습니다.</p><p>우선, 2의 2의 n제곱은 2의 n제곱보다 큽니다. 그리고 +1이 더해져 더욱 빨리 증가합니다.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_eGLwpHDUJtr6CuALrpcQ2w.png" class="kg-image" alt="2의 n제곱 보다 큰 2의 n제곱에 n이 곱해진 것, 2의 2의 n 제곱, 그리고 2의 n제곱에 1이 더해진 것이 큰 순서대로 나온 표 이미지" width="600" height="400" loading="lazy"></figure><p>그리고 2의 log₂n제곱(2^(log₂n))은 n 값과 같아진다는 사실을 이용하여 다음과 같이 변환할 수 있습니다. 0.001을 지수로 하는 로그는 상수보다 조금 더 빨리 증가하지만, 다른 거의 모든 것보다는 적게 증가합니다.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_4yo7najRBY_OaTnDpT3cIg.png" class="kg-image" alt="2의 log₂n제곱(2^(log₂n))은 n 값과 같아진다는 사실을 이용하여 변환한 표 이미지" width="600" height="400" loading="lazy"></figure><p>처음에 나온 식인 n^(log(logn))는 사실 <a href="https://en.wikipedia.org/wiki/Time_complexity#Quasi-polynomial_time"><strong>상호-다항식(quasi-polynomial)</strong></a>의 변형으로, 다항식보다는 느리지만 지수함수보다는 빠릅니다. log(n)이 n보다 느리게 증가하기 때문에 그 복잡도는 조금 더 낮습니다. 역로그(inverse log)를 사용한 것은 1/log(n)이 무한대로 발산하기 때문에 상수에 수렴합니다.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_ZYUCFuiSbOibqdSfmuwdvA.png" class="kg-image" alt="글에서 설명한 n^(log(logn)), 상호-다항식, 역로그, 그리고 수렴이 써져 있는 표" width="600" height="400" loading="lazy"></figure><p>팩토리얼은 곱셈으로 표현될 수 있기 때문에, 로그 함수 외부에서 덧셈으로 변환할 수 있습니다. <sub>n</sub>C<sub>2</sub>는 가장 큰 항이 3차항인 다항식으로 변환할 수 있습니다.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_cbrjlMGsWYCs36u831pLTA.png" class="kg-image" alt="글에서 설명한 계승이 로그함수 밖에서 덧셈으로 변환된 것, 그리고 세 차항이 가장 큰 다항식으로 변환되어 있는 표" width="600" height="400" loading="lazy"></figure><p>마지막으로, 우리는 이제 함수들을 가장 복잡한 것부터 가장 적은 복잡도를 가진 것까지 순위를 매길 수 있습니다.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_NHVggTVMGjGOe7SxtSgIpQ.png" class="kg-image" alt="가장 복잡한 함수부터 가장 적은 복잡도를 가진 것까지 순서대로 나열한 표" width="600" height="400" loading="lazy"></figure><h2 id="-big-o-">빅오(Big-O)가 상관 없는 이유</h2><blockquote>!!! — 경고 — !!!</blockquote><blockquote>이 글에서 다루는 내용은 일반적으로 세계 대부분의 프로그래머들이 수용하지 않는 내용입니다. 이 내용을 논의하려면 스스로 책임을 지고 결정하셔야 합니다. 실제로 이런 내용을 이야기해서 구글 면접에 실패한 사람들이 블로그에 기록해 놓은 경우도 있습니다.</blockquote><blockquote>!!! — 경고 — !!!<br>이전에 우리는 퀵 정렬(quick sort)의 최악의 경우 시간 복잡도가 O(n²)이지만 병합 정렬(merge sort)의 경우 O(n * log(n))이라는 것을 배웠습니다. 그렇다면 병합 정렬이 더 빠를 것이라고 생각할 수 있습니다. 하지만 아마도 답이 거짓이라는 것을 이미 짐작하셨을 것입니다. 알고리즘은 그냥 퀵 정렬이 "빠른 정렬"이 되도록 연결되어 있습니다.</blockquote><p>다음은 <a href="https://trinket.io/python/87a3166026">trinket.io</a>를 사용해 만든 것으로, 퀵 정렬과 병합 정렬의 실행 시간을 비교합니다. 10000개 이하의 길이를 가진 배열에서만 테스트를 수행했지만, 그 범위 내에서 확인할 수 있는 바로는, 병합 정렬의 실행 시간이 퀵 정렬보다 더 빠르게 증가합니다. 퀵 정렬의 최악의 경우 시간 복잡도는 O(n²)이지만, 이 경우가 나타날 확률은 극히 낮습니다. 즉, O(n * log(n)) 복잡도에 따른 속도 증가를 비교할 때, 퀵 정렬은 평균적으로 더 나은 성능을 보입니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_UvDTlLjNnQurODtnCWjEJg.png" alt="퀵 정렬과 병합 정렬의 시간 비교 그래프 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">퀵 정렬과 병합 정렬의 시간 비교</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>아래 그래프를 만들어서 두 정렬 방법의 소요 시간 비율을 비교해 보았습니다. 소요 시간이 낮은 값에서는 구별하기 어려웠기 때문입니다. 그래프에서 확인할 수 있듯, 퀵 정렬의 소요 시간 비율이 내림차순으로 나타납니다.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align: center"><img src="https://www.freecodecamp.org/news/content/images/2021/06/1_Zdm_8c-uU5941r7zJd4FPQ.png" alt="퀵 정렬과 병합 정렬의 시간 비율 그래프 이미지" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">퀵 정렬과 병합 정렬의 시간 비율</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>이야기의 결론은, 빅 오 표기법은 알고리즘이 사용하는 리소스에 대한 참조를 제공하기 위한 수학적 분석일 뿐이라는 것입니다. 실제로 결과는 다를 수 있습니다. 그러나 알고리즘의 복잡도를 최대한 줄이는 것은 일반적으로 좋은 실천 방법이며, 알고리즘이 무엇을 하는지 정확하게 알고 있는 경우를 제외하고는 그렇게 하는 것이 좋습니다.</p><h2 id="--1">결론</h2><p>저는 코딩을 좋아하며 새로운 것을 배우고 커뮤니티와 공유하는 것을 좋아합니다. 만약 특정한 분야에 흥미가 있다면 알려주세요. 보통 웹 디자인, 소프트웨어 아키텍처, 수학, 데이터 과학 등의 주제로 글을 쓰고 있습니다. 위의 주제 중 관심 있는 것이 있다면 제가 쓴 훌륭한 글을 찾아볼 수 있습니다.</p><p>컴퓨터 과학을 배우는 데 즐거운 시간 보내시길 바랍니다!!!</p><p></p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 프리코드캠프의 8주년, 그리고 데이터 사이언스와 대학 학위 과정에 대한 업데이트 ]]>
                </title>
                <description>
                    <![CDATA[  세계의 프리코드캠프 커뮤니티 여러분, 우리 (프리코드캠프의) 생일을 축하합니다. 8년 전 우리는 배우고자 하는 사람들이 모여 이룬 작은 커뮤니티로 시작을 했습니다. 그 당시에 프리코드캠프는 이룰 수 없는 꿈 같은 이야기 였습니다.  하지만 다 함께 두팔을 걷어붙이고 그 꿈을 현실로 이루어 냈습니다. 오늘 현재, 날마다 백만명이 넘는 사람들이 프리코드캠프를 사용합니다. 여기에서 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/peurikodeukaempeuyi-8junyeon-geurigo-deiteo-saieonseuwa-daehag-hagwi-gwajeonge-daehan-eobdeiteu/</link>
                <guid isPermaLink="false">63666e05c0cb07062cace6cc</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Tue, 20 Dec 2022 19:21:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/11/freeCodeCamp-Data-Science-Courses-and-Degrees.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/freecodecamp-math-computer-science-degree-update/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">freeCodeCamp University Degrees Update</a>
      </p><h1></h1><p>세계의 프리코드캠프 커뮤니티 여러분, 우리 (프리코드캠프의) 생일을 축하합니다.</p><p>8년 전 우리는 배우고자 하는 사람들이 모여 이룬 작은 커뮤니티로 시작을 했습니다. 그 당시에 프리코드캠프는 이룰 수 없는 꿈 같은 이야기 였습니다. &nbsp;하지만 다 함께 두팔을 걷어붙이고 그 꿈을 현실로 이루어 냈습니다. &nbsp;</p><p>오늘 현재, 날마다 백만명이 넘는 사람들이 프리코드캠프를 사용합니다. 여기에서 수학, 컴퓨터 공학, 프로그래밍을 함께 배웁니다. 다양한 문화권들의, 그리고 각각 다양한 삶의 한 지점에 있는 사람들이 기술 지식을 넓히기 위해 서로를 도와줍니다. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/freeCodeCamp-Anniversary.gif" class="kg-image" alt="freeCodeCamp-Anniversary" width="600" height="400" loading="lazy"><figcaption>8주년 GIF를 제작해준 Estefania 고맙습니다.</figcaption></figure><p>매 해 겨울마다 그랬듯이, 곧 프리코드캠프의 성장에 관한 데이터를 공유하겠습니다. 이 글에서는 데이터 사이언스 과정들과 &nbsp;공인된 대학 학위들을 무료로 제공하기 위한 계획을 말해보고자 합니다. </p><h2 id="-"><strong>데이터 사이언스 과정 업데이트</strong></h2><p>작년에 프리코드캠프는 데이터 사이언스 과정을 만들기 위한 모금 행사를 했습니다. 모두 함께 한 결과, 이 행사를 통해 연구 개발을 위한 300,000 달러($) 이상의 성금이 마련되었습니다. &nbsp;</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/Tweet.html?creatorScreenName=ossia&amp;dnt=false&amp;embedId=twitter-widget-0&amp;features=eyJ0ZndfdGltZWxpbmVfbGlzdCI6eyJidWNrZXQiOlsibGlua3RyLmVlIiwidHIuZWUiLCJ0ZXJyYS5jb20uYnIiLCJ3d3cubGlua3RyLmVlIiwid3d3LnRyLmVlIiwid3d3LnRlcnJhLmNvbS5iciJdLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2hvcml6b25fdGltZWxpbmVfMTIwMzQiOnsiYnVja2V0IjoidHJlYXRtZW50IiwidmVyc2lvbiI6bnVsbH0sInRmd190d2VldF9lZGl0X2JhY2tlbmQiOnsiYnVja2V0Ijoib24iLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X3JlZnNyY19zZXNzaW9uIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvbiI6bnVsbH0sInRmd19jaGluX3BpbGxzXzE0NzQxIjp7ImJ1Y2tldCI6ImNvbG9yX2ljb25zIiwidmVyc2lvbiI6bnVsbH0sInRmd190d2VldF9yZXN1bHRfbWlncmF0aW9uXzEzOTc5Ijp7ImJ1Y2tldCI6InR3ZWV0X3Jlc3VsdCIsInZlcnNpb24iOm51bGx9LCJ0Zndfc2Vuc2l0aXZlX21lZGlhX2ludGVyc3RpdGlhbF8xMzk2MyI6eyJidWNrZXQiOiJpbnRlcnN0aXRpYWwiLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2V4cGVyaW1lbnRzX2Nvb2tpZV9leHBpcmF0aW9uIjp7ImJ1Y2tldCI6MTIwOTYwMCwidmVyc2lvbiI6bnVsbH0sInRmd19kdXBsaWNhdGVfc2NyaWJlc190b19zZXR0aW5ncyI6eyJidWNrZXQiOiJvbiIsInZlcnNpb24iOm51bGx9LCJ0ZndfdmlkZW9faGxzX2R5bmFtaWNfbWFuaWZlc3RzXzE1MDgyIjp7ImJ1Y2tldCI6InRydWVfYml0cmF0ZSIsInZlcnNpb24iOm51bGx9LCJ0Zndfc2hvd19ibHVlX3ZlcmlmaWVkX2JhZGdlIjp7ImJ1Y2tldCI6Im9mZiIsInZlcnNpb24iOm51bGx9LCJ0ZndfdHdlZXRfZWRpdF9mcm9udGVuZCI6eyJidWNrZXQiOiJvbiIsInZlcnNpb24iOm51bGx9fQ%3D%3D&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1415658657950232580&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Ffreecodecamp-math-computer-science-degree-update%2F&amp;sessionId=52c46acee50bfb192f24656da474860325319046&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=a3525f077c700%3A1667415560940&amp;width=550px" data-tweet-id="1415658657950232580" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: static; visibility: visible; width: 550px; height: 720px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure><p>오늘, 그동안의 성과를 공유할 수 있게 되어서 너무나 설레입니다.</p><p>이 성금의 어느 정도는 경력이 있는 대학 전임 강사들에게 수업 내용 개발을 맡기기 위한 커미션으로 쓰였습니다. </p><p>4K 비디오 강의 제작과 프로그래밍 환경을 위한 고사양 컴퓨터들과 카메라들을 구입했습니다.</p><p>강의들을 녹화하고 연구실들을 만들기 시작했습니다. </p><p>빨리 나누고 싶은 다음 소식은 바로 이것에 관한 것입니다.</p><h2 id="-4-"><strong>이 데이터 사이언스 과정들을 4년제 컴퓨터 공학 학사 과정에 포함 시키기로 했습니다.</strong></h2><p>공인 대학 학위 과정을 무료로 개시하고자 하는 장기적인 목표에 대해 작년에 언급 했었습니다. &nbsp;</p><p>구체적으로 말하자면, 프리코드캠프가 현재 개발하고 있는 것들은 아래와 같습니다.</p><ol><li>다음(2 번) 학위 취득의 절반을 차지하는 수학 전문학사 학위</li><li>컴퓨터 공학 학사 학위</li></ol><p>이 학위 들의 첫 수업 목록이 준비가 되었음을 기쁜 마음으로 전합니다.</p><p>이 학위 들은 지속적이고 하나로 이어진 배움의 길과 같습니다. 풀타임으로 공부한다고 했을때 다 마치기까지 4년 정도의 시간이 걸릴 것으로 예상됩니다. (하지만 이 과정들은 완전히 자기 진도에 맞춰 학습할 수 있기 때문에 더 오랜 시간에 걸쳐 마치더라도 괜찮습니다.)</p><p>이 학위 과정들을 이수하기 위한 전제 조건은 고등학교 수준 영어 능력 이외에는 없습니다*. 학생들은 수학, 컴퓨터 공학, 그리고 실생활에 쓰이는 다양한 기술들을 기초부터 배우게 될 것입니다.</p><p>* 영어 실력 요구 사항은 일시적임을 알려 드립니다. 이 과정들은 프리코드캠프의 핵심 교육 과정과 마찬가지로 세계의 다양한 언어들로 번역할 계획 입니다.</p><p>이 40개의 과정들은 120 학점 시간*을 나타냅니다. <a href="https://docs.google.com/spreadsheets/d/1uQsxxrQlOZUm9LLICiETJ6VQQgFgnfYSP-mGvzMHkC8/edit#gid=0">미국 상위 20개 컴퓨터 공학 학위를 심도 있게 교차 분석한 것을 바탕으로 이 과정들을 계획하고 배열했습니다.</a></p><p>(*역주: 미국 대학에서 1 학점 시간(credit-hour)은 15-16 시간의 강의를 뜻합니다.)</p><p></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/Ed_teaching_foundational_math.png" class="kg-image" alt="Ed_teaching_foundational_math" width="600" height="400" loading="lazy"><figcaption>프리코드캠프의 개발자이자 20년 경력의 대학교 강사인 Ed Pratowski가 기초 수학을 화이트보드에 4K로 강의하는 모습.</figcaption></figure><p></p><p>연필과 종이를 사용하여 수학을 배우는 전통적인 방법 뿐만 아니라 파이썬의 수학 에코시스템을 어떻게 활용하는지도 배우게 될 것 입니다.</p><p></p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/Foundational_Math_Curriculum_Screenshot.png" class="kg-image" alt="Foundational_Math_Curriculum_Screenshot" width="600" height="400" loading="lazy"><figcaption>A screenshot of what the Foundational Math course will look like, and a small handful of the many concepts it will cover. 기초 수학 과정의 스크린샷,&nbsp;</figcaption></figure><p></p><p>각 코스들은 다음으로 구성됩니다.</p><ul><li>90 시간의 자기주도적 영상 강의들과 이해도 측정 퀴즈들, 그리고 직접 해보는 실습들 (주로 Jupyter Notebooks안에서 하게 됩니다)</li><li>시간을 재는 기말 시험</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/math_curriculum-1.png" class="kg-image" alt="math_curriculum-1" width="600" height="400" loading="lazy"><figcaption>These courses will make heavy use of Python and Jupyter Notebook tools for solving equations. And ultimately for analyzing datasets. 이 코스들은 문제를 풀어야 할 때, 그리고 궁극적으로 데이터 세트를 분석하는데에 Python과 Jupyter Notebook을 많이 사용할 예정입니다.&nbsp;</figcaption></figure><p>현재 프리코드캠프에서 기획하고 있는 각 학위들에 필요한 코스들의 리스트는 다음과 같습니다.</p><h3 id="--1"><strong>수학 준학사</strong></h3><ol><li>철학 (Philosophy of Knowledge) </li><li>계산의 역사 (History of Computation)</li><li>대학 대수학 (College Algebra)</li><li>비판적 사고의 기초 (Foundations of Critical Thinking)</li><li>기초 미적분학 (Precalculus)</li><li>윤리적 추론 (Ethical Reasoning)</li><li>미적분학 I (Calculus I)</li><li>영어 수사법과 글쓰기 (English Rhetoric and Composition)</li><li>확률과 통계 I (Probability and Statistics I)</li><li>건강 관리 (Health and Wellness)</li><li>미적분학 II (Calculus II)</li><li>확률과 통계 II (Probability and Statistics II)</li><li>기술 작문 (Professional and Technical Writing)</li><li>미적분학 III (Calculus III)</li><li>이산 수학 (Discrete Mathematics)</li><li>기술 경제와 노동 시장 (Economics of Technology and the Labor Market)</li><li>선형 대수학 (Linear Algebra)</li><li>계산 이론 (Theory of Computation)</li><li>조직 행동 (Organizational Behavior)</li><li>응용 양적 추론 (Applied Quantitative Reasoning)</li></ol><h3 id="--2"><strong>컴퓨터 공학 학사</strong></h3><ol><li>전산학 개론 (Introduction to Computer Science)</li><li>데이터 구조와 알고리즘 (Data Structures and Algorithms)</li><li>전자공학과 임베디드 시스템 (Electronics and Embedded Systems)</li><li>소프트웨어 설계 및 엔지니어링 (Software Design and Engineering)</li><li>컴퓨터 시스템과 구조 (Computer Systems and Architecture)</li><li>관계형 데이터베이스와 NoSQL 시스템 (Relational Databases and NoSQL Systems)</li><li>컴퓨터 네트워크 기초 (Fundamentals of Computer Networking)</li><li>알고리즘 설계와 분석 (Algorithmic Design and Analysis)</li><li>응용 컴퓨터 그래픽 (Applied Computer Graphics)</li><li>풀스텍 웹 개발 (Full-Stack Web Development)</li><li>정보 보안 개론 (Principles of Information Security)</li><li>인간-컴퓨터 상호작용 (Human-Computer Interaction)</li><li>데이터 분석 기초 (Foundations of Data Analysis)</li><li>응용 데이터 시각화 (Applied Data Visualization)</li><li>데이터 엔지니어링 기초 (Foundations of Data Engineering)</li><li>지도 및 비지도 기계 학습 (Supervised and Unsupervised Machine Learning)</li><li>딥 러닝 방법론 (Deep Learning Methodologies)</li><li>응용 자연 언어 처리 (Applied Natural Language Processing)</li><li>응용 컴퓨터 비전 (Applied Computer Vision)</li><li>소프트웨어 분야 인터뷰 준비 (Software Industry Interview Preparation)</li></ol><p>이 학위 코스 프로그램이 최고 명문대학교 프로그램들의 엄격한 수준과 같게 되기를 희망합니다. 또한 배우고자 하는 사람들에게 전통적인 1000년 이상 동안 대학 교육의 기초가 되어온 교양과목들을 배울 수 있는 기회를 주고자 합니다. &nbsp; </p><p>수학, 논리, 수사법과 같은 근본적인 기술 지식들은 굉장히 중요하다고 생각합니다. 일단 학생들이 이런 핵심적인 지식을 쌓게 되면, 요즘 시대의 강력한 도구들을 이용해 원하는 방향으로 변화를 만들 수 있도록 도와줄 수 있습니다. </p><p>수학, 프로그래밍, 머신 러닝과 같은 기술 뿐만 아니라 테크 분야가 어떻게 흘러가는 지에 대해서도 배우게 될 것 입니다. 테크 분야에서 어떻게 지속 가능한 커리어를 구축할 수 있는지 배우게 될 것입니다. 이 분야에서 마주치게 될 쉽지 않은 윤리적인 문제들에 어떻게 대처할지 배우게 될 것입니다.</p><h2 id="--3"><strong>갈 길이 아직 많이 남아있습니다.</strong></h2><p>아직 이 강의들을 제작하고, 이 연구실들(labs)을 개발하고, 이 프로그램들이 공식적으로 인정받을 수 있도록 하기 위한 많은 일들이 남아있습니다. </p><p>혹시 이 글을 읽고 있는 분들 중에 현재 학교에 다니는 분들이 계시다면, 학교에 계속 다니시라고 말씀드리고 싶습니다. 저희에게 남은 일들은 완성하기 위해서는 10년도 더 넘은 시간이 걸릴 수도 있으니까요.</p><p>프리코드캠프는 이 코스들과 연구실들이 완성되는 데로 발표 할 것이고 모두 온라인에서 무료로 제공될 것입니다.</p><p>또한 학생들이 시험을 치르는 데 쓰인 보안이 철저한 환경을 제공해 주는 개발 도구를 비롯해서 이 코스들을 개발하는데 사용한 오픈소스 개발 도구들을 공유할 예정입니다.</p><p>이미 컴퓨터 공학 학위가 있는 학생들을 위해서는 이 코스들을 새롭고 독립된 데이터 사이언스 코스에 추가함으로써 링크드인이나 이력서에 자격증을 넣을 수 있도록 할 것 입니다. 이 자격증들은 대학 학위 과정을 전부 마치지 않더라도 취득할 수 있습니다.</p><h2 id="--4"><strong>도와주실 수 있는 방법</strong></h2><p>40개의 대학교 코스들이 각 90시간에 달하는 수업 활동을 요구합니다. 게다가 3,600 시간에 달하는 부가 교육 자료를 개발 중에 있습니다.</p><p>이 모든 것은 몇 천 시간이 넘는 교육 지도 디자인 일로 이어지게 되는데, 이는 아래의 일들을 포함합니다.</p><ul><li>스크립트 작업, 강의 녹화와 편집</li><li>상호적/인터렉티브 문제 풀이들과 연구실</li><li>평가 지시문들의 디자인</li><li>정해진 것이 아닌 학생의 문제 풀이 답변에 따라 생성 되는 시험 문제들의 개발</li><li>프리코드캠프의 교육 플랫폼을 확장하여 학생의 학습 진행 상황을 추적하고 인증하는 일</li><li>끝으로 모든 강의 비디오들을 세계 각국의 언어들로 번역 후에 각 나라의 언어를 하는 강사들로 하여금 녹화 하도록 하는 일</li></ul><p>간단히 말하자면 이 학위 프로그램을 완성하기 위해서는 우리 비영리 단체의 높은 기부금 효율성에도 불구하고 수십억의 자금이 필요합니다.</p><p>우리는 민첩하게 나아가려고 합니다. 각 코스들이 완성되는데로 발표할 것입니다. 여러개의 코스들이 2023년에 공개 될 것입니다.</p><p>그리고 비록 프리코드캠프가 이 학위 프로그램을 공인 받도록 하기 위해 10년 혹은 그 이상의 시간이 걸릴지라도, 프로그램 자체는 그보다 더 짧은 시간내에 다 마치실 수 있습니다.</p><p>가장 직접적으로 도움을 주실 수 있는 방법은 세금 감면을 받을 수 있는 우리 자선 단체로 기부를 해주시는 것입니다(역주: 프리코드캠프는501(c)(3) tax-exempt public charity 입니다. 이는 미국에서 교육 단체로 인증받은 비영리 기관 입니다). 많은 분들이 매 달 $5 씩 기부를 해주고 계십니다. 혹은 한번의 큰 기부도 환영입니다. 기부를 해주신다면 세금 감면을 받으실 수 있도록 제가 직접 영수증을 준비해 드리겠습니다.</p><p><a href="https://www.freecodecamp.org/donate/">이 곳에서 우리 자선 단체로 기부금을 보내주세요.</a></p><p>도움을 주실 수 있는 또 다른 방법은 이 새로운 코스의 베타(beta) 평가자가 되는 것입니다. 관심이 있으신 분은 아래의 양식을 작성해주세요. 첫 코스들이 완성되는 데로 저희가 연락을 드리겠습니다. 이 코스를 누구보다도 먼저 이용해보게 되실 것 입니다. </p><p><a href="https://docs.google.com/forms/d/e/1FAIpQLSfdm5MVKhMlFFvYhBFRrUA62Cp-PbvmC95u58QkKprBSiUxJQ/viewform">이 곳에서 베타 테스트를 위해 등록해주세요.</a></p><p>마지막으로 이 리스트에 올라와 있는 몇몇 과목들에 대해 대학 수준의 강의를 해보신 분이라면, 의견을 들어보고 싶습니다. 저는 실무 경력이 있을 뿐 학자가 아닙니다. 그렇기 때문에 저는 대학교의 관리자 분들과 교수님들에게 최대한 많이 배우고 있습니다.</p><p>앞으로 나오게 될 코스들에 대해 피드백을 주신 너무나 많은 개발자 분들, 교수님들, 교육 개발자 분들 그리고 프리코드캠프 커뮤니티의 베타 테스터분들에게 다시 한번 고맙다는 말을 전하고 싶습니다.</p><p>8주년에 되는 이때에, 우리 커뮤니티는 이제 막 전세계의 꿈 많은 학생들을 위해 무료 교육 자료들을 개발하기 위한 탐색을 시작했습니다. </p><p>할 일이 많이 있습니다. 그리고 우리는 모두 너무나 기쁘고 신나는 마음으로 그 일을 하려고 합니다.</p><p>– Quincy </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JSON 파일에 주석 다는 법 ]]>
                </title>
                <description>
                    <![CDATA[  JSON 파일에 주석을 더하는 것이 어렵게 느껴졌다면 그럴만한 이유가 있다. JSON은 주석을 지원하지 않는다. "저는 JSON에서 주석을 없앴습니다. 사람들이 해석 지시 사항들을 표기하기 위해 주석을 이용하는 것을 본 이후로요. 이런 식으로 사용하게 된다면 상호 호환성을 방해하게 되기 때문입니다."라고 문자 기반의 데이터 포맷을 확산시킨 더글라스 크록포드는 말한다. 하지만 아직 방법은 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/json-paile-juseog-daneun-beob/</link>
                <guid isPermaLink="false">636b5d50c0cb07062cace89e</guid>
                
                    <category>
                        <![CDATA[ JSON ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Wed, 09 Nov 2022 07:59:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/11/abstract-art-blur-bright-373543.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/json-comment-example-how-to-comment-in-json-files/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JSON Comment Example — How to Comment in JSON Files</a>
      </p><p></p><h4 id="json-json-">JSON 파일에 주석을 더하는 것이 어렵게 느껴졌다면 그럴만한 이유가 있다. JSON은 주석을 지원하지 않는다.</h4><p>"저는 JSON에서 주석을 없앴습니다. 사람들이 해석 지시 사항들을 표기하기 위해 주석을 이용하는 것을 본 이후로요. 이런 식으로 사용하게 된다면 상호 호환성을 방해하게 되기 때문입니다."라고 문자 기반의 데이터 포맷을 확산시킨 더글라스 크록포드는 말한다.</p><p>하지만 아직 방법은 있다. 이 포스트에서는 JSON 파일에 어떻게 주석을 달 수 있는지에 대한 그 방법을 살펴보겠다.</p><h2 id="-">데이터를 주석 형식으로 더하기</h2><p>주석을 지원하지 않는 JSON 파일에 주석을 사용하기 위한 제 2의 방법은 JSON 파일에 주석 역할을 하는 데이터를 더하는 것이다.</p><p>예시를 통해 살펴보자. 다음과 같은 정보를 담고 있는 JSON 파일을 확인해보자.</p><pre><code>{
   "sport": "basketball",
   "coach": "Joe Smith",
   "wins": 15,
   "losses": 5
}
</code></pre><p>여기 또 다른 예가 있다. 이번에는 언더스코어(__) 두 개를 처음과 끝에 사용한다.</p><pre><code> "__comment2__": "this is another comment",
</code></pre><p>이 언더스코어들이 파일에서 주석과 데이터를 구분할 수 있게 해준다.</p><h3 id="--1">주의할 점</h3><p>기억해야 할 중요한 사항이 있다.</p><p>우리가 JSON 파일에 더한 주석들은 JSON 객체에 포함된다. 다시 말해, 이 주석들은 데이터로 인식된다.</p><p>이게 무슨 뜻인지 설명하기 위해 예시를 들어보자.</p><p>우리가 갖고 있는 파일 <code>data.json</code>에 이런 코드가 있다.</p><pre><code>{
   "_comment1": "this is my comment",
   "sport": "basketball",
   "coach": "Joe Smith",
   "wins": 15,
   "losses": 5
}
</code></pre><p>이제 <code>read_comments.py</code> 파일에서 그 데이터를 읽는다고 해보자.</p><pre><code>import json
with open("data.json", mode="r") as j_object:
   data = json.load(j_object)
print(data)
</code></pre><p>결과에서 보이듯이 우리 주석을 포함하고 있다.</p><pre><code>{'_comment1': 'this is my comment', 'sport': 'basketball', 'coach': 'Joe Smith', 'wins': 15, 'losses': 5}
</code></pre><p>심지어 주석의 값(value)인 <code>this is my comment</code>를 빼내 올 수 도 있다.</p><pre><code>import json
with open("data.json", mode="r") as j_object:
   data = json.load(j_object)
   print(data["_comment1"])
</code></pre><p>여기서 기억해야 할 것은 주석은 개발자의 눈에만 주석인 것이지 컴퓨터에게는 주석이 아니라는 점이다.</p><h3 id="--2">다른 형식의 주석</h3><p>이 JSON 주석 관행은 프로그램이 실행될 때 일반적으로 무시되는 파이썬과 같은 프로그래밍 언어의 주석과는 다르다.</p><pre><code># python code 예시
# Here's my comment
word = "house"
for letter in word:
   print(letter)
</code></pre><p>위의 파이썬 프로그램을 실행하면 "house"라는 단어의 글자들은 보이지만 주석은 보이지 않는다. 주석은 실행되지 않은 것이다.</p><h2 id="--3">주석을 다는 또다른 방법</h2><p><a href="https://www.crockford.com/jsmin.html">JSMin</a>을 이용하는 것 또한 다른 방법이다.</p><p>필요없는 공백이나 주석을 자바스크립트 파일들에서 없애주는 툴이다. 하지만 JSON 파일에도 사용할 수 있다. JSMin은 JSON 파일이 parse되기 전에<br>파일에 있는 주석들을 지워준다.</p><p>이렇듯 JSON 파일들에 주석을 더할 수 있는 방법들이 있다. 완벽한 해결책은 아니지만, 필요한 경우 문서를 포함할 수 있는 방법이 있다는 것을 참고하자.</p><p><em>프로그래밍을 배우는 최고의 방법에 대해서 글을 씁니다(<a href="https://amymhaddad.com/">amymhaddad.com</a>)</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git 브랜치 clone 하기 - 특정 브랜치 clone 하는 법 ]]>
                </title>
                <description>
                    <![CDATA[ SVN 이나 CVS와 같은 오래된 중앙 집중 버전 관리 시스템들과는 달리 Git은 분산되어 있다. 개발자들은 로컬과 리모트 두 환경 모두에서 자신이 쓴 코드에 대한 히스토리와 완전한 권한이 있다. 또한 코드의 여러 다른 부분들에 대한 접근과 쓰기 권한이 있다. Linus Torvalds(리누스 토르발스-리눅스 운영 체제를 만든 사람)가 2005년에 리눅스 커널 개발을 위해 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/git-clone-branch-how-to-clone-a-specific-branch/</link>
                <guid isPermaLink="false">6318e867b9e78405860296fa</guid>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Wed, 07 Sep 2022 18:54:14 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/09/article-banner--1-.gif" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/git-clone-branch-how-to-clone-a-specific-branch/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Clone Branch – How to Clone a Specific Branch</a>
      </p><!--kg-card-begin: markdown--><h4 id="svncvsgit">SVN 이나 CVS와 같은 오래된 중앙 집중 버전 관리 시스템들과는 달리 Git은 분산되어 있다. 개발자들은 로컬과 리모트 두 환경 모두에서 자신이 쓴 코드에 대한 히스토리와 완전한 권한이 있다. 또한 코드의 여러 다른 부분들에 대한 접근과 쓰기 권한이 있다.</h4>
<p>Linus Torvalds(리누스 토르발스-리눅스 운영 체제를 만든 사람)가 2005년에 리눅스 커널 개발을 위해 Git을<br>
만든 이후로 Git은 세계에서 가장 많이 사용되고 있는 버전 관리 시스템이 되었다.</p>
<p>이 글에서는 Git 클론(clone)과 브랜치(branch) 워크플로우에 대해 소개하려고 한다. 내가 필요한 것에 따라 특정한 브랜치를 클론 하는 법을 알아보자.</p>
<h2 id="">준비 사항</h2>
<ul>
<li>터미널(terminal)에 대한 기본 지식</li>
<li>터미널에 명령어 쓸 수 있기</li>
<li>Git 설치 (설치를 어떻게 하는지도 아래에서 설명하겠다)</li>
<li>GitHub 계정</li>
<li>웃음 띤 얼굴 (얼굴에 웃음 준비!)</li>
</ul>
<h2 id="gitgithub">Git 과 GitHub 소개</h2>
<p><a href="https://en.wikipedia.org/wiki/Git">위키피디아</a>에 나온것을 보면</p>
<blockquote>
<p>Git은 분산 버전 관리 시스템으로써 소프트웨어 개발 프로젝트(코드)의 변화를 추적한다. Git은<br>
개발자들간의 조직화, 협업, 속도, 효율성을 높히는 목적으로 쓰인다.</p>
</blockquote>
<p>한편 <strong>깃허브(GitHub)</strong> 는 Git을 사용하는, 웹에서 호스팅하는 버전 관리 시스템이다. 깃허브는 분산된<br>
버전 관리 기능을 제공하고 Git의 소스 코드 (source code) 관리 기능을 포함한 여러가지 다른 기능들을 제공한다.</p>
<h2 id="git">윈도우에서 Git을 설치하는 방법</h2>
<p>최신의 <a href="https://gitforwindows.org/">윈도우용 Git</a>을 다운로드 받고 설치한다.</p>
<h2 id="git">Git을 리눅스에서 설치하는 방법</h2>
<p>리눅스 배포판(distro)에 따라 각각 설치하는 명령어는 다음과 같다.</p>
<h3 id="debianubuntu">데비안(Debian)이나 우분투(Ubuntu)</h3>
<pre><code>sudo apt-get update
sudo apt-get install git
</code></pre>
<h3 id="fedora">페도라(Fedora)</h3>
<pre><code>sudo dnf install git
</code></pre>
<h3 id="centos">센토스(CentOS)</h3>
<pre><code>sudo yum install git
</code></pre>
<h3 id="archlinux">아치 리눅스(Arch Linux)</h3>
<pre><code>sudo pacman -Sy git
</code></pre>
<h3 id="gentoo">젠투(Gentoo)</h3>
<pre><code>sudo emerge --ask --verbose dev-vcs/git
</code></pre>
<h2 id="git">맥에서 Git을 설치하는 법</h2>
<p>최신의 <a href="https://sourceforge.net/projects/git-osx-installer/files/">맥(Mac)을 위한 Git</a>을 다운로드 받고 설치한다.</p>
<p>혹은 밑의 명령어를 사용해도 된다.</p>
<pre><code>brew install git
</code></pre>
<p>이제 Git 설치를 마쳤으니 본격적으로 튜토리얼을 시작하겠다.</p>
<h2 id="git">Git 클론 소개</h2>
<p>Git은 프로젝트들의 버전을 리포지토리(Repository)에서 관리할 수 있게 해준다.<br>
이 리포지토리는 깃허브와 같은 웹 기반 호스팅 서비스에 저장되어 있다.</p>
<p>이 리포지토리를 클론(clone)해서 모든 파일들과 브랜치(branch)들을 로컬 컴퓨터에 저장할 수 있다.<br>
(브랜치에 대한 설명은 뒤에서 하겠다.)</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-23-at-5.47.48-AM.png" alt="깃 클론 버튼 스크린" width="600" height="400" loading="lazy"></p>
<p>예를 들어서 프리코드캠프의 리포지토리는 SSH를 이용해서 터미널에 다음 명령어를 써서 클론할 수 있다.</p>
<pre><code>git clone git@github.com:freeCodeCamp/freeCodeCamp.git
</code></pre>
<h2 id="git">Git 브랜치 소개</h2>
<p>한 프로젝트를 할 때는 보통 개발해야 할 여러 가지 다른 기능(feature)들이 있기 마련이다.<br>
그리고 다수의 기여자(contributor)들이 이 프로젝트의 여러 다른 기능들을 더하기 위해 일하고 있을 것이다.</p>
<p>브랜치는 <code>master</code> 브랜치와 같은 파일들을 가진 일종의 "놀이/실험 공간"(playground)을 만들어준다.<br>
이 브랜치를 이용하면 프로덕션 코드를 망치거나 코드에 영향을 미치지 않으면서 기능을 독립적으로 개발하거나 새로운 기능을 테스트해볼 수도 있으며, 큰 변화를 주거나 버그를 수정하고, 문서 작성 및 새로운 아이디어도 구현해볼 수 있다.<br>
작업이 완성되었다면 이 브랜치를 프로덕션용 <code>master</code> 브랜치에 병합(merge)한다.</p>
<p>브랜치는 Git의 중심적인 개념이다. 또한 깃허브에서 한 프로젝트의 다양한 버전들과 워크플로우를 관리하기 위해서 사용된다.<br>
<code>master</code> 브랜치는 (역주: 혹은 <code>main</code> 브랜치) 리포지토리의 기본 브랜치로써 보통 "프로덕션용, 배포(deploy)<br>
할 수 있는 코드"가 있는 곳이라고 간주된다. 새로 만든 브랜치들, 예를 들면 <code>password-auth</code> 나 <code>refactor-signup-ux</code> 같은 브랜치들은 <code>master</code> 브랜치로부터 생성할 수 있다.</p>
<table>
<thead>
<tr>
<th style="text-align:center"><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-22-at-2.47.53-AM.png" alt="프리코드캠프 리포지토리의 브랜치들 스크린" width="600" height="400" loading="lazy"></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><em>프리코드캠프에 있는 모든 브랜치들</em></td>
</tr>
</tbody>
</table>
<h2 id="git">Git 브랜치들을 클론 하는 방법</h2>
<p>리포지토리는 <code>git clone</code> 명령어를 써서 클론할 수 있는데 이렇게 하면 원격(remote)의 <code>HEAD</code> 와 브랜치를 클론하게 된다. 보통 이 기본값 브랜치인 <code>master</code> 와 리포지토리에 속한 다른 모든 브랜치들이 포함되있다.</p>
<p>한 리포지토리를 클론한다는 건 <code>master</code> 브랜치를 포함한 다른 모든 브랜치들을 다 클론한다는 뜻이다. 이렇게 하면 원하는 브랜치로 스스로 전환(checkout)해야 한다.</p>
<p>예를 들어서 어떤 프로젝트에 비밀번호가 필요없는 인증 기능을 개발해야 하는 상황이라고 가정해보자. 이 기능은<br>
<code>passwordless-auth</code> 브랜치에서 작업되고 있다.</p>
<p>이런 상황이라면 딱히 <code>master</code> 브랜치가 필요한 상황은 아니다. 왜냐하면 내가 작업해야할 기능이 들어있는 그 브랜치는 나중에 <code>master</code> 로 병합될 것이기 때문이다. 그렇다면 내가 필요 없는 모든 파일들을 포함한 다른 브랜치들을 다 같이 클론 하는 대신 이 <code>passwordless-auth</code> 브랜치만 클론하는 방법은 무엇일까?</p>
<p>이를 설명하기 위해 샘플 리포지토리를 만들었다. 이 리포지토리는 Nextjs를 이용해서 만든 간단한 블로그인데 4개의 더미(dummy) 브랜치들을 포함하고 있다:</p>
<ul>
<li>master</li>
<li>dev</li>
<li>staging</li>
<li>passwordless-auth</li>
</ul>
<p>Nextjs에서는 <code>pages/api</code> 폴더 안에 있는 모든 파일은 <code>/api/*</code> 경로(path)로 매핑(mapping)된다.<br>
그래서 <code>page</code>가 되는 것이 아니라 API(응용 프로그램 프로그래밍 인터페이스) 엔드포인트로 처리된다. 우리의 샘플 리포지토리에는<br>
각각 다른 더미 API를 <a href="https://github.com/BolajiAyodeji/nextjs-blog/tree/master/pages/api">이 디렉토리에</a> 만들어서 각각의 브랜치를 다르게 했다.</p>
<p><code>master</code> 브랜치는 <strong>pages/api/hello.js</strong> 파일을 갖고 있는 반면 <code>passwordless-auth</code> 브랜치는 <strong>pages/api/auth.js</strong> 파일을 갖고 있다. 이 두 파일은 각각 더미 텍스트를 응답으로 보내준다. <code>master</code> 브랜치에 있는 hello API의 응답을 <a href="https://nextjs-blog.bolajiayodeji.vercel.app/api/hello">여기에서</a> 볼 수 있다. (그리고 당신을 위한 특별한 메세지가 포함 되어있을지도?)</p>
<p>이 리포지토리를 클론해보자:</p>
<pre><code>git clone git@github.com:BolajiAyodeji/nextjs-blog.git
</code></pre>
<p>이 명령어는 우리에게 이 리포지토리에 있는 모든 브랜치에 대한 접근 권한을 준다. 그리고 브랜치를 바꿔가면서 각 다른 버전들과<br>
그 버전에 포함된 파일들을 쉽게 볼 수 있다.</p>
<pre><code>git branch -a
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-22-at-4.51.56-AM.png" alt="리포지토리의 모든 브랜치 목록이 터미널에 출력된 화면" width="600" height="400" loading="lazy"></p>
<p>여기 나온 <strong>remotes/origin/..</strong> 브랜치들은 어디서 온 것일까?</p>
<p>리포지토리를 클론하게 되면 인터넷상의, 혹은 **원격(remote)**이라고 하는 내부 서버에 있는 데이터를 가져오게 된다. origin 이라는 말은 깃에서 만든 일종의 별명(alias)인데 이 별명을 원격 URL 대신<br>
쓸 수 있다(내가 원하는 다른 별명(alias)로 바꿔도 된다).</p>
<p>여기 나온 **remotes/origin/..**의 브랜치들은 인터넷에서 클론한 리포지토리에 연결되어 있기 때문에 origin으로 pull/push와 같은 명령을 수행할 수 있다.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-23-at-5.24.43-AM.png" alt="깃 리모트 버전(git remote -v) 명령어 결과가 터미널에 출력된 화면" width="600" height="400" loading="lazy"></p>
<p>컴퓨터에 <code>master</code>를 클론한다고 할 때, <code>remotes/origin/master</code>는 인터넷상에 있는 본래의 <code>master</code> 브랜치이고, <code>master</code>는 내가 쓰는 컴퓨터에 있는 것이다.<br>
그래서 pull/push 같은 명령은 이 곳, <code>remotes/origin/master</code>을 포인트로 하게 된다.</p>
<p>요약하자면 <strong>Remote</strong>는 인터넷에 있는 리포지토리를 가르키는 URL이고 <strong>Origin</strong>은 리모트 URL의 별명(alias)인 것이다.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-23-at-5.28.06-AM.png" alt="리모트상의 브랜치들을 터미널에 출력한 화면" width="600" height="400" loading="lazy"></p>
<h2 id="">특정한 브랜치를 클론하는 법</h2>
<p>이제 우리의 데모용 리포지토리에서 특정한 브랜치를 클론해보자. 특정한 브랜치를 클론하는 방법에는 두가지가 있다:</p>
<ul>
<li>리포지토리를 클론한 다음 모든 브랜치들을 가져온다(fetch). 그리고나서 특정한 브랜치로 전환(checkout)한다.</li>
<li>리포지토리를 클론한 후에 그 특정한 브랜치만 페치한다.</li>
</ul>
<h3 id="">첫번째 방법</h3>
<pre><code>git clone --branch &lt;branchname&gt; &lt;remote-repo-url&gt;
</code></pre>
<p>또는</p>
<pre><code>git clone -b &lt;branchname&gt; &lt;remote-repo-url&gt;
</code></pre>
<p style="text-align: center;">여기에서 <strong>-b</strong>는 <strong>--branch</strong>의 줄임말이다.</p>
<p>이 명령어로 리포지토리에 있는 모든 브랜치들을 페치한 후에 특정한 브랜치로 전환한다. 그러면 그 브랜치를 기준으로 로컬에서 <code>git push</code> 와 <code>git pull</code>를 할 수 있도록 설정이 된다. 하지만 이렇게 하면 각 브랜치가 갖고 있는 모든 파일들을 다 페치한 상태이다. 그렇게까지 할 필요는 없을 수도 있다(혹은 원하지 않은 결과일 수도 있다).</p>
<p>테스트를 해보자:</p>
<pre><code> git clone -b passwordless-auth git@github.com:BolajiAyodeji/nextjs-blog.git
</code></pre>
<p>이렇게 하게 되면 자동으로 <code>passwordless-auth</code> 브랜치가 로컬 브랜치로 설정 되는 동시에 다른 브랜치들도 추적할 수 있다.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-23-at-5.30.01-AM.png" alt="git remote show origin 명령어. 추적하는 모든 브랜치들을 보여주는 터미널 화면" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-30-at-3.27.31-AM.png" alt="git branch -a 명령어가 출력하는 터미널 화면" width="600" height="400" loading="lazy"></p>
<h3 id="">두번째 방법</h3>
<pre><code>git clone --branch &lt;branchname&gt; --single-branch &lt;remote-repo-url&gt;
</code></pre>
<p>또는</p>
<pre><code>git clone -b &lt;branchname&gt; --single-branch &lt;remote-repo-url&gt;
</code></pre>
<p style="text-align: center;">여기에서 <strong>-b</strong>는 <strong>--branch</strong>의 줄임말이다.</p>
<p>이 명령어는 첫번째 방법과 같은 동작을 수행한다. 차이점은 <code>--single-branch</code> 옵션이 붙었다는 것인데 이 옵션은 Git 버전 1.7.10 에서 소개되었고 그 이후 버전들에서도 가능하다.<br>
이 옵션을 붙이게 되면 특정한 브랜치의 파일들만 페치하고 다른 브랜치들에서는 페치를 하지 않는다.</p>
<p>테스트를 해보자:</p>
<pre><code>git clone -b passwordless-auth --single-branch git@github.com:BolajiAyodeji/nextjs-blog.git
</code></pre>
<p>이렇게 하게 되면 자동으로 <code>passwordless-auth</code> 브랜치를 로컬 브랜치로 설정하고 이 브랜치만 추적하게 된다.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-23-at-5.31.12-AM.png" alt="두번째 방법에서 git remote show origin 명령어. 추적하는 모든 브랜치들을 보여주는 터미널 화면" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screenshot-2020-06-30-at-3.29.07-AM.png" alt="두번째 방법에서 git branch -a 명령어가 출력하는 터미널 화면" width="600" height="400" loading="lazy"></p>
<p>터미널에서 <code>cd pages/api</code> 를 실행해보면 처음의 프로젝트 설정에서와 같이 <code>passwordless-auth</code> 브랜치에 있는 <code>auth.js</code> 파일이 있는 것을 확인할 수 있다.</p>
<h2 id="">결론</h2>
<p>어쩔 때는 인터넷 연결이 끊기거나 컴퓨터의 메모리 용량이 거의 남지 않은 상황에서 특정한 브랜치에서 작업을 해야하는 경우가 있을 수 있다. 혹은 다른 여러가지 이유들로 특정한 브랜치에 있는 파일들만 클론하고 싶은 경우도 있을 수 있다. 다행히도 Git은 이것을 가능하게 해주는 기능을 제공한다. 또 새로운 것을 배우게 된 자신을 칭찬해주고, 이제 이것을 스스로 한번 활용해보길 바란다. 앞으로도 Git에 대해 배워야 할 것이 아직 많다.</p>
<p>무엇이든지 한 번에 하나씩 하면 된다. 그렇지 않은가?</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 세계 번역의 달이 돌아왔습니다 - 프리코드캠프를 나의 모국어로 번역하는 일을 돕는 방법 ]]>
                </title>
                <description>
                    <![CDATA[   2021년 9월에 프리코드캠프가 처음으로 세계 번역의 달을 주최한 후로 1년이 지났습니다. 다시 9월이 돌아왔네요.  2회 째를 맞은 이 행사는 한 달간 진행됩니다. 프리코드캠프는 9월 6일을 시작으로 한 달 동안 세계 번역의 달을 주최합니다. 세계 번역의 달이란 무엇일까요? 세계 번역의 달은 프리코드캠프의 교육과정을 최대한 많은 세계의 다양한 언어들로 번역하기 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/world-translation-month-is-back-how-to-help-translate-freecodecamp-into-your-native-language/</link>
                <guid isPermaLink="false">63165205b9e78405860294c5</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Tue, 06 Sep 2022 21:56:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/09/World-Translation-Month-Article-Image-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/world-translation-month-is-back-how-can-you-contribute-to-translate-freecodecamp-into-your-language/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">World Translation Month is Back – How to Help Translate freeCodeCamp into Your Native Language</a>
      </p><h1></h1><p> 2021년 9월에 프리코드캠프가 처음으로 세계 번역의 달을 주최한 후로 1년이 지났습니다. &nbsp;</p><p>다시 9월이 돌아왔네요. &nbsp;2회 째를 맞은 이 행사는 한 달간 진행됩니다. 프리코드캠프는 9월 6일을 시작으로 한 달 동안 세계 번역의 달을 주최합니다.</p><h2 id="-"><strong>세계 번역의 달이란 무엇일까요?</strong></h2><p>세계 번역의 달은 프리코드캠프의 교육과정을 최대한 많은 세계의 다양한 언어들로 번역하기 위한 프리코드캠프의 계획입니다. </p><p>이 행사는 새로운 봉사자 분들을 환영함과 동시에 이미 번역 과정에 참여하고 있는 분들에게 감사함을 전합니다.</p><p>첫번째 행사를 했던 작년, 프리코드캠프는 트위터 스페이스(Twitter Space)를 통해 봉사자 분들과 얘기를 나눌 수 있었습니다. &nbsp;그리고 새로 번역을 시작하는 많은 봉사자 분들이 모국어으로 프리코드캠프를 번역할 수 있도록 도와드렸습니다.</p><p>세계 번역 봉사를 이끌고 있는 라파엘(Rafael)은 <a href="https://www.freecodecamp.org/news/world-translation-month-event/">이 기사 </a>를 통해 행사를 알렸습니다. 여기에서 기사가 나왔던 그 시점까지를 기준으로 번역을 하기 위한 노력이 어느 정도인지 볼 수 있는 데이터가 있습니다.</p><h2 id="--1"><strong>현재까지의 번역 진행 상황</strong></h2><p>작년 행사 이후로 12개월 동안 많은 일들이 있었습니다. 다양한 언어들을 하시는 봉사자분들이 늘어났습니다. 예를 들면 이태리어, 일본어, 포르투갈어, 우크라이나어 같은 언어들은 교육 과정 전체의 번역이 끝난 상태입니다.</p><p>다른 언어들에서는 가장 주된 세 가지 자격증 교육과정 -반응형 웹 디자인(최신 버전의), 자바스크립트, 프론트엔드 라이브러리 - 의 번역을 시작했습니다. 아랍어, 벵갈어, 불어, 독어, 인도네시아어, 한국어, 페르시아어, 루마니아어, 러시아어, 터키어, 우르두어 같은 언어들입니다.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/09/languages2-1.png" class="kg-image" alt="languages2-1" width="600" height="400" loading="lazy"><figcaption>프리코캠프의 자격증들이 이태리어와 일본어(윗 부분), 포르투갈어와 우크라니아어(밑 부분)로 번역 된 모습.</figcaption></figure><p>작년 우리 커뮤니티는 목표를 조금 변경해서 프리코드캠프의 발행물을 번역하는데 집중하기로 했습니다. 가장 인기 많은 튜토리얼들을 다른 언어들로 번역하기 시작했습니다. </p><p>이 튜토리얼들은 이제 다양한 언어들로 발행 되었습니다. 이미 475개의 기사들을 스페인어로, 1000개가 넘는 기사들을 중국어로 만나볼 수 있습니다.</p><p>포르투갈어로는 350개 정도의 기사들이, 그리고 이태리어로는 200개가 넘는 기사들이 번역되었습니다.</p><p>일본어, 벵갈어, 아랍어, 우르두어의 뉴스 섹션 또한 더 많은 번역글들을 발행하고 있습니다.</p><p>그렇다고 해서 교육 과정 번역을 안 하는 것은 아닙니다. &nbsp;실제로는 교육 과정과 발행물 번역이 동시에 이루어지고 있다고 보는 것이 맞습니다. 어떤 봉사자 분들은 교육 과정 번역에 집중하는 반면, 다른 봉사자 분들은 발행물 번역을 도와주고 계십니다.</p><h2 id="--2"><strong><strong>소통 공간의 변화</strong></strong></h2><p>또한 봉사자 분들과 소통하는 방법에도 변화가 있었습니다. 6월에 우리는 Discord 서버로 채팅하는 공간을 옮겼습니다.</p><p>그 이후로 저희가 봉사자 분들과 소통하는 것이 더 쉬워졌습니다. &nbsp;봉사자 분들사이의 소통 또한 쉬워졌고, 이 커뮤니티 안에서 코딩을 배우는 분들과의 소통 또한 더 쉬워졌습니다.</p><p>아래 사진에서 보시다시피 Localization(현지화) 그룹 밑에 번역 채팅방들이 있습니다:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/09/image-196.png" class="kg-image" alt="image-196" width="600" height="400" loading="lazy"><figcaption>fCC Discord 서버의 현지화(Localization) 채팅 방들</figcaption></figure><p>만약 교육 과정에 대한 질문이나 도움이 필요한 경우에는 여전히 <a href="https://forum.freecodecamp.org/">프리코드캠프 포럼</a>에서 물어볼 수 있습니다 </p><p>이 포럼에서 또한 영어로 질문하기 어렵지만 교육 과정에 대한 질문이 있는 분들을 위해서 다양한 언어들의 공간을 만들었습니다.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/09/image-197.png" class="kg-image" alt="image-197" width="600" height="400" loading="lazy"><figcaption>fCC 포럼에 여러개의 로컬 섹션이 있습니다.</figcaption></figure><h2 id="--3"><strong>세계 번역의 달의 목표</strong></h2><p>세계 번역의 달이 가진 목표는 두 부분으로 되어있습니다:</p><ul><li>프리코캠프가 최대한 다양한 언어로 제공될 수 있도록 도와주고 계신 봉사자분들에 대한 고마움 표시</li><li>번역에 참여할 더 많은 봉사자분들을 초대</li></ul><p>퀸시(Quincy)는 6월에 이 <a href="https://www.freecodecamp.org/news/help-translate-freecodecamp-language/">기사</a>를 통해서 어떻게 하면 번역 봉사에 참여할 수 있는지 설명했습니다.</p><p>우리는 또한 각자의 모국어로 계속해서 더 많은 번역글을 쓰고 계신 봉사자분들에게 고마움을 표시하고 싶습니다. 이 번역된 교육 과정들과 기사들이 세계에 있는 많은 사람들이 자신의 모국어로 코딩을 배울 수 있는 일을 가능하게 해줍니다. </p><h2 id="--4"><strong>세계 번역의 달 훈장</strong></h2><p>올해에도 이번 달 동안 번역을 도와주신 분들에게 훈장을 드리려고 합니다. 각 기사들의 길이가 다르다 하더라도, 그 기사 하나를 번역하는데 얼마나 많은 노력이 필요한지 우리는 알고 있습니다.</p><p>기사를 번역하는 일은 교육 과정을 번역하는 일과는 조금 다릅니다. 봉사자 분들은 교육 과정에 있는 문장 몇 개를 번역하고 그만둘 수도 있습니다. 하지만 일단 하나의 기사 번역을 시작한 봉사자분들은 그 기사 전체의 번역을 책임지게 됩니다. 그렇기 때문에 봉사자분은 자신이 선택한 기사의 번역의 시작하고 끝냅니다.</p><p>세계 번역의 달 행사 기간 동안, 한 해 동안 기여해주신 모든 분들에게 세계 번역의 달 훈장을 드릴 것 입니다.</p><p>그리고 행사의 끝에는 9월 한 달간 가장 많은 기여를 해주신 봉사자 분들에게 특별한 훈장을 드릴 것 입니다.</p><p>이 훈장들은 본인의 프리코드캠의 교육 과정 페이지나 포럼의 프로필에 나타나게 할 수 있습니다.</p><h2 id="--5"><strong>모든 번역자 분들, 기여자 분들, 감수자 분들에게 고맙습니다!</strong></h2><p>프리코드캠프의 교육 과정을 다른 언어로 번역하는 일에 참여하고 싶으신 분은 Discord에 있는 contributors' 채널에 들어오시거나, 기여하는 방법이 나와있는 퀸시(Quincy)의 <a href="https://www.freecodecamp.org/news/help-translate-freecodecamp-language/">기사</a>를 읽어보실 수 있습니다.</p><p>프리코드캠프의 거대한 자료들이 자신의 모국어로 제공될 수 있도록 기여하고 계신 분들에게 고맙습니다! 우리 마음속 깊이 고마운 마음을 전함과 동시에 우리는 이 과정이 기여자 분들에게 또 다른 배움을 가져다주고, 또 재미있었기를 바랍니다. 앞으로도 지금처럼 잘 부탁드립니다!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Node와 NPM을 최신 버전으로 업데이트 하기 ]]>
                </title>
                <description>
                    <![CDATA[  Node는 런타임 환경으로써 브라우저 이외의 서버 사이드에서 자바스크립트 코드를 실행할 수 있게 해준다. 반면 NPM은 패키지 매니저로서 자바스크립트 패키지(Node modules 이라고도 불린다)를 npm registry [https://www.npmjs.com/]에 퍼블리시 하는 곳이다. Node를 설치하기 위해서는 Nodejs website [https://nodejs.org/en/]에서 인스톨러를 다운받아야 한다. 다운 받은 인스톨러를 실행시키고 terms and conditions에 동의한 후 설치를 마친다. Node를 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/how-to-update-node-and-npm-to-the-latest-version/</link>
                <guid isPermaLink="false">62eb6a99b9e78405860292c5</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Thu, 04 Aug 2022 06:45:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/08/pexels-markus-winkler-4052195.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/how-to-update-node-and-npm-to-the-latest-version/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Update Node and NPM to the Latest Version</a>
      </p><!--kg-card-begin: markdown--><p><img src="https://www.freecodecamp.org/news/content/images/size/w1000/2022/04/pexels-markus-winkler-4052195.jpg" alt="typewriter image with the word Update written on the paper" width="600" height="400" loading="lazy"></p>
<h4 id="node">Node는 런타임 환경으로써 브라우저 이외의 서버 사이드에서 자바스크립트 코드를 실행할 수 있게 해준다.</h4>
<p>반면 NPM은 패키지 매니저로서 자바스크립트 패키지(Node modules 이라고도 불린다)를 <a href="https://www.npmjs.com/">npm registry</a>에 퍼블리시 하는 곳이다.</p>
<p>Node를 설치하기 위해서는 <a href="https://nodejs.org/en/">Nodejs website</a>에서 인스톨러를 다운받아야 한다.<br>
다운 받은 인스톨러를 실행시키고 terms and conditions에 동의한 후 설치를 마친다.</p>
<p>Node를 설치하면 프로젝트에 있는 패키지들을 관리할 수 있는 <code>npm</code> CLI도 사용할 수 있게 된다.</p>
<p>하지만 Node와 NPM은 따로 각각의 최신 버전으로 업데이트 할 수 있다.<br>
어떻게 Node와 NPM을 따로 업데이트 할 수 있는지 밑의 설명에서 살펴보자.</p>
<h2 id="node">Node 업데이트 하기</h2>
<h3 id="1npmnode">1. NPM으로 Node 버전 업데이트 하기</h3>
<p>NPM을 이용해서 Node를 업데이트하기 위해서는 <a href="https://www.npmjs.com/package/n">n</a>패키지를 설치한다. 이 패키지를 이용해서 node 버전을 상호적으로 관리할 수 있다.</p>
<p>방법은 아래의 단계와 같다.</p>
<h3 id="npm">NPM 캐시 삭제</h3>
<p>Dependencies를 설치할 때 어떤 modules은 캐시(cache)가 된다. 그럼으로써 이 다음번에 다운로드를 받고 설치할 때 속도를 빠르게 만들 수 있다.<br>
그러니 먼저 NPM 캐시를 삭제하자.</p>
<br>
<h4 id="n">n 설치하기</h4>
<br>
<pre><code>npm install -g n
</code></pre>
<p>전역(global)으로 설치를 해야 Node 버전을 root에서 관리할 수 있다.</p>
<h4 id="node">새로운 버전의 Node 설치하기</h4>
<pre><code>n lts
n latest
</code></pre>
<p>위에 있는 두 개의 명령어는 롱텀 서포트와 취신 버전의 Node를 설치하는 명령어들이다.</p>
<h4 id="">이전에 설치되었던 버전들 삭제하기</h4>
<pre><code>n prune
</code></pre>
<p>이 명령어는 예전에 설치 되었던 버전들의 캐시를 없애고 가장 최근에 설치한 버전만 남겨둔다.</p>
<h3 id="2nvmnode">2. NVM을 사용해서 Node 버전 업데이트 하기</h3>
<p>NVM은 Node Version Manager(노드 버전 메니저)를 뜻한다. 이름과 같이, Node 버전을 관리할 수 있도록 도와주는 툴이다. NVM을 이용해서 다양한 Node 버전들을 설치하고 프로젝트에 따라 특정한 버전을 지정해줄 수 있다.</p>
<p>NVM은 다양한 Node 버전에서 프로젝트들을 테스트하기 쉽게 해준다.</p>
<p>NVM을 이용해서 Node 버전을 업데이트 하려면 먼저 NVM을 설치해야 한다.</p>
<p>NVM <a href="https://github.com/nvm-sh/nvm#installing-and-updating">설치 가이드는 여기에서</a> 볼 수 있다.</p>
<p>위의 가이드데로 설치를 마치면 아래와 같이 패캐지를 설치할 수 있다:</p>
<pre><code>nvm install [version]
</code></pre>
<p>가장 최신 버전은 아래와 같이 설치한다:</p>
<pre><code>nvm install node
</code></pre>
<p>다른 버전들을 언인스톨(uninstall) 하는 방법은 아래와 같다:</p>
<pre><code>nvm uninstall [version]
</code></pre>
<p>여러가지 버전들을 설치한 후에 작업하고 있는 프로젝트에 따라 특정한 버전을 지정해줘야 할 경우가 있을 것이다.<br>
디폴트 버전은 이렇게 지정해줄 수 있다:</p>
<pre><code>nvm alias default [version]
</code></pre>
<p>이렇게 하면 지정한 버전의 Node를 실행할 수 있다.</p>
<h3 id="nodebinaries">업데이트된 Node 바이너리(Binaries) 다운받기</h3>
<p><a href="https://nodejs.org/ko/">Node.js</a> 웹사이트에서 최신 버전을 다운받는 방법도 있다. 여기에서<br>
최신 버전과 오랫동안 서포트 되어왔던 버전들을 찾을 수 있다.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/size/w1600/2022/04/image-7.png" alt="Node.js downloads page" width="600" height="400" loading="lazy"><br>
<em>Node.js downloads page</em></p>
<p>최신 버전을 다운 받으면 NPM의 최신 버전도 같이 다운로드 된다.</p>
<h2 id="npm">NPM을 업데이트 하는 방법</h2>
<p>패키지를 업데이트 하기 위해서 NPM을 사용하듯, NPM 자체를 업데이트 하기 위해서 NPM을 쓸 수도 있다.<br>
아래의 명령어를 쓴다:</p>
<pre><code>npm install -g npm@latest
</code></pre>
<p>이 명령어는 최신 버전의 NPM을 글로벌 설치한다.</p>
<p>맥(Mac) 사용자는 NPM 명령어를 쓸 때 <code>sudo</code>를 앞에 써야할 수도 있다. 이 명령어는 NPM을 디바이스 루트(root)에<br>
설치하기 때문에 루트 권한이 있어야 한다.</p>
<h2 id="">정리</h2>
<p>이번 포스트에서는 Node와 NPM을 어떻게 최신 버전으로 업데이트하는지 소개했다.</p>
<p>다시 정리하자면, Node를 설치하면 NPM도 같이 설치된다. Node 웹사이트에서 binaries(바이너리)를 설치해서<br>
Node 버전을 업데이트하면 NPM 버전도 같이 업데이트 된다.</p>
<p>그리고 Node와 NPM을 글로벌 설치하는 법도 설명했다.</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 자바에서 문자열을 int로 바꾸기 - 문자열(string)을 정수(integer)로 바꾸는 법 ]]>
                </title>
                <description>
                    <![CDATA[ 문자열 객체(object)들은 문자들의 열로 표현된다. 스윙(Java Swing)을 써 본 사람이라면, 거기에 있는 그래픽 사용자 인터페이스에서 입력 값을 가져오기 위해 JTextField나 JTextArea같은 컴포넌트가 쓰이는 것을 봤을 것이다. 이런 컴포넌트들은 우리가 필요한 입력 값을 문자열 형태로 가져온다. 스윙을 이용해서 간단한 계산기를 만든다고 하자. 그럼 문자열(string)을 정수(integer)로 바꾸는 법을 알아야한다. 그러면 물음표가 떠오른다 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/java-string-to-int-how-to-convert-a-string-to-an-integer/</link>
                <guid isPermaLink="false">62d27e8fb9e7840586028f82</guid>
                
                    <category>
                        <![CDATA[ Java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Sat, 16 Jul 2022 09:03:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/07/Untitled-design.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/java-string-to-int-how-to-convert-a-string-to-an-integer/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Java String to Int – How to Convert a String to an Integer</a>
      </p><!--kg-card-begin: markdown--><h3 id="object">문자열 객체(object)들은 문자들의 열로 표현된다.</h3>
<p>스윙(Java Swing)을 써 본 사람이라면, 거기에 있는 그래픽 사용자 인터페이스에서 입력 값을 가져오기 위해 JTextField나 JTextArea같은 컴포넌트가 쓰이는 것을 봤을 것이다. 이런 컴포넌트들은 우리가 필요한 입력 값을 문자열 형태로 가져온다.</p>
<p>스윙을 이용해서 간단한 계산기를 만든다고 하자. 그럼 문자열(string)을 정수(integer)로 바꾸는 법을 알아야한다. 그러면 물음표가 떠오른다 - 문자열(string)을 정수(integer)로 어떻게 변환할까?</p>
<p>자바에서 문자열을 정수로 변환하기 위해서는 두가지 방법, <code>Interger.valueOf()</code> 과 <code>Integer.parseInt()</code> 이 있다.</p>
<h2 id="1integerparseint">1. Integer.parseInt() 를 사용하는 법</h2>
<p>이 메소드는 문자열을 기본형 정수 (primitive type int)로 리턴한다. 문자열이 유효한 숫자를 포함하지 않는다면 <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/NumberFormatException.html">NumberFormatException</a>이 쓰로우 된다.</p>
<p>그렇기 때문에 문자열을 int로 바꿀때에는 항상 try-catch문으로 코드를 감싸서 이 익셉션을 처리해야 한다.</p>
<p><code>Integer.parseInt()</code> 를 써서 문자열을 int로 바꾸는 이 예시를 보자.</p>
<pre><code>  String str = "25";
        try{
            int number = Integer.parseInt(str);
            System.out.println(number); // output = 25
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }
</code></pre>
<p>이제 입력값에 유효하지 않은 정수를 대입해 본다.</p>
<pre><code>    	String str = "25T";
        try{
            int number = Integer.parseInt(str);
            System.out.println(number);
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }
</code></pre>
<p>위에 있는 코드에서는 <code>25T</code> 를 정수로 변환하려고 한다. 이는 유효한 입력값이 아니다. 그렇기 때문에 NumberFormatException을 쓰로우하게 된다.</p>
<p>위에 있는 코드의 결과값은 이렇다:</p>
<pre><code>java.lang.NumberFormatException: For input string: "25T"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at OOP.StringTest.main(StringTest.java:51)
</code></pre>
<p>다음으로는 <code>Integer.valueOf()</code> 를 사용해서 문자열을 정수로 바꾸는 법을 살펴보자.</p>
<h2 id="2intergervalueof">2. Interger.valueOf() 를 사용하는 법</h2>
<p>이 방법은 문자열을 정수 객체(integer object)로 리턴한다. 자바 도큐멘테이션을 보면 <code>Integer.valueOf()</code> 는 정수 객체를 리턴한다고 나온다. <code>new Interger(Integer.parseInt(s))</code> 와 동일한 셈이다.</p>
<p><code>Integer.valueOf()</code> 메소드를  try-catch문과 함께 사용하는 코드 예시를 보자.</p>
<pre><code>        String str = "25";
        try{
            Integer number = Integer.valueOf(str);
            System.out.println(number); // output = 25
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }
</code></pre>
<p>이번에는 입력값에 유효하지 않은 정수를 넣어보자.</p>
<pre><code>     String str = "25TA";
        try{
            Integer number = Integer.valueOf(str);
            System.out.println(number);
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }
</code></pre>
<p>앞서 봤던 예시와 마찬가지로 이 코드도 익셉션을 쓰로우 할 것이다.</p>
<p>위에 있는 코드의 결과 값은 이렇다.</p>
<pre><code>java.lang.NumberFormatException: For input string: "25TA"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.valueOf(Integer.java:766)
	at OOP.StringTest.main(StringTest.java:42)
</code></pre>
<p>위에서 본 메소드들을 쓰기 전에 먼저 입력된 문자열이 숫자인지 아닌지 확인하는 메소드를 만들어서 쓸 수도 있다.</p>
<p>입력된 문자열이 숫자인지 아닌지 확인하는 간단한 메소드를 만들어보았다.</p>
<pre><code>public class StringTest {
    public static void main(String[] args) {
        String str = "25";
        String str1 = "25.06";
        System.out.println(isNumeric(str));
        System.out.println(isNumeric(str1));
    }

    private static boolean isNumeric(String str){
        return str != null &amp;&amp; str.matches("[0-9.]+");
    }
}
</code></pre>
<p>결과값은 이렇다:</p>
<pre><code>true
true
</code></pre>
<p><code>isNumeric()</code> 메소드는 전달인자(argument)로 문자열을 받는다. 그리고 전달인자가 <code>null</code> 인지 아닌지를 확인한다. 그 다음에는 0부터 9사이에 있는 숫자들이나 소수점이 있는지 <code>matches()</code> 메소드를 써서 확인한다.</p>
<p>위의 방법은 문자열에서 숫자값을 확인하기 위한 간단한 예시이고, 유스케이스에 따라서 또 다른 방법으로는 정규표현식(regular expression)을 쓸 수도 있는데 (이 포스트에서는 다루지 않겠지만) 구글 검색을 추천한다.</p>
<p>입력된 문자열이 숫자인지 아닌지 먼저 체크를 한 후에 그 문자열을 숫자로 변환하는 것이 정석이다.</p>
<p>Thank you for reading.</p>
<p>Post image by&nbsp;<a href="https://unsplash.com/@itfeelslikefilm?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">🇸🇮 Janko Ferlič</a>&nbsp;on&nbsp;<a href="https://unsplash.com/collections/139346/soul-care?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>You can connect with me on&nbsp;<a href="https://mvthanoshan.medium.com/">Medium</a>.</p>
<p><strong>Happy Coding!</strong></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 브랜치를 로컬과 원격에서 모두 삭제하는 법 ]]>
                </title>
                <description>
                    <![CDATA[ 깃 브랜치를 삭제하는 법은 간단하다. 로컬과 원격 두군데에서 모두 브랜치를 삭제하는 법을 알아보자. 간단히 요약하자면 아래와 같다. // 로컬에서 브랜치 삭제하기 명령어  git branch -d localBranchName(로컬의 브랜치 이름) // 원격에서 브랜치 삭제하기 명령어 git push origin --delete remoteBranchName(원격 브랜치 이름) 브랜치를 삭제해야 하는 경우 보통 하나의 깃 리포(repository)만 해도 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/how-to-delete-a-git-branch-both-locally-and-remotely/</link>
                <guid isPermaLink="false">62c881fdb9e7840586028f2e</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Alison Yoon ]]>
                </dc:creator>
                <pubDate>Fri, 08 Jul 2022 19:47:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/07/5f9c9e53740569d1a4ca3c89-2.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Delete a Git Branch Both Locally and Remotely</a>
      </p><!--kg-card-begin: markdown--><h3 id="">깃 브랜치를 삭제하는 법은 간단하다. 로컬과 원격 두군데에서 모두 브랜치를 삭제하는 법을 알아보자.</h3>
<h3 id="">간단히 요약하자면 아래와 같다.</h3>
<pre><code class="language-jsx">// 로컬에서 브랜치 삭제하기 명령어 
git branch -d localBranchName(로컬의 브랜치 이름)

// 원격에서 브랜치 삭제하기 명령어
git push origin --delete remoteBranchName(원격 브랜치 이름)
</code></pre>
<h2 id=""><strong>브랜치를 삭제해야 하는 경우</strong></h2>
<p>보통 하나의 깃 리포(repository)만 해도 브랜치가 여러개 있다. 브랜치를 이용하면 메인 코드베이스를 건드리지 않으면서 다양한 기능들이나 여러가지 버그들을 픽스할 수 있다.</p>
<p>보통의 경우 리포는 하나의 <code>메인</code> 브랜치에 메인 코드베이스가 있고 개발자들은 각자 하는 일을 위해서</p>
<p>브랜치를 만든다.</p>
<p>대부분의 경우 내가 개발하고 있는 피처가 완성됐다면 브랜치를 삭제하는 것이 좋다.</p>
<p><strong>로컬에서 브랜치 삭제하기</strong></p>
<p>내가 현재 있는 작업 브랜치는 삭제 할 수 없다. 먼저 삭제하지 않을 다른 브랜치로 체크아웃을 한다.</p>
<p>예를 들면 메인 브랜치로 체크아웃 한다.</p>
<p><code>git checkout main</code></p>
<p>브랜치 삭제 명령어</p>
<p><code>git branch -d &lt;branch&gt;</code></p>
<p>예를 들면 이런식이다 (삭제하고 싶은 브랜치 이름: fix/authentication).</p>
<p><code>git branch -d&nbsp; fix/authentication</code></p>
<p><code>-d</code> 옵션으로는 브랜치가 이미 원격에 푸쉬되고 병합 되었을때만 삭제할 수 있다.</p>
<p><code>-D</code> 옵션을 쓰면 푸쉬나 병합이 아직 안된 상태에서도 강제로 삭제할 수 있다.</p>
<p>이제 이 브랜치는 로컬에서 삭제됐다.</p>
<h2 id=""><strong>원격에서 브랜치 삭제하기</strong></h2>
<p>원격에서 브랜치를 삭제하는 명령어</p>
<p><code>git push &lt;remote&gt; —delete &lt;branch&gt;</code></p>
<p>예를 들어서 삭제하고 싶은 원격 브랜치 이름이 fix/authentication 이라면</p>
<p><code>git push origin —delete fix/authentication</code></p>
<p>그러면 이제 이 브랜치는 원격에서 삭제됐다.</p>
<p>더 짧은 버전의 명령어도 있다.</p>
<p><code>git push &lt;remote&gt; :&lt;branch&gt;</code></p>
<p>이렇게 쓰면 된다.</p>
<p><code>git push origin :fix/authentication</code></p>
<p>혹시 이런 에러메세지가 뜬다면 다른 사람이 이미 그 브랜치를 삭제한 경우일 수도 있다.</p>
<pre><code class="language-jsx">error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to ‘git@repository_name'
</code></pre>
<p>이런 경우 브랜치 목록 동기화를 위해 이 명령어를 실행한다.</p>
<p><code>git fetch -p</code></p>
<p><code>-p</code> 옵션은 가지치기(prune)를 한다는 뜻이다. 패치(fetch)를 하면 원격에서 이미 삭제된 브랜치는 목록에서 없어진다.</p>
<p>혹시 이 포스트가 도움이 되었다면, 우리 프리코드캠프(비영리)에는 8000개가 넘는 실직적 도움이 되는 튜토리얼이 가득해요. 모두 무료이고 광고도 없어요. 친구들에게 알려주세요. 😉</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
