<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_su11.log</title>
        <link>https://velog.io/</link>
        <description>신입개발자의 공부 기록</description>
        <lastBuildDate>Wed, 09 Jul 2025 08:56:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_su11.log</title>
            <url>https://velog.velcdn.com/images/dev_su11/profile/112339ef-43a9-4647-9454-d5771968ba08/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_su11.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_su11" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Link]]></title>
            <link>https://velog.io/@dev_su11/Link</link>
            <guid>https://velog.io/@dev_su11/Link</guid>
            <pubDate>Wed, 09 Jul 2025 08:56:35 GMT</pubDate>
            <description><![CDATA[<h2 id="링크link란">링크(Link)란?</h2>
<blockquote>
<ul>
<li>리눅스에서 링크는 기존 파일을 참조할 수 있는 또 다른 이름을 만드는 기능</li>
</ul>
</blockquote>
<ul>
<li>즉, 같은 파일을 다른 경로 또는 다른 이름으로 사용할 수 있게 해주는 방식</li>
</ul>
<h3 id="✅-링크-파일의-두-종류">✅ 링크 파일의 두 종류</h3>
<h4 id="1-하드-링크-파일">1) 하드 링크 파일</h4>
<ul>
<li>명령어 : ln 원본 새이름</li>
<li>i-node 번호 : 원본과 같음</li>
<li>링크 수 : 증가</li>
<li>원본 삭제 시 : 링크 유지됨(정상 작동)</li>
<li>디렉터리 링크 : x</li>
<li>파일 위치 관계 : 같은 파션 내에서만 가능</li>
<li>파일 크기 : 실제 파일 크기</li>
</ul>
<h4 id="2-심볼릭-링크-파일">2) 심볼릭 링크 파일</h4>
<ul>
<li>명령어 : ln -s 원본 새이름</li>
<li>i-node 번호 : 원본과 다름</li>
<li>링크 수 : 증가하지 않음</li>
<li>원본 삭제 시 : 링크 깨짐</li>
<li>디렉터리 링크 : 가능</li>
<li>파일 위치 관계 : 다른 디렉터리/파티션도 가능</li>
<li>파일 크기 : 원본 경로 문자열 크기만큼 작음</li>
</ul>
<h3 id="✅-1-하드링크-hard-link">✅ 1. 하드링크 (Hard Link)</h3>
<pre><code># ln passwd passwd1</code></pre><h3 id="✅-2-심볼릭-링크-symbolic-link-soft-link">✅ 2. 심볼릭 링크 (Symbolic Link, Soft Link)</h3>
<pre><code>ln -s passwd passwd2</code></pre><h3 id="✅-언제-사용하나요">✅ 언제 사용하나요?</h3>
<h4 id="1-하드-링크">1) 하드 링크</h4>
<ul>
<li>파일 백업 / 다른 이름으로 동일한 파일 유지</li>
<li>원본 없어도 링크 파일 살아 있게 유지</li>
</ul>
<h4 id="2-심볼릭-링크">2) 심볼릭 링크</h4>
<ul>
<li>다른 디렉터리/파티션에 연결</li>
<li>디렉터리 링크 / 바로가기 설정</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux 명령어(2)]]></title>
            <link>https://velog.io/@dev_su11/Linux-%EB%AA%85%EB%A0%B9%EC%96%B42</link>
            <guid>https://velog.io/@dev_su11/Linux-%EB%AA%85%EB%A0%B9%EC%96%B42</guid>
            <pubDate>Wed, 09 Jul 2025 08:46:52 GMT</pubDate>
            <description><![CDATA[<h2 id="1-egrep">1. egrep</h2>
<blockquote>
<p>egrep은 grep -E 의 별칭(alias)</p>
</blockquote>
<pre><code>egrep [옵션] [패턴] [파일명]</code></pre><h3 id="🔍예시">🔍예시</h3>
<h4 id="🧪-예제-파일-pse1txt">🧪 예제 파일 (pse1.txt)</h4>
<pre><code>  1 windows, linux, unix
  2 linux, unix, windows
  3 unix, windows, unix</code></pre><h4 id="1️⃣-명령어-1">1️⃣ 명령어 1</h4>
<pre><code>// 줄 시작이 windows 또는 linux인 줄 출력
egrep &quot;^windows|^linux&quot; pse1.txt

//결과
windows, linux, unix
linux, unix, windows</code></pre><h4 id="2️⃣-명령어-2">2️⃣ 명령어 2</h4>
<pre><code>//대소문자 상관 없이 windows, linux가 포함된 모든 줄 출력
egrep -i &quot;windows|linux&quot; pse1.txt

//결과
windows, linux, unix
linux, unix, windows
unix, windows, unix</code></pre><h2 id="2-tree">2. tree</h2>
<blockquote>
<ul>
<li>현재 디렉터리부터 시작하여 하위 폴더, 파일들을 계층 구조로 보여줌</li>
</ul>
</blockquote>
<ul>
<li>디렉터리 이름과 파일 이름을 들여쓰기 방식으로 시각화 해줌</li>
</ul>
<pre><code>tree

//결과
.
├── file1
├── prt
└── pse1.txt

1 directory, 3 files</code></pre><h3 id="옵션">&lt;옵션&gt;</h3>
<ul>
<li>-L : 디렉터리 출력 깊이 제한
ex) tree -L 2 : 현제 디렉터리부터 최대 2단계까지 디렉터리 구조만 출력</li>
<li>-a : 숨김 파일까지 출력</li>
<li>-d : 디렉터리만 출력</li>
<li>-f : 전체 경로 출력</li>
<li>--du : 각 디렉터리의 파일 개수 함께 출력</li>
<li>-h : 크기 표시 시 사람 친화적으로(KB,MB 등)</li>
</ul>
<h2 id="3-시간-및-날짜-관리와-달력-확인">3. 시간 및 날짜 관리와 달력 확인</h2>
<h3 id="✅-1-touch">✅ 1. touch</h3>
<blockquote>
<p>touch는 파일의 최종 수정 시간을 변경할 때 사용</p>
</blockquote>
<h4 id="🔍예시-1">🔍예시</h4>
<pre><code>touch -t 231011030 pse1.txt</code></pre><ul>
<li>pse1.txt 파일의 수정 시간이 2023년 1월 1일 오전 10시 30분으로 변경됨</li>
<li>파일이 없으면 자동 생성됨</li>
</ul>
<h3 id="✅-2-date">✅ 2. date</h3>
<blockquote>
<p>현재 시스템의 날짜와 시간 출력</p>
</blockquote>
<h3 id="✅-3-cal">✅ 3. cal</h3>
<blockquote>
<p>현재 월의 달력을 출력</p>
</blockquote>
<pre><code># cal -3 // 이전달, 현재달, 다음달까지 3개월 달력을 출력

# cal -y // 현재 연도 12개월 달력 출력

# cal -y 1963 // 1963년 전체 달력 출력

# cal -yj 1963 // 1963년 달력을 &#39;연중 며칠째인지&#39; 형식으로 출력</code></pre><h2 id="4-find">4. find</h2>
<blockquote>
<p>특정 파일이나 디렉터리를 검색하고, 조건에 따라 작업까지 수행하는 명령어</p>
</blockquote>
<pre><code># find [경로] [옵션] [설정값]</code></pre><h3 id="옵션-1">&lt;옵션&gt;</h3>
<ul>
<li>-name : 이름(패턴 포함)으로 검색</li>
<li>-type : 파일 종류 지정</li>
<li>-size : 크기 조건 지정</li>
<li>-empty : 비어 있는 파일/디렉터리 검색</li>
<li>-exec : 결과에 대해 명령 실행</li>
</ul>
<h3 id="🔍예시-2">🔍예시</h3>
<pre><code>// /home 아래에서 passwd라는 이름을 가진 모든 파일/디렉터리 검색
# find /home -name passwd

// /home에서 이름이 passwd이고 디렉터리인 것만 검색
# find /home -name passwd -type d

// /home에서 이름이 passwd이고 파일인 것만 검색
# find /home -name passwd -type f

// .txt로 끝나는 파일 모두 검색
# find /home -name &quot;*.txt&quot; -type f

// 이름에 se가 포함된 파일 검색
# find /home -name &quot;*se*&quot; -type f</code></pre><h3 id="📦-결과에-대해-명령-실행--exec">📦 결과에 대해 명령 실행 (-exec)</h3>
<pre><code>// passwd라는 이름의 파일 찾고, ls -l로 상세 정보 출력
# find /home -name passwd -type f -exec ls -l {} \;

// passwd 라는 이름의 파일 삭제
# find /home -name passwd -type f -exec rm -rf {} \;

// .txt가 이름에 들어간 모든 파일 삭제
# find /home -name &quot;*.txt*&quot; -type f -exec rm -rf {} \;</code></pre><h3 id="📏-크기로-찾기--size">📏 크기로 찾기 (-size)</h3>
<pre><code>// 2KB보다 큰 파일 검색
# find /home -size +2K -type f

//2KB보다 작은 파일 검색
# find /home -size -2K -type f

//korea 폴더에서 3KB 초과 파일을 찾아 삭제
# find /home/korea -size +3KB f -exec rm -rf {} \;</code></pre><h3 id="📂-빈-파일--디렉토리-찾기">📂 빈 파일 / 디렉토리 찾기</h3>
<pre><code>// 내용이 없는 빈 파일 검색
# find /home -type f -empty

// 비어 있는 디렉터리 검색
# find /home -type d -empty

// 빈 파일 목록을 empty.lst에 저장
# find /home -type f -empty &gt; empty.lst</code></pre><h2 id="5-whereiswhich">5. whereis/which</h2>
<h3 id="✅-which-명령어">✅ which 명령어</h3>
<blockquote>
<ul>
<li>현재 쉘 환경에서 명령어가 실제로 어떤 경로의 실행파일로 연결되어 있는지 알려주는 명령어</li>
</ul>
</blockquote>
<ul>
<li><p>which는 $PATH에 등록된 디렉터리만 검색</p>
<pre><code>which ls</code></pre></li>
</ul>
<h3 id="✅-whereis-명령어">✅ whereis 명령어</h3>
<blockquote>
<p>명령어의 실행 파일, 소스 코드, 메뉴얼의 위치를 한번에 찾아주는 명령어</p>
</blockquote>
<pre><code>which ls</code></pre><h3 id="✅-언제-어떤-것을-써야-할까">✅ 언제 어떤 것을 써야 할까?</h3>
<ul>
<li>지금 내가 실행하는 명령어의 실제 경로가 궁금할 때 : which</li>
<li>명령어 관련 전체 파일 확인 하고 싶을 떄 : whereis</li>
</ul>
<h2 id="6-wc">6. wc</h2>
<blockquote>
<p>파일의 줄 수, 단어 수, 문자 수 등을 세는 명령어</p>
</blockquote>
<pre><code># wc [옵션] [명령어]</code></pre><h3 id="옵션-2">&lt;옵션&gt;</h3>
<ul>
<li>(없음) : 줄, 단어, 문자 수 모두 출력</li>
<li>-l : 줄(linew) 수 출력</li>
<li>-w : 단어(word) 수 출력</li>
<li>-c : 문자 수 출력</li>
</ul>
<h3 id="✅-예제-분석">✅ 예제 분석</h3>
<pre><code># wc passwd

//결과
    140     368    9196 passwd</code></pre><p>뜻 :</p>
<ul>
<li>140줄</li>
<li>368개의 단어</li>
<li>9196개의 문자</li>
<li>파일 이름 : passwd</li>
</ul>
<pre><code># wc -l passwd

// 결과
     140 passwd

# wc -w passwd

//결과
     368 passwd

# wc -c passwd

//결과
    9196 passwd</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Linux 명령어(1)]]></title>
            <link>https://velog.io/@dev_su11/Linux-%EB%AA%85%EB%A0%B9%EC%96%B41%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC-%EB%B0%8F-%ED%8C%8C%EC%9D%BC</link>
            <guid>https://velog.io/@dev_su11/Linux-%EB%AA%85%EB%A0%B9%EC%96%B41%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC-%EB%B0%8F-%ED%8C%8C%EC%9D%BC</guid>
            <pubDate>Tue, 08 Jul 2025 07:10:53 GMT</pubDate>
            <description><![CDATA[<h2 id="1-파일-유형-출럭">1. 파일 유형 출럭</h2>
<h3 id="1file">1)file</h3>
<blockquote>
<p>리눅스에서 file 명령어는 지정한 파일이나 디렉터리가 어떤 유형인지(종류인지 판별해 주는 명령어</p>
</blockquote>
<pre><code># file [파일명 또는 디렉터리 명]</code></pre><h4 id="📌-사용-목적">📌 사용 목적</h4>
<ul>
<li>이 파일이 텍스트 파일인지, 바이너리 파일인지, 실행 파일인지, 이미지인지, 디렉터리인지 등을 확인 할 수 있다.</li>
<li>확장자와 관계 없이 실제 내부 구조를 분석해서 판별해주므로, 확장자가 .txt라도 내용이 바이너리이면 그걸 알려준다.</li>
</ul>
<h4 id="🧪-예시로-보는-결과">🧪 예시로 보는 결과</h4>
<pre><code># file passwd

passwod: ASCII text
//passwd라는 파일은 ASCII 문자로 이루어진 일반 텍스트 파일이라는 뜻</code></pre><h4 id="📘-자주-나오는-판별-결과-종류">📘 자주 나오는 판별 결과 종류</h4>
<ul>
<li>ASCII text : 일반 텍스트 파일</li>
<li>UTF-8 Unicode text : 유니코드 텍스트 파일</li>
<li>Bourne-Again shell script : 쉘 스크립트 파일</li>
<li>ELF 64-bit LSB executable : 실행 가능한 바이너리 파일(리눅스 프로그램)</li>
<li>JPEG image data : JPG dlalwl vkdlf</li>
<li>directory : 디렉터리(폴더)</li>
<li>empty : 비어 있는 파일</li>
</ul>
<h2 id="2-문자-추출">2. 문자 추출</h2>
<h3 id="1-grep">1) grep</h3>
<blockquote>
<p>grep은 텍스트 파일에서 특정 문자열이나 패턴을 찾아 출력해주는 명령어</p>
</blockquote>
<pre><code># grep [옵션] &#39;찾을 문자열&#39; [파일명]</code></pre><h4 id="🧪-예시">🧪 예시</h4>
<pre><code># grep &#39;linux&#39; pse.txt</code></pre><ul>
<li>pes.txt 파일에서 &#39;linux&#39;라는 단어가 포함된 줄을 찾아 출력합니다</li>
<li>대소문자 구분하며, 정확히 &#39;linux&#39;가 포함된 줄만 나온다.</li>
</ul>
<h4 id="🔢-줄-번호까지-보고-싶다면">🔢 줄 번호까지 보고 싶다면?</h4>
<pre><code># grep -n &#39;linux&#39; pse.txt</code></pre><ul>
<li>-n 옵션을 붙이면 해당 줄의 줄번호도 같이 출력됨</li>
</ul>
<h4 id="💡-자주-쓰는-grep-옵션들">💡 자주 쓰는 grep 옵션들</h4>
<ul>
<li>-n : 해당 문자열이 있는 줄번호를 함께 출력</li>
<li>-i : 대수몬자 구분 없이 찾기</li>
<li>-v : 해당 문자열이 없는 줄만 출력</li>
<li>-r : 디렉터리 내부까지 재귀적으로 검색</li>
<li>-c : 몇줄에서 발견됐는지 개수만 출력</li>
<li>-l : 해당 문자열을 포함하는 파일 이름만 출력</li>
<li>^root : &#39;root&#39;로 시작하는 줄만 출력</li>
<li>root$ : &#39;root&#39;로 끝나는 줄만 출력</li>
<li>--color : 검색된 문자열에 색상 강조</li>
</ul>
<h3 id="2-cut">2) cut</h3>
<blockquote>
<p>cut 명령어는 파일에서 &quot;문자열의 특정 위치(컬럼)&quot;나 구분자를 기준으로 나눈 필드를 추출할 때 사용하는 명령어</p>
</blockquote>
<pre><code># cut [옵션] [설정값] [파일명]</code></pre><h4 id="옵션">&lt;옵션&gt;</h4>
<ul>
<li>-c : 문자 위치(컬럼)로 자름</li>
<li>-f : 필드 번호로 자름(구분자가 있는 경우</li>
<li>-d : 필드를 구분하는 구분자 지정</li>
</ul>
<br>

<h4 id="💡-예제-파일-pse1txt">💡 예제 파일 (pse1.txt)</h4>
<pre><code>kim,20,서울
lee,20,부산
park,30,대구</code></pre><h4 id="1️⃣-컬럼-자르기--c">1️⃣ 컬럼 자르기: -c</h4>
<pre><code># cut -c 1 pse1.txt // 각 줄의 첫번쨰 문자만 출력

//결과
k
l
p</code></pre><pre><code># cut -c 2-3 pse1.txt // 각 줄의 2번째~3번째 문자만 출력

//결과
im
ee
ar</code></pre><h4 id="2️⃣-필드-자르기--f---d">2️⃣ 필드 자르기: -f + -d</h4>
<pre><code># cut -f 2 pse1.txt</code></pre><ul>
<li>기본 구분자가 TAB이기 떄문에, 쉼표 구분이라면 안먹힘. TAB으로 구분된 파일이어야 동작함</li>
<li>쉼표(,)로 구분 된 경우, 반드시 -d 옵션을 함께 써야 한다</li>
</ul>
<h4 id="3️⃣-쉼표로-구분된-필드-자르기">3️⃣ 쉼표로 구분된 필드 자르기</h4>
<pre><code># cut -f 3 -d , pse1.txt //쉼표를 기준으로 나눴을 떄 3번째 필드만 출력

//결과
서울
부산
대구</code></pre><h4 id="5️⃣-여러-필드-추출">5️⃣ 여러 필드 추출</h4>
<pre><code># cut -f 1,3 -d , pse1.txt // 1번째와 3번째 필드 출력

//결과
kim,서울
lee,부산
park,대구</code></pre><h3 id="3-sed">3) sed</h3>
<blockquote>
<p>sed는 Stream EDitor(스트림 편집기)의 약자이며,
파일이나 표준 입력에서 텍스트를 행 단위로 읽어와서 가공하거나 필터링 하는 명령어</p>
</blockquote>
<pre><code># sed [옵션] &#39;동작&#39; [파일명]</code></pre><h4 id="옵션-1">&lt;옵션&gt;</h4>
<ul>
<li>-n : 출력 억제</li>
<li>-e : 여러 동작 저장할 떄 사용</li>
<li>p : print</li>
<li>&#39;2p&#39; : 2번쨰 출력</li>
</ul>
<h4 id="🧪-예제-파일-pse1txt">🧪 예제 파일 (pse1.txt)</h4>
<pre><code>1. kim,20,서울
2. lee,25,부산
3. park,30,대구
4. choi,22,인천
5. jung,27,광주
6. han,35,대전
7. yoon,28,울산
8. jang,26,세종</code></pre><h4 id="1️⃣-특정-행-출력">1️⃣ 특정 행 출력</h4>
<pre><code># sed -n 5p pse1.txt // 5번째 줄만 출력

//결과 
jung,27,광주</code></pre><h4 id="2️⃣-여러-행-출력">2️⃣ 여러 행 출력</h4>
<pre><code># sed -n -e 3p -e 7p pse1.txt //3, 7번째 줄 출력

//결과
park,30,대구
yoon,28,울산</code></pre><h4 id="3️⃣-연속된-줄-출력">3️⃣ 연속된 줄 출력</h4>
<pre><code># sed -n -e 2,4p pse1.txt // 2번째 줄부터 4번째 줄까지 출력

//결과
lee,25,부산
park,30,대구
choi,22,인천</code></pre><h4 id="4️⃣-끝까지-출력">4️⃣ 끝까지 출력</h4>
<pre><code>sed -n -e &#39;2,$p&#39; pse1.txt // $는 파일의 마지막 줄을 의미. 2번쨰부터 끝까지 출력

//결과
lee,25,부산
park,30,대구
choi,22,인천
jung,27,광주
han,35,대전
yoon,28,울산
jang,26,세종</code></pre><h4 id="💡-왜--n을-쓰나요">💡 왜 -n을 쓰나요?</h4>
<ul>
<li>sed는 기본적으로 모든 줄을 처리해서 다 출력</li>
<li>-n으로 자동 출력은 꺼두고 p로 내가 지정한 줄만 출력하는 것</li>
</ul>
<h3 id="3-awk">3) awk</h3>
<blockquote>
<p>awk는 행 단위로 파일을 읽어서, 필드를 기준으로 데이터 처리나 조건 검색, 집계 등을 할 수 있는 텍스트 처리용 언어</p>
</blockquote>
<pre><code># awk [옵션] &#39;조건 {처리}&#39; [파일명]</code></pre><h4 id="📄-예시-파일-pse1txt">📄 예시 파일 (pse1.txt)</h4>
<pre><code>kim,80,서울
lee,60,부산
park,70,대구
choi,90,서울
jung,50,부산</code></pre><h4 id="1️⃣-특정-줄-출력-줄-번호-기준">1️⃣ 특정 줄 출력 (줄 번호 기준)</h4>
<pre><code># awk &#39;NR==5&#39; pse1.txt //NR은 &quot;현재 줄 번호&quot;를 의미, 5번쨰 줄만 출력

//결과
jung,50,부산</code></pre><pre><code># awk &#39;NR==3 || NR==5&#39; pse1.txt //3번쨰 줄 또는 7번쨰 줄 출력

//결과
park,70,대구
jung,50,부산</code></pre><pre><code># awk &#39;NR&gt;=3 &amp;&amp; NR&lt;=7 pse1.txt //3번째 줄부터 7번쨰 줄까지 출력

//결과
lee,60,부산
park,70,대구
choi,90,서울
jung,50,부산</code></pre><h4 id="2️⃣-필드열-출력-1-2-3">2️⃣ 필드(열) 출력: $1, $2, $3...</h4>
<pre><code># awk -F , &#39;{print $1}&#39; pse1.txt //쉼표(,) 기준 필드로 자른 후, 첫번쨰 필드만 출력

//결과
kim
lee
park
choi
jung</code></pre><h4 id="3️⃣-조건에-맞는-행만-출력">3️⃣ 조건에 맞는 행만 출력</h4>
<pre><code># awk -F , &#39;$2 &gt;= 70&#39; pse1.txt // 두번쨰 행이 70 이상인 것만 출력

//결과
kim,80,서울
choi,90,서울</code></pre><h4 id="4️⃣-문자열과-필드-결합-출력">4️⃣ 문자열과 필드 결합 출력</h4>
<pre><code># awk -F , &#39;{print $1 &quot;의 나이: &quot; $2}&#39; pse1.txt //1번째 필드와 2번쨰 필드를 조합하여 출력

//결과
kim의 나이: 80
lee의 나이: 60
park의 나이: 70
choi의 나이: 90
jung의 나이: 50</code></pre><h4 id="5️⃣-합계와-평균-구하기">5️⃣ 합계와 평균 구하기</h4>
<pre><code># awk -F , &#39;{sum += $2} END {print &quot;합계: &quot;, sum, &quot;평균: &quot;, sum/NR}&#39; pse1.txt // 각줄의 2번쨰 필드를 sum에 누적. END{} 블록에서 마지막줄에 도달하면 합계와 평균 출력

//결과
합계:  350 평균: 70 
//NR은 총 줄 수를 나타냄</code></pre><h3 id="4-sort">4) sort</h3>
<blockquote>
<p>sort는 파일의 내용을 행 단위로 정렬해주는 명령어
기본적으로 사전 순(A~Z) 또는 숫자 순으로 정렬하며, 특정 열(필드)을 기준으로 정렬할 수도 있다.</p>
</blockquote>
<pre><code># sort [옵션] -k [열번호] [파일명]</code></pre><ul>
<li>-k옵션은 &quot;key&quot;의 약자이며, 몇 번쨰 열을 기준으로 정렬할 지 지정</li>
<li>구분자는 기본적으로 공백(스페이스/텝) 이지만, -t로 변경 가능</li>
<li>파일이 쉼표로 구분 된 경우는 -t &#39;,&#39; 같이 정해야함</li>
</ul>
<h4 id="📄-예제-파일-pse2txt">📄 예제 파일: pse2.txt</h4>
<pre><code>kim 80 서울
lee 70 부산
park 90 대구
choi 60 광주
jung 75 울산</code></pre><h4 id="1️⃣--첫-번쨰-열이름-기준-정렬">1️⃣  첫 번쨰 열(이름) 기준 정렬</h4>
<pre><code># sort -t , -k 1 pse1.txt // 이름 순으로 정렬(첫번째 열, 사전 순)

//결과
choi,60,광주
jung,75,울산
kim,80,서울
lee,70,부산
park,90,대구</code></pre><h4 id="2️⃣-두번쨰-열숫자-점수-기준-정렬">2️⃣ 두번쨰 열(숫자 점수) 기준 정렬</h4>
<pre><code># sort -t , -k 2 pse1.txt //점수를 기준으로 정렬(두번쨰 열 기본은 문자열 기준 정렬)

//결과
choi,60,광주
lee,70,부산
jung,75,울산
kim,80,서울
park,90,대구</code></pre><h4 id="3️⃣-정렬-후-줄번호-붙이기">3️⃣ 정렬 후 줄번호 붙이기</h4>
<pre><code># sort -t , -k 3 pse1.txt | nl // 도시 이름 기준 정렬 후 줄 번호 붙이기

//결과
     1    choi,60,광주
     2    park,90,대구
     3    lee,70,부산
     4    kim,80,서울
     5    jung,75,울산</code></pre><h4 id="4️⃣-두번쨰-열을-역순내림차순으로-정렬--줄번호">4️⃣ 두번쨰 열을 역순(내림차순)으로 정렬 + 줄번호</h4>
<pre><code># sort -t , -k 2 -r pse1.txt | nl

//결과
     1    park,90,대구
     2    kim,80,서울
     3    jung,75,울산
     4    lee,70,부산
     5    choi,60,광주</code></pre><h2 id="3-텍스트-화면-출력">3. 텍스트 화면 출력</h2>
<h3 id="1-echo">1) echo</h3>
<blockquote>
<p>echo는 터미널에 텍스트나 변수값을 출력하는 명령어</p>
</blockquote>
<pre><code># echo [출력할 내용 또는 환경 변수]</code></pre><h4 id="1️⃣-echo-pwd">1️⃣ echo $PWD</h4>
<ul>
<li>$PWD는 현재 작업 중인 디렉터리 경로가 저장된 환경 변수<pre><code># echo $PWD
</code></pre></li>
</ul>
<p>//결과
/tmp/practice/korea</p>
<pre><code>
#### 2️⃣ echo $HOSTNAME
- $HOSTNAME은 컴퓨터(호스트)의 이름을 저장한 환경 변수</code></pre><h1 id="echo-hostname">echo $HOSTNAME</h1>
<pre><code>#### 3️⃣ echo $HOME
- $HOME은 현재 사용자의 홈 디렉터리 경로를 가리킴</code></pre><h1 id="echo-home">echo $HOME</h1>
<p>//결과
/Users/suhyenlee</p>
<pre><code>
#### 4️⃣ echo {A..Z}
- {A..Z}는 A부터 Z까지의 알파벳 시퀀스를 생성하는 Bash의 중괄호 확장 기능
- 실행하면 A부터 Z까지 알파벳이 공백으로 구분되어 출력됨</code></pre><h1 id="echo-az">echo {A..Z}</h1>
<p>//결과
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z</p>
<pre><code>
#### 5️⃣ echo {A..Z} | tr -d &#39;&#39;
- | 는 파이프(pipe)로, echo의 출력을 tr 명령어로 넘김
- tr -d &#39;&#39;는 공백을 삭제하라는 명령어</code></pre><h1 id="echo-az--tr--d--">echo {A..Z} | tr -d &#39; &#39;</h1>
<p>//결과
ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
<pre><code>
## 4. 삭제 : rm
&gt;</code></pre><p>rm -rf [파일 또는 디렉터리명]</p>
<pre><code>
### 명령어별 의미</code></pre><h1 id="rm--rf-b-d--이름이-bcd로-시작하는-모든-파일디렉터리-삭제">rm -rf [b-d]* // 이름이 b,c,d로 시작하는 모든 파일/디렉터리 삭제</h1>
<h1 id="rm--rf-bce--이름이-bce로-시작하는-모든-파일디렉터리-삭제">rm -rf [bce]* // 이름이 b,c,e로 시작하는 모든 파일/디렉터리 삭제</h1>
<h1 id="rm--rf-b-d--이름이-b-d-제외한-문자로-시작하는-모든-파일디렉터리-삭제">rm -rf [^b-d]* // 이름이 b-d 제외한 문자로 시작하는 모든 파일/디렉터리 삭제</h1>
<h1 id="rm--rf-ace--이름이-ace-제외한-문자로-시작하는-모든-파일디렉터리-삭제">rm -rf [^ace]* // 이름이 a,c,e, 제외한 문자로 시작하는 모든 파일/디렉터리 삭제</h1>
<pre><code>
## 5. 파일 이름 변경 : rename
&gt; </code></pre><h1 id="rename-바꿀-패턴-바꿀-문자열-파일들">rename [바꿀 패턴] [바꿀 문자열] [파일들]</h1>
<pre><code>- 저장한 패턴을 파일 이름에서 찾아서, 새 문자열로 바꿈

### 1) 단순 문자열 치환</code></pre><h1 id="rename-file-file2-file2">rename file file2 file2</h1>
<pre><code>- file2라는 이름을 가진 파일들의 이름 안에서 &quot;file을 찾아 &quot;file2&quot;로 바꿈

### 2)와일드카드와 rename의 조합</code></pre><p>rename f file f*</p>
<pre><code>- f* : f로 시작하는 모든 파일 대상으로 실행
- 파일 이름에 있는 &quot;f&quot;문자를 &quot;file&quot;로 바꿈</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[오버로딩 / 오버라이딩]]></title>
            <link>https://velog.io/@dev_su11/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9</link>
            <guid>https://velog.io/@dev_su11/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9</guid>
            <pubDate>Thu, 03 Jul 2025 04:50:24 GMT</pubDate>
            <description><![CDATA[<h2 id="1-오버로딩overloading">1. 오버로딩(Overloading)</h2>
<blockquote>
<p>오버로딩은 같은 이름의 메서드를 여러 개 정의하되, 매개변수의 타입이나 개수를 다르게 정의하는 것</p>
</blockquote>
<h3 id="특징">특징</h3>
<ul>
<li>클래스 내에서 발생 : 같은 클래스 안에서 발생</li>
<li>매개변수만 다름 : 매개변수의 수, 타입, 순서가 달라야함</li>
<li>반환값은 관계 없음 : 반환형은 오버로딩에 영향을 주지 않음</li>
<li>컴파일 타임에 결정 : 어떤 메서드가 호출될지 컴파일 시점에 결정됨</li>
</ul>
<pre><code class="language-java">public class Calculator{
   public int add(int a, int b){
      return a + b;
   }

   public double add(double a, double b){
      return a + b;
   }

   public int add(int a, int b, int c){
      return a + b + c;
   }
}</code></pre>
<ul>
<li>모두 add 라는 이름이지만, 매개변수 타입/개수가 달라서 오버로딩 성립</li>
</ul>
<h2 id="2-오버라이딩overriding">2. 오버라이딩(Overriding)</h2>
<blockquote>
<p>오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의 하는 것</p>
</blockquote>
<h3 id="특징-1">특징</h3>
<ul>
<li>상속 관계에서 발생 : 반드시 상속관계(extends, implements) 여야 함</li>
<li>메서드 시그니처 동일 : 메서드 이름, 매개변수, 반환형 모두 같아야 함</li>
<li>접근 제어자는 같거나 더 넓어야 함</li>
<li>런타임에 결정 : 어떤 메서드가 호출될지는 실행 시점에 결정됨</li>
<li>@Override 사용 권장 : 문법적 실수 방지 가능</li>
</ul>
<pre><code class="language-java">public class Animal{
   public void sound(){
      System.out.println(&quot;동물이 소리를 낸다.&quot;);
   }
}

public class Dog extends Animal {
   @Override
   public void sound(){
      System.out.println(&quot;멍멍!&quot;);
   }
}</code></pre>
<pre><code class="language-java">//실행
Animal myDog = new Dog();
myDog.sound();   // 멍멍!(오버라이딩된 메서드 호출됨)</code></pre>
<ul>
<li>Dog 클래스가 Animal의 sound() 메서드를 오버라이딩 했습니다</li>
<li>실행 시점에서 실제 객체(Dog)의 메서드가 호출 됨 -&gt; &quot;다향성&quot; 의 기반입니다.</li>
</ul>
<h2 id="3-오버로딩-vs-오버라이딩">3. 오버로딩 vs 오버라이딩</h2>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/d699aea0-1b57-4ca4-8c27-854c1916b203/image.png" alt=""></p>
<pre><code class="language-java">//오버로딩
public class Print {
   public void show(String s) {
      System.out.println(s);
   }

   public void show(int i){
      System.out.println(i);
   }
}

//오버라이딩
class Parent {
   public void message(){
      System.out.println(&quot;부모 메시지&quot;);
   }
}

class Child extends Parent {
   @Override
   public void message(){
      System.out.println(&quot;자식 메시지&quot;);
   }
}</code></pre>
<h3 id="🔍-왜-중요한가">🔍 왜 중요한가?</h3>
<h4 id="오버로딩">오버로딩</h4>
<ul>
<li>다양한 형태로 같은 작업을 수행하고 싶을 때 유용</li>
</ul>
<h4 id="오버라이딩">오버라이딩</h4>
<ul>
<li>부모 클래스를 기반으로, 자식 클래스에서 기능을 맞춤화 하고 싶을 떄</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[상속]]></title>
            <link>https://velog.io/@dev_su11/%EC%83%81%EC%86%8D</link>
            <guid>https://velog.io/@dev_su11/%EC%83%81%EC%86%8D</guid>
            <pubDate>Thu, 03 Jul 2025 04:35:40 GMT</pubDate>
            <description><![CDATA[<h3 id="1-상속이란">1. 상속이란?</h3>
<blockquote>
<ul>
<li>상속이란 기존 클래스(부모 클래스, 상위 클래스)의 속성 기능(필드와 메서드)을 새로운 클래스(자식 클래스, 하위 클래스)가 물려받은 것</li>
</ul>
</blockquote>
<ul>
<li>이것을 통해 코드 재사용, 유지보수성, 확장성을 높일 수 있습니다.</li>
</ul>
<h3 id="2-용어-정리">2. 용어 정리</h3>
<ul>
<li>부모 클래스(Super Class) : 상속을 제공하는 클래스</li>
<li>자식 클래스(Sub Class) : 상속을 받는 클래스</li>
<li>extends 키워드 : Java에서 상속을 나타내는 키워드</li>
</ul>
<h3 id="3-기본-구조-java-예시">3. 기본 구조 (Java 예시)</h3>
<pre><code class="language-java">//부모 클래스
public class Animal{
   String name;

   public void eat(){
      System.out.println(&quot;먹는중...&quot;);
   }
}

//자식 클래스
public class Dog extends Animal {
   public void bark(){
      System.out.println(&quot;멍멍&quot;);
   }
}</code></pre>
<pre><code class="language-java">//사용
public class Main{
   public static void main(String[] args) {
      Dog dog = new Dog();
      dog.name = &quot;바둑이&quot;   // 부모로부터 상속된 필드
      dog.eat();          // 부모로부터 상속된 메서드
      dog.bark();         // 자식 클래스 고유 메서드
   }
}</code></pre>
<ul>
<li>Dog 는 Animal 을 상속받았기 떄문에, Animal의 name 과 eat()을 사용할 수 있습니다.</li>
</ul>
<h3 id="4-메서드-오버라이딩-overriding">4. 메서드 오버라이딩 (Overriding)</h3>
<blockquote>
<p>자식 클래스가 부모 클래스의 메서드를 재정의(덮어쓰기) 할 수 있습니다.</p>
</blockquote>
<pre><code class="language-java">public class Dog extends Animal{
   @Override
   public void eat(){
      System.out.println(&quot;개밥 먹는 중...&quot;);
   }
}</code></pre>
<ul>
<li>@Override는 매서드 재정의를 명시합니다.</li>
</ul>
<h3 id="5-생성자와-상속">5. 생성자와 상속</h3>
<blockquote>
<ul>
<li>생성자(constructor)는 상속 되지 않음</li>
</ul>
</blockquote>
<ul>
<li>하지만 자식 클래스의 생성자에서 super()를 통해 부모 생성자를 호출 할 수 있습니다</li>
</ul>
<pre><code class="language-java">public class Animal{
   public Animal(String name){
      System.out.println(&quot;Animal 생성자 호출: &quot; + name);
   }
}

public class Dog extends Animal {
   public Dog(){
   super(&quot;강아지&quot;);   // 부모 생성자 호출
   }
}</code></pre>
<h3 id="6-super-키워드">6. super 키워드</h3>
<blockquote>
<p>부모 클래스의 필드나 메서드, 생성자를 호출 할 때 사용합니다.</p>
</blockquote>
<pre><code class="language-java">pubblic class Dog extends Animal {
   public void printName(){
      System.out.println(&quot;이름: &quot; + super.name);   // 부모 필드 접근
   }
   @Override
   public void eat(){
      super.eat();   // 부모 메서드 호출
      System.out.println(&quot;강아지가 밥 먹는다&quot;);
   }
}</code></pre>
<h3 id="7-상속의-특징과-제약">7. 상속의 특징과 제약</h3>
<ol>
<li>단일 상속만 가능</li>
</ol>
<ul>
<li>한 클래스는 하나의 부모 클래스만 상속 가능</li>
<li>다중 상속은 불가능하지만, 인터페이스를 통해 보안 가능</li>
</ul>
<ol start="2">
<li>접근 제어자의 영향을 받음</li>
</ol>
<ul>
<li>private 멤버는 자식 클래스에서 직접 접근 불가능</li>
<li>protected, public은 접근 가능</li>
</ul>
<ol start="3">
<li>상속은 is-a 관계</li>
</ol>
<ul>
<li>자식 클래스는 부모 클래스의 일종이다</li>
</ul>
<h3 id="8-상속의-장점">8. 상속의 장점</h3>
<ul>
<li>코드 재사용 : 공통 기능은 부모 클래스에 작성하여 여러 클래스에서 사용 가능</li>
<li>유지보수 용이 : 변경 사항을 부모 클래스 하나만 수정하면 자식에도 반영됨</li>
<li>확장성 : 새로운 기능을 추가 할 때 기존 코드를 수정하지 않고 자식 클래스로 확장 가능</li>
<li>다향성 지원 : 부모 타입으로 자식 객체를 처리 가능</li>
</ul>
<h3 id="9-다향성과-상속의-관계">9. 다향성과 상속의 관계</h3>
<pre><code class="language-java">Animal a = new Dog();   // 부모 타입으로 자식 객체 참조
a.eat();                // 자식 클래스의 오버라이딩 메서드 호출</code></pre>
<ul>
<li>실행 시점에 실체 객체의 메서드를 호출함(다향성)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[접근제어자]]></title>
            <link>https://velog.io/@dev_su11/%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90</link>
            <guid>https://velog.io/@dev_su11/%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90</guid>
            <pubDate>Thu, 03 Jul 2025 04:17:00 GMT</pubDate>
            <description><![CDATA[<h2 id="java의-접근-제어자-종류">Java의 접근 제어자 종류</h2>
<blockquote>
<ul>
<li>public</li>
</ul>
</blockquote>
<ul>
<li>protected</li>
<li>(default)</li>
<li>private</li>
</ul>
<h3 id="1-public">1. public</h3>
<ul>
<li>어디서든 접근 가능</li>
<li>가장 개방적인 접근 수준</li>
<li>클래스, 메서드, 필드에 모두 적용 가능</li>
</ul>
<pre><code class="language-java">public clas Car{
   public String model;

   public void drive(){
      System.out.println(&quot;Driving&quot; + model);
   }
}</code></pre>
<ul>
<li>누구나 model 과 drive()에 접근 할 수 있음</li>
</ul>
<h3 id="2-private">2. private</h3>
<ul>
<li><p>오직 클래스 내부에서만 접근 가능</p>
</li>
<li><p>&quot;캡슐화&quot; 를 위한 핵심 요소</p>
</li>
<li><p>외부에서 직접 접근 불가 -&gt; 간접 접근(getter/setter)으로 유도</p>
<pre><code class="language-java">public class Car{
 private String model;

 public String getModel(){
    return model;
 }

 public void setModel(String model){
    this.model = model;
 }
}</code></pre>
</li>
<li><p>외붕에서는 getModel() 또는 setModel()로만 접근 가능</p>
</li>
</ul>
<h3 id="3-protected">3. protected</h3>
<ul>
<li>같은 패키지 or 상속받은 자식 클래스에서 접근 가능.</li>
<li>주로 상속 관계에서 자식 클래스에게 기능을 물려주고 싶을 떄 사용</li>
</ul>
<pre><code class="language-java">public class Car {
   protected void startEngine(){
      system.out.println(&quot;Engine started&quot;);
   }
}
public class SuperCar extends Car {
   public void turboStart(){
      startEngine();
   }
}</code></pre>
<h3 id="4-default-접근-제어자">4. (default) 접근 제어자</h3>
<ul>
<li>아무 접근 제어자도 붙이지 않은 경우</li>
<li>같은 패키지 내부에서만 접근 가능</li>
<li>다른 패키지에서는 접근 불가</li>
</ul>
<pre><code class="language-java">Class Car {
   void horn(){
      System.out.println(&quot;Beep!&quot;);
   }
}</code></pre>
<ul>
<li>같은 패키지 내에서는 Car와 horn() 사용 가능하지만, 다른 패키지에서는 불가능</li>
</ul>
<h4 id="🧠-접근-제어자를-사용하는-이유">🧠 접근 제어자를 사용하는 이유</h4>
<p><strong>1. 정보 은닉</strong></p>
<ul>
<li>내부 구현을 숩기고 외부에는 필요한 기능만 공개</li>
</ul>
<p><strong>2. 보안성 강화</strong></p>
<ul>
<li>잘못된 접근으로 인한 데이터 손상 방지</li>
</ul>
<p><strong>3. 유지보수 용이</strong></p>
<ul>
<li>외부에 노출되지 않으면 내부 구조 변경이 자유로움</li>
</ul>
<p><strong>4. 객체 지향 설계 원칙 준수</strong></p>
<ul>
<li>캡슐화, 추상화 와 밀접한 관련</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[클래스(Class)와 객체(Object)]]></title>
            <link>https://velog.io/@dev_su11/%ED%81%B4%EB%9E%98%EC%8A%A4Class%EC%99%80-%EA%B0%9D%EC%B2%B4Object</link>
            <guid>https://velog.io/@dev_su11/%ED%81%B4%EB%9E%98%EC%8A%A4Class%EC%99%80-%EA%B0%9D%EC%B2%B4Object</guid>
            <pubDate>Thu, 26 Jun 2025 12:48:38 GMT</pubDate>
            <description><![CDATA[<h3 id="📘-1-클래스class란">📘 1. 클래스(Class)란?</h3>
<blockquote>
<p>클래스란 객체를 만들기 위한 설계도</p>
</blockquote>
<p>예시</p>
<pre><code class="language-java">public class car {
   //필드(맴버 변수)
   String color;
   int speed;

   //메서드(동작)
   void drive(){
   system.out.println(&quot;달리는중...&quot;)
   }

   void stop(){
      system.out.println(&quot;멈췄습니다.&quot;);
   }
}</code></pre>
<ul>
<li>이 Car 클래스는 자동차라는 개념을 속성(color, speed)과 동작(drive, stop)으로 표현함</li>
</ul>
<h3 id="📗-2-객체object란">📗 2. 객체(Object)란?</h3>
<blockquote>
<p>객체는 클래스에서 만들어진 실제 사용 가능한 실체(인스턴스) 입니다.</p>
</blockquote>
<pre><code class="language-java">Car myCar = new Car();</code></pre>
<ul>
<li>Car()는 생성자(Constructor)라고 부르며, 객체를 초기화합니다.</li>
<li>myCar는 Car라는 설계도에 따라 만들어진 실제 자동차입니다.</li>
</ul>
<p>객체 사용</p>
<pre><code class="language-java">myCar.colr = &quot;red&quot;;
myCar.speed = 100;
myCar.drive(); // 출력 : 달리는 중...</code></pre>
<h3 id="🧱-3-클래스의-구성-요소">🧱 3. 클래스의 구성 요소</h3>
<ul>
<li>필드(Field) : 객체의 속성(변수)</li>
<li>메서드(Method) : 객체의 동작(함수)</li>
<li>생성자(Constructor) : 객체를 생성할 때 호출되는 특수 메서드</li>
<li>접근 제어자(Access Modifier) : 접근 범위를 정함(public, private 등)</li>
</ul>
<h3 id="🧪-4-클래스와-객체의-실전-예제">🧪 4. 클래스와 객체의 실전 예제</h3>
<pre><code class="language-java">public class Person{
   String name;
   int age;

   //생성자
   Person(String name, int age){
      this.name = name;
      this.age = age;
   }

   //메서드
   void introduce(){
      system.out.println(&quot;안녕하세요, 제 이름은 &quot; + name + &quot;이고, 나이는&quot; + age + &quot;살입니다&quot;);
   }
}

public Class Main{
   public static void main(String[] args){
      Person p1 = new Person(&quot;홍길동&quot;, 25); // 객체 생성
      p1.introduce(); //메서드 호출
   }
}</code></pre>
<p>실행 결과:</p>
<pre><code>안녕하세요, 제 이름은 홍길동이고, 나이는 25살입니다.</code></pre><h3 id="🧠-5-객체의-여러-개-생성">🧠 5. 객체의 여러 개 생성</h3>
<pre><code class="language-java">Person p1 = new Person(&quot;철수&quot;, 22);
Person p2 = new Person(&quot;영희&quot;, 20);

p1.introduce(); //철수
p2.introduce(); //영희</code></pre>
<ul>
<li>클래스는 하나지만, 객체는 여러 개 만들 수 있습니다.</li>
<li>각각이 객체는 독립된 데이터를 가집니다.</li>
</ul>
<h3 id="🧰-7-클래스와-객체를-사용하는-이유">🧰 7. 클래스와 객체를 사용하는 이유</h3>
<ul>
<li>재사용성 : 한번 만든 클래스를 여러 곳에서 재사용 가능</li>
<li>구조화 : 프로그램 구조를 명확하게 분리</li>
<li>유지보수성 : 수정/ 확장/ 관리 용이</li>
<li>캡슐화 : 데이터 보호 및 접근 제어 가능</li>
<li>객체 지향 설계 : 현실 세계를 프로그래밍에 자연스럽게 모델링 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[메서드(Method)]]></title>
            <link>https://velog.io/@dev_su11/%EB%A9%94%EC%84%9C%EB%93%9CMethod</link>
            <guid>https://velog.io/@dev_su11/%EB%A9%94%EC%84%9C%EB%93%9CMethod</guid>
            <pubDate>Thu, 26 Jun 2025 12:12:24 GMT</pubDate>
            <description><![CDATA[<h3 id="📌-1-메서드란">📌 1. 메서드란?</h3>
<blockquote>
<ul>
<li>메서드는 특정 작업을 수행하기 위한 코드 블록(함수) 이며, Java에서 반복되는 동작을 재사용할 수 있게 해주는 구조.</li>
</ul>
</blockquote>
<ul>
<li>Java에서는 모든 메서드는 클래스 내에 정의 됨.</li>
</ul>
<h3 id="📚-2-메서드-구조">📚 2. 메서드 구조</h3>
<pre><code class="language-java">[접근제어자] [반환타입] [메서드이름](매게변수...) {
   // 실행될 코드
   [return 결과값;
}</code></pre>
<p>예제</p>
<pre><code class="language-java">public int add(int a, int b){
   int result = a + b;
   return result;
}</code></pre>
<ul>
<li>public : 접근 제어자 : 외부 클래스에서 접근 가능</li>
<li>int : 반환타입 : 메서드가 반환할 값의 타입</li>
<li>add : 메서드 이름 : 호출 시 사용할 이름</li>
<li>(int a, int b) : 매게변수 : 메서드 호출시 전달 받을 값</li>
<li>return result; 메서드 실행 후 반환할 값</li>
</ul>
<h3 id="🔁-3-메서드-호출-사용법">🔁 3. 메서드 호출 (사용법)</h3>
<pre><code class="language-java">int result = add(5, 3) //result는 8이 됨
system.out.println(result)</code></pre>
<ul>
<li>메서드 이름을 호출하고, 정의한 매개변수 개수와 타입에 맞게 인자를 전달해야합니다.</li>
</ul>
<h3 id="🧩-4-반환값이-없는-메서드-void">🧩 4. 반환값이 없는 메서드 (void)</h3>
<pre><code class="language-java">public void sayHello(String name){
   system.out.println(&quot;Hello, &quot; + name + &quot;!&quot;);
}</code></pre>
<ul>
<li>반환값이 없기 때문에 return을 사용하지 않거나, return;만 사용할 수 있음</li>
<li>호출 예시 :<pre><code class="language-java">sayHello(&quot;Tom&quot;); // 출력 : Hello, Tom!</code></pre>
</li>
</ul>
<h3 id="🧪-5-다양한-메서드-예제">🧪 5. 다양한 메서드 예제</h3>
<h4 id="5-1-매개변수-없음-반환값-있음">5-1. 매개변수 없음, 반환값 있음</h4>
<pre><code class="language-java">public int getRandomNumber(){
   return (int)(Math.random()*100);
}</code></pre>
<h4 id="5-2-매개변수-있음-반환값-없음">5-2. 매개변수 있음, 반환값 없음</h4>
<pre><code class="language-java">public void printSquare(int num){
   system.out.println(num*num);
}</code></pre>
<h3 id="🧠-6-메서드의-주요-개념-정리">🧠 6. 메서드의 주요 개념 정리</h3>
<h4 id="6-1-매개변수parameter-vs-인자argument">6-1. 매개변수(Parameter) vs 인자(Argument)</h4>
<blockquote>
<ul>
<li>매개변수 : 메서드 정의 시 받는 변수</li>
</ul>
</blockquote>
<ul>
<li>인자 : 메서드 호출 시 전달하는 값</li>
</ul>
<pre><code class="language-java">void greet(String name){ // name -&gt; 매게변수
   system.out.println(&quot;Hi&quot; + name);
}
greet(&quot;Alice&quot;); // &quot;Alice&quot; -&gt; 인자</code></pre>
<h4 id="6-2-반환값return">6-2. 반환값(return)</h4>
<blockquote>
<ul>
<li>메서드 실행 결과를 호출한 쪽으로 돌려주는 값</li>
</ul>
</blockquote>
<ul>
<li>return 키워드 사용</li>
</ul>
<pre><code class="language-java">publi int square(int n){
   return n*n;
}</code></pre>
<h3 id="🧱-7-메서드-오버로딩-overloading">🧱 7. 메서드 오버로딩 (Overloading)</h3>
<ul>
<li>같은 이름의 메서드를 매개변수 개수나 타입을 다르게 해서 여러 개 정의 할 수 있음</li>
</ul>
<pre><code class="language-java">public int add(int a, int b){
   return a + b;
}

public double add(double a, double b){
   return a + b;
}

public int add(int a, int b, int c){
   return a + b + c;
}</code></pre>
<ul>
<li>호출 시 컴파일러가 인자의 타입/개수를 보고 자동으로 적절한 메서드 선택</li>
</ul>
<h3 id="📦-8-static-메서드-vs-인스턴스-메서드">📦 8. static 메서드 vs 인스턴스 메서드</h3>
<ul>
<li><p>static 메서드 : static 키워드를 사용하여 선언</p>
<ul>
<li>호출 방법 : 클래서 명. 메서드()</li>
</ul>
</li>
<li><p>인스턴스 메서드 : 일반 메서드를 사용하여 선언</p>
<ul>
<li>호출 방법 ; 객체 메서드()</li>
</ul>
</li>
<li><p>예시:</p>
<pre><code class="language-java">public static int add(int a, int b){
 return a + b;
}</code></pre>
</li>
</ul>
<h3 id="🎯-9-메서드를-사용하는-이유">🎯 9. 메서드를 사용하는 이유</h3>
<ul>
<li>코드 재사용</li>
<li>중복 제거</li>
<li>구조화/ 모듈화</li>
<li>유지보수 용이</li>
<li>가독성 향상</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열(Array) / 컬렉션(Collection)]]></title>
            <link>https://velog.io/@dev_su11/%EB%B0%B0%EC%97%B4Array-%EC%BB%AC%EB%A0%89%EC%85%98Collection</link>
            <guid>https://velog.io/@dev_su11/%EB%B0%B0%EC%97%B4Array-%EC%BB%AC%EB%A0%89%EC%85%98Collection</guid>
            <pubDate>Thu, 26 Jun 2025 10:53:17 GMT</pubDate>
            <description><![CDATA[<h2 id="📘-1-배열-array">📘 1. 배열 (Array)</h2>
<blockquote>
<p>배열이란 같은 자료형의 데이터를 연속된 공간에 고정된 크기로 저장하는 자료 구조</p>
</blockquote>
<h3 id="배열이-필요한-이유">배열이 필요한 이유?</h3>
<pre><code class="language-java">int score1 = 90;
int score2 = 86;
int score3 = 78;
...</code></pre>
<p>위를 배열을 사용하면:</p>
<pre><code class="language-java">int[] scores = new int[5];
scores[0] = 90;
scores[1] = 85;</code></pre>
<h3 id="배열-선언과-초기화">배열 선언과 초기화</h3>
<pre><code class="language-java">//1. 선언 + 크기 지정
int[] numbers = new int[3]; //0으로 초기화

//2. 선언 + 값 초기화
int[] numbers = {10, 20, 30};

//3. 반복문으로 접근
for (int i = 0, i &lt; numbers.length; i++){
   system.out.println(numbers[i]);
}</code></pre>
<h3 id="배열의-특징-정리">배열의 특징 정리</h3>
<ul>
<li>고정 크기 : 선언 시 크기 지정, 변경 불가</li>
<li>동일 자료형 : 모든 원소가 같은 타입</li>
<li>인덱스 기반 : 인덱스는 0부터 시작</li>
<li>기본값 자동 할당 : 숫자는 0, 참조형은 null 등으로 초기화</li>
</ul>
<h3 id="배열의-한계">배열의 한계</h3>
<ul>
<li>크기 조절 불가</li>
<li>요소 추가/삭제 어려움</li>
<li>정렬/검색 등 직접 구현해야함</li>
</ul>
<h2 id="📗-2-컬렉션collection">📗 2. 컬렉션(Collection)</h2>
<blockquote>
<ul>
<li>Java에서 &#39;컬렉션&#39;이라는 단어는 java.util.Collection 인터페이스를 의미하는 경우가 많음</li>
</ul>
</blockquote>
<ul>
<li>Collection은 자바 컬렉션 프레임워크 내에서 데이터 그룹(객체들의 모임)을 표현하는 최상위 인터페이스 중 하나.</li>
<li>즉 여러 데이터를 한꺼번에 다루기 위한 공통된 기능(메서드)를 장악해놓은 계약(인터페이스).</li>
</ul>
<h3 id="collection-인터페이스-구조">Collection 인터페이스 구조</h3>
<pre><code class="language-java">public interface Collection&lt;E&gt; extends Iterable&lt;E&gt; {
   boolean add(E e); // 요소 추가
   boolean remove(Object 0); // 요소 삭제
   boolean contains(Object 0); // 포함 여부 확인
   int size(); // 크기(요소 개수)
   boolean isEmpty(); // 비었는지 확인
   void clear(); // 모두 삭제
   Iterator&lt;E&gt; iterator(); // 반복자 반환
   //그 외 여러 메서드 존재
}</code></pre>
<ul>
<li>&lt; E &gt;는 제네릭 타입으로, 저장할 데이터 타입을 지정합니다.</li>
<li>Collection은 Iterable을 상속하므로, 향상된 for문(for-each)으로 순회 가능</li>
</ul>
<h3 id="collection-인터페이스를-직접-구현하는-클래스는-거의-없다">Collection 인터페이스를 직접 구현하는 클래스는 거의 없다.</h3>
<blockquote>
<p>컬렉션 프레임워크 내에서 Collection을 상속받는 주요 하위 인터페이스는 다음과 같다.</p>
</blockquote>
<ul>
<li>List : 순서 있는 데이터 저장, 중복 허용</li>
<li>Set : 순서 없거나 정렬된 데이터 저장, 중복 불허</li>
<li>Queue : FIFO(선입선출) 방식 데이터 저장</li>
<li>이 하위 인터페이스들이 Collection의 기본 기능을 확장해서 구현.</li>
</ul>
<h3 id="collection의-하위-인터페이스별-특징">Collection의 하위 인터페이스별 특징</h3>
<h4 id="1-list-인터페이스">1. List 인터페이스</h4>
<ul>
<li>순서가 있고 인덱스로 접근 가능한 데이터 집합.</li>
<li>데이터 중복 허용.</li>
<li>구현체 : ArrayList, LinkedList, Vector 등<pre><code class="language-java">List&lt;String&gt; list = new ArrayList&lt;&gt;();
list.add(&quot;A&quot;);
list.add(&quot;B&quot;):
list.add(&quot;A&quot;):
system.out.println(list.get(1)); //&quot;B&quot; 출력</code></pre>
</li>
</ul>
<h4 id="2-set-인터페이스">2. Set 인터페이스</h4>
<ul>
<li>순서가 없거나 정렬된, 중복이 없는 데이터 집합</li>
<li>구현체 : HashSet, TreeSet, LinkedHashSet</li>
</ul>
<pre><code class="language-java">Set&lt;String&gt; Set = new HashSet&lt;&gt;();
set.add(&quot;A&quot;);
Set.add(&quot;B&quot;);
Set.add(&quot;A&quot;); // 무시됨(중복 x)
System.out.println(set.size()); // 2 출력</code></pre>
<h4 id="3-queue-인터페이스">3. Queue 인터페이스</h4>
<ul>
<li>주로 선입선출(FIFO) 자료 구조로 사용</li>
<li>구현체 : LinkedList, PriorityQueue</li>
</ul>
<h3 id="collection-인터페이스를-사용하는-이유">Collection 인터페이스를 사용하는 이유?</h3>
<ul>
<li>통일된 메서드로 다양한 자료 구조를 다룰 수 있음</li>
<li>예를들어, Collection 타입으로 변수를 선언하면,<ul>
<li>ArrayList, HashSet 등 어떤 구현체를 써도 같은 메서드를 사용할 수 있다.<pre><code class="language-java">Collection&lt;String&gt; coll = new ArrayList&lt;&gt;();
coll.add(&quot;A&quot;);
coll.remove(&quot;A&quot;);
System.out.println(coll.isEmpty());</code></pre>
</li>
</ul>
</li>
<li>이렇게 하면 코드가 더 유연해지고 나중에 구현체를 바꾸기가 쉬움</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[반복문]]></title>
            <link>https://velog.io/@dev_su11/%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@dev_su11/%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Wed, 25 Jun 2025 04:51:37 GMT</pubDate>
            <description><![CDATA[<h2 id="✅-반복문이란">✅ 반복문이란?</h2>
<blockquote>
<ul>
<li>동일한 작업을 여러번 반복할 때 사용하는 문법</li>
</ul>
</blockquote>
<ul>
<li><p>같은 코드를 계속 복붙하지 않아도 되니깐 코드가 짧고 깔끔해져요.</p>
</li>
<li><p>예시:</p>
<pre><code class="language-java">system.out.println(&quot;Hello&quot;);
system.out.println(&quot;Hello&quot;);
system.out.println(&quot;Hello&quot;);</code></pre>
<p>위처럼 3번 쓰는 반복문을 쓰면:</p>
<pre><code class="language-java">for (int i = 0; i &lt; 3; i++){
 system.out.println(&quot;Hello&quot;)
}</code></pre>
</li>
</ul>
<h2 id="🔹-java의-반복문-종류">🔹 Java의 반복문 종류</h2>
<ul>
<li>for : 횟수가 정해진 반복</li>
<li>while : 조건이 참인 동안 반복</li>
<li>do while : 무조건 1번 실행 후 조건 확인</li>
<li>향상된 for 문(for-each) : 배열/리스트 등 반복(컬렉션 전용</li>
</ul>
<h3 id="📘-1-for-문---가장-많이-쓰는-반복문">📘 1. for 문 - 가장 많이 쓰는 반복문</h3>
<pre><code class="language-java">for (초기식; 조건식; 증감식) {
   // 반복할 코드
}</code></pre>
<ul>
<li>초기식 : 변수 선언, 초기값 설정(int i = 0)</li>
<li>조건식 : 반복할 조건 (i &lt;5)</li>
<li>증감식 : 반복할 때마다 변수 변화 (i++)</li>
</ul>
<p>✅ 예제</p>
<pre><code class="language-java">for (int i = 1; i &lt;=5, i++){
   system.out.println(&quot;i = &quot; +1);
}</code></pre>
<p>🖨️ 출력:</p>
<pre><code>i = 1
i = 2
i = 3
i = 4
i = 5</code></pre><h3 id="📘-2-while문---조건이-참이면-반복">📘 2. While문 - 조건이 참이면 반복</h3>
<pre><code class="language-java">while (조건식) {
  //조건이 참일 때 반복할 코드
}</code></pre>
<p>✅ 예제</p>
<pre><code class="language-java">int i = 1;
while ( i&lt;= 3 ) {
   system.out.println(&quot;i = &quot; + i);
   i++;
}</code></pre>
<ul>
<li>조건이 처음부터 거짓이면 한번도 실행되지 않아요.</li>
</ul>
<h3 id="📘-3-do--while-문---조건-상관없이-최소-1번-실행">📘 3. do ~ while 문 - 조건 상관없이 최소 1번 실행</h3>
<pre><code class="language-java">do {
   //무조건 한번 실행되는 코드
} while (조건식);</code></pre>
<p>✅ 예제</p>
<pre><code class="language-java">int i = 1;
do {
   system.out.println(&quot;i = &quot; +1);
   i++;
} while (i &lt;=3)</code></pre>
<h3 id="📘-4-향상된-for문for-each---배열-리스트-반복에-최적화">📘 4. 향상된 for문(for-each) - 배열, 리스트 반복에 최적화</h3>
<pre><code class="language-java">for (자료형 번수: 배열/리스트){
   // 변수로 각 요소를 하나씩 꺼내 사용
}</code></pre>
<p>✅ 예제</p>
<pre><code class="language-java">String[] fruits = {&quot;사과&quot;, &quot;바나나&quot;, &quot;포도&quot;};

for (String fruit : fruits) {
   system.out.println(fruit);
}
</code></pre>
<h2 id="📌-제어-키워드-break-continue">📌 제어 키워드 (break, continue)</h2>
<ul>
<li>break : 반복문을 즉시 종료함.</li>
<li>continue : 현재 반복문을 건너뛰고 다음 반복으로 넘어감</li>
</ul>
<p>✅ 예제 - break</p>
<pre><code class="language-java">for (int i = 1; i &lt;= 5; i++) {
    if (i == 3) break;
    System.out.println(i);
}</code></pre>
<p>🖨️출력 : 1,2</p>
<p>✅ 예제 - continue</p>
<pre><code class="language-java">for (int i = 1; i &lt;= 5; i++) {
    if (i == 3) continue;
    System.out.println(i);
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[조건문]]></title>
            <link>https://velog.io/@dev_su11/%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@dev_su11/%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Wed, 25 Jun 2025 04:24:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>Java에서 조건문은 프로그램에 특정 조건을 만족할 때만 실행되는 코드를 작성할 수 있게 해줌</strong></p>
</blockquote>
<h2 id="🔹-java-조건문의-종류">🔹 Java 조건문의 종류</h2>
<ul>
<li>if : 조건이 참일 때만 실행</li>
<li>if ~ else : 조건이 참/거짓 둘다 처리</li>
<li>if ~ else if : 여러 조건을 순차적으로 확인</li>
<li>switch : 값에 따라 분기(정수, 문자열 등)</li>
</ul>
<h3 id="1-📌-if-문">1. 📌 if 문</h3>
<pre><code class="language-java">if (조건) {
   // 조건이 참일 때 실행되는 코드
}</code></pre>
<ul>
<li>예시<pre><code class="language-java">int age = 20;
if (age &gt;= 18) {
 system.out.printl(&quot;성인입니다.&quot;);
}</code></pre>
</li>
</ul>
<h3 id="2-📌-if--else-문">2. 📌 if ~ else 문</h3>
<pre><code class="language-java">if (조건) {
   //조건이 참일 떄
} else {
    //조건이 거짓일 때
}</code></pre>
<ul>
<li>예시<pre><code class="language-java">int score = 45;
if (score &gt;= 60){
 system.out.println(&quot;합격입니다.&quot;);
} else {
 system.out.println(&quot;불합격입니다.&quot;);
}</code></pre>
</li>
</ul>
<h3 id="3-📌-if--else-if--else-문">3. 📌 if ~ else if ~ else 문</h3>
<pre><code class="language-java">if (조건1) {
   // 조건 1이 참일때
} else if (조건 2) {
   // 조건 2가 참일 때
} else {
   // 위 조건 모두 거짓일 떄
}</code></pre>
<ul>
<li>예<pre><code class="language-java">int score = 85;
if (score &gt;= 90){
 system.out.println(&quot;A 학점&quot;);
} else if (score &gt;= 80){
 system.out.println(&quot;B 학점&quot;);
} else {
 system.out.println(&quot;C학점 이하&quot;);
}</code></pre>
</li>
</ul>
<h3 id="4-📌-switch-문">4. 📌 switch 문</h3>
<ul>
<li>특정 값에 따라 분기할 때 사용</li>
<li>if보다 값이 명확할 때 효율적</li>
</ul>
<pre><code class="language-java">switch (값) {
   case 값1:
      // 실행 코드
   case 값2:
      // 실행 코드
      break;
   default;
      // 아무 조건도 맞지 않을 때
}</code></pre>
<ul>
<li>예시<pre><code class="language-java">int day = 2;
</code></pre>
</li>
</ul>
<p>switch (day) {
   case 1:
      system.out.println(&quot;월요일&quot;)
   case 2:
      system.out.println(&quot;화요일&quot;)
      break;
   default:
      system.out.println(&quot;기타 요일&quot;)
}
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[연산자]]></title>
            <link>https://velog.io/@dev_su11/%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@dev_su11/%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Wed, 25 Jun 2025 03:55:39 GMT</pubDate>
            <description><![CDATA[<h2 id="1-연산자란">1. 연산자란?</h2>
<blockquote>
<ul>
<li>연산자는 변수나 값(피연산자)에 대해 특정 작업(연산)을 수행하는 기호</li>
</ul>
</blockquote>
<ul>
<li>연산자를 통해 산술 계산, 값 비교, 논리 판단 등 다양한 작업 가능</li>
</ul>
<h2 id="2-연산자의-종류">2. 연산자의 종류</h2>
<ul>
<li>산술 연산자 : 숫자 계산을 할 때 사용 -&gt; +, -, *, /, %</li>
<li>비교 연산자 : 두 값을 비교하여 참/거짓 판별 -&gt; ==, !=, &gt;, &lt;, &gt;=, &lt;=</li>
<li>논리 연산자 : 논리 연선(AND, OR, NOT 등) -&gt; &amp;&amp;</li>
<li>대입 연산자 : 변수에 값을 할당할 떄 사용 -&gt; =, +=, -=, /=, %=</li>
<li>증감 연산자 : 변수 값을 1씩 증가 또는 감소 -&gt; ++, --</li>
<li>비트 연산자 : 이진수 비트 단위 연산 -&gt; &amp;</li>
<li>기타 연산자 : 삼항 연산자, instanceof 등 -&gt; ? :, instanceof</li>
</ul>
<h2 id="3-각-연산자-설명-및-예시">3. 각 연산자 설명 및 예시</h2>
<h3 id="3-1-산술-연산자">3-1. 산술 연산자</h3>
<ul>
<li>덧셈(+)</li>
<li>뺼셈(-)</li>
<li>곱셈(*)</li>
<li>나눗셈(/)</li>
<li>나머지(%)<pre><code class="language-java">int a = 10, b = 3;
system.out.println(a + b) // 13
system.out.println(a % b) // 1</code></pre>
</li>
</ul>
<h3 id="3-2-비교-연산자">3-2. 비교 연산자</h3>
<blockquote>
<p>두 값의 관계를 비교하여 boolean 결과를 반환(true/false)</p>
</blockquote>
<ul>
<li>같음(==)</li>
<li>같지 않음(!=)</li>
<li>크다(&gt;)</li>
<li>작다(&lt;)</li>
<li>크거나 같다(&gt;=)</li>
<li>작거나 같다(&lt;=)</li>
</ul>
<h3 id="3-3-논리-연산자">3-3. 논리 연산자</h3>
<blockquote>
<p>논리적 참/거짓 연산을 수행할 때 사용</p>
</blockquote>
<ul>
<li>AND,그리고(&amp;&amp;) : 둘 다 참일 때만 참, 나머지는 거짓</li>
<li>NOT,부정(!) : 논리 값을 반전(참 -&gt; 거짓, 거짓 -&gt; 참)<pre><code class="language-java">boolean a = true;
boolean b = false;
system.out.println(a &amp;&amp; b);
system.out.println(!a);</code></pre>
</li>
</ul>
<h3 id="3-4-대입-연산자">3-4. 대입 연산자</h3>
<blockquote>
<p>변수에 값을 넣거나 수정할 때 사용</p>
</blockquote>
<ul>
<li>대입(=)</li>
<li>더해서 대입(+=)</li>
<li>빼서 대입(-+)</li>
<li>곱해서 대입(*=)</li>
<li>나누어서 대입(/=)</li>
<li>나머지 연산 후 대입(%=)</li>
</ul>
<h3 id="3-5-증감-연산자">3-5. 증감 연산자</h3>
<blockquote>
<p>변수 값을 1씩 올리거나 내림</p>
</blockquote>
<ul>
<li>1 증가(++)</li>
<li>1 감소(--)</li>
</ul>
<p>전위 연산자(++a)는 먼저 값을 증가 시키고 연산 수행
후위 연산자(a++)는 연산 수행 후 값을 증가.</p>
<pre><code class="language-java">int a = 5;
system.out.println(a++); // 출력 : 5(출력 후 증가)
system.out.println(++a); // 출력 : 7(먼저 증가 후 출력</code></pre>
<h3 id="3-6-비트-연산자">3-6. 비트 연산자</h3>
<blockquote>
<p>정수형 값을 2진수 비트 단위로 연산</p>
</blockquote>
<ul>
<li>비트 AND(&amp;) : 둘다 1이면 1</li>
<li>비트 XOR(^) : 서로 다르면 1</li>
<li>비트 NOT(~) : 1은 0으로, 0은 1로 반전</li>
<li>왼쪽 시프트(&lt;&lt;) : 비트를 왼쪽으로 이동</li>
<li>오른쪽 시프트(&gt;&gt;) : 비트를 오른쪽으로 이동(부호 유지)</li>
<li>오른쪽 시프트(&gt;&gt;&gt;) : 비트를 오른쪽으로 이동(부호 무시)</li>
</ul>
<h3 id="3-7-기타-연산자">3-7. 기타 연산자</h3>
<ul>
<li>삼항 연산자 : 조건 ? 참일 때 값 : 거짓일 때 값<pre><code class="language-java">int max = (a&gt;b) ? a : b;</code></pre>
</li>
<li>instanceof 연산자 : 객체가 특정 클래스의 인스턴스인지 검사<pre><code class="language-java">if (obj instanceof Sgtring){
 // obj가 String 타입인지 확인
}</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료형 / 변수]]></title>
            <link>https://velog.io/@dev_su11/%EC%9E%90%EB%A3%8C%ED%98%95-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@dev_su11/%EC%9E%90%EB%A3%8C%ED%98%95-%EB%B3%80%EC%88%98</guid>
            <pubDate>Wed, 25 Jun 2025 03:25:07 GMT</pubDate>
            <description><![CDATA[<h2 id="자료형date-type-이란">자료형(Date Type) 이란?</h2>
<blockquote>
<p><strong>변수가 저장할 수 있는 값의 종류와 크기를 결정하는 규칙
어떤 값이 어떤 형태로 메모리에 저장되고, 어떻게 다뤄질 지를 정해주는 역할을 함</strong></p>
</blockquote>
<h3 id="🔹-java의-자료형은-크게-두가지로-나뉘어요">🔹 Java의 자료형은 크게 두가지로 나뉘어요:</h3>
<h4 id="1-기본-자료형primitive-type">1. 기본 자료형(Primitive Type)</h4>
<blockquote>
<p>Java에서 가장 기본이 되는 자료형</p>
</blockquote>
<ul>
<li>byte : 아주 작은 정수</li>
<li>shorte : 작은 정수</li>
<li>int : 일반적인 정수(가장 많이 사용됨)</li>
<li>long : 매우 큰 정수(L 붙여야 함)</li>
<li>float : 실수(f 붙여야 함)</li>
<li>double : 더 정밀한 실수</li>
<li>char : 문자 하나(작은 따음표 사용)</li>
<li>boolean : 참 또는 거짓(논리 값)</li>
</ul>
<h4 id="2-참조-자료형reference-type">2. 참조 자료형(Reference Type)</h4>
<ul>
<li>기본형이 아닌 객체를 가리키는 자료형</li>
<li>클래스, 배열, 인터페이스, 문자열 등이 여기에 포함<pre><code class="language-java">String name = &quot;Suhyeun&quot;; //String은 참조 자료형
int[] numbers = {1,2,3} //배열도 참조 자료형</code></pre>
</li>
</ul>
<h2 id="변수variable이란">변수(Variable)이란?</h2>
<blockquote>
<p><strong>프로그램에서 데이터를 저장하고 다루기 위한 이름이 붙은 메모리 공간</strong></p>
</blockquote>
<h3 id="📌-변수의-정의">📌 변수의 정의</h3>
<ul>
<li>변수는 값을 저장하는 공간</li>
<li>변수에 저장된 값은 언제든지 바꿀 수 있어요</li>
<li>변수는 이름, 자료형, 값으로 구성</li>
</ul>
<pre><code class="language-java">int age = 25;</code></pre>
<ul>
<li>int -&gt; 자료형(정수)</li>
<li>age -&gt; 변수 이름(메모리 공간의 이름)</li>
<li>25 -&gt; 저장된 값</li>
</ul>
<h3 id="📌-변수-선언과-초기화">📌 변수 선언과 초기화</h3>
<ul>
<li>선언(Declaration) : 변수를 처음 만드는 것</li>
<li>초기화(Initialization) : 처음 값을 넣는 것</li>
</ul>
<pre><code class="language-java">int number; // 선언
number = 10;// 초기화
int score = 90; //선언 + 초기화</code></pre>
<h3 id="📌-변수의-자료형">📌 변수의 자료형</h3>
<blockquote>
<p>변수를 만들 때는 어떤 타입의 값을 담을지도 함께 정해야함</p>
</blockquote>
<pre><code class="language-java">int age = 25;           // 정수형
double pi = 3.14;       // 실수형
char grade = &#39;A&#39;;       // 문자형
boolean isTrue = true;  // 논리형
String name = &quot;수현&quot;;    //문자열(참조형)</code></pre>
<h3 id="📌-변수의-종류사용-범위에-따라">📌 변수의 종류(사용 범위에 따라)</h3>
<ul>
<li>지역 변수 : 메서드 안에 선언, 해당 블록에서만 사용 가능</li>
<li>맴버 변수 : 클래스 안에서 선언, 객체가 갖는 변수</li>
<li>클래스 변수(static) : 클래스 전체에 공유됨</li>
<li>매개변수 : 메서드에 전달되는 입력값을 저장</li>
</ul>
<pre><code class="language-java">public class Person {
  string name;     // 멤버 변수

  public void sayHello(String greeting){  // greeting은 매개변수
    String message = greeting + name;    // message는 지역 변수
    system.out.println(message);
  }
}</code></pre>
<h3 id="📌-변수의-활용">📌 변수의 활용</h3>
<blockquote>
<p>변수를 이용하면 값을 쉽게 재사용하고 변경할 수 있어서 유지보수가 쉬워져요</p>
</blockquote>
<pre><code class="language-java">int width = 10;
int height = 20;
int area = width * height; // 값 변경해도 자동 반영됨</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux의 시작과 종료]]></title>
            <link>https://velog.io/@dev_su11/Linux%EC%9D%98-%EC%8B%9C%EC%9E%91%EA%B3%BC-%EC%A2%85%EB%A3%8C</link>
            <guid>https://velog.io/@dev_su11/Linux%EC%9D%98-%EC%8B%9C%EC%9E%91%EA%B3%BC-%EC%A2%85%EB%A3%8C</guid>
            <pubDate>Wed, 18 Jun 2025 06:01:34 GMT</pubDate>
            <description><![CDATA[<h2 id="-shutdown"># shutdown</h2>
<blockquote>
<p>shutdown 명령어는 리눅스 시스템에서 시스템을 종료(power off)하거나 재부팅(reboot)할 떄 사용하는 명령어.</p>
</blockquote>
<pre><code>shutdown [옵션] [시간]</code></pre><ul>
<li><p>옵션</p>
<ul>
<li><p>-h : 종료</p>
<pre><code>shutdown -h +1</code></pre></li>
<li><p>-r : 재시작(재부팅)</p>
<pre><code>shutdown -r +1</code></pre></li>
<li><p>-c 종료 명령 취소</p>
<pre><code>shutdown -c</code></pre><br>

</li>
</ul>
</li>
</ul>
<h2 id="리눅스-종료하는-명령어">리눅스 종료하는 명령어</h2>
<ul>
<li>shutdown -h [시간]</li>
<li>poweroff</li>
<li>halt (프로세스/ 시스템 종료 하지만 power은 종료 x)<ul>
<li>halt -p : power까지 종료</li>
</ul>
</li>
<li>init 0  </li>
</ul>
<br>


<h2 id="리눅스-재시작하는-명령어">리눅스 재시작하는 명령어</h2>
<ul>
<li>shutdown -r [시간]</li>
<li>reboot</li>
<li>init 6</li>
<li>[ctrl + alt +del]</li>
</ul>
<br>

<h2 id="런-레벨">런 레벨</h2>
<blockquote>
<ul>
<li>런 레벨(runlevel)은 리눅스에서 시스템이 현재 어떤 상태로 동작하고 있는지를 나타내는 숫자 코드</li>
</ul>
</blockquote>
<ul>
<li><p>런레벨은 시스템이 부팅되면서 어떤 서비스들을 시작/중지해야 할지를 결정하는데 사용</p>
</li>
<li><p>0레벨 부터 6레벨까지 존재</p>
</li>
<li><p>0 (Halt) : 시스템 종료(power off)</p>
</li>
<li><p>1 (Siongle-user mode) : 단일 사용자 모드(유지보수용, root만 접근)</p>
</li>
<li><p>2 (Multi-user) : 네트워크 없는 다중 사용자 모드(Debian 계열 기본)</p>
</li>
<li><p>3 Multi-user : 텍스트 기반 다중 사용자 모드(TUI/가장 많이 사용)</p>
</li>
<li><p>4 (사용자 정의) : 대부분의 시스템에서 사용 안함(사용자 설정 가능)</p>
</li>
<li><p>5 (GUI mode) : 그래픽 기반 모드 (데스크탑 환경, 로그인 GUI) </p>
</li>
<li><p>6 (Reboot) : 시스템 재부팅</p>
</li>
</ul>
<h2 id="tuigui-모드-전환">TUI/GUI 모드 전환</h2>
<blockquote>
<p>보통 실무에서 TUI 모드로 전환하여 사용한다.</p>
</blockquote>
<h3 id="1-tui모드로-전환하여-사용하는-이유">1. TUI모드로 전환하여 사용하는 이유</h3>
<ul>
<li><strong>자원 절약(CPU, 메모리)</strong><ul>
<li>GUI 환경은 많은 시스템 자원을 사용</li>
<li>서버나 저사양 시스템에서 불필요한 리소스 낭비 없이 빠르게 운영 가능</li>
</ul>
</li>
<li><strong>서버 운영 목적</strong><ul>
<li>대부분의 리눅스 서버는 GUI 없이 운영됨</li>
<li>GUI 보안 리스크 및 불필요한 요소로 간주됨</li>
<li>텍스트 기반만으로도 서버 관리 가능(SSH, 명령어 등)</li>
</ul>
</li>
<li><strong>시스템 복구/유지보수</strong><ul>
<li>GUI가 깨지거나 부팅이 안될 경우, 텍스트 모드는 안정적인 유지보수 환경을 제공</li>
<li>rescue.target 또는 multi-user.target으로 부팅하여 문제 해결 가능</li>
</ul>
</li>
<li><strong>부팅 속도 향상</strong><ul>
<li>GUI를 생략하면 부팅 시간이 짧아짐</li>
<li>특히 자동화된 시스템이나 내장형 시스템에서는 필수적</li>
</ul>
</li>
<li><strong>명령어 기반의 유연함</strong><ul>
<li>서버 관리자나 개발자들은 CLI나 TUI 환경에서 더 많은 제어권을 가짐.</li>
<li>tmx, htop, nmtui, vim, alsamixer 등은 모두 TUI 환경에서 사용 가능</li>
</ul>
</li>
</ul>
<br>

<h3 id="2-gui---tui-모드-전환">2. GUI -&gt; TUI 모드 전환</h3>
<pre><code>systemctl set-default multi-user.target</code></pre><p>위 명령어 입력 후 재부팅 하면 TUI 모드로 전환된다.</p>
<pre><code>init 6</code></pre><h3 id="3-tui---gui-모드-전환">3. TUI -&gt; GUI 모드 전환</h3>
<pre><code>systemctl set-default graphical.target</code></pre><p>위 명령어 입력 후 재부팅 하면 GUI 모드로 다시 전환 된다.</p>
<pre><code>init 6</code></pre><h2 id="셀-프롬프트">셀 프롬프트</h2>
<blockquote>
<p>셀 프롬프트(shell prompt)란 리눅스, 유닉스, macOS 같은 시스템에서 <strong>사용자가 명령어를 입력할 수 있도록 대기하는 표시줄을 의미</strong></p>
</blockquote>
<pre><code>root@localhost ~ : ~# //관리자
test@localhost : ~$ //일반 사용자</code></pre><h3 id="구성요소">구성요소</h3>
<pre><code>[사용자 이름]@[호스트 이름] : [현재 디렉토리] [$ &amp; ~]</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Linux 실습환경 구성(3)]]></title>
            <link>https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B13</link>
            <guid>https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B13</guid>
            <pubDate>Wed, 18 Jun 2025 05:20:44 GMT</pubDate>
            <description><![CDATA[<h2 id="vm에-windows-11-설치">VM에 Windows 11 설치</h2>
<blockquote>
<p>보통 실무에서 리눅스 서버에 직접적으로 들어가서 작업 하는 경우는 드물기 때문에 윈도우 환경에서 리눅스 서버에 접속하여 관리하는 환경을 만들어야한다.</p>
</blockquote>
<h3 id="1-windows-11-iso-arm-이미지-파일-다운">1. Windows 11 iso arm 이미지 파일 다운.</h3>
<p><a href="https://www.microsoft.com/en-us/software-download/windows11arm64">Windows 11 iso arm img</a> 위 링크를 들어가 본인 환경에 맞는 iso 파일 다운로드 한다.</p>
<p>나는 Mac OS를 사용하기 때문에 arm 을 다운 받았다( Windows를 사용하고 계신 분들은 x64 bit 다운)</p>
<h3 id="2-new-virtual-machine">2. New Virtual Machine</h3>
<p>VM에 들어가 리눅스 설치 했던 과정 그대로 Windows 11을 설치한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/a0cde6d5-0f95-4bf8-b34b-458744ea8902/image.png" alt="">
 이 화면에 설치 해 놓은 Windows 11 드래그</p>
<p> 이 과정을 거치면 VM에 Windows가 설치된다.</p>
<h3 id="3-install-vmware-tool">3. Install VMware tool</h3>
<p>제일 중요한 부분이 이부분이다.</p>
<p>VMware에 windows 를 설치 한 후 이더넷 네트워크를 사용하려면 이부분을 꼭 해주어야한다.</p>
<p>Windows에 접속하면 Mac 상단에 Virtual Machine이라는 메뉴가 있는데 이 메뉴를 클릭 하면 <strong>Install VMware tools</strong> 라는 메뉴가 있다.</p>
<p><strong>이 메뉴를 클릭하고 설치가 완료 되면 설치한 Windows에 이더넷 네트워크를 사용할 수 있다.</strong></p>
<h3 id="4-고정-ip-설정">4. 고정 IP 설정</h3>
<p>위 과정을 거치면 이더넷 네트워크를 사용할 수 있는데 전에 리눅스 환경 설정 과정에서 했던 것과 동일하게 Windows에도 고정 IP를 설정 해 주어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/61ce246e-44ef-4507-8b59-bd4901b70078/image.png" alt=""></p>
<p>1) 위 이미지에서 소리 좌측에 있는 네트워크 표시를 우클릭 후 네트워크 및 인터넷 설정에 진입 한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/6ee2808c-fb8c-4e11-b07f-c6c1d33f367b/image.png" alt="">
2) 메뉴중 첫번 째에 있는 이더넷 클릭</p>
<p>3) <strong>IP 설정 편집에 들어가서 수동으로 변경 후 IPv4를 켜준다(IPv6 아님)</strong></p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/f4cb6741-83a5-4a9e-bb77-6316c214cd69/image.png" alt=""></p>
<p>4) 위와 같이 IP 주소, 서브넷 마스크, 게이트웨이, DNS 변경 후 저장</p>
<p>5) 이제 고정 IP로 변경 되었다.</p>
<h3 id="5-네트워크-연결-확인">5. 네트워크 연결 확인</h3>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/bc1811bc-8ac4-4333-8689-a8ba3f726b5a/image.png" alt="">
검색창에 cmd 입력</p>
<pre><code>ipconfig</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/32b98e1f-377d-4417-8997-f5923a12e2e0/image.png" alt=""></p>
<pre><code>ping 8.8.8.8</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/bd1fdac0-0cca-4cf0-b88f-9d794a38786f/image.png" alt="">
위와 같이 고정 IP로 변경 되었고 네트워크도 연결이 되어 있는 것을 확인 할 수 있다.</p>
<h2 id="putty-설치">Putty 설치</h2>
<p>이제 윈도우에서 리눅스에 접속을 편리하게 설치 할 수 있는 도구 들을 설치해 보자.</p>
<p><a href="https://www.putty.org/">Putty 다운로드</a> 이 링크에 접속하여 VM의 Windows 11 안에 Putty를 설치 하여 사용해 보자.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/ec02c61a-5d7c-47b6-9f58-85db3f52eb5d/image.png" alt="">
PUtty를 설치 한 후 실행.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/2c5c01b1-cf6e-41f1-9626-1fbb5055acd4/image.png" alt=""></p>
<p><strong>실행 전에 윈도우에서 접속 할 리눅스 서버를 먼저 실행 시켜 놓아야 한다.</strong></p>
<p>위 이미지에서 접속 할 리눅스 서버의 IP를 입력한다</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/a1f9c750-c8f1-4ac5-a00a-8161c5c376bb/image.png" alt=""></p>
<p>192.168.10.50 번 서버에 접속 해보자!</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/3221b000-362b-4723-bdfc-c0df6b34646b/image.png" alt=""></p>
<p>login( root / password) 를 하면 리눅스 서버에 접속 할 수 있다.</p>
<p><strong>위처럼 Putty로 모든 리눅스 서버에 접속하여 관리 하는 방법이 있다.</strong></p>
<h2 id="mobaxterm-설치">MobaXterm 설치</h2>
<p>Putty로 관리 하는 방법도 있지만 이 MobaXterm으로 관리 하는 방법도 있다!</p>
<p><a href="https://mobaxterm.mobatek.net/">MobaXterm 다운</a> 이 링크로 들어가 MobaXterm을 다운 받고 실행한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/5b7d45fa-542e-484b-8eb2-57009e833e0a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/1b1f452c-5164-45f9-81e6-155f45187336/image.png" alt=""></p>
<p>난 이 MobaXterm에서 192.168.10.100 번 서버로 접속을 할 것이기 때문에 미리 Rocky_100이라는 폴더를 만들었다.</p>
<p>Rocky_100 폴더를 우클릭 후 New Session을 클릭한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/f0c1d920-a5fe-426b-880a-c6789c17d5be/image.png" alt=""></p>
<p>SSH 로 들어 간 후 host(접속할 IP)와 username(root) 입력하여 Session을 생성한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/3c895361-3759-47e3-b0de-5a3b42298466/image.png" alt=""></p>
<p>그럼 위와 같이 Rocky_100 폴더 밑에 192.168.10.100 이라는 Session이 생성 된 것이 보인다.</p>
<p>그리고 이 Session을 실행 시킨다.
<strong>(Session을 실행하기 전에 해당하는 리눅스 서버는 반드시 켜져있어야 한다)</strong></p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/b7dc5963-c004-40a9-a056-3b89eb2ff902/image.png" alt=""></p>
<p>위와 같이 리눅스 서버에 연결 되는 것을 확인 할 수 있다.</p>
<p>이렇게 한 서버에 연결하였을 때 항상 해 왔던 IP 확인과 네트워크 연결 확인을 한번 해보자
-&gt; 이 과정은 처음에는 습관을 들여 놓으면 매우 좋다.</p>
<pre><code>ifconfig</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/9a37bb28-72a2-435b-a8f8-0042eba9be5d/image.png" alt=""></p>
<pre><code>ping -c 4 8.8.8.8</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/65d8acc1-2af3-4292-bd0e-e4a573930ec7/image.png" alt=""></p>
<p>IP와 네트워크 연결 확인까지 완료 하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux 실습환경 구성(2)]]></title>
            <link>https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B12</link>
            <guid>https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B12</guid>
            <pubDate>Wed, 18 Jun 2025 04:40:18 GMT</pubDate>
            <description><![CDATA[<h2 id="리눅스-서버-여러대-만들기">리눅스 서버 여러대 만들기</h2>
<p><a href="https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1">Linux 실습환경 구성(1)</a> 이 링크에서 구성한 한대의 Linux 서버를 복제 하는 과정을 학습해보자!</p>
<h3 id="1-리눅스-서버-clone-하기">1. 리눅스 서버 clone 하기</h3>
<blockquote>
<p>리눅스 서버를 clone 하기 위해서 실행해 놓았던 리눅스 서버를 종료해야만 한다.</p>
</blockquote>
<pre><code>init 0 // 서버 종료하기</code></pre><p>1) 서버 종료 후 Virtual Machine Library로 들어가 복제하고자 하는 리눅스 서버 우클릭</p>
<p>2) 우클릭 하면 Clone이 두가지 보이는데 </p>
<ul>
<li><strong>Create Full Clone -&gt; 이 항목 클릭</strong></li>
<li>Create Linked Clone</li>
</ul>
<p>3) 위 항목을 클릭하고 이름과 경로 저장을 하고 clone 과정을 거치면 아래 이미지와 같이 미리 만들어 놓은 리눅스 서버와 같은 리눅스 한대가 더 생성 된 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/dev_su11/post/77f0944f-0b04-457c-be52-1ce85ec7b9f4/image.png" alt=""></p>
<h3 id="2-복제-된-리눅스-서버-ip-수정">2. 복제 된 리눅스 서버 IP 수정</h3>
<blockquote>
<p>복제 된 리눅스 서버의 고정 IP를 수정해야한다
그 이유는 IP가 같으면 따로 따로 서버는 돌아가지만 동시에 서버를 실행 시킬 경우에 IP 충돌이 나기 때문에 고정 IP의 마지막 자리의 숫자는 변경 해야 할 필요가 있다.</p>
</blockquote>
<p>전에 했던 고정 IP 설정 과정을 반복한다(<strong>IP만 수정</strong>)
<img src="https://velog.velcdn.com/images/dev_su11/post/1fa3c705-757e-47f0-b265-78e27585ef90/image.png" alt=""></p>
<p>복제된 리눅스 서버의 고정 IP를 192.168.10.100 으로 수정.</p>
<h3 id="3-네트워크-연결-확인">3. 네트워크 연결 확인</h3>
<pre><code>ifconfig</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/2c9a06c8-3ded-4aa8-a48b-ef3d87808535/image.png" alt=""></p>
<pre><code>ping -c 4 8.8.8.8</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/e39d1f44-1f85-439a-95f8-84624d64da43/image.png" alt=""></p>
<p>IP도 정상적으로 변경 된 것을 확인 하고 네트워크 연결도 원할하게 되는 것을 확인 하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux 실습환경 구성(1)]]></title>
            <link>https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@dev_su11/Linux-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Sun, 15 Jun 2025 08:40:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>준비물</strong></p>
</blockquote>
<ul>
<li>VMware fushion : 가상 머신 실행 프로그램(Mac OS 전용)</li>
<li>리눅스 ISO 이미지</li>
</ul>
<br>

<h2 id="vmware-설치">VMware 설치</h2>
<ol>
<li>VMware 다운로드</li>
</ol>
<ul>
<li>공식 사이트: <a href="https://www.vmware.com">https://www.vmware.com</a></li>
<li>개인용 무료: VMware fusion (Mac OS)</li>
<li>설치 시 기본값으로 진행하면 됨</li>
</ul>
<ol start="2">
<li>설치 완료 후 실행</li>
</ol>
<br>

<h2 id="리눅스-iso-파일-준비">리눅스 ISO 파일 준비</h2>
<ul>
<li>원하는 리눅스 배포판의 ISO 다운로드<ul>
<li>Ubuntu Server: <a href="https://ubuntu.com/download/server">https://ubuntu.com/download/server</a></li>
<li>Rocky Linux (RHEL 계열): <a href="https://rockylinux.org">https://rockylinux.org</a></li>
<li>CentOS (이전 버전): <a href="https://vault.centos.org">https://vault.centos.org</a></li>
<li>Fedora: <a href="https://getfedora.org">https://getfedora.org</a></li>
</ul>
</li>
</ul>
<blockquote>
<p>💡 리눅스 마스터 시험용 실습은 보통 CentOS 또는 Rocky Linux 기준으로 많이 하기 때문에 저는 Rocky Linux를 설치하였습니다.</p>
</blockquote>
<br>

<h2 id="vmware-가상-머신-생성">VMware 가상 머신 생성</h2>
<ol>
<li>VMware 우측 상단에 + 버튼 클릭 후 New 클릭</li>
<li>Install from disc or image 클릭</li>
<li>위에 다운받은 Linux 이미지 iso 파일 드래그</li>
<li>위 과정으로 리눅스 배포판 가상 머신에 설치 완료.</li>
</ol>
<br>

<h2 id="필요-패키지-설치">필요 패키지 설치</h2>
<p><strong>1. EPEL 리포지터리 추가</strong></p>
<blockquote>
<p>Rocky Linux는 Red Hat 계열이므로, EPEL 을 활성화해야 gnome-tweaks 같은 유틸리티 설치 가능</p>
</blockquote>
<ul>
<li>터미널에 진입 후 아래와 같은 명령어 입력<pre><code>sudo dnf install epel-release -y</code></pre></li>
</ul>
<p><strong>2. GNOME Tweaks 설치</strong></p>
<blockquote>
<p>이 패키지를 설치 하는 이유는 디테일한 커스터마이징을 하기 위해.</p>
</blockquote>
<pre><code>dnf -y install gnome-tweaks</code></pre><h2 id="고정-ip-주소-설정">고정 IP 주소 설정</h2>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/7decd07b-5903-4378-8975-de968fd896ef/image.png" alt="">
우측 상단에 네트워크 연결 클릭</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/611a9cef-7107-4ae9-95c9-dca0840322bf/image.png" alt=""></p>
<p>유선 클릭 -&gt; 유선 네트워크 설정 클릭하면 네트워크 설정할 수 있는 것이 나오는데 </p>
<p>유선쪽 우측에 톱니바퀴를 클릭하면 아래와 같은 이미지가 나온다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/ba9053f7-1e1a-49ec-a9d8-c8efc7f62866/image.png" alt=""></p>
<p>위 이미지에서 IPv4에 들어가 수동으로 본인이 원하는 IP, 서브넷마스크, 게이트웨이를 설정 할 수 있다.</p>
<h2 id="vmnet-ip--dns-주소-변경">vmnet IP &amp; DNS 주소 변경</h2>
<blockquote>
<p>위 처럼 Rocky Linux의 고정 IP를 설정 한 후 Mac OS 자체의 vmnet 8( Nat ) IP 주소도 위 리눅스 서버의 IP와 동일하게 변경 해야만 한다.</p>
</blockquote>
<h3 id="1-mac-os에서-vmnet8-설정-파일-경로">1. Mac OS에서 vmnet8 설정 파일 경로</h3>
<pre><code>/Library/Preferences/VMware\ Fusion/vmnet8/nat.conf
cat /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf</code></pre><ul>
<li>특별한 변동사항이 없는 한 기본적인 vmnet 8 설정 파일은 위 경로에 위치해 있다.</li>
</ul>
<h3 id="2-mac-os-터미널에서-natconf-수정">2. Mac OS 터미널에서 nat.conf 수정</h3>
<pre><code>sudo nano /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf</code></pre><p>위 명령어를 입력하면 아래와 같이 nat.conf 파일을 수정 할 수 있다.</p>
<pre><code># VMware NAT configuration file
# Manual editing of this file is not recommended. Using UI is preferred.

[host]

# Use MacOS network virtualization API
useMacosVmnetVirtApi = 1

# NAT gateway address
ip = 192.168.10.2
netmask = 255.255.255.0

# VMnet device if not specified on command line
device = vmnet8

# Allow PORT/EPRT FTP commands (they need incoming TCP stream ...)
activeFTP = 1

# Allows the source to have any OUI.  Turn this on if you change the OUI
# in the MAC address of your virtual machines.</code></pre><ul>
<li>위 설정 파일에서 <strong>Nat gateway address/ netmask를 Rocky Linux에서 설정한 고정 IP와 서브넷 마스크로 변경</strong></li>
</ul>
<h3 id="3-mac-os-터미널에서-dhcpdconf-수정">3. Mac OS 터미널에서 dhcpd.conf 수정</h3>
<pre><code>sudo nano /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf</code></pre><p>위 명령어를 입력하고 키보드 방향키를 아래로 쭉 내리다보면 subnet/ vmnet 8 설정을 수정할 수 있다.</p>
<pre><code>subnet 192.168.10.0 netmask 255.255.255.0 {
        range 192.168.10.128 192.168.10.254;
        option broadcast-address 192.168.10.255;
        option domain-name-servers 192.168.10.2;
        option domain-name localdomain;
        default-lease-time 1800;                # default is 30 minutes
        max-lease-time 7200;                    # default is 2 hours
        option netbios-name-servers 192.168.10.2;
        option routers 192.168.10.2;
}</code></pre><pre><code>host vmnet8 {
        hardware ethernet 00:50:56:C0:00:08;
        fixed-address 192.168.10.1;
        option domain-name-servers 0.0.0.0;</code></pre><ul>
<li>위 설정 파일에서 IP를 Rinux의 고정 IP로 변경 한다<h3 id="4-natconf-dhcpdconf-변경한-설정-저장-후-vmware-네트워크-재시작">4. nat.conf/ dhcpd.conf 변경한 설정 저장 후 VMware 네트워크 재시작</h3>
</li>
<li>위 과정으로 설정 변경을 저장 한 후 VMware 네트워크를 아래의 명령어를 차례로 입력 하여 재시작한다.<pre><code>sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --stop
sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start</code></pre></li>
</ul>
<p>이제 Rocky Linux의 네트워크가 제대로 연결이 되었는지 확인 하는 절차를 가져보자!</p>
<p>일단 VMware에서 Rocky Linux 서버를 부팅 후 ip를 변경한 고정 IP로 설정 되어있는지 확인해보자</p>
<pre><code>ifconfig</code></pre><p>위 명령어를 입력하면 아래와 같이 ens160에 inet, netmask가 내가 설정한 고정 ip로 변경된것을 확인 할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_su11/post/15d6b046-5c93-4a2f-bc4d-e08fa3e00afd/image.png" alt=""></p>
<p>이제 ping을 찍어 네트워크 연결이 원할하게 잘 되는지 확인해보자!</p>
<pre><code>ping -c 4 8.8.8.8 //DNS 서버로 ping을 네번 찍어 보내기</code></pre><p><img src="https://velog.velcdn.com/images/dev_su11/post/1519f1b6-a8cb-478d-a8a0-74bc2a7e2144/image.png" alt=""></p>
<p>ping도 제대로 찍히는 것을 볼 수 있다.</p>
<p>이제 Linux 환경 네트워크 구성은 완료 하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux의 특징 및 장단점]]></title>
            <link>https://velog.io/@dev_su11/Linux%EC%9D%98-%ED%8A%B9%EC%A7%95-%EB%B0%8F-%EC%9E%A5%EB%8B%A8%EC%A0%90</link>
            <guid>https://velog.io/@dev_su11/Linux%EC%9D%98-%ED%8A%B9%EC%A7%95-%EB%B0%8F-%EC%9E%A5%EB%8B%A8%EC%A0%90</guid>
            <pubDate>Sun, 15 Jun 2025 08:26:57 GMT</pubDate>
            <description><![CDATA[<h2 id="✅-리눅스의-주요-특징-특성">✅ 리눅스의 주요 특징 (특성)</h2>
<br>

<blockquote>
<p>리눅스는 유닉스 계열 운영체제로서 다음과 같은 핵심 특징을 가집니다.</p>
</blockquote>
<br>

<h3 id="1-오픈-소스">1. 오픈 소스</h3>
<ul>
<li>소스코드 공개 -&gt; 누구나 자유롭게 사용, 수정, 배포 가능</li>
<li>GNU GPL(General Public License) 라이선스 기반</li>
<li>전 세계 개발자들의 협업 가능</li>
</ul>
<br>

<h3 id="2-멀티-유저">2. 멀티 유저</h3>
<ul>
<li>하나의 시스템에 여러 사용자 동시 접속 가능</li>
<li>사용자마다 독립적인 환경 제공</li>
</ul>
<br>

<h3 id="3-멀티태스킹">3. 멀티태스킹</h3>
<ul>
<li>여러 작업을 동시에 처리(백그라운드/포그라운드 작업 병행)</li>
<li>프로세스간 자원 충돌 방지</li>
</ul>
<br>

<h3 id="4-이식성">4. 이식성</h3>
<ul>
<li>다양한 하드웨어 아키택처에서 구동 가능</li>
<li>ARM, x86, x64, PowerPC 등 다양한 플랫폼 지원</li>
</ul>
<br>

<h3 id="5-모듈화">5. 모듈화</h3>
<ul>
<li>커널 및 시스템 구성 요소가 모듈 단위로 구성</li>
<li>필요한 기능만 로드/언로드 가능 -&gt; 커스터마이징 용이</li>
</ul>
<br>

<h3 id="6-네트워크-기능-강화">6. 네트워크 기능 강화</h3>
<ul>
<li>강력한 네트워크 기능 내장 (라우킹, 방화벽, 서버 기능 등)</li>
<li>서버 운영체제로서 강력한 성능 발휘</li>
</ul>
<br>

<h3 id="7-보안성security">7. 보안성(Security)</h3>
<ul>
<li>사용자 권한 분리, 접근 제어</li>
<li>SELiux, AppArmor 등의 보안 모듈 제공</li>
<li>커널 보안 패치 빠름</li>
</ul>
<br>

<h3 id="8-다양한-배포판">8. 다양한 배포판</h3>
<ul>
<li>데스크탑용, 서버용, 임베디드용, 해킹/보인영 등 수벡 게의 배포판 존재</li>
<li>사용 목적에 따라 최적 선택 가능</li>
</ul>
<br>

<h2 id="✅-리눅스의-장점">✅ 리눅스의 장점</h2>
<br>

<p>💸 <strong>무료</strong> : 대부분의 배포판은 무료, 라이선스 비용 없음</p>
<p>🔧 <strong>커스터마이징</strong> : 필요한 기능만 선택하여 설치 가능, 불필요한 자원 소모 없음</p>
<p>🔐 <strong>보안성 우수</strong> : 루트 권한 분리, 취약점 패치 빠름, 오픈소스 기반 검증</p>
<p>🌐<strong>네트워크 및 서버 성능 우수</strong> : 웹서버, DB서버, 클라우드 플랫폼에 최적</p>
<p>🔁 <strong>안정성과 지속적인 업데이트</strong> : LTS(Long Term Support) 지원, 롤링 릴리즈도 선택 가능</p>
<p>🌍 <strong>전 세계 커뮤니티와 협업 가능</strong> : 수많은 개발자들이 유지, 문서와 자료가 풍부</p>
<p>🖥️ <strong>경량화 및 저사양에서도 구동 가능</strong> : 오래된 PC나 라즈베리 파이 등에서도 작동 가능</p>
<p>👨‍💻 <strong>개발 친화적 환경</strong> : C, Python, Bash 등 개발 도구 내장, 컨테이너(Docker), 서버 배포에 최적화</p>
<br>

<h2 id="❌-리눅스의-단점">❌ 리눅스의 단점</h2>
<br>

<p>🧑‍💻 <strong>초보자에겐 학습 곡선이 있음</strong>: 명령어 기반 사용 환경, GUI가 Windows보다 직관적이지 않음</p>
<p>🖥️ <strong>전용 소프트웨어 부족</strong> : Adobe Photoshop, MS Office 등 상용 프로그램 미지원 (대안 필요)</p>
<p>⚙️ <strong>하드웨어 호환성 문제</strong> : 일부 프린터, 무선랜카드 등은 드라이버 부족으로 정상 작동 어려움</p>
<p>🕹️ <strong>게임 지원 부족</strong> : Steam 등 일부 플랫폼만 지원, 윈도우 게임과 호환 어려움</p>
<p>🔩 <strong>설정이 복잡할 수 있음</strong> : 설정 파일이 텍스트 기반 → 수동 수정 필요, 실수 시 시스템 오류 가능</p>
<p>📞 <strong>상용 기술 지원 부족</strong> : 기업 기술지원은 RHEL 등 유료 배포판에서만 제공</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux 배포판의 종류]]></title>
            <link>https://velog.io/@dev_su11/Linux-%EB%B0%B0%ED%8F%AC%ED%8C%90%EC%9D%98-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@dev_su11/Linux-%EB%B0%B0%ED%8F%AC%ED%8C%90%EC%9D%98-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Sun, 15 Jun 2025 08:14:44 GMT</pubDate>
            <description><![CDATA[<h2 id="🧩-리눅스-배포판distro이란">🧩 리눅스 배포판(Distro)이란?</h2>
<br>

<blockquote>
<ul>
<li>리눅스 커널 + 패키지 관리 시스템 + 기본 도구들(GNU 유틸리티 등) + 설정 파일 등을 통합하여 만든 운영체제</li>
</ul>
</blockquote>
<ul>
<li>목적이나 사용 환경에 따라 다양하게 존재</li>
</ul>
<br>

<h2 id="🌱-배포판의-계열-구분-가문계보">🌱 배포판의 계열 구분 (가문/계보)</h2>
<br>

<blockquote>
<p>리눅스 배포판은 보통 어떤 배포판ㅇㄹ 기반으로 했느냐에 따라 아래 3대 계열로 나눌 수 있다.</p>
</blockquote>
<br>

<ul>
<li><strong>Debian 계열</strong> : Debian, Ubuntu, Linux Mint 등</li>
<li><strong>Red Hat 계열</strong> : RHEL, CentOS, Fedora, Rocky Linux 등</li>
<li><strong>기타/독립 계열</strong> : Arch Linux, Gentoo, Slackware 등</li>
</ul>
<br>

<h2 id="🏷️-주요-리눅스-배포판-정리">🏷️ 주요 리눅스 배포판 정리</h2>
<br>

<h3 id="1-debian"><strong>1. Debian</strong></h3>
<ul>
<li>최초 출시: 1993년</li>
<li>비영리 커뮤니티 중심 개발</li>
<li>매우 안정적, 장기 지원(LTS) 중심</li>
<li>.deb 패키지 형식 사용, apt 패키지 관리 도구</li>
<li>다른 배포판의 기반이 됨 (Ubuntu 등)</li>
</ul>
<br>

<h3 id="2-ubuntu"><strong>2. Ubuntu</strong></h3>
<ul>
<li>Debian 기반, 사용자 친화적 배포판</li>
<li>Canonical사가 주도 개발</li>
<li>데스크탑, 서버, 클라우드 모두 지원</li>
<li>GUI 설치 쉬움, 한글화 잘 되어 있음</li>
<li>파생판: Kubuntu, Xubuntu, Lubuntu 등 (데스크탑 환경별)</li>
</ul>
<br>

<h3 id="3-linux-mint"><strong>3. Linux Mint</strong></h3>
<ul>
<li>Ubuntu 기반</li>
<li>Windows 사용자에게 친숙한 UI</li>
<li>다양한 멀티미디어 코덱 기본 포함</li>
<li>초보자용으로 추천</li>
</ul>
<br>

<h3 id="4-red-hat-enterprise-linux-rhel"><strong>4. Red Hat Enterprise Linux (RHEL)</strong></h3>
<ul>
<li>기업용 상용 리눅스 (유료)</li>
<li>Red Hat에서 공식 지원</li>
<li>안정성과 보안성 중시, 대규모 서버에 사용</li>
<li>.rpm 패키지, yum, dnf 사용</li>
<li>기업 서버, 공공기관에서 자주 사용됨</li>
</ul>
<h3 id="5-centos-→-rocky-linuxalmalinux로-대체됨"><strong>5. CentOS (→ Rocky Linux/AlmaLinux로 대체됨)</strong></h3>
<ul>
<li>RHEL을 무료로 재구성한 배포판</li>
<li>2021년 이후 CentOS Stream으로 바뀌며 사실상 RHEL의 실험판이 됨</li>
<li>그래서 지금은 아래로 대체됨:</li>
</ul>
<br>

<h3 id="6-rocky-linux--almalinux"><strong>6. Rocky Linux / AlmaLinux</strong></h3>
<ul>
<li>RHEL 1:1 완전 호환 오픈소스 대체 배포판</li>
<li>CentOS의 정신 계승</li>
<li>안정성과 호환성을 유지하면서도 무료</li>
</ul>
<br>

<h3 id="7-fedora"><strong>7. Fedora</strong></h3>
<ul>
<li>Red Hat이 후원하는 최신 기술 테스트용 배포판</li>
<li>최신 커널, 최신 기능 탑재</li>
<li>개발자/테스터에게 적합</li>
<li>RHEL의 실험실 역할</li>
</ul>
<h3 id="8-arch-linux"><strong>8. Arch Linux</strong></h3>
<ul>
<li>철저한 사용자 맞춤형 배포판</li>
<li>커스터마이징 자유도 최고</li>
<li>롤링 릴리즈 (계속 업데이트됨)</li>
<li>AUR (Arch User Repository) 통한 방대한 패키지 사용 가능</li>
<li>설치/설정 난이도 높음 → 고급 사용자용</li>
</ul>
<br>

<h3 id="9-manjaro-linux"><strong>9. Manjaro Linux</strong></h3>
<ul>
<li>Arch Linux 기반의 사용자 친화적인 배포판</li>
<li>GUI 설치 지원, 쉬운 설정</li>
<li>Arch의 장점은 유지하면서 초보자도 접근 가능하게 개선</li>
</ul>
<br>

<h3 id="10-kali-linux"><strong>10. Kali Linux</strong></h3>
<ul>
<li>Debian 기반, 보안/해킹/침투 테스트 특화</li>
<li>와이어샤크, 메타스플로잇 등 해킹 도구 포함</li>
<li>윤리적 해킹, 정보보안학과, 보안 실무자에게 인기</li>
</ul>
<br>

<h3 id="11-slackware"><strong>11. Slackware</strong></h3>
<ul>
<li>1993년 등장, 가장 오래된 배포판 중 하나</li>
<li>최소한의 자동화, 수동 설정 중심</li>
<li>유닉스 철학을 가장 잘 유지</li>
<li>매니아층에 인기가 있음</li>
</ul>
<br>

<h3 id="12-gentoo"><strong>12. Gentoo</strong></h3>
<ul>
<li>소스 코드 기반 배포판</li>
<li>모든 것을 컴파일해서 설치 (성능 최적화)</li>
<li>포트리지(Portage) 시스템 사용</li>
<li>고성능/커스터마이징 중시 → 전문가용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Linux의 역사와 철학]]></title>
            <link>https://velog.io/@dev_su11/Linux%EC%9D%98-%EC%97%AD%EC%82%AC%EC%99%80-%EC%B2%A0%ED%95%99</link>
            <guid>https://velog.io/@dev_su11/Linux%EC%9D%98-%EC%97%AD%EC%82%AC%EC%99%80-%EC%B2%A0%ED%95%99</guid>
            <pubDate>Sun, 15 Jun 2025 05:43:39 GMT</pubDate>
            <description><![CDATA[<h2 id="📜-리눅스의-역사">📜 리눅스의 역사</h2>
<br>

<h3 id="1-유닉스unix의-탄생1969년">1. 유닉스(UNIX)의 탄생(1969년)</h3>
<ul>
<li><strong>개발자</strong> : 켄 톰슨(Ken Thompson), 데니스 리치(Dennix Ritchie) 등</li>
<li><strong>장소</strong> : 미국 AT&amp;T 벨 연구소</li>
<li><strong>의의</strong><ul>
<li>간단하고 이식성 높은 운영체제</li>
<li>모듈화된 구조와 C언어로 작성된 시스템</li>
<li>멀티태스킹, 멀티유저 지원</li>
</ul>
</li>
</ul>
<h3 id="2-gnu-프로젝트의-시작1983년">2. GNU 프로젝트의 시작(1983년)</h3>
<ul>
<li><strong>창시자</strong> : 리처드 스톨만(Richard Stallman)</li>
<li><strong>목표</strong> : 자유로운 운영체제 만들기</li>
<li><strong>중요 개념</strong> : 자유 소프트웨어(FOSS), GNU General Public License(GPL)</li>
<li><strong>성과</strong> : 컴파일러(GCC), 쉘(Bash), 에디터(Emacs) 등 핵심 툴 제공
👉 하지만 커널(HURD)은 완성되지 못함</li>
</ul>
<h3 id="3-리눅스-커널의-개발1991년">3. 리눅스 커널의 개발(1991년)</h3>
<ul>
<li><strong>개발자</strong> : 리누스 토르발스(Linux Torvalds, 핀란드 헬싱키대)</li>
<li><strong>배경</strong> : 당시 교육용 유닉스 계열 OS인 MINIX에 불만을 품고 자신만의 커널 개발 시작</li>
<li><strong>버전</strong> : 1991년 9월 17일, 커널 0.01 버전 공개 (Usenet에 배포)</li>
</ul>
<h3 id="4-gnu--linux--완전한-자유-운영체제">4. GNU + Linux = 완전한 자유 운영체제</h3>
<ul>
<li>리눅스 커널 + GNU 툴셋 결합 -&gt; 우리가 지금 알고 있는 리눅스 시스템 완성</li>
<li>다양한 배포판 등장 (Red Hat, Debian, Ubuntu 등)</li>
</ul>
<br>

<h2 id="🎯-리눅스의-철학">🎯 리눅스의 철학</h2>
<blockquote>
<p>리눅스는 유닉스 철학을 계승하면서도, <strong>개방성과 공동체 개발 문화</strong>를 강조합니다.</p>
</blockquote>
<br>

<h3 id="1-유닉스-철학의-핵심">1. 유닉스 철학의 핵심</h3>
<ul>
<li><strong>단순함</strong> : 하나의 프로그램은 한가지 일을 잘 하도록 만든다.</li>
<li><strong>조합성</strong> : 작은 프로그램들을 조합해 강력한 작업을 수행할 수 있게 한다.</li>
<li><strong>텍스트 기반</strong> : 입력과 출력은 텍스트 형식으로 한다(파이프 연결에 유리)</li>
<li><strong>모듈성</strong> : 시스템은 작고 모듈화 되어야하며, 독립적으로 개발되고 사용될 수 있어야 한다.</li>
</ul>
<h3 id="2-리눅스-철학의-확장">2. 리눅스 철학의 확장</h3>
<ul>
<li><strong>자유(Freedom)</strong> : 누구나 자유롭게 사용, 수정, 배포할 수 있음.</li>
<li><strong>커뮤니티 중심</strong> : 개발은 커뮤니티와 협업을 통해 이뤄짐(Linus + 커뮤니티 개발자들)</li>
<li><strong>투명성</strong> : 소스코드 공개 -&gt; 버그, 보안 문제에 빠르게 대응</li>
<li><strong>사용자 주도</strong> : 사용자가 시스템을 완전히 통제하고 원하는 대로 구성할 수 있음</li>
<li><strong>오픈소스 정신</strong> : 모두를 위한 지식 공유와 기술 발전 추구</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>