<?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[ YOUNGHYUN BAE - 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[ YOUNGHYUN BAE - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/korean/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 15:26:36 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/korean/news/author/younghyunbae/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Git에서 머지 되돌리기 - 마지막 머지를 취소하는 방법 ]]>
                </title>
                <description>
                    <![CDATA[  브랜치는 이미 프로덕션에 있는 코드를 함부로 변경하지 않으면서 작업할 수 있도록 해주는 깃의 필수적인 부분입니다. 다른 브랜치에서 작업을 마친 후 main 브랜치에 병합(merge, 이하 머지)하여 방금 통합한 기능이나 버그 수정을 반영하고자 할 것입니다. 만약 작업을 더 해야 했다는 사실을 머지 완료 후 알아차렸다면, 혹은 실수로 머지를 했다면 어떻게 해야할까요? ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/giteseo-meoji-doedolrigi-majimag-meojireul-cwisohaneun-bangbeob/</link>
                <guid isPermaLink="false">640638eafc25a70678a2df11</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ YOUNGHYUN BAE ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 22:33:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/03/puppy-g3ddb72a98_1920.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/git-undo-merge-how-to-revert-the-last-merge-commit-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Undo Merge – How to Revert the Last Merge Commit in Git</a>
      </p><p></p><p><strong>브랜치는 이미 프로덕션에 있는 코드를 함부로 변경하지 않으면서 작업할 수 있도록 해주는 깃의 필수적인 부분입니다.</strong></p><p>다른 브랜치에서 작업을 마친 후 <code>main</code> 브랜치에 병합(merge, 이하 머지)하여 방금 통합한 기능이나 버그 수정을 반영하고자 할 것입니다.</p><p>만약 작업을 더 해야 했다는 사실을 머지 완료 후 알아차렸다면, 혹은 실수로 머지를 했다면 어떻게 해야할까요?</p><p>깃에서는 거의 모든 것을 되돌릴 수 있습니다. 이 글에서는 마지막으로 커밋한 상태로 되돌릴 수 있도록 머지를 실행 취소하는 방법을 보여드리겠습니다.</p><h2 id="-">깃에서 머지 커밋을 실행 취소하는 방법</h2><p>깃의 <code>reset</code> command to undo a merge.</p><p>우선, 커밋 hash (혹은 id)를 확인해야 이전의 커밋으로 돌아갈 수 있습니다.</p><p>hash를 확인하기 위해서는 <code>git log</code> 혹은 <code>git reflog</code>를 실행하세요. 더 읽기 쉬운 <code>git reflog</code>가 더 나은 옵션이 될 수 있습니다.<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss1-2.png" class="kg-image" alt="ss1-2" width="600" height="400" loading="lazy"></figure><p>되돌리려는 커밋의 hash를 얻었다면, <code>git reset --hard commit-before-the-merge</code>를 실행하세요:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-2-5.png" class="kg-image" alt="ss-2-5" width="600" height="400" loading="lazy"></figure><p>명령을 실행하면 코드 에디터에서 몇 가지 항목이 제거되는 것을 보게 될 것입니다.</p><p>마지막 커밋의 hash가 명확하지 않다면, <code>git reset --hard HEAD~1</code>을 실행하여 머지 이전 커밋으로 돌아갈 수 있습니다:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-3-3.png" class="kg-image" alt="ss-3-3" width="600" height="400" loading="lazy"></figure><p>유의해야 할 점은 <code>--hard</code> 플래그를 사용하여 머지 실행 취소할 경우, 커밋되지 않은 모든 변경 내용이 되돌려진다는 것입니다.</p><h2 id="--1">깃에서 머지를 되돌리는 더 좋은 방법</h2><p>깃에서는 커밋되지 않은 변경 사항을 되돌리는 위의 방법을 보완하여 더 안전한 <code>--merge</code> 플래그를 제공합니다.</p><p><code>--merge</code> 를 사용하여 머지를 실행 취소하려면 <code>git reflog</code> 를 실행하여 커밋의 hash를 확인한 다음 <code>git reset --merge previous-commit</code>을 실행하세요:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss4-1.png" class="kg-image" alt="ss4-1" width="600" height="400" loading="lazy"></figure><p><code>--merge</code> 플래그와 더불어 HEAD 키워드를 사용한 <code>git reset --merge HEAD~1</code> 명령어도 쓸 수 있습니다:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss5.png" class="kg-image" alt="ss5" width="600" height="400" loading="lazy"></figure><p>참고: <code>--merge</code> 플래그를 쓸 때 해당 명령에 대한 응답을 받지 못하더라도 걱정하지마세요. 작동은 제대로 합니다.</p><h2 id="--2">마치며</h2><p>지금까지 깃을 더 효율적으로 사용할 수 있도록 실수로 혹은 원치 않은 머지를 실행 취소하는 방법을 배웠습니다.</p><p><code>--hard</code> 플래그는 커밋되지 않은 변경 사항을 제거하고, <code>--merge</code> 플래그는 커밋되지 않은 변경 사항을 유지한다는 것이 머지 되돌리기의 요점입니다.</p><p>읽어주셔서 감사합니다!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Var, Let, Const의 차이점은? ]]>
                </title>
                <description>
                    <![CDATA[  ES2015(ES6)에서 반짝이는 새로운 기능들이 많이 등장했습니다. 2020년이 된 지금, 많은 JavaScript 개발자들이 그 기능들을 사용하기 시작했을 것이며 또 익숙해졌을텐데요. 여전히 그 중 몇몇은 일부 개발자들에게 미스터리로 남아있을 수 있습니다. ES6에 포함된 기능 중 하나는 변수 선언에 사용할 수 있는 let 및 const의 추가입니다. 지금껏 애용해온 var와 다른 점은 무엇일까요? ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/var-let-constyi-caijeomeun/</link>
                <guid isPermaLink="false">63bd4d078b28df063f433e18</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ YOUNGHYUN BAE ]]>
                </dc:creator>
                <pubDate>Thu, 12 Jan 2023 06:54:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2023/01/5f9c9bd4740569d1a4ca2e24.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Var, Let, and Const – What's the Difference?</a>
      </p><p></p><p>ES2015(ES6)에서 반짝이는 새로운 기능들이 많이 등장했습니다. 2020년이 된 지금, 많은 JavaScript 개발자들이 그 기능들을 사용하기 시작했을 것이며 또 익숙해졌을텐데요. 여전히 그 중 몇몇은 일부 개발자들에게 미스터리로 남아있을 수 있습니다.</p><p><br>ES6에 포함된 기능 중 하나는 변수 선언에 사용할 수 있는 <code>let</code> 및 <code>const</code>의 추가입니다. 지금껏 애용해온 <code>var</code>와 다른 점은 무엇일까요? 이 글은 여전히 명확히 이해하지 못 한 당신을 위한 것입니다.</p><h2 id="var"><strong><strong>Var</strong></strong></h2><p>ES6의 등장 이전에는 문제점들이 있음에도 불구하고 <code>var</code>로 변수를 선언하는 것이 지배적이었는데요. 따라서 새로운 변수 선언 방식이 등장할 수밖에 없었습니다. 우선, 문제점에 대해 논의하기 전에 <code>var</code> 자체에 대해 더 이해해봅시다.</p><h3 id="scope-of-var"><strong><strong>Scope of var</strong></strong></h3><p><strong>범위</strong>는 기본적으로 변수를 사용할 수 있는 위치를 의미합니다. <code>var</code> 선언은 전역 범위 혹은 함수 범위로 지정됩니다.</p><p><br><code>var</code>변수가 함수 외부에서 선언될 때의 범위는 전역입니다. 즉, 함수 블록 외부에서 <code>var</code>를 사용하여 선언된 모든 변수를 전체 윈도우 상에서 사용할 수 있는 것이죠.</p><p><br><code>var</code>가 함수 내에서 선언될 때는 함수 범위로 지정됩니다. 즉, 해당 함수 내에서만 사용하고 접근할 수 있습니다.</p><p><br>자세한 이해를 돕기위해 아래의 예제를 살펴봅시다.</p><pre><code class="language-javascript">    var greeter = "hey hi";
    
    function newFunction() {
        var hello = "hello";
    }
</code></pre><p>여기서 <code>hello</code>가 함수 범위인 반면에, <code>greeter</code>는 함수 밖에 존재하므로 전역 범위를 가지게 됩니다.</p><pre><code class="language-javascript">    var tester = "hey hi";
    
    function newFunction() {
        var hello = "hello";
    }
    console.log(hello); // error: hello is not defined
</code></pre><p><code>hello</code>는 <code>newFunction()</code> 함수 밖에서 사용할 수 없기 때문에 에러가 발생하게 됩니다.</p><h3 id="var-">var 변수는 재선언되고, 업데이트될 수 있습니다.</h3><p>같은 범위 내에서라면 아래의 두 경우와 같이 수정이 가능하며 에러가 발생하지 않습니다.</p><pre><code class="language-javascript">    var greeter = "hey hi";
    var greeter = "say Hello instead";
</code></pre><pre><code class="language-javascript">    var greeter = "hey hi";
    greeter = "say Hello instead";
</code></pre><h3 id="var--1">var의 호이스팅</h3><p>호이스팅이란 변수와 함수 선언이 맨 위로 이동되는 자바스크립트 매커니즘인데요. 아래와 같이 코드를 짜면:</p><pre><code class="language-javascript">    console.log (greeter);
    var greeter = "say hello"
</code></pre><p>자바스크립트는 다음과 같이 해석하기 때문에:</p><pre><code class="language-javascript">    var greeter;
    console.log(greeter); // greeter is undefined
    greeter = "say hello"
</code></pre><p><code>var</code>변수는 범위 내에서 맨 위로 올려지고, 값은 <code>undefined(정의되지 않음)</code>으로 초기화됩니다.</p><h3 id="var--2">var의 문제점</h3><p>아래의 예제를 토대로 <code>var</code>를 사용할 시 따라오는 취약점에 대해 이야기해보겠습니다.</p><pre><code class="language-javascript">    var greeter = "hey hi";
    var times = 4;

    if (times &gt; 3) {
        var greeter = "say Hello instead"; 
    }
    
    console.log(greeter) // "say Hello instead"
</code></pre><p><code>time &gt; 3</code>가 <code>true</code>를 반환하기 때문에 <code>greeter</code>는 <code>"say Hello instead"</code>로 재정의됩니다. 의도적으로 재정의한 것이라면 괜찮겠지만, 변수 <code>greeter</code>가 이미 정의되어 있다는 사실을 인식하지 못한 경우에는 문제가 됩니다.</p><p>만약 코드의 다른 부분에서 <code>greeter</code>를 사용한 적이 있다면 뜻밖의 출력 결과에 놀랄 수 있습니다. 그리고 많은 버그를 발생시킬 수 있기 때문에 <code>let</code>과 <code>const</code>가 필요하게 된 것이죠.</p><h2 id="let"><strong><strong>Let</strong></strong></h2><p><code>var</code> 선언에 대한 개선을 반영한 <code>let</code>이 현재 변수 선언에서 선호되고 있습니다. 방금 다뤘던 <code>var</code>의 문제점을 해결할 수 있었던 이유에 대해 살펴봅시다.</p><h3 id="-let">블록 범위 let</h3><p>블록은 <code>{}</code>로 바인딩된 코드 청크인데요. 하나의 블록은 중괄호 속에서 존재하며, 중괄호 안에 있는 것은 모두 블록 범위입니다.</p><p><code>let</code>으로 선언된 변수는 해당 블록 내에서만 사용가능합니다. 예를 들어 설명하자면:</p><pre><code class="language-javascript">   let greeting = "say Hi";
   let times = 4;

   if (times &gt; 3) {
        let hello = "say Hello instead";
        console.log(hello);// "say Hello instead"
    }
   console.log(hello) // hello is not defined
</code></pre><p>중괄호로 감싸진 <code>hello</code> 변수가 정의된 블록 외부에서 <code>helllo</code>를 사용했더니 에러가 반환되는 것을 확인할 수 있습니다. <code>let</code> 변수는 블록 범위이기 때문이죠.</p><h3 id="let-">let은 업데이트될 수 있지만, 재선언은 불가능하다.</h3><p><code>var</code>와 마찬가지로 <code>let</code>으로 선언된 변수는 해당 범위 내에서 업데이트될 수 있습니다. 하지만, <code>var</code>와 달리 <code>let</code> 변수는 범위 내에서 다시 선언할 수 없습니다. 아래의 기능이 작동하는 동안:</p><pre><code class="language-javascript">    let greeting = "say Hi";
    greeting = "say Hello instead";
</code></pre><p>이와 같은 에러가 발생합니다:</p><pre><code class="language-javascript">    let greeting = "say Hi";
    let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared
</code></pre><p>그러나 동일한 변수가 다른 범위 내에서 정의된다면, 에러는 더 이상 발생하지 않습니다.</p><pre><code class="language-javascript">    let greeting = "say Hi";
    if (true) {
        let greeting = "say Hello instead";
        console.log(greeting); // "say Hello instead"
    }
    console.log(greeting); // "say Hi"
</code></pre><p>오류가 없는 이유는 무엇일까요? 두 예제가 서로 다른 범위를 가지므로 서로 다른 변수로 취급되기 때문입니다. 따라서 <code>var</code>보다 <code>let</code>이 더 나은 선택이 될 수 있는 것이죠. <code>let</code>을 사용하는 경우라면, 변수가 범위 내에서만 존재하기 때문에 이전에 이미 사용한 적이 있는 변수 명에 대해서 더 이상 신경쓰지 않아도 좋습니다.또한, 범위 내에서 동일한 변수를 두 번 이상 선언할 수 없기 때문에 앞서 설명한 <code>var</code>의 문제가 발생하지 않습니다.</p><h3 id="let--1">let의 호이스팅</h3><p><code>var</code>와 마찬가지로 <code>let</code> 선언은 맨 위로 끌어올려집니다. <code>undefined(정의되지 않음)</code>으로 초기화되는 <code>var</code>와 다르게 <code>let</code>의 키워드는 초기화되지 않습니다. 선언 이전에 <code>let</code> 변수를 사용하려고 시도한다면 <code>Reference Error(참조 오류)</code>가 발생할 것입니다.</p><h2 id="const"><strong><strong>Const</strong></strong></h2><p><code>const</code>로 선언된 변수는 일정한 상수 값을 유지합니다. <code>const</code> 선언은 <code>let</code> 선언과 몇 가지 유사점을 공유합니다.</p><h3 id="-const">블록 범위 const</h3><p><code>let</code> 선언처럼 <code>const</code> 선언도 선언된 블록 범위 내에서만 접근 가능합니다.</p><h3 id="const-">const는 업데이트도, 재선언도 불가능하다</h3><p><code>const</code>로 선언된 변수의 값이 해당 범위 내에서 동일하게 유지됨을 의미합니다. 업데이트하거나 다시 선언할 수가 없는 것이죠. <code>const</code>로 변수를 선언한 경우에는 다음과 같은 두 작업을 수행할 수 없습니다:</p><pre><code class="language-javascript">    const greeting = "say Hi";
    greeting = "say Hello instead";// error: Assignment to constant variable. 
</code></pre><pre><code class="language-javascript">    const greeting = "say Hi";
    const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared
</code></pre><p>따라서 모든 <code>const</code> 선언은 선언하는 당시에 초기화되어야 합니다.</p><p>개체의 경우는 다소 다른 점이 있는데요. <code>const</code> 개체는 업데이트할 수 없지만, 개체의 '속성'은 업데이트할 수 있습니다. <code>const</code> 객체를 다음과 같이 선언했다면:</p><pre><code class="language-javascript">    const greeting = {
        message: "say Hi",
        times: 4
    }
</code></pre><p>아래와 같은 작업은 불가능하지만:</p><pre><code class="language-javascript">    greeting = {
        words: "Hello",
        number: "five"
    } // error:  Assignment to constant variable.
</code></pre><p>다음의 코드는 가능합니다:</p><pre><code class="language-javascript">    greeting.message = "say Hello instead";
</code></pre><p>오류를 반환하지 않고 <code>greeting.message</code> 값이 업데이트됩니다.</p><h3 id="const--1">const의 호이스팅</h3><p><code>let</code>과 마찬가지로 <code>const</code> 선언도 맨 위로 끌어올려지지만, 초기화되지는 않습니다.</p><p>세 가지 변수 선언법의 차이점에 대해서 총정리하자면:</p><ul><li><code>var</code> 선언은 전역 범위 또는 함수 범위이며, <code>let</code>과 <code>const</code>는 블록 범위이다.</li><li><code>var</code> 변수는 범위 내에서 업데이트 및 재선언할 수 있다. <code>let</code> 변수는 업데이트할 수 있지만, 재선언은 할 수 없다. <code>const</code> 변수는 업데이트와 재선언 둘 다 불가능하다.</li><li>세 가지 모두 최상위로 호이스팅된다. 하지만 <code>var</code> 변수만 <code>undefined(정의되지 않음)</code>으로 초기화되고 <code>let</code>과 <code>const</code> 변수는 초기화되지 않는다.</li><li><code>var</code>와 <code>let</code>은 초기화하지 않은 상태에서 선언할 수 있지만, <code>const</code>는 선언 중에 초기화해야한다.</li></ul><h2 id="var-let-const-">Var, Let, Const에 대한 설명 영상</h2><figure class="kg-card kg-embed-card"><iframe src="https://scrimba.com/scrim/coede4c58a4461640298cc925?embed=freecodecamp,mini-header,no-sidebar" width="100%" height="420" title="Embedded content" 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-size: 19px; vertical-align: middle;"></iframe></figure><p><br>이게 전부랍니다. 질문 혹은 추가해야할 내용이 있다면 알려주세요.</p><p>읽어주셔서 감사합니다 :)</p><p><br></p><p><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git에서 커밋 되돌리기 - 마지막 커밋을 취소하는 방법 ]]>
                </title>
                <description>
                    <![CDATA[ Git에서 코드 작업을 하고 있는데 계획대로 되지 않아서 가장 최근 커밋을 되돌려야 한다고 가정해봅시다. 어쩌면 좋을까요? 방법에 대해 알아봅시다! 마지막 커밋을 취소할 수 있는 두 가지 방법이 있습니다. 이 글에서는 이 두 가지를 모두 살펴보겠습니다. revert 명령어 revert 명령어는 취소하고 싶은 특정 커밋의 내용을 되돌리는 새로운 커밋을 만듭니다. 이 명령어를 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/giteseo-keomis-doedolrigi-majimag-keomiseul-cwisohaneun-bangbeob/</link>
                <guid isPermaLink="false">636bd9a7c0cb07062cace8ce</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ YOUNGHYUN BAE ]]>
                </dc:creator>
                <pubDate>Tue, 22 Nov 2022 13:50:11 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/11/pexels-siegfried-poepperl-8778445--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/git-revert-commit-how-to-undo-the-last-commit/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Revert Commit – How to Undo the Last Commit</a>
      </p><h3 id="git-">Git에서 코드 작업을 하고 있는데 계획대로 되지 않아서 가장 최근 커밋을 되돌려야 한다고 가정해봅시다. 어쩌면 좋을까요? 방법에 대해 알아봅시다!</h3><p>마지막 커밋을 취소할 수 있는 두 가지 방법이 있습니다. 이 글에서는 이 두 가지를 모두 살펴보겠습니다.</p><h2 id="revert-"><strong><strong><code>revert</code> </strong></strong>명령어</h2><p><code>revert</code> 명령어는 취소하고 싶은 특정 커밋의 내용을 되돌리는 새로운 커밋을 만듭니다. 이 명령어를 사용하여 다음과 같이 마지막 커밋을 되돌릴 수 있습니다:</p><pre><code>git revert &lt;되돌리고 싶은 커밋 이름&gt;</code></pre><p><code><a href="https://www.freecodecamp.org/news/git-log-command/">git log</a></code>를 사용하여 되돌릴 커밋의 이름을 찾을 수 있습니다. 여기에 설명된 첫 번째 커밋은 마지막으로 생성된 커밋입니다. 그런 다음, 찾아낸 영숫자 이름을 복사하여 <code>revert</code> 명령어에 사용할 수 있습니다.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/image-117.png" class="kg-image" alt="A diagram showing that the git revert command creates a new commit to revert previous changes." width="600" height="400" loading="lazy"><figcaption>이 이미지에서 각 원은 하나의 커밋을 의미합니다.</figcaption></figure><h2 id="reset-"><strong><strong><code>reset</code> </strong></strong>명령어</h2><p><code>reset</code> 명령어를 사용해 마지막 커밋을 실행 취소할 수도 있습니다. 그러나 주의해야할 점은 커밋 기록이 변경되기 때문에 거의 사용하지 않아야 합니다. 작업 지점인 HEAD를 지정된 커밋으로 이동하고, 그 이후의 모든 항목을 폐기합니다:</p><pre><code>git reset --soft HEAD~1</code></pre><p><code>--soft</code> 옵션은 커밋되지 않은 변경사항이 손실되지 않음을 의미합니다.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/08/git-reset-soft.png" class="kg-image" alt="A diagram showing that git reset --soft will change your commit history, but will keep any unstaged changes you have." width="600" height="400" loading="lazy"><figcaption>이 이미지에서 각 원은 하나의 커밋을 의미합니다.</figcaption></figure><p>가장 최근 커밋으로 되돌리고 <code>unstaged</code> 상태의 변경 사항을 모두 제거하려면 <code>--hard</code> 옵션을 사용할 수 있습니다:</p><pre><code>git reset --hard HEAD~1</code></pre><p>이렇게 하면 최신 커밋뿐만 아니라 커밋되지 않은 변경 사항도 취소됩니다.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/image-112.png" class="kg-image" alt="A diagram showing that git reset --hard will change your commit history, but will also remove any unstaged changes you have." width="600" height="400" loading="lazy"><figcaption>이 이미지에서 각 원은 하나의 커밋을 의미합니다.</figcaption></figure><h2 id="git-reset-revert-">Git에서 언제<strong><strong> <code>reset</code> </strong></strong>또는<strong><strong> <code>revert</code></strong></strong>를 사용해야 할까요?</h2><p>되돌려야 하는 커밋이 로컬에만 존재하는 경우에만 <code>reset</code> 명령어를 사용해야 합니다. 이 명령어는 해당 커밋을 아예 삭제하고 커밋 기록을 변경하기 때문에 같이 협업하고 있는 다른 팀원의 작업에도 영향을 끼치기 때문입니다. (협업하는 프로젝트 브랜치에 <code>reset</code> 을 실행하면 다른 팀원이 새로운 커밋을 push할 때 브랜치에 충돌이 납니다 --옮긴이 주석.)</p><p><code>revert</code>는 변경 내용을 취소하는 새 커밋을 생성하므로, 되돌리려는 커밋이 이미 원격 저장소로 푸쉬된 경우에는 커밋 기록을 덮어쓰지 않는 <code>revert</code> 명령어를 사용하는 것이 가장 좋습니다.</p><h1 id="-">마치며</h1><p>마지막 커밋을 취소하는 두 가지 방법과 언제 어떤 방법을 사용하는 것이 가장 좋은지를 배웠습니다.</p><p>이제 마지막 커밋이 버그를 유발하거나 커밋하지 말았어야 하는 내용이 있다는 것을 알게 되면 어떻게 고치는지 아시겠죠?</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript Map - JS.map() 함수 사용 방법 (배열 메소드) ]]>
                </title>
                <description>
                    <![CDATA[  어떤 배열에 있는 모든 요소들의 값을 변경해서 만든 새로운 배열을 써야 할 때가 있습니다. 그 때 루프를 사용하여 배열에 대해 수동으로 반복 처리하는 대신, 간단히 기본 제공 Array.map() 메소드를 사용하면 됩니다. 이 Array.map() 메소드는 콜백 함수를 이용해 각각의 요소에 호출해서 그 값을 변환할 수 있게 해줍니다. 다시 말하자면 콜백 ]]>
                </description>
                <link>https://www.freecodecamp.org/korean/news/javascript-map-method/</link>
                <guid isPermaLink="false">62e95439b9e784058602928f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ YOUNGHYUN BAE ]]>
                </dc:creator>
                <pubDate>Thu, 01 Sep 2022 06:19:10 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/korean/news/content/images/2022/08/javascript-map-function-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>기사 원문:</strong> <a href="https://www.freecodecamp.org/news/javascript-map-how-to-use-the-js-map-function-array-method/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Map – How to Use the JS .map() Function (Array Method)</a>
      </p><p></p><p>어떤 배열에 있는 모든 요소들의 값을 변경해서 만든 새로운 배열을 써야 할 때가 있습니다.</p><p>그 때 루프를 사용하여 배열에 대해 수동으로 반복 처리하는 대신, 간단히 기본 제공 <code>Array.map()</code> 메소드를 사용하면 됩니다.</p><p>이 <code>Array.map()</code> 메소드는 콜백 함수를 이용해 각각의 요소에 호출해서 그 값을 변환할 수 있게 해줍니다. 다시 말하자면 콜백 함수는 배열의 각 요소에 실행됩니다.</p><p>예를 들어 다음과 같은 배열 요소가 있다고 가정해 봅시다:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [3, 4, 5, 6];</code></pre><figcaption>간단한 JavaScript 배열</figcaption></figure><p>이제 배열의 각 요소에 <code>3</code>을 곱해야 한다고 상상해 봅시다. 다음과 같이 <code>for</code> 루프 사용을 고려할 지도 모릅니다:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [3, 4, 5, 6];

for (let i = 0; i &lt; arr.length; i++){
  arr[i] = arr[i] * 3;
}

console.log(arr); // [9, 12, 15, 18]</code></pre><figcaption>for 루프를 사용하여 배열에 대해 반복 처리</figcaption></figure><p>그러나 사실 <code>Array.map()</code> 메소드를 사용한다면 이런 동일한 결과를 얻을 수 있습니다. 다음은 그에 대한 예시입니다: <br></p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [3, 4, 5, 6];

let modifiedArr = arr.map(function(element){
    return element *3;
});

console.log(modifiedArr); // [9, 12, 15, 18]</code></pre><figcaption>map() 메소드를 사용하여 배열에 대해 반복 처리</figcaption></figure><p>일반적으로 <code>Array.map()</code> 메소드는 위의 코드에서와 같이 특정 숫자를 곱하거나, 애플리케이션에 필요한 다른 작업을 수행하는 등 요소에 어떤 변경 사항을 적용하는 데 사용됩니다. </p><h2 id="-map-">객체 배열에서 map()을 사용하는 방법</h2><p>예를 들어, 당신의 친구들의 <code>firstName</code> 및 <code>lastName</code>의 값을 저장하는 객체 배열이 있습니다:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let users = [
  {firstName : "Susan", lastName: "Steward"},
  {firstName : "Daniel", lastName: "Longbottom"},
  {firstName : "Jacob", lastName: "Black"}
];

</code></pre><figcaption>객체 배열</figcaption></figure><p>다음과 같이 <code>map()</code> 메소드를 사용하여 배열을 순환하며 처리해서 <code>firstName</code> 및 <code>lastName</code> 값을 결합할 수 있습니다:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let users = [
  {firstName : "Susan", lastName: "Steward"},
  {firstName : "Daniel", lastName: "Longbottom"},
  {firstName : "Jacob", lastName: "Black"}
];

let userFullnames = users.map(function(element){
    return `${element.firstName} ${element.lastName}`;
})

console.log(userFullnames);
// ["Susan Steward", "Daniel Longbottom", "Jacob Black"]</code></pre><figcaption>map() 메소드를 사용하여 객체 배열을 순환 처리하기</figcaption></figure><p><code>map()</code> 메소드는 단순히 하나의 요소만을 전달하는 것이 아닙니다. <code>map()</code>을 통해 콜백 함수에 전달되는 모든 인수를 살펴보겠습니다.</p><h2 id="-map--1">완전한 map() 메소드 구문</h2><p>map()을 위한 구문은 다음과 같습니다:</p><pre><code class="language-js">arr.map(function(element, index, array){  }, this);</code></pre><p>콜백함수 <code>function()</code>은 각 배열 요소에 대해 호출되며, <code>map()</code> 메소드는 언제나 현재의 <code>element</code>와 그것의 <code>index</code>, 그리고 전체 <code>array</code> 객체를 해당 요소에 전달합니다.</p><p><code>this</code>인수는 콜백함수 내부에서 사용되게 됩니다. 기본적으로 이 값은 <code>undefined</code>입니다. 예를 들어, <code>this</code>값을 숫자 <code>80</code>으로 변경하는 방법은 다음과 같습니다:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [2, 3, 5, 7]

arr.map(function(element, index, array){
	console.log(this) // 80
}, 80);</code></pre><figcaption>map() 메소드의 this 인수에 숫자 값 할당</figcaption></figure><p><br><code>console.log()</code>를 사용하여 다른 인수들을 테스트해 볼 수도 있습니다:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let arr = [2, 3, 5, 7]

arr.map(function(element, index, array){
    console.log(element);
    console.log(index);
    console.log(array);
    return element;
}, 80);</code></pre><figcaption>값을 확인하기 위한 인수 로깅</figcaption></figure><p>여기까지가 <code>Array.map()</code>방법에 대해 알아야 할 전부입니다. 대부분의 경우 나머지는 무시하고 콜백 함수 내부의 <code>element</code> 인수만 사용합니다. 저는 보통은 그렇게 많이 사용한답니다 :)</p><h2 id="-">이 튜토리얼을 읽어주셔서 감사합니다</h2><p>해결해야 할 가장 일반적인 자바스크립트 문제들 중 일부인 <a href="https://sebhastian.com/javascript-sum-array-objects/">객체 배열을 합치는 방법</a> 및 <a href="https://sebhastian.com/palindrome-javascript/">회문 문자열을 찾는 메소드</a>를 포함한 제가 작성한 다른 JavaScript 튜토리얼에도 관심이 있을 수 있습니다.</p><p>웹 개발 튜토리얼(대부분 JavaScript 관련)에 대한 <a href="https://sebhastian.com/newsletter/">무료 뉴스레터</a>도 있습니다.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
