<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>second_ho_jun.log</title>
        <link>https://velog.io/</link>
        <description>처음이고 서툴지만 방향을 잡아 노력하는 개발자</description>
        <lastBuildDate>Sun, 15 Mar 2026 06:14:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>second_ho_jun.log</title>
            <url>https://velog.velcdn.com/images/second_ho_jun/profile/6b6fedd6-df37-4c20-adf8-b0ed42c18d9b/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. second_ho_jun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/second_ho_jun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[자료구조 chapter 4 : Queue]]></title>
            <link>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-4-Queue</link>
            <guid>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-4-Queue</guid>
            <pubDate>Sun, 15 Mar 2026 06:14:10 GMT</pubDate>
            <description><![CDATA[<h3 id="what-is-queue">What is Queue?</h3>
<blockquote>
<p>큐는 동종의 아이템들(자료형이 같은 것들)만의 그룹이고 새로운 아이템은 큐의 맨끝에 추가되고, 제거 되는 아이템은 맨 앞에서 사라진다.</p>
</blockquote>
<blockquote>
<p>이러한 특성을 FIFO(First in First Out)이라 부른다. ex). Job buffers, Network buffers</p>
</blockquote>
<h3 id="queue">Queue</h3>
<ul>
<li><p>Logical level</p>
<ul>
<li><p>Constructor</p>
<ul>
<li>Class Name</li>
</ul>
</li>
<li><p>Transformer</p>
<ul>
<li><p>enqueue(value)</p>
</li>
<li><p>dequeue( )</p>
</li>
<li><p>clear</p>
</li>
</ul>
</li>
<li><p>Observer</p>
<ul>
<li><p>isFull( )</p>
</li>
<li><p>isEmpty( )</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="queue의-동작설명">Queue의 동작설명</h3>
<ul>
<li><p>Enqueue( )</p>
<ul>
<li><p>Queue의 맨 끝인 rear에 추가하고자 하는 아이템의 값을 추가한다.</p>
</li>
<li><p>시간복잡도 : O(1)</p>
</li>
</ul>
</li>
<li><p>Dequeue( )</p>
<ul>
<li><p>Option 1 (front의 값을 제거 후 모두 앞으로 당기기)</p>
<ul>
<li><p>front의 값을 제거한다.</p>
</li>
<li><p>이후 기존의 값들의 위치를 한 칸씩 앞으로 당겨 재정렬한다.</p>
</li>
<li><p>시간복잡도 : O(N)</p>
</li>
</ul>
</li>
<li><p>Option 2 (배열을 옮기는 것이 아닌 front가 앞으로 움직인다.)</p>
<ul>
<li><p>front의 값을 제거한다.</p>
</li>
<li><p>그 후 front가 가리키는 값을 기존의 front에서 한 칸 뒤로 옮긴다.</p>
</li>
<li><p>시간복잡도 : O(1)</p>
</li>
<li><p>순환하는 Queue 구조가 된다.</p>
</li>
<li><p>과연 Option 2는 문제가 없는 방식인가?</p>
</li>
<li><p>rear와</p>
</li>
</ul>
</li>
<li><p>Circular Queue에서의 동작 구조 설명</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/05304d8a-4e5f-4583-94f6-5dba10adda69/image.png" alt=""></p>
<blockquote>
<p>큐는 배열로 구현된 선형의 형태를 가진다. 이에 따라,  데이터 삽입/삭제 시 데이터들을 앞 혹은 뒤로 당겨주는 과정이 필요하며, 이는 불필요한 시간 낭비를 불러일으킨다.</p>
</blockquote>
<blockquote>
<p>이러한 단점을 극복하기 위해 고안된 개념이 &#39;Circular Queue&#39;이다.</p>
</blockquote>
<ul>
<li><p>enqueue( )</p>
<ul>
<li><p>큐가 가득 차있지 않다면, 아이템을 삽입한다. rear의 위치를 한 칸 옮겨주고, 본래 rear 자리에 아이템을 넣어준다.</p>
</li>
<li><p>rear = rear + 1</p>
</li>
</ul>
</li>
<li><p>dequeue( )</p>
<ul>
<li>큐가 비어있지 않다면, front를 한칸 옮긴다. 동시에 front에 저장되어 있던 아이템을 반환해준다.</li>
</ul>
</li>
<li><p>front = front + 1</p>
</li>
</ul>
<ul>
<li><p>isFull( )</p>
<ul>
<li><p>front의 값이 rear에서 1개 더한 값과 같다면 Full인 상태라고 판단한다.</p>
</li>
<li><p>front == rear + 1</p>
</li>
</ul>
</li>
<li><p>isEmpty( )</p>
<ul>
<li><p>front의 값이 rear에서 1개 더한 값과 같다면 Empty인 상태라고 판단한다.</p>
</li>
<li><p>front == rear + 1</p>
</li>
</ul>
</li>
<li><p>그렇다면 isFull( )인지 isEmpty( )인지 어떻게 구분할 것인가?</p>
<ul>
<li><p>해결책 : Reserved Space</p>
<ul>
<li><p>실제론 데이터를 보관하지 않는 공간을 만든다.</p>
</li>
<li><p>front는 항상 reserved space를 가리키도록한다.</p>
</li>
<li><p>Queue가 isFull일 경우 rear+1 == front이다.</p>
</li>
<li><p>즉, (rear+1) % maxQueue == front이다.</p>
</li>
<li><p>Queue가 isEmpty일 경우 rear == front이다</p>
</li>
<li><p>한 메모리 공간을 낭비하더라도, Full과 Empty를 구분할 수 있다.</p>
</li>
<li><p>reserved space 공간은 Queue크기가 커질 수록 공간에 대한 부담이 줄어든다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="big---o-시간복잡도-queue">Big - O 시간복잡도 (Queue)</h3>
<table>
<thead>
<tr>
<th>Operation</th>
<th align="left">Time Complexitiy</th>
</tr>
</thead>
<tbody><tr>
<td>size( )</td>
<td align="left">O( 1 )</td>
</tr>
<tr>
<td>isFull( ) / isEmpty( )</td>
<td align="left">O( 1 )</td>
</tr>
<tr>
<td>enqueue(ItemType value)</td>
<td align="left">O( 1 )</td>
</tr>
<tr>
<td>dequeue( )</td>
<td align="left">O( 1 )</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 chapter 3 : Stack, Class Template, Pointer, Memory Allocation]]></title>
            <link>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-3-Stack-Class-Template-Pointer-Memory-Allocation</link>
            <guid>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-3-Stack-Class-Template-Pointer-Memory-Allocation</guid>
            <pubDate>Fri, 13 Mar 2026 03:35:18 GMT</pubDate>
            <description><![CDATA[<h3 id="what-is-stack">What is Stack?</h3>
<blockquote>
<p>스택은 동종의 아이템들(자료형이 같은 것들)만의 그룹이고 Stack의 맨 위에 아이템을 추가하고 삭제한다.</p>
</blockquote>
<blockquote>
<p>이러한 특성을 LIFO(Last in First Out)이라 부른다. ex). Undo, Back Browser</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/5809d22c-fedb-4a0b-9823-df004912fdc7/image.png" alt=""></p>
<h3 id="stack">Stack</h3>
<ul>
<li><p>Logical level</p>
<ul>
<li><p>Constructor</p>
<ul>
<li>Class Name</li>
</ul>
</li>
<li><p>Transformer</p>
<ul>
<li><p>Push(value)</p>
</li>
<li><p>Pop( )</p>
</li>
</ul>
</li>
<li><p>Observer</p>
<ul>
<li><p>size( )</p>
</li>
<li><p>isFull( )</p>
</li>
<li><p>isEmpty( )</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="stack의-동작설명">Stack의 동작설명</h3>
<ul>
<li><p>Stack이 비어있는 상태는 어떻게 되는 것일까?</p>
<ul>
<li>Stack의 맨 위의 값(top)이 -1로 설정된다.</li>
</ul>
</li>
</ul>
<ul>
<li><p>size( )</p>
<ul>
<li><p>size는 맨위의 값(top)에 1을 더하여 return해준다.</p>
</li>
<li><p>아무것도 없을 때, top = -1 --&gt; -1 + 1 = 0 --&gt; size의 반환 값 : 0</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>isFull( )</p>
<ul>
<li><p>Stack에서 설정한 Max_Size값에서 -1을 뺀 값이 현재 top과 동일하며 True이다. </p>
</li>
<li><p>아닐 경우는 False를 반환한다.</p>
</li>
<li><p>왜 Max_Size에서 1을 빼는가? --&gt; 첫 번째의 값의 인덱스가 0이기 때문이다.</p>
</li>
</ul>
</li>
<li><p>isEmpty( )</p>
<ul>
<li>Stack의 top의 값이 -1이면 True를 아니면 False를 반환한다.</li>
</ul>
</li>
</ul>
<ul>
<li><p>push( )</p>
<ul>
<li><p>Unsorted list의 appendItem가 유사한 동작방식이다.</p>
</li>
<li><p>isFull일 경우 아무것도 반환하지 않는다.</p>
</li>
<li><p>만약 isFull이 아니라면, top의 값에 1을 더한 후, data[top]에 추가하고자 하는 value를 붙인다.</p>
</li>
<li><p>시간복잡도 : O(1)</p>
</li>
</ul>
</li>
<li><p>pop( )</p>
<ul>
<li><p>isEmpty일 경우 아무것도 -1을 반환한다.</p>
</li>
<li><p>isEmpty가 아닐 경우 반환하고자 하는 맨 꼭대기의 값을 변수에 저장한다.</p>
</li>
<li><p>이후 top의 값에서 1을 뺀 후, 변수를 반환한다.</p>
</li>
<li><p>시간복잡도 : O(1)</p>
</li>
</ul>
</li>
</ul>
<h3 id="big---o-시간복잡도-stack">Big - O 시간복잡도 (Stack)</h3>
<table>
<thead>
<tr>
<th>Operation</th>
<th align="left">Time Complexitiy</th>
</tr>
</thead>
<tbody><tr>
<td>size( )</td>
<td align="left">O( 1 )</td>
</tr>
<tr>
<td>isFull( ) / isEmpty( )</td>
<td align="left">O( 1 )</td>
</tr>
<tr>
<td>push(ItemType value )</td>
<td align="left">O( 1 )</td>
</tr>
<tr>
<td>pop( )</td>
<td align="left">O( 1 )</td>
</tr>
</tbody></table>
<h3 id="class-template">Class Template</h3>
<blockquote>
<p>Stack은 한 종류의 자료형만을 저장할 수 있는 구조(homogeneous)이다. </p>
</blockquote>
<blockquote>
<p>하지만 여러 형태의 자료형(int, char, bool)을 저장하고 싶다면 어떻게 해야할까?</p>
</blockquote>
<blockquote>
<p>이때 도와주는 것이 Class Template이다.</p>
</blockquote>
<ul>
<li><p>Class Template</p>
<ul>
<li><p>Type Parameters를 활용하여, 다양한 버전의 class type를 생성하도록 해준다.</p>
</li>
<li><p>형식적인 parameter는 class template의 정의에서, 실제 parameter는 client code에서 나타난다.</p>
</li>
<li><p>둘다 &lt; &gt;로 둘러 쌓여있다는 것을 기억해야한다.</p>
</li>
</ul>
</li>
<li><p>Class Template 사용법</p>
<ul>
<li><p>Template의 실제 parameter가 data type이다.</p>
</li>
<li><p>어떤 타입을 사용한든, 내재된거나, 유저가 정의한 것들 중 하나여야한다.</p>
</li>
<li><p>Class Template를 제작할때, 반드시 헤더 파일을 포함해야한다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="pointer">Pointer</h3>
<ul>
<li><p>메모리의 할당 방법</p>
<ul>
<li><p>변수가 선언 될때, 값이 할당될 수 있도록 충분한 메모리 공간이 마련된다.</p>
</li>
<li><p>int : 4byte / float : 4byte / char : 1byte</p>
</li>
</ul>
</li>
<li><p>메모리의 주소(Memory Addresses)</p>
<ul>
<li>array가 아닌 변수의 주소는 &#39;&amp;&#39;를 통해 확인할 수 있다.</li>
</ul>
</li>
<li><p>Pointer Variable</p>
<ul>
<li><p>메모리에서 주소의 위치 값을 나타내는 변수이다.</p>
</li>
<li><p>포인터 변수를 선언하기 위해선 반드시, 값의 타입을 명시해야한다.</p>
<ul>
<li>int * ptr  : 정수형 포인터</li>
<li>char * ptr : 문자형 포인터</li>
</ul>
</li>
<li><p>int x = 12; int * ptr = &X;</p>
<ul>
<li><p>이 경우 x의 주소를 ptr이 그리고 ptr은 x를 가리키고 있다고 말한다.</p>
</li>
<li><p>ptr로 가리켜진 값은 *ptr로 표시된다.</p>
</li>
</ul>
</li>
<li><p>포인터의 변수는 어떤 형태인든 크기가 8byte로 동일하다.</p>
</li>
</ul>
</li>
</ul>
<pre><code>- null Pointer (nullptr)

  - 포인터를 표현하는 값 중에 &quot;널을 표현한 값&quot;이다

  - 하지만 Null은 메모리 주소 0을 가리키는 것은 아니다.

  - &quot;포인터가 아무것도 가리키지 않은 상태&quot;를 의미한다.

  - NULL과 nullptr차이

    - C++11부터 도입된 nullptr은 포인터 타입의 널 값을 의미하며 정수 0과 구분되는 명확한 타입이다.

    - 반면 NULL은 정수 0으로 정의된 매크로로, 함수 오버로딩 시 int로 취급되어 예기치 않은 오류를 유발할 수 있다.

    - 이러한 NULL의 단점을 보완하고자, nullptr이 등장한다.</code></pre><h3 id="memory-allocation">Memory Allocation</h3>
<ul>
<li><p>Process Memory Map</p>
<ul>
<li><p>프로그램을 메모리에 적재할 때 프로세스의 요소들을 배치하는 방식.</p>
</li>
<li><p>스택 영역 (Stack Area)</p>
<ul>
<li><p>스택영역으로 할당된 부분은 스택 방식으로 작동. : LIFO방식</p>
</li>
<li><p>메모리의 정확성을 유지하기 위해 stack 방식을 사용.</p>
</li>
</ul>
</li>
<li><p>힙 영역 (Heap Area)</p>
<ul>
<li><p>프로그램 실행 중(런타임)에 동적으로 할당되는 데이터(객체, 배열 등)를 위한 메모리 영역.</p>
</li>
<li><p>address를 Stack 영역에 참조 데이터 타입(Reference Data Type)으로 만들어서 그것을 reference해서 사용.</p>
</li>
</ul>
</li>
<li><p>데이터 영역 (Data Area)</p>
<ul>
<li><p>프로그램의 전역 변수(Global)와 정적(Static) 변수가 저장되는 메모리 공간.</p>
</li>
<li><p>BSS (Block Stated Symbol) // Data Segment (Initialized Data)이 존재.</p>
</li>
</ul>
</li>
<li><p>Text(Code) 영역</p>
</li>
</ul>
</li>
</ul>
<pre><code>  - 프로그램의 실행 가능한 코드들을 포함하고 있는 영역.</code></pre><p><img src="https://velog.velcdn.com/images/second_ho_jun/post/2c53139e-031d-401f-a01e-4880548d31dd/image.png" alt=""></p>
<h3 id="추가-개념">추가 개념</h3>
<ul>
<li><p>Dynamic Allocation (동적 할당)</p>
<ul>
<li><p>프로그램 실행 중(런타임)에 필요한 만큼의 메모리(힙 영역)를 운영체제로부터 할당받아 사용하는 기술.</p>
</li>
<li><p>필요한 만큼만 메모리를 사용하므로 자원을 효율적으로 관리가 가능하다.</p>
</li>
<li><p>하지만, 할당한 메모리는 반드시 프로그래머가 삭제해야하며, 그렇지 않을 경우 메모리 누수가 발생할 수 있다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 chapter 2 : list]]></title>
            <link>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-2-list</link>
            <guid>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-2-list</guid>
            <pubDate>Wed, 11 Mar 2026 02:55:13 GMT</pubDate>
            <description><![CDATA[<h3 id="list-definitions">List Definitions</h3>
<ul>
<li><p>Linear relationship</p>
<ul>
<li>각각의 요소들은 첫 번째를 제외하면, prdecessor(전임자)가 있고, 마지막을 제외하면, successor(후임자)가 있다.</li>
</ul>
</li>
<li><p>Length</p>
<ul>
<li>리스트안의 항목들의 갯수들이다.</li>
</ul>
</li>
</ul>
<h3 id="unsorted-list">Unsorted List</h3>
<ul>
<li><p>Unsorted List : 리스트의 아이템이 정렬되지 않은 리스트를 의미한다.</p>
</li>
<li><p>Logical level</p>
<ul>
<li><p>Constructor</p>
<ul>
<li>Class Name</li>
</ul>
</li>
<li><p>Transformer</p>
<ul>
<li><p>appendItem(value)</p>
</li>
<li><p>insertItem(pos,value)</p>
</li>
<li><p>removeItem(value)</p>
</li>
<li><p>updateItem(pos,new_value)</p>
</li>
<li><p>clear()</p>
</li>
</ul>
</li>
<li><p>Observer</p>
<ul>
<li><p>size()</p>
</li>
<li><p>isFull()</p>
</li>
<li><p>isEmpty()</p>
</li>
<li><p>findItem(item)</p>
</li>
<li><p>getItem(pos)</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>&lt;리스트 그림&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/aba63de0-2dc1-4763-98a0-25197603fee1/image.png" alt=""></p>
<h3 id="unsorted-list의-동작설명">Unsorted List의 동작설명</h3>
<ul>
<li><p>appendItem()</p>
<ul>
<li><p>넣고자 하는 리스트에 isFull()인지 확인을 한다.</p>
<ul>
<li>isFull이면 아무것도 리턴하지 않는다.</li>
</ul>
</li>
<li><p>이후 현재 data의 length(아이템 갯수)의 인덱스를 통해 새로운 값을 넣는다.</p>
</li>
<li><p>이후 length에 1을 더해 length을 최신화 해준다.</p>
</li>
</ul>
</li>
<li><p>insertItem()</p>
<ul>
<li><p>넣고자 하는 리스트에 isFull()인지 확인을 한다.</p>
<ul>
<li>isFull이면 아무것도 리턴하지 않는다.</li>
</ul>
</li>
<li><p>이후 원하는 위치의 인덱스에서 부터 뒤까지 한 칸씩 value를 뒤로 이동시킨다.</p>
</li>
<li><p>그리고 리스트에 넣고자 하는 위치에 사용자가 지정한 value값을 다시 붙인다.</p>
</li>
<li><p>이후 length에 1을 더해 length을 최신화 해준다.</p>
</li>
</ul>
</li>
<li><p>appendItem() vs insertItem()</p>
<ul>
<li><p>appendItem은 item의 value를 리스트의 맨 마지막에 추가해준다.</p>
</li>
<li><p>insertItem은 item의 value를 사용자가 원하는 특정한 위치에 추가해준다.</p>
</li>
<li><p>시간복잡도는 insertItem이 더 오래 걸린다.</p>
</li>
<li><p>appendItem() -&gt; O(1) // insertItem() -&gt; O(N)</p>
</li>
</ul>
</li>
<li><p>insertItem()은 O(N)이 최선인가?</p>
<ul>
<li><p>insertItem의 시간복잡도가 O(N)이 최선이지 않다.</p>
</li>
<li><p>new_insertItem()의 동작</p>
<ul>
<li><p>새롭게 추가하고자 하는 Item의 위치의 원래 값을 리스트 맨 뒤로 이동시킨다.</p>
</li>
<li><p>그 후 추가하려는 value를 사용자가 원하는 위치에 값을 붙인다.</p>
</li>
</ul>
</li>
<li><p>리스트의 맨 뒤로 이동하는 시간 복잡도 = O(1)</p>
</li>
<li><p>사용자가 원하는 위치에 값을 붙이는 시간 복잡도 = O(1)</p>
</li>
<li><p>최종 시간 복잡도 O(1+1) = O(2) = O(1)</p>
</li>
</ul>
</li>
<li><p>removeItem()</p>
<ul>
<li><p>리스트에 제거하고자 하는 Item의 위치를 찾는다 --&gt; K라 가정</p>
</li>
<li><p>이후 K번째 값으로 한 칸씩 앞으로 당긴다. --&gt; N - K번</p>
</li>
<li><p>리스트의 전체 길이 length의 값에서 1을 뺀다. -- 1번</p>
</li>
<li><p>최종 Big - O 값 : O( N - K + 1 ) = O( N )</p>
</li>
</ul>
</li>
<li><p>removeItem()은 O(N)이 최선인가?</p>
<ul>
<li><p>removeItem의 시간복잡도가 O(N)이 최선이지 않다.</p>
</li>
<li><p>new_removeItem()의 동작</p>
<ul>
<li>없애고자 하는 Item의 위치의 원래 값에 리스트 맨 뒤의 값을 적용시킨다.      </li>
<li>그 후 리스트의 전체 길이 length의 값에서 1을 뺀다.</li>
</ul>
</li>
</ul>
</li>
<li><p>updateItem()</p>
<ul>
<li><p>update하고자 하는 위치가 length보다 크거나 같으면 그냥 return한다.</p>
</li>
<li><p>그렇지 않을 경우 리스트의 위치에 새로운 값을 덧붙인다.</p>
</li>
<li><p>시간복잡도 : O(1)</p>
</li>
</ul>
</li>
<li><p>clear()</p>
<ul>
<li><p>length의 값을 0으로 전환한다.</p>
</li>
<li><p>시간복잡도 : O(1)</p>
</li>
</ul>
</li>
<li><p>findItem()</p>
<ul>
<li><p>리스트의 인덱스 값을 0으로 초기화한다.</p>
</li>
<li><p>인덱스 값이 length보다 작을 때까지 리스트의 item에 유저가 원하는 item이 있는지 확인하고 있으며, True, 없으면 False를 반환한다.</p>
</li>
</ul>
<p><strong>&lt;pop과 append의 설명 그림&gt;</strong></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/e15ea182-b7e3-4af6-8a52-4c746efe2f74/image.png" alt=""></p>
<h3 id="sorted-list">Sorted List</h3>
<ul>
<li><p>Sorted List : 리스트의 아이템이 정렬의 기준(key)을 가지고 의미 있는 관계로 배열된 리스트를 뜻한다.</p>
<ul>
<li>Key : 정렬의 기준이자 논리적 순서를 결정하는 속성이다. ex). 나이, 성별...</li>
</ul>
</li>
</ul>
<h3 id="sorted-list-동작설명">Sorted List 동작설명</h3>
<ul>
<li><p>insertItem()</p>
<ul>
<li><p>추가하고자 하는 Item의 적절한 위치를 찾아낸다. --&gt; N번 가정</p>
</li>
<li><p>한칸씩 나중 item들의 위치를 옮겨준다. --&gt; N-K라 가정</p>
</li>
<li><p>사용자가 원하는 아이템을 추가해서 넣는다. --&gt; 1</p>
</li>
<li><p>리스트의 length값에 1을 더해준다. --&gt; 1</p>
</li>
<li><p>시간 복잡도 : O(2N + 2 - K) = O(2N) = O(N)</p>
</li>
</ul>
</li>
<li><p>finditem()</p>
<ul>
<li><p>기본적인 동작 : 선형탐색</p>
</li>
<li><p>리스트의 모든 Item들을 하나씩 비교해가며, 찾아본다.</p>
<ul>
<li>시간 복잡도는 O(N)이다.</li>
</ul>
</li>
<li><p>이게 최선의 방법(선형탐색)일까?</p>
<ul>
<li>search scope(검색 범위)를 좁히면 개선되지 않을까?</li>
</ul>
</li>
<li><p>Binary Search (이진 탐색)</p>
<ul>
<li><p>Mid : 리스트의 중앙값(길이 length의 절반 인덱스의 위치하는 값)</p>
</li>
<li><p>First : 리스트의 처음 값, Last : 리스트의 맨 마지막 값.</p>
</li>
<li><p>찾는 값이 중앙값보다 작으면 Last = Mid - 1로 재설정한다.</p>
</li>
<li><p>찾는 값이 중앙값보다 크면 Last = Mid + 1로 재설정한다.</p>
</li>
<li><p>이런 식으로 반복하다 First가 Last보다 큰 경우일 경우 False로 리턴한다.</p>
</li>
</ul>
</li>
<li><p>Binary Search는 얼마나 개선되었는가?</p>
<ul>
<li><p>length가 1000이라면 최악의 경우에도 약 10번의 계산이 걸린다.</p>
</li>
<li><p>2^k = N --&gt; K = log(N) // (2는 생략 가능)</p>
</li>
<li><p>선형일 경우 1000번 걸릴 것이 10번으로 줄어들었다. 100배의 효과.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="big---o-비교리스트의-동작">Big - O 비교(리스트의 동작)</h3>
<table>
<thead>
<tr>
<th>Operation</th>
<th align="left">Unsorted</th>
<th align="center">Sorted</th>
</tr>
</thead>
<tbody><tr>
<td>size( )</td>
<td align="left">O( 1 )</td>
<td align="center">O( 1 )</td>
</tr>
<tr>
<td>isFull( ) / isEmpty( )</td>
<td align="left">O( 1 )</td>
<td align="center">O( 1 )</td>
</tr>
<tr>
<td>clear( )</td>
<td align="left">O( 1 )</td>
<td align="center">O( 1 )</td>
</tr>
<tr>
<td>getItem(int pos)</td>
<td align="left">O( 1 )</td>
<td align="center">O( 1 )</td>
</tr>
<tr>
<td>appendItem(ItemType Value)</td>
<td align="left">O( 1 )</td>
<td align="center">X</td>
</tr>
<tr>
<td>updateItem(int pos, ItemType Value)</td>
<td align="left">O( 1 )</td>
<td align="center">X</td>
</tr>
<tr>
<td>findItem( )</td>
<td align="left">O( N )</td>
<td align="center">O(N) - linear // O(logN) - binary</td>
</tr>
<tr>
<td>insertItem( )</td>
<td align="left">O( 1 )</td>
<td align="center">O(N)</td>
</tr>
<tr>
<td>removeItem( )</td>
<td align="left">O( N )</td>
<td align="center">O(N)</td>
</tr>
</tbody></table>
<h3 id="추가-개념">추가 개념</h3>
<ul>
<li><p>ADT의 동작 방식 기본 개념</p>
<ul>
<li><p>Constructor : ADT의 새로운 object를 만든다.</p>
</li>
<li><p>Transformer : object의 하나 이상의 데이터 값의 상태를 변경한다.</p>
</li>
<li><p>Observer : object의 변형없이 데이터의 상태를 관찰한다.</p>
</li>
</ul>
</li>
<li><p>Class Constructor</p>
<ul>
<li><p>class가 만들어질때, 암묵적으로 호출되는 특별한 멤버 함수이다.</p>
</li>
<li><p>리턴할 value의 type가 없다.</p>
</li>
<li><p>한 class는 여러개의 constructor들을 가질 수 있다.(overloading)</p>
</li>
<li><p>파라메타가 없는 constructor가 기본 설정이다.</p>
</li>
</ul>
</li>
<li><p>Time Complexity (시간 복잡도)</p>
<ul>
<li><p>효율적인 프로그램이란?</p>
<ul>
<li><p>시간을 더 짧게 사용하고, 컴퓨터 자원을 더 적게 사용하는 것이 효율적이다.</p>
</li>
<li><p>계산(computations)이 많을 수록 시간이 더 많이 걸린다.</p>
</li>
</ul>
</li>
<li><p>Big - O 표기법</p>
<ul>
<li><p>흔히 시간복잡도를 계산할 때, 최악의 경우를 산정하고 계산한다.</p>
</li>
<li><p>규칙1 : 앞의 계수는 무시한다. -&gt; O(2N) = O(N) // O(2) = O(1)</p>
</li>
<li><p>규칙2 : 작은 단위는 무시한다. -&gt; O( N + 1 ) = O( N )</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>&lt;Big - O 표기법 그래프 비교&gt;</strong></p>
<p>   <img src="https://velog.velcdn.com/images/second_ho_jun/post/ca14b7a9-5b94-45e3-bed0-24f1e2851c39/image.png" alt=""></p>
<p><strong>&lt;Big - O 표기법 그래프 설명&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/08e2a7ed-9629-4e19-bb96-770e7b98259b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 chapter 1 : basics]]></title>
            <link>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-1-basics</link>
            <guid>https://velog.io/@second_ho_jun/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-chapter-1-basics</guid>
            <pubDate>Fri, 06 Mar 2026 11:16:45 GMT</pubDate>
            <description><![CDATA[<h3 id="what-is-abstraction-추상화란-무엇인가">What is abstraction? (추상화란 무엇인가?)</h3>
<blockquote>
<p>추상화(abstraction)이란, 시스템의 viewer의 관점에서 필수적인 세부사항들만 포함하고 있는, 복잡한 시스템의 모델이다.</p>
</blockquote>
<blockquote>
<p>즉, 프로그램들은 추상화이다. -&gt; 우린 프로그램이 무엇(what)인지 알아도, 어떻게 동작하는 지는 모른다.</p>
</blockquote>
<h3 id="abstract-data-typeadt">Abstract Data Type(ADT)</h3>
<blockquote>
<p>자료 자체의 형태와 그 자료에 관계된 연산들을 수학적으로만 정의한 것.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/d15b31f7-bc6d-4654-bd45-b64afdee0d7c/image.png" alt=""></p>
<ul>
<li>ADT는 DATA + Operations로, 어떤 형태로 보관하고, 어떻게 접근하며 검색하고 계산할지에 대한 것이다.</li>
</ul>
<h3 id="예시-python---list">예시 Python - list</h3>
<pre><code>test = []

test.append(1)
test.append(3)
test.append(5)

print(test)

test.remove(5)

print(test)</code></pre><blockquote>
<p>test라는 리스트의 요소들이 어떻게 출력될지 예상이 되는가?
=&gt; [1,3,5] // [1,3] 이렇게 출력이된다.</p>
</blockquote>
<blockquote>
<p>하지만 test라는 리스트의 요소들이 어떻게 리스트에 추가되고, 빼지는지 동작 상으로 알 수 있는가? 
=&gt; 모른다. 그저, 함수를 통해 리스트의 자료를 추가하고 뺄 뿐이다.</p>
</blockquote>
<ul>
<li><p>그렇다면 리스트와 같이 자료가 어떻게 넣어지고 빼지는 지 동작에 대해 일일이 알아야하는가?</p>
<ul>
<li><p><strong>아니!!</strong> <strong>그럴 필요없다!!!</strong></p>
</li>
<li><p>우린 이미 동작하는 방식을 알고 있다. 어떻게 동작하는지를 모를 뿐이다.</p>
</li>
<li><p>자동차를 몰기 위해서 자동차 엔진이 어떻게 바퀴를 굴리는지 알 필요가 있는가?</p>
</li>
</ul>
</li>
</ul>
<h3 id="information-hiding-정보은닉">Information Hiding (정보은닉)</h3>
<blockquote>
<p> 객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법. / 필수적인 것에만 접근하도록 허용하고 나머진에는 접근을 금한다.</p>
</blockquote>
<blockquote>
<p>오로지, public 상호작용과 방식으로만 접근이 허용된다.</p>
</blockquote>
<blockquote>
<p>캡슐화(encapsulation)과 유사하다.</p>
</blockquote>
<ul>
<li>방금전 리스트를 떠올려보아라.</li>
</ul>
<pre><code>    test = []

    test.append(1)
    test.append(3)
    test.append(5)

    print(test)

    test.remove(5)

    print(test)
</code></pre><ul>
<li>실제 test 리스트가 어떻게 동작하는가?</li>
</ul>
<pre><code>    typedef struct {

        PyObject_VAR_HEAD
        PyObject **ob_item;
        Py_ssize_t allocated;
    } PyListObject
</code></pre><h4 id="--우린-실제로-ob_item에-접근할-수도-수정할-수도-없다--information-hiding">-&gt; 우린 실제로 **ob_item에 접근할 수도, 수정할 수도 없다. : Information Hiding</h4>
<h3 id="data-structure">Data Structure</h3>
<blockquote>
<p>자료구조란, 대량의 데이터를 효율적으로 저장, 조직, 관리, 수정하기 위해 논리적 규칙에 따라 데이터를 배치하는 구조를 뜻한다.</p>
</blockquote>
<ul>
<li><p>자료구조의 특징들</p>
<ul>
<li><p>여러 데이터들의 집합체인 만큼 구성 요소로 분해될 수 있다.</p>
</li>
<li><p>각각의 요소들을 어떻게 배치하냐에 따라, 접근 방식이 달라진다.</p>
</li>
<li><p>배치와, 그들에게 접근하는 방식은 캡슐화가 되어있다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="composite-data-type-복합-데이터">Composite Data Type (복합 데이터)</h3>
<blockquote>
<p>복합 데이터란, 각각의 데이터 구성요소가 하나의 변수 이름 아래에 저장될 수 있는 데이터 타입을 의미한다.</p>
</blockquote>
<blockquote>
<p>개별 데이터 요소들을 접근하는 것을 허용한다</p>
</blockquote>
<ul>
<li><p>예시</p>
<ul>
<li><p>Array (structured) - homogenous</p>
</li>
<li><p>Class (unstructured) - unhomogenous </p>
</li>
<li><p>Struct (unstructured) - unhomogenous</p>
</li>
</ul>
</li>
</ul>
<h3 id="memory-allocation">Memory Allocation</h3>
<ul>
<li><p>우리가 사용하는 PC는 어떻게 프로그램을 돌리는 것인가?</p>
<h3 id="memory-allocation---variables">Memory Allocation - Variables</h3>
<blockquote>
<p>프로그램이 실행될 때, 운영체제는 자동적으로 프로그램이 필요한 메모리를 할당해준다.</p>
</blockquote>
<blockquote>
<p>object가 만들어진다면, 멤버들을 위한 메모리 공간이 할당된다.</p>
</blockquote>
<h4 id="--이때-이-메모리를-보다-효율적이고-안정적으로-프로그램이-돌아갈-수-있도록-최적화된-메모리-운영방식에-자료-구조개념이-필요하다">-&gt; 이때 이 메모리를 보다 효율적이고, 안정적으로 프로그램이 돌아갈 수 있도록 최적화된 메모리 운영방식에 &#39;자료 구조&#39;개념이 필요하다.</h4>
</li>
</ul>
<p>============================================================</p>
<h3 id="추가-개념">추가 개념</h3>
<h3 id="one---dimensional-array">One - Dimensional Array</h3>
<ul>
<li><p>1차원 배열은 유한한 크기의 특정 데이터만 저장이 가능하다.</p>
</li>
<li><p>각 요소들의 위치는 직접적으로 접근이 가능하다. (인덱스 개념 사용)</p>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/d65994a4-c35a-4641-8df7-a011d7d6aee9/image.png" alt=""></p>
</li>
<li><p>Address[index] = BaseAddress + Index * Size Of Element</p>
</li>
<li><p>BaseAdress는 첫 번째 요소의 메모리 위치이다.</p>
</li>
</ul>
<h3 id="two---dimensional-array">Two - Dimensional Array</h3>
<ul>
<li><p>2차원 배열은 유한한 크기의 특정 데이터만 저장이 가능하다.</p>
</li>
<li><p>각 요소들의 위치는 직접적으로 접근이 가능하다. (인덱스 개념 사용)</p>
</li>
<li><p>각각의 위치는 행과 열의 개념으로 한 쌍의 인덱스의 값이 저장되어 사용된다.</p>
</li>
</ul>
<p><img src="blob:https://velog.io/359b14cf-0727-4aee-8ffd-c4e3b5e52221" alt="업로드중.."></p>
<ul>
<li><p>메모리에선 2차원 배열이 선형으로 일직선 형태로 저장된다.</p>
</li>
<li><p>Address[row][col] = BaseAddress + (row x column 길이&#39; + guswo colmun) x Size Of Element</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Project Planning & Management]]></title>
            <link>https://velog.io/@second_ho_jun/Project-Planning-Management</link>
            <guid>https://velog.io/@second_ho_jun/Project-Planning-Management</guid>
            <pubDate>Thu, 05 Mar 2026 03:06:38 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="man---month">Man - Month</h3>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/f580e071-2800-4b36-8eab-e38477266ee5/image.png" alt=""></p>
<blockquote>
<p>Man - Month : 사람(man)수를 달(month)수로 계산한 값.
즉, 어떤 업무를 수행함에 있어 필요한 사람의 수에 대한 측정치.
-&gt; 사람들의 실력은 동일하고 노동의 강도는 동일하다는 가정.</p>
</blockquote>
<ul>
<li><p>Man - Month가 높을 수록 프로젝트의 성공률과 속도가 향상되는가?</p>
<ul>
<li>절대로 아니다. 오히려 악영향을 미칠 수 있다.</li>
</ul>
<h3 id="man---month의-역설">Man - Month의 역설</h3>
</li>
<li><p>Brooks의 법칙에 따르면 manpower을 추가할 수록 프로젝트는 더 늦게 출시된다.</p>
</li>
<li><p>이유 :</p>
<ul>
<li><p>사람을 추가 투입하면 그에 따른 새로 추가 투입된 사람들(개발자)에 필요한 준비과정, 비용 등이 많이 소모되기 때문이다.</p>
</li>
<li><p>공식 : n(n-1)/2 - 그룹간 상호 커뮤니케이션 공식</p>
</li>
</ul>
</li>
</ul>
<h3 id="no-silver-bullet">No silver bullet</h3>
<ul>
<li><p>한 번에 해결할 수 있는 수단 및 방법은 없다.</p>
</li>
<li><p>지속적인 개발과 유지보수가 필요하다는 의미이다.</p>
</li>
</ul>
<h3 id="the-second---system-effect">The second - system effect</h3>
<ul>
<li>개발자들의 특성에 대한 내용으로, 개발자들은 기존의 시스템을 개선 시킬 때 over-engineering을 한다.</li>
</ul>
<h3 id="irreducible-number-of-errors">Irreducible number of errors</h3>
<ul>
<li><p>개발자들은 개발할때 버그에 대한 두려움을 잊어야한다.</p>
</li>
<li><p>개발하면서 버그가 0개일 순 없다. -&gt; 받아들여야할 버그는 받아들여라.</p>
</li>
</ul>
<h3 id="conceptual-integrity">Conceptual integrity</h3>
<ul>
<li><p>설계 철학을 위배해선 안되고, 모두 일관되게 생각하고 행동하라.</p>
</li>
<li><p>아무리 혁신적인 아이디어가 도출되었다 하더라도, 그것이 전체 프로젝트의 설계 철학에 위배된다면 받아들여서는 안된다.</p>
</li>
</ul>
<h3 id="the-manual">The manual</h3>
<ul>
<li><p>최고 설계자는 시스템의 설명사항에 대한 메뉴얼을 만들어놔야한다.</p>
</li>
<li><p>그리고 이러한 메뉴얼은 시스템의 외부 설명도 상세히 명시되어야한다.</p>
</li>
</ul>
<h3 id="the-pilot-system">The pilot system</h3>
<ul>
<li><p>본격적인 본 시스템(Final System)을 구축하기 전, 제한된 범위에서 핵심 기능과 구조를 실제와 유사한 환경에서 시험적으로 구축하여 운영해보는 과정이다.</p>
</li>
<li><p>시장에 전시할 상용프로그램을 한 번에 만들 수 없으니, 작은 단계에서 천천히 사용 단계까지 이끌어가자.</p>
</li>
</ul>
<h3 id="formal-documents">Formal documents</h3>
<ul>
<li><p>모든 프로젝트 매니저는 반드시 작더라도, 핵심적인 공식 문서를 만들어야한다.</p>
</li>
<li><p>이 공식 문서에는 프로젝트 목적, 어떻게 목적을 성취했는지, 누가 성취할 것인지 언제 성취할 것인지, 비용은 얼마나 드느지에 대한 내용을 포함해야한다.</p>
</li>
</ul>
<h3 id="project-estimation">Project estimation</h3>
<ul>
<li>프로젝트를 완성하는데 걸리는 시간 및 비용을 계산하거나, 견적을 낼때 개발자는 최소 3배 이상의 비용과 시간이 걸린다는 것을 감안하고 계획해야한다.</li>
</ul>
<h3 id="communication">Communication</h3>
<ul>
<li><p>재앙(불협화음)을 피하기 위해선 팀간의 의사소통은 덧없이 중요하다.</p>
</li>
<li><p>자신의 부족함이 무엇인지 알리고, 팀원 간의 얘기를 많이 해서 서로가 필요한 부분에 적재적소 들어가 도움을 주고 받아라.</p>
</li>
</ul>
<h3 id="the-surgical-team소방수-팀">The surgical team(소방수 팀)</h3>
<ul>
<li><p>프로젝트를 진행함에 있어 반드시, 심각한 문제가 발생하는 구간이 있다.</p>
</li>
<li><p>그런 상황에 급히 소방수팀(surgical team)을 투입시켜라. 그들은 일반적인 프로그래머에 비해 실력이 월등히 높은 사람들로 선별하라.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Opensource Lincense]]></title>
            <link>https://velog.io/@second_ho_jun/Opensource-Lincense</link>
            <guid>https://velog.io/@second_ho_jun/Opensource-Lincense</guid>
            <pubDate>Tue, 03 Mar 2026 03:01:00 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="오픈소스의-정의">오픈소스의 정의</h3>
<blockquote>
<p>오픈소스란 라이선스 방식을 통해 배포된 소스 코드를 자유롭게 복사, 수정, 사용, 재배포 할 수 있는 소프트웨어를 지칭함.</p>
</blockquote>
<blockquote>
<p>오픈소스는 누구라도 버그를 수정하거나, 코드를 개조하여 기능을 추가할 수 있으며, 소프트웨어 개발에 참여할 수 있음</p>
</blockquote>
<blockquote>
<p>오픈소스는 개발자에게 프로그램 배포 권리, 소스코드 접근 권리, 소스 코드 수정 권리를 제공함</p>
</blockquote>
<h3 id="오픈소스-선택-시-고려-사항">오픈소스 선택 시 고려 사항</h3>
<ul>
<li><p>품질</p>
<ul>
<li><p>기능, 성능, 호환성 등 오픈소스의 품질은 오픈소스를 선택하는데 가장 중요한 요소이다.</p>
</li>
<li><p>Github에 호스팅하는 프로젝트라면, Star수, Fork수로 오픈소스의 완성도를 가늠할 수 있다.</p>
</li>
<li><p>오픈 소스를 사용하려는 기술 조직은 당연히 충분한 기능과, 성능 검증을 수행한 후 제품/서비스에 도입해야한다.</p>
</li>
</ul>
</li>
<li><p>커뮤니티</p>
<ul>
<li>커뮤니티는 오픈소스가 얼마나 많은 사용자를 보유하는지, Issue 관리는 이루어지는지, 지속적으로 업데이트를 하는 지 등 커뮤니티 활성화 여부.</li>
</ul>
</li>
<li><p>문서화</p>
<ul>
<li><p>오픈소스를 적절히 도입하고 유지보수하기 위해 프로젝트가 얼마나 문서를 충실하게 제공되는지 확인.</p>
</li>
<li><p>문서화가 잘 된 프로젝트의 산출물은 기업이 도입하는데 수월.</p>
</li>
</ul>
</li>
<li><p>보안 취약점</p>
<ul>
<li><p>오픈소스 보안 취약점이 알려진 오픈소스는 사용해선 안됨.</p>
</li>
<li><p>보안 취약점이 발견된 오픈소스의 버전은 CVE 등 데이터베이스에서 관리.</p>
</li>
</ul>
</li>
<li><p>라이선스</p>
<ul>
<li><p>오픈소스 라이선스는 소프트웨어를 누구나 자유롭게 사용할 수 있는 권리르 부여하는 허가증.</p>
</li>
<li><p>대부분의 라이선스는 오픈소스를 재배포시 준수해야할 의무사항을 요구.</p>
</li>
</ul>
</li>
</ul>
<h3 id="오픈소스-법적-책임">오픈소스 법적 책임</h3>
<blockquote>
<p>오픈소스에 대한 법적 책임과 이에 따른 위험을 제대로 숙지하지 못할 경우, 사용권리 박탈과 제품을 판매 불가할 수 있음.</p>
</blockquote>
<h3 id="오픈소스-라이선스">오픈소스 라이선스</h3>
<blockquote>
<p>일반 상용소프트웨어와 마찬가지로 오픈소스에도 저작권 등 지식 재산권이 있으며, 권리자의 허락 없이 함부로 사용하면 소송을 당할 수 있다.</p>
</blockquote>
<blockquote>
<p>오픈소스 권리자들은 많은 사람들이 사용할 수 있도록, 광범위한 라이선스 부여.</p>
</blockquote>
<h3 id="오픈소스-라이선스의-주요-의무-사항">오픈소스 라이선스의 주요 의무 사항</h3>
<ul>
<li><p>저작권 표시 및 라이선스 고지</p>
<ul>
<li>개발자 또는 기여자에 관한 사항과 저작권에 관한 사항을 제품에 표시하거나, 포함하도록 요구한다. </li>
<li>이용자들이 오픈 소스에 관한 권리를 잘 이해할 수 있도록 배포자로 하여금 해당 라이선스의 사본을 함께 첨부할 것을 요구하고 있다.</li>
</ul>
</li>
<li><p>소스코드 공개</p>
<ul>
<li>대표적인 GPL계열의 라이선스는 바이너리 형태로의 소프트웨어 배포를 허용하는 대신, 바이너리에 해당하는 소스코드를 함께 공개할 것을 요구한다.</li>
</ul>
</li>
<li><p>재배포시 동일 라이선스 적용</p>
<ul>
<li>라이선스에 따라 큰 차이를 보이는 부분은 &#39;Copyleft&#39;사항이다. 수정된 소프트웨어도 동일한 Lincense로 배포할 것을 요구한다.</li>
</ul>
</li>
</ul>
<h3 id="오픈소스-라이선스-명시">오픈소스 라이선스 명시</h3>
<ul>
<li>소스 코드 파일 상단의 주석</li>
<li>오픈소스 소프트웨어 내 License파일</li>
<li>오픈소스 전용 웹사이트를 통한 라이선스 공개</li>
</ul>
<h3 id="여러가지-오픈소스-라이선스">여러가지 오픈소스 라이선스</h3>
<ul>
<li><p>아무조건 없이 사용할 수 있는 라이선스</p>
<ul>
<li><p>예시</p>
<ul>
<li><p>Creative Commons Zero v1.0 Universal (CC0-1.0)</p>
</li>
<li><p>The Unlicense (Unlicense)</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Permissive License</p>
<ul>
<li><p>오픈소스 라이선스의 고지 의무가 있으며, 비교적 수월하게 준수할 수 있다.</p>
</li>
<li><p>예시</p>
<ul>
<li><p>Apache License 1.1 (Apache-1.1)</p>
</li>
<li><p>Apache License 2.0 (Apache-2.0)</p>
</li>
<li><p>BSD 2-Clause &quot;Simplified&quot; License (BSD-2-Clause)</p>
</li>
<li><p>BSD 3-Clause &quot;New&quot; or &quot;Revised&quot; License (BSD-3-Clause)</p>
</li>
<li><p>Json License (JSON)</p>
</li>
<li><p>Microsoft Public License (MS-PL)</p>
</li>
<li><p>PostgreSQL License (PostgreSQL)</p>
</li>
<li><p>zlib License (zlib)</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>주의가 필요한 Copyleft 라이선스</p>
<ul>
<li><p>GPL(GNU General Public License)은 오픈소스 재배포 시 소스 코드 공개를 요구함.</p>
</li>
<li><p>Copyleft 라이선스 유형은 오픈소스 라이선스 중에 요구하는 의무사항이 가장 많은 라이선스 유형이기 때문에 주의가 필요함.</p>
</li>
<li><p>소스 코드를 직접 제공하거나, 사용자가 요청시 소스 코드를 제공하겠다는 서면 약정서를 제공.</p>
</li>
<li><p>예시</p>
<ul>
<li><p>GNU General Public License v2.0 (GPL-2.0)</p>
</li>
<li><p>GNU General Public License v3.0 (GPL-3.0)</p>
</li>
</ul>
</li>
<li><p>우회방법</p>
<ul>
<li><p>자사 코드 분리 방법 : Copyleft라이선스 유형의 라이선스가 적용된 오픈소스는 개발자가 소속한 회사가 배포하는 제품에 포함시 주의해야한다.</p>
</li>
<li><p>따라서 오픈소스는 설계 단계에서 Build시 자사 소프트웨어와 통합되지 않고 Runtime에도 독립된 프로세스로 동작하도록 한다.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Weak Copyleft 라이선스</p>
<ul>
<li><p>Weak Copyleft는 Copyleft 유형의 라이선스에 비해 공개 범위가 약하다.</p>
</li>
<li><p>우회방법</p>
<ul>
<li><p>LGPL Library - Dynamic Link 사용</p>
</li>
<li><p>LGPL도 재배포시 소스 코드 공개를 요구함. </p>
</li>
<li><p>하지만 Library형태의 LGPL하의 오픈소스를 Link형태로 결합할 경우, LGPL Library 부분만 소스 코드를 공개하면 되고, 결합하는 코드는 공개 의무가 없다.</p>
</li>
</ul>
</li>
<li><p>예시</p>
<ul>
<li><p>GNU Lessor General Public License v2.0 (LGPL-2.1)</p>
</li>
<li><p>GNU Lessor General Public License v3.0 (GPL-3.0)</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>사용 제한 라이선스</p>
<ul>
<li><p>비상업용 라이선스</p>
<ul>
<li>연구, 학습 만을 위해서라고 해도 영리 회사 내에서 사용한다면 상업적인 활동으로 간주.</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code> - 예시

   - Creative Commons Attribution Non Commercial 4.0 International (CC-BY-NC-4.0)


 - Network 서비스 제한 라이선스

   - Network 서비스도 배포로 간주하여 의무사항 준수를 요구.

   - Network 서비스를 제공하는 서버에 AGPL로 공개된 오픈소스가 포함되어 있을 경우, 소프트웨어를 배포하지 않아도, AGPL 오픈소스 뿐 아니란 다른 소프트웨어의 소스코드까지 공개해야함.

 - 예시

   -  GNU Affero Genral Public License v3.0 (AGPL-3.0)


 - 광고 조항 포함 라이선스

   - 오픈소스의 기능,활용을 언급하는 모든 광고에 특정 문구를 포함..</code></pre><ul>
<li><p>소스코드 제공 의무 유형</p>
<ul>
<li><p>Work Based on the Code</p>
<ul>
<li><p>제공의무 : 원 저작물의 소스코드를 원본 그대로, 혹은 수정하여 새로운 SW에 포함하였을 경우</p>
</li>
<li><p>제공범위 : 원 저작물의 소스코드가 포함되어, 파생 저작물로 인정되는 범위내의 모든 소스코드</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code> - Derivative Work

   - 제공의무 : 원 저작물의 소스코드를 수정하여 사용한 경우 제공의무가 존재하며, 수정 없이 그대로 사용하였을 경우에는 소스코드를 제공하지 않아도 됨

   - 제공범위 : 원 저작물의 사용함에 있어, 수정을 거쳤을 경우, 원 저작물의 소스코드에서 부터 존재하던 파일을 모두 공개.


 - File

   - 제공의무 : 원 저작물의 소스코드를 원본 그대로, 혹은 수정하여 새로운 SW에 포함하였을 경우.

   - 제공범위 : 원 저작물의 사용함에 있어, 수정을 거쳤을 경우, 원 저작물의 소스코드에서 부터 존재하던 파일 중 수정된 부분을 포함하는 파생 저작물을 모두 공개.


 - Module

   - 제공의무 : 원 저작물의 소스코드를 원본 그대로, 혹은 수정하여 새로운 SW에 포함하였을 경우.

   - 제공범위 : 원 저작물의 사용함에 있어, 수정을 거쳤을 경우, 원 저작물의 소스코드에서 부터 존재하던 파일 중 수정된 부분을 포함하는 모듈을 모두 공개.


 - File Derivative Work

   - 제공의무 : 원 저작물의 소스코드를 수정하여 사용한 경우 제공의무가 존재하며, 수정 없이 그대로 사용하였을 경우에는 소스코드를 제공하지 않아도 됨.

   - 제공범위 : 원 저작물의 소스코드에서부터 존재하던 파일 중 &#39;수정된 부분을 파일 단위&#39;로 공개.

 - Module Derivative Work

   - 제공의무 : 원 저작물의 소스코드를 수정하여 사용한 경우 제공의무가 존재하며, 수정 없이 그대로 사용하였을 경우에는 소스코드를 제공하지 않아도 됨.

   - 제공범위 : 원 저작물의 소스코드에서부터 존재하던 파일 중 &#39;수정된 부분을 모듈 단위&#39;로 공개.</code></pre><ul>
<li><p>대표적인 오픈소스 라이선스     </p>
<ul>
<li><p>Apache License</p>
<ul>
<li><p>아파치소프트웨어재단이 본인들의 SW에 적용하기 위해 만든 라이선스</p>
</li>
<li><p>소스코드 공개 의무같은 의무사항은 없지만, 아파치 라이선스 소스코드를 수정해 배포하는 경우 &quot;아파치 라이선스 버전 2.0&quot;을 꼭 포함시키고, 아파치 재단에서 만든 소프트웨어임을 밝혀야 함.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>- GNU(Gnu is Not Unix) General Public License(GPL)

   - 자유소프트웨어재단에서 만든 라이선스

   - 카피레프트 조항을 포함하고 있다.

   - GPL 프로그램은 어떤 목적으로, 어떤 형태로든 사용할 수 있지만 사용하거나 변경된 프로그램을 배포하는 경우 무조건 동일한 라이선스 즉, GPL로 공개.

 - GNU Affero GPL(AGPL)

   - GPL을 기반으로 만든 라이선스로 버전 1,2,는 아페로, 가장 최신버전인 3은 자유소프트웨어재단에 의해 개발.

   - 서버에서 프로그램을 실행해 다른 사용자들과 통신하면, 실행되고 있는 프로그램의 모든 소스코드를 사용자들이 다운로드 할 수 있게 해야한다는 조항을 포함.

 - GNU Lesser GPL(LGPL)

   - 좋은 자유 소프트웨어 제품이 더 많이 쓰이고, 표준이 되도록 유도하기 위해 단순한 라이브러리 모듈 링크를 허용한 라이선스.

   - 너무 강력한 철학이 담긴 GPL의 카피레프트 조항을 보완하기 위해 만든 라이선스로 자유소프트웨어를 지향하짐만 GPL이 오히려 자유소프트웨어의 철학을 훼손한다는 생각에서 나온 라이선스.

   - LGPL 라이브러리를 정적 링크하는 애플리케이션을 배포하는 경우에는 LGPL 라이브러리의 소스코드와, 애플리케이션의 오브젝트 코드도 공개해야한다.

   - LGPL 라이브러리를 동적 링크하는 애플리케이션을 배포하는 경우에는 LGPL 라이브러리의 소스코드를 공개해야한다. 하지만 애플리케이션의 오브젝트 코드도 공개할 필요는 없다.

 - Mozila Public License (MPL)

   - 모질라 공용 허가서는 과거 넷스케이프 웹브라우저의 소스코드를 공개하기 위해 개발된 라이선스.

   - MPL의 특징은 소스코드와 실행파일의 저작권을 분리했다는 부분이 있다.


 - MIT License

   - MIT에서 개발한 라이선스로, 라이선스와 저작권 관련 명시만 지켜주면 되는 라이선스이며, 가장 느슨한 조건을 가진 라이선스 중 하나이다.

 - Berkeley Software Distribution(BSD) License

   - 버클리 캘리포니아 대학에서 배포하는 공개 SW라이선스.

   - 공공기관에서 만들어낸 것으로 공익성이 강하다. 따라서 아무런 제한 없이 누구나 자신의 용도에 사용할 수 있다.

   - 라이선스 및 저작권 표시 조건 외엔 제약이 없는 굉장히 자유로운 라이선스 중 하나이다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Design Pattern]]></title>
            <link>https://velog.io/@second_ho_jun/Design-Pattern</link>
            <guid>https://velog.io/@second_ho_jun/Design-Pattern</guid>
            <pubDate>Fri, 27 Feb 2026 07:19:19 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="design-pattern이란-무엇인가">Design Pattern이란 무엇인가?</h3>
<blockquote>
<p>Design Pattern이란, Product-ability와 Reliability를 높이기 위한 Re-usability이다.
여기서 Re-usability의 범위는 언어, 표준 라이브러리, 오픈 소스 등의 다양한 범위를 가진다.</p>
</blockquote>
<h3 id="software-design-pattern">Software Design Pattern</h3>
<ul>
<li><p>일반적으로, 흔히 발생하는 문제를 주어진 맥락에서 해결할 수 있도록 하는 재사용가능한 해결책이다.</p>
</li>
<li><p>디자인 패턴은, 사용자(개발자)가 application이나, system을 설계할 때 발생하는 문제를 해결하기 위한 최고의 방법들이다.</p>
</li>
<li><p>Design Pattern은 computer Programming에 있어서 구조화된 접근 방식이다.</p>
</li>
</ul>
<h3 id="object-oriented-design-pattern">Object-Oriented Design Pattern</h3>
<blockquote>
<p>클래스들과 Objects들 사이에 관계 혹은 상호작용들을 보여준다.</p>
</blockquote>
<ul>
<li>여러 가지의 OOD Pattern
<img src="https://velog.velcdn.com/images/second_ho_jun/post/8148232e-e7a8-426b-ba0c-b540be210809/image.png" alt=""></li>
</ul>
<h4 id="adapter-pattern">Adapter Pattern</h4>
<ul>
<li><p>Adapter design pattern은 다음과 같은 문제를 해결해준다. (예시)</p>
<ul>
<li>client가 원하는 인터페이스를 어떻게 재사용할 수 있을까?</li>
<li>인터페이스 작업을 어떻게 상호 연결할 수 있을까?</li>
</ul>
</li>
<li><p>한 클래스의 인터페이스(Adaptee)를 클라이언트에서 사용하고자하는 다른 인터페이스(Target)로 변환한다.</p>
<ul>
<li><p>이렇게 할 경우 인터페이스를 다시 만들 필요 없이 간단하게 전환하여 재사용이 가능하다.</p>
</li>
<li><p>Adapter Pattern 그림 (UML)
<img src="https://velog.velcdn.com/images/second_ho_jun/post/9acbf2cd-d312-494a-a5c3-80e9f6332ada/image.png" alt=""></p>
</li>
<li><p>UML이란? (Unified Modeling Language)</p>
<blockquote>
<p>소프트웨어 집약 시스템의 구조와 행동을 시각적으로 명세화, 설계, 문서화하는 표준화된 범용 모델링 언어.</p>
</blockquote>
</li>
<li><p>선의 의미</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/77865e9a-1928-4d4f-bb6b-411d383bf04b/image.png" alt=""></p>
</li>
</ul>
<h4 id="facade-pattern">Facade Pattern</h4>
<ul>
<li><p>복잡한 클래스 라이브러리에 대해 사용하기 편하게 간편한 인터페이스(API)를 구성하기 위한 구조 패턴이다.</p>
</li>
<li><p>Facade Pattern은 다음과 같을 때 사용한다.</p>
<ul>
<li>시스템이 너무 복잡하다.</li>
<li>간단한 인터페이스를 통해 복잡한 시스템을 접근하고자 한다.</li>
<li>시스템을 사용하고 있는 외부와 결합도가 너무 높을 때 의존성 낮출 것이다.</li>
</ul>
</li>
<li><p>Facade 장점 </p>
<ul>
<li><p>하위 시스템의 복잡성에서 코드를 분리하여, 외부에서 시스템을 사용하기 간단해진다.</p>
</li>
<li><p>하위 시스템 간의 의존 관계가 많을 경우 이를 감소시키고 의존성을 한 곳으로 모을 수 있다.</p>
</li>
<li><p>복잡한 코드를 감춤으로써, 클라이언트가 시스템의 코드를 모르더라도 Facade 클래스만 이해하고 사용 가능하다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/6c9d3811-8525-47c2-a23a-963eeff24cdb/image.png" alt=""></p>
</li>
</ul>
<h4 id="decorator-pattern">Decorator Pattern</h4>
<ul>
<li><p>대상 객체에 대한 기능 확장이나 변경이 필요할때 객체의 결합을 통해 서브클래싱을 사용할 수 있다.</p>
</li>
<li><p>이러한 Decorator Pattern은 동적 할당하며, 실시간 동안 추가되거나 삭제되어야한다.</p>
</li>
<li><p>Decorator Pattern 장점</p>
<ul>
<li><p>서브클래스를 만들때보다 훨씬 더 유연하게 기능을 확장가능.</p>
</li>
<li><p>객체를 여러 데코레이터로 래핑하여 여러 동작을 결합.</p>
</li>
<li><p>컴파일 타임이 아닌 런타임에 동적으로 기능을 변경. </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/89a8a674-ce9f-4c4d-b83f-e1effb367793/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>Decorator Pattern의 대표적 예시 : 게임</p>
<ul>
<li><p>무기 및 아이템 강화 </p>
</li>
<li><p>캐릭터 버프 및 상태 이상</p>
<ul>
<li>이러한 요소들을 통해, 각각의 클래스를 따로 구현할 필요성이 사라진다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="design-pattern의-역사">Design Pattern의 역사</h3>
<blockquote>
<p>1977~79년 Chritopher Alexander에 의해 창시되었다.</p>
</blockquote>
<blockquote>
<p>이후 1987년 Ward Cunningham과, Kent Beck이 OOPSLA 컨퍼런스에 5가지의 Design Pattern을 발표한다.</p>
</blockquote>
<blockquote>
<p>1994년 Gang of Four(GoF)이라는 네 명의 개발자가《Design Patterns: Elements of Reusable Object-Oriented Software》라는 책을 발간하며, 전 세계 개발자들의 &#39;성경&#39;이라 불린다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/c39c01fb-1d98-428b-ba08-2be073c166d7/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Test and Enhancement]]></title>
            <link>https://velog.io/@second_ho_jun/Test-and-Enhancement</link>
            <guid>https://velog.io/@second_ho_jun/Test-and-Enhancement</guid>
            <pubDate>Thu, 19 Feb 2026 11:25:24 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="개발의-끝의-과정은-어떻게-평가할까">개발의 끝의 과정은 어떻게 평가할까?</h3>
<ul>
<li>Reliability (신뢰성)</li>
<li>Sustainability (지속성 + 기능추가)</li>
<li>Performance (성능)</li>
<li>Readability (가독성)</li>
</ul>
<h3 id="test-driven-development">Test-Driven-Development</h3>
<h4 id="tdd가-무엇인가">TDD가 무엇인가?</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/00ee4b8c-6656-40f4-b3cd-7881a7c9bb28/image.png" alt=""></p>
<ul>
<li><p>TDD는 요구사항을 충족하는 특정 테스트 케이스(테스트 코드)를 만든 후, 테스트를 통과할 수 있는 코드를 개발한 후 지속적인 짧은 개발을 반복하는 개발 방법이다.</p>
</li>
<li><p>실제로 단위 테스트 또는 TDD를 사용하면 디버깅하는 시간이 현저히 줄어들 뿐만 아니라, 잘못된 코드에 대해 빠른 오류 확인이 가능하다.</p>
</li>
<li><p>TDD의 사이클</p>
<ul>
<li><p>Add a test</p>
<ul>
<li>각각의 Feature을 실행하기 위한 테스트를 작성한다.</li>
<li>Feature의 기능과 요구사항을 만족하는 함수의 향상 혹은 함수를 정의한다.</li>
<li>이 함수들은 테스트가 존재하는 동안 변형할 수 있다.</li>
</ul>
</li>
<li><p>Run all tests and check fails</p>
<ul>
<li>테스트가 올바르게 작동하는지 확인하는 단계이다.</li>
<li>첫 번째 테스트는 실패하는 것이 올바르게 작동하는 것이다. -&gt; 테스트 코드에 아무것도 없기 때문이다.</li>
</ul>
</li>
<li><p>Write the codes</p>
<ul>
<li>함수를 통과할 수 있는 테스트 코드를 작성한다.</li>
<li>이때 테스트 코드는 완벽할 필요가 없고, 일단 통과하기만 하면된다. -&gt; 뒷 단계에서, 이 소스코드를 Refactoring을 할 것이다.</li>
<li>단, 프로그래머는 이 단계에서, 필요 이상의 함수를 구현해서는 안된다.</li>
</ul>
</li>
<li><p>Run tests</p>
<ul>
<li>테스트를 진행해보면서, 모든 테스트 케이스가 통과하는지 확인한다.</li>
<li>이때, 테스트 케이스를 모두 통과한다면, 테스트 요구사항을 모두 만족한다고 생각하면된다.</li>
<li>만약 테스트 코드를 통과하지 못한다면, 될때까지 반복해야한다.</li>
</ul>
</li>
<li><p>Refactor code</p>
<ul>
<li>이후 작성한 코드를 제거/수정/개선한다.</li>
<li>Object, class, module, variable은 반드시 목적과 사용의도를 드러내는 명확한 이름을 지어야한다.</li>
</ul>
</li>
</ul>
</li>
<li><p>TDD 장점</p>
<ul>
<li>테스트 코드를 작성함으로써 실제 코드에 대한 이해를 높일 수 있다.</li>
<li>디버깅하는 시간이 현저히 줄어들 뿐만 아니라, 잘못된 코드에 대해 빠른 오류 확인이 가능하다.</li>
<li>테스트 코드 작성 단계에서 실제 코드에 대한 명확한 처리를 설계함으로써 과도한 설계를 피할 수 있고, 간결한 인터페이스를 갖는다.</li>
</ul>
</li>
<li><p>TDD Principle</p>
<ul>
<li>기능의 갯수를 최소화한다.<ul>
<li>TDD에서 최소한의 기능을 구현하고, 이후 Refactoring단계에서 기능을 확장한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="tdd-in-python">TDD in Python</h3>
<ul>
<li><p>unittest</p>
<ul>
<li>Python에 포함된 다양한 테스트를 자동화할 수 있는 기능이 포함되어 있는 표준 라이브러리</li>
<li>unittest에 포함된 주요 개념<ul>
<li>TestCase : unittest 프레임 워크의 테스트 조직의 기본 단위</li>
<li>Fixture : 테스트함수의 전 또는 후에 실행 / 테스트 환경이 예상 된 상태에 있는지 확인</li>
<li>assertion : unittest가 테스트가 통과하는지 또는 실패 하는지를 결정</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="profiling-computer-programming">Profiling (computer programming)</h3>
<ul>
<li><p>Profiling이란?</p>
<blockquote>
<p>프로그램 실행 중 CPU 사용량, 메모리, 함수 호출 주기/빈도 등을 측정하여 성능 병목 지점을 찾고 최적화하는 동적 분석 기술이다.</p>
</blockquote>
<blockquote>
<p>Profiling은 프로그램의 최적화를 위해 주로 사용된다.</p>
</blockquote>
</li>
</ul>
<ul>
<li><p>Profiler</p>
<ul>
<li>소프트웨어 개발에서 프로그램의 실행 시간, 메모리 사용량, CPU 점유율, 함수 호출 빈도 등 성능 데이터를 실시간으로 수집하고 분석하는 동적 분석 기법.</li>
<li>Profiler는 다양한 방면의 데이터를 모으는 기술을 사용하며, 하드웨어 오류, 운영 체제 오류 등을 포함한다.</li>
</ul>
</li>
</ul>
<ul>
<li>Profiler 사진
<img src="https://velog.velcdn.com/images/second_ho_jun/post/08ce69a0-ab91-429a-bda5-959786d47856/image.png" alt=""></li>
</ul>
<blockquote>
<p>각각의 함수가 차지하는, 시간과 메모리를 실시간 분석하여, 누가 많이 사용하는지 드러낸다.</p>
</blockquote>
<ul>
<li><p>Profiler Tools</p>
<ul>
<li>Bulit-in Profiler in Python</li>
<li>RunSnakeRun</li>
<li>SNAKEVIZ</li>
<li>FYI (Profiler Software)</li>
</ul>
</li>
</ul>
<h3 id="coding-guideline-convention">Coding Guideline (Convention)</h3>
<ul>
<li><p>특정 프로그래밍 언어에서 프로그래밍을 할때 추천하는 스타일, 관행, 방식 등의 일련의 가이드라인을 말한다.</p>
</li>
<li><p>주로 파일 구성, 들여쓰기, 주석, 선언 등 프로그래밍을 하며 많이 사용하는 방식을 뜻한다.</p>
</li>
<li><p>소프트웨어의 구조적 품질을 유지하기 위한 방식이다.</p>
</li>
<li><p>프로그래머들은 가독성을 향상과 소스 코드의 유지보수를 용이하기 위한, 매우 추천되는 가이드라인들이다.</p>
</li>
<li><p>더 나아가, Convention(관습)일 경우에는, 규칙에 대한 문서가 존재하는 만큼 반드시 지키고 따라야할 방식이다.</p>
</li>
<li><p>Convention은 회사별, 팀별, 단체별 다를 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Software Maintenance]]></title>
            <link>https://velog.io/@second_ho_jun/Software-Maintenance</link>
            <guid>https://velog.io/@second_ho_jun/Software-Maintenance</guid>
            <pubDate>Sun, 15 Feb 2026 12:23:11 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="들어가기-앞서">들어가기 앞서</h3>
<blockquote>
<p>대다수의 개발자들은 공유된 프로젝트를 수행하기 위해서 어떻게 할까?</p>
</blockquote>
<ul>
<li>GitHub</li>
<li>Google Docs</li>
</ul>
<h3 id="software-maintenance-tools">Software Maintenance Tools</h3>
<ul>
<li>Version Control</li>
<li>Concurrent Versions System (CVS)</li>
<li>Apache Subversion (SVN)</li>
<li>Git</li>
<li>Github</li>
</ul>
<h3 id="version-control">Version Control</h3>
<blockquote>
<p>누가, 언제, 무엇을, 어떻게 변경하였는지를 확인하고, 저장하는 것을 지칭한다.</p>
</blockquote>
<blockquote>
<p>변화에 대한 관리는 문서(documents), 컴퓨터 프로그램, 웹 사이트, 혹은 다른 정보의 집합체로 보관된다.</p>
</blockquote>
<blockquote>
<p>변경된 사항들은 수정번호(revision number), 수정단계(revision level)으로 일컫는다.</p>
</blockquote>
<blockquote>
<p>각각의 변경 사항들은 time-stamp, 수정한 사람의 이름 등과 연관되어 진다. 즉, 어느부분을 누가, 언제, 어떻게, 무엇을, 왜, 수정했는지가 보여지면, 동료(co-worker)에게 비교당하고, 저장되고, 합병된다.</p>
</blockquote>
<h4 id="version-control-on-single-machine">Version Control on Single Machine</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/b1a7b6c1-1296-4fc5-9d88-066368e782e4/image.png" alt=""></p>
<ul>
<li><p>로컬 컴퓨터에서 이루어지며, 사용자가 저장하거나 수정한 파일을 Version Database에 넣는 행위를 &#39;Check in&#39; 또는 &#39;Commit&#39;이라 부른다.</p>
</li>
<li><p>반대로 version Database에서 필요한 version의 정보 및 데이터를 가져오는 행위를 &#39;Check out&#39;이라 한다.</p>
<h4 id="version-control-on-multiple-machine">Version Control on Multiple Machine</h4>
</li>
</ul>
<p>(Centralized Version Control Systems)</p>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/ef9848f1-48b0-4d39-923a-95ba6c202a36/image.png" alt=""></p>
<ul>
<li>중앙의 하나의 Version Control Database에서 함께 저장하며, 각각의 Working computer(computer A/B)에서 수정한 파일을 넣거나, 추출하여 사용한다.</li>
</ul>
<p>(Distributed Version Control Systems)
<img src="https://velog.velcdn.com/images/second_ho_jun/post/878ac6d3-8542-4243-a464-a623e77cb99c/image.png" alt=""></p>
<ul>
<li><p>Server Computer의 Version Database에서 완전히 똑같은 Version Database를 각각의 local 환경에서도 구축한다. </p>
</li>
<li><p>각각의 사용자 (computer A/B)는 자신이 작업한 작업물 혹은 수정사항들을 자신의 local computer에 저장하면 local Version Database와 연결된 Server Computer Version Database에서도 수정이된다.</p>
<h4 id="version-control-1">Version Control</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/4ad7b7da-3b26-4871-b6d8-ec71d6215082/image.png" alt=""></p>
</li>
<li><p>수정은 일반적으로 일련의 개발과정에서 발생하며, 각각의 분기점에서 뻗어나가, 새로운 기능을 추가한다. 이때 분기점(Branches)에서 기존 계획에 필요하거나 추가해야할 기능이라면, 더해지지만(merges) 그렇지 않은 경우 사라진다.</p>
</li>
</ul>
<h3 id="concurrent-version-system-cvs">Concurrent Version System (CVS)</h3>
<blockquote>
<p>동시에 여러 개발자들이 자신들의 개발을 관리하도록 만든 시스템이다.</p>
</blockquote>
<ul>
<li>Free Software로써, client-server revision control system이다.</li>
<li>파일에 관한 모든 변화와 모든 작업의 추적을 유지하는 version control system이며, 동시에 여러 명의 개발자가 사용이 가능하다.</li>
</ul>
<h3 id="apache-subversion-svn">Apache Subversion (SVN)</h3>
<blockquote>
<p>Apache Lincense 하의 오픈 소스로써, 원격으로 Software의 버전과 수정을 관리하는 시스템이다.</p>
</blockquote>
<ul>
<li><p>Software 개발자들은 Subversion을 통해, 현재 그리고 과거의 버전(소스코드, 웹 페이지, 문서)을 관리한다.</p>
</li>
<li><p>오픈 소스 커뮤니티는 Subversion을 널리 사용하고 있다.</p>
</li>
</ul>
<h3 id="git">Git</h3>
<blockquote>
<p>free와 open source의 distributed version control system이다. </p>
</blockquote>
<ul>
<li><p>Git은 대량의 사람들 사이의 컴퓨터 파일과 그러한 파일을 관리하는 작업의 변화를 추적하는 version control system이다.</p>
</li>
<li><p>주로 소스코드의 관리를 위해 사용되지만, 모든 파일의 변화를 추적하기 위해 사용되곤 한다.</p>
</li>
<li><p>대표적인 분산 버전 관리 시스템으로 속도와 data의 통합을 목표로 발전하였다.</p>
</li>
<li><p>Linus Torvalds(리눅스 개발자)가/이 2005년에 Linux kernel의 개발을 위해 만들었으며, 다른 리눅스 개발자의 초기 개발자들과 함께 협력하여 만들었다.</p>
<h4 id="git---distributed-version-control">Git - Distributed Version Control</h4>
<ul>
<li>Distributed Version Control은 버전 관리의 한 형태로, 개발자의 컴퓨터(로컬 환경)를 사용하여, 소스코드, 프로젝트의 버전들을 관리한다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/bcb67856-d92e-4cac-8339-a93839750143/image.png" alt=""></p>
<ul>
<li><p>Centrailized Version Control System</p>
<ul>
<li>중앙엔 Central server이 있다. : 모든 팀의 소스코드가 저장되는 장소이다.</li>
<li>각각의 멤버는 서버로 부터 직접적으로 &#39;Check out&#39;을 한다.</li>
<li>그들의 로컬 환경에서 수정을 거친 후, 개발자들은 그들의 변경사항들을 server code에 실어 중앙 서버로 적용(commit)시킨다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/9e560c5e-66af-45df-b070-e92dab124feb/image.png" alt=""></p>
</li>
<li><p>Distributed Version Control System (DVCS)</p>
<ul>
<li><p>모든 팀의 소스 코드는 원격의 central server에 저장된다.</p>
</li>
<li><p>각각의 멤버는 중앙 서버로 부터 &#39;Check out&#39;을 하기 위한 메시지(pull)를 보낸다. </p>
</li>
<li><p>로컬 환경에 각각의 중앙서버와 동일한 local 저장소가 있다. 따라서 개발자는 일시적으로 작업물에 대한 변경 사항들을 로컬 서버에 적용시킨다.</p>
</li>
<li><p>개발자들은 그들의 작업물을 완전히 적용시킬길 원한다면, 로컬 서버에서 중앙 서버로 밀어(push)달라는 메시지를 보낸다.</p>
</li>
<li><p>3단 구조로, 모든 프로젝트는 중앙 저장소로 가기전 프로젝트의 유지관리자들의 로컬 저장소에 저장된다.</p>
</li>
<li><p>개발자들은 동일한 로컬 복사본을 만들 수 있다.</p>
</li>
<li><p>중앙 저장소의 소스 코드의 변화들은 정기적으로 로컬 저장소와 융합된다.</p>
</li>
<li><p>개발자들은 새로운 분기점(branch)를 만들때, 자신의 로컬 저장소에서 만들고, 분기점의 소스 코드를 수정한다.</p>
</li>
<li><p>개발이 완료되면, 변화는 중앙 저장소에 통합된다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="git---distributed-version-control-용어">Git - Distributed Version Control 용어</h3>
<ul>
<li>Pull requsets<ul>
<li>소스 코드에 대한 Contributions을 지칭한다.</li>
<li>Contributor는 중간 관리자(유지 관리자)에게 소스 코드에 대한 변경 사항들을 &quot;pull&quot;해줄 것을 요청한다. </li>
<li>pull requests은 대부분 코드의 변환에 대해 집중한다.</li>
<li>pull requests은 중간 관리자(유지 관리자)에 의해 허락되고 거절된다.</li>
<li>일단 pull requests가 승인되면, 저장소에 코드들이 합쳐진다.</li>
</ul>
</li>
</ul>
<h4 id="git의-저장하는-과정">Git의 저장하는 과정</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/107202b6-4109-4fb5-950d-42bc4b0f9fcf/image.png" alt=""></p>
<ul>
<li><p>Remote Repository</p>
<ul>
<li>여러 사람이 함께 공유하기 위한 파일을 보관하는 전용 저장소</li>
</ul>
</li>
<li><p>Local Repository</p>
<ul>
<li>내 PC에 파일이 저장되는 개인 저장소 (Commit 하는 저장소)</li>
</ul>
</li>
<li><p>Staging Area</p>
<ul>
<li>Working Directory 에서 Repository로 정보가 저장되기 전 준비 영역</li>
<li>파일 상태를 기록, 스테이징을 한다. (Working Directory = 작업 영역)</li>
<li>실제 코드를 수정하고, 추가하는 변경이 이루어진다.</li>
<li>실제 프로젝트 디렉토리, git 이력과 관련된 정보가 저장되어있는 .git을 제외한 모든 영역이다.</li>
</ul>
</li>
<li><p>git init</p>
<ul>
<li>high level의 새로운 깃 저장소를 시작하기 위해 사용된다.</li>
<li>새로운 빈 git 저장소를 만든다.</li>
<li>새로운 저장소를 위한 메타데이터를 포함하는 subdirectory를 만든다.</li>
</ul>
</li>
<li><p>git clone</p>
<ul>
<li>새로운 깃 저장소를 시작하기 위해 사용된다.</li>
<li>git clone은 git init에 종속된다. 내부족으로 git clone은 git init을 호출한 후 새로운 저장소를 만든다.</li>
<li>유저의 로컬 컴퓨터에 존재하는 git 저장소를 다운로드한다.</li>
</ul>
</li>
<li><p>git pull</p>
<ul>
<li>원격 git 저장소에 상응하는 local git 저장소를 업데이트한다.</li>
</ul>
</li>
<li><p>git fetch</p>
<ul>
<li>원격 git 저장소에 상응하는 local git 저장소를 업데이트 하지만, 유저의 workspace에는 없는 완전히 새로운 변경 사항만을 업데이트한다.</li>
<li>git pull = git fetch + git merge</li>
</ul>
</li>
<li><p>git add</p>
<ul>
<li>workspace에서 staging area로 변경 사항들을 추가한다.</li>
</ul>
</li>
<li><p>git commit</p>
<ul>
<li>staging area에서 local Git repository로 변경 사항들을 추가한다.</li>
</ul>
</li>
<li><p>git push</p>
<ul>
<li>local Git repository에서 Remote repository로 변경 사항들을 추가한다.</li>
</ul>
</li>
</ul>
<h3 id="github">GitHub</h3>
<blockquote>
<p> git을 사용하는 웹 기반의 hosting 서비스이다.</p>
</blockquote>
<ul>
<li>Readme를 통해 자동 렌더링된 문서화와, 라벨, 마일스톤과 함께, issue를 tracking할 수 있다.</li>
<li>코드 리뷰와 comments와 함께 pull requests를 가능하다.</li>
<li>commits 이력을 추적할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Design by Figures]]></title>
            <link>https://velog.io/@second_ho_jun/Design-by-Figures</link>
            <guid>https://velog.io/@second_ho_jun/Design-by-Figures</guid>
            <pubDate>Mon, 09 Feb 2026 08:03:39 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="structure-of-data-data-structure">Structure of Data (Data Structure)</h3>
<blockquote>
<p>자료 구조는 컴퓨터에서 효율적으로 데이터를 사용하기 위한 특별한 방식이다.</p>
</blockquote>
<blockquote>
<p>자료 구조는 하나 혹은 더 특정한 추상적인 데이터 타입(ADT)을 실행할 수 있다.</p>
</blockquote>
<blockquote>
<p>각각의 언어(C/Python)에는 공통된 자료구조를 포함하고 있으면 더 나아가, 자신들의 언어만의 고유 자료구조를 가지고 있다.</p>
</blockquote>
<ul>
<li><strong>자료 구조의 종류</strong>
<img src="https://velog.velcdn.com/images/second_ho_jun/post/0cea6ac4-d209-4e1f-9357-73f06302ad10/image.png" alt=""></li>
</ul>
<h3 id="processing-of-data-algorithm">Processing of Data (Algorithm)</h3>
<ul>
<li>알고리즘은 문제의 유형들을 풀기위한 애매모호한 특정한 방식이다.</li>
<li>알고리즘은 계산과 데이터 처리과정, 추론 업무를 자동화할 수 있다.</li>
</ul>
<h3 id="representation-of-algorithm-flow-chart">Representation of Algorithm (Flow-chart)</h3>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/01b6b8cc-00cb-45e8-b8e3-930b1ff753f0/image.png" alt=""></p>
<ul>
<li>Flow-chart는 다이어그램의 유형으로, 일의 흐름과 과정을 나타낸다. 알고리즘의 정도를 표현해주며, 단계별 접근이 가능한 업무방식이다.</li>
<li>Flow-chart는 다양한 분야에서 과정과 프로그램의 분석, 다자인, 문서화, 관리하는 것에 사용되곤 한다.</li>
</ul>
<h3 id="representation-of-algorithm-pseudo-code">Representation of Algorithm (Pseudo-code)</h3>
<blockquote>
<p>실제 프로그래밍 언어(C, Python 등)의 문법이 아닌, 인간의 언어(한글, 영어 등)와 프로그래밍 구조를 섞어 알고리즘을 흉내 내어 표현하는 방식</p>
</blockquote>
<ul>
<li><p>Pseudo-code란 의사코드로, 특정 언어의 규칙에 얽매이지 않고 논리 흐름을 설계하는 데 집중한다.</p>
</li>
<li><p>일반적인 프로그래밍 코드와 달리 인간이 기계언어를 읽고 이해할 수 있도록 하는 것이 목표이다.</p>
</li>
</ul>
<h3 id="organized-collection-of-data">Organized collection of Data</h3>
<blockquote>
<p>Database는 데이터의 집합체이다.</p>
</blockquote>
<blockquote>
<p>관계 데이터베이는 더 업격히 스키마, 테이블, 쿼리, 보고서, 뷰 그리고 다른 요소들을 포함하고 있다.</p>
</blockquote>
<ul>
<li><p>Relational model : 관계형 모델</p>
</li>
<li><p>Entity-relationship model : 엔티티 기반 관계 모델</p>
<h4 id="relational-database-model">Relational Database model</h4>
<blockquote>
<p>구조와 언어를 활용하여 데이터를 관리하는 접근 방식이다. 모든 데이터는 관계로 그룹화되어, 튜플을 나타낸다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/b563f099-01ae-42a4-9373-616a388c7bd0/image.png" alt=""></p>
<h4 id="entity---relational-model">Entity - Relational model</h4>
<blockquote>
<p>ER 모델은 특정 지식 도메인과 상호연관된 것들을 묘사한다.</p>
</blockquote>
<blockquote>
<p>기본 ER 모델은 entity타입으로 구성되며, 각종 entity 타입의 예시 사이 존재할 수 있도록, 관계를 명시한다.</p>
</blockquote>
<ul>
<li><p><strong>기본 ERD 구성요소</strong>
<img src="https://velog.velcdn.com/images/second_ho_jun/post/7185c1ae-fb44-48cd-9ccf-176ff54bf1c9/image.png" alt=""></p>
</li>
<li><p><strong>Entity Relationship Diagram (ERD)</strong></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/aa00b60e-9ef5-41b8-b895-7fce1dd3d595/image.png" alt=""></p>
</li>
</ul>
<h3 id="sql과-nosql-database">SQL과 NoSQL Database</h3>
<ul>
<li><p>SQL : Structured Query Language (table based)</p>
</li>
<li><p>NoSQL : No or Not only SQL</p>
<h4 id="sql-structured-query-language">SQL (Structured Query Language)</h4>
<blockquote>
<p>관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 정의, 조작, 제어 및 조회하기 위해 설계된 표준 프로그래밍 언어</p>
</blockquote>
<h4 id="nosql-data-model">NoSQL Data Model</h4>
<blockquote>
<p>NoSQL은 고성능 비관계형 데이터 저장소를 나타내고, 사용 편의성, 확장성, 복원력 및 가용성 특성에 탁월하다.</p>
</blockquote>
<blockquote>
<p>정규화된 데이터의 테이블을 조인하는 대신, NoSQL은 구조화되지 않은 데이터 또는 반구조화된 데이터를 Key-value 쌍(pair) 또는 Json문서에 저장하는 경우가 많다.</p>
</blockquote>
</li>
</ul>
<h3 id="software-block-diagram">Software Block Diagram</h3>
<blockquote>
<p>특정 부분이나 기능을 블록으로 나타낸 시스템 다이어그램으로, 선으로 연결되어 블럭들 간의 관계를 보여준다.</p>
</blockquote>
<ul>
<li>software block Digagram으로 나타낸 자율주행자동차
<img src="https://velog.velcdn.com/images/second_ho_jun/post/672f472c-e923-45fd-a58e-8611245f7ca8/image.png" alt=""></li>
</ul>
<h3 id="computer-network-diagram">Computer Network Diagram</h3>
<blockquote>
<p>컴퓨터 네트워크 또는 더 일반적으로 모든 통신 네트워크의 노드와 노드 간의 연결을 묘사하는 개략도이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/d86d8aa1-e5d4-499a-83f1-3176e4c36378/image.png" alt=""></p>
<h3 id="message-sequence-chart">Message Sequence Chart</h3>
<blockquote>
<p>시스템 구성 요소나 객체들이 시간 흐름에 따라 서로 주고받는 메시지와 상호작용의 순서를 시각적으로 나타내는 UML 동작 다이어그램(Sequence Diagram)의 일종이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/925a9968-d7a2-41cb-b8e8-4924d8f15b1c/image.png" alt=""></p>
<h3 id="state-transition-diagram">State Transition Diagram</h3>
<blockquote>
<p>시스템이나 객체가 시간에 따라, 또는 특정 이벤트(Event) 발생 시 어떻게 상태가 변경(Transition)되는지 시각적으로 모델링한 다이어그램이다.</p>
</blockquote>
<blockquote>
<p>State diagram은 시스템의 상태를 묘사하며, 각각의 정해진 상태를 구성하여 단계별로 어떠한 상태로 넘어가는지 명확히 보여준다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Design Process]]></title>
            <link>https://velog.io/@second_ho_jun/Design-Process</link>
            <guid>https://velog.io/@second_ho_jun/Design-Process</guid>
            <pubDate>Fri, 06 Feb 2026 04:29:16 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="software-개발의-패러다임-변화">Software 개발의 패러다임 변화</h3>
<ul>
<li><strong>과거 : 소프트웨어</strong><ul>
<li>마이크로소프트 윈도우 / 오피스</li>
<li>한컴 한글 워드 프로세서</li>
<li>어도브 포토샵</li>
<li>패키징 게임들</li>
<li>이러한 소프트웨어는 매우 장기간의 걸친 프로젝트이다.</li>
<li>거대한 규모의 인력과 자본을 필요로 한다.</li>
<li>예상된 마감기한이 존재한다.</li>
</ul>
</li>
<li><strong>현재 : 서비스위주</strong><ul>
<li>구글 &amp; 네이버 검색 서비스</li>
<li>무료 게임 (부분 유료화 서비스)</li>
<li>다음, 카카오, 라인 메신저 서비스</li>
<li>광고 기반 무료 서비스들</li>
<li>가능한 빨리 서비스를 출신한다.</li>
<li>제한된 인력과 자본을 요구한다. (비교적 소규모)</li>
<li>시장의 요구사항들을 만족하는 서비스를 개발한다.</li>
</ul>
</li>
</ul>
<h3 id="waterfall-process--아래로-흐르는-개발-과정cess--아래로-흐르는-개발-과정">Waterfall process : 아래로 흐르는 개발 과정cess : 아래로 흐르는 개발 과정</h3>
<h4 id="waterfall-process의-표식도">Waterfall process의 표식도</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/2d602461-da44-487a-a343-bfedc41b5a1f/image.png" alt=""></p>
<ol>
<li><p>요구사항 분석 : 1~6개월</p>
</li>
<li><p>디자인(설계) : 6개월 ~ 3년</p>
</li>
<li><p>개발 : 6년</p>
</li>
<li><p>시험(테스팅)</p>
</li>
<li><p>유지 및 보수</p>
<h4 id="waterfall-process-with-gantt-chart">Waterfall process with Gantt chart</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/de47be8a-0b84-42ea-9515-19f86f0d3b3a/image.png" alt=""></p>
<blockquote>
<p>해야할일 들을 작성하고, 정해진 시간( 마감 기한 )에 맞게 제대로 진행하고 있는지 일련의 과정을 볼 수 있는 차트표.</p>
</blockquote>
</li>
</ol>
<h4 id="waterfall-process의-장점">Waterfall process의 장점</h4>
<ol>
<li>전체 프로젝트의 과정을 문서화와 소스코드를 확인할 수 있다.</li>
<li>문제를 쉽게 고칠 수 있고, 문제를 나중에 발견하는 것이 아닌, 조기에 발견할 수 있다.</li>
<li>의사소통이 부족하거나 오류가 덜 발생하며, 각 단계들을 간다하게 참고할 수 있다.</li>
<li>각 단계별로 성취해야할 목표들을 간단명료하게 확인하고 공유할 수 있다.</li>
<li>견고한 구조는 팀의 목표와 스케줄을 관리할 능력을 증가시켜준다.</li>
</ol>
<h4 id="waterfall-process의-단점">Waterfall process의 단점</h4>
<ol>
<li>전체 프로젝트의 과정이 단계별로 간단하게 이어나가지만, 뒤에 문제가 발생하였을 때 뒷 단계로 돌아가기 쉽지 않다.</li>
<li>Waterfall 방식에서는 refactoring을 하지 않는다.</li>
<li>각 단계별 조건을 완전히 만족하기란 불가능에 가깝다. -&gt; 시장은 빠르게 변하짐만 1번과 같이 개발 도중에 고객의 요구가 변화하더도, 뒷 단계로 돌아가지 못하기 때문에 즉각적인 대응이 하기 어렵다.</li>
<li>3번과 같은 즉각적인 대응이 어려우므로, 프로젝트 자체의 시간과 비용이 기하급수적으로 증가하게 된다.</li>
</ol>
<h3 id="agile">Agile</h3>
<blockquote>
<p>소프트웨어 개발 및 프로젝트 관리에서 계획에 얽매이지 않고 변화에 민첩하게 대응하며 점진적·반복적으로 결과물을 산출하는 유연한 방법론</p>
</blockquote>
<h4 id="agile이-무엇인가">Agile이 무엇인가?</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/75cfa460-d37d-4dc2-a512-5304898c36af/image.png" alt=""></p>
<ol>
<li>process와 tools보다는 individuals와 interactions을</li>
<li>comprehensive documentation 보다는 Working software를</li>
<li>contract negotiation 보다는 Customer collaboration를</li>
<li>following a plan 보다는 Responding to change를 가치 있게 여긴다.</li>
</ol>
<h4 id="agile-manifesto-12-principles">Agile Manifesto 12 Principles</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/88fc992e-e21e-47f9-be66-7d14cb9a2473/image.png" alt=""></p>
<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>
<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>
<h3 id="scrum-for-agile">Scrum for Agile</h3>
<blockquote>
<p>Scrum은 Agile의 정신을 실현하고 소프트웨어 개발에서 업무를 관리하고 중요성을 강조하기 위한 프레임워크이다.</p>
</blockquote>
<blockquote>
<p>Scrum은 3~9명의 개발자 팀을 위해 고안된 방식으로, 진행도를 추적하고, 매일 15분씩 업무의 상황을 보고하고, 미팅을 가진다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/a8de14e2-d722-4842-9f96-41c60778114a/image.png" alt=""></p>
<h3 id="devops-development-and-operations">DevOps (development and operations)</h3>
<blockquote>
<p>DevOps는 시스템 변화를 확인하고 일반 상품에 적용시키는데 걸리는 시간을 줄이도록 고안된 방식이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/ee3045b3-aef9-4845-be61-5cfcf1d94a4d/image.png" alt=""></p>
<ul>
<li>DevOps의 주된 특성은 강력한 자동화와 모든 소프트웨어 개발의 단계를 모니터링한다는 것이다.</li>
<li>DevOps는 더 짧은 개발 사이클, 증가된 빈도, 더 많은 출시 등을 목표로 한다.</li>
</ul>
<h4 id="devops-개발-도구들">DevOps 개발 도구들</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/8060887d-6a87-4964-b042-fcd0e177e0f5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Selecting Right OS (올바른 운영체제 선정)]]></title>
            <link>https://velog.io/@second_ho_jun/Selecting-Right-OS-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%84%A0%EC%A0%95</link>
            <guid>https://velog.io/@second_ho_jun/Selecting-Right-OS-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%84%A0%EC%A0%95</guid>
            <pubDate>Wed, 04 Feb 2026 06:04:52 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="background-for-selecting-os">Background for Selecting OS</h3>
<ul>
<li>Business<ul>
<li>Market share</li>
</ul>
</li>
<li>Technical requirement<ul>
<li>Distributed, Multi &amp; Parallel processing</li>
<li>Realtime processing </li>
<li>Extremely small hardware resource environment</li>
<li>Secure computing</li>
</ul>
</li>
</ul>
<h3 id="market-share">Market Share</h3>
<blockquote>
<p>2025 전 세계 데스크탑 OS 점유율</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/4cc96656-a5bd-4056-9319-6b8292244eeb/image.png" alt=""></p>
<blockquote>
<p>2025 전 세계 모바일 OS 점유율</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/99a134c8-748d-432e-9629-cb46c92bc0ee/image.png" alt=""></p>
<blockquote>
<p>2025 전 세계 서버 OS 점유율</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/6e355ae2-754d-4373-a89a-5e74fdcd5a17/image.png" alt=""></p>
<blockquote>
<p>리눅스 OS 점유율</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/bb59d6fa-ee9d-4881-9970-add5d9cefc07/image.png" alt=""></p>
<ul>
<li><p>2022년 기준 리눅스의 점유율은 다른 OS(iOS, Windows)에 비해 시장 점유율은 떨어진다.</p>
</li>
<li><p>클라우드 인프라의 약 90%가 리눅스가 차지하였다.</p>
</li>
<li><p>전 세계의 대표적인 웹 서버들의 96.3%가 리눅스이다.</p>
</li>
<li><p>미국은 거의 2백만개의 우분투 웹사이트가 있다.</p>
<h4 id="왜-리눅스인가">왜 리눅스인가?</h4>
<ol>
<li>리눅스는 오픈 소스이다. </li>
<li>리눅스는 멀티 유저를 감당한다.</li>
<li>리눅스는 &quot;Free&quot;(자유)이다.</li>
<li>리눅스는 신뢰할 수 있다.</li>
<li>리눅스는 backwards와 상호성립이 가능하다.</li>
<li>리눅스는 네트워크 친화적이다.</li>
</ol>
</li>
</ul>
<h3 id="linux-foundation">Linux Foundation</h3>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/3c371511-ee45-4ee2-9639-e0cfff0172b8/image.png" alt="">
<img src="https://velog.velcdn.com/images/second_ho_jun/post/aeb4734e-0a04-4021-86ac-cb075e08d4bf/image.png" alt=""></p>
<blockquote>
<p> Linux Foundtaion은 리눅스의 발전을 제고하기 위해 설립된 비영리 연합체이다. 2000년에 오픈 소스 개발 연구소와 자유 표준 그룹의 병합으로 설립된 리눅스 재단은 리눅스 제작자 리누스 투르발스의 일을 지원하고 있으며, 전 세계의 선도하는 리눅스 및 오픈 소스 기업과 개발자로부터 지원을 받고 있다.</p>
</blockquote>
<h3 id="linux">Linux</h3>
<ul>
<li>리눅스의 32비트의 Unix와 같은 OS이다. 처음에는 가정용 컴퓨터를 위해 제작되었으나, 현재는 Macintosh, Amiga, DEC Alpha를 포함한 여러 플랫폼에 이식되었다.</li>
<li>리눅스의 소스코드는 모든이에게 자유롭게 사용이 가능하다.</li>
<li>리눅스의 운영체제는 다음과 같은 특징을 갖는다.<ul>
<li>안정성(Stable) : 리눅스 하의 운영체제는 다른 운영체제에 비해, crash와 서버 다운 문제가 덜 발생한다.</li>
<li>신뢰성(Reliable) : 리눅스 서버는 다른 서버에 비해, 수 백일은 더욱 버틸 수 있다.</li>
<li>강력함(powerful) : 이러한 두 가지 특성으로 리눅스는 강력한 서버라고 평가받는다.</li>
</ul>
</li>
</ul>
<h3 id="linux-kernel">Linux Kernel</h3>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/f77e0d3c-06f5-4e5e-b7be-7413caf30c62/image.png" alt=""></p>
<ul>
<li>커널은 전체 컴퓨터을 돌리는 OS 코드를 포함한 리눅스의 중심이자, 민간한 시스템이다. </li>
<li>커널은 특정 전문적인 일(TCP/IP networking)을 포함한 수행하는 코드들을 포함한다.</li>
<li>커널 디자인의 기본은 모듈러이다. 그래서 실제 OS코드는 매우 작고, 실제 그것이 필요할 때 적재될 수 있다. -&gt; 커널은 작고, 매우 빠르며, 높은 확장성을 갖는다.</li>
</ul>
<h4 id="linux-networking">Linux Networking</h4>
<ul>
<li>네트워킹은 자연스럽게 리눅스에게 몰린다. 리눅스는 인터넷과 WWW의 산물이다.</li>
</ul>
<h2 id="기타-리눅스-운영체제-사용분야">기타 리눅스 운영체제 사용분야</h2>
<h3 id="vxworks-commercial-rtos">VxWorks (Commercial RTOS)</h3>
<ul>
<li>VxWorks는 실시간 운영체제로써, 1987년에 출시되었다. 실시간과 제시간 안에 업무를 수행하는 것을 필요로하는 임베디드 시스템에 사용된다. </li>
<li>안전과 보안 등의 분야에서 활용된다.</li>
</ul>
<h3 id="rtl-real-time-linux-collaborative-project">RTL (Real Time Linux collaborative project)</h3>
<h3 id="zephyr-자원이-제한된-기기를-위한-os--iot">Zephyr (자원이 제한된 기기를 위한 OS : IoT)</h3>
<h3 id="secure-computing-arm-trustzone">Secure Computing (ARM TrustZone)</h3>
<ul>
<li>Trusted Computing에서 파생된 개념</li>
<li>Trusted Computing은 Trusted Computing Group이 개발하고 선도한 기술이다.
= Trusted Computing은 지속적으로 예상 경로를 통해 행동하고 그러한 행동들을 컴퓨터의 하드웨어와 소프트웨어에의해 통제된다.</li>
<li>그리고 이러한 행동들은 특정한 encryption key가 없다면 접근할 수 가 없다.
<img src="https://velog.velcdn.com/images/second_ho_jun/post/3ca9bcd1-6b63-4c3d-89f3-88ad0cb978d4/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Selecting Right Language (올바른 언어 선정)]]></title>
            <link>https://velog.io/@second_ho_jun/Selecting-Right-Language-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%96%B8%EC%96%B4-%EC%84%A0%EC%A0%95</link>
            <guid>https://velog.io/@second_ho_jun/Selecting-Right-Language-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%96%B8%EC%96%B4-%EC%84%A0%EC%A0%95</guid>
            <pubDate>Fri, 30 Jan 2026 07:26:06 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="select-right-language">Select Right Language</h3>
<ul>
<li>만약 누군가 언어를 추천해달라다고 가정하자. -&gt; 누구에게 무엇을 추천할 것인가? -&gt; Python?, C++ -&gt; 추천해 달라하는 사람의 직장과 성향에 따라 천차만별일 것이다.</li>
</ul>
<h3 id="언어를-선정하는-기준은-무엇인가">언어를 선정하는 기준은 무엇인가?</h3>
<pre><code>1. Hardware관련 특정 문제를 다루어야 하는가?
    - 일반적으로 어셈블리어로 C, C++이 선택
    - Aurdino라면 C를 선택
    - Linux / Unix Kernel의 경우에는 C / C++이 지지받는다.
    - MacOS kernel일 경우 C 혹은 Swift가 요구될 것이다.
2. Hardware에 구애받지 않는 문제라면?
    - Web 클라이언트 그리고 서버 프로그래밍
    - 데이터 분석, 엔지니어, 사이언티스트
    - 이러한 것들은 보통 접근 기반의 high level language를 사용하는 것이 좋다.</code></pre><h3 id="c--c이-가지는-hardware-관련-feature가-무엇인가">C / C++이 가지는 Hardware 관련 feature가 무엇인가?</h3>
<ul>
<li><p>Physical memory management : 물리 메모리 관리(접근이 가능)</p>
<ul>
<li>C / C++의 포인터개념 : C기반의 언어들(C, C++, Rust, gigle)은 기본적으로 다른 변수의 주소를 저장할 수 있으며, 변수의 주소를 포인터를 통해 물리적으로 접근이 가능하다.<ul>
<li>하드웨어를 접근해서 읽고 쓸 수 있다.(하드웨어 장치와 매핑이 가능.) == Ram을 매개체로 명령을 수행이 가능하다. == imbeded programming이 가능하다.
<img src="https://velog.velcdn.com/images/second_ho_jun/post/7b18c9fe-ec1d-439d-9e8b-77bca2839d16/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>Bit Operation : 0과 1로 연산이 가능하다.</p>
<ul>
<li>mapping된 하드웨어 장치를 포인터를 통해 실제 주소로 이동하면, 매핑된 입력과 출력 장치를 통해 실제 기계와의 소통이 가능하다.(계산이 가능하다.)</li>
</ul>
</li>
</ul>
<h3 id="domain-specific-language">Domain Specific Language</h3>
<blockquote>
<p>특정 분야의 도메인에 주로 활용되거나, 널리 사용되어 대체하기 어려운 언어가 존재한다.</p>
</blockquote>
<ul>
<li><p>도메인의 종류</p>
<ul>
<li>Web server</li>
<li>Data analytics</li>
<li>Cloud computing</li>
<li>Microservice programming</li>
</ul>
<h4 id="web-server-programming-language">Web server (programming language)</h4>
<ul>
<li>Javascript<ul>
<li>1995/12/04 탄생</li>
<li>초기에 오로지 웹브라우저에서 client-side를 실행하기 위해 설계되었다.</li>
<li>그러다 현재 많은 유형의 host software에 이식되면서 널리 사용되고 있다.</li>
</ul>
</li>
<li>Node.js<ul>
<li>2009/05/27 탄생</li>
<li>Open Source, Cross platform, JavaScript run time 환경</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="web-server-with-dedicated-tools">Web server (with dedicated tools)</h4>
<ul>
<li><p>Apache</p>
</li>
<li><p>Nginx</p>
</li>
<li><p>Wordpress</p>
<h4 id="data-analytics-data-analysis-data-science">Data analytics (Data Analysis, Data Science)</h4>
</li>
<li><p>데이터를 점검, 변형, 청소, 모델링 하는 과정을 거친다.</p>
</li>
<li><p>데이터를 유요한 정보로 바꾸어 결론에 제안하는 것을 목표로 한다.</p>
</li>
<li><p>선호되는 언어 : Python , R</p>
</li>
<li><p>주요 요구사항 </p>
<ul>
<li>자연어 처리, 글자 분석</li>
<li>선형, 확률, 통계</li>
</ul>
<h4 id="cloud-computing">Cloud computing</h4>
</li>
<li><p>OpenStack</p>
</li>
<li><p>CPU, 저장소, networking의 대규모 통제하며, datacenter내에서 자원을 관리한다. </p>
</li>
</ul>
<h3 id="그럼에도-무슨-언어를-선정해야할지-모르는-경우">그럼에도 무슨 언어를 선정해야할지 모르는 경우</h3>
<h4 id="selection-by-tiobe-index">Selection by Tiobe index</h4>
<blockquote>
<p>프로그래밍 언어의 인기도를 측정한 지표</p>
</blockquote>
<p>  <img src="https://velog.velcdn.com/images/second_ho_jun/post/46c74ed1-e238-4f91-9376-09cfd5d2077a/image.png" alt=""></p>
<h4 id="성향에-따른-도표표를-통한-빠른-선정">성향에 따른 도표표를 통한 빠른 선정</h4>
<p> <img src="https://velog.velcdn.com/images/second_ho_jun/post/ab2fd785-a431-4bb9-98db-e74b94cbf2f4/image.png" alt=""></p>
<h4 id="가고자하는-회사에서의-로드맵-참고">가고자하는 회사에서의 로드맵 참고</h4>
<ul>
<li>예시 : 우아한 형제들 (서버) : JavaScript
<img src="https://velog.velcdn.com/images/second_ho_jun/post/7681b34d-3103-405b-90ed-c7487e36247e/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Problem Definition(문제 정의)]]></title>
            <link>https://velog.io/@second_ho_jun/Problem-Definition%EB%AC%B8%EC%A0%9C-%EC%A0%95%EC%9D%98</link>
            <guid>https://velog.io/@second_ho_jun/Problem-Definition%EB%AC%B8%EC%A0%9C-%EC%A0%95%EC%9D%98</guid>
            <pubDate>Thu, 29 Jan 2026 09:26:58 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="problem-definition-software-layer">Problem Definition (software layer)</h3>
<ul>
<li>System software</li>
<li>Application software</li>
</ul>
<h3 id="system-software-vs-application-software">System software vs Application software</h3>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/fb1d92d9-da22-4dad-b729-a25a9dfba8a4/image.png" alt=""></p>
<blockquote>
<p>애플리케이션 개발자 : Application , Middleware</p>
</blockquote>
<blockquote>
<p>시스템 개발자 : OS UI, OS Services, OS drivers and runtimes, Hypervisor, Firmware, Hardware </p>
</blockquote>
<h3 id="problem-definition의-목적purpose">Problem Definition의 목적(purpose)</h3>
<ul>
<li>Purely your own purpose -&gt; 자신의 문제 해결 ex). 창업, 기획</li>
<li>Based on othe person&#39;s request -&gt; 다른 사람의 문제 해결 ex). 취업, 하청</li>
</ul>
<h3 id="customer-requirement-analysis-고객-요구-분석">Customer Requirement Analysis (고객 요구 분석)</h3>
<ol>
<li><strong>첫번째 방법</strong>
<img src="https://velog.velcdn.com/images/second_ho_jun/post/7d42e89e-24aa-4aa9-ae38-874d2266ba01/image.png" alt=""></li>
</ol>
<pre><code>1. Used Case Diagram

2. Focus Group

3. BrainStorming

4. Obsersvation

5. Interview

6. Survey

7. Join Application Method

8. Interface Analysis

9. Prototyping</code></pre><ol start="2">
<li><p><strong>두번째 방법</strong>
<img src="https://velog.velcdn.com/images/second_ho_jun/post/825d4e09-1621-4fcd-9a2b-bb0396b08add/image.png" alt=""></p>
<ol>
<li><p>Requirement elicitation : 고객 도메인에서 요구사항 추출</p>
</li>
<li><p>Requirement analysis : 추출한 사항을 바탕으로 분석</p>
</li>
<li><p>Requirement specification : 이를 바탕으로 요구 명시</p>
</li>
<li><p>Functional doamin : 이후 기능 도메인에서 구현하고자 하는 기능 실현</p>
</li>
</ol>
</li>
</ol>
<h3 id="problem-definition-legacy">Problem Definition (legacy)</h3>
<ul>
<li><p>From scratch : 백지에서 시작 (처음부터 시작)</p>
</li>
<li><p>Based on existing platforms : 최대한 재사용하기 (reverse engineering)</p>
<h4 id="reverse-engineering-reengineering">Reverse Engineering (reengineering)</h4>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/a44e90b9-385d-42f4-af9f-106662972e8c/image.png" alt=""></p>
<ul>
<li><p>완제품이나 시스템을 분해·분석하여 그 설계 기술, 동작 원리, 구성 요소를 역으로 추적해내는 과정 (보완/해킹)</p>
</li>
<li><p>기술 문서가 없거나, 경쟁사 제품 분석, 구형 시스템 복원 및 보안 취약점 분석을 위해 활용</p>
</li>
<li><p>Reverse Engineering 예시</p>
<ul>
<li>동작되는 file은 있는데 source code는 없을때<ul>
<li>악성 코드 분석 -&gt; machine language code를 high-level language로 역변환 </li>
</ul>
</li>
</ul>
<h4 id="software-reuse">Software Reuse</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/b52e0229-ec12-4ec6-affc-7b9abbbcb61a/image.png" alt=""></p>
</li>
<li><p>이미 개발되어 검증된 소프트웨어의 구성요소(코드, 설계, 문서 등)를 새로운 애플리케이션 개발에 활용하는 기법</p>
<ul>
<li>디자인 패턴, 함수, 모듈, 라이브러리, 클래스 ... 등</li>
</ul>
</li>
<li><p><strong>디자인 패턴</strong></p>
<ul>
<li>프로그래밍 패러다임 : function(함수) 재사용<ul>
<li>객체 지향 프로그래밍 : class(클래스) 재사용</li>
<li>디자인 패턴, 구조적 패턴 : 프로그램 설계에 대한 재사용</li>
</ul>
</li>
</ul>
<h4 id="refactoring">Refactoring</h4>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/0965ea4f-928e-4bb0-b203-e7247f4e388d/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>소프트웨어의 외부 동작을 변경하지 않으면서 내부 구조를 개선하는 코드 재구성 작업</li>
<li><strong>Refactoring의 주요 목적</strong><ul>
<li>코드 가독성 향상 : Redability</li>
<li>유지보수 용이 : Maintainability</li>
<li>중복 제거 및 코드 구조 개선 : Performance</li>
<li>시간 복잡도 개선 : Complexity</li>
<li>확장성 개선 : Extensibility</li>
<li>실행 속도 향상 : Execution</li>
</ul>
</li>
</ul>
<h3 id="problem-definition-project-characteristics">Problem Definition (Project characteristics)</h3>
<ul>
<li><p>Due(Service deployment date) : 언제까지 개발해야하는가</p>
</li>
<li><p>Performance(Capacitty, Response, Time) : 얼마만큼의 성능을 뽑아내야하는가</p>
</li>
<li><p>Resource(개발자 수, 개발자 수준, 돈... 등) : 얼마만큼의 예산이 필요한가</p>
<h4 id="performance-indicator-kpi">Performance indicator (KPI)</h4>
<ul>
<li><p>성능을 측정하고 평가하기 위한 핵심 평가 지표(key performance indicator)</p>
</li>
<li><p>KPI는 특정 활동과 조직의 성과를 평가할 수 있으며, 전략과 운영 개선에 중점을 맞추었다.</p>
</li>
<li><p>KPI 예시</p>
<ul>
<li><img src="https://velog.velcdn.com/images/second_ho_jun/post/05b53677-df31-4dfe-b5aa-5f59ff9c20b8/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="problem-definition-hardware-depency">Problem Definition (Hardware depency)</h3>
<ul>
<li>Hardwared dependent : 하드웨어가 필요하다.<ul>
<li>아두이노(Arudino), 라즈베이파이(RaspberrPi), 쿠다(CUDA)</li>
</ul>
</li>
<li>Hardwared in - dependent : 하드웨어가 필요없다.<ul>
<li>웹/서버 개발 -&gt; 일반적으로 KPI가 적용된다.</li>
<li>모바일 애플리케이션 개발<ul>
<li>Native platform(iOS, Android) -&gt; 극한 성능을 뽑아야한다.</li>
<li>Cross platform(HTML, CSS, JavaScript, Dart/Flutter) -&gt; 빠른 개발과 출시가 중요하다.</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[오픈소스 소프트웨어란 무엇인가?]]></title>
            <link>https://velog.io/@second_ho_jun/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@second_ho_jun/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Wed, 28 Jan 2026 07:02:52 GMT</pubDate>
            <description><![CDATA[<h5 id="경희대학교-이성원-교수님의-오픈소스-sw-개발-방법-및-도구-수업을-기반으로-본인이-이해한-바로-새롭게-정리한-글입니다">경희대학교 이성원 교수님의 &#39;오픈소스 SW 개발 방법 및 도구 수업&#39;을 기반으로 본인이 이해한 바로 새롭게 정리한 글입니다.</h5>
<h3 id="오픈소스-소프트웨어">오픈소스 소프트웨어</h3>
<blockquote>
<p> 소스 코드를 공개해 누구나 특별한 제한 없이 그 코드를 보고 사용할 수 있는 오픈 소스 라이선스를 만족하는 소프트웨어를 의미한다. 통상적으로 간략하기 &#39;오픈소스&#39;라고 칭한다.</p>
</blockquote>
<h3 id="free-소프트웨어">Free 소프트웨어</h3>
<blockquote>
<p>Free란 무료가 아닌 &#39;자유&#39;를 의미한다. / <strong>복사와 사용, 연구, 수정, 배포</strong> 등의 제한이 없는 소프트웨어 혹은 그 통칭한다.</p>
</blockquote>
<blockquote>
<p>프리 소프트웨어의 궁극적인 목표는 누구나 자유롭게 사용하여, 이전의 없는 기능을 추가하고, 성능을 향상시킴으로써, 모두에게 이익이 되도록하고 재배포하는 등 소프트웨어 생태계가 지속 가능하게 하도록 하는 것이다.</p>
</blockquote>
<h3 id="free-software-foundation">Free Software Foundation</h3>
<blockquote>
<p>1985년 10월 4일에 설립된 이 단체는 저작권(copyright)를 비꼬며, &#39;copyleft&#39;를 창시, 이후 자신들만의 GNU General Public Lincense를 만들었으며, 자신들 산하의 여러 기술과 프로젝트를 진행하고 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/0b8e85ea-4f2e-4701-9850-2e12cf60a94f/image.png" alt=""></p>
<h3 id="gnu-os">GNU OS?</h3>
<blockquote>
<p>GNU는 운영 체제 중 하나이자, 컴퓨터 소프트웨어의 모음집 이다. GNU는 온전히 자유 소프트웨어로 이루어져 있으며, 그 중 대부분이 GNU 프로젝트의 GPL로 라이선스 된다.</p>
</blockquote>
<h3 id="리처드-스톨만">리처드 스톨만?</h3>
<blockquote>
<p>미국의 자유 소프트웨어 운동 활동가이자 프로그래머이다. 그는 사용자가 소프트웨어를 사용, 연구, 배포, 수정할 수 있는 자유를 가질 수 있도록 소프트웨어를 배포해야 한다는 캠페인을 벌이고 있다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/cf549998-6a0d-4ecd-89da-d9e4e5ad7c15/image.png" alt=""></p>
<h3 id="오픈소스-소프트웨어만-있는가">오픈소스 소프트웨어만 있는가?</h3>
<blockquote>
<p>오픈소스 소프트웨어 이외에도, 오픈소스 하드웨어도 존재한다.
대표적인 오픈소스 하드웨어는 &#39;아두이노&#39;이다.</p>
</blockquote>
<blockquote>
<p>또한 Open Source Processor인 RISC-V 또한 존재한다.
아 RISC-V는 프로세서를 만드는 설계 및 각종 소프트웨어를 만들어서 공유를 담당한다.</p>
</blockquote>
<h3 id="linux">LINUX</h3>
<h4 id="왜-linux일까">왜 LINUX일까?</h4>
<blockquote>
<p>현재(2025기준) 스마트폰과 IoT(사물인터넷)의 대부분이 리눅스로 운영되고 있다.
동시에 Physical Computing역시, 리눅스가 차지하고 있다. 이외에도, 슈퍼컴퓨터의 운영체제로도 활용되고 있다.</p>
</blockquote>
<h4 id="linux-일화--윈도우의-적-이제는-친구-wsl">Linux 일화 : 윈도우의 적? 이제는 친구! (WSL)</h4>
<blockquote>
<p>과거 MS는 리눅스를 &#39;암(Cancer)&#39;이라고 부를 정도로 경계했으나, 2010년대 이후 Satya Nadella CEO 취임 후 &#39;MS는 리눅스를 사랑한다&#39;고 입장을 바꿨다.</p>
</blockquote>
<blockquote>
<p>또한 이제는 윈도우 10/11에 &#39;Linux용 Windows 하위 시스템(WSL2)&#39;이 기본 탑재되어, 윈도우 안에서 리눅스 명령어를 완벽하게 사용할 수 있도록 변모되었다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/second_ho_jun/post/b95a69cf-e4c4-4f6d-bc5c-d051f6bc7be7/image.png" alt=""></p>
<h4 id="linux의-생태계">Linux의 생태계</h4>
<blockquote>
<p>리눅스의 생태계는 점점 넓어지고 있으며, 활용 범위 또한 넓어져 현재는 다양한 일상 생활속에 녹아있다 봐도 무방하다.</p>
</blockquote>
<blockquote>
<ol>
<li>ROS(로봇 운영체제), 2. Automative Grade Vehicles, 3. 클래식 게임 플랫폼, 4. 온라인 게임 거래 플랫폼(Steam)</li>
</ol>
</blockquote>
<h4 id="협의--광의의-linux">협의 &amp; 광의의 Linux</h4>
<ol>
<li><p>협의의 리눅스(narrow Linux)</p>
<ul>
<li>Linus Torvalds가 개발한, linux kernel software(OS)</li>
<li>Linux Foundation(LF): Linux의 발전을 제고하기 위해 설립된 비영리 연합체</li>
</ul>
</li>
<li><p>광의의 리눅스</p>
<ul>
<li>linux foundation 산하 900개의 projects</li>
</ul>
</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>