<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ryan_han.log</title>
        <link>https://velog.io/</link>
        <description>소프트웨어학과 대학생</description>
        <lastBuildDate>Tue, 17 Dec 2024 07:12:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ryan_han.log</title>
            <url>https://velog.velcdn.com/images/ryan_han/profile/fd0cbd5e-f59e-4cf4-8957-4b80a2578188/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ryan_han.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ryan_han" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[프로세스 및 사용자 관리]]></title>
            <link>https://velog.io/@ryan_han/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@ryan_han/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Tue, 17 Dec 2024 07:12:34 GMT</pubDate>
            <description><![CDATA[<h1 id="ps-명령어">ps 명령어</h1>
<ul>
<li><p><strong>ps</strong> : 현재 터미널에서 사용자가 실행한 프로세스의 정보를 출력</p>
</li>
<li><p>*<em>ps -f *</em>: 프로세스의 상세 정보 출력 (UNIX 옵션)</p>
</li>
<li><p>*<em>ps a *</em>: 터미널에서 실행한 프로세스의 정보 출력 (BSD옵션)</p>
</li>
<li><p><strong>ps au</strong> : 터미널에서 실행한 프로세스(a)의 상세정보 출력(u)</p>
</li>
<li><p><strong>ps -e</strong> : 전체 프로세스 목록 출력 (UNIX 옵션)</p>
</li>
<li><p><strong>ps ax</strong> : 전체 프로세스 출력</p>
</li>
<li><p><strong>ps -u</strong> : 특정 사용자가 실행한 프로세스 목록 출력</p>
</li>
</ul>
<h1 id="pgrep-명령어">pgrep 명령어</h1>
<ul>
<li><p>pgrep : 지정된 패턴과 일치하는 프로세스의 정보 출력</p>
</li>
<li><p>형식 : pgrep [option]  &lt; pattern &gt;</p>
</li>
</ul>
<ul>
<li><p><strong>pgrep -x bash</strong> : 패턴과 정확히 일치하는 CMD를 가진 프로세스 출력</p>
</li>
<li><p>-&gt; 프로세스의 CMD가 정확히 bash와 일치하는 프로세스 출력
&quot;정확히 일치한다&quot; bash!=ssbash</p>
</li>
<li><p><strong>pgrep -l bash</strong> : 패턴과 정확히 일치하는 프로세스의 <em><strong>PID와 이름 출력</strong></em></p>
</li>
<li><p>-&gt; -x 옵션과의 차이점 : 프로세스 이름이 함께 표시</p>
</li>
<li><p>*<em>ps -fp $(pgrep -x bash) *</em>: 찾고자 하는 프로세스의 상세 정보 확인이 필요한 경우에 사용</p>
<p>  --&gt; pgrep 명령으로 bash의 PID를 검색한 결과를 -p 옵션의 인자로 사용</p>
<p>  --&gt; pgrep -x bash 명령으로 검색된 각 PID에 해당하는 프로세스의 상세 정보 출력</p>
</li>
</ul>
<ul>
<li><strong>pgrep -fp $(pgrep -u ryanhan bash)</strong> : ryanhan 사용자가 실행한 bash 프로세스의 자세한 정보 확인</li>
</ul>
<h1 id="kill-명령어">Kill 명령어</h1>
<ol>
<li>먼저 종료할 프로세스의 PID를 확인</li>
</ol>
<ul>
<li>ps -ef 나 ps aux 명령으로 종료하고자 하는 프로세스 PID를 알아냄</li>
</ul>
<ol start="2">
<li>PID 확인 후 kill 또는 pkill을 사용하여 종료 시킴</li>
</ol>
<ul>
<li><p>kill &amp; pkill 명령은 프로세스에 시그널을 보내는 방식으로 프로세스를 종료</p>
</li>
<li><p>시그널 : 프로세스에 무엇인가가 발생했음을 알리는 간단한 메세지</p>
</li>
<li><p>-&gt; kill -l 명령어를 통해 시그널 목록 확인 가능</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/26891460-a6d6-4d1b-9504-2dae6ab8705c/image.png" alt=""></p>
<p>kill 명령 : 지정한 시그널을 프로세스에게 보냄</p>
<p>단순 kill = kill -15 </p>
<p>--&gt; 형식 : kill [ -  &lt; signal &gt; ] &lt; pid &gt;
--&gt; &lt; signal &gt; 에 작성한 시그널이 가진 처리 방식으로 프로세스를 종료</p>
<p><strong>kill -2 &lt; ____ &gt;</strong>---&gt; 인터럽트 신호를 보냄 (SIGINT)</p>
<p><strong>kill -9 &lt; ____ &gt;</strong>  ---&gt; 프로세스를 강제 종료 (SIGKILL)</p>
<p><strong>kill -15 &lt;____&gt;</strong> ---&gt; 프로세스와 관련된 파일을 정리한 후 종료(SIGTERM</p>
<ul>
<li>kill 명령 사용법</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/042f5b2e-b952-4dd0-86e5-ad8fbc2f72b6/image.png" alt=""></p>
<p><em><strong>--&gt; ps -fp $(pgrep -x man) 을 통해 실행중인 man 프로세스의 PID를 확인한다</strong></em>
<img src="https://velog.velcdn.com/images/ryan_han/post/c93db417-c667-49e4-afdd-65c03c9b14b0/image.png" alt=""></p>
<ul>
<li>프로세스 강제 종료 ( 9 )</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/eff693a2-4ee3-4c08-a918-cc198375c7f7/image.png" alt=""></p>
<ul>
<li>kill &lt; PID &gt; 로 종료를 해도 sh 프로세스는 종료되지 않음</li>
<li>sh 는 15번 시그널 (SIGTERM)을 무시함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/97c175ae-bed0-48a9-b2fd-182d8bb93b5e/image.png" alt=""></p>
<h2 id="pkill-명령-사용법">pkill 명령 사용법</h2>
<ul>
<li>pkill : kill 명령과 마찬가지로 시그널을 보냄</li>
<li>-&gt; PID가 아니라 프로세스의 명령 이름(CMD) 로 프로세스를 찾아 종료</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/0b42b731-2d89-421d-94c5-d1e15912316a/image.png" alt=""></p>
<p><em><strong>- 여기서 기존 kill은 PID를 통해 프로세스를 종료하는 반면 pkill은 CMD 즉 man을 통해 pkill man 으로 man프로세스를 종료시킨다.</strong></em></p>
<h1 id="포그라운드-및-백그라운드-작업">포그라운드 및 백그라운드 작업</h1>
<ul>
<li>포그라운드 프로세스 : 입력한 명령의 결과가 출력될때까지 기다리는 프로세스</li>
</ul>
<p>--&gt; 작업이 완료될 때까지 기다려야 함.</p>
<p>--&gt; sleep 명령으로 확인
ex) sleep 10 --&gt; 10초 뒤 sleep 이 종료되기 이전에는ㅍ ㅡ롬프트가 다른 명령 받을 수 없음</p>
<ul>
<li>백그라운드 작업 : 프로세스가 실행되는 동안 다른 프로세스의 실행이 가능 </li>
</ul>
<p>실행방법 : 명령 끝에 &amp; 기호 추가</p>
<p>ex) sleep 10 &amp; --&gt; sleep 명령을 백드라운드로 실행</p>
<p>--&gt; 백드라운드 단점 : 작업 결과가 뒤섞여 결과 확인 어려움</p>
<h1 id="작업-제어">작업 제어</h1>
<ul>
<li><p>작업 전환 : 포그라운드 &lt;--&gt; 백그라운드</p>
</li>
<li><p>작업 일시 중지 : 작업을 잠시 중단</p>
</li>
<li><p>작업 종료 : 프로세스를 종료하는 것처럼 작업을 종료</p>
</li>
<li><p>jobs 명령어 : 현재 백그라운드에서 실행중인 작업 목록 출력</p>
</li>
</ul>
<p>--&gt; 형식 : jobs [ &amp;id ] ( id에는 jobs 명령으로 확인한 작업 번호 작성</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/a53cfd99-0958-45f6-8ed8-67fd8dca33d9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/cf2df707-2386-44bf-987d-521016b0a1c7/image.png" alt=""></p>
<ul>
<li><p>^Z([ Ctrl ]+x) 또는 stop 명령은 현재 포그라운드 작업을 Stopped 상태로 바꿔 잠시 정지시킴(<strong>종료하는 것이 아님</strong>)</p>
</li>
<li><p>작업 종료: ctrl + c , kill 명령</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/e8ce7dce-d6c7-496c-97d9-a96c18448ec2/image.png" alt=""></p>
<h1 id="시스템-성능-모니터링">시스템 성능 모니터링</h1>
<ul>
<li>top 명령 : 현재 실행 중인 프로세스의 정보를 주기적으로 출력</li>
</ul>
<p>--&gt; 형식 : top [ option ]</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/4cd817ac-10f6-433b-9614-ac50dd0fe1cf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/a6dd1cae-ea5b-4985-9b23-e4dfc4cbb0c9/image.png" alt=""></p>
<ul>
<li>htop 명령 : top 명령의 그래픽 버전( 색깔 추가 가시성 보완 )</li>
</ul>
<h1 id="시스템-사용자-관리">시스템 사용자 관리</h1>
<ul>
<li>런레벨 : 시스템 관리의 용이함을 위하여 서비스의 실행을 단계별로 구분하여 적용한 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/076eacf8-ae2b-41cf-8b94-a285dbf29845/image.png" alt=""></p>
<h1 id="사용자-계정-관련-파일">사용자 계정 관련 파일</h1>
<ul>
<li>/etc/passwd 파일 : 리눅스에 생성되어 있는 모든 사용자 계정의 간단한 정보를 저장 (7가지 항목) --&gt; 비번은 x로 표시됨 --&gt; 파일 유출된 경우에도 계정의 비밀번호를 알지 못하도록 하기위해 !</li>
</ul>
<ul>
<li><p>/etc/shadow 파일 : 사용자 암호에 대한 정보를 별도로 관리하는 파일(9가지 항목)  </p>
</li>
<li><p>/etc/login.defs/ 파일 : 계정에 필요한 기본값을 정의</p>
</li>
</ul>
<p>-/etc/group/ 파일 : 시스템에 생성된 그룹에 관한 정보가 저장된 파일</p>
<ul>
<li><p>/etc/gshadow/ 파일 : 각 그룹에 대한 비밀번호가 저장된 파일</p>
</li>
<li><p>/etc/skel 디렉터리 : 사용자 홈 디렉터리에 공통으로 배포해야할 파일 가지고 있음</p>
</li>
</ul>
<h1 id="사용자-관리-명령어">사용자 관리 명령어</h1>
<h2 id="사용자-생성-명령어">사용자 생성 명령어</h2>
<ul>
<li>useradd 명령 : 사용자 계정 생성</li>
<li>-&gt; 사용법 : <em><strong>useradd [ options ] &lt; user &gt;</strong></em></li>
<li>-&gt; 옵선 없이 사용하면, sh 쉘을 사용하고, 사용자명과 동일한 이름의 그룹에 속하며, 홈 디렉터리가 없는 상태를 기본값으로 가진 새로운 계정이 생성</li>
</ul>
<p>--&gt; 홈 디렉터리를 가진 bill 계정생성 : <em><strong>sudo useradd -m bill</strong></em>  ( -m 은 사용자의 홈 디렉터리를 생성하는 옵션 )</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/bb492148-4464-4882-a77d-4fdd7efcebdf/image.png" alt=""></p>
<ul>
<li>passwd 명령 : 계정의 새로운 비밀변호를 설정</li>
<li>-&gt; 사용법 : passwd &lt; user &gt;</li>
<li>-&gt; &lt; user &gt;로 비밀번호를 변경할 사용자를 지정하지 않으면, 현재 로그인한 계정의 비밀번호를 변경</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/0116663a-b184-4b50-ad5d-bd6d9bf3adc3/image.png" alt=""></p>
<ul>
<li>su 명령 : 현재 계정을 로그아웃 하지 않고 다른 계정으로 전환</li>
</ul>
<p>--&gt; 사용법 : su [ option ] &lt; user &gt;</p>
<h2 id="사용자-정보-수정-명령어">사용자 정보 수정 명령어</h2>
<ul>
<li>usermod 명령 : 사용자 계정 정보를 수정</li>
</ul>
<p>--&gt; 사용법 : usermod [ options ] &lt; user &gt; </p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/edf53a52-dc79-4825-8ba9-9b32d27ed445/image.png" alt=""></p>
<h2 id="사용자-삭제-명령어">사용자 삭제 명령어</h2>
<ul>
<li>userdel 명령 : 사용자 계정을 삭제.</li>
</ul>
<p>---&gt; 사용법 : userdel [ option ] &lt; user &gt;
---&gt; 옵션 : *<em>-r *</em>: 사용자의 홈 디렉터리까지 삭제</p>
<h1 id="그룹-관리-명령어">그룹 관리 명령어</h1>
<h2 id="그룹-생성-명령어">그룹 생성 명령어</h2>
<ul>
<li>groupadd 명령 : 그룹 생성</li>
</ul>
<p>--&gt; 사용법 : groupadd [ options ] &lt; groupname &gt;</p>
<p>--&gt; 옵션 : -g &lt; gid &gt; : 생성할 그룹의 GID 지정</p>
<h2 id="그룹-정보-수정-명령어">그룹 정보 수정 명령어</h2>
<ul>
<li>groupmod 명령 : 그룹 정보 수정</li>
</ul>
<p>--&gt; 사용법 : groupmod [ options ] &lt; group &gt;</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/8bf01d73-3601-4a75-91e0-dc91a625ad3b/image.png" alt=""></p>
<h2 id="그룹-암호-변경-명령어">그룹 암호 변경 명령어</h2>
<ul>
<li>gpasswd 명령 : /etc/passwd/ 와 /etc/gshadow/ 파일을 관리</li>
</ul>
<p>--&gt; 사용법 : gpasswd [ options ] &lt; group &gt;</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/c0378ce4-567e-4102-8074-825cc3746bba/image.png" alt=""></p>
<p><em><strong>sudo gpasswd -a linus itgeeks</strong></em> --&gt; itgeeks 그룹의 linus 라는 그룹원 추가</p>
<p><em><strong>sudo gpasswd -d linus itgeeks</strong></em> --&gt; itgeeks 그룹의 linus 라는 그룹원 삭제</p>
<h2 id="기본-그룹-변경-명령어">기본 그룹 변경 명령어</h2>
<p><strong>- newgrp 명령 : 현재 사용자의 기본 그룹을 변경</strong>
--&gt; 사용법 : newgrp &lt; group &gt;</p>
<h2 id="그룹-삭제-명령어">그룹 삭제 명령어</h2>
<ul>
<li>groupdel 명령 : 그룹 삭제</li>
<li>-&gt; 사용법 : groupdel &lt; group &gt;</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/f3193cc6-4a08-4912-a873-e026af5c3b7c/image.png" alt=""></p>
<h1 id="사용자-식별-명령어">사용자 식별 명령어</h1>
<p>---&gt; 리눅스에서 사용자의 신원을 식별하고, 파일 시스템 및 프로세스 권한을 관리하는데 사용</p>
<p>– UID(User ID) : 사용자의 고유 식별 번호
– RUID(Real User ID) : 프로세스를 시작한 실제 사용자의 UID --&gt; <em><strong>who am i</strong></em> 명령을 통해 확인
– EUID(Effective User ID) : 프로세스가 현재 수행 중인 작업에 대해 실제로 적용되는 UID --&gt; <em><strong>whoami</strong></em> 명령을 통해 확인</p>
<h2 id="사용자-정보-관리-명령어">사용자 정보 관리 명령어</h2>
<ul>
<li>who 명령 : 현재 시스템을 사용하는 사용자의 정보 출력</li>
<li>-&gt; who [ option ]</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/075974f2-7a8a-478e-ab79-18e416783a0f/image.png" alt=""></p>
<ul>
<li>w 명령 : 현재 시스템을 사용하는 사용자의 정보와 작업 정보 출력</li>
</ul>
<p>--&gt; 사용법 : w [ option ] [ user ]</p>
<ul>
<li>last 명령어 : 시스템에 사용자들이 로그인/로그아웃한 정보를 출력</li>
</ul>
<p>--&gt; last [ user ]</p>
<ul>
<li>groups 명령 : 사용자 계정이 속한 그룹 출력</li>
</ul>
<p>--&gt; 사용법 : groups [ user ]</p>
<h2 id="파일-소유권-변경-명령어">파일 소유권 변경 명령어</h2>
<ul>
<li>chown 명령 : 파일/디렉터리 소유자나 소유 그룹을 변경</li>
</ul>
<p>--&gt; 사용법 : 사용법 : chown [ option ] &lt; user &gt; &lt; file &gt;</p>
<p>--&gt; 옵션 : -R : 서브 디렉터리의 소유자와 소유 그룹도 변경</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/c7a03669-f880-4726-a719-a992a14f0be1/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[오픈소스 라이선스]]></title>
            <link>https://velog.io/@ryan_han/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4</link>
            <guid>https://velog.io/@ryan_han/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4</guid>
            <pubDate>Mon, 16 Dec 2024 16:12:55 GMT</pubDate>
            <description><![CDATA[<h1 id="소프트웨어의-배포-모델">소프트웨어의 배포 모델</h1>
<p>** 소프트웨어의 배포 모델과 라이선스</p>
<ul>
<li><p>상용 소프트웨어를 사용할 때 비용을 지불한다 </p>
</li>
<li><p>-&gt; 비용 지불 = 라이선스 획득 ( SW 사용에 대한 권리만 획득)</p>
</li>
<li><p>오픈소스 소프트웨어는 사용할 때 비용을 지불하지 않는 경우 많음</p>
</li>
<li><p>-&gt; 사용, 수정, 배포를 위해서는 오픈소스 라이선스를 준수해야한다.</p>
</li>
<li><p>-&gt; 준수하지 않는다 ? -&gt; 법적 리스크 발생</p>
</li>
</ul>
<p>** 소프트웨어의 배포모델</p>
<ol>
<li>독점 소프트웨어 </li>
</ol>
<ul>
<li>저작권 소유자가 완전히 통제, <em><strong>소스코드 비공개</strong></em>.</li>
<li>사용자는 소프트웨어를 사용하기 위해 <em><strong>라이선스를 구매</strong></em>.</li>
<li>사용자는 소프트웨어를 수정하거나 재배포할 수 없다.</li>
</ul>
<ol start="2">
<li>프리웨어</li>
</ol>
<ul>
<li>사용자에게 _<strong>무료로 제공</strong>_되는 소프트웨어 </li>
<li>독점 소프트웨어와 유사하게 <em><strong>소스코드 비공개</strong></em></li>
<li>-&gt; 단점 : 업데이트 불확실, 기술 지원 부족</li>
</ul>
<ol start="3">
<li>쉐어웨어</li>
</ol>
<ul>
<li>_<strong>일정 기간 동안 무료</strong>_로 사용할 수 있는 소프트웨어</li>
<li>기간이 끝나면 라이선스를 구입해야한다.</li>
</ul>
<p>4, 오픈소스 소프트웨어</p>
<ul>
<li><strong>소스코드가 공개되어 누구나 수정하고 배포할 수 있는 소프트웨어</strong></li>
<li>사용자가 소스코드에 접근, 수정, 사용, 재배포할 수 있는 권리를 가지고 있음.</li>
</ul>
<ol start="5">
<li>프리 소프트웨어</li>
</ol>
<ul>
<li>사용자에게 자유롭게 사용, 수정, 복사, 배포 권리 부여</li>
</ul>
<h3 id="오픈소스-소프트웨어-장단점">오픈소스 소프트웨어 장단점</h3>
<p>장점</p>
<ul>
<li>초기 개발비용이 작다</li>
<li>독점 프로그램에 비해 기술 발전 속도가 빠르다.</li>
<li>다른 SW간의 상호 연동성이 보장된다.</li>
<li>강력한 네트워킹 기능 지원</li>
</ul>
<p>단점</p>
<ul>
<li>GUI 애플리케이션이 부족</li>
<li>상용 프로그램에 비해 체계적인 문서를 가지고 있지 못하다.</li>
<li>독점 프로그램에서 볼 수 있는 로드맵을 기대하기 어려움</li>
<li>Royalty-free 요구( 라이선스 구매 등의 권한 획득시 지속적으로 사용할 수 있는 것)</li>
</ul>
<hr>
<h1 id="오픈소스-라이선스의-정의">오픈소스 라이선스의 정의</h1>
<p>** 오픈소스 라이선스의 정의</p>
<ul>
<li>소프트웨어의 소스코드를 공개하고, 누구나 해당 코드를 자유롭게 사용, 수정, 배포할 수 있는 권리를 부여하는 법적 합의.</li>
</ul>
<p>** 오픈 소스 소프트웨어의 기본 원칙</p>
<ul>
<li>소스코드의 공개</li>
<li>자유로운 재 배포</li>
<li>소스코드의 무결성 유지</li>
<li>개별 사용자 및 단체가 변경된 버전을 배포할 수 있는 권리</li>
</ul>
<p>** 오픈 소스 라이선스의 순기능</p>
<ul>
<li>개발자 간의 협업을 강화 --&gt; 지식의 확산</li>
<li>사용자와 개발자 모두가 기술 발전에 기여 --&gt; 기술 혁신을 촉진</li>
</ul>
<hr>
<h1 id="주요-오픈소스-라이선스">주요 오픈소스 라이선스</h1>
<p>** 상호적/전염성 라이선스 : 배포시 소스코드 제공의무 있음</p>
<p>** 허용적 라이선스 : 배포 시 소스코드 제공의무 없음</p>
<p>** GNU : 자유 소프트웨어 재단에서 개발</p>
<p>** 전염성 라이선스 : 수정된 버전 재배포 시 라이선스 공개</p>
<p>** AGPL : GPL을 기반으로 네트워크를 통해 서비스를 제공하는 경우 소스코드 접근 권한이 추가된 라이서스</p>
<p>** 허용적 라이선스 : 사용자와 개발자에게 광범위한 자유를 제공, 수정된 소스코드는 동일한 라이선스 하에 공개할 필요 없음.</p>
<p>** BSD : SW 사용, 복사, 수정 및 재배포에 상대적으로 제약이 적다. --&gt; 개발자가 법적 책임 지지 않음.</p>
<hr>
<h1 id="소프트웨어의-빌드-과정">소프트웨어의 빌드 과정</h1>
<p>빌드 = 소스코드를 바이너리로 만드는 과정</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/346a8cc5-56ca-44cf-b781-4984c53fb186/image.png" alt=""></p>
<p>소스코드 = 개발자가 프로그래밍 언어로 개발한 SW 문서</p>
<p>목적파일 = 소스코드를 컴파일해서 생긴 파일(실행되지 않음, .obj)</p>
<p>바이너리 = 컴퓨터가 이해할 수 있는 기계어</p>
<ul>
<li>실행파일 (.exe) : main 함수가 포함되어 실행할 수 있는 바이너리</li>
<li>라이브러리 : main 함수 없이 함수로만 구성된 바이너리</li>
<li>-&gt; 정적 라이브러리 : 실행파일에 포함되어 메모리에 적재</li>
<li>-&gt; 동적 라이브러리 : 실행파일과 별도로 메모리에 적재</li>
</ul>
<p>** 소프트웨어의 빌드 과정</p>
<ul>
<li>컴파일러 : 소스코드를 목적파일로 변환</li>
<li>링커 : 목적파일과 라이브러리를 묶어 실행파일 생성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/591071f4-dbf7-4031-858f-5c8f0f2e5e85/image.png" alt=""></p>
<p>** 오픈소스 소프트웨어 활용과 라이선스 정책</p>
<ul>
<li><p>GPL 소스코드 포함</p>
</li>
<li><p>-&gt; GPL 소스코드를 본인 코드와 결합하여 배포하는 경우, 결과물 전체는 GPL 라이선스를 따라야 한다. 따라서 배포시 전체 소스코드를 공개해야한다.</p>
</li>
<li><p>GPL 라이브러리 링크</p>
</li>
<li><p>-&gt; 본인 코드가 GPL 라이선스 라이브러리와 링크될 경우, 전체 결과물은 GPL 라이선스를 따라야 하며, 소스코드 공개해야함</p>
</li>
<li><p>LGPL 소스코드 포함</p>
</li>
<li><p>-&gt; 본인 코드와 LGPL 소스코드를 결합하여 배포하면, 결합된 결과물은 혼합 라이선스가 됨. LGPL 부분에 대해서는 소스코드 공개가 필요하지만, 내 코드는 독립적으로 유지할 수 있음.</p>
</li>
<li><p>LGPL 라이브러리 링크</p>
</li>
<li><p>-&gt; 본인 코드가 LGPL 라이브버리와 링크될 경우, 본인 코드를 공개할 필요 없지만, LGPL 라이브러리에 대한 수정 사항은 공개해야한다.</p>
</li>
<li><p>BSD 소스코드 포함</p>
</li>
<li><p>-&gt; 본인 코드와 BSD 소스코드를 결합하여 배포하면, BSD 라이선스 조건을 따르되 개발한 코드는 비공개로 유지 가능, BSD는 소스코드 공개를 강제하지 않지만, 저작권 고지를 해야함.</p>
</li>
<li><p>MPL 소스코드 포함</p>
</li>
<li><p>-&gt; 본인 코드와 MPL 소스코드를 결합하여 배포하면, MPL 소스코드 부분에 대해서는 소스코드를 공개해야한다.</p>
</li>
<li><p>-&gt; MPL은 파일 단위로 적용되기 떄문에, 개발한 코드 파일이 MPL 코드를 포함하지 않으면 비공개로 유지할 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 개념 정리]]></title>
            <link>https://velog.io/@ryan_han/Git-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@ryan_han/Git-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 16 Dec 2024 12:27:32 GMT</pubDate>
            <description><![CDATA[<h1 id="소스코드-형상관리-시스템">소스코드 형상관리 시스템</h1>
<p>CVS : 서버와 클라이언트로 구분된 시스템, 롤백 불가능</p>
<p>SVN : CVS의 제한적인 기능을 대체하기 위해 개발, 롤백 가능</p>
<p>Git : 분산형 버전 관리 시스템, 리눅스 토발즈가 리눅스 커널 개발 위해서 만듦. 원격서버 상태에 구애받지 않고 형상관리 가능</p>
<p>GitHub : 프로젝트 저장뿐만 아니라, 다른 사용자들과 함께 코드 공유, 및 협업 같이 할 수 있도록 함.</p>
<p>GitHub에서 사용하는 저장소 종류</p>
<ol>
<li><p>저장소 : 파일이나 디렉토리를 저장하는 장소</p>
</li>
<li><p>로컬 저장소 : 본인 PC에 파일이 저장되는 개인 저장소</p>
</li>
<li><p>원격 저장소 : 서버 등 네트워크에 있는저장소, GitHub에서 관리되고 있는 저장소.</p>
</li>
</ol>
<p>--&gt;&gt; 로컬저장소에서 작업을 수행하고, 그 결과를 원격저장소에 저장함. </p>
<h1 id="분산-버전-관리-시스템dvcs">분산 버전 관리 시스템(DVCS)</h1>
<p>DVCS</p>
<ul>
<li>서버에 등록되어 있는 프로젝트의 버전 관리 정보를 전부 복제</li>
<li>서버에 문제가 생겨도, 복제물로 문제없이 협업 진행 가능</li>
<li>사용자가 가진 작업물을 서버에 저장할 수 있음</li>
</ul>
<h1 id="git-개념">Git 개념</h1>
<p>**Git 탄생 배경</p>
<ul>
<li><p>리눅스 커널 개발을 위해 DVCS이 필요하여 Git이 탄생</p>
</li>
<li><p>-&gt; 리눅스 커널을 압축 파일을 이용하여 단순하게 관리</p>
</li>
<li><p>Git 목표 : 빠른 속도, 단순한 구조, 비선형적 개발, 완벽한 분산. </p>
</li>
</ul>
<p>**스냅샷이란</p>
<ul>
<li>특정 시점의 파일 상태( Git은 스냅샷 방식으로 형상관리)</li>
<li>시간 순으로 프로젝트의 스냅샷을 생성</li>
<li>수정되지 않은 파일은 이전 스냅샷의 파일을 그대로 참조</li>
<li>파일 크기가 크고 변경점이 많은 프로젝트에서도 유용</li>
</ul>
<p>** Git에서 사용하는 영역</p>
<ul>
<li><p>작업 디렉터리 : 버전 관리가 필요한 파일이 저장되어 있는 디렉터리, .git 디렉터리에 반영</p>
</li>
<li><p>스테이징 영역 : 곧 커밋할 파일에 대한 정보를 담은 영역</p>
</li>
<li><p>.git 디렉터리 : Git의 버전관리를 위한 데이터가 저장</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/06a36f8f-c64c-45bb-bbeb-111fd37c4644/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[영읽토 내용정리(6,8,9,10과)]]></title>
            <link>https://velog.io/@ryan_han/%EC%98%81%EC%9D%BD%ED%86%A0-%EB%82%B4%EC%9A%A9%EC%A0%95%EB%A6%AC68910%EA%B3%BC</link>
            <guid>https://velog.io/@ryan_han/%EC%98%81%EC%9D%BD%ED%86%A0-%EB%82%B4%EC%9A%A9%EC%A0%95%EB%A6%AC68910%EA%B3%BC</guid>
            <pubDate>Tue, 10 Dec 2024 11:04:13 GMT</pubDate>
            <description><![CDATA[<h1 id="10-1-turning-ideas-into-reality">10-1 (Turning Ideas Into Reality)</h1>
<ol>
<li><p>인터넷 접근의 불균형 문제</p>
<ul>
<li>인터넷은 전 세계적인 정보 교환을 가능하게 하지만, 농촌 지역은 인터넷 접근이 어려운 경우가 많음. <em><strong>농촌지역 사람들은 휴대폰을 가지고 있지만 인터넷 연결이 어려움</strong></em></li>
</ul>
</li>
</ol>
<ol start="2">
<li><p>켄 뱅크스와 FrontlineSMS</p>
<ul>
<li>켄 뱅크스는 인터넷 없이 휴대폰으로 정보를 교환할 수 있는 무료 소프트웨어 FrontlineSMS를 개발.</li>
</ul>
</li>
</ol>
<ul>
<li><p>이 소프트웨어는 컴퓨터와 휴대폰을 연결해 문자 메시지를 통해 양방향 소통을 가능하게 함.</p>
</li>
<li><p>활용 사례:</p>
</li>
<li><ul>
<li>말라위에서 의료 프로그램에 활용.</li>
</ul>
</li>
<li><ul>
<li>나이지리아의 선거 모니터링.</li>
</ul>
</li>
<li><ul>
<li>아이티의 재난 구호 지원.</li>
</ul>
</li>
<li><ul>
<li>현재 190여 개국에서 사용 중.</li>
</ul>
</li>
</ul>
<ol start="3">
<li>성공적인 아이디어 실현 방법</li>
</ol>
<ul>
<li><p>아이디어 검증:
철저히 조사하고, 커뮤니티와 소통하여 필요한지 확인.</p>
</li>
<li><p>홍보:
소셜 미디어(Facebook, Twitter 등)와 블로그로 아이디어 알리기.
같은 분야의 사람들과 네트워킹.</p>
</li>
<li><p>자금 조달:
소셜 네트워크를 활용.
기부자들에게 신뢰를 얻기 위해 준비된 모습을 보여야 함.</p>
</li>
</ul>
<ol start="4">
<li>전하고자 하는 메시지</li>
</ol>
<ul>
<li>혁신은 간단한 관찰에서 시작될 수 있으며, 아이디어와 열정만 있으면 세상을 바꿀 수 있음.</li>
</ul>
<h2 id="10-2-lessons-in-business">10-2 (Lessons In Business)</h2>
<p>&lt;가이 가와사키의 경력과 주요 교훈&gt;</p>
<ul>
<li>초기 경력</li>
</ul>
<p>-- 1979년 UCLA에서 MBA 학위 취득 후 보석 회사에서 근무.
-- 이때 사장 마틴 그루버에게 <strong>“특징이 아닌 혜택을 판매하라”</strong>는 교훈을 배움.</p>
<p>---&gt; <em><strong>제품이 어떤 기능을 가지고 있는지를 설명하기보다, 그 기능이 고객의 삶에 어떤 도움을 주는지를 강조하라 라는 뜻임.</strong></em></p>
<p>-- 이후 Apple에서 이 교훈을 활용하여 큰 성공을 거둠.</p>
<ul>
<li>Apple에서의 경험</li>
</ul>
<p>-- “수석 전도사” 역할로 Apple 제품의 가치를 홍보하고 열정을 전파.
-- Apple의 법률 고문 알 아이젠스타트에게 기업 정치의 기술을 배워, 권력 투쟁 속에서도 갈등을 피함.
-- Apple의 공동 창립자 스티브 잡스에게서 큰 영향을 받음.</p>
<p>&lt;스티브 잡스에게 배운 네 가지 교훈&gt;</p>
<ul>
<li><em><strong>고객의 진짜 필요를 이해하라</strong></em></li>
</ul>
<p>----&gt; 고객은 보기 전까지 자신이 무엇을 원하는지 모름.
----&gt; 기업가는 고객보다 먼저 문제를 발견하고 해결해야 함.</p>
<ul>
<li><em><strong>전문가를 맹신하지 말라</strong></em></li>
</ul>
<p>----&gt; 전문가(컨설턴트, 애널리스트 등)는 소비자와 단절된 경우가 많음.
----&gt; 직접 조사하고, 소비자와 소통하며 데이터를 얻어야 함.</p>
<ul>
<li><em><strong>디자인의 중요성</strong></em></li>
</ul>
<p>----&gt; Apple의 성공 비결: 단순함, 우아함, 재미.
----&gt; 아름다운 디자인은 높은 품질과 가치감을 전달하며, 소비자의 구매 결정을 유도.</p>
<ul>
<li><em><strong>직원들에게 큰 목표를 제시하라</strong></em></li>
</ul>
<p>----&gt; 단순화하지 않고 도전적인 목표를 설정하여 최고 성과를 유도.
----&gt; 스는 디테일과 높은 기준을 중시하여 혁신을 이루어냄.</p>
<p>&lt;&lt;소셜 미디어를 활용한 제품 판매 팁 (가와사키의 조언)&gt;&gt;</p>
<ul>
<li><em><strong>자주 게시</strong></em></li>
</ul>
<p>---&gt; 지속적인 게시물로 고객과 소통 유지.</p>
<ul>
<li><em><strong>삶을 개선하는 콘텐츠</strong></em></li>
</ul>
<p>---&gt; 고객에게 실질적인 가치를 제공하는 글을 올림.</p>
<ul>
<li><em><strong>멀티미디어 활용</strong></em></li>
</ul>
<p>---&gt; 모든 게시물에 사진 또는 동영상을 포함해 시각적 관심을 유도.</p>
<ul>
<li><em><strong>게시물 반복</strong></em></li>
</ul>
<p>---&gt; 시간대와 일정이 다른 사람들을 위해 동일한 콘텐츠를 반복 게시.</p>
<blockquote>
<p><em><strong>&lt;핵심 메시지&gt;
가이 가와사키는 Apple과의 경험에서 얻은 교훈을 바탕으로, 제품의 혜택을 강조하고 고객의 요구를 이해하며, 강력한 디자인과 혁신적인 사고로 성공을 거둔 기업가.
소셜 미디어를 활용해 제품을 효과적으로 홍보할 수 있는 실질적인 전략도 제안.</strong></em></p>
</blockquote>
<h1 id="9-1-what-are-feathers-for">9-1 (What Are Feathers For?)</h1>
<ol>
<li>깃털의 기원과 초기 구조</li>
</ol>
<ul>
<li>수각류 공룡: 약 1억 2,500만 년 전의 공룡 화석에서 발견된 원시적인 깃털은 얇은 털층으로 덮여 있었음.</li>
<li>이 초기 깃털은 이후 깃털의 진화와 역할을 이해하는 데 중요한 단서를 제공함.</li>
</ul>
<ol start="2">
<li>깃털 진화의 세 가지 주요 이유</li>
</ol>
<ul>
<li><p>단열(보온)</p>
<p>--&gt; 깃털은 초기 공룡이 체온을 유지하고 어린 개체를 보호하는 역할을 했을 가능성이 큼.
--&gt; 둥지 위에 팔을 펼친 화석과 현대 새의 부드러운 깃털이 이 이론을 뒷받침함.</p>
<ul>
<li>시각적 매력(이성 유인)</li>
</ul>
<p>--&gt; 다양한 색상과 패턴은 짝을 유인하는 데 사용됨.
--&gt; 예: 공작새의 화려한 꼬리는 짝을 유인하는 데 중요.
--&gt; 깃털 내부에서 발견된 멜라노좀은 색깔을 만들어 내며, 이는 현대 새와 유사한 특징임.</p>
<ul>
<li>비행</li>
</ul>
<p>--&gt; 현대 새의 비행 깃털은 비대칭 구조_<strong>(한쪽은 얇고 단단하며, 다른 쪽은 길고 유연함)</strong>_로 되어 있어 비행에 최적화.</p>
<p>--&gt; 깃털을 사용한 비행은 달리면서 팔을 위아래로 움직이거나, 나무에서 뛰어내리며 시작되었을 가능성이 높음.</p>
</li>
</ul>
<ol start="3">
<li>안키오르니스: 중요한 연결고리</li>
</ol>
<ul>
<li>약 1억 5천만 년 전의 공룡으로, 닭 크기의 몸에 흑백 깃털을 가짐.</li>
<li>-&gt; 깃털은 현대 새와 비슷했지만 _<strong>대칭적</strong>_이어서 날지는 못했음.</li>
<li>-&gt; 화석에서 발견된 팔의 움직일 수 있는 뼈는 깃털이 나무 사이를 뛰거나 활공하며 비행을 진화시켰음을 시사.</li>
</ul>
<ol start="4">
<li>깃털의 진화 과정
--&gt;  체온 유지, 짝 유인, 비행과 같은 다양한 목적에 맞게 발전.
--&gt;  디자인, 색상, 구조의 변화는 공룡과 새의 생존과 번성에 크게 기여.
--&gt; 초기 깃털은 공룡의 생존에 필수적이었고, 이후 새들이 하늘로 날아오를 수 있는 토대가 됨.</li>
</ol>
<p>&lt;결론&gt;</p>
<blockquote>
<p><em><strong>깃털은 다양한 생존과 적응적 이점을 제공하며, 보온, 짝 유인, 비행을 가능하게 한 혁신적인 진화의 산물임.</strong></em></p>
</blockquote>
<h1 id="9-2-design-by-nature">9-2 (Design By Nature)</h1>
<p>&lt;1. 투칸의 부리&gt;</p>
<ol>
<li><p>부리의 특징</p>
<ul>
<li>투칸, 특히 토코투칸은 새 전체 길이의 약 1/3(15~23cm) 길이의 커다란 주황색-노란색 부리를 가짐.</li>
<li>부리는 가볍지만 튼튼하게 설계되었으며, 케라틴(사람의 손톱과 머리카락의 주성분)으로 만들어짐.</li>
<li>내부는 공기가 많이 포함된 거품 같은 구조와 얇은 뼈 네트워크로 이루어져 있어 단단하지만 가벼움.</li>
</ul>
</li>
<li><p>부리의 역할</p>
<ul>
<li><p>짝 유인: 찰스 다윈은 부리가 짝을 끌어들이는 역할을 한다고 이론화.</p>
</li>
<li><p>다양한 기능: 과일 자르기, 싸움에서 방어, 포식자에 대한 경고.</p>
</li>
<li><p>체온 조절: 부리에 혈액이 유입되면 열을 방출해 투칸의 몸을 식히는 데 도움.</p>
</li>
</ul>
</li>
<li><p>부리의 응용</p>
</li>
</ol>
<ul>
<li>투칸 부리의 구조는 자동차와 항공기 설계에 영감을 제공.</li>
<li>연구에 따르면 이 구조는 고에너지 충격을 잘 흡수하여 충돌 시 탑승자를 더 안전하게 보호할 수 있음.</li>
</ul>
<p>&lt;2. 상어 비늘&gt;</p>
<ol>
<li>비늘의 구조와 역할</li>
</ol>
<ul>
<li>상어 피부는 매끄러워 보이지만 실제로는 이빨과 같은 재질로 된 작은 비늘로 덮여 있음.</li>
<li>비늘의 유연성: 물의 흐름에 따라 위로 올라가거나 평평해질 수 있음.</li>
<li>항력 감소: 비늘이 상어 주변 물의 흐름에 적응하여 속도를 높이고 효율적으로 헤엄칠 수 있도록 도움.</li>
</ul>
<ol start="2">
<li>짧은지느러미 마코 상어의 비늘 연구</li>
</ol>
<ul>
<li>비늘의 크기와 유연성이 상어 몸 전체에서 다름.</li>
<li>예: 몸 양쪽 비늘은 가늘고 잘 움직여 항력을 줄이는 데 적합.</li>
</ul>
<ol start="3">
<li>비늘의 응용</li>
</ol>
<ul>
<li>비행기: 상어 비늘 구조를 모방하면 항력을 줄여 속도를 높이는 데 사용 가능.</li>
<li>수영복과 선박 코팅: 상어 비늘의 특성을 활용해 더 빠르고 효율적인 디자인을 개발.</li>
</ul>
<blockquote>
</blockquote>
<p>_**&lt;설명&gt;
투칸의 부리는 생존과 적응을 위한 다목적 도구입니다. 단단하면서도 가벼운 설계는 자연의 혁신적인 구조로, 이를 통해 열 조절과 다양한 활동이 가능해졌습니다.
상어의 비늘은 물 속에서의 항력을 최소화하는 데 최적화된 구조로, 이는 속도와 민첩성을 높이는 데 기여합니다.</p>
<blockquote>
<p>이러한 자연의 설계는 자동차, 항공기, 수영복 등 다양한 현대 기술에 영감을 주며, 효율성과 안전성을 높이는 데 활용되고 있습니다.**_</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] 버블 정렬과 선택정렬]]></title>
            <link>https://velog.io/@ryan_han/Algorithm-%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%AC%EA%B3%BC-%EC%84%A0%ED%83%9D%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@ryan_han/Algorithm-%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%AC%EA%B3%BC-%EC%84%A0%ED%83%9D%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Wed, 13 Nov 2024 12:00:21 GMT</pubDate>
            <description><![CDATA[<h1 id="bubble-sort버블-정렬">Bubble Sort(버블 정렬)</h1>
<p>버블정렬은 배열에서 2개의 인덱스를 선택하고 비교한다.(오름차순 가정)</p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/040a4d83-c917-444b-aa2c-55126117829c/image.jpg" alt=""></p>
<p><em><strong>왼쪽이 오른쪽보다 크면 교환한다.</strong></em></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/d66f8f74-d793-4ed1-8d03-4cac9a52be85/image.jpg" alt=""></p>
<p><em><strong>오른쪽으로 한칸 이동해서 프로세스를 반복한다.</strong></em></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/ba3b0983-e3dc-4ed5-b2fd-056cd8c8d7e5/image.jpg" alt=""></p>
<p><em><strong>아래 예시로 이해해보자.</strong></em></p>
<p><em><strong>5는 2보다 크므로 서로 swap</strong></em></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/c212cd70-c919-47f9-bb13-f0290336bb78/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/f1a1a051-5a13-4e2c-9028-dd961a304bac/image.jpg" alt=""></p>
<p><em><strong>이번에는 한칸 오른쪽으로 이동해서 5와 6을 비교한다. 왼&lt;오 이므로 swap 하지 않는다.</strong></em></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/c020ba3e-a40c-4a28-b8be-d415d8e7bc81/image.jpg" alt=""></p>
<p><em><strong>다시 오른쪽으로 한 칸 이동해서 6과 3을 비교한다. 6&gt;3 이므로 swap한다.</strong></em></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/01e9decc-e7f3-4fb0-9645-ea9c12481cd1/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ryan_han/post/02a6f570-8b54-4ab8-8c61-37536644217b/image.jpg" alt=""></p>
<p><strong><em>똑같은 방식으로 6과 1을 비교하고 swap, 6과 4를 비교하여 swap 하면 아래와 같이 버블 사이클 1회가 완료된다.</em></strong></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/746b2701-d52b-4351-b316-ce6124c049f0/image.jpg" alt=""></p>
<p><strong><em>나머지를 정렬하려면 다시 처음부터 비교해서 버블정렬을 해주어야한다.</em></strong></p>
<ul>
<li>버블정렬은 배열의 N-1 의 원소들을 하나하나 비교해야하고 사이클마다 계속 비교하고 반복하므로 비효율적인 알고리즘이다.</li>
<li>최악의 경우 모든 원소를 교환해야하므로 시간 복잡도가 O(n^2)이다.</li>
</ul>
<h2 id="selection-sort선택-정렬">Selection Sort(선택 정렬)</h2>
<p><strong>선택 정렬은 전체 원소 중 가장 작은 원소의 위치를 &quot;변수&quot;에 저장한다.</strong></p>
<p><strong>가장 작은 원소 변수를 Min이라고 하자.</strong></p>
<p><strong>배열의 첫번째 원소의 위치를 Min에 저장한다.</strong></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/9e9a38e8-e828-4aaa-903a-58eed4a8ee14/image.jpg" alt=""></p>
<p>*<em>만약 배열을 돌때 첫번째 원소 즉 Min보다 작은 값이 있다면 그 값의 위치를 다시 Min 변수에 저장한다. *</em></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/d65ec047-7ebe-4d12-99ed-d2ced10ffeb1/image.jpg" alt=""></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/0d45b2a5-b3c1-4355-b991-b91af16dd4c7/image.jpg" alt=""></p>
<p><strong>이 과정을 계속 반복해 배열 내에서 가장 작은 숫자가 어디에 있는지 알아냈다. 이제 가장 작은 값을 배열의 맨 앞으로 swap 해준다.</strong></p>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/67a12698-e1df-40b0-8ad3-4f451cd38197/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/ryan_han/post/37d1d727-5159-41ff-b141-1a676005ebbc/image.jpg" alt=""></p>
<p><strong>1은 배열 내에서 가장 작은 값이므로 이미 정렬이 완료된 상태이다. 즉 다음 사이클을 시작할 때는 두번째 원소부터 시작한다. 이 과정을 계속 반복한다.</strong></p>
<ul>
<li><p>선택 정렬의 시간 복잡도: 버블 정렬과 비슷하게 교환, 비교하지만 사이클을 반복할 때마다 한번의 교환만 하면 돼서 버블정렬보단 효율적이다.</p>
</li>
<li><p>하지만 버블정렬과 같은 O(n^2) 복잡도를 가지고 있다.</p>
</li>
</ul>
<p><strong>&lt;선택 정렬 구현 코드 c++&gt;</strong></p>
<pre><code class="language-c">#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;queue&gt;
#include &lt;stack&gt;
#include&lt;algorithm&gt;
#include&lt;limits.h&gt;
using namespace std;

int main(){
    ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    int i,j,min,index,temp;
    vector&lt;int&gt; v={1,10,5,8,7,6,4,3,2,9};

    for(int i=0;i&lt;10;i++){
        min=i;
        for(j=i+1;j&lt;10;j++){
            if(v[min]&gt;v[j]){
                min=j;
            }
            temp=v[i];
            v[i]=v[min];
            v[min]=temp;
        }
    }

    for(int i=0; i&lt;v.size();i++){
        cout&lt;&lt;v[i]&lt;&lt;&quot; &quot;;
    }
    cout&lt;&lt;endl;

    return 0;
}</code></pre>
<p><a href="https://velog.io/@minji0801/%EB%B2%84%EB%B8%94%EC%A0%95%EB%A0%AC-vs-%EC%84%A0%ED%83%9D%EC%A0%95%EB%A0%AC-vs-%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC-%EC%B0%A8%EC%9D%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0%EA%B0%80%EC%9E%90">https://velog.io/@minji0801/%EB%B2%84%EB%B8%94%EC%A0%95%EB%A0%AC-vs-%EC%84%A0%ED%83%9D%EC%A0%95%EB%A0%AC-vs-%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC-%EC%B0%A8%EC%9D%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0%EA%B0%80%EC%9E%90</a> 이분꺼 이미지 참고함~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[응컴프 2주차 과제]]></title>
            <link>https://velog.io/@ryan_han/%EC%9D%91%EC%BB%B4%ED%94%84-2%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C</link>
            <guid>https://velog.io/@ryan_han/%EC%9D%91%EC%BB%B4%ED%94%84-2%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C</guid>
            <pubDate>Wed, 23 Oct 2024 13:06:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>1. 약수 판정</strong></p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
void print_divisor(int value); // 약수 구하는 함수 
int main(void) {
    int number;
    while (1) // 무한 반복
    {
        printf(&quot;약수를 구할 정수 입력(1 이하 종료) : &quot;);
        scanf(&quot;%d&quot;, &amp;number); // 데이터 입력
        if (number &gt;= 2) { // 약수를 구할 수 있다면
            print_divisor(number);
        }
        else { // 약수를 구할 수 없다면
            printf(&quot;%d에 대한 약수를 구할 수 없습니다.\n&quot;, number);
            printf(&quot;프로그램을 종료합니다.\n&quot;);
            break;
        }
        printf(&quot;\n&quot;);
    }
    return 0;
}

void print_divisor(int value) {
    printf(&quot;%d의 약수 : &quot;, value);
    for (int i = 2; i &lt;= value; i++) {
        if (value % i == 0) {
            printf(&quot;%d &quot;, i);
        }
    }
}</code></pre>
<blockquote>
<p><strong>2. 완전수 출력하기</strong></p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
int perfect_number(int number); // 완전수 여부 판별 함수 (반환형 void으로 변경가능) 
int main(void) {
    int number=0;
    printf(&quot;1000 이하의 완전수: \n&quot;);
    perfect_number(number);
    // 반복문 수행 및 perfect_number() 호출하여 완전 수 계산 및 출력 
    for (number = 1; number &lt;= 1000; number++) {
        if (perfect_number(number) == 1) {
            printf(&quot;%d\n&quot;, number);
        }

    }
    return 0;
}
//약수의 합이 자기 자신과 같아져야함.
int perfect_number(int number) {
    int sum = 0;
    for (int i = 1; i &lt; number; i++) {
        if (number % i == 0) {
            sum += i;
        }
    }
    if (sum == number) return 1;

    else return 0;

}</code></pre>
<blockquote>
<p><strong>3. 공 바꾸기</strong></p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
int store[101] = { 0, };
int i, j;
void swap(int a, int b);
int main(void) {
    int N, M;//M은 바꿀 횟수
    scanf(&quot;%d %d&quot;, &amp;N, &amp;M);
    for (int q = 1; q &lt;= N; q++) {
        store[q] = q;
    }
    for (int k = 1; k &lt;= M; k++) {
        scanf(&quot;%d %d&quot;, &amp;i, &amp;j);
        swap(i, j);

    }

    for (int u = 1; u &lt;= N; u++) {
        printf(&quot;%d &quot;, store[u]);
    }


    return 0;
}
void swap(int a, int b) {//값 바꾸는 알고리즘 중요
    int temp;
    temp = store[i];
    store[i] = store[j];
    store[j] = temp;


}</code></pre>
<blockquote>
<p><strong>4. 신문 헤드라인</strong></p>
</blockquote>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;
int main(void) {
    char str[100];

    scanf(&quot;%s&quot;, &amp;str);

    for (int i = 0; str[i] != &#39;\0&#39;; i++) {//널문자를 만날때 까지 반복
        str[i] = toupper(str[i]);
    }//toupper은 문자열 소문자를 대문자로 바꿔줌줌

    printf(&quot;%s&quot;, str);


    return 0;
}</code></pre>
<p><strong>tolower() 함수는 대문자 C를 대응하는 소문자 c로 변환합니다.</strong></p>
<p><strong>toupper() 함수는 소문자 c를 대응하는 대문자 C로 변환합니다.</strong></p>
<p><strong>리턴값</strong></p>
<blockquote>
<p>두 함수는 변환된 문자를 리턴합니다. 문자 c에 대응하는 소문자 또는 대문자가 없으면 함수는 c를 변경하지 않고 리턴합니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[응컴프 과제 7주차]]></title>
            <link>https://velog.io/@ryan_han/%EC%9D%91%EC%BB%B4%ED%94%84-%EA%B3%BC%EC%A0%9C-7%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ryan_han/%EC%9D%91%EC%BB%B4%ED%94%84-%EA%B3%BC%EC%A0%9C-7%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 22 Oct 2024 05:35:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/ryan_han/post/ae8f45cd-d40f-42ad-9e23-433119098dd8/image.jpg" alt=""></p>
<blockquote>
<p>로또 게임 만들기, 빙고게임 만들기</p>
</blockquote>
<h1 id="1-로또-게임-만들기">1. 로또 게임 만들기</h1>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#define N 45
void user_chek(int* arr_user); //사용자가 입력한 숫자 배열에 저장.

void generate_lotto_number(int* arr_lotto); 
//컴퓨터 로또번호 생성(랜덤함수 사용)

int mapping_number(int* arr_user, int* arr_lotto);
//사용자 입력 숫자와 컴퓨터가 생성한 로또번호 중 일치하는 번호 수 카운트

int arr_lotto[6] = { 0 }; //컴퓨터가 임의로 생성하는 번호 6개 저장.
int arr_user[6] = { 0 }; //사용자가 입력하는 6개 번호 저장.
void print_arr(int* arr1, int *arr2); //숫자 출력 
int main(void) {
    int cnt;
    srand((unsigned)time(NULL));
    generate_lotto_number(arr_lotto); //컴퓨터 로또 번호 생성
    user_chek(arr_user); //사용자 숫자 입력 
    print_arr(arr_user,arr_lotto);
    cnt = mapping_number(arr_lotto, arr_user);
    printf(&quot;\n 당첨 번호는 %d개 입니다.\n&quot;, cnt);
    return 0;
}
void user_chek(int* arr_user) {
    for (int i = 0; i &lt; 6; i++) {
        scanf(&quot;%d&quot;, &amp;arr_user[i]);
    }
}
void generate_lotto_number(int* arr_lotto) {
    int existed[46] = { 0, };//중복체크 해주기
    for (int i = 0; i &lt; 6; i++) {
        int num = 0;
        while (existed[num]==1) {//숫자가 존재할 때까지
            num = (rand() % 45) + 1;//이 부분 정말 중요함
        }
        arr_lotto[i] = num;
        existed[num] = 1;//이미 나온 숫자이면 다시 while문으로 돌아가 난수설정 
    }    
}
int mapping_number(int* arr_user, int* arr_lotto) {
    int count = 0;
    for (int i = 0; i &lt; 6; i++) {
        for(int j=0;j&lt;6;j++)//이중 반복문 사용하여 두 배열의 공통인 원소 찾기
        if (arr_user[i] == arr_lotto[j]) {
            count++;
        }
    }
    return count;
}
void print_arr(int* arr1,int *arr2) {
    printf(&quot;사용자 입력: &quot;);
    for (int i = 0; i &lt; 6; i++) {
        printf(&quot;%d &quot;, arr_user[i]);
    }
    printf(&quot;\n&quot;);

    printf(&quot;당첨번호(컴퓨터생성): &quot;);
    for (int i = 0; i &lt; 6; i++) {
        printf(&quot;%d &quot;, arr_lotto[i]);
    }
}

</code></pre>
<p><strong>&lt;stdlib.h&gt; : srand() 와 rand()함수를 사용하기 위해 사용
&lt;time.h&gt; : 함수에 현재 시간을 시드로 설정하여 난수를 더 무작위로 생성하기 위해 사용</strong></p>
<p><strong>int *arr의 뜻 : 정수형 배열을 가리키는 포인터를 나타냄. 이 코드에서는 배열의 시작 주소를 가리키는 역할을 하며 포인터를 사용함으로써 함수 내에서 배열의 값을 직접 수정할 수 있음</strong> <del>~</del></p>
<blockquote>
<p><strong>srand((unsigned)time(NULL))</strong>: 난수 생성기를 초기화하는 코드. time(NULL)을 사용하여 현재 시간을 시드 값으로 전달하여 매번 다른 난수가 생성되도록 합니다._
<strong>generate_lotto_number(arr_lotto)</strong>: 로또 번호를 생성하는 함수 호출.
<strong>user_chek(arr_user)</strong>: 사용자로부터 6개의 로또 번호를 입력받습니다.
<strong>print_arr(arr_user, arr_lotto)</strong>: 입력한 번호와 컴퓨터가 생성한 로또 번호를 출력.
<strong>mapping_number(arr_lotto, arr_user)</strong>: 사용자가 입력한 번호와 컴퓨터가 생성한 번호를 비교해 일치하는 개수를 cnt에 저장.
최종적으로 일치하는 번호의 개수를 출력.</p>
</blockquote>
<p><strong>generate_lotto_number 함수</strong></p>
<pre><code class="language-c">&gt; void generate_lotto_number(int* arr_lotto) {
    int existed[46] = { 0, };
    for (int i = 0; i &lt; 6; i++) {
        int num = 0;
        while (existed[num] == 1) {
            num = (rand() % 45) + 1;
        }
        arr_lotto[i] = num;
        existed[num] = 1;
    }    
}</code></pre>
<blockquote>
<p>이 함수는 컴퓨터가 1부터 45 사이의 숫자 중에서 중복되지 않는 6개의 난수를 생성하여 arr_lotto 배열에 저장합니다.</p>
</blockquote>
<blockquote>
<p>existed[46] 배열은 난수 중복 체크를 위한 배열이다. </p>
</blockquote>
<blockquote>
<p><em><strong>만약 중복 숫자가 나오면 다시 while문으로 가서 num난수를 생성해 중복 숫자가 나오지 않도록 한다.</strong></em></p>
</blockquote>
<blockquote>
<p><strong>(rand() % 45 + 1)</strong>: 1에서 45 사이의 난수를 생성합니다. existed[num]이 1이면 이미 선택된 숫자이므로 다시 난수를 생성합니다.</p>
</blockquote>
<p><strong>mapping_number 함수</strong></p>
<pre><code class="language-c">int mapping_number(int* arr_user, int* arr_lotto) {
    int count = 0;
    for (int i = 0; i &lt; 6; i++) {
        for(int j = 0; j &lt; 6; j++)
            if (arr_user[i] == arr_lotto[j]) {
                count++;
            }
    }
    return count;
}</code></pre>
<blockquote>
<p>사용자가 입력한 숫자와 컴퓨터가 생성한 숫자를 비교하여 일치하는 개수를 계산한다.</p>
</blockquote>
<blockquote>
<p>두 개의 배열을 비교하는 이중 루프를 사용하여, arr_user와 arr_lotto에서 일치하는 숫자가 있을 경우 count를 증가시킨다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1225 (이상한 곱셈)]]></title>
            <link>https://velog.io/@ryan_han/%EB%B0%B1%EC%A4%80-1225-%EC%9D%B4%EC%83%81%ED%95%9C-%EA%B3%B1%EC%85%88</link>
            <guid>https://velog.io/@ryan_han/%EB%B0%B1%EC%A4%80-1225-%EC%9D%B4%EC%83%81%ED%95%9C-%EA%B3%B1%EC%85%88</guid>
            <pubDate>Sat, 19 Oct 2024 07:10:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>문제를 보고 어떻게 하면 문자열을 각각의 인덱스로 나누어 숫자로 저장할지에 대해 고민했다. c++의 #include string 라이브러리에 있는 stoi 함수를 써보려고 했지만 이 함수를 쓰면 각각의 인덱스에 접근이 어려워져 문자열 자체를 바로 숫자로 바꾸는 방법을 생각해냈다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/0d461244-0d48-4a76-8aa4-18f860c81d37/image.png" alt=""></p>
<h1 id="문자열을-숫자로-바꾸는-방법아스키-코드-사용">문자열을 숫자로 바꾸는 방법(아스키 코드 사용)</h1>
<blockquote>
<p>  문자 &#39;0&#39;은 아스키 코드 즉 십진수로 48이므로 1~9의 문자에 대한 십진수의 값-&#39;0&#39;을 하면 실제 숫자가 나온다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/ryan_han/post/06c5f85b-0873-40c2-abff-a0925dde1e11/image.png" alt=""></p>
<blockquote>
<p>만약 문자 4를 숫자 4로 바꾸려면 문자 4의 10진수 값인 52-&#39;0&#39;==4가 되는것을 볼 수 있다.</p>
</blockquote>
<p>#최종코드</p>
<pre><code class="language-c"> #include&lt;iostream&gt;
 #include&lt;vector&gt;
 #include&lt;queue&gt;
 #include &lt;stack&gt;
 #include&lt;algorithm&gt;
 #include&lt;limits.h&gt;
 #include &lt;string&gt;
 using namespace std;

 int main(){
     ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
     string A;
     string B;
     long long sum=0;
     cin&gt;&gt;A&gt;&gt;B;
    for(long long i=0;i&lt;A.length();i++){
        for(long long k=0;k&lt;B.length();k++){
            sum+=(A[i]-&#39;0&#39;)*(B[k]-&#39;0&#39;);
        }
     }
    cout&lt;&lt;sum;
     return 0;
 }
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[소수찾기 알고리즘(1978 백준) 에라토스테네스의 체]]></title>
            <link>https://velog.io/@ryan_han/%EC%86%8C%EC%88%98%EC%B0%BE%EA%B8%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%981978-%EB%B0%B1%EC%A4%80-%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98-%EC%B2%B4</link>
            <guid>https://velog.io/@ryan_han/%EC%86%8C%EC%88%98%EC%B0%BE%EA%B8%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%981978-%EB%B0%B1%EC%A4%80-%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98-%EC%B2%B4</guid>
            <pubDate>Sat, 28 Sep 2024 05:49:22 GMT</pubDate>
            <description><![CDATA[<h1 id="문제를-보고-떠오른-생각">문제를 보고 떠오른 생각</h1>
<p>일단 1은 소수가 아니기 때문에 제외하고 2부터 (입력받은 값-1)까지 i를 증가시키면서 입력받은 값을 i로 나눈 나머지가 0이면 소수가 아니고, 나머지가 0이 아니면 소수이므로 이를 표현하려고 함.</p>
<h2 id="알고리즘">알고리즘</h2>
<ol>
<li>is_prime을 처음에 1로 고정. </li>
<li>i로 나눈 나머지가 0이면 소수가 아니므로 is_prime=0 이고 반복문은 빠져나올 break;를 선언해줌.</li>
<li>나머지가 0이 아니라면 소수이므로 is_prime=1일것이고, if(1)을 통해 count_number을 증가시켜줌.```<pre><code class="language-c">#include &lt;stdio.h&gt;
</code></pre>
</li>
</ol>
<p>int main(void) {
    int arr[1000] = { 0 };
    int N;
    int count_number = 0;
    scanf(&quot;%d&quot;, &amp;N);</p>
<pre><code>for (int i = 0; i &lt; N; i++) {
    scanf(&quot;%d&quot;, &amp;arr[i]);
    //소수의 규칙을 먼저 찾기

}
for (int i = 0; i &lt; N; i++) {
    int is_prime = 1;

    if (arr[i] &lt; 2) {
        is_prime = 0;
    }

    for (int k = 2; k &lt; arr[i]; k++) {
        if (arr[i] % k == 0) {
            is_prime = 0;
            break;
        }

    }
    if (is_prime) {
        count_number++;
    }


}

printf(&quot;%d&quot;, count_number );

return 0;</code></pre><p> }</p>
<pre><code>### 에라토스테네스의 체(백준 2960번)

에라토스테네스의 체 알고리즘은 여러 개의 수가 소수인지 아닌지를 판별할 때 사용하는 대표적인 알고리즘입니다. 에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾을 때 사용할 수 있습니다. 알고리즘을 먼저 살펴보겠습니다

**1. 2부터 N까지의 모든 자연수를 나열한다.**

**2. 나열한 수 중에서 가장 작은수 i를 찾는다.**

**3. 나열한 수에서 i를 제외한 i의 배수를 모두 제거한다.**

_**4. 더 이상 반복할 수 없을 때까지 2번과 3번과정 반복한다
**_
이를 계속 반복하게 되면 결국 소수밖에 안남을 것입니다.

**고민했던것 : 배수들을 찾는 반복문을 어떻게 작성해야할지 막막했다.
--&gt; i를 2부터 하나하나 증가시키고 j=i부터 j=n까지 j에 j를 계속 더하면서 (j=j+i) 배수들을 찾아나갔다.**

_예를 들어 j=2 라면 2+2, 2+2+2, 2+2+2+2, .... 등등 으로 배수를 구할 수 있다._



&lt;코드구현&gt;
```c
#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

int main()
{
    int n, k;
    int count=0;
    cin &gt;&gt; n &gt;&gt; k;
    vector&lt;int&gt; prime(n + 1);

    for (int i=2;i&lt;=n;i++)
    {
        prime[i]=i;
    }

    for (int i=2; i&lt;=n;i++)
    {
        for (int j=i; j&lt;=n;j+=i)
        {
            if (prime[j]!=0)
            {
                prime[j] = 0;
                count++;
                if (count==k)
                {
                    cout &lt;&lt; j &lt;&lt; &#39;\n&#39;;
                    return 0;
                }
            }
        }
    }
    return 0;
}</code></pre><blockquote>
<p>학교 실습 과제 에라토스테네스 체 구현</p>
</blockquote>
<pre><code class="language-c">#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt; //calloc(), free() 함수 선언
#include&lt;math.h&gt; //sqrt() 
void eratos(int number, int array[]) { //에라토스테세스의 체 알고리즘 사용하여 소수 구하기
    int n, m, to, last, index;
    to = (int)sqrt((double)number); // 마지막 나눌 값
    for (n = 2; n &lt;= to; n++) { // 바깥쪽 루프
        last = number / n; // 마지막 조사 값
        for (m = 2; m &lt;= last; m++) { // 안쪽 루프
            index = n * m; // 배열의 인덱스
            array[index] = 1; // 소수가 아님을 표시한다.
        }
    } // 이중 반복문이 끝났을 때까지 값이 0인 원소의 인덱스가 소수이다.
}
void print_primes(int value, int* array) {    //출력하기 
    int n;
    int count = 0;
    printf(&quot;%d의 소수 : \n&quot;, value);
    for (n = 2; n &lt;= value; n++) {

        if (array[n] == 0) { // 소수인 것만
            printf(&quot;%9d&quot;, n); // 소수를 9 칸의 공간에 출력한다.
            count += 1; // 한 줄에 출력한 소수의 수
            if ((count % 8) == 0) // 한 줄에 8 개를 출력하였다면,
                printf(&quot;\n&quot;); // 다음 줄로 이동한다. }
        }
    }
    printf(&quot;\n&quot;);
}

int main() {
    int number;
    int* array; // 문자형 포인터
    printf(&quot;정수를 입력하세요: &quot;); // 정수 입력
    scanf(&quot;%d&quot;, &amp;number);
    if (number &gt; 2) {
        array = (int*)calloc(number, sizeof(int)); // 배열 동적 할당
        if (array != NULL) {
            eratos(number, array); //eratos() 함수 호출 
            print_primes(number, array); //print_primes()함수 호출 
            free(array); //동적할당 해제 
        }
    }
    return 0;
}</code></pre>
<blockquote>
<p>#동적할당</p>
</blockquote>
<ul>
<li>#include &lt;stdlib.h&gt;에 calloc(), malloc() 함수가 들어있다.</li>
<li>malloc에는 초기화되지 않은 값이 있어서 배열에 쓰레기 값이 저장되어 있다. </li>
<li>calloc에는 할당 후 해당 메모리공간을 0으로 초기화한다.</li>
<li>메모리누수를 막기 위해 동적할당을 해주었으면 해제를 해야함 --&gt; free(void ~~ )</li>
</ul>
<h1 id="동적할당의-장점">동적할당의 장점?</h1>
<blockquote>
<ol>
<li>상황에 따라 원하는 크기 만큼의 메모리가 할당되므로 경제적이다.(malloc or calloc)</li>
<li>이미 할당된 메모리라도 언제든 크기를 조정할 수 있다(realloc)</li>
</ol>
</blockquote>
<h1 id="동적할당의-단점">동적할당의 단점?</h1>
<blockquote>
<p>할당 후  free를 통해 해제해주지 않으면 메모리 누수가 나타나고 이는 디버깅에 영향을 미친다.</p>
</blockquote>
<h4 id="동적할당의-예시">동적할당의 예시</h4>
<pre><code class="language-c">int *arr=(int *)malloc(10*sizeof(int));
int *arr=(int *)calloc(10,sizeof(int));</code></pre>
<p>malloc 은 매개변수로 입력된 크기 만큼을 그대로 할당하는 것이고 calloc은 두번째 매개변수의 크기를 첫번째 매개변수 갯수 만큼을 할당하는 것이다. 위 두 명령어 모두 똑같은 크기의 공간을 확보한다. 단지 calloc은 메모리를 초기화해주지만 malloc에는 쓰레기값이 저장되어있다는 차이가 있다.</p>
]]></description>
        </item>
    </channel>
</rss>