<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sunny_kim.log</title>
        <link>https://velog.io/</link>
        <description>호기심이 많은 백엔드 개발자</description>
        <lastBuildDate>Sat, 04 Jan 2025 16:57:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sunny_kim.log</title>
            <url>https://velog.velcdn.com/images/sunny_kim/profile/c57078a4-0e98-4f05-93e4-76c01d49157e/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sunny_kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sunny_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[자료구조] 자료구조의 개념과 종류]]></title>
            <link>https://velog.io/@sunny_kim/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@sunny_kim/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Sat, 04 Jan 2025 16:57:01 GMT</pubDate>
            <description><![CDATA[<h1 id="1-자료구조data-structure란">1. 자료구조(Data Structure)란?</h1>
<p>자료구조(Data Structure)는 데이터를 효율적으로 저장하고 관리하기 위한 방법과 체계를 의미합니다. 프로그램 개발 및 소프트웨어 설계에서 중요한 역할을 하며, 알고리즘의 성능에 직접적인 영향을 미칩니다.</p>
<br>

<h2 id="자료구조의-필요성">자료구조의 필요성</h2>
<ul>
<li><strong>효율적인 데이터 처리</strong>: 데이터를 저장하고 검색, 삽입, 삭제와 같은 작업을 빠르고 효율적으로 수행할 수 있도록 도와줍니다.</li>
<li><strong>알고리즘 성능 향상</strong>: 자료구조를 올바르게 선택하면 알고리즘의 시간 복잡도와 공간 복잡도를 최적화할 수 있습니다.</li>
<li><strong>문제 해결 능력 향상</strong>: 다양한 문제를 해결하기 위한 기본 도구로, 복잡한 문제를 간단하게 풀 수 있게 해줍니다.<br>

</li>
</ul>
<hr>
<h1 id="2자료구조의-종류">2.자료구조의 종류</h1>
<p>자료구조는 크게 <strong>선형 구조</strong>와 <strong>비선형 구조</strong>로 나눌 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/162a9459-3403-4070-8be5-30a2f2f1e9bf/image.png" alt=""></p>
<h2 id="1-선형-구조-linear-data-structures">1. 선형 구조 (Linear Data Structures)</h2>
<p>선형 구조는 데이터가 연속적이거나 논리적으로 순서대로 배치된 구조를 의미합니다. 데이터가 하나의 선(line)처럼 나열되며, 데이터 간의 관계는 1:1입니다.</p>
<hr>
<h3 id="배열-array">배열 (Array)</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/7fcecae8-87a0-43d7-a06e-5c28552ee06e/image.png" alt=""></p>
<ul>
<li><strong>특징</strong>:<ul>
<li>고정된 크기의 연속적인 메모리 공간에 데이터를 저장합니다.</li>
<li>데이터를 저장할 때 각 요소에 고유한 인덱스를 할당하여 빠르게 접근할 수 있습니다.</li>
<li>배열의 크기는 초기화 시 고정되며, 변경이 어렵습니다.</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>인덱스를 통해 요소에 <code>O(1)</code> 시간 복잡도로 접근할 수 있음.</li>
<li>메모리 상에서 연속적으로 배치되어 있어 캐시 성능이 우수함.</li>
</ul>
</li>
<li><strong>단점</strong>:<ul>
<li>크기가 고정되어 있어 유연성이 부족함.</li>
<li>삽입 및 삭제 시 많은 데이터 이동이 필요하여 비효율적일 수 있음 (최악의 경우 <code>O(n)</code>).</li>
</ul>
</li>
<li><strong>활용 사례</strong>:<ul>
<li>테이블 데이터, 간단한 데이터 집합, 정렬된 데이터 저장 등.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="연결-리스트-linked-list">연결 리스트 (Linked List)</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/d88929c3-7727-4808-8a7b-d6dbfe2804d8/image.png" alt=""></p>
<ul>
<li><strong>특징</strong>:<ul>
<li>데이터를 저장하는 노드(Node)들이 포인터로 연결된 구조입니다.</li>
<li>각 노드는 데이터를 저장하는 부분과 다음 노드를 가리키는 포인터를 포함합니다.</li>
<li>배열과 달리 크기가 동적으로 변경될 수 있습니다.</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>동적 메모리 할당이 가능하여 유연성이 큼.</li>
<li>삽입 및 삭제가 효율적임 (<code>O(1)</code>로 특정 위치에 삽입/삭제 가능).</li>
</ul>
</li>
<li><strong>단점</strong>:<ul>
<li>특정 요소를 검색할 때 <code>O(n)</code>의 시간 복잡도가 발생함.</li>
<li>각 노드가 포인터를 추가로 저장하므로 메모리 사용량이 배열보다 큼.</li>
</ul>
</li>
<li><strong>유형</strong>:<ul>
<li>단일 연결 리스트 (Singly Linked List)</li>
<li>이중 연결 리스트 (Doubly Linked List)</li>
<li>환형 연결 리스트 (Circular Linked List)</li>
</ul>
</li>
<li><strong>활용 사례</strong>:<ul>
<li>메모리 효율적인 동적 데이터 구조, 작업 스케줄링, 구현이 유연한 데이터 구조.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="스택-stack">스택 (Stack)</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/a5fb7499-3046-405d-98c5-d68a20f250a5/image.png" alt=""></p>
<ul>
<li><strong>특징</strong>:<ul>
<li>후입선출(LIFO, Last In First Out) 방식으로 작동하는 자료구조.</li>
<li>삽입(push)과 삭제(pop)는 항상 스택의 한쪽 끝에서 이루어짐.</li>
<li>최상단 요소를 확인하는 연산(peek)이 가능함.</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>구현이 간단하고 효율적임.</li>
<li>함수 호출 스택, 뒤로 가기 기능과 같은 재귀적 데이터 처리에 유용함.</li>
</ul>
</li>
<li><strong>단점</strong>:<ul>
<li>크기가 고정된 배열 기반 스택은 크기 제한이 있음.</li>
<li>특정 요소를 검색하는 작업은 비효율적임.</li>
</ul>
</li>
<li><strong>활용 사례</strong>:<ul>
<li>함수 호출 관리, 계산기 프로그램, undo/redo 기능, 깊이 우선 탐색(DFS).</li>
</ul>
</li>
</ul>
<hr>
<h3 id="큐-queue">큐 (Queue)</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/f2c23c4c-2b02-490b-a742-e75fa96053d9/image.png" alt=""></p>
<ul>
<li><strong>특징</strong>:<ul>
<li>선입선출(FIFO, First In First Out) 방식으로 작동하는 자료구조.</li>
<li>삽입(enqueue)은 뒤에서, 삭제(dequeue)는 앞에서 이루어짐.</li>
<li>순서가 중요한 작업 처리에 적합함.</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>데이터 처리의 순서를 유지할 수 있음.</li>
<li>작업 대기열이나 메시지 전달 시스템에서 사용하기 적합함.</li>
</ul>
</li>
<li><strong>단점</strong>:<ul>
<li>배열 기반 큐에서는 크기 제한이 존재하며, 크기를 초과하면 재할당 필요.</li>
<li>특정 요소 검색이 비효율적임.</li>
</ul>
</li>
<li><strong>유형</strong>:<ul>
<li>원형 큐(Circular Queue)</li>
<li>우선순위 큐(Priority Queue)</li>
<li>이중 끝 큐(Deque)</li>
</ul>
</li>
<li><strong>활용 사례</strong>:<ul>
<li>CPU 작업 스케줄링, 네트워크 데이터 패킷 처리, 프린터 작업 대기열.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-비선형-구조-non-linear-data-structures">2. 비선형 구조 (Non-Linear Data Structures)</h2>
<p>비선형 구조는 데이터가 계층적이거나 네트워크처럼 복잡한 관계를 가지는 구조를 의미합니다. 데이터 간의 관계는 1:다 또는 다:다입니다.</p>
<h3 id="트리-tree">트리 (Tree)</h3>
<p>  <img src="https://velog.velcdn.com/images/sunny_kim/post/bdf1ecfb-d5bb-4547-b415-f8e45ca99ef8/image.png" alt=""></p>
<ul>
<li><strong>특징</strong>:<ul>
<li>계층적인 구조로, 루트 노드(root)를 기준으로 여러 하위 노드(child)가 연결됨.</li>
<li>각 노드는 자식 노드를 가질 수 있으며, 자식 노드 간에는 순서가 없습니다.</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>빠른 검색, 삽입, 삭제가 가능 (<code>O(log n)</code> 복잡도).</li>
<li>계층적 데이터 표현이 용이.</li>
</ul>
</li>
<li><strong>단점</strong>:<ul>
<li>복잡한 구현과 메모리 오버헤드 발생 가능.</li>
<li>균형이 맞지 않을 경우 성능 저하 가능.</li>
</ul>
</li>
<li><strong>유형</strong>:<ul>
<li>이진 트리 (Binary Tree): 각 노드가 최대 두 개의 자식을 가짐.</li>
<li>이진 탐색 트리 (BST): 왼쪽 자식은 부모보다 작고, 오른쪽 자식은 부모보다 큼.</li>
<li>AVL 트리, 레드-블랙 트리: 균형을 유지하는 트리 구조.</li>
</ul>
</li>
<li><strong>활용 사례</strong>:<ul>
<li>파일 시스템, 데이터베이스 인덱싱, 네트워크 라우팅.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="그래프-graph">그래프 (Graph)</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/8f86bfdb-cdee-4257-9901-b9b8b5f66bb5/image.png" alt=""></p>
<ul>
<li><strong>특징</strong>:<ul>
<li>정점(Vertex)과 간선(Edge)으로 구성된 네트워크 형태의 자료구조.</li>
<li>간선에 방향성이 있으면 방향 그래프, 없으면 무방향 그래프.</li>
<li>간선에 가중치가 있을 경우 가중치 그래프.</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>복잡한 데이터 관계를 표현 가능.</li>
<li>최단 경로, 네트워크 연결 문제 등에 적합.</li>
</ul>
</li>
<li><strong>단점</strong>:<ul>
<li>구현이 복잡하며, 많은 메모리를 사용할 수 있음.</li>
<li>탐색 및 경로 계산이 시간이 오래 걸릴 수 있음.</li>
</ul>
</li>
<li><strong>유형</strong>:<ul>
<li>인접 리스트 (Adjacency List)</li>
<li>인접 행렬 (Adjacency Matrix)</li>
<li>최소 신장 트리, 다익스트라 알고리즘 등.</li>
</ul>
</li>
<li><strong>활용 사례</strong>:<ul>
<li>소셜 네트워크 분석, 최단 경로 탐색 (네비게이션 시스템), 전자 회로 설계.</li>
</ul>
</li>
</ul>
<br>

<hr>
<h2 id="자료구조의-선택-기준">자료구조의 선택 기준</h2>
<p>효율적인 자료구조를 선택하려면 다음과 같은 요소를 고려해야 합니다:</p>
<ol>
<li><strong>데이터 크기와 구조</strong>: 데이터의 크기와 형식에 따라 적합한 자료구조가 달라집니다.</li>
<li><strong>작업 빈도</strong>: 검색, 삽입, 삭제 작업이 얼마나 자주 이루어지는지에 따라 최적의 자료구조가 결정됩니다.</li>
<li><strong>메모리 사용</strong>: 제한된 메모리 환경에서 공간 효율적인 자료구조를 선택해야 합니다.</li>
<li><strong>복잡도</strong>: 시간 복잡도와 공간 복잡도를 비교하여 요구사항에 맞는 자료구조를 선택합니다.</li>
</ol>
<br>

<hr>
<h1 id="결론">결론</h1>
<p>자료구조는 프로그래밍에서 데이터를 효과적으로 다루기 위한 핵심 개념입니다. 적절한 자료구조를 선택하고 활용하면 소프트웨어의 성능과 안정성을 크게 향상시킬 수 있습니다. 따라서 다양한 자료구조의 특성과 사용 사례를 이해하고, 문제에 맞는 자료구조를 적용하는 능력을 기르는 것이 중요합니다.
<br></p>
<hr>
<h4 id="참고">참고</h4>
<p><a href="https://bnzn2426.tistory.com/115">https://bnzn2426.tistory.com/115</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 접근제어자]]></title>
            <link>https://velog.io/@sunny_kim/Java-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90</link>
            <guid>https://velog.io/@sunny_kim/Java-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90</guid>
            <pubDate>Fri, 19 Jan 2024 03:23:13 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="1-접근제어자란">1. 접근제어자란?</h2>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/b28857a6-cbb5-4448-ad4e-978bdfcca023/image.jpg" alt=""></p>
<p>접근 제한자(Access Modifier)는 말 그대로 접근을 제한하기 위해 사용됩니다. 여기서 접근이란 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 말합니다. </p>
<p>어떤 경우에는 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 필요가 있습니다. 그리고 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 막아야 되는 경우도 있습니다. 이때 접근 제한자를 사용할 수 있습니다. </p>
<hr>
<h2 id="2-접근제어자를-사용하는-이유">2. 접근제어자를 사용하는 이유?</h2>
<ul>
<li>접근제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서다.</li>
<li>데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다.<ul>
<li>객체지향개념에서 이것을 <strong>캡슐화(encapsulation)</strong>라고 한다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-접근제어자-종류">3. 접근제어자 종류</h2>
<p>자바는 4가지 종류의 접근 제어자를 제공한다.
<img src="https://velog.velcdn.com/images/sunny_kim/post/a63cbab2-6804-42f2-b634-d5a7016fa205/image.png" alt=""></p>
<p><strong>접근 제어자의 종류</strong></p>
<ul>
<li><p><code>private</code> : 모든 외부 호출을 막는다.</p>
</li>
<li><p><code>default</code> (package-private): 같은 패키지안에서 호출은 허용한다.</p>
</li>
<li><p><code>protected</code> : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.</p>
</li>
<li><p><code>public</code> : 모든 외부 호출을 허용한다.</p>
</li>
</ul>
<p>순서대로 <code>private</code> 이 가장 많이 차단하고, <code>public</code> 이 가장 많이 허용한다.
<code>private -&gt; default -&gt; protected -&gt; public</code></p>
<h3 id="1-public">1. public</h3>
<p>접근제어자가 public으로 설정되었으면 모든 클래스 접근이 가능하다. 즉, 접근 제약이 없다.</p>
<blockquote>
<p>모든 외부 호출을 허용한다.</p>
</blockquote>
<h3 id="2-protected">2. protected</h3>
<p>접근제어자가 protected로 설정되었으면 같은 패키지내의 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능하다.</p>
<blockquote>
<p>같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.</p>
</blockquote>
<h3 id="3-defaultpackage-private">3. default(package-private)</h3>
<p>접근제어자를 별도로 설정하지 않는다면 default접근제어자가 되고 해당 패키지에서만 접근이 가능하다.</p>
<blockquote>
<p>같은 패키지안에서 호출은 허용한다.</p>
</blockquote>
<h3 id="4-private">4. private</h3>
<p>접근제어자가 private로 설정되었으면 같은 클래스에서만 접근이 가능하다.</p>
<blockquote>
<p>모든 외부 호출을 막는다.</p>
</blockquote>
<br>

<p>순서대로 <code>public</code> 이 가장 많이 허용하고, <code>private</code> 이 가장 많이 차단한다.
<code>public -&gt; protected -&gt; default -&gt; private</code></p>
<hr>
<h4 id="참고">참고</h4>
<p>이미지 참고 - 나무위키
[인프런] 김영한의 실전 자바 - 기본편
<a href="https://hongong.hanbit.co.kr/%EC%9E%90%EB%B0%94-%EC%A0%91%EA%B7%BC-%EC%A0%9C%ED%95%9C%EC%9E%90%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EC%B0%A8%EC%9D%B4public-protected-private/">자바 접근 제한자의 종류와 차이(public, protected, private)</a>
<a href="https://velog.io/@2dh2wdk/Java%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90Access-Modifier#public">[Java]접근제어자(Access Modifier)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이]]></title>
            <link>https://velog.io/@sunny_kim/Java-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9Overloading%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9Overriding%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@sunny_kim/Java-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9Overloading%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9Overriding%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Fri, 05 Jan 2024 20:38:29 GMT</pubDate>
            <description><![CDATA[<p>오버로딩(Overloading)과 오버라이딩(Overriding)은 객체지향의 특징 중 하나인 다형성을 지원하는 방법입니다. 이 둘은 각각 다른 용도와 동작을 가지고 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/cf444036-7f27-4518-867a-16e4af408981/image.png" alt=""></p>
<p><strong>&#39;오버로딩(Overloading) / 확장&#39;</strong>
같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 사용하는 것</p>
<p><strong>&#39;오버라이딩(Overriding) / 재정의&#39;</strong>
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것</p>
<br>

<p>아래에서 각각의 개념에 대해 예시와 함께 설명하겠습니다.</p>
<hr>

<h2 id="overloading-메서드-다중-정의">Overloading (메서드 다중 정의)</h2>
<p>메서드 Overloading은 같은 클래스 내에서 동일한 이름의 메서드를 여러 개 정의하는 것을 말합니다. 이때 메서드의 (매개변수의 <strong>타입, 개수</strong>)가 서로 달라야 합니다.
<img src="https://velog.velcdn.com/images/sunny_kim/post/018bc3cb-bac8-4c7c-ba5a-ce0dada0cc22/image.png" alt=""></p>
<p>위의 예시에서 add() 메서드가 ** 두 번 정의** 되어 있습니다. 
첫 번째 메서드는 정수를 더하고, 두 번째 메서드는 실수를 더하고 있습니다. 
메서드 Overloading은 매개변수의 <strong>타입</strong> 또는 <strong>개수</strong>가 <strong>다르면</strong> 동일한 이름의 메서드를 여러 개 정의할 수 있도록 합니다.</p>
<h3 id="오버로딩의-장점">오버로딩의 장점</h3>
<ul>
<li><p>** 코드의 가독성 향상:** 비슷한 동작을 하는 메서드들이 같은 이름으로 그룹화되므로 코드의 가독성이 향상되고, 메서드의 이름이 명확하게 표현됩니다.</p>
</li>
<li><p><strong>코드 감소:</strong> 유사한 작업을 하는 메서드들을 하나의 이름으로 통합함으로써 중복 코드를 감소시킵니다.</p>
</li>
</ul>
<p><br><hr></p>
<h2 id="overriding-메서드-재정의">Overriding (메서드 재정의)</h2>
<p>메서드 Overriding은 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 
<strong>동일한 매개변수와 리턴타입</strong>으로 다시 정의하는 것을 말합니다. 
이때 부모 클래스와 자식 클래스 간에 <strong>상속 관계</strong>가 있어야 합니다.
<img src="https://velog.velcdn.com/images/sunny_kim/post/76cbd99a-8022-4d74-90f4-b6e919f3ad43/image.png" alt=""></p>
<p>위의 예시에서 Dog 클래스는 Animal 클래스를 상속받고 있습니다. 
그리고 makeSound() 메서드를 재정의하여 자식 클래스에서 새로운 동작을 정의하고 있습니다. 
메서드 Overriding은 상속을 통해 부모 클래스의 메서드를 자식 클래스에서 변경하거나 확장하는 데 사용됩니다.</p>
<h3 id="오버라이딩의-장점">오버라이딩의 장점</h3>
<ul>
<li><p><strong>상속을 통한 코드 재사용:</strong> 부모 클래스에서 정의된 메서드를 자식 클래스에서 재사용할 수 있으며, 필요에 따라 해당 메서드를 재정의하여 새로운 동작을 추가하거나 수정할 수 있습니다.</p>
</li>
<li><p><strong>인터페이스 일관성:</strong> 부모 클래스에서 정의된 메서드 시그니처를 유지하면서 자식 클래스에서 새로운 구현을 제공함으로써 인터페이스의 일관성을 유지할 수 있습니다.</p>
</li>
</ul>
<p><br><hr></p>
<h2 id="오버로딩overloading--오버라이딩overriding-메소드-결정-시점-java">오버로딩(Overloading) &amp; 오버라이딩(Overriding) 메소드 결정 시점 (JAVA)</h2>
<ul>
<li><p>오버로딩된 메소드는 컴파일(Compile) 시에 어떤 메소드를 실행할지 결정됩니다.</p>
</li>
<li><p>오버라이딩된 메소드는 런타임(Runtime) 시에 어떤 메소드를 실행할지 결정됩니다.</p>
</li>
</ul>
<p><br><hr></p>
<blockquote>
<p><strong>오버로딩과 오버라이딩의 차이 요약</strong></p>
</blockquote>
<ul>
<li><strong>Overloading</strong> = 이름은 같지만 그냥 전혀 다른 함수<ul>
<li>Loading = 불러오다. (전혀 다른 함수를 불러오다)</li>
</ul>
</li>
<li>*<em>Overriding *</em>= 부모에게 물려받아 변형한 함수<ul>
<li>Riding = 올라타다. (같은 함수를 올라타서 덮어 씌우고 새롭게 정의한다)</li>
</ul>
</li>
</ul>
<p><br><br><hr></p>
<h4 id="참고">참고</h4>
<p><a href="https://sungman.tistory.com/9">오버로딩(Overloading) &amp; 오버라이딩(Overriding) 메소드 결정 시점 (JAVA)</a>
<a href="https://nobacking.tistory.com/56">https://nobacking.tistory.com/56</a>
<a href="https://www.reddit.com/r/ProgrammerHumor/comments/6e1zaa/overloading_vs_overriding/?rdt=35090">이미지 참고</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] Null 과 NullPointerException]]></title>
            <link>https://velog.io/@sunny_kim/Java-Null-%EA%B3%BC-NullPointerException</link>
            <guid>https://velog.io/@sunny_kim/Java-Null-%EA%B3%BC-NullPointerException</guid>
            <pubDate>Fri, 05 Jan 2024 19:17:36 GMT</pubDate>
            <description><![CDATA[<h2 id="null">null</h2>
<p><code>null</code> 은 값이 존재하지 않는, 없다는 뜻이다.
<img src="https://velog.velcdn.com/images/sunny_kim/post/c5e00b12-b673-4d2e-aebb-63599660b266/image.png" alt=""></p>
<p><strong>참조형 변수에는 항상 객체가 있는 위치를 가리키는 참조값이 들어간다.</strong> 그런데 아직 가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶다면 어떻게 해야할까?
참조형 변수에서 아직 가리키는 대상이 없다면 <strong><code>null</code></strong> 이라는 특별한 값을 넣어둘 수 있다. </p>
<br>

<h3 id="null-값-할당">null 값 할당</h3>
<pre><code>package ref;

public class Data {
    int value;
}</code></pre><pre><code>package ref;

public class NullMain1 {
    public static void main(String[] args) {
        Data data = null;
        System.out.println(&quot;1. data = &quot; + data);
        data = new Data();
        System.out.println(&quot;2. data = &quot; + data);
        data = null;
        System.out.println(&quot;3. data = &quot; + data);
    }
}</code></pre><h4 id="실행결과">실행결과</h4>
<pre><code>1. data = null
2. data = ref.Data@x001
3. data = null</code></pre><p><img src="https://velog.velcdn.com/images/sunny_kim/post/6df7aaa1-dfb1-455b-85c4-e38d9b2f6e3e/image.png" alt=""></p>
<p><code>Data</code> 타입을 받을 수 있는 참조형 변수 <code>data</code> 를 만들었다. 그리고 여기에 <code>null</code> 값을 할당했다. 
따라서 <code>data</code> 변수에는 아직 가리키는 객체가 없다는 뜻이다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/dbc43ad6-8a12-4686-a22c-dcd274dc7a84/image.png" alt=""></p>
<p>이후에 새로운 <code>Data</code> 객체를 생성해서 그 참조값을 <code>data</code> 변수에 할당했다. 
이제 <code>data</code> 변수가 참조할 객체가 존재한다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/fbf53184-7769-46fa-8825-1fb10d3f16d2/image.png" alt=""></p>
<p>마지막에는 <code>data</code> 에 다시 <code>null</code> 값을 할당했다. 이렇게 하면 <code>data</code> 변수는 앞서 만든 <code>Data</code> 인스턴스를 더는 참조하지 않는다.</p>
<br>


<blockquote>
<p><strong>GC - 그럼 아무도 참조하지 않는 인스턴스는 어디로 갈까?</strong>
C와 같은 과거 프로그래밍 언어는 개발자가 직접 명령어를 사용해서 인스턴스를 메모리에서 제거해야 했다. 만약 실수로 인스턴스 삭제를 누락하면 메모리에 사용하지 않는 객체가 가득해져서 메모리 부족 오류가 발생하게 된다.
자바는 이런 과정을 자동으로 처리해준다. 아무도 참조하지 않는 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 <strong>더 이상 사용하지 않는 인스턴스라 판단하고 해당 인스턴스를 자동으로 메모리에서 제거해준다.</strong>
객체는 해당 객체를 참조하는 곳이 있으면, JVM이 종료할 때 까지 계속 생존한다. 그런데 중간에 해당 객체를 참조하는
곳이 모두 사라지면 그때 JVM은 필요 없는 객체로 판단다고 GC(가비지 컬렉션)를 사용해서 제거한다.</p>
</blockquote>
<p><br><hr></p>
<h2 id="nullpointerexception">NullPointerException</h2>
<p>만약 참조값 없이 객체를 찾아가면 어떤 문제가 발생할까?
(ex. 택배를 보낼 때 주소지 없이 택배를 발송한 상황)</p>
<p>이 경우 <code>NullPointerException</code> 이라는 예외가 발생한다.
이름 그대로 <code>null</code> 을 가리키다(Pointer)인데, 이때 발생하는 예외(Exception)다.
<code>null</code> 은 없다는 뜻이므로 결국 주소가 없는 곳을 찾아갈 때 발생하는 예외이다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/6f045bcb-48c8-4133-b5df-af9c71f75ea4/image.png" alt=""></p>
<p>객체를 참조할 때는 <code>.</code> (dot)을 사용한다. 이렇게 하면 참조값을 사용해서 해당 객체를 찾아갈 수 있다. 그런데 참조값이 <code>null</code> 이라면 값이 없다는 뜻이므로, 찾아갈 수 있는 객체(인스턴스)가 없다. <code>NullPointerException</code> 은 이처럼 <strong><code>null</code> 에 <code>.</code> (dot)을 찍었을 때 발생한다.</strong></p>
<p>예제를 통해서 확인해보자.</p>
<pre><code>package ref;

public class Data {
    int value;
}</code></pre><pre><code>package ref;
public class NullMain2 {
    public static void main(String[] args) {
        Data data = null;
        data.value = 10;  // NullPointerException 예외 발생
        System.out.println(&quot;data = &quot; + data.value);
    }
}</code></pre><h4 id="실행결과-1">실행결과</h4>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/258549d6-29d7-4093-97ac-f34fcb844dfc/image.png" alt=""></p>
<p>위 코드를 쉽게 해석 하자면 </p>
<pre><code>data.value = 10
null.value = 10    // data에는 null 값이 들어있다.</code></pre><p>널 값에 &#39;.&#39;를 찍었다고 할 수 있다.
따라서 참조할 객체 인스턴스가 존재하지 않으므로 다음과 같이 <code>java.lang.NullPointerException</code> 이 발생하고, 프로그램이 종료된다.</p>
<blockquote>
<p><strong>꿀팁!!</strong>
<code>NullPointerException</code> 이 발생하면 <code>null</code> 값에 <code>.</code> (dot)을 찍었다고 생각하면 문제를 쉽게 찾을 수 있다.</p>
</blockquote>
<hr>

<h4 id="참고">참고</h4>
<p>[인프런] 김영한의 실전 자바 - 기본편</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 기본형 VS 참조형]]></title>
            <link>https://velog.io/@sunny_kim/Java-%EA%B8%B0%EB%B3%B8%ED%98%95-VS-%EC%B0%B8%EC%A1%B0%ED%98%95</link>
            <guid>https://velog.io/@sunny_kim/Java-%EA%B8%B0%EB%B3%B8%ED%98%95-VS-%EC%B0%B8%EC%A1%B0%ED%98%95</guid>
            <pubDate>Fri, 05 Jan 2024 18:47:56 GMT</pubDate>
            <description><![CDATA[<p>자바에서 참조형을 제대로 이해하는 것은 정말 중요하다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/424124cb-26aa-4899-be23-b30178396e3b/image.png" alt=""></p>
<p>변수의 데이터 타입(자료형)을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다.</p>
<p><br><hr></p>
<h2 id="기본형primitive-type">기본형(Primitive Type)</h2>
<p><code>int</code> , <code>long</code> , <code>double</code> , <code>boolean</code> 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라 한다.
<img src="https://velog.velcdn.com/images/sunny_kim/post/481efee5-6a70-4005-99ca-f05f97d4a8ef/image.png" alt=""></p>
<h3 id="기본형의-특징">기본형의 특징</h3>
<ul>
<li>모두 소문자로 시작된다</li>
<li>비객체 타입이므로 null 값을 가질 수 없다. (기본값이 정해져 있음)</li>
<li>메모리 스택 영역에 값 자체를 저장한다.</li>
<li>들어있는 값을 그대로 계산에 사용할 수 있다. (숫자 같은 것들은 바로 계산할 수 있음)</li>
</ul>
<br>

<h2 id="참조형reference-type">참조형(Reference Type)</h2>
<p>참조형 타입의 종류로는 기본형 타입을 제외한 나머지를 의미하며 클래스, 배열, 열거형, 인터페이스 등등 존재한다.
(ex.<code>Student student1</code> , <code>int[] students</code>) 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라 한다.
<img src="https://velog.velcdn.com/images/sunny_kim/post/e55a90de-28b1-41ba-a814-840b179c6345/image.png" alt=""></p>
<h3 id="참조형-타입-특징">참조형 타입 특징</h3>
<ul>
<li>기본형 과는 달리 실제 값이 저장되지 않고, 자료가 저장된 공간의 주소를 저장한다.</li>
<li>실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.</li>
<li>참조형 변수는 null로 초기화 시킬 수 있다</li>
<li>메모리의 힙(heap)에 실제 값을 저장하고, 그 참조값(주소값)을 갖는 변수는 스택에 저장</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/08820eb2-8688-4612-b4fa-9f3e2821d34c/image.png" alt=""></p>
<blockquote>
<p><strong>그렇다면 String은 뭐지?</strong>
String은 사실 클래스다. 따라서 참조형이다.
그런데 기본형처럼 문자 값을 바로 대입할 수 있다.
문자는 매우 자주 다루기 때문에 자바에서 특별하게 편의 기능을 제공한다.</p>
</blockquote>
<br>

<hr>

<h2 id="대원칙-자바는-항상-변수의-값을-복사해서-대입한다">대원칙: 자바는 항상 변수의 값을 복사해서 대입한다.</h2>
<p>기본형과 참조형 모두 대입시 변수 안에 있는 값을 읽고 복사해서 전달한다.
기본형은 사용하는 값을 복사해서 전달하고, 참조형은 참조값을 복사해서 전달한다! </p>
<br>

<p><strong>기본형대입</strong>
<img src="https://velog.velcdn.com/images/sunny_kim/post/0a26aeec-9373-46aa-94f2-eb9522364b90/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/46b48718-2953-4f04-885d-4d54fe9977b1/image.png" alt=""></p>
<p>변수의 대입은 변수에 들어있는 값을 복사해서 대입한다. 여기서는 변수 <code>a</code> 에 들어있는 값 <code>10</code> 을 복사해서 변수 <code>b</code> 에 대입한다. 변수 <code>a</code> 자체를 <code>b</code> 에 대입하는 것이 아니다!</p>
<br>

<p><strong>참조형대입</strong>
<img src="https://velog.velcdn.com/images/sunny_kim/post/4d25ec55-4f0d-4a50-ac5b-445b3ff51376/image.png" alt=""></p>
<p><code>dataA</code> 변수는 <code>Data</code> 클래스를 통해서 만들었기 때문에 참조형이다. 
이 변수는 <code>Data</code> 형 객체의 참조값을 저장한다. <code>Data</code> 객체를 생성하고, 
참조값을 <code>dataA</code> 에 저장한다. 그리고 객체의 <code>value</code> 변수에 값 <code>10</code> 을 저장했다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/dcda84a0-602b-4201-b645-d92a72e449b3/image.png" alt=""></p>
<p>변수의 대입은 변수에 들어있는 값을 복사해서 대입한다. 
변수 <code>dataA</code> 에는 참조값 <code>x001</code> 이 들어있다. 
여기서는 변수 <code>dataA</code> 에 들어있는 참조값 <code>x001</code> 을 복사해서 변수 <code>dataB</code> 에 대입한다. 
참고로 변수 <code>dataA</code> 가 가리키는** 인스턴스를 복사하는 것이 아니다!** 변수에 들어있는 <strong>참조값만 복사해서 전달한다.</strong>
이제 <code>dataA</code> 와 <code>dataB</code> 에 들어있는 참조값은 같다. 따라서 둘다 같은 <code>x001</code> <code>Data</code> 인스턴스를 가리킨다.</p>
<blockquote>
<p>기본형은 사용하는 값이, 참조형은 참조값이 들어있다! 
변수에 어떤 값이 들어있든간에 그 값을 그대로 복사해서 전달한다.</p>
</blockquote>
<hr>

<h4 id="참고">참고</h4>
<p>[인프런] 김영한의 실전 자바 - 기본편 
<a href="https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%B3%80%EC%88%98%EC%9D%98-%EA%B8%B0%EB%B3%B8%ED%98%95-%EC%B0%B8%EC%A1%B0%ED%98%95-%ED%83%80%EC%9E%85#%EA%B8%B0%EB%B3%B8%ED%98%95_%ED%83%80%EC%9E%85_primitive_type">☕ JAVA 변수의 기본형 &amp; 참조형 타입 차이 이해하기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 클래스와 데이터]]></title>
            <link>https://velog.io/@sunny_kim/Java%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0</link>
            <guid>https://velog.io/@sunny_kim/Java%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0</guid>
            <pubDate>Fri, 05 Jan 2024 17:58:38 GMT</pubDate>
            <description><![CDATA[<hr>

<h2 id="클래스가-필요한-이유">클래스가 필요한 이유</h2>
<p> 클래스가 필요한 이유를 변수만 사용 -&gt; 배열만 사용 -&gt; 클래스 도입 의 과정을 거쳐
 예제코드를 이용하여 설명하겠다.</p>
<br>


<p> 문제 : 학생의 이름, 나이 , 성적을 저장하고 출력하는 과정을 해보자</p>
<h4 id="1-변수를-사용했을-때">1. 변수를 사용했을 때</h4>
<pre><code>    public static void main(String[] args) {
        String student1Name = &quot;학생1&quot;;
        int student1Age = 15;
        int student1Grade = 90;

        String student2Name = &quot;학생2&quot;;
        int student2Age = 16;
        int student2Grade = 80;

        System.out.println(&quot;이름:&quot; + student1Name+&quot; 나이:&quot; + student1Age + &quot; 성적:&quot; + student1Grade);
        System.out.println(&quot;이름:&quot; + student2Name+&quot; 나이:&quot; + student2Age + &quot; 성적:&quot; + student2Grade);

    }
}</code></pre><p>학생수가 늘어나면 코드도 늘어는 문제를 알 수 있다 그럼 배열을 사용해보자!!</p>
<h4 id="2-배열를-사용했을-때">2. 배열를 사용했을 때</h4>
<pre><code>    public static void main(String[] args) {
        String[] studentNames = {&quot;학생1&quot;, &quot;학생2&quot;};
        int[] studentAges = {15, 16};
        int[] studentGrades = {90, 80};

        for (int i = 0; i &lt; studentNames.length; i++) {
            System.out.println(&quot;이름:&quot; + studentNames[i] + &quot; 나이:&quot; +
                    studentAges[i] + &quot; 성적:&quot; + studentGrades[i]);
        }
    }</code></pre><p>배열을 사용한 덕분에 학생이 추가되어도 배열에 학생의 데이터만 추가하면 된다. 이제 변수를 더 추가하지 않아도 되고, 출력 부분의 코드도 그대로 유지할 수 있다.</p>
<p>하지만, &quot;학생 1&quot;의 데이터를 삭제하려면 studentNames, studentAges, studentGrades의 
<strong>모든 배열을 각각 변경</strong>해야한다.
그리고 한 학생의 데이터를 관리하기 위해 3개 배열의 <strong>인덱스 순서를 항상 정확하게 맞추어야</strong> 한다. 이렇게 하면 특정 학생의 데이터를 변경할 때 실수할 가능성이 매우 높다.</p>
<blockquote>
<p>사람이 관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는 것이다. 그리고 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.</p>
</blockquote>
<br>

<h4 id="3-클래스-도입">3. 클래스 도입</h4>
<p>앞서 이야기한 문제를 클래스를 도입해서 해결해보자.</p>
<p>-Student.java-</p>
<pre><code> public class Student {
    String name;
    int age;
    int grade;
}</code></pre><p> class 키워드를 사용해서 학생 클래스( Student )를 정의한다. 
 학생 클래스는 내부에 이름( name ), 나이( age ), 성적( grade ) 변수를 가진다.</p>
<blockquote>
<p>이렇게 <strong>클래스에 정의한 변수들을 멤버 변수, 또는 필드</strong>라 한다.</p>
</blockquote>
<ul>
<li><strong>멤버 변수(Member Variable)</strong>: 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.</li>
<li><strong>필드(Field)</strong>: 데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.</li>
<li>자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다.<br></li>
<li><em>클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다.*</em>
예): <code>Student</code> , <code>User</code> , <code>MemberService</code></li>
</ul>
<p>이제 학생 클래스를 사용하는 코드를 작성해보자.</p>
<p>-ClassStrart3.java-</p>
<pre><code>public class ClassStart3 {
    public static void main(String[] args) {
        Student student1;
        student1 = new Student();
        student1.name = &quot;학생1&quot;;
        student1.age = 15;
        student1.grade = 90;

        Student student2 = new Student();
        student2.name = &quot;학생2&quot;;
        student2.age = 16;
        student2.grade = 80;

        System.out.println(&quot;이름:&quot; + student1.name + &quot; 나이:&quot; + student1.age + &quot; 성
                적:&quot; + student1.grade);
        System.out.println(&quot;이름:&quot; + student2.name + &quot; 나이:&quot; + student2.age + &quot; 성
                적:&quot; + student2.grade);
    }
}</code></pre><p> <strong>실행결과</strong></p>
<pre><code>이름:학생1 나이:15 성적:90
이름:학생2 나이:16 성적:80</code></pre><p>쉽게 생각하자면 int, String 처럼 우리는 Student 타입을 만들었다고 생각하면 편하다.
즉, 이렇게 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하다. 
이 <strong>설계도가 바로 클래스</strong>이다.
설계도인 클래스를 사용해서 <strong>실제 메모리에 만들어진 실체를 객체 또는 인스턴스</strong>라 한다.</p>
<blockquote>
<p><strong>용어: 클래스, 객체, 인스턴스</strong>
클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다. 둘다 같은 의미로 사용된다.
위 코드에서는 학생( <code>Student</code> ) 클래스를 기반으로 학생1( <code>student1</code> ), 학생2( <code>student2</code> ) 객체 또는 인스턴스를 만들었다.</p>
</blockquote>
 <hr>


<h2 id="객체에-대해-분석해보자">객체에 대해 분석해보자!!</h2>
<h3 id="1-student-변수-선언">1. Student 변수 선언</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/ba763cfb-06af-4ce4-8dd9-6bb9e3238285/image.png" alt=""></p>
<ul>
<li><code>Student student1</code><ul>
<li><code>Student</code> 타입을 받을 수 있는 변수를 선언한다.</li>
<li><code>int</code> 는 정수를, <code>String</code> 은 문자를 담을 수 있듯이 <code>Student</code> 는 <code>Student</code> 타입의 객체(인스턴스)를 받을 수 있다.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="2-student-객체-생성-student클래스의-인스턴스와-같은말">2. Student 객체 생성 (Student클래스의 인스턴스와 같은말)</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/6402f2de-e6da-49d4-9df0-07b5d86472af/image.png" alt=""></p>
<p><code>student1 = new Student()</code> 코드를 나누어 분석해보자.</p>
<ul>
<li>객체를 사용하려면 먼저 설계도인 클래스를 기반으로 객체(인스턴스)를 생성해야 한다.</li>
<li><code>new Student()</code> : <code>new</code> 는 새로 생성한다는 뜻이다. <code>new Student()</code> 는 <code>Student</code> 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제 <code>Student</code> 객체(인스턴스)를 생성한다.</li>
<li>객체를 생성할 때는 <code>new 클래스명()</code> 을 사용하면 된다. 마지막에 <code>()</code> 도 추가해야 한다.</li>
<li><code>Student</code> 클래스는 <code>String name</code> , <code>int age</code> , <code>int grade</code> 멤버 변수를 가지고 있다.  이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.</li>
</ul>
<p><br><br></p>
<h3 id="3-참조값-보관">3. 참조값 보관</h3>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/e9b2abf6-539e-428a-a0ca-3f975ec9991f/image.png" alt=""></p>
<ul>
<li>객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)( <code>x001</code> )을 반환한다.<ul>
<li>여기서 <code>x001</code> 이라고 표현한 것이 참조값이다. (실제로 <code>x001</code> 처럼 표현되는 것은 아니고 이해를 돕기 위한 예시이다.</li>
</ul>
</li>
<li><code>new</code> 키워드를 통해 객체가 생성되고 나면 참조값을 반환한다. 
앞서 선언한 변수인 <code>Student student1</code> 에 생성된 객체의 참조값( <code>x001</code> )을 보관한다.</li>
<li><code>Student student1</code> 변수는 이제 메모리에 존재하는 실제 <code>Student</code> 객체(인스턴스)의 참조값을 가지고 있다.<ul>
<li><code>student1</code> 변수는 방금 만든 객체에 접근할 수 있는 참조값을 가지고 있다. 따라서 이 변수를 통해서 객체를 접근(참조)할 수 있다. 쉽게 이야기해서 <code>student1</code> 변수를 통해 메모리에 있는 실제 객체를 접근하고사용할 수 있다.</li>
</ul>
</li>
</ul>
<br>

<h3 id="참조값을-변수에-보관해야-하는-이유">참조값을 변수에 보관해야 하는 이유</h3>
<p>객체를 생성하는 <code>new Student()</code> 코드 자체에는 아무런 이름이 없다. 이 코드는 단순히 <code>Student</code> 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다. 따라서 생성한 객체에 접근할 수 있는 방법이 필요하다. 이런 이유로 객체를 생성할 때 반환되는 참조값을 어딘가에 보관해두어야 한다. 
앞서 <code>Student student1</code> 변수에 참조값( <code>x001</code> )을 저장해두었으므로 저장한 참조값( <code>x001</code> )을 통해서 실제 메모리에 존재하는 객체에 접근할 수 있다.</p>
<p>지금까지 설명한 내용을 간단히 풀어보면 다음과 같다.</p>
<pre><code>    Student student1 = new Student(); //1. Student 객체 생성
    Student student1 = x001; //2. new Student()의 결과로 x001 참조값 반환
    student1 = x001; //3. 최종 결과</code></pre><p>이후에 학생2( <code>student2</code> )까지 생성하면 다음과 같이 <code>Student</code> 객체(인스턴스)가 메모리에 2개 생성된다. 각각 참조값이 다르므로 서로 구분할 수 있다.</p>
<p> <img src="https://velog.velcdn.com/images/sunny_kim/post/caabcdef-af20-45de-b2ec-48cc539decf5/image.png" alt=""></p>
<blockquote>
<p><strong>참조값 직접 확인해보기!</strong></p>
</blockquote>
<pre><code>    System.out.println(student1);
    System.out.println(student2);</code></pre><p>   <br>  &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp 출력결과</p>
<pre><code>    class1.Student@7a81197d
    class1.Student@2f2c9b19</code></pre><p>   @앞은 패키지 + 클래스 정보를 뜻한다. @뒤에 16진수는 참조값을 뜻한다.</p>
 <hr>

<h2 id="객체-사용">객체 사용</h2>
<p>클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 <code>.</code> (점, dot)을 사용하면 된다.</p>
<pre><code>//객체 값 대입
student1.name = &quot;학생1&quot;;            
student1.age = 15;
student1.grade = 90;
//객체 값 사용
System.out.println(&quot;이름:&quot; + student1.name + &quot; 나이:&quot; + student1.age + &quot; 성적:&quot; +
student1.grade);</code></pre><blockquote>
<p> student1.name = &quot;학생1&quot;; 을
x001.name=&quot;학생1&quot;;  라고 생각하면 편하다</p>
</blockquote>
<hr>

<h2 id="클래스-객체-인스턴스-정리">클래스, 객체, 인스턴스 정리</h2>
<h4 id="클래스---class">클래스 - Class</h4>
<p>클래스는 객체를 생성하기 위한 &#39;틀&#39; 또는 &#39;설계도&#39;이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다. 예를 들어 학생이라는 클래스는 속성으로 <code>name</code> , <code>age</code> , <code>grade</code> 를 가진다. </p>
<ul>
<li><p>틀: 붕어빵 틀을 생각해보자. 붕어빵 틀은 붕어빵이 아니다! 이렇게 생긴 붕어빵이 나왔으면 좋겠다고 만드는 틀일뿐이다. 실제 먹을 수 있는 것이 아니다. 실제 먹을 수 있는 팥 붕어빵을 객체 또는 인스턴스라 한다.</p>
</li>
<li><p>설계도: 자동차 설계도를 생각해보자. 자동차 설계도는 자동차가 아니다! 설계도는 실제 존재하는 것이 아니라 개념으로만 있는 것이다. 설계도를 통해 생산한 실제 존재하는 흰색 테슬라 모델 Y 자동차를 객체 또는 인스턴스라한다.</p>
<br>
#### 객체 - Object
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
예를 들어 위 코드에서 `student1` 은 학생1의 속성을 가지는 객체이고, `student2` 는 학생2의 속성을 가지는 객체이다. `student1` 과 `student2` 는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.
<br>
#### 인스턴스 - Instance
인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 인스턴스라는 용어는 자주 혼용된다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다. 
예를 들어서 `student1` 객체는 `Student` 클래스의 인스턴스다. 라고 표현한다.


</li>
</ul>
<blockquote>
<p><strong>객체 vs 인스턴스</strong>
둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다. 보통,
<code>student1</code> 은 <code>Student</code> 의 객체이다. 라고 말하는 대신 
<code>student1</code> 은 <code>Student</code> 의 인스턴스이다. 라고 
특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
<br>
좀 더 쉽게 풀어보자면, 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다. 
예를 들어 <strong><code>student1</code> 은 객체이지만</strong>, 이 객체가 <code>Student</code> 클래스로부터 생성되다는 점을 명확히 하기 위해 <code>student1</code> 을 <strong><code>Student</code> 의 인스턴스</strong>라고 부른다.
<br>
하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다.</p>
</blockquote>
<hr>

<h4 id="참고">참고</h4>
<p>[인프런] 김영한의 실전 자바 - 기본편 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] REST, REST API, RESTful 이란?]]></title>
            <link>https://velog.io/@sunny_kim/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-REST-API-RESTful-%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@sunny_kim/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-REST-API-RESTful-%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 01 Jan 2024 13:09:46 GMT</pubDate>
            <description><![CDATA[<h2 id="rest">REST</h2>
<hr>

<h3 id="rest의-정의">REST의 정의</h3>
<p><strong>&quot;Representational State Transfer&quot;</strong>의 약자이다.
자원을 <strong>이름(자원의 표현)으로 구분</strong>하여 해당 자원의 <strong>상태(정보)를 주고 받는</strong> 모든 것을 의미한다.</p>
<blockquote>
<p><strong>자원(resource)의 표현(representation)</strong></p>
</blockquote>
<ul>
<li>자원: 해당 소프트웨어가 관리하는 모든 것<ul>
<li>ex) 문서, 그림, 데이터, 해당 소프트웨어 자체 등</li>
</ul>
</li>
<li>자원의 표현: 그 자원을 표현하기 위한 이름<ul>
<li>ex) DB의 학생 정보가 자원일 때, ‘students’를 자원의 표현으로 정한다.</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>상태(정보) 전달</strong></p>
</blockquote>
<ul>
<li>데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달한다.</li>
<li>JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.</li>
</ul>
<p><br><hr></p>
<h3 id="rest의-개념">REST의 개념</h3>
<p>HTTP URI를 통해 자원(Resource)을 명시하고,** HTTP Method(POST, GET, PUT, DELETE)<strong>를 통해 해당 자원에 대한 **CRUD Operation</strong>을 적용하는 것을 의미한다.</p>
<blockquote>
</blockquote>
<ul>
<li>즉, REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미<br></li>
<li>웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여한다.<br></li>
<li><strong>CRUD Operation</strong><ul>
<li>Create: 생성(POST)</li>
<li>Read: 조회(GET)</li>
<li>Update: 수정(PUT)</li>
<li>Delete: 삭제(DELETE)</li>
<li>HEAD: header 정보 조회(HEAD)</li>
</ul>
</li>
</ul>
<p><br><hr></p>
<h3 id="rest의-특징">REST의 특징</h3>
<h4 id="1-uniform-유니폼-인터페이스">1) Uniform (유니폼 인터페이스)</h4>
<p>Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말합니다.</p>
<h4 id="2-stateless-무상태성">2) Stateless (무상태성)</h4>
<p>REST는 무상태성 성격을 갖습니다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않습니다. 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해집니다.</p>
<h4 id="3-cacheable-캐시-가능">3) Cacheable (캐시 가능)</h4>
<p>REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다.</p>
<h4 id="4-self-descriptiveness-자체-표현-구조">4) Self-descriptiveness (자체 표현 구조)</h4>
<p>REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있다는 것입니다.</p>
<h4 id="5-client---server-구조">5) Client - Server 구조</h4>
<p>REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.</p>
<h4 id="6-계층형-구조">6) 계층형 구조</h4>
<p>REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.
<br><hr></p>
<h3 id="rest의-장단점">REST의 장단점</h3>
<ul>
<li>장점<ul>
<li>HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없다.<ul>
<li>HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해준다.</li>
<li>HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.</li>
<li>REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
서버와 클라이언트 역할을 명확하게 분리<br></li>
<li>단점</li>
<li>표준이 존재하지 않음</li>
<li>사용할 수 있는 메소드가 4가지(HTTP Method) 뿐</li>
<li>구형 브라우저에서 아직 제대로 지원해주지 못하는 부분이 존재</li>
<li>PUT, DELETE를 사용하지 못하는 점</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>

<p><br><br></p>
<h2 id="rest-api">REST API</h2>
<hr>

<h3 id="rest-api란">REST API란?</h3>
<blockquote>
<ul>
<li>API(Application Programming Interface)란<pre><code> 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호작용을 촉진하며, **서로 정보를 교환가능 하도록 하는 것**
 &lt;bR&gt;</code></pre></li>
</ul>
</blockquote>
<ul>
<li><p>REST API의 정의</p>
<pre><code>**REST 기반으로 서비스 API를 구현**한 것
OpenAPI(누구나 사용할 수 있는 공개된 API) 는 대부분 REST API를 제공</code></pre><p><br><br><hr></p>
</li>
</ul>
<h3 id="rest-api-설계-기본-규칙">REST API 설계 기본 규칙</h3>
<h4 id="1-uri는-자원의-정보를-표시해야-한다">1. URI는 자원의 정보를 표시해야 한다.</h4>
<ul>
<li><p>resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다</p>
</li>
<li><p>resource의 도큐먼트 이름으로는 단수 명사를 사용해야 한다</p>
</li>
<li><p>resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다</p>
</li>
<li><p>resource의 스토어 이름으로는 복수 명사를 사용해야 한다</p>
<blockquote>
<p>GET /<del>Member</del>/1 &amp;nbsp&amp;nbsp → &amp;nbsp&amp;nbsp  GET /<strong>members</strong>/1</p>
</blockquote>
</li>
</ul>
<h4 id="2-자원에-대한-행위는-http-methodget-put-post-delete-로-표현한다">2. 자원에 대한 행위는 HTTP Method(GET, PUT, POST, DELETE) 로 표현한다.</h4>
<ul>
<li><p>URI에 HTTML Method가 들어가면 안된다</p>
<blockquote>
<p> GET /members/<strong><del>delete</del></strong>/1 &amp;nbsp&amp;nbsp -&gt; &amp;nbsp&amp;nbsp DELETE /members/1</p>
</blockquote>
</li>
<li><p>URI에 행위에 대한 동사 표현이 들어가면 안된다(<strong>CRUD 기능</strong>을 나타내는 것은 URI에 사용하지 않는다.)</p>
<blockquote>
<p>GET /members/<del><strong>show</strong></del>/1 -&gt; GET /members/1 </p>
<pre><code>  GET /members/~~**insert**~~/2 -&gt; POST /members/2</code></pre></blockquote>
</li>
</ul>
<ul>
<li>경로 부분 중 변하는 부분은 <strong>유일한 값</strong>으로 대체한다(즉 :id는 하나의 특정 resource를 나타내는 고유값이다)<blockquote>
<p> Ex) <strong>POST</strong>/<strong>students</strong> &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp &lt;-------- 학생을 생성함</p>
<pre><code>  Ex) **DELETE**/**students**/12 &amp;nbsp&amp;nbsp &lt;--------- id=&#39;12&#39;인 학생를 삭제함</code></pre></blockquote>
</li>
</ul>
<p><br><br><hr></p>
<h3 id="rest-api-설계--규칙">REST API 설계  규칙</h3>
<h4 id="1-슬래시-구분자는-계층-관계를-나타내는데-사용한다">1. 슬래시 구분자(/)는 계층 관계를 나타내는데 사용한다.</h4>
<pre><code>http://kimsunwoo.com/houses/apartments</code></pre><h4 id="2-uri-마지막-문자로-슬래시를-포함하지-않는다">2. URI 마지막 문자로 슬래시를 포함하지 않는다</h4>
<ul>
<li><p>URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르며 URI도 달라져야 한다.</p>
<pre><code>http://kimsunwoo.com/houses/apartments/ (x)</code></pre><h4 id="3-하이픈--은-uri-가독성을-높이는데-사용">3. 하이픈(-) 은 URI 가독성을 높이는데 사용</h4>
<ul>
<li>불가피하게 긴 URI 경로를 사용하게 된다면 하이픈을 사용해 가독성을 높인다.</li>
</ul>
</li>
</ul>
<h4 id="4-밑줄_은-사용하지-않는다">4. 밑줄(_)은 사용하지 않는다.</h4>
<ul>
<li>밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 하므로 가독성을 위해 밑줄은 사용 x</li>
</ul>
<h4 id="5-uri-경로에는-소문자가-적합">5. URI 경로에는 소문자가 적합</h4>
<ul>
<li>URI 경로에 대문자 사용은 피하도록 한다</li>
<li>RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문</li>
</ul>
<h4 id="6-파일-확장자는-uri에-포함하지-않는다">6. 파일 확장자는 URI에 포함하지 않는다.</h4>
<p> <br><br><hr></p>
<h3 id="rest-api-설계-예시">REST API 설계 예시</h3>
<p>  <img src="https://velog.velcdn.com/images/sunny_kim/post/c8228711-459a-4466-ac34-92b4086daad3/image.png" alt=""></p>
  <hr> <br>

<h2 id="restful">RESTful</h2>
<hr>

<h3 id="restful이란">RESTful이란?</h3>
<p>  RESTful은 일반적으로 REST라는 아키텍쳐를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.</p>
<blockquote>
<p>REST API를 제공하는 웹 서비스를 RESTful하다고 할 수 있다.</p>
</blockquote>
<p>RESTful은 REST를 REST 답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것이 아니다.</p>
<blockquote>
<p>즉, REST 원리를 잘 따르는 시스템은 RESTful 용어로 지칭된다.</p>
</blockquote>
<p>  <br><hr></p>
<h3 id="restful의-목적">RESTful의 목적</h3>
<p>  이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것</p>
<p>   <br><hr></p>
<h3 id="restful하지-못한-경우">RESTful하지 못한 경우</h3>
<ul>
<li>CRUD 기능을 모두 POST 로만 처리하는 API</li>
<li>route에 resource, id 외의 정보가 들어가는 경우</li>
</ul>
<p><br><hr></p>
<h4 id="참고">참고</h4>
<p><a href="https://velog.io/@seokkitdo/Network-REST%EB%9E%80-REST-API%EB%9E%80-RESTful%EC%9D%B4%EB%9E%80#restful%EC%9D%98-%EA%B0%9C%EB%85%90">seokkitdo&#39;s velog</a>
<a href="https://hahahoho5915.tistory.com/54#REST"> hahahoho5915&#39;s tistory</a>
  <a href="https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html"> [Network] REST란? REST API란? RESTful이란?</a>
  <a href="https://meetup.nhncloud.com/posts/92">REST API 제대로 알고 사용하기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[브랜치 전략 Git-flow / GitHub-flow ]]></title>
            <link>https://velog.io/@sunny_kim/%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%A0%84%EB%9E%B5-Git-flow-GitHub-flow-Fork%EC%99%80-Pull-Request</link>
            <guid>https://velog.io/@sunny_kim/%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%A0%84%EB%9E%B5-Git-flow-GitHub-flow-Fork%EC%99%80-Pull-Request</guid>
            <pubDate>Sun, 31 Dec 2023 19:07:42 GMT</pubDate>
            <description><![CDATA[<br> 

<h2 id="git-브랜치-전략이란">Git 브랜치 전략이란?</h2>
<ul>
<li>Git 브랜치 전략은 프로젝트에서 Git 브랜치를 효율적으로 사용하기 위한 일련의 규칙과 가이드라인이다.<br> </li>
<li>이는 주로 팀 또는 개발자 간의 협업을 원활하게 하고, 코드의 안정성을 유지하며,
버전 관리를 효과적으로 수행하기 위한 방법을 제시한다.<br></li>
<li>다양한 Git 브랜치 전략은 있으며, 프로젝트의 규모, 팀 구조, 배포 주기 등에 따라 선택할 수 있다.</li>
</ul>
<p><br><hr></p>
<h2 id="git-브랜치-전략이-필요한-이유">Git 브랜치 전략이 필요한 이유</h2>
<ul>
<li><strong>효율성 향상:</strong> 브랜치 전략은 여러 개발자 및 팀 간의 협업을 간소화하고 충돌을 방지하여 효율성을 향상시킵니다.<br> </li>
<li><strong>안정성 및 배포 관리:</strong> 주요 브랜치와 보조 브랜치를 구분함으로써 안정된 코드와 개발 중인 코드를 분리하여 안정적인 버전을 관리하고 배포할 수 있습니다.<br> </li>
<li><strong>기능 개발 및 버그 수정 추적:</strong> 각각의 기능이나 버그 수정은 별도의 브랜치에서 진행되므로 추적이 쉽고, 필요에 따라 독립적으로 테스트하고 배포할 수 있습니다.<br> </li>
<li><strong>코드 리뷰 및 품질 향상:</strong> 개발자들은 작은 범위에서 작업하고, 풀 리퀘스트를 통해 코드 리뷰를 수행함으로써 코드 품질을 높일 수 있습니다.<br> </li>
<li><strong>롤백 및 이력 관리:</strong> 브랜치 전략을 통해 특정 버전으로 롤백하거나, 각각의 작업을 추적하는 데 용이한 이력을 관리할 수 있습니다.<br> </li>
<li><strong>배포 주기 최적화:</strong> 브랜치 전략은 릴리스를 준비하고 배포하는 데 필요한 단계를 정의하여 프로젝트의 배포 주기를 최적화합니다.</li>
</ul>
<br>

<blockquote>
<h3 id="flow란br">Flow란?<br></h3>
<p>직역하여 흐름이라는 의미
git+Flow는 &#39;git에서 제공하는 브랜칭 기능을 활용한 변경 이력 관리 전략&#39;이라고 이해하자!</p>
</blockquote>
<p><br><hr></p>
<h2 id="git-flow">Git-Flow</h2>
<p>Git Flow는 Vincent Driessen이 제안한 Git 기반의 코드 브랜칭 전략 중 하나로, 큰 프로젝트에서 효과적인 협업 및 버전 관리를 위한 모델이다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/21c96f83-9caa-48bb-bbcf-ae7dc9a29953/image.png" alt=""></p>
<h3 id="git-flow의-5가지-브랜치">Git Flow의 5가지 브랜치</h3>
<ul>
<li><strong>master:</strong> 제품의 안정된 버전을 나타내는 브랜치. 배포 가능한 코드만을 유지.</li>
<li><strong>develop:</strong> 개발 중인 코드를 통합하는 브랜치. 새로운 기능이나 버그 수정이 포함된다.</li>
<li><strong>feature/기능:</strong> 새로운 기능을 개발하는 데 사용되는 브랜치. 각 기능은 개별 브랜치에서 개발되고 테스트된 후 develop 브랜치로 병합.</li>
<li><strong>release :</strong> 배포를 준비하는 데 사용되는 브랜치. QA 및 테스트를 수행하고 마지막 버그 수정을 추가한 후 master와 develop으로 병합.</li>
<li><strong>hotfix :</strong> master에서 발생한 버그를 수정하는 데 사용되는 브랜치. 수정 후 master와 develop으로 병합.</li>
</ul>
<blockquote>
<p>master와 develop가 중요한 매인 브랜치이고 나머지는 필요에 의해서 운영하는 브랜치이다.</p>
</blockquote>
<br>

<h3 id="git-flow의-한계">Git Flow의 한계</h3>
<h4 id="웹-어플리케이션에는-적합하지-않다">웹 어플리케이션에는 적합하지 않다</h4>
<p>Vincent Driessen은 A successful Git branching model을 작성하고 10년이 지난 2020년에 해당 포스팅 위에 반성의 글(Note of Reflection)을 적는다. 그 내용을 요약하면 아래와 같다.</p>
<blockquote>
<p>Git-Flow는 등장하고 10년 넘게 표준처럼 자리잡고, 더 나아가 마치 만병통치약처럼 사용되었다. 현재는 <strong>Git으로 관리되는 인기있는 유형의 소프트웨어가 웹 어플리케이션으로 이동</strong>하고 있다. <strong>웹 어플리케이션은 일반적으로 롤백되지 않고, 지속적으로 제공(Continuous Delivery)</strong> 되므로 여러 버전의 소프트웨어를 지원할 필요가 없다.<br>
웹 어플리케이션은 내가(Vincent Driessen) 10년전 블로그 글을 쓸때에는 염두해둔 소프트웨어 유형이 아니다. <strong>팀이 소프트웨어를 지속적으로 제공</strong>한다면, Git Flow 대신 <strong>Github Flow와 같은 더 단순한 워크플로우</strong>를 채택할 것을 제안한다.<br>
그러나 명시적으로 버전을 관리해야하는 소프트웨어를 개발한다면, 여전히 Git Flow가 적합할 수 있다.
&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp_- Vincent Driessen -_</p>
</blockquote>
<p><strong>웹 어플리케이션은 특성상 사용자는 항상 최신의 단일 버전</strong>만을 사용하게된다. 여러 버전을 병렬적으로 지원할 필요가 없는 것이다. 또한 웹 어플리케이션은 하루에 몇번이고 릴리즈될 수 있다. 이런 특성상 <strong>웹 어플리케이션 개발에 Git Flow는 다소 적합하지 않다.</strong></p>
<p><br><hr></p>
<h2 id="github-flow">GitHub-Flow</h2>
<p>GitHub Flow는 GitHub에서 제안하는 간단하고 효율적인 협업 워크플로우이다.</p>
<p><img src="https://velog.velcdn.com/images/sunny_kim/post/ebef4c81-a355-49a1-bc9e-b3cb2e997ade/image.png" alt=""></p>
<div style="text-align: center;">
  <span>Github flow 예제</span>
</div>

<blockquote>
<p>위의 flow가 단순한 만큼 사용법도 단순하다. master 브랜치의 역할만 확실히 지켜진다면 다른 브랜치에 대해 관여를 하지 않는다. 
즉, master 브랜치를 제외하고 feature, hotfix, bugfix 등등의 브랜치를 구분하지 않는다. </p>
</blockquote>
<br>

<h3 id="github-flow-사용법">GitHub Flow 사용법</h3>
<h4 id="1-브랜치-생성-및-변경-사항-커밋">1. 브랜치 생성 및 변경 사항 커밋</h4>
<ul>
<li>새로운 기능이나 버그 수정을 위해 브랜치를 생성하고 해당 브랜치에서 작업을 수행합니다.</li>
<li>변경 사항을 커밋하여 로컬 브랜치에 저장합니다.</li>
</ul>
<pre><code>git checkout -b feature-branch
# 변경 사항 커밋
git commit -m &quot;Implement new feature&quot;</code></pre><h4 id="2-풀-리퀘스트-생성">2. 풀 리퀘스트 생성</h4>
<ul>
<li>변경 사항이 완료되면 GitHub 웹 인터페이스 또는 로컬에서 풀 리퀘스트(PR)를 생성합니다.</li>
<li>PR에는 변경 내용과 이에 대한 설명을 포함합니다.</li>
</ul>
<h4 id="3-코드-리뷰-및-토론">3. 코드 리뷰 및 토론</h4>
<ul>
<li>다른 개발자들은 PR을 리뷰하고 코멘트를 달 수 있습니다.</li>
<li>코드 리뷰를 통해 품질 향상과 팀 간 소통을 도모합니다.</li>
<li>필요에 따라 추가 커밋을 통해 수정을 진행합니다.</li>
</ul>
<h4 id="4-풀-리퀘스트-병합">4. 풀 리퀘스트 병합</h4>
<ul>
<li>코드 리뷰가 완료되면 PR을 메인 브랜치(일반적으로 main 또는 master)에 병합합니다.</li>
<li>이 단계에서 자동으로 테스트가 수행되고, 충돌이 없을 경우에만 병합됩니다.</li>
</ul>
<pre><code>git checkout main
git pull origin main
git merge feature-branch</code></pre><h4 id="5-브랜치-삭제">5. 브랜치 삭제:</h4>
<ul>
<li>풀 리퀘스트가 병합되면 사용한 브랜치를 삭제합니다.</li>
<li>브랜치를 삭제하여 불필요한 브랜치가 쌓이는 것을 방지합니다.</li>
</ul>
<pre><code>git branch -d feature-branch</code></pre><blockquote>
<p>GitHub Flow는 지속적인 통합(Continuous Integration, CI)과 함께 사용되어 빠른 피드백과 안정적인 코드 배포를 지원하며, 특히 민첩한 소프트웨어 개발 및 릴리스에 적합한 워크플로우입니다.</p>
</blockquote>
<p><br><hr></p>
<h4 id="참고">참고</h4>
<p><a href="https://brownbears.tistory.com/603">https://brownbears.tistory.com/603</a>
<a href="https://hudi.blog/git-branch-strategy/">https://hudi.blog/git-branch-strategy/</a>
이미지 : <a href="https://puleugo.tistory.com/107">https://puleugo.tistory.com/107</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] Commit Message Convention]]></title>
            <link>https://velog.io/@sunny_kim/Commit-Convention</link>
            <guid>https://velog.io/@sunny_kim/Commit-Convention</guid>
            <pubDate>Sun, 31 Dec 2023 12:24:55 GMT</pubDate>
            <description><![CDATA[<h2 id="커밋-메세지-컨벤션이란">커밋 메세지 컨벤션이란?</h2>
<hr>

<h3 id="정의">정의</h3>
<blockquote>
<p>커밋 메시지 컨벤션은 프로젝트에서 사용되는 규칙이나 패턴을 따르는 커밋 메시지의 형식을 말합니다. 이 규칙은 주로 프로젝트의 품질을 향상시키고 협업을 더 효과적으로 만들기 위해 사용됩니다.</p>
</blockquote>
  <br> 


<h3 id="장점">장점</h3>
<blockquote>
<ol>
<li><strong>일관성과 가독성 유지:</strong><ul>
<li>커밋 컨벤션은 일관된 형식으로 커밋 메시지를 작성하도록 도와줍니다.</li>
<li>일관성 있는 메시지는 코드 변경 사항을 이해하기 쉽게 만들어 코드 리뷰 및 협업을 간편하게 합니다.<br> </li>
</ul>
<ol start="2">
<li><strong>프로젝트 이력 관리:</strong></li>
</ol>
<ul>
<li>좋은 커밋 메시지는 코드 변경 이력을 체계적으로 관리할 수 있게 합니다.</li>
<li>특정 기능이나 이슈에 대한 변경 사항을 쉽게 찾을 수 있으며, 코드 상태를 원하는 시점으로 돌아가기 용이합니다.<br></li>
</ul>
<ol start="3">
<li><strong>자동화 및 통합 향상:</strong></li>
</ol>
</li>
</ol>
</blockquote>
<ul>
<li>커밋 컨벤션은 자동화된 프로세스와의 통합을 용이하게 합니다.</li>
<li>일부 프로젝트는 커밋 메시지를 기반으로 자동으로 버전 관리, 릴리스 노트 생성 등을 수행하여 효율성을 높이고 오류를 방지할 수 있습니다.</li>
</ul>
<br>
<hr>

<h2 id="커밋-메세지-컨벤션-적용하기">커밋 메세지 컨벤션 적용하기</h2>
<hr>

<h3 id="1-commit-message-구조">1. Commit Message 구조</h3>
<ul>
<li>기본 적인 커밋 메시지 구조는 <strong>제목, 본문, 꼬리말</strong> 세가지 파트로 나누고, 각 파트는 <strong>빈줄을 두어 구분</strong>한다.</li>
</ul>
<blockquote>
</blockquote>
<p><strong>type : subject &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>&lt;-----&nbsp;제목** <br> 
body &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt;-----&nbsp;본문</strong> <br>
footer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**&lt;-----&nbsp;꼬리말</p>
<p> <br><hr></p>
<h3 id="2-commit-type">2. Commit Type</h3>
<p>커밋메시지의 타입(type) 은 아래와 같은 규약을 지키면서 작성한다</p>
<blockquote>
<p><strong>태그: 제목</strong><br>
타입은 &quot; tag: subject &quot; 으로 구성되며, 태그는 영어로 쓰되, 첫 문자는 대문자 로 한다.
<strong>※  (&amp;nbsp  <code>:</code> 뒤에 space 가 있음)<Br></strong>
    _ex) Fix: Modified user config (Feat 가 태그이고, Modify user config 가 제목임)</p>
</blockquote>
<br>  

<table>
<thead>
<tr>
<th>Tag Name</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>Feat</td>
<td>새로운 기능을 추가</td>
</tr>
<tr>
<td>Fix</td>
<td>버그 수정</td>
</tr>
<tr>
<td>Design</td>
<td>CSS 등 사용자 UI 디자인 변경</td>
</tr>
<tr>
<td>!BREAKING CHANGE</td>
<td>커다란 API 변경의 경우</td>
</tr>
<tr>
<td>!HOTFIX</td>
<td>급하게 치명적인 버그를 고쳐야하는 경우</td>
</tr>
<tr>
<td>Style</td>
<td>코드 포맷 변경, 세미 콜론 누락, 코드 수정이 없는 경우</td>
</tr>
<tr>
<td>Refactor</td>
<td>프로덕션 코드 리팩토링</td>
</tr>
<tr>
<td>Comment</td>
<td>필요한 주석 추가 및 변경</td>
</tr>
<tr>
<td>Docs</td>
<td>문서 수정</td>
</tr>
<tr>
<td>Test</td>
<td>테스트 코드, 리펙토링 테스트 코드 추가, Production Code 변경 없음</td>
</tr>
<tr>
<td>Chore</td>
<td>빌드 업무 수정, 패키지 매니저 수정, 패키지 관리자 구성 등 업데이트, Production Code 변경 없음</td>
</tr>
<tr>
<td>Rename</td>
<td>파일 혹은 폴더명을 수정하거나 옮기는 작업만인 경우</td>
</tr>
<tr>
<td>Remove</td>
<td>파일을 삭제하는 작업만 수행한 경우</td>
</tr>
</tbody></table>
<p>  <br><hr></p>
<h3 id="3-subject">3. Subject</h3>
<p>  제목은 다음의 규칙을 지킨다.</p>
<blockquote>
<ul>
<li>제목은 50글자 이내로 작성한다.</li>
</ul>
</blockquote>
<ul>
<li><p>첫글자는 대문자로 작성한다.</p>
</li>
<li><p>마침표 및 특수기호는 사용하지 않는다.</p>
</li>
<li><p>영문으로 작성하는 경우 동사(원형)을 가장 앞에 명령어로 작성한다.</p>
</li>
<li><p>과거시제는 사용하지 않는다.</p>
</li>
<li><p>간결하고 요점적으로 즉, 개조식 구문으로 작성한다. 
``` </p>
</li>
<li><p>Fixed --&gt; Fix</p>
</li>
<li><p>Added --&gt; Add</p>
</li>
<li><p>Modified --&gt; Modify</p>
<pre><code>
 &lt;br&gt;&lt;hr&gt;
### 4. Body
본문은 다음의 규칙을 지킨다.
&gt;- 72이내로 작성한다.
 - 최대한 상세히 작성한다. (코드 변경의 이유를 명확히 작성할수록 좋다)
 - 어떻게 변경했는지보다 무엇을, 왜 변경했는지 작성한다.

&lt;br&gt;&lt;hr&gt;
### 5. Footer
꼬릿말은 다음의 규칙을 지킨다.
&gt;
- 꼬리말은 optional이고 이슈 트래커 ID를 작성한다.
 - 꼬리말은 &quot;유형: #이슈 번호&quot; 형식으로 사용한다.
 - 여러 개의 이슈 번호를 적을 때는 쉼표(,)로 구분한다.
 - 이슈 트래커 유형은 다음 중 하나를 사용한다.&lt;br&gt;
  \- **Fixes** : 이슈 수정중 (아직 해결되지 않은 경우)
  \- **Resolves** : 이슈를 해결했을 때 사용
  \- **Ref** : 참고할 이슈가 있을 때 사용
  \- **Related to** : 해당 커밋에 관련된 이슈번호 (아직 해결되지 않은 경우)&lt;br&gt;
**ex ) `Fixes: #45 Related to: #34, #23`**

 &lt;br&gt;&lt;hr&gt;
### 6. Commit 예시</code></pre><p>Feat: &quot;회원 가입 기능 구현&quot;</p>
</li>
</ul>
<p>SMS, 이메일 중복확인 API 개발</p>
<p>Resolves: #123
Ref: #456
Related to: #48, #45</p>
<p>```</p>
<p>  <br><hr></p>
<h3 id="7-commit-message-emoji-gitmoji">7. Commit Message Emoji (<a href="https://gitmoji.dev/">gitmoji</a>)</h3>
<table>
<thead>
<tr>
<th>Emoji</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>🎨</td>
<td>코드의 형식 / 구조를 개선 할 때</td>
</tr>
<tr>
<td>📰</td>
<td>새 파일을 만들 때</td>
</tr>
<tr>
<td>📝</td>
<td>사소한 코드 또는 언어를 변경할 때</td>
</tr>
<tr>
<td>🐎</td>
<td>성능을 향상시킬 때</td>
</tr>
<tr>
<td>📚</td>
<td>문서를 쓸 때</td>
</tr>
<tr>
<td>🐛</td>
<td>버그를 reporting할 때, @FIXME 주석 태그 삽입</td>
</tr>
<tr>
<td>🚑</td>
<td>버그를 고칠 때</td>
</tr>
<tr>
<td>🐧</td>
<td>리눅스에서 무언가를 고칠 때</td>
</tr>
<tr>
<td>🍎</td>
<td>Mac OS에서 무언가를 고칠 때</td>
</tr>
<tr>
<td>🏁</td>
<td>Windows에서 무언가를 고칠 때</td>
</tr>
<tr>
<td>🔥</td>
<td>코드 또는 파일 제거할 때, @CHANGED 주석 태그와 함께</td>
</tr>
<tr>
<td>🚜</td>
<td>파일 구조를 변경할 때, 🎨과 함께 사용</td>
</tr>
<tr>
<td>🔨</td>
<td>코드를 리팩토링 할 때</td>
</tr>
<tr>
<td>☔️</td>
<td>테스트를 추가 할 때</td>
</tr>
<tr>
<td>🔬</td>
<td>코드 범위를 추가 할 때</td>
</tr>
<tr>
<td>💚</td>
<td>CI 빌드를 고칠 때</td>
</tr>
<tr>
<td>🔒</td>
<td>보안을 다룰 때</td>
</tr>
<tr>
<td>⬆️</td>
<td>종속성을 업그레이드 할 때</td>
</tr>
<tr>
<td>⬇️</td>
<td>종속성을 다운 그레이드 할 때</td>
</tr>
<tr>
<td>⏩</td>
<td>이전 버전 / 지점에서 기능을 전달할 때</td>
</tr>
<tr>
<td>⏪</td>
<td>최신 버전 / 지점에서 기능을 백 포트 할 때</td>
</tr>
<tr>
<td>👕</td>
<td>linter / strict / deprecation 경고를 제거 할 때</td>
</tr>
<tr>
<td>💄</td>
<td>UI / style 개선시</td>
</tr>
<tr>
<td>♿️</td>
<td>접근성을 향상시킬 때</td>
</tr>
<tr>
<td>🚧</td>
<td>WIP (진행중인 작업)에 커밋, @REVIEW 주석 태그와 함께</td>
</tr>
<tr>
<td>💎</td>
<td>New Release</td>
</tr>
<tr>
<td>🔖</td>
<td>버전 태그</td>
</tr>
<tr>
<td>🎉</td>
<td>Initial Commit</td>
</tr>
<tr>
<td>🔈</td>
<td>로깅을 추가 할 때</td>
</tr>
<tr>
<td>🔇</td>
<td>로깅을 줄일 때</td>
</tr>
<tr>
<td>✨</td>
<td>새로운 기능을 소개 할 때</td>
</tr>
<tr>
<td>⚡️</td>
<td>도입 할 때 이전 버전과 호환되지 않는 특징, @CHANGED 주석 태그 사용</td>
</tr>
<tr>
<td>💡</td>
<td>새로운 아이디어, @IDEA 주석 태그</td>
</tr>
<tr>
<td>🚀</td>
<td>배포 / 개발 작업 과 관련된 모든 것</td>
</tr>
<tr>
<td>🐘</td>
<td>PostgreSQL 데이터베이스 별 (마이그레이션, 스크립트, 확장 등)</td>
</tr>
<tr>
<td>🐬</td>
<td>MySQL 데이터베이스 특정 (마이그레이션, 스크립트, 확장 등)</td>
</tr>
<tr>
<td>🍃</td>
<td>MongoDB 데이터베이스 특정 (마이그레이션, 스크립트, 확장 등)</td>
</tr>
<tr>
<td>🏦</td>
<td>일반 데이터베이스 별 (마이그레이션, 스크립트, 확장명 등)</td>
</tr>
<tr>
<td>🐳</td>
<td>도커 구성</td>
</tr>
<tr>
<td>🤝</td>
<td>파일을 병합 할 때</td>
</tr>
</tbody></table>
<p>  <br><hr></p>
<h4 id="참고">참고</h4>
<p>  <a href="https://velog.io/@msung99/Git-Commit-Message-Convension#%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%ED%83%9C%EA%B7%B8-%EC%A2%85%EB%A5%98">[Git] Commit Message Convension (협업을 위한 git 커밋컨벤션)</a>
  <a href="https://velog.io/@shin6403/Git-git-%EC%BB%A4%EB%B0%8B-%EC%BB%A8%EB%B2%A4%EC%85%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0">Git | git 커밋 컨벤션 설정하기</a></p>
]]></description>
        </item>
    </channel>
</rss>