<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>king_jeong_hyeon.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요 반갑습니다 </description>
        <lastBuildDate>Sun, 11 Aug 2024 14:13:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>king_jeong_hyeon.log</title>
            <url>https://velog.velcdn.com/images/king_jeong_hyeon/profile/5f12637a-07fe-4a84-89ed-0a7c7459b471/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. king_jeong_hyeon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/king_jeong_hyeon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[회고] 캠프를 끝내며..]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%EC%BA%A0%ED%94%84%EB%A5%BC-%EB%81%9D%EB%82%B4%EB%A9%B0</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%EC%BA%A0%ED%94%84%EB%A5%BC-%EB%81%9D%EB%82%B4%EB%A9%B0</guid>
            <pubDate>Sun, 11 Aug 2024 14:13:27 GMT</pubDate>
            <description><![CDATA[<p>벌써 캠프가 끝났다..
처음 시작할 때는 4주라는 짧을거라고는 생각 못했는데.. 1주가 지나고나서는 어떻게 지나갔는지도 모르게 후딱 3주라는 시간이 지나갔던거 같다. 전체적으로 보면 4주가 가장 아쉬운 주차가 아니였나 생각이 든다.. 
마지막 회고가 될지.. 아니면 앞으로 계속 회고를 쓰게될지는 모르겠다..</p>
<p>마지막 주차도 역시 저번과 마찬가지로 KPT 회고법을 통해서 회고를 진행해보려고 한다.</p>
<blockquote>
<h3 id="kpt-회고">KPT 회고</h3>
</blockquote>
<h3 id="keep-계속-이어나가고-싶은-부분">Keep (계속 이어나가고 싶은 부분)</h3>
<blockquote>
<p>캠프가 마무리 되었어도 지금처럼 루틴대로 생활하면서 공부를 계속해서 이어나가고 싶다.</p>
</blockquote>
<blockquote>
<p>캠프를 참가하는 동안 학습하는 방식을 겉 핥기? 느낌이 아닌 연관된 부분들을 찾으면서 공부하는 습관이 어느정도 생긴거 같은데 앞으로도 유지하려고 노력해봐야겠다</p>
</blockquote>
<blockquote>
<p>캠프 기간 동안 읽던 책이 있는데 끝까지 읽어보고 싶기 때문에 하루에 책 읽는 시간을 정해서 끝까지 읽어보고 싶다.</p>
</blockquote>
<h3 id="problem-개선이-필요하다고-생각하는-부분">Problem (개선이 필요하다고 생각하는 부분)</h3>
<blockquote>
<p>컨디션 조절을 잘 하지 못해서 이번주가 가장 후회가 되는 주가 된거같다.. 공부도 중요하지만 그만큼 컨디션 조절도 중요하다는걸 느꼈다.</p>
</blockquote>
<blockquote>
<p>많은 사람들과 의견을 나누는게 아직 익숙하지 않은거 같다. 같은 분야의 사람들이 이렇게 많이 모이는게 쉽지않은 기회라고 생각하는데 낯선 사람들과의 커뮤니케이션 개선이 필요할거같다.</p>
</blockquote>
<blockquote>
<p>여전히 정리에 대한 부분이 많이 부족한거 같다. 공부를 하면서 내가 이해한대로 글을 쓰는 연습이 좀 더 필요할거같다.</p>
</blockquote>
<h3 id="try-problem에-대한-해결책">Try (Problem에 대한 해결책)</h3>
<blockquote>
<p>공부를 하는것도 중요하지만, 그만큼 체력이 있어야 공부를 할 수 있기 때문에 하루 코어 수면시간을 정해서 해당 시간에는 무조건 자는것을 목표로 해봐야겠다.</p>
</blockquote>
<blockquote>
<p>만약에 앞으로 같은 분야의 많은 사람들과 소통을 할 수 있는 기회가 있다면 지금보다 좀 더 적극적으로 소통에 참가하여 많은 것을 나누고 얻어갈 수 있도록 해야겠다.</p>
</blockquote>
<blockquote>
<p>공부를 하면서 중요한 키워드라고 생각하는걸 간단한 설명과 함께 기록해두고, 나중에 시간을 투자해 키워드를 토대로 학습 정리를 하면서 복습을 하는 느낌으로 진행해보면 좋을거 같다.</p>
</blockquote>
<p>처음에도 말했다시피, 생각보다 후딱 지난간 한달이였던거 같다.
정말 힘든 한달 이였지만, 그만큼 나의 성장도 확실하게 이뤄낼 수 있던 한달이였던거같다.
후회가 없다면 거짓말이겠지만.. 최선을 다했다고 생각을 한다..
앞으로 좋은 기회로 캠프를 더 진행할 수 있다면 좋겠지만, 그게 아니라도 지금처럼 꾸준히 나만의 공부를 해봐야겠다.. 한달동안 정말 힘들고 즐거웠다! 끝!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리]  TCP와 UDP]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-z1d8k6c2</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-z1d8k6c2</guid>
            <pubDate>Wed, 07 Aug 2024 02:13:09 GMT</pubDate>
            <description><![CDATA[<p><strong>TCP와 UDP에 대해서 알아보기 전에 해당 프로토콜과 함꼐 사용되는 IP 프로토콜에 대해서 간단하게 알아보자</strong></p>
<ul>
<li>OSI 7계층 중 3계층 ( 네트워크 계층 )에 속하는 프로토콜이다.</li>
<li>데이터를 최종 목적지까지 최적의 경로로 전달하기 위한 계층이다.</li>
<li>데이터를 패킷이라는 작은 단위로 나누어서 전송한다.<blockquote>
<p>❗ 패킷 -&gt; 헤더 + 페이로드 + 트레일러로 이루어져있다.
각각의 요소를 간단하게 설명하자면, 헤더의 경우는 패킷의 다양한 정보들이 기록되어 있고 페이로드의 경우는 실제로 전송될 내용이 기록되어있고, 마지막 트레일러의 경우는 패킷이 도착할 때까지 손상되지 않았는지를 확인하는 정보가 기록 되어있다.</p>
</blockquote>
</li>
</ul>
<h3 id="osi-7계층---전송-계층--4-계층-">OSI 7계층 - 전송 계층 ( 4 계층 )</h3>
<ul>
<li>네트워크에서 데이터를 효율적으로 송 수신 할 수 있도록 도와주며, 데이터 전송의 신뢰성을 높이기 위해서 다양한 기능을 수행하는 계층이라고 볼 수 있다.</li>
</ul>
<h3 id="tcp-란">TCP 란</h3>
<ul>
<li><p>연결 기반으로써 데이터를 전송하는 동안 수신자와 발신자 사이에 연결을 설정하고 이를 유지한다.</p>
</li>
<li><p>데이터의 흐름제어에 도움이 되며 오류를 쉽게 발견할 수 있기 때문에 정확한 데이터를 전송받을 수 있다.</p>
</li>
<li><p>ex ) 채팅, 이메일, 동영상 재생, 검색</p>
</li>
</ul>
<h3 id="udp-란">UDP 란</h3>
<ul>
<li><p>TCP와 다르게 비연결 방식이다. </p>
</li>
<li><p>연결설정, 정확도를 위한 작업이 필요하지 않기 때문에 빠른 속도를 가지지만 TCP에 비해서 데이터의 신뢰성이 떨어진다.</p>
</li>
<li><p>ex ) 스트리밍, 게임</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리] HTTP 상태코드 총정리]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-0mwbci2n</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-0mwbci2n</guid>
            <pubDate>Mon, 05 Aug 2024 01:40:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="http-status-code">HTTP Status Code</h3>
</blockquote>
<p>HTTP 상태 코드(HTTP Status Code)란 웹 서버가 클라이언트의 HTTP 요청을 처리한 결과를 숫자로 나타낸 것이다.
이 코드를 통해서 클라이언트는 요청이 성공 했는지, 실패 했는지 여부를 확인하고, 이에 따라서 후속 작업을 수행할 수 있다.</p>
<blockquote>
<h3 id="http-status-code의-구성">HTTP Status Code의 구성</h3>
</blockquote>
<p>HTTP Code는 3자리 숫자로 이루어져있다.
HTTP Code는 크게 다섯 가지 Category로 나뉘며, 각 Category는 첫 번째 숫자로 구분된다.</p>
<p><strong>1XX</strong> -&gt; 클라이언트의 요청이 수신되어 처리 중
<strong>2XX</strong> -&gt; 클라이언트의 요청이 성공적으로 처리
<strong>3XX</strong> -&gt; 클라이언트는 요청을 위해 추가 작업이 필요
<strong>4XX</strong> -&gt; 클라이언트의 요청에 오류
<strong>5XX</strong> -&gt; 서버가 요청을 처리 도중 오류</p>
<p>두 번째와 세번 째 숫자는 해당 Category내에서 구체적인 원인을 나타냅니다.
아래에서는 각 Category별 세부적인 원인을 나타내는 코드에 대해서 알아보자.</p>
<h3 id="1xx">1XX</h3>
<ul>
<li>해당 Category 코드는 잘 사용되지는 않는 코드이다.
<img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/d0147dc6-fd70-490e-b23f-2a05ac5f0f32/image.png" alt=""></li>
</ul>
<h3 id="2xx">2XX</h3>
<ul>
<li>해당 Category 코드는 요청이 성공적으로 처리되었음을 나타내는 코드이다
<img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/52f73639-8d39-44ed-9389-40c3485df214/image.png" alt=""></li>
</ul>
<h3 id="3xx">3XX</h3>
<ul>
<li>해당 Category 코드는 클라이언트가 요청을 완료하기 위해서 추가 작업을 해야하는 상태를 나타내는 코드이다.
<img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/ff3b3140-b290-464c-a37d-92469e9b9d31/image.png" alt=""></li>
</ul>
<h3 id="4xx">4XX</h3>
<ul>
<li>해당 Category 코드는 클라이언트의 요청에 문제가 있다는것을 나타내는 코드이다.
<img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/40bd4a90-3fd4-4898-8518-8ac55c141235/image.png" alt=""></li>
</ul>
<h3 id="5xx">5XX</h3>
<ul>
<li>해당 Category 코드는 서버가 클라이언트의 요청을 처리하는 도중에 문제가 발생했다는것을 나타내는 코드이다.
<img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/242fcc1b-ca28-4570-ad63-34470aa62e60/image.png" alt=""></li>
</ul>
<p>앞으로 개발을 하면서 실제로 만나는 HTTP Status Code중에 여기 없는 Code를 계속해서 추가해 볼 생각이다 
일단은 자주 볼 수 있는 코드를 위주로 정리해보았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[회고] 나 제대로 하고 있는거 맞지..?]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%EB%82%98-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EA%B1%B0-%EB%A7%9E%EC%A7%80</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%EB%82%98-%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EA%B1%B0-%EB%A7%9E%EC%A7%80</guid>
            <pubDate>Sun, 04 Aug 2024 09:14:50 GMT</pubDate>
            <description><![CDATA[<p>어느덧 캠프에 참가한지도 3주가 지나갔다.. 
처음 1주차는 적응도 필요하고 새로운 루틴을 만들어가느라 시간이 빠르게 갔다는 생각이 크게 들진 않았는데.. 2주차부터 이번주차까지는 진짜 순식간에 지나갔던거 같다.. 특히 이번 주차는 혼자하는 학습만큼이나 팀원과 함께하는 학습도 많은 부분을 차지하고 있어서 더 시간이 빠르게 지나갔다고 느껴지는거 같다...</p>
<p>이번주차도 역시 저번과 마찬가지로 KPT 회고법을 통해서 회고를 진행해보려고 한다.</p>
<h2 id="kpt-회고">KPT 회고</h2>
<h3 id="keep-계속-이어나가고-싶은-부분">Keep (계속 이어나가고 싶은 부분)</h3>
<blockquote>
</blockquote>
<ul>
<li>사전에 필요한 지식에 대한 학습을 제대로 한거같다. 물론 완벽하게 습득을 했다기보단, 새로운것을 알게되고 내가 모르는것을 알게 되는것도 큰 도움이라고 생각한다.</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>같이 학습을 진행하는 페어와 서로서로 도움을 주면서 혼자 했을 때 보다 더욱 튼튼한? 학습을 할 수 있었던거같다.
(물론 서로 노력하고 서로 공부하고자 하는 의지가 있기에 가능했었던거 같다)</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>아무리 힘들어도 시간이 지나면 다 나의 성장을 위한 부분들이라고 생각하고 최선을 다해서 임해보자라는 마음가짐을 잊어버리지 말아야겠다.</li>
</ul>
<h3 id="problem-개선이-필요하다고-생각하는-부분">Problem (개선이 필요하다고 생각하는 부분)</h3>
<blockquote>
</blockquote>
<ul>
<li>학습 진행을 오래하지만, 정리가 부족해서 나중에 한번에 정리하려면 힘들어진다.</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>나도 모르게 구현에 대한 압박감이 있는거 같아서 구현을 시작하기도 전에 막막하다는 생각이 자꾸 드는거 같다.</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>이번주에는 미리 잡아놓은 선약 때문에 코어 시간 이외에 시간을 투자하지 못한 날이 있어서 아쉽다.</li>
</ul>
<h3 id="try-problem에-대한-해결책">Try (Problem에 대한 해결책)</h3>
<blockquote>
</blockquote>
<ul>
<li>시간을 정해서( ex 4시, 7시) 해당 시간에는 1시간 정도 투자해서 학습한 내용을 정리해두는 습관을 길러봐야겠다.</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>학습을 진행하고 구현의 모든 요구사항을 처음부터 생각하지 말고 작은거부터 조금씩 구현을 해나가면 전체적인 그림을 완성해 볼 수 있지않을까...ㅎㅎ</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>마지막 한 주가 남은만큼 내가 투자할 수 있는 모든 시간을 투자해서 치열하게 보내봐야겠다</li>
</ul>
<h3 id="총평">총평</h3>
<blockquote>
<p>잘했다고 생각하는것 만큼이나 아쉬운 부분도 많았던 한주인거 같다. 
3주차인 아직도 뭔가 학습과 구현 사이에서 불안해하는 나를 보면서 혹시 공부방법이 틀린걸까? 내가 너무 느린걸까? 라는 생각이 자꾸 들지만, 답은 하나인거 같다 어쨌든 내 <code>페이스</code>에 맞게 내가 열심히 노력하면 나의 <code>성장</code>은 따라온다는것 그거 하나만 생각하고 마지막 주를 후회없이 보내보고 싶다</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습 정리] Git 뜯어보기]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 31 Jul 2024 02:46:56 GMT</pubDate>
            <description><![CDATA[<h2 id="git">Git</h2>
<ul>
<li>Git의 <code>핵심</code>은 단순한 Key-value 형태의 데이터 저장소</li>
<li>어떤 형식의 데이터도 집어 넣을 수 있고, key 값을 통해서 언제든지 데이터를 다시 가져올 수 있다.</li>
</ul>
<h3 id="저수준-명령어">저수준 명령어</h3>
<p>우리가 사용하는 git 명령어(고수준 명령어) git init git add git commit을 사용할 때 실제 GIT의 내부에서 실행되는 명령어를 저수준 명령어라고 한다
이러한 저수준 명령어는 GIT의 기본적인 데이터 구조와 알고리즘에 직접 접근할 수 있게 해주며, 일반적으로 고수준 명령어에 의해 호출된다.</p>
<h3 id="git의-흐름init--commit">GIT의 흐름(init ~ commit)</h3>
<ol>
<li><p>사용자가 <code>git init</code>을 입력하면 새로운 저장소를 
초기화할 때 <code>objects</code>(개체 데이터 베이스) 디레토리를 생성하고 하위에 <code>pack</code> 디렉토리와 <code>info</code> 디렉토리를 생성된다.</p>
</li>
<li><p>사용자가 <code>git add</code>를 입력하게 되면 저수준 명령어인 <code>git hash-object</code>가 GIT 내부에서 실행되면서 파일의 내용을 해싱하여 <code>Blob</code> 개체를 만들고, <code>.git /objects</code> 디렉토리에 저장한다.</p>
</li>
<li><p>GIT 내부에서 저수준 명령어인 <code>git update-index</code>명령어가 실행되면서 생성된 <code>Blob</code>개체를 인덱스(스테이징 영역)에 추가한다.</p>
</li>
<li><p>사용자가 <code>git commit</code>을 입력하게 되면 저수준 명령어인 <code>git write-tree</code>가 실행되면서 현재 인덱스(스테이징 영역)을 기반으로 <code>Tree</code>개체를 생성한다. <code>Tree</code>개체 역시 <code>.git/objects</code> 디렉토리에 저장한다.</p>
</li>
<li><p><code>git commit-tree</code>명령어가 실행되면서 생성된 <code>Tree</code>개체를 기반으로 <code>Commit</code>개체를 생성한다.
해당 개체도 마찬가지로 <code>.git/objects</code> 디렉토리에 저장한다. </p>
</li>
</ol>
<h2 id="git-개체">Git 개체</h2>
<h3 id="blob">Blob</h3>
<ul>
<li><p><code>Blob</code>은 유닉스의 Inode나 일반 파일에 대응된다.</p>
</li>
<li><p><code>git hash-obejct</code> 명령어를 통해 생성된다.</p>
</li>
<li><p>파일의 내용을 기반으로 <code>SHA-1 해시 알고리즘</code>을 통해 나온 해시 값을 <code>key</code>로 사용한다.
같은 내용의 파일은 항상 같은 해시 값을 가진다.</p>
</li>
<li><p><code>40자</code> 길이의 해시로 <code>처음 2 글자</code>를 따서 <code>디렉토리 이름</code>으로 사용하고 나머지 <code>38글자는 파일 이름</code>에 사용한다.</p>
</li>
<li><p>파일의 내용이 변경될 때마다 새로운 Blob 개체가 생성이 되며, 새로운 해시 값이 반환된다.</p>
</li>
</ul>
<h3 id="tree">Tree</h3>
<ul>
<li><p><code>Tree</code>는 유닉스의 디렉토리에 대응된다.</p>
</li>
<li><p><code>Tree</code>개체를 저장할 때는 <code>git write-tree</code> 명령어를 사용한다.</p>
</li>
<li><p><code>Tree</code>개체는 항목을 여러개 가질 수 있다.
항목: <code>Blob</code> <code>하위 트리 개체를 가리키는 SHA-1 포인터</code> <code>파일 모드</code> <code>개체 타입</code> <code>파일 이름</code></p>
</li>
<li><p>GIT은 일반적으로 <code>INDEX(스테이징 영역)</code>의 상태대로 <code>Tree</code> 개체를 만들고 기록한다. 그렇기 때문에 <code>Tree</code>개체를 만들기 위해서는 <code>INDEX(스테이징 영역)</code>에 파일을 추가해야한다.</p>
</li>
</ul>
<h3 id="commit">Commit</h3>
<ul>
<li><p><code>commit</code> 객체는 프로젝트의 _<strong>특정시점의 트리 상태</strong>_를 저장하는 개체이다.</p>
</li>
<li><p><code>commit-tree</code> 명령어를 통해 <code>commit</code>개체가 생성된다. 해당 명령에는 <code>Tree</code>개체의 <code>SHA-1</code>값 하나를 넘긴다.
이때 <code>-p</code> 옵션을 통해서 부모 커밋을 지정할 수 있으며 이를 통해서 _<strong>GIT 히스토리</strong>_를 만들 수 있다.</p>
</li>
<li><p><code>commit</code>개체의 형식: 최상단 <code>Tree</code> <code>Author / Committer의 정보</code> <code>시간 정보</code> <code>commit message</code></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리] Coroutine ]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 29 Jul 2024 02:49:18 GMT</pubDate>
            <description><![CDATA[<h2 id="코루틴coroutine-이란">코루틴(Coroutine) 이란?</h2>
<p>코루틴은 Co + Routine이 합쳐진 단어로써 서로 협력하여 실행되는 루틴을 말한다.</p>
<blockquote>
<p>실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소</p>
</blockquote>
<p>여기서 말하는 <code>비선점적 멀티태스킹</code>과 <code>서브 루틴</code>은 무엇을 의미하는지 알아보자</p>
<h3 id="비선점적-멀티-태스킹">비선점적 멀티 태스킹</h3>
<ul>
<li><p>비선점형: 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없다</p>
</li>
<li><p>선점형: 하나의 프로세스가 다른 프로세스 대신에 CPU를 차지할 수 있다.</p>
<blockquote>
<p>코루틴은 비선점적 멀티 태스킹이기 때문에 병행성은 제공하나 병렬성은 제공하지 않는다. </p>
</blockquote>
</li>
</ul>
<p>하나의 스레드 A가 CPU를 점유하고 있을 때 코루틴은 스레드 A 내부에서 서로 번갈아가면서 실행된다. 하지만 B 스레드는 A스레드가 CPU를 점유하고 있을 때 CPU를 차지할 수 없다. 
-&gt; 병렬성을 제공하는 이유는 하나의 스레드 내부에서 실행되기 때문이다. 여러 코루틴이 동시에 실행되는 것처럼 보이지만, 실제로는 하나의 스레드 내부에서 진행 되기 때문에 병렬성은 제공되지 않는다.</p>
<h3 id="서브루틴">서브루틴</h3>
<ul>
<li><p>일반적으로 main함수에 의해서 수행되는 흐름을 메인 루틴이라고 한다 반면에 main함수 내부에서 실행되는 개별 함수들에 의해 수행되는 흐름을 서브루틴이라고 한다.</p>
<pre><code class="language-kotlin">fun main() {
  // 메인 루틴
  println(&quot;Main routine started&quot;)

  // 서브 루틴 호출
  val result = add(3, 5)
}
</code></pre>
</li>
</ul>
<p>// 서브 루틴: 두 수를 더하는 함수
fun add(a: Int, b: Int): Int {
    return a + b
}</p>
<pre><code>`서브 루틴`의 경우에는 _**시작하는 지점**_과 _**끝나는 지점**_이 명확하게 `존재`하고 있다. 메인 루틴에서 서브 루틴 함수를 호출하면 시작하고 return을 만나면 함수가 종료된다

_**코루틴도 서브루틴과 비슷하지만 다른점이 있다.**_

`서브 루틴`은 _**단일 진입 지점에서 시작 후 단일 반환 지점에서 종료**_되는 반면에 `코루틴`의 경우는 _**진입 후 반환문이 없더라도 임의의 지점에서 실행 중 동작을 중단하고 이후 해당 지점에서부터 실행을 재개**_한다.
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[회고] 후딱 지나간 일주일]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%ED%9B%84%EB%94%B1-%EC%A7%80%EB%82%98%EA%B0%84-%EC%9D%BC%EC%A3%BC%EC%9D%BC</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%ED%9B%84%EB%94%B1-%EC%A7%80%EB%82%98%EA%B0%84-%EC%9D%BC%EC%A3%BC%EC%9D%BC</guid>
            <pubDate>Sat, 27 Jul 2024 15:08:25 GMT</pubDate>
            <description><![CDATA[<p>이번 일주일은 저번 일주일보다 훨씬 더 빠르게 지나갔던거 같다.
일주일 동안 프로그램에 적응이 된건지.. 아니면 배울게 많아서 시간이 빨리 지나간건지는 모르겠다.
이번에도 저번 회고와 마찬가지로 KPT회고방법을 적용해서 진행해보려고 한다.</p>
<h1 id="kpt-회고">KPT 회고</h1>
<h2 id="keep">Keep</h2>
<blockquote>
</blockquote>
<ul>
<li>이번주에는 동료들과 소통을 열심히 하려고 노력했는데 노력한 만큼 좋은 성과가 있었던거 같다 앞으로도 쭉 노력해야겠다</li>
<li>챌린지 과정이 배움의 과정이라고 생각하고 내가 몰랐던 CS 지식을 배운다는 자세로 임해야겠다</li>
<li>지금처럼 절대적인 시간을 투자하면서 지금 투자하는 시간이 나중에 내가 성장하는 거름이 된다고 생각하면서 앞으로도 시간 투자를 지금처럼 많이 하면 좋을거같다</li>
</ul>
<h2 id="problem">Problem</h2>
<blockquote>
</blockquote>
<ul>
<li>저번주에 구현과 학습의 밸런스를 잡아보기 위해 노력한다고 했지만, 내 생각대로 아직 밸런스를 찾지 못한거같다</li>
<li>동료과 함께 설계를 할 때 아직 내 의견을 제대로 말하지 못하는 부분이 있는거 같다</li>
<li>slack을 통한 질문을 하고 답변을 하는게 아직 어려운거 같다.</li>
</ul>
<h2 id="try">Try</h2>
<blockquote>
</blockquote>
<ul>
<li>구현보다 학습에 중점을 두고 밸런스를 맞춰 나가려고 했는데 잘 안됐기 때문에 이번주에도 두 가지 사이의 밸런스를 생각하면서 미션을 진행해야겠다</li>
<li>동료와 함께 설계를 하거나 구현을 진행할 때 내가 생각하는 부분에 대해서 확실하게 말하는 연습을 해야겠다.</li>
<li>slack에 아직 질문 하는게 어렵지만, 차라리 질문보다 내가 아는거에 대해서는 답변이라도 달 수 있도록 노력해야겠다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리]동기와 비동기]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0</guid>
            <pubDate>Thu, 25 Jul 2024 09:28:11 GMT</pubDate>
            <description><![CDATA[<h2 id="동기와-비동기의-개념">동기와 비동기의 개념</h2>
<h3 id="동기synchronous">동기(Synchronous)</h3>
<ul>
<li><code>동기</code>란? 작업이 <code>순차적</code>으로 일어난다는 뜻입니다.
즉, 동기의 핵심은 한 작업이 시작되면 해당 작업이 완료될 때 까지 다음 작업을 하지 못하고 기다려야 합니다.</li>
</ul>
<blockquote>
<p><code>동기</code>가 동시에 일어난다는 뜻이기 때문에 요청과 해당 요청에 대한 결과가 동시에 일어난다고 생각할 수 있습니다 </p>
</blockquote>
<h3 id="비동기asynchronous">비동기(Asynchronous)</h3>
<ul>
<li><p><code>비동기</code> 란? 작업이 <code>독립적</code>으로 <code>동시</code>에 실행될 수 있다는 뜻입니다.</p>
<p>  즉, 요청에 대한 결과를 받기 전에 다음 작업을 시작할 수 있습니다.</p>
</li>
</ul>
<blockquote>
<p><code>비동기</code> 는 요청과 해당 요청에 대한 결과가 동시에 일어나지 않는다고 생각할 수 있습니다.</p>
</blockquote>
<h3 id="그림으로-보는-동기와-비동기">그림으로 보는 동기와 비동기</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/097fc4ff-d9a7-428b-beed-44886944375c/image.png" alt=""></p>
<ul>
<li>동기의 경우 순차적으로 각각의 Task가  끝난 후 , 다음 Task가 실행되는 반면에, 비동기의 경우는 각각의 Task가 독립적으로 실행되며, 다른 Task가 끝나지 않아도 실행 될 수 있습니다.</li>
</ul>
<h2 id="동기와-비동기의-장단점">동기와 비동기의 장.단점</h2>
<h3 id="동기synchronous-1">동기(Synchronous)</h3>
<p><code>장점</code></p>
<ul>
<li>설계가 간단하고 직관적입니다.</li>
<li>코드의 진행이 순차적이기 때문에 코드의 흐름을 이해하기 쉽습니다.</li>
</ul>
<p><code>단점</code></p>
<ul>
<li>하나의 작업이 완료될 때까지 다른 작업들이 대기해야 하므로 자원 활용이 비효율적입니다.</li>
</ul>
<h3 id="비동기asynchronous-1">비동기(Asynchronous)</h3>
<p><code>장점</code></p>
<ul>
<li>여러 작업이 동시에 독립적으로 진행될 수 있어서 자원을 효율적으로 활용할 수 있습니다.</li>
</ul>
<p><code>단점</code></p>
<ul>
<li>동기식보다 설계가 복잡하다.</li>
</ul>
<h2 id="블로킹과-논블로킹">블로킹과 논블로킹</h2>
<p>동기와 비동기를 공부하면서 계속해서 나왔던 블로킹과 논블록킹에 대해서도 정리해보려고 합니다.</p>
<p>동기 / 비동기가 작업에 대한 완료여부의 관점이였다면, 블로킹 / 논블로킹은 현재의 작업이 block(차단 / 대기)되느냐의 여부의 관점이라고 이해했습니다.</p>
<p><del>사실 아직 동기 / 비동기 그리고 블로킹 / 논블로킹에 대해서 확실하게 차이점을 판단을 하진 못하겠다..</del></p>
<h3 id="블로킹--동기">블로킹 + 동기</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/0d9917ac-3f43-4712-bba5-fc8fb453ae35/image.png" alt=""></p>
<ul>
<li>다른 작업이 처리되는 동안 자신의 작업은 처리하지않고 다른 작업의 완료 여부를 받아 순차적으로 처리하는 방식</li>
</ul>
<h3 id="블로킹--비동기">블로킹 + 비동기</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/e5953999-c4e9-4d32-8c62-1986ca216b58/image.png" alt=""></p>
<ul>
<li>블로킹 + 비동기 형태는 잘 마주치기 않는다고한다..</li>
<li>동기 + 블로킹 형태와 차이가 없어 보인다.. 그래서 해당 방식은 안티패턴으로 치부하기도 한다.</li>
</ul>
<h3 id="논블로킹--동기">논블로킹 + 동기</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/d63a9e9f-6f00-4f9b-97df-04e2605d3ea6/image.png" alt=""></p>
<ul>
<li>다른 작업이 처리되는 동안 자신의 작업도 처리하기 때문에 논블로킹이지만, 다른 작업의 결과가 필요하기 때문에 계속해서 다른 작업의 완료여부를 물어본다.</li>
</ul>
<h3 id="논블로킹--비동기">논블로킹 + 비동기</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/c06a650f-92ab-4cc9-a81f-c5556de1cc56/image.png" alt=""></p>
<ul>
<li>B작업(다른 작업)이 처리되는 동안 A작업(자신의 작업)을 처리하고 B작업이 끝나면 Callback을 실행한다.</li>
</ul>
<blockquote>
<p>💡 아직 뭔가 블로킹과 논블로킹 그리고 동기와 비동기의 차이에 대해서 확실하게 파악하지 못한거 같다..
공부를 해보니 비슷한듯 하지만 어딘가는 다른 개념인거 같은데.. 흠.. 그 어딘가를 아직 잘…</p>
</blockquote>
<h2 id="비동기-작업의-동기화-처리">비동기 작업의 동기화 처리</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습 정리]함수형 프로그래밍]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%95%EB%A6%AC%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%95%EB%A6%AC%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Wed, 24 Jul 2024 04:48:19 GMT</pubDate>
            <description><![CDATA[<h2 id="함수형-프로그래밍">함수형 프로그래밍</h2>
<ul>
<li>프로그래밍 패러다임중 하나로 <code>선언형 프로그래밍</code> 방식이다.</li>
</ul>
<h3 id="선언형-프로그래밍">선언형 프로그래밍</h3>
<ul>
<li><p>명령형 프로그래밍과 상반되는 개념으로써 <code>무엇을 할건지</code>에 대해 설명하는 방식이다</p>
<blockquote>
<p>❗무엇을 할건지? 
ex ) 길을 찾는다고 가정하에 
명령형 -&gt; 나가서 오른쪽으로 꺾고 신호등을 건너서...~~
선언형 -&gt; 학교로 가</p>
</blockquote>
</li>
<li><p>프로그램의 로직을 표현할 때 결과를 중심으로 작성한다. </p>
</li>
</ul>
<h3 id="함수형-프로그래밍-특징">함수형 프로그래밍 특징</h3>
<blockquote>
<p>부수효과(side effect)가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.</p>
</blockquote>
<p>함수형 프로그래밍을 특징을 위와 같이 말할 수 있다. 그럼 함수형 프로그래밍에 특징에 나오는 키워드에 해서 하나씩 알아보자</p>
<h4 id="_u부수효과side-effectu_">_<u>부수효과(side effect)</u>_</h4>
<blockquote>
<p><strong>함수가 외부 상태를 변경하거나 외부 상태에 의존하는것을 말한다.</strong></p>
</blockquote>
<ul>
<li>함수가 외부의 변수를 변경하는 경우</li>
<li>함수가 파일을 읽거나 쓰는 등 외부와 상호작용하는 경우</li>
<li>함수가 예외를 발생시키는 경우</li>
</ul>
<h4 id="_u순수-함수-pure-functionu_">_<u>순수 함수 (Pure Function)</u>_</h4>
<blockquote>
<p><strong>부수효과(side effect)를 제거한 함수를 순수 함수라고 부르며 함수형 프로그래밍에서 사용하는 함수들은 순수 함수이다.</strong></p>
</blockquote>
<ul>
<li>부수효과(side effect)가 없음</li>
<li>같은 입력값에 대해서는 항상 같은 출력값을 반환 (참조 투명성)</li>
<li>외부 상태를 변경하지 않음<h4 id="순수-함수의-장점">순수 함수의 장점</h4>
</li>
<li>순수 함수는 항상 같은 입력값에 대해 같은 출력값을 반환하기 때문에 함수의 동작을 쉽게 예측할 수 있다.</li>
<li>외부 상태를 변경하지 않기 때문에 독립적으로 테스트하기 수월하다</li>
<li>여러 함수를 병렬로 실행할 때 상태 충돌이 발생하지 않는다.
❗상태충돌(여러 작업이 동시에 같은 데이터 or 자원에 접근하여 조작하려고 할 때 발생)</li>
</ul>
<h4 id="_u참조-투명성u_">_<u>참조 투명성</u>_</h4>
<ul>
<li>동일한 입력값에 대해서는 항상 동일한 출력값을 반환해야 한다.</li>
<li>참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다<strong>(Immutable Data)</strong></li>
</ul>
<h4 id="_u1급-객체u_">_<u>1급 객체</u>_</h4>
<ul>
<li>변수나 데이터 구조에 담을 수 있다. </li>
<li>함수의 파라미터로 전달할 수 있다.</li>
<li>함수의 반환값으로 사용할 수 있다.</li>
</ul>
<h3 id="불변데이터">불변데이터</h3>
<blockquote>
<p>한번 생성된 이후에는 변경될 수 없는 성질</p>
</blockquote>
<ul>
<li>새로운 데이터를 만들기 위해서는 기존 데이터를 바탕으로 새로운 인스턴스를 생성</li>
<li>여러 스레드나 함수에서 동시에 접근하더라도 데이터의 일관성이 유지</li>
<li>데이터가 변경되지 않기 때문에 코드의 동작을 예측하기 수월해짐</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리] 단위 테스트]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 23 Jul 2024 03:53:45 GMT</pubDate>
            <description><![CDATA[<h3 id="소프트웨어-테스트">소프트웨어 테스트?</h3>
<ul>
<li>소프트 웨어 테스트란, 소프트웨어가 예상대로 작동하는지 확인하고, 결함이나 오류를 찾아내어 품질을 보장하는 과정이다.<h2 id="단위-테스트unit-test">단위 테스트(Unit Test)</h2>
</li>
<li>SW 테스트의 유형 중 하나로써, 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위 테스를 말한다.
❗여기서의 모듈은 하나의 기능 또는 메소드를 말한다.</li>
<li>예를 들어, 어플리케이션에서 회원가입 메소드에 대한 테스트가 단위(Unit)테스트가 될 수 있다.</li>
</ul>
<h3 id="단위테스트-unit-test의-필요성">단위테스트 (Unit Test)의 필요성</h3>
<ul>
<li>개발 초기 단계에서 오류를 발견하고 수정할 수 있다.</li>
<li>코드의 기능을 변경하지 않고 내부 구조를 개선할 수 있어 리팩토링 과정에서도 중요한 역할을 한다.</li>
<li>요구사항의 변경이나 기능 추가 시 기존 기능에 영향을 주지 않도록 쉽게 검증 할 수 있다.</li>
</ul>
<h3 id="좋은-단위-테스트-작성법-first-작성법">좋은 단위 테스트 작성법 (FIRST 작성법)</h3>
<ul>
<li><p><strong>Fast</strong>
좋은 단위 테스트는 실행이 빨라야한다.</p>
</li>
<li><p><strong>Isolated</strong>
좋은 단위 테스트는 독립적으로 수행되어야 한다.</p>
</li>
<li><blockquote>
<p>하나의 단위(기능)에 대한 테스트를 수행하여야 한다.</p>
</blockquote>
</li>
<li><p><strong>Repeatable</strong>
좋은 단위 테스트는 반복적으로 수행해도 항상 같은 결과가 나와야 한다.</p>
</li>
<li><p><strong>Self-validating</strong>
좋은 단위 테스트는 스스로 검증할 수 있어야 한다.</p>
</li>
<li><blockquote>
<p>ex ) Junit의 assert와 같은 검증 코드를 통해 검증 할 수 있다.</p>
</blockquote>
</li>
<li><p><strong>Timely</strong>
좋은 단위 테스트는 필요할 때 미루지 않고 즉시 작성해야 한다.</p>
</li>
</ul>
<h2 id="junit이란">JUnit이란?</h2>
<ul>
<li>java에서 독립된 단위 테스트를 지원해주는 프레임워크이다</li>
<li>테스트 결과는 TEST Class로 개발자에게 테스트 방법 및 History를 남길 수 있다.</li>
<li>단정(assert)메서드를 통해 테스트 케이스의 결과를 판별한다.</li>
<li>Junit4 이후로는 테스트 어노테이션을 제공한다.</li>
</ul>
<h3 id="테스트-어노테이션">테스트 어노테이션</h3>
<ul>
<li><p>@Test
테스트를 할 메서드를 지정</p>
</li>
<li><p>@DisplayName
테스트 클래스 또는 테스트 메서드의 이름을 지정</p>
</li>
<li><p>@Before
각 테스트 메서드 실행 전에 실행될 메서드를 지정</p>
</li>
<li><p>@After
각 테스트 메서드 실행 후에 실행될 메서드를 지정</p>
</li>
</ul>
<h3 id="assert-메서드">Assert 메서드</h3>
<ul>
<li><p>assertEquals(예상, 실제)
두 값이 동일한지 확인</p>
</li>
<li><p>assertTrue(조건)
해당 조건이 참인지 확인</p>
</li>
<li><p>assertFalse(조건)
해당 조건이 거짓인지 확인</p>
</li>
<li><p>assertSame(예상, 실제)
두 객체가 동일한 객체(참조가 동일)인지 확인</p>
</li>
<li><p>assertNull(객체)
해당 객체가 Null인지 확인</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리] 객체지향 프로그래밍의 이해]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Mon, 22 Jul 2024 04:24:44 GMT</pubDate>
            <description><![CDATA[<h1 id="객체지향-프로그래밍이란">객체지향 프로그래밍이란?</h1>
<ul>
<li>해당 개념을 이해하기 전에 <code>프로그래밍 패러다임</code> 이 무엇인지 부터 알아야 할거같다.</li>
</ul>
<hr>
<h2 id="프로그래밍-패러다임">프로그래밍 패러다임</h2>
<ul>
<li>간단하게 말하면, 프로그램을 작성하는 방식이라고 말할 수 있다.</li>
<li>통상, <code>프로그래밍 패러다임</code> 이라고 하면 3가지를 말한다<ul>
<li>절차지향 프로그래밍(PP)</li>
<li>객체지향 프로그래밍 ( OOP)</li>
<li>함수형 프로그램밍(FP)</li>
</ul>
</li>
</ul>
<h3 id="프로그래밍-패러다임의-분류">프로그래밍 패러다임의 분류</h3>
<p>전체적으로 프로그래밍 패러다임을 분류해서 표를 만들어보면 이와같은 표의 형태로 표현할 수 있다.</p>
<p>오늘은 이중에서 <code>명령형 프로그래밍 - 객체지향</code>에 대해서 알아보려고 한다</p>
<p><del>선언형과 명령형의 차이는 다음에 제대로 공부해보도록 하겠다..</del></p>
<hr>
<h3 id="객체지향-프로그래밍-oop">객체지향 프로그래밍 (OOP)</h3>
<ul>
<li>데이터를 <code>객체</code>라는 독립적인 단위로 나누어서 객체들의 <code>상호작용</code>으로 프로그램을 작성해나가는 방식</li>
<li><strong>객체 = 속성(변수) + 기능(함수)를 함께 포함</strong></li>
</ul>
<h3 id="객체지향의-추상화와-상속">객체지향의 추상화와 상속</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/7a755be0-51b9-4cad-9106-596df90b81b1/image.png" alt=""></p>
<ul>
<li><h4 id="추상화"><em>추상화</em></h4>
<ul>
<li><p>추상화의 핵심개념은 <code>공통</code>적인 <code>속성</code>이나 <code>기능</code>을 모아서 추출한다는 것이다.</p>
</li>
<li><p>위의 그림과 같이, 갤럭시와 아이폰이라는 객체를 하나로 묶을 때 공통적인 특징인 핸드폰으로 묶고</p>
<p>  핸드폰의 시작/종료와 같은 고유한 기능을 핸드폰 내부에 함께 정의해놓을 수 있다.</p>
</li>
</ul>
</li>
<li><h4 id="상속"><em>상속</em></h4>
<ul>
<li>하나의 클래스(<code>하위 클래스</code>)가 다른 클래스(<code>상위 클래스</code>)의 <code>속성</code>과 <code>메서드</code>를 물려받고 이를 통해서 기존 클래스의 기능을 <code>확장</code>하거나 <code>재사용</code>할 수 있다.</li>
<li>위의 그림과 같이 핸드폰(상위 클래스)에서 핸드폰의 공통된 기능을 정의해놓으면 갤럭시, 아이폰(하위 클래스)에서 공통된 기능을 정의할 필요가 없어지기 때문에 <code>코드의 중복</code>이 <code>줄어들고</code> <code>코드의 재사용성</code>은 `늘어날 수 있다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="interface와-abstract-class의-차이점">interface와 abstract class의 차이점</h2>
<ul>
<li><code>interface</code>를 통한 <code>구현</code>과 <code>abstract class</code>를 통한 <code>상속</code>은 <code>상위 - 하위 클래스</code> 관계를 통해 공통적인 속성과 기능을 공유할 수 있지만, <strong>인터페이스를 통한 구현</strong>은 <code>반드시</code> 인터페이스에 정의된 <strong>추상 메서드의 내용이 하위 클래스에서 정의</strong> 되어야 한다. 하지만 <code>상속</code>의 경우에는 <strong>상위 클래스의 속성과 메서드를 하위클래스에서 그대로 받아서 사용하거나 오버라이딩을 통해 선택적으로 재정의</strong>할 수 있다.(단, 추상메서드의 경우에는 반드시 구현해야한다.)</li>
</ul>
<hr>
<h2 id="객체지향-solid-원칙">객체지향 SOLID 원칙</h2>
<h3 id="srp">SRP</h3>
<ul>
<li>클래스는 오직 한가지의 책임만을 가져야한다.</li>
</ul>
<h3 id="ocp">OCP</h3>
<p><strong>- 확장에서는 열려있고</strong></p>
<ul>
<li>새로운 기능을 추가하거나 확장할 수 있어야 한다.</li>
</ul>
<p><strong>- 수정에는 닫혀 있다.</strong></p>
<ul>
<li>기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있어야한다.</li>
</ul>
<h3 id="lsp">LSP</h3>
<ul>
<li>서브 타입(하위 클래스)은 언제나 자신의 기반 타입(상위 클래스)으로 교체할 수 있어야 한다.</li>
</ul>
<h3 id="isp">ISP</h3>
<ul>
<li>인터페이스를 각각 사용에 맞게 끔 분리를 해야한다.
클라이언트의 목적과 용도에 적합한 인터페이스만을 제공</li>
</ul>
<h3 id="dip">DIP</h3>
<ul>
<li>고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[회고] 굉장했던 일주일]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%EB%8B%A4%EC%9D%8C%EC%A3%BC%EB%8A%94-%EB%8D%94-%EC%97%B4%EC%8B%AC%ED%9E%88</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%9A%8C%EA%B3%A0-%EB%8B%A4%EC%9D%8C%EC%A3%BC%EB%8A%94-%EB%8D%94-%EC%97%B4%EC%8B%AC%ED%9E%88</guid>
            <pubDate>Fri, 19 Jul 2024 10:59:07 GMT</pubDate>
            <description><![CDATA[<p>이번 일주일 동안 굉장히 어려움도 많았지만, 그 속에서 얻어가는것도 굉장히 많았고, 느낀점도 굉장히 많았고, 전체적으로 그냥 굉장히 많았던 일주일이였던거 같습니다..</p>
<h2 id="kpt-회고">KPT 회고</h2>
<h2 id="keep">Keep</h2>
<blockquote>
<ul>
<li>물론 챌린지 과정이 어렵긴 하지만 지금처럼 <strong>배운다</strong> 라는 동기를 가지고 임해야겠다.</li>
<li>지금 어려운만큼 내가 아직 공부할게 많다는 긍정적인 생각으로 남은 챌린지 과정을 완료해야겠다.</li>
<li>동료들과 정해진 시간이 있으면 늦지않고 지켜야겠다 (민폐가 되면 안되니깐 ㅎㅎ..)</li>
</ul>
</blockquote>
<h2 id="problem">Problem</h2>
<blockquote>
<ul>
<li>아직 구현과 사전지식 학습에 대한 밸런스를 제대로 잡지 못한거 같다.</li>
<li>초반에 너무 구현만 몰두했던거 같다. 그래서 구현이 잘 되지 않으면 나도 모르게 괜히 불안해지고 초초해졌던거같다.</li>
<li>미션에만 몰두하다 보니 부가적인 정리나 제출에 대해서 미흡했던 부분이 있던거 같다.</li>
</ul>
</blockquote>
<h2 id="try">Try</h2>
<blockquote>
<ul>
<li>다음주를 진행하면서 구현과 사전지식 학습에 대한 밸런스를 항상 고민해보고 나만의 밸런스를 찾아서 지켜봐야겠다.</li>
<li>너무 구현의 성공여부에 너무 큰 의미를 부여하기보단 내가 미션을 해결하기 위해 cs지식을 공부하고 설계해보는 과정에 좀 더 의미를 두어야겠다.</li>
<li>정리나 제출 시간을 좀 더 꼼꼼하게 확인하고 지켜야겠다.</li>
</ul>
</blockquote>
<h2 id="다음주도-화이팅">다음주도 화이팅..</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리] 프로세스 메모리 구조]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Thu, 18 Jul 2024 04:17:32 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그램의-실행-및-메모리-할당">프로그램의 실행 및 메모리 할당</h2>
<p>사용자가 프로그램을 실행하면, 운영체제는 해당 프로그램의 실행 파일을 찾는다.
운영체제는 해당 프로그램을 실행하기 위해 새로운 프로세스를 실행한다.
이때, 프로세스는 실행 중인 프로그램의 인스턴스를 말한다.
운영체제는 새로운 프로세스에 대해 메모리 공간을 할당한다. -&gt; 프로세스 메모리 구조</p>
<h2 id="프로세스-메모리-구조">프로세스 메모리 구조</h2>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/143e71f5-399c-4578-9cf5-438a6c092110/image.png" alt=""></p>
<hr>
<p>프로세스의 메모리 구조는 스택(stack), 힙(heap), BSS, GVAR, TEXT 영역으로 나뉜다.</p>
<h3 id="할당되는-시점">할당되는 시점</h3>
<p><code>프로그램 실행될 때</code></p>
<ul>
<li>프로그램이 실행될 때 TEXT, DATA, BSS 영역이 할당된다.</li>
</ul>
<p><code>프로그램 실행중</code></p>
<ul>
<li>함수 호출시에 STACK영역에 스택 프레임이 추가된다.</li>
<li>동적 메모리 할당 요청시, HEAP 영역에서 메모리가 할당된다.</li>
</ul>
<h2 id="text-영역">TEXT 영역</h2>
<blockquote>
<p><strong>❗ 프로그램 카운터</strong></p>
</blockquote>
<ul>
<li><p>CPU의 중요한 레지스터 중 하나로, 현재 실행중인 명령어의 주소를 저장하고 다음에 실행할 명령어의 주소를 가리키는 역할</p>
</li>
<li><p>CPU가 프로그램의 명령어를 순차적으로 실행하기 위해 필수적인 요소</p>
</li>
<li><p>프로그램의 실행코드(기계어 명령어)가 저장되는 메모리 영역</p>
</li>
<li><p>읽기 전용으로 설정되어 있어 코드의 무결성을 보호한다.</p>
</li>
<li><p>프로그램 카운터가 TEXT영역의 시작주소로 초기화된다.</p>
</li>
<li><p>명령어가 실행된 후, 프로그램 카운터는 다음 명령어 주소로 업데이트</p>
</li>
</ul>
<h2 id="stack">Stack</h2>
<blockquote>
<p><strong>❗ 스택 포인터</strong></p>
</blockquote>
<ul>
<li>현재 스택의 최상단(가장 최근에 추가된 데이터)를 가리키는 레지스터</li>
<li>함수 호출과 반환, 지역 변수 할당 시 동적으로 변한다.</li>
</ul>
<blockquote>
<p><strong>❗ 스택프레임</strong></p>
</blockquote>
<ul>
<li>함수 호출 시마다 스택에 생성되는 데이터 블록</li>
<li>함수의 실행 컨텍스트를 저장하며, 함수가 종료될 때 스택에서 제거된다.</li>
</ul>
<blockquote>
<p><strong>❗ 프레임 포인터</strong></p>
</blockquote>
<ul>
<li><p>각 스택 프레임마다 하나의 프레임 포인터가 존재하며, 해당 함수의 스택 프레임의 기준 주소 역할</p>
</li>
<li><p>스택 프레임의 시작 지점을 가리키며, 함수 실행중에는 변경되지 않고 고정</p>
</li>
<li><p>주로 함수 호출과 관련된 데이터(매개변수, 지역변수, 반환 주소등)를 저장하는데 사용된다.</p>
</li>
<li><p>함수 호출 시 스택 프레임이 자동으로 할당되고, 함수가 종료되면 해당 스택 프레임이 자동으로 해제된다(이전 함수의 FP 값으로 복원).</p>
</li>
<li><p>각 스레드는 자신만의 스택을 가지며, 이를 통해 스레드 간의 간섭 없이 독립적으로 실행</p>
</li>
</ul>
<h2 id="heap">Heap</h2>
<blockquote>
<p><strong>❗ 힙 영역 관리</strong></p>
</blockquote>
<ul>
<li>프리 리스트(Free List)관리를 통해 할당되지 않은 메모리 블록을 추적하고 새로운 메모리 할당 요청이 들어오면 프리 리스트에서 적절한 크기의 블록을 찾아 할당한다.</li>
</ul>
<blockquote>
<p><strong>❗ 가비지 컬렉션</strong></p>
</blockquote>
<ul>
<li><p>힙 메모리를 자동으로 관리하는 가비지 컬렉션 시스템을 사용</p>
</li>
<li><p>참조되고 있는 객체를 추적하고 더 이상 참조되지 않는 객체를 자동으로 해제하여 메모리 누수를 방지</p>
</li>
<li><p>힙은 런타임(프로그램 실행중)동안 동적으로 메모리를 할당 받고 해제할 수 있다.</p>
</li>
<li><p>동적으로 메모리를 할당하면, 힙에서 메모리 블록이 할당되고 해당 메모리 블록의 첫번째 주소가 포인터 변수에 저장되어 스택프레임에 저장된다.</p>
</li>
<li><p>비선형 데이터 구조를 가지고 있어, 메모리 할당과 해제 순서가 자유로워 할당된 메모리 블록이 불연속적으로 위치</p>
</li>
<li><p>힙 메모리는 명시적으로 할당하고 해제해야한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습정리]Tokenizer..?]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%ACTokenizer</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%ACTokenizer</guid>
            <pubDate>Thu, 18 Jul 2024 01:55:37 GMT</pubDate>
            <description><![CDATA[<h2 id="컴파일러-이론의-parser">컴파일러 이론의 Parser</h2>
<ul>
<li><code>파서</code>는 컴파일러의 핵심 구성요소</li>
<li>프로그램의 문법적 구조를 분석하고 이해하는데 필수적</li>
<li>여기서의 <code>파서</code>의 역할은 <code>토크나이저</code> 와 <code>렉서</code>에 의해서 분리되어 분석된 토큰을 입력받아 <code>구문 트리</code>를 생성한다.<blockquote>
<p>구문 트리는 프로그래밍 언어로 작성된 소스 코드의 구문 구조를 트리 형태로 나타낸것이며, AST(추상 구문 트리)라고도 불린다.</p>
</blockquote>
</li>
<li><strong>이러한 일련의 과정을 거쳐 프로그램의 <code>소스 코드</code>가 <code>컴퓨터</code>가 <code>이해</code>할 수 있는 <code>형태</code>로 변환</strong></li>
</ul>
<h2 id="tokneizer">Tokneizer</h2>
<ul>
<li>토크나이저는 입력된 텍스트를 모델에서 처리할 수 있는 데이터로 변환한다는 한가지 목적을 가지고 있다</li>
<li>입력된 텍스트를 <code>토큰</code>이라는 단위로 분리하는 <code>토큰화(Tokenization)</code> 진행
❗ <code>토큰</code>이란 텍스트를 의미 있는 단위로 분리한 <code>최소단위</code><blockquote>
<p>&quot;I hate you&quot; -&gt; 토큰으로 분리 -&gt; &quot;I&quot;, &quot;hate&quot;, &quot;you&quot;라는 식으로 분리가 된다고 볼 수 있다.</p>
</blockquote>
</li>
</ul>
<p><strong>그럼 토크나이저를 통해 분리된 토큰들의 의미는 어떻게 분석할까?</strong></p>
<h2 id="lexer">Lexer</h2>
<ul>
<li>토크나이저를 통해 생성된 토큰들의 의미를 분석하는 역할</li>
<li><code>토큰</code>의 <code>타입</code>과 <code>속성</code>을 분석한다<blockquote>
<p>해당 토큰이 알파벳으로 이루어진 <code>문자</code>인지 아니면 <code>숫자</code>로 이루어졌는지 아니면 <code>연산자</code>인지를 분류한다.</p>
</blockquote>
</li>
<li>이런식으로 분석된 토큰의 <code>정보(토큰 타입, 속성)</code> 출력한다.</li>
</ul>
<h2 id="parser">Parser</h2>
<ul>
<li><code>토크나이저</code>와 <code>렉서</code>를 통해 분석된 토큰들의 구문적 구조를 파악하고 분석하여 <code>구문트리</code>를 생성한다.</li>
<li><code>AST(추상구문트리)</code>란 특정 프로그래밍 언어로 작성된 프로그램 소스를 각각 의미로 분리한 컴퓨터가 이해할 수 있는 구조로 변경시킨 트리라고 말할 수 있다.</li>
</ul>
<blockquote>
<p>이렇게 일련의 과정을 거친 후 결과로 나온 AST를 가지고 Compiler가 다음 최적화 작업을 수행한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습 저장소] Linux 공부일기]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%80%EC%9E%A5%EC%86%8C-Linux%EA%B0%80-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%80%EC%9E%A5%EC%86%8C-Linux%EA%B0%80-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Tue, 16 Jul 2024 03:39:39 GMT</pubDate>
            <description><![CDATA[<p>개발 공부를 하면서 항상 리눅스 리눅스 들어봤지만 정작 제대로 공부해보거나 알아보려고 하진 않았다.
그래서 한번은 공부를 해보면 좋을거같다고 생각이 들어서 이번에 <code>리눅스</code>에 대해 간단하게 알아보려고한다.
<del>정말 간단하게 알아볼 예정이다.</del></p>
<h2 id="리눅스란-무엇인가">리눅스란 무엇인가</h2>
<p>리누즈 토발즈(Linus Torvalds)가 개발한 오픈소스 컴퓨터 운영체제(OS)로써, 프로그램 개발, 웹 서버, 데이터베이스 서버 등의 다양한 용도로 사용된다.
또한 리눅스는 유닉스 계열 운영 체제에 속하며, 유닉스를 기반으로 만들어졌다.</p>
<h2 id="우분투">우분투</h2>
<p>이번에 나는 공부하면서 리눅스의 주요 배포판 중 하나인 우분투 사용했다. 다양한 용도에 따라 여러 배포판을 선택할 수 있지만, 이번에는 사람들이 가장 많이 사용하는 우분투를 통해 가상 머신에 리눅스 운영 체제를 세팅하여 학습해보았다.</p>
<h2 id="리눅스-명령어">리눅스 명령어</h2>
<ul>
<li>리눅스 명령어는 리눅스 시스템을 효율적으로 사용할 수 있게 해주는 도구라고 생각하면 될듯하다.</li>
<li>이번 공부를 통해서 리눅스 명령어를 알아보고 몇가지를 정리해두려고한다.
<del>내가 나중에 볼 수 있게 정말 개인적이고 기본적인것들만.</del></li>
</ul>
<h3 id="파일-및-디렉토리-관련">파일 및 디렉토리 관련</h3>
<p><code>pwd</code></p>
<ul>
<li>현재 위치해 있는 (작업중인) 디렉토리 경로를 출력한다.<pre><code class="language-shell">pwd </code></pre>
<pre><code class="language-shell">home/userName </code></pre>
</li>
</ul>
<p><code>ls</code></p>
<ul>
<li>현재 작업중인 디렉토리의 내용을 나열한다.<pre><code class="language-shell">ls</code></pre>
<pre><code class="language-shell">file1.txt    file2.txt    file3.txt</code></pre>
</li>
</ul>
<p><code>cd</code></p>
<ul>
<li>디렉토리를 변경한다.<pre><code class="language-shell">cd /file/path  // 해당 하는 디렉토리로 이동
cd .. // 상위 디렉토리로 이동</code></pre>
</li>
</ul>
<p><code>cp</code></p>
<ul>
<li>파일 또는 디렉토리를 복사한다.<pre><code class="language-shell">cp file1.text file2.text</code></pre>
<code>mv</code></li>
<li>파일이나 디렉토리를 이동하거나 이름을 변경한다.<pre><code class="language-shell">mv file1.text /file/path   // 파일 이동
mv file1.text newfile1.txt    // 파일 이름 변경</code></pre>
<code>rm</code></li>
<li>파일을 삭제한다.<pre><code class="language-shell">rm file1.txt   // 해당하는 파일을 삭제
rm -r directory/   // 디렉토리와 그 안의 내용 삭제</code></pre>
<code>mkdir</code></li>
<li>새로운 디렉토리를 생성한다.<pre><code class="language-shell">mkdir new_directory</code></pre>
<code>touch</code></li>
<li>지정한 파일이 존재하지 않는다면 새로운 파일을 생성한다.<pre><code class="language-shell">touch new file.txt </code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[학습 저장소] Git에 대하여 ]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%80%EC%9E%A5%EC%86%8C-Git%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@king_jeong_hyeon/%ED%95%99%EC%8A%B5-%EC%A0%80%EC%9E%A5%EC%86%8C-Git%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Mon, 15 Jul 2024 17:12:23 GMT</pubDate>
            <description><![CDATA[<p>이번에 공부를 진행하면서 <code>git</code>에대해서 한번 정리해두면 나중에도 좋을거같아서 정리해보려고한다.</p>
<h2 id="git과-github">git과 Github</h2>
<h3 id="git이란">git이란?</h3>
<p><code>git</code>은 <code>분산 버전 관리 시스템(DVCS)</code>으로, 개발 과정에서 소스 코드의 변경 사항을 추적하고 관리하는데 사용된다.
파일의 <code>변화</code>를 <code>스냅샷</code>이라는 형태로 저장하며 <strong>이전의 스냅샷</strong>의 <code>포인터</code>를 가지고 있어 수정사항이 생긴 여러개의 <strong>소스 코드의 변경 이력을 관리</strong>한다.
그럼 여기서 말하는 <code>분산 버전 관리 시스템</code>은 무엇일까?</p>
<h3 id="버전-관리-시스템">버전 관리 시스템</h3>
<ul>
<li>문서, 설계도, 소스 코드 등의 변경 사항을 시간에 따라 기록하고 관리하는 소프트웨어</li>
<li>주로 소프트웨어 개발 과정에서 소스 코드의 변경 이력을 관리하는데 사용된다.<h4 id="중앙-집중식-버전-관리-시스템">중앙 집중식 버전 관리 시스템</h4>
</li>
<li>버전 관리 자료가 중앙 시스템(서버)에서 관리하는 방식</li>
<li>자신의 PC로 복사 / 작업 후 중앙 서버에 업로드하는 방식<h4 id="분산-버전-관리-시스템">분산 버전 관리 시스템</h4>
</li>
<li>개발자의 로컬 컴퓨터에 저장소가 존재하는 분산 구조 형태<h3 id="github란">Github란?</h3>
git 저장소를 호스팅하고 관리하는 웹 기반 서비스이다.
개발자들이 협업하고 소스 코드를 공유할 수 있는 플랫폼을 제공한다.
버전 관리 기능 외에도 이슈 트래커, 프로젝트 관리, 코드 리뷰등의 부가 기능을 제공한다.</li>
</ul>
<blockquote>
<p>내가 이해한 대로 정리해보자면.. git이란 분산 버전 관리 시스템을 기반으로 서비스를 제공하는 Github를 통해 개발자들이 여러가지 부가기능을 통해 보다 쉽게 협업을 할 수있다.</p>
</blockquote>
<h2 id="git-필수-명령어">git 필수 명령어</h2>
<p>이번에는 git을 사용하려면 필수로 알아야하는 명령어에 대해서 정리해보려고한다.
그전에 해당 명령어들을 조금 더 이해하기 쉽게 git의 3가지 영역에 대해서 간단하게 알아보자.</p>
<h3 id="git의-3가지-영역">git의 3가지 영역</h3>
<p><img src="https://velog.velcdn.com/images/king_jeong_hyeon/post/2e15d2b5-d2da-403f-b441-975cc82c2587/image.png" alt=""></p>
<blockquote>
<h4 id="워킹-디렉토리">워킹 디렉토리</h4>
<p>실제 소스 파일과 생성한 파일들이 존재하는 영역
개발자가 파일을 생성, 수정, 삭제등 실제 작업이 이루어지는 영역</p>
</blockquote>
<h4 id="스테이징-영역">스테이징 영역</h4>
<p>워킹 디렉토리와 로컬 저장소 사이에 위치하는 임시 영역
git add 명령어를 통해 워킹 디렉토리의 변경 사항을 스테이징 영역에 추가할 수 있다.
스테이징 영역에 있는 파일들은 commit에 포함될 준비가 된 상태</p>
<h4 id="로컬-저장소">로컬 저장소</h4>
<p>개발자의 컴퓨터에 존재하는 Git 저장소
git commit 명령어를 통해 스테이징 영역의 변경 사항을 로컬 저장소에 저장할 수 있다.</p>
<h4 id="원격-저장소">원격 저장소</h4>
<p>원격 서버에 존재하는 Git 저장소
로컬 저장소와 원격 저장소간에 git push &amp; pull을 통해 데이터를 주고받을 수 있다.</p>
<h3 id="git-명령어">git 명령어</h3>
<p><strong>add</strong>
변경된 파일을 Git의 스테이징 영역에 추가한다.</p>
<p><strong>commit</strong>
스테이징 영역의 변경 사항을 로컬 저장소에 저장한다.</p>
<p><strong>branch</strong>
새로운 브랜치를 생성한다.</p>
<p><strong>checkout(또는 switch)</strong>
특정 브랜치로 이동한다.</p>
<p><strong>push</strong>
로컬 저장소의 변경 사항을 원격 저장소에 업로드한다.</p>
<p><strong>pull</strong>
원격 저장소의 변경 사항을 로컬 저장소로 가져온다.</p>
<h3 id="pullrequest">PullRequest?</h3>
<p>PR은 오픈 소스 프로젝트나 협업 프로젝트에서 코드 변경 사항을 제안하고, 이를 프로젝트에 병합하도록 요청하는 기능</p>
<blockquote>
<p>PR의 흐름</p>
</blockquote>
<ol>
<li>Fork를 통해 원본 저장소를 자신의 저장소로 복사한다.</li>
<li>복사한 저장소에서 새로운 기능이나 버그 수정을 위해 브랜치를 생성한다.</li>
<li>생성한 브랜치에서 작업을 진행하고 변경사항을 commit한다.</li>
<li>로컬 브랜치의 변경 사항을 원격 저장소의 브랜치로 push한다.</li>
<li>원본 저장소에 PR을 생성하여, 변경 사항을 원본 저장소의 브랜치에 반영하도록 요청한다.</li>
<li>변경사항이 승인되면 PR을 원본 저장소의 브랜치에 병합하나다.</li>
</ol>
<blockquote>
<p>❗clone을 통해 PR을 요청할 수 있다.
Fork는 원본 프로젝트에 기여할 권한이 없거나, 원본 프로젝트와 독립적으로 작업을 수행하고자 할 때 사용한다.
Clone은 원본 프로젝트에 직접 기여할 권한이 있을 때 사용한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[나만의 학습정리]]></title>
            <link>https://velog.io/@king_jeong_hyeon/%EB%82%98%EB%A7%8C%EC%9D%98-%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@king_jeong_hyeon/%EB%82%98%EB%A7%8C%EC%9D%98-%ED%95%99%EC%8A%B5%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 15 Jul 2024 04:19:32 GMT</pubDate>
            <description><![CDATA[<h3 id="git-clone-사용하기">Git clone 사용하기</h3>
<p><code>git clone {클론할 gist의 git 주소} {클론할 폴더명}</code>형식을 통해서 내가 원하는 폴더명으로 gist의 내용을 local에 clone할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[kotlin]Map 파헤치기]]></title>
            <link>https://velog.io/@king_jeong_hyeon/kotlinMap-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0</link>
            <guid>https://velog.io/@king_jeong_hyeon/kotlinMap-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0</guid>
            <pubDate>Tue, 25 Jun 2024 13:53:25 GMT</pubDate>
            <description><![CDATA[<p>사실 제목만큼 <code>Map</code>에 대한 모든걸 기록할 순 없지만.. 알고리즘 공부를 하거나 프로젝트를 할 때 항상 사용했던 <code>Map</code>에 대해서 뭔가 아직 이해가 부족하고 <code>확장함수</code>에 대해서 모르는게 많은거 같아서 정리를 해보려고한다.</p>
<h2 id="map이란">Map이란?</h2>
<ul>
<li><code>key</code>와 <code>value</code>(키-값 쌍)으로 저장하기 위한 <code>Collection</code>이다.</li>
<li>각각의 <code>key</code>는 <code>유일</code>하며, 각 키는 하나의 값에 매핑된다.</li>
<li>List와 동일하게 <code>수정가능한 Map</code>(mutable Map)과 <code>수정이 불가능한 Map</code>(immutable Map)이 있다.</li>
</ul>
<p><strong>그럼 Map은 어떤 상황에 사용하면 될까?</strong>
Map은 key-value의 쌍으로 데이터를 저장하는 구조이기 때문에 <strong>key를 통해서 value에 접근</strong>할 수 있기 때문에 데<strong>이터를 빠르게 조회, 갱신, 삭제해야 하는 상황</strong>에서 유용하게 쓰일 수 있다고 한다. 
또한, <strong>특정 속성</strong>에 따라 <strong>데이터를 그룹화</strong>할 경우 특정 <code>속성</code>을 <code>key</code>로 두고 해당 그룹의 <code>데이터</code>를 <code>value</code>로 지정한다.</p>
<p>그럼 일단 한번 사용하는 코드를 보자</p>
<h3 id="map-사용해보기">Map 사용해보기</h3>
<pre><code class="language-kotlin">val mutableMap = mutableMapOf(1 to &quot;one&quot;, 2 to &quot;two&quot;, 3 to &quot;three&quot;)
    // 값 추가
    mutableMap[4] = &quot;four&quot;
    // 값 수정
    mutableMap[2] = &quot;TWO&quot;
    // 값 삭제
    mutableMap.remove(1)
    println(&quot;MutableMap: $mutableMap&quot;) // MutableMap: {2=TWO, 3=three, 4=four}</code></pre>
<p><code>mutableMapOf()</code>를 통해서 쉽게 수정가능한 <code>Map</code>을 만들 수 있다.</p>
<pre><code class="language-kotlin">val immutableMap = mapOf(1 to &quot;one&quot;, 2 to &quot;two&quot;, 3 to &quot;three&quot;)
    mutableMap[4] = &quot;four&quot; // Error
    mutableMap[2] = &quot;TWO&quot; // Error
    mutableMap.remove(1) // Error
    println(&quot;ImmutableMap: $immutableMap&quot;) // ImmutableMap: {1=one, 2=two, 3=three}</code></pre>
<p><code>mapOf()</code>를 통해서 쉽게 수정불가능한 <code>Map</code>을 만들 수 있다.</p>
<h3 id="map의-확장-메서드-정리">Map의 확장 메서드 정리</h3>
<p>사실 내가 Map에 대해서 정리하는 가장 큰 이유중에 하나이다. Kotlin에서 Map을 내가 의도한대로 다루기 위해서는 <code>확장 메서드</code>를 알아둘 필요가 있다는 생각이 들어서 이번 글을 쓰게되었기 때문이다.
물론 모든 확장 메서드를 정리하는건 어렵겠지만, 내가 지금까지 썼던 메서드나 또는 앞으로 쓰게 될거같은 메서드를 몇개 정리해두려고 한다.</p>
<pre><code class="language-kotlin">val mutableMap = mutableMapOf(1 to &quot;one&quot;, 2 to &quot;two&quot;, 3 to &quot;three&quot;)</code></pre>
<p><strong>getOrDefault</strong>
해당 <code>key</code>가 <code>map</code>에 존재하면 매핑된 <code>value</code>를 반환하고 그렇지 않으면 설정한 <code>기본값</code>을 반환하다.</p>
<pre><code class="language-kotlin">mutableMap.getOrDefault(1, &quot;Default&quot;) // one
mutableMap.getOrDefault(4, &quot;Default&quot;) // Default</code></pre>
<p><strong>getOrElse</strong>
해당 <code>key</code>가 <code>map</code>에 존재하면 매핑된 <code>value</code>를 반환하고 그렇지 않으면 <code>람다로 설정한 기본값</code>을 반환하다.
<strong>getOrDefault와는 다르게 람다로 설정한 기본값을 반환한다.</strong></p>
<pre><code class="language-kotlin">mutableMap.getOrElse(1) { &quot;Default&quot; } // one
mutableMap.getOrElse(4) { &quot;Default&quot; } // Default</code></pre>
<p><strong>putIfAbsent</strong>
입력한 <code>key</code>값이 <code>존재하지 않는 경우</code>에만 <code>map</code>에 <code>추가</code>한다.</p>
<pre><code class="language-kotlin">mutableMap.putIfAbsent(4, &quot;four&quot;)
mutableMap.putIfAbsent(2, &quot;TWO&quot;)
// {1=one, 2=two, 3=three, 4=four}</code></pre>
<p><strong>getOrPut</strong>
입력한 <code>key</code>에 대한 값이 <code>존재</code>하면 <code>해당 값</code>을 반환하고 <code>존재하지 않는다면</code> <code>새로운 값</code>을 <code>추가</code>하고 <code>해당 값</code>을 반환한다.</p>
<pre><code class="language-kotlin">mutableMap.getOrPut(2) {&quot;Default&quot;} // two
mutableMap.getOrPut(4) {&quot;Four&quot;} // Four
// {1=one, 2=two, 3=three, 4=Four}</code></pre>
<p><strong>mapKeys</strong>
기존 <code>map</code>의 <code>key</code>를 <strong>변환</strong>하여 새로운 <code>map</code>을 <strong>생성</strong></p>
<pre><code class="language-kotlin">val newMap = mutableMap.mapKeys { it.key * 10 } 
//newMap = {10=one, 20=two, 30=three}</code></pre>
<p><strong>mapValues</strong>
기존 <code>map</code>의 <code>value</code>를 <strong>변환</strong>하여 새로운 <code>map</code>을 <strong>생성</strong></p>
<pre><code class="language-kotlin">val newMap = mutableMap.mapValues { it.value.toUpperCase() } 
//newMap = {1=ONE, 2=TWO, 3=THREE}</code></pre>
<p><strong>filterKeys</strong>
<strong>특정 조건</strong>을 만족하는 <code>key</code>만 포함하는 새로운 <code>map</code> <strong>생성</strong></p>
<pre><code class="language-kotlin"> val filteredMap = mutableMap.filterKeys { it % 2 != 0 } 
 // filteredMap = {1=one, 3=three}</code></pre>
<p><strong>filterValues</strong>
<strong>특정 조건</strong>을 만족하는 <code>value</code>만 포함하는 새로운 <code>map</code> <strong>생성</strong></p>
<pre><code class="language-kotlin">val filteredMap = mutableMap.filterValues { it.length &gt; 3 } 
//filteredMap = {3=three}</code></pre>
<p><strong>forEach</strong>
<code>map</code>의 각 <code>엔트리</code>에 대해 지정한 <strong>액션을 수행</strong>한다.
<code>엔트리</code>란? map에 저장된 각 <strong>key-value쌍을</strong> 말한다.</p>
<pre><code class="language-kotlin">mutableMap.forEach { (key, value) -&gt;
        println(&quot;Key: $key, Value: $value&quot;)
    }</code></pre>
<p>일단 이정도만 정리 해두고 만약에 내가 map을 사용하다가 새로운 함수를 쓰거나 새롭게 알게되는 함수가 있다면 추후에 다시 정리를 하던지 해야겠다.</p>
<h3 id="hashmap">hashMap</h3>
<p>hashMap에 관해서는 다음에 다시 공부한뒤에 정리해보도록 하겠다. 
map을 공부하면서 찾아보기로는 순서가 없고, 해시 테이블 구조로 데이터를 저장한다. 이정도였는데
나중에 시간이 될 때 좀 더 공부하고 써봐야겠다. 
<del>사실 알고리즘을 공부하면서는 hashMapOf()를 더 자주 썼던거같긴한데..</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Kotlin]operator 연산자가 뭐지?]]></title>
            <link>https://velog.io/@king_jeong_hyeon/Kotlinoperator-%EC%97%B0%EC%82%B0%EC%9E%90%EA%B0%80-%EB%AD%90%EC%A7%80</link>
            <guid>https://velog.io/@king_jeong_hyeon/Kotlinoperator-%EC%97%B0%EC%82%B0%EC%9E%90%EA%B0%80-%EB%AD%90%EC%A7%80</guid>
            <pubDate>Mon, 24 Jun 2024 12:26:18 GMT</pubDate>
            <description><![CDATA[<h1 id="operator-키워드가-뭐야">operator 키워드가 뭐야?</h1>
<p>내가 오늘 본 <code>operator</code> 키워드가 사용된 코드는 이러했다.</p>
<pre><code class="language-kotlin">operator fun String.get(i: Int): Char = this[i]</code></pre>
<p>물론 해당 문제를 푸는데 있어서 크게 중요한 코드는 아니였지만, 이번 기회에 <code>operator</code>에 대해서 정리를 해야겠다고 생각이 들어서 오늘 <code>operator</code>에 대해서 정리를 해보려고한다.</p>
<h2 id="operator란">operator란?</h2>
<p><code>operator</code> 키워드는 <code>연산자 오버로딩</code>을 가능하게 해준다. 라고 간단하게 설명할 수 있다.
그럼 여기서 말하는 연산자 오버로딩이란 무엇일까? <code>오버로딩</code>이란 용어만 알고 있다면 생각보다 간단하게 유추 할 수 있다.</p>
<blockquote>
<p><strong>오버로딩</strong> 
하나의 클래스에서 동일한 이름의 메서드를 매개변수의 타입이나 개수를 다르게 지정하여 재정의하는 것을 의미한다.</p>
</blockquote>
<p>그럼 여기서 말하는 <code>연산자 오버로딩</code>이란 <strong>연산자를 재정의</strong>할 수 있게 해준다. 이런 뜻으로 해석할 수 있다.</p>
<p><strong>정리하자면</strong>, <code>operator</code> 키워드는 연산자 오버로딩을 위해 함수 앞에 사용되는 키워드입니다. 이를 통해 해당 함수가 
<strong>특정 연산자</strong>에 매핑되었다는 것을 의미한다.</p>
<h2 id="operator를-사용해보자">operator를 사용해보자</h2>
<p>나는 설명만 보고서 잘 이해가 되지않는 부분들이 있어서 실제 <code>operator</code> 키워드가 사용된 코드를 참고했다.</p>
<pre><code class="language-kotlin">data class Point(val x: Int, val y: Int)

operator fun Point.plus(other: Point): Point {
    return Point(this.x + other.x, this.y + other.y)
}

fun main() {
    val p1 = Point(1, 2)
    val p2 = Point(3, 4)
    val p3 = p1 + p2
    println(p3) // Point(x=4, y=6)
}</code></pre>
<p>해당 코드는 <code>Point</code>라는 특정 클래스에 대한 <strong>plus 연산자를 재정의</strong> 하는 코드라고 볼 수 있다.
그렇다면 만약 연산자 오버로딩을 사용하지 않는다면?? 어떻게 코드를 짤 수 있을까?</p>
<pre><code class="language-kotlin">data class Point(val x: Int, val y: Int)

fun addPoints(p1: Point, p2: Point): Point {
    return Point(p1.x + p2.x, p1.y + p2.y)
}

fun main() {
    val p1 = Point(1, 2)
    val p2 = Point(3, 4)
    val p3 = addPoints(p1, p2)
    println(p3) // Point(x=4, y=6)
}</code></pre>
<p><code>operator</code> 키워드를 통한 <code>연산자 오버로딩</code>으로 <strong>+, -, *, /</strong> 등의 연산자에 대해서 <strong>직관적이고 간편</strong>하게 사용할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[혼자서 Android Jetpack Compose - 1]]></title>
            <link>https://velog.io/@king_jeong_hyeon/Android-Jetpack-Compose-1</link>
            <guid>https://velog.io/@king_jeong_hyeon/Android-Jetpack-Compose-1</guid>
            <pubDate>Mon, 20 May 2024 11:56:06 GMT</pubDate>
            <description><![CDATA[<p>취업 준비를 하면서 공고를 보면 우대사항이나 자격 요건에 <code>Jetpack Compose</code>를 요구하는 회사가 많아지고 있는거 같다.
지금까지는 나중에 공부하자면서 미뤄왔지만, 이번 <strong>드로이드나이츠 2024</strong>의 세션을 보면서 <code>Jetpack Compose</code>가 굉장히 많은 부분을 차지한다고 느끼면서 이제는 더 이상 미룰수 없다고 생각해서 천천히 공부를 해보려고 한다.</p>
<h2 id="android-jetpack-compose란">Android Jetpack Compose란</h2>
<p>Jetpack Compose는 안드로이드 개발자들이 손쉽고 빠르게 안드로이드 앱을 개발할 수 있도록 지원하는 라이브러리를 모아놓은 Android Jetpack의 라이브러리중 하나로 Android 네이티브 UI를 기존의 명령형 프로그래밍 방식(xml)과는 다르게 코틀린 언어를 사용해 선언형 프로그래밍 방식으로 구현할 수 있도록 해주는 라이브러리이다.</p>
<h3 id="선언형-프로그래밍">선언형 프로그래밍</h3>
<p>명령형 프로그래밍의 방식의 초점인 &quot;어떻게&quot;와 대조적으로 선언형 프로그래밍 방식이란 &quot;무엇&quot;을 해야 하는지에 대해 선언하는 것에 초첨을 맞춘 프로그래밍 패러다임이다.</p>
<blockquote>
<p>즉, 원하는 결과를 명시하고 해당 결과를 달성하기 위한 구체적인 단계는 프로그래밍 언어 or 프레임워크가 자동으로 처리하는것을 말한다. </p>
</blockquote>
<p>예를 들어 간단한 버튼 클릭시 숫자가 올라가는 코드를 기존의 xml과 compose로 작성해보면</p>
<h4 id="xml-방식">xml 방식</h4>
<pre><code>&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:gravity=&quot;center&quot;
    android:orientation=&quot;vertical&quot;&gt;

    &lt;TextView
        android:id=&quot;@+id/text_count&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;You clicked 0 times&quot;
        android:textSize=&quot;24sp&quot; /&gt;

    &lt;Space
        android:layout_width=&quot;0dp&quot;
        android:layout_height=&quot;16dp&quot; /&gt;

    &lt;Button
        android:id=&quot;@+id/btn_click&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:text=&quot;Click me&quot; /&gt;

&lt;/LinearLayout&gt;</code></pre><pre><code class="language-kotlin">class CounterActivity : AppCompatActivity() {
    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_counter)

        val textCount = findViewById&lt;TextView&gt;(R.id.text_count)
        val btnClick = findViewById&lt;Button&gt;(R.id.btn_click)

        btnClick.setOnClickListener {
            count++
            textCount.text = &quot;You clicked $count times&quot;
        }
    }
}</code></pre>
<h4 id="jetpack-compose-방식">Jetpack compose 방식</h4>
<pre><code class="language-kotlin">@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }

    Column(
        modifier = Modifier.fillMaxSize()
    ) {
        Text(&quot;You clicked $count times&quot;)
        Spacer(modifier = Modifier.height(16.dp))
        Button(onClick = { count++ }) {
            Text(&quot;Click me&quot;)
        }
    }
}</code></pre>
<p>확실히 Jetpack Compose를 사용해 작성한 코드가 기존의 xml을 통해 UI를 구현하는 방식보다 간결해진것을 확인할 수 있다.</p>
<h2 id="jetpack-compose를-사용해야-하는-이유">Jetpack Compose를 사용해야 하는 이유</h2>
<p>그럼 우리가 Jetpack Compose를 공부하고 사용해야 하는 이유는 무엇일까?
Android Developer 공식문서를 보면 4가지 이유로 Jetpack Compose를 사용해야한다고 말하고 있다.</p>
<h3 id="간결한-코드">간결한 코드</h3>
<ul>
<li>Compose를 사용하면 Android View 시스템을 사용할 때에 비해 더 적은 코드로 많은 작업을 할 수 있다.</li>
<li>코드를 Kotlin과 XML로 나누지 않고 Kotlin 만으로 작성하기 때문에 같은 파일에서 작성되면 코드를 추적하기 훨씬 쉽다.<h3 id="직관적">직관적</h3>
</li>
<li>Compose는 선언적 API를 사용하기 때문에 Compose가 나머지를 처리하므로 UI를 설명하기만 하면 된다.<h3 id="빠른-개발-과정">빠른 개발 과정</h3>
</li>
<li>Navigation, ViewModel, Coroutine과 같은 일반적인 라이브러리는 Compose와 함께 작동한다.</li>
<li>실시간 미리보기와 같은 기능을 제공한다. <h3 id="강력한-성능">강력한 성능</h3>
</li>
<li>Material Design, Dark Theme, Animation등을 기본적으로 지원한다.</li>
</ul>
<h2 id="jetpack-compose-계획">Jetpack Compose 계획</h2>
<p>일단 작년쯤에 결제 해놓은 강의에 Compose 강의가 포함되어 있어서 강의를 보면서 Compose를 천천히 공부해보려고 한다. 이제 시작이지만 Compose를 사용해 개인 프로젝트에 적용해보는것을 목표로 잡고있다. 
할 수 있겠지...?</p>
]]></description>
        </item>
    </channel>
</rss>