<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>tt__zero.log</title>
        <link>https://velog.io/</link>
        <description>소프트웨어학부 3학년 / FE, 정보보안</description>
        <lastBuildDate>Mon, 07 Jul 2025 09:26:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. tt__zero.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/tt__zero" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[C] Ch 02. 상수와 데이터 출력]]></title>
            <link>https://velog.io/@tt__zero/C-Ch-02.-%EC%83%81%EC%88%98%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@tt__zero/C-Ch-02.-%EC%83%81%EC%88%98%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Mon, 07 Jul 2025 09:26:09 GMT</pubDate>
            <description><![CDATA[<h3 id="2-1-c-프로그램-구조와-데이터-출력-방법">2-1. C 프로그램 구조와 데이터 출력 방법</h3>
<p>1) 프로그램과 main 함수 구조</p>
<ul>
<li><p>main 함수 구조 : 머리, 몸통 구조</p>
<ul>
<li>머리 : 함수 원형 (함수의 이름과 필요한 데이터 표시)</li>
<li>몸통의 마지막에는 return 0;을 넣어 프로그램을 종료</li>
<li>함수에서 실행할 일은 몸통의 중괄호 안에 작성     </li>
</ul>
</li>
<li><p>주석문 </p>
<ul>
<li>/ * ~ * / : /*와 */ 사이의 모든 내용을 주석 처리</li>
<li>// : //부터 해당 줄의 끝까지 주석 처리</li>
</ul>
</li>
<li><p>함수 몸통 부분에서 지켜야 하는 규칙</p>
<ul>
<li>세미콜론(;)을 이용해 문장의 끝을 표시</li>
<li>한 줄에 한 문장씩 작성</li>
<li>일정한 간격으로 들여쓰기</li>
</ul>
</li>
</ul>
<p>2) 문자열 출력 : 출력 함수(printf)의 사용법</p>
<pre><code>#include &lt;stdio.h&gt; //1행. stdio.h를 불러온다</code></pre><ul>
<li>stdio.h : standard input output<ul>
<li>C언어에서 기본으로 사용하는 입출력 함수가 포함됨</li>
</ul>
</li>
</ul>
<p>3) 제어 문자 출력(출력 방식에 영향을 주는 것 : 백슬래시)</p>
<ul>
<li>\n(개행, new line) : 다음 줄로 이동</li>
<li>\b(백스페이스, backspace) : 한 칸 왼쪽으로 이동</li>
<li>\r(캐리지 리턴, carriage return) : 맨 앞으로 이동</li>
<li>\a(알럿 경보, alert) : 벨소리</li>
</ul>
<p>4) 정수와 실수 출력</p>
<ul>
<li>정수는 %d, 실수를 %lf</li>
<li>%lf는 기본 소수점 이하 여섯째 자리까지 출력함</li>
</ul>
<pre><code>printf(&quot;변환 문자&quot;, 숫자);
printf(&quot;%d\n&quot;, 10);
printf(&quot;%lf\n&quot;, 3.14);</code></pre><p>/</p>
<h3 id="2-2-상수와-데이터-표현-방법">2-2. 상수와 데이터 표현 방법</h3>
<p>1) 정수 상수 표현법</p>
<ul>
<li>10진법 : 0~9</li>
<li>8진법(앞에 0을 붙임) : 0~7</li>
<li>16진수(앞에 0x를 붙임) : 0<del>9, A</del>F</li>
</ul>
<p>2) 실수 상수 표현법</p>
<ul>
<li>실수는 소수점 형태와 지수 형태로 표현 가능</li>
<li>소수점 형태로 표현할 때 실수는 0~9, +, - 기호와 소수점 사용</li>
<li>정규화 표현법</li>
</ul>
<p>3) 문자와 문자열 상수 표현법</p>
<ul>
<li>문자(%c)는 작은따옴표(&#39;&#39;)</li>
<li>문자열(%s)은 큰따옴표(&quot;&quot;)</li>
</ul>
<p>4) 상수가 컴파일된 후의 비트 형태</p>
<ul>
<li>정수 : 4바이트 </li>
<li>실수 : 8바이트</li>
<li>문자 : 4바이트</li>
<li>아스키코드</li>
</ul>
<p>5) 정수 상수가 컴파일된 후의 비트 형태</p>
<ul>
<li>양수의 변환 -&gt; LL</li>
<li>음수의 변환 : 2의 보수</li>
</ul>
<p>6) 실수 상수가 컴파일 된 후의 비트 형태</p>
<ul>
<li>부호 비트 : 양수는 0, 음수는 1</li>
<li>지수부 : 부호 비트 다음부터 11비트는 지수값 의미</li>
<li>소수부 : 나머지 52비트는 소수값을 의미</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C] Ch 01. 프로그램 만들기]]></title>
            <link>https://velog.io/@tt__zero/C-Ch-01.-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@tt__zero/C-Ch-01.-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 07 Jul 2025 08:56:55 GMT</pubDate>
            <description><![CDATA[<h3 id="1-1-프로그램과-c언어">1-1. 프로그램과 C언어</h3>
<ol>
<li>C언어의 탄생</li>
</ol>
<ul>
<li>유닉스 시스템에 사용하기 위해 만든 B언어를 발전시켜 만든 언어</li>
<li>C언어는 기존 언어들과 달리 하드웨어에 상관없이 사용할 수 있음</li>
</ul>
<ol start="2">
<li>C언어의 장점</li>
</ol>
<ul>
<li>시스템 프로그래밍 가능</li>
<li>이식성을 갖춘 프로그램 만들기 가능</li>
<li>함수를 사용해 개별 프로그래밍 가능</li>
</ul>
<h3 id="1-2-컴파일과-컴파일러-사용법">1-2. 컴파일과 컴파일러 사용법</h3>
<ul>
<li><p>프로그램 만드는 과정 요약 : 소스파일 작성 -&gt; 컴파일 -&gt; 실행파일 생성</p>
</li>
<li><p>소스 파일 : C언어로 작성한 문서</p>
</li>
<li><p>컴파일 : 소스 파일을 기계어로 바꾸는 과정
(컴퓨터는 0과 1로 된 기계어만을 이해하기 때문에 컴파일 과정이 있어야 함)</p>
</li>
<li><p>컴파일 과정 3단계
1) 전처리 : 전처리 지시자에 따라 소스파일 가공하는 과정
2) 컴파일 : 전처리가 끝난 파일을 컴파일하면 개체 파일이 됨
3) 링크 : 개체 파일에 startup code를 결합하는 과정</p>
</li>
</ul>
<blockquote>
<p>기본 숙제
비주얼 스튜디오 설치 및 인증</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/ef66ca73-809d-44d4-987e-ebf320e74a51/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SSU CTF] MISC_VIM]]></title>
            <link>https://velog.io/@tt__zero/SSU-CTF-MISCVIM</link>
            <guid>https://velog.io/@tt__zero/SSU-CTF-MISCVIM</guid>
            <pubDate>Thu, 20 Mar 2025 14:42:06 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-및-서버-생성">문제 및 서버 생성</h3>
<p>vim은 vi와 호환되는 문서 편집기로 1991년 네덜란드의 브람 몰레나르(Bram Moolenaar, 1961–2023)가 만들었다.</p>
<p>nc ssuctf.kr 15555</p>
<h3 id="풀이-과정">풀이 과정</h3>
<p>1) 리눅스 통해 서버 접속
<img src="https://velog.velcdn.com/images/tt__zero/post/3596c964-2667-43ae-a965-cbe216a30696/image.png" alt=""></p>
<p>2) :e . | 디렉토리 목록 확인 후, 각 디렉토리 탐색 -&gt; 직접적인 플래그 발견 x
3) :!grep -rnw / -e &quot;flag&quot; 2&gt;/dev/null</p>
<ul>
<li>시스템 전체 검색을 통해 flag.txt 파일 발견</li>
<li>/root/.viminfo 파일 안 &quot;cat flag.txt&quot; 기록 발견<ul>
<li>전에 cat flag.txt 명령 실행한 흔적?</li>
<li>현재 flag가 root 디렉토리 안에 있음을 확인</li>
</ul>
</li>
</ul>
<p>4) :e /root/flag.txt 실행 -&gt; [New] 표시 -&gt; 해당 파일이 존재하지 않는 상태로, 새로운 파일 생성 필요</p>
<p>5) 파일이 진짜 사라졌는지? -&gt; :!ls -la/root/ -&gt; /root/ 디렉토리에 .flag.txt.swp 파일 존재 확인 </p>
<ul>
<li>원래 flag.txt가 있었으나 삭제 됐거나 편집 중이라는 흔적 발견</li>
</ul>
<p>6) cat 명령어로 내용 확인 | :!cat /.flag.txt.swp
-&gt; 깔끔하지 않은 결과. -&gt; flag.txt.swp 파일이 일반적인 텍스트 파일 x 
-&gt; Vim 스왑 파일으로 추측</p>
<p>7) :!vim -r /.flag.txt.swp으로 강제 복구 시도</p>
<p>8) cat /flag.txt 실행 -&gt; flag 발견</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Beginner- SSH]]></title>
            <link>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Beginner-SSH</link>
            <guid>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Beginner-SSH</guid>
            <pubDate>Tue, 18 Mar 2025 10:36:28 GMT</pubDate>
            <description><![CDATA[<h3 id="ssh">SSH</h3>
<ul>
<li>원격 리눅스 서버에 연결하는 가장 일반적인 방식</li>
<li>원격 서버(컴퓨터)에 연결할 수 있도록 해주는 암호화된 네트워크 프로토콜</li>
<li>암호화를 통해 호스트와 클라이언트가 안전하게 통신할 수 있음</li>
<li>클라이언트가 원격 서버의 터미널에 접속하여 명령어 입력하면, 호스트가 명령 실행 결과를 클라이언트에게 전달</li>
</ul>
<h3 id="ssh-명령어">SSH 명령어</h3>
<pre><code class="language-shell">ssh user@HOST -p PORT -i [개인 키 파일 경로]</code></pre>
<ul>
<li>ssh 접속 시에는 원격 서버에 존재하는 계정으로 접속. user에 접속할 계정(사용자 이름) 작성</li>
<li>HOST에는 접속하려는 원격 서버의 ip 또는 도메인 작성</li>
<li>특정 포트로 접속하고 싶은 경우 -p 옵션 이용</li>
</ul>
<p>[접속할 때 클라이언트가 믿을만한 사용자인지 인증하는 방법]</p>
<p>1) 패스워드 인증</p>
<ul>
<li>ssh user@HOST 명령 실행 시, 패스워드 입력 후 원격 서버 접속 가능</li>
<li>다만, 패스워드를 충분히 긴 길이로 설정하지 않으면 브루트 포스 공격을 통해 패스워드를 유추할 수 있다는 위험 있음</li>
</ul>
<p>2) 원격 서버에 공개 키 지정, 클라이언트가 사용할 개인 키 지정</p>
<ul>
<li>공개 키-개인 키 쌍은 ssh-keygen 명령으로 생성 가능</li>
<li>1번 방법보다 더 안전한 방법</li>
</ul>
<h3 id="ssh-사용-예시">SSH 사용 예시</h3>
<p>1) 패스워드로 원격 서버 접속</p>
<pre><code class="language-shell">Host : host3.dreamhack.games
Port : 11051/tcp -&gt; 31337/tcp</code></pre>
<pre><code class="language-shell">ssh with
id: bguser
pw: bqpw</code></pre>
<p>접속 정보, 사용자, 패스워드가 주어진 예시
터미널을 열고 ssh <a href="mailto:bguser@host3.dreamhack.games">bguser@host3.dreamhack.games</a> -p 11051 명령 수행 후, 패스워드로 bqpw를 입력해 문제 서버 접속</p>
<p>2) 개인 키로 원격 서버 접속</p>
<pre><code class="language-shell">Host: host3.dreamhack.games
Port: 11051/tcp -&gt; 31337/tcp</code></pre>
<pre><code>ssh with id:bguser</code></pre><p>같은 예시에서 패스워드 대신 개인 키 파일이 첨부된 경우
터미널을 열고 ssh <a href="mailto:bguser@host3.dreamhack.games">bguser@host3.dreamhack.games</a> -p 11051 -i[다운 받은 개인 키 파일 경로] 명령 수행 시 문제 서버에 접속</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[워게임] Exercise - SSH]]></title>
            <link>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-Exercise-SSH</link>
            <guid>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-Exercise-SSH</guid>
            <pubDate>Tue, 18 Mar 2025 10:22:34 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-및-서버-생성">문제 및 서버 생성</h3>
<p>SSH 실습을 위한 문제입니다. 문제 서버에 SSH로 접속하세요!</p>
<p>플래그의 형식은 DH{...} 입니다.</p>
<pre><code class="language-shell">ssh with
id: chall
password: dhbgssh</code></pre>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/e7c474b0-2547-455e-b01a-9f8e06143e00/image.png" alt=""></p>
<h3 id="풀이-과정">풀이 과정</h3>
<p>1) 리눅스 환경에서 ssh <a href="mailto:chall@host3.dreamhack.games">chall@host3.dreamhack.games</a> -p21922 입력</p>
<p>2) 비밀번호 입력 문구 확인 후, 패스워드 입력</p>
<p>3) ls로 flag 존재 확인</p>
<p>4) cat으로 flag 정답 찾기</p>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/7c635744-6e3f-4f5f-b650-1763afe5cad0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/805d648b-6cf6-4bcf-9f6e-95d13fd59821/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Beginner - System/Web Hacking, Reverse Engineering, Cryptography]]></title>
            <link>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Begineer-SystemWeb-Hacking-Reverse-Engineering-Cryptography</link>
            <guid>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Begineer-SystemWeb-Hacking-Reverse-Engineering-Cryptography</guid>
            <pubDate>Tue, 18 Mar 2025 06:14:09 GMT</pubDate>
            <description><![CDATA[<h3 id="system-hacking">System Hacking</h3>
<ul>
<li>System Hacking<ul>
<li>컴퓨터 프로그램의 행위를 조작해 공격자가 원하는 행동을 실행하도록 하는 공격 전반</li>
<li>컴퓨터에서 구동되는 모든 프로그램에 대한 해킹에 적용 가능한 말</li>
<li>시스템 해킹의 목표는 통산적으로 공격 대상 프로그램이 구동되는 서버의 임의 유저와 같은 권한을 획득하는 것. <ul>
<li>원격 환경에 있는 공격가 타겟 서버에서 os의 명령어를 실행할 수 있는 공격을 원격코드실행이라고 말함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="reverse-engineering">Reverse Engineering</h3>
<ul>
<li>리버스 엔지니어링(리버싱)<ul>
<li>무언가를 설계하고 제작하는 엔지니어링 과정을 정반대로 수행하는 것</li>
<li>리버싱은 해킹이면서 동시에 분석을 하는 분야</li>
<li>추측, 유추, 복구까지 해볼 수 있음</li>
</ul>
</li>
</ul>
<h3 id="web-hacking">Web Hacking</h3>
<ul>
<li>웹 상에서 본래의 의도와 다른 동작을 일으키거나 데이터를 도용, 변조, 시스템을 손상시키는 등의 악의적인 행위</li>
</ul>
<h3 id="cryptography">Cryptography</h3>
<ul>
<li>암호학은 정보를 보호하거나 안전하게 통신하기 위한 방법론을 다루는 학문</li>
<li>키(key)를 이용해 평문을 암호문으로 변환하거나, 암호문을 평문으로 변환하는 전반적인 과정</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[워게임] baby-linux]]></title>
            <link>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-baby-linux</link>
            <guid>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-baby-linux</guid>
            <pubDate>Mon, 17 Mar 2025 14:04:52 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-및-서버-생성">문제 및 서버 생성</h3>
<p>리눅스 명령어를 실행하는 웹 서비스가 작동하고 있습니다.
해당 웹 서비스의 코드가 첨부파일로 주어집니다.</p>
<p>flag.txt 파일을 찾아 출력하여 플래그를 획득하세요!</p>
<p>플래그 형식은 DH{...} 입니다.</p>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/97399630-b2a4-41e2-a296-ae35cecfa6ca/image.png" alt=""></p>
<h3 id="문제-풀이">문제 풀이</h3>
<p>1) ls 명령어 입력해 결과 확인
<img src="https://velog.velcdn.com/images/tt__zero/post/fff679d4-27f4-4f68-a973-4b91e22e9fe9/image.png" alt=""></p>
<p>2) cat.hint.txt 입력
<img src="https://velog.velcdn.com/images/tt__zero/post/fea4f77d-65e4-456f-850b-c774126828ec/image.png" alt=""></p>
<p>-&gt; 플래그는 dream, hack, hello 파일 아래에 있음을 확인</p>
<p>3) cat./dream/hack/hello/flag.txt 입력 결과
<img src="https://velog.velcdn.com/images/tt__zero/post/cd250d5c-6427-4d4d-8d0e-7bce40b0050c/image.png" alt=""></p>
<p>4) 놓친 부분 확인 위해, app.py 파일 확인
<img src="https://velog.velcdn.com/images/tt__zero/post/02c0b23f-33bd-4913-a0ed-df91d1a7f8bb/image.png" alt="">
-&gt; cmd에 &#39;flag&#39; 존재하는 경우 No!가 출력되도록 필터링 되어 있음을 확인
-&gt; <strong>정규 표현식</strong> 이용해 우회
-&gt; 정규 표현식에서 * : 앞의 문자들이 0 또는 그 이상 반복됨을 의미해 이를 사용해 우회 </p>
<pre><code class="language-shell">cat ./dream/hack/hello/fl*g.txt</code></pre>
<p>5) 재시도, 플래그 찾기 성공
<img src="https://velog.velcdn.com/images/tt__zero/post/047f48f6-0ba8-47e4-8871-98240bbb8d86/image.png" alt=""></p>
<blockquote>
<p>추가 개념</p>
</blockquote>
<ol>
<li>정규 표현식
특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언어</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[워게임] 64se64]]></title>
            <link>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-64se64</link>
            <guid>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-64se64</guid>
            <pubDate>Mon, 17 Mar 2025 13:20:48 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-및-서버-생성">문제 및 서버 생성</h3>
<p>&quot;Welcome! 👋&quot;을 출력하는 html 페이지입니다.</p>
<p>소스 코드를 확인하여 문제를 풀고 플래그를 획득하세요.</p>
<p>플래그 형식은 DH{...} 입니다.</p>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/8cbafc86-f6e5-4d5c-a35f-4155c180e9db/image.png" alt=""></p>
<h3 id="문제-풀이">문제 풀이</h3>
<p>1) 제시된 url을 통해 접속 후, F12를 통해 코드 확인</p>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/e9e30f1f-d120-4b20-baa9-5ec2d54c101e/image.png" alt=""></p>
<p>2) 코드 중 base64로 인코딩 된 문자열 확인</p>
<pre><code class="language-html"> &lt;input type=&quot;hidden&quot; name=&quot;64se64_encoding&quot; value=&quot;IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwphc2M9WzY4LCA3MiwgMTIzLCA5OCwgMTAxLCA0OCwgNTIsIDU0LCA5OCwgNTUsIDUzLCA1MCwgNTAsIDk3LCA5NywgNTAsIDEwMSwgNTAsIDU2LCAxMDIsIDUwLCA1NSwgNTQsIDEwMSwgNDgsIDk5LCA1NywgNDksIDQ4LCA1MywgNTAsIDQ5LCAxMDIsIDUwLCA1MSwgOTcsIDQ4LCA1MywgNTYsIDU1LCA0OCwgNDgsIDUzLCA5NywgNTYsIDUxLCA1NSwgNTUsIDUxLCA1NSwgNDgsIDk3LCA0OSwgNDksIDEwMSwgNTMsIDEwMSwgNTIsIDEwMCwgOTksIDQ5LCA1MywgMTAyLCA5OCwgNTAsIDk3LCA5OCwgMTI1XQphcnI9WzAgZm9yIGkgaW4gcmFuZ2UoNjgpXQpmb3IgaSBpbiByYW5nZSgwLDY4KToKICAgIGFycltpXT1jaHIoYXNjW2ldKQpmbGFnPScnLmpvaW4oYXJyKQpwcmludChmbGFnKQ==&quot;&gt;
  &lt;/form&gt;</code></pre>
<p>3) 해당 인코딩 된 부분 디코딩
<img src="https://velog.velcdn.com/images/tt__zero/post/d92842d6-d25e-4742-afe9-c92475326beb/image.png" alt=""></p>
<p>4) 디코딩 된 부분 실행 -&gt; 플래그 발견
<img src="https://velog.velcdn.com/images/tt__zero/post/efdbc42e-e4c8-415a-802d-1d8483323769/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[워게임] Exercise : Welcome-Beginners]]></title>
            <link>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-Exercise-Welcome-Beginners</link>
            <guid>https://velog.io/@tt__zero/%EC%9B%8C%EA%B2%8C%EC%9E%84-Exercise-Welcome-Beginners</guid>
            <pubDate>Mon, 17 Mar 2025 13:06:06 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-및-서버-생성">문제 및 서버 생성</h3>
<p>Wargame 실습을 위한 문제입니다. &quot;Dreamhack&quot;을 입력하여 플래그를 획득하세요!</p>
<p>플래그의 형식은 DH{...} 입니다.</p>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/9800d88c-323e-4777-bf04-7443eae51169/image.png" alt=""></p>
<h3 id="코드-확인">코드 확인</h3>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/12bab349-7a5b-426e-8131-eaa7d3ebf145/image.png" alt=""></p>
<ul>
<li>사용자에게서 입력받은 값이 &#39;Dreamhack&#39;인 경우 플래그를 출력하는 부분 확인</li>
</ul>
<h3 id="ubuntu에서-nc-명령어를-통해-서버-접속-후-플래그-발견">Ubuntu에서 nc 명령어를 통해 서버 접속 후, 플래그 발견</h3>
<p><img src="https://velog.velcdn.com/images/tt__zero/post/2ae8ff1f-e18e-4158-804b-b42f6787ad0e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Beginner - 리눅스 사용법]]></title>
            <link>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Beginner-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Beginner-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Mon, 17 Mar 2025 12:56:05 GMT</pubDate>
            <description><![CDATA[<h3 id="리눅스-사용법">리눅스 사용법</h3>
<p><strong>1. 셸(Shell)</strong></p>
<ul>
<li>셸은 유저가 리눅스 시스템을 이용할 수 있는 인터페이스</li>
<li>셸은 유저에게 입력 받고, os가 입력을 프로그램으로 처리하면 그 결과를 유저에게 출력함</li>
</ul>
<p><strong>2. 셸 프롬프트(Shell Prompt)</strong></p>
<pre><code class="language-shell">user@user-VirturalBox:~$ // 이게 쉘 프롬프트</code></pre>
<ul>
<li>id 명령어 실행<ul>
<li>id는 현재 유저의 유저 id와 해당 유저가 속해 있는 그룹 id를 보여주는 명령어<pre><code class="language-shell">user@user-VirtualBox:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),134(lxd),135(sambashare)
user@user-VirtualBox:~$</code></pre>
</li>
</ul>
</li>
</ul>
<p><strong>3. 기초 명령어</strong></p>
<ul>
<li><p>sudo apt update</p>
<ul>
<li>apt 명령어로 설치 가능한 소프트웨어 패키지 목록 업데이트</li>
<li>각 패키지 별로 어떤 버전 설치 가능한지도 업데이트</li>
<li>실행 결과<pre><code class="language-shell">user@user-VirtualBox:~$ sudo apt update
[sudo] password for user:
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Hit:2 http://kr.archive.ubuntu.com/ubuntu jammy InRelease
Hit:3 http://kr.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:4 http://kr.archive.ubuntu.com/ubuntu jammy-backports InRelease
Fetched 110 kB in 2s (60.0 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
3 packages can be upgraded. Run &#39;apt list --upgradable&#39; to see them.
user@user-VirtualBox:~$</code></pre>
</li>
</ul>
</li>
<li><p>sudo apt upgrade</p>
<ul>
<li>소프트웨어 패키지 버전 업그레이드</li>
</ul>
</li>
<li><p>id</p>
<ul>
<li>현재 유저의 유저 ID와 해당 유저가 속해있는 그룹 ID 출력</li>
<li>자신이 해당 권한을 가지고 있는지 확인용으로 사용</li>
</ul>
</li>
<li><p>pwd</p>
<ul>
<li>Print Working Directory의 줄임물</li>
<li>현재 작업 중인 디렉토리의 경로 출력<pre><code class="language-shell">user@user-VirtualBox:~$ pwd
/home/user
user@user-VirtualBox:~$</code></pre>
</li>
</ul>
</li>
<li><p>ls</p>
<ul>
<li>List의 줄임말, 디렉토리의 내용 출력하는 명령어</li>
<li>-l 플래그를 추가한 형태인 ls-l을 실행하면 더 자세한 정보 출력</li>
</ul>
</li>
<li><p>cd</p>
<ul>
<li>Change Directory의 줄ㅇ미말로 작업중인 디렉토리 변경하는 명령어<ul>
<li>절대 경로 : 루트 디렉토리 / 를 시작으로 모든 경로 적어서 표현</li>
<li>상대 경로 : 현재 디렉토리를 기준으로 상위 디렉토리 또는 하위 디렉토리로 뻗어 나가는 경로</li>
<li>특정 고유 경로 : ~는 현재 유저의 홈 디렉토리, -는 이전에 위치했던 디렉토리 의미</li>
</ul>
</li>
</ul>
</li>
<li><p>mkdir</p>
<ul>
<li>Make Directory의 줄임말, 디렉토리 생성하는 명령어</li>
</ul>
</li>
<li><p>touch </p>
<ul>
<li>비어있는 새로운 파일 만드는데 사용</li>
</ul>
</li>
<li><p>mv</p>
<ul>
<li>Move의 줄임말, 파일이나 디렉토리 위치 옮길 때 사용</li>
<li>파일이나 디렉토리 이름 변경 시에도 사용 가능</li>
</ul>
</li>
<li><p>rm</p>
<ul>
<li>Remove의 줄임말, 파일이나 디렉토리 삭제 시에 사용</li>
</ul>
</li>
<li><p>cat</p>
<ul>
<li>파일 내용 출력하는 명령어</li>
<li>cat 파일경로 형식으로 사용 가능</li>
</ul>
</li>
<li><p>file</p>
<ul>
<li>파일 유형 출력하는 명령어</li>
<li>file 파일경로 형식으로 사용 가능</li>
</ul>
</li>
<li><p>echo</p>
<ul>
<li>셀에 유저가 입력한 텍스트 출력</li>
</ul>
</li>
<li><p>cp</p>
<ul>
<li>copy의 줄임말, 파일이나 디렉토리 복사하는 명령어</li>
</ul>
</li>
<li><p>grep</p>
<ul>
<li>전체에서 특정 문자열 찾을 때 사용</li>
<li>grep 문자열 파일 형식으로 사용 가능</li>
</ul>
</li>
<li><p>man</p>
<ul>
<li>Manual의 줄임말, 특정 명령어의 매뉴얼 확인 가능</li>
<li>매뉴얼에는 명령어 사용법, 옵션, 예제 등의 정보가 있음</li>
</ul>
</li>
<li><p>curl</p>
<ul>
<li>client URL의 줄임말</li>
<li>서버에 데이터 보내거나 서버로부터 데이터 받는 데이터 전송 명령어</li>
<li>curl [옵션] URL 형식으로 사용 가능</li>
<li>HTTP, HTTPS, FTP 등 다양한 프로토콜 지원</li>
</ul>
</li>
</ul>
<p>/</p>
<p>*<em>4. 와일드 카드 *</em></p>
<ul>
<li>정의 : 리눅스에서 임의의 다른 문자를 나타낼 수 있는 특수 문자</li>
<li>종류<ul>
<li>? : a-z, 0-9 범위 내 임의의 1개 문자로 대체</li>
<li><ul>
<li>: a-z, 0-9 범위 내 임의의 0개 이상 문자로 대체</li>
</ul>
</li>
<li>[] : [문자1-문자2] 혹은 [문자1, 문자2..] 형태로 범위 지정</li>
</ul>
</li>
</ul>
<p>/</p>
<p><strong>5. 리다이렉션</strong></p>
<ul>
<li>정의 : 모니터에 나타내는 표준 출력 혹은 키보드로 입력하는 표준 입력을 다른 곳으로 변경하는 작업</li>
<li>종류<ul>
<li>명령어&gt;파일 : 명령어 표준 출력을 파일로 변경. 파일이 없으면 새로 만들고, 있으면 덮어씀</li>
<li>명령어&gt;&gt;파일 : 명령어 표준 출력을 파일로 변경. 파일이 없으면 새로 만들고, 있으면 이어서 씀</li>
<li>명령어&lt;파일 : 명령어 표준 입력을 파일로 변경, 파일로부터 표준 입력을 받아 명령어 수행</li>
</ul>
</li>
</ul>
<p>/</p>
<p><strong>6. 파이프</strong></p>
<ul>
<li>정의 : 리다이렉션의 한 형태, 명령어 결과 표준 출력을 다른 명령어의 표준 입력으로 보낼 때 사용</li>
</ul>
<p>/
/</p>
<h3 id="디렉토리-구조">디렉토리 구조</h3>
<ul>
<li>루트 디렉토리 / : 리눅스의 최상위 디렉토리, 절대 경로는 /</li>
<li>/bin : 일반 유저가 사용할 수 있는 기본 명령어, 프로그램 담고 있는 디렉토리</li>
<li>/boot : 시스템 부팅에 필요한 파일 담음</li>
<li>/dev : 컴퓨터에 부착된 물리적인 장치들을 디바이스 드라이버를 거쳐 파일 형태로 접근 가능. 그런 장치들을 나타내는 파일들을 담음</li>
<li>/etc : os나 os 위에서 동작하는 서비스의 설정 파일들을 담고 있는 디렉토리</li>
<li>/home : 각 일반 유저의 홈 디렉토리를 담고 있는 디렉토리</li>
<li>/lib : 시스템에 필요한 라이브러리 파일들을 담고 있는 디렉토리</li>
<li>/opt : 소프트웨어 패키지를 담는 디렉토리</li>
<li>/proc : 리눅스 커널 자원에 접근할 수 있는 파일과 프로세스를 나타내는 파일 담음</li>
<li>/root : root 유저의 홈 디렉토리</li>
<li>/sbin : /bin과 마찬가지로 기본적인 유저 명령어나 프로그램을 가짐, /sbin은 root 유저가 사용할 수 있는 명령어나 프로그램 가짐</li>
<li>/tmp : 유저나 프로그램이 임시로 파일 생성해야할 때 사용할 수 있는 디렉토리</li>
<li>/usr : 사용자 바이너리, 문서, 라이브러리, 헤더 파일 등을 담고 있는 디렉토리</li>
<li>/var : 프로그램이나 시스템이 실시간으로 가변적인 파이릉ㄹ 사용하고 저장해야 할 때 활용하는 디렉토리</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Beginner - Introduction]]></title>
            <link>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Introduction</link>
            <guid>https://velog.io/@tt__zero/%EB%93%9C%EB%A6%BC%ED%95%B5-Introduction</guid>
            <pubDate>Sat, 15 Mar 2025 14:47:39 GMT</pubDate>
            <description><![CDATA[<h3 id="lecture-introduciton">Lecture Introduciton</h3>
<p><strong>1. 웹 해킹</strong></p>
<ul>
<li>Web2 환경에서 발생할 수 있는 취약점과 대응 방법에 대해 알아감</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>
<h3 id="wargame-introduction">Wargame Introduction</h3>
<p><strong>1. Wargame</strong></p>
<ul>
<li>워게임은 의도적으로 취약점이 존재하도록 설계된 모의 해킹 환경</li>
<li>하나의 시험 문제라고도 볼 수 있음</li>
<li>제작자가 설계한 취약점을 찾아내고, 이해하고, 해결책을 찾아내는 과정을 거쳐 플래그를 찾아내는 문제</li>
<li>워게임의 카테고리는 일반적으로 포너블(pwnable/system hacking), 웹(web), 리버스 엔지니어링(reversing), 암호학(crypto), 포렌식(forensics), 그리고 특정 카테고리에 포함되지 않는 miscellaneous(misc)등이 있음</li>
<li>이 외에도 네트워크(network), 브라우저(browser), 블록체인(blockchain) 등과 같이 더 세부적인 분야도 존재</li>
</ul>
<p><strong>2. 플래그</strong></p>
<ul>
<li>해킹 방어 대회의 일반적인 형식은 CTF(Capture The Flag)</li>
<li>이는 공격 대상인 시스템에 존재하는 파일을 flag라고 칭하며, 이 파일의 내용이 공격자가 제출해야 하는 답안</li>
<li>어떤 시스템을 성공적으로 해킹했다는 증거 제시 = 일반적으로 해커들은 계산기 실행<ul>
<li>계산기가 거의 모든 os에 기본적으로 설치된 프로그램 중 하나이기 때문</li>
<li>해커가 계산기 실행에 성공했다는 것 = 해커가 기본적으로 어떤 프로그램이든 실행시킬 수 있음</li>
</ul>
</li>
<li>혹은 셸(shell)을 실행시키는 것도 하나의 증명 방법<ul>
<li>셸 실행시키고 커맨드 입력할 수 있다면 그 시스템에서의 사용자와 같은 권한을 가지고 있는 것</li>
</ul>
</li>
<li>CTF에서는 가장 간단한 형태의 제출물이 될 수 있는 ‘어떤 텍스트’를 답으로 쓰기로 결정<ul>
<li>굉장히 간단한 형태로 정답을 제공할 수 있음</li>
<li>워게임, CTF 문제에서는 암묵적으로 플래그를 찾는 것이 최종 목적이 됨</li>
</ul>
</li>
</ul>
<p><strong>3. 라이트업</strong></p>
<ul>
<li>워게임 혹은 CTF 문제에서 플래그를 찾는 과정(문제 풀이 과정)을 정리한 것</li>
<li>문제를 풀지 못했는데 풀이를 봐도 괜찮은가?<ul>
<li>문제 풀 때 순차적으로 풀이자가 하는 체크리스트<ul>
<li>주어진 문제가 어떤 프로그램/서비스인지 이해했다.</li>
<li>취약점(또는 이상한 부분)이 무엇인지 파악했다.</li>
<li>찾은 취약점을 어떻게 공략/공격하면 될지 구상이 되었다.</li>
<li>풀이에 필요한 코드나 페이로드를 작성했다.</li>
</ul>
</li>
<li>이 중 1번은 풀이 없이 수행하는 것을 권장</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] 회고]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Tue, 25 Feb 2025 11:54:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>회고</p>
</blockquote>
<p>드디어 혼공단 자바스크립트로 참여한 6주차가 끝났습니다...</p>
<p>안드로이드를 공부하다 이건 도저히 아니다 싶어 웹으로 전향하고, 처음 공부하는 자바스크립트여서 살짝 겁을 좀 먹었는데 다행히(?) 큰 재미를 붙여 매주 재밌게 참여했습니다.</p>
<p>작년에는 자바로 참여해 완주까지 달렸는데 이번 방학에도 조금 늦었지만 완주까지 할 수 있어 나름 알차다면 알찬 방학을 보낸 것 같습니다.</p>
<p>이번 학기에는 소프트웨어프로젝트라는 전공 과목을 수강하는데 팀플로 진행하는 프로젝트인지라 제 웹 개발 실력이 아직은 맨땅에 헤딩 수준이나 경험을 해보면서 조금 더 나아지지 않을까 하는 기대를 해봅니다.</p>
<p>여름에는 어떤 책으로 참여할지 고민을 좀 하며 이만 회고를 마칩니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] ch.8 예외 처리]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.8-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.8-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Tue, 25 Feb 2025 11:45:01 GMT</pubDate>
            <description><![CDATA[<h3 id="8-1-구문-오류와-예외">8-1. 구문 오류와 예외</h3>
<ul>
<li>구문 오류 : 코드가 실행조차 되지 않는 오류</li>
<li>예외 : 코드 실행 중간에 발생하는 오류</li>
<li>예외 처리 : 오류들을 처리하는 것</li>
</ul>
<p><strong>1. 오류의 종류</strong></p>
<ul>
<li>프로그램 실행 전에 발생하는 오류 = 구문 오류</li>
<li>프로그램 실행 중에 발생하는 오류 = 예외, 런타임 오류</li>
</ul>
<p><strong>2. 기본 예외 처리</strong></p>
<ul>
<li>조건문을 사용해 예외가 발생하지 않도록 만드는 것</li>
</ul>
<p><strong>3. 고급 예외 처리</strong></p>
<ul>
<li>예외를 조금 더 쉽게 잡을 수 있는 기능</li>
<li>try catch finally 구문<pre><code class="language-html">try {
  // 예외가 발생할 가능성이 있는 코드
} catch (exception)
  // 예외가 발생했을 때 실행할 코드
} finally {
  // 무조건 실행할 코드</code></pre>
</li>
</ul>
<h3 id="8-2-예외-처리-고급">8-2. 예외 처리 고급</h3>
<ul>
<li>예외 객체 : 예외가 발생하면 예외와 발생된 정보를 확인할 수 있게 해주는 것</li>
<li>예외를 강제로 발생시킬 때 throw 키워드 사용</li>
</ul>
<p><strong>1. 예외 객체</strong></p>
<ul>
<li>try catch 구문 사용 시, catch 괄호 안에 입력하는 식별자가 예외 객체</li>
<li>주로 e나 exception 식별자 사용</li>
</ul>
<p><strong>2. 예외 강제 발생</strong></p>
<ul>
<li>throw 키워드 사용<pre><code class="language-html">throw 문자열 // 단순하게 예외 발생
</code></pre>
</li>
</ul>
<p>throw new Error(문자열) // 조금 더 자세하게 예외 발생
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] ch.7 문서 객체 모델]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.7-%EB%AC%B8%EC%84%9C-%EA%B0%9D%EC%B2%B4-%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.7-%EB%AC%B8%EC%84%9C-%EA%B0%9D%EC%B2%B4-%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Tue, 25 Feb 2025 11:35:58 GMT</pubDate>
            <description><![CDATA[<h3 id="7-1-문서-객체-조작하기">7-1. 문서 객체 조작하기</h3>
<ul>
<li>요소 : html, head, body, title, hl, div, span 등</li>
<li>문서 객체 : 자바스크립트에서는 요소를 문서 객체라고 함</li>
<li>문서 객체 모델 : 문서 객체를 조합해 만든 전체적인 형태</li>
</ul>
<p><strong>1. DOMContentLoaded 이벤트</strong></p>
<p>해당 이벤트는 웹 브라우저가 문서 객체를 모두 읽고 나서 실행하는 이벤트</p>
<p><strong>2. 문서 객체 가져오기</strong></p>
<ul>
<li>document.body 코드 사용 시 문서의 body 요소를 읽을 수 있음<pre><code class="language-html">document.head
document.body
document.title</code></pre>
</li>
</ul>
<pre><code class="language-html">document.querySelector(선택자)
document.querySelectorAll(선택자)</code></pre>
<ul>
<li>querySelector() 메소드 : 요소 하나만 추출</li>
<li>querySelectorAll() 메소드 : 문서 객체 여러 개 추출</li>
</ul>
<p><strong>3. 글자 조작하기</strong></p>
<ul>
<li>문서 객체.textContent : 입력된 문자열을 그대로 넣음</li>
<li>문서 객체.innerHTML : 입력된 문자열을 html 형식으로 넣음</li>
</ul>
<p><strong>4. 속성 조작하기</strong></p>
<ul>
<li>문서 객체.setAttribute(속성 이름, 값) : 특성 속성에 값 지정</li>
<li>문서 객체.getAttritubte(속성 이름) : 특정 속성 추출</li>
</ul>
<p><strong>5. 스타일 조작하기</strong></p>
<ul>
<li>문서 객체의 스타일 조작할 때 style 속성 사용</li>
<li>style 속성은 객체</li>
<li>두 단어 이상의 속성은 캐멀 케이스로 표현<pre><code class="language-html">h1.style.backgroundColor // 해당 방법을 많이 사용
h1.style[&#39;backgroundColor&#39;]
h1.style[&#39;background-color&#39;]</code></pre>
</li>
</ul>
<p><strong>6. 문서 객체 생성하기</strong></p>
<ul>
<li><p>document.createElement() 메소드로 문서 객체 생성</p>
<pre><code class="language-html">document.createElement(문서 객체 이름)</code></pre>
</li>
<li><p>문서 객체에는 appendChild()메소드가 있어, 이를 활용하면 어떤 부모 객체 아래 자식 객체 추가 가능</p>
<pre><code class="language-html">부모 객체.appendChild(자식 객체)</code></pre>
</li>
</ul>
<p><strong>7. 문서 객체 이동하기</strong></p>
<ul>
<li><p>appendChild() 메소드 사용해 문서 객체 이동</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;외부 스타일 시트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt;
  document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
    const divA = document.querySelector(&#39;#first&#39;)
    const divB = document.querySelector(&#39;#second&#39;)
    const h1 = document.createElement(&#39;h1&#39;)
    h1.textContent = &#39;이동하는 h1 태그&#39;

    const toFirst = () =&gt; {
      divA.appendChild(h1)
      setTimeout(toSecond, 1000)
    }

    const toSecond = () =&gt; {
      divB.appendChild(h1)
      setTimeout(toFirst, 10000)
    }

    toFirst()
  })
&lt;/script&gt;
&lt;body&gt;
  &lt;div id=&quot;first&quot;&gt;
    &lt;h1&gt;첫 번째 div 태그 내부&lt;/h1&gt;
  &lt;/div&gt;
  &lt;hr&gt;
  &lt;div id = &quot;second&quot;&gt;
    &lt;h1&gt;두 번째 h1 태그 내부&lt;/h1&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
</ul>
<p><strong>8. 문서 객체 제거하기</strong></p>
<ul>
<li>removeChild() 메소드 사용<pre><code class="language-html">부모 객체.removeChild(자식 객체)</code></pre>
</li>
</ul>
<pre><code class="language-html">문서 객체.parentNode.removeChild(문서 객체)</code></pre>
<p><strong>9. 이벤트 설정하기</strong></p>
<ul>
<li><p>모든 문서 객체는 생성, 클릭, 마우스 위에 올릴 때 이벤트 발생</p>
</li>
<li><p>이벤트 발생할 때 실행할 함수는 addEventListener() 메소드 사용</p>
<pre><code class="language-html">문서 객체.addEventListener(이벤트 이름, 콜백 함수)</code></pre>
</li>
<li><p>이벤트 발생할 때 실행할 함수를 이벤트 리스너, 이벤트 핸들러라 명칭</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;외부 스타일 시트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt;
  document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
    let counter = 0
    const h1 = document.querySelector(&#39;h1&#39;)

    h1.addEventListener(&#39;click&#39;, (event) =&gt; {
      counter ++
      h1.textContent = `클릭 횟수: ${counter}`
    })
  })
&lt;/script&gt;
&lt;style&gt;
  h1 {
    user-select : none;
  }
&lt;/style&gt;
&lt;body&gt;
  &lt;h1&gt; 클릭 횟수 : 0 &lt;/h1&gt;
&lt;/body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
<li><p>이벤트 제거 시에는 removeEventListener() 메소드 사용</p>
<pre><code class="language-html">문서 객체.removeEventListener(이벤트 이름, 이벤트 리스너)</code></pre>
</li>
</ul>
<h3 id="7-2-이벤트-활용">7-2. 이벤트 활용</h3>
<p><strong>1. 이벤트 모델</strong></p>
<ul>
<li>이벤트 모델 : 이벤트를 연결하는 방법</li>
<li>표준 이벤트 모델 = addEventListenr() 메소드 사용하는 것</li>
<li>고전 이벤트 모델 : onOO으로 시작하는 속성에 함수 할당</li>
<li>인라인 이벤트 모델 : onOO으로 시작하는 속성을 html 요소에 직접 넣어 이벤트 연결하는 것</li>
</ul>
<p><strong>2. 키보드 이벤트</strong></p>
<ul>
<li>keydown : 키 눌릴 때 실행</li>
<li>keypress : 키 입력되었을 때 실행</li>
<li>keyup : 키보드에서 키 떨어질 때 실행</li>
</ul>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;외부 스타일 시트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
    document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
      const textarea = document.querySelector(&#39;textarea&#39;)
      const h1 = document.querySelector(&#39;h1&#39;)

      textarea.addEventListener(&#39;keyup&#39;, (event) =&gt; {
        const length = textarea.value.length
        h1.textContent = `글자 수 : ${length}`
      })
    })
  &lt;/script&gt;
  &lt;body&gt;
    &lt;h1&gt;&lt;/h1&gt;
    &lt;textarea&gt;&lt;/textarea&gt;
  &lt;/body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li>키보드 키 코드 사용하기<ul>
<li>code : 입력한 키</li>
<li>keyCode : 입력한 키를 나타내는 숫자</li>
<li>altKey : Alt 키를 눌렀는지</li>
<li>ctrlKey : Ctrl 키를 눌렀는지</li>
<li>shiftKey : Shift 키를 눌렀는지</li>
</ul>
</li>
</ul>
<p><strong>3. 글자 입력 양식 이벤트</strong></p>
<ul>
<li><p>입력 양식 : 사용자로부터 어떠한 입력을 받을 때 사용하는 요소</p>
<ul>
<li><p>input, textarea, button, select 태그 등</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;외부 스타일 시트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt;
document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
  const input = document.querySelector(&#39;input&#39;)
  const button = document.querySelector(&#39;button&#39;)
  const p = document.querySelector(&#39;p&#39;)

  button.addEventListener(&#39;click&#39;, () =&gt; {
    const inch = Number(input.value)

    if (isNaN(inch)) {
      p.textContent = &#39;숫자를 입력해주세요&#39;
      return // 조기 리턴
    }

    const cm = inch * 2.54
    p.textContent = `${cm} cm`
  })
})
&lt;/script&gt;
&lt;body&gt;
&lt;input type = &quot;text&quot;&gt; inch&lt;br&gt;
&lt;button&gt;계산&lt;/button&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
</ul>
</li>
<li><p>드롭다운 목록 활용하기 : select 태그로 구현</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;외부 스타일 시트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt;
  document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
    const select = document.querySelector(&#39;select&#39;)
    const p = document.querySelector(&#39;p&#39;)

    select.addEventListener(&#39;chancge&#39;, (event) =&gt; {
      const options = event.currentTarget.options
      const index = event.currentTarget.options.selectedIndex

      p.textContent = `선택 : ${options[index].textContent}`
    })
  })
&lt;/script&gt;
&lt;body&gt;
  &lt;select&gt;
    &lt;option&gt;떡볶이&lt;/option&gt;
    &lt;option&gt;순대&lt;/option&gt;
    &lt;option&gt;오뎅&lt;/option&gt;
    &lt;option&gt;튀김&lt;/option&gt;
  &lt;/select&gt;
  &lt;p&gt;선택 : 떡볶이&lt;/p&gt;
&lt;/body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
<li><p>체크 박스 활용하기 : checked 속성 사용</p>
</li>
<li><p>라디오 버튼 활용하기 : checked 속성 사용</p>
</li>
</ul>
<p><strong>4. 기본 이벤트 막기</strong></p>
<ul>
<li>컨텍스트 메뉴 : 이미지에서 우클릭 했을 때 나타나는 메뉴</li>
<li>기본 이벤트 : 어떤 이벤트 발생 시 웹 브라우저가 기본적으로 처리해주는 것</li>
<li>기본 이벤트 제거는 event 객체의 preventDefault() 메소드 사용<ul>
<li>불펌 막을 때 주로 사용</li>
</ul>
</li>
</ul>
<blockquote>
<p>기본 과제
p.315 출력되는 고양이 이미지 캡쳐</p>
</blockquote>
<p>[코드]</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;기본 과제&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
    document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
      const rects = document.querySelectorAll(&#39;.rect&#39;); // querySelectorAll로 수정

      rects.forEach((rect, index) =&gt; {
        const width = (index + 1) * 100;
        const src = `https://placekitten.com/${width}/250`; // URL 수정 (http → https)
        rect.setAttribute(&#39;src&#39;, src);
      });
    });
  &lt;/script&gt;

  &lt;img class=&quot;rect&quot;&gt;
  &lt;img class=&quot;rect&quot;&gt;
  &lt;img class=&quot;rect&quot;&gt;
  &lt;img class=&quot;rect&quot;&gt;
  &lt;img class=&quot;rect&quot;&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>[결과]
<img src="https://velog.velcdn.com/images/tt__zero/post/9cb2c7a6-60d6-451e-87c4-e2778328840b/image.png" alt=""></p>
<blockquote>
<p>추가 과제
p.352의 할 일 목록 만들기</p>
</blockquote>
<p>[코드]</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;할 일 목록&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;할 일 목록&lt;/h1&gt;
  &lt;input id=&quot;todo&quot;&gt;
  &lt;button id=&quot;add-button&quot;&gt;추가하기&lt;/button&gt;
  &lt;div id=&quot;todo-list&quot;&gt;&lt;/div&gt;

  &lt;script&gt;
    document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
      const input = document.querySelector(&#39;#todo&#39;);
      const todoList = document.querySelector(&#39;#todo-list&#39;); // 수정됨
      const addButton = document.querySelector(&#39;#add-button&#39;);

      let keyCount = 0;

      const addTodo = () =&gt; {
        if (input.value.trim() === &#39;&#39;) {
          alert(&#39;할 일을 입력해주세요.&#39;);
          return;
        }

        const item = document.createElement(&#39;div&#39;);
        const checkbox = document.createElement(&#39;input&#39;);
        const text = document.createElement(&#39;span&#39;);
        const button = document.createElement(&#39;button&#39;);

        const key = keyCount;
        keyCount += 1;

        item.setAttribute(&#39;data-key&#39;, key);
        item.appendChild(checkbox);
        item.appendChild(text);
        item.appendChild(button);
        todoList.appendChild(item);

        checkbox.type = &#39;checkbox&#39;;
        checkbox.addEventListener(&#39;change&#39;, (event) =&gt; {
          item.style.textDecoration = event.target.checked ? &#39;line-through&#39; : &#39;&#39;;
        });

        text.textContent = input.value;

        button.textContent = &#39;제거하기&#39;;
        button.addEventListener(&#39;click&#39;, () =&gt; { // 수정됨
          removeTodo(key);
        });

        input.value = &#39;&#39;;
      };

      const removeTodo = (key) =&gt; { // 수정됨
        const item = document.querySelector(`[data-key=&quot;${key}&quot;]`); // 수정됨
        if (item) {
          todoList.removeChild(item); // 수정됨
        }
      };

      addButton.addEventListener(&#39;click&#39;, addTodo);
      input.addEventListener(&#39;keyup&#39;, (event) =&gt; {
        if (event.key === &#39;Enter&#39;) { // 최신 문법으로 수정됨
          addTodo();
        }
      });
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>[결과]
<img src="https://velog.velcdn.com/images/tt__zero/post/850ffa73-b3f6-44e2-9b33-d535570ebd00/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] ch.6 객체]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.6</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.6</guid>
            <pubDate>Fri, 14 Feb 2025 15:16:53 GMT</pubDate>
            <description><![CDATA[<h3 id="6-1-객체의-기본">6-1. 객체의 기본</h3>
<p><strong>1. 객체</strong></p>
<pre><code class="language-html">typeof([])
&gt;&gt; &quot;object&quot; // object가 객체</code></pre>
<ul>
<li>배열은 요소 접근 시 인덱스 사용</li>
<li>객체는 요소 접근 시 키 사용<ul>
<li>객체는 중괄호로 생성, 자료를 쉼표로 연결해 입력</li>
<li>객체 뒤에 대괄호 사용하고 키 입력하면 객체 요소에 접근 가능</li>
<li>대괄호 방법 외에 온점도 사용 가능<pre><code class="language-html">&lt;script&gt;
const product = {
  제품명 : &#39;7D 건조 망고&#39;, // 키:값 형태
  유형 : &#39;당절임&#39;,
  성분 : &#39;망고, 설탕, 메타중아황산나트륨, 치자황색소&#39;,
  원산지 : &#39;필리핀&#39;
}
&lt;/script&gt;</code></pre>
<pre><code class="language-html">product[&#39;제품명&#39;]
product[&#39;유형&#39;]
product[&#39;성분&#39;]
product[&#39;원산지&#39;]</code></pre>
</li>
</ul>
</li>
</ul>
<p><strong>2. 속성과 메소드</strong></p>
<ul>
<li>요소 : 배열 내부에 있는 값</li>
<li>속성 : 객체 내부에 있는 값</li>
<li>메소드 : 객체 속성 중 함수 자료형인 속성</li>
</ul>
<ul>
<li><p>메소드 내에서 자기 자신이 가진 속성임을 표현할 때 this 키워드 사용</p>
<pre><code class="language-html">&lt;script&gt;
const pet = {
name:&#39;구름&#39;,
eat: function(food){
alert(this.name+ &#39;은/는&#39; + food + &#39;을/를 먹습니다.&#39;)
}
}

pet.eat(&#39;밥&#39;)
&lt;/script&gt;</code></pre>
</li>
</ul>
<p><strong>3. 동적으로 객체 속성 추가/제거</strong></p>
<ul>
<li>객체 처음 생성 후, 속성을 제거하거나 추가하는 것 = 동적으로 속성을 추가한다, 동적으로 속성을 제거한다</li>
</ul>
<ul>
<li><p>동적으로 객체 속성 추가하기</p>
<pre><code class="language-html">&lt;script&gt;
const student = {}
student.이름 = &#39;윤인성&#39;
student.취미 = 악기&#39;
student.장래희망 = &#39;생명공학자&#39;

console.log(JSON.stringify(student,null,2))
&lt;/script&gt;</code></pre>
</li>
<li><p>동적으로 객체 속성 제거하기 : delete 키워드 사용</p>
<pre><code class="language-html">delete 객체.속성</code></pre>
</li>
</ul>
<pre><code class="language-html">&lt;script&gt;
  const student = {}
  student.이름 = &#39;윤인성&#39;
  student.취미 = 악기&#39;
  student.장래희망 = &#39;생명공학자&#39;

  delete student.장래희망

  console.log(JSON.stringify(student, null, 2))
&lt;/script&gt;</code></pre>
<p><strong>4. 메소드 간단 선언 구문</strong></p>
<pre><code class="language-html">&lt;script&gt;
  const pet = {
  name: &#39;구름&#39;,
  eat (food) {
  alert(this.name + &#39;은/는&#39; + food +&#39;을/를 먹습니다.&#39;)
  }
  }

  pet.eat(&#39;밥&#39;)
&lt;/script&gt;</code></pre>
<h3 id="6-2객체의-속성과-메소드-사용하기">6-2.객체의 속성과 메소드 사용하기</h3>
<ul>
<li>자료형 : 기본 자료형(숫자, 문자열, 불), 객체 자료형(함수, 배열 등)</li>
</ul>
<p><strong>1. 객체 자료형</strong></p>
<ul>
<li>속성과 메소드를 가질 수 있는 모든 것은 객체</li>
</ul>
<p><strong>2. 기본 자료형</strong></p>
<ul>
<li>실체가 있는 것 중 객체가 아닌 것</li>
</ul>
<p><strong>3. 기본 자료형을 객체로 선언하기</strong></p>
<pre><code class="language-html">const 객체 = new 객체 자료형 이름()</code></pre>
<p><strong>4. 객체 자료형의 일시적 승급</strong></p>
<ul>
<li>자바스크립트는 사용의 편리성을 위해 기본 자료형의 속성과 메소드 호출할 때 일시적으로 기본 자료형을 객체로 승급시킴</li>
<li>단, 승급은 일시적으로 발생</li>
</ul>
<p><strong>5. 프로토타입으로 메소드 추가하기</strong></p>
<ul>
<li>prototype 객체에 속성과 메소드 추가하면 모든 객체에서 해당 속성과 메소드 사용 가능</li>
</ul>
<pre><code class="language-html">객체 자료형 이름.prototype.메소드 이름 = function() {

}</code></pre>
<pre><code class="language-html">&lt;script&gt;
  Number.prototype.power=function(n=2) {
  return this.valueOf() **n
  }
  const a = 12
  console.log(&#39;a.power():&#39;, a.power())
  console.log(&#39;a.power(3):&#39;, a.power(3))
  console.log(&#39;a.power(4):&#39;, a.power(4))
&lt;/script&gt;</code></pre>
<p><strong>6. Number 객체</strong></p>
<ul>
<li>숫자 n번째 자릿수까지 출력하기 :toFixed()</li>
<li>NaN과 Infinity 확인 : isNaN(), isFinite()</li>
</ul>
<p><strong>7. String 객체</strong></p>
<ul>
<li>문자열 양쪽 끝의 공백 없애기 : trim()</li>
<li>문자열을 특정 기호로 자르기 : split()</li>
</ul>
<p><strong>8.JSON 객체</strong></p>
<ul>
<li>자바스크립트의 객체처럼 자료를 표현하는 방식</li>
<li>값 표현 시 문자열, 숫자, 불 자료형만 사용 가능(함수 등 사용 불가)</li>
<li>문자열은 반드시 큰따옴표로 만들어야 함</li>
<li>키에도 반드시 따옴표 붙여야 함</li>
<li>자바스크립트 객체를 JSON 문자열로 변환할 때 JSON.stringify() 메소드 사용</li>
</ul>
<p><strong>9. Math 객체</strong></p>
<ul>
<li>수학과 같은 기본 연산 할 때 사용</li>
<li>랜덤 숫자 생성 시 Math.random() 메소드 사용(0 이상 1 미만의 범위)</li>
</ul>
<h3 id="6-3-객체와-배열-고급">6-3. 객체와 배열 고급</h3>
<p><strong>1. 속성 존재 여부 확인</strong></p>
<ul>
<li><p>객체에 없는 속성 접근 시, undefined 자료형 나옴</p>
<pre><code class="language-html">&lt;script&gt;
const object= {
name: &#39;혼자 공부하는 파이썬&#39;,
price: 18000,
publisher : &#39;한빛미디어&#39;
}

object.name = object.name !== undefined ? object.name : &#39;제목 미정&#39;
object.author = object.author !== undefined ? object.author : &#39;저자 미상&#39;

console.log(JSON.stringify(object,null,2))
&lt;/script&gt;</code></pre>
</li>
</ul>
<p><strong>2. 배열 기반의 다중 할당</strong></p>
<ul>
<li>한 번에 여러 개의 변수에 값을 할당하는 다중 할당 기능 추가됨</li>
</ul>
<pre><code class="language-html">[식별자, 식별자, 식별자, ...] = 배열</code></pre>
<p><strong>3. 객체 기반의 다중 할당</strong></p>
<ul>
<li>객체 내부에 있는 속성 꺼내 변수로 할당<pre><code class="language-html">{속성 이름, 속성 이름} = 객체
{식별자 = 속성 이름, 식별자 = 속성 이름} = 객체</code></pre>
</li>
</ul>
<p><strong>4. 배열 전개 연산자</strong></p>
<ul>
<li>얕은 복사(참조 복사) : 배열 복사했을 때 다른 이름 붙을 뿐인 것</li>
<li>깊은 복사 : 복사한 두 배열이 완전히 독립적으로 작동</li>
</ul>
<p><strong>5. 객체 전개 연산자</strong></p>
<pre><code class="language-html">{...객체}

{...객체, 자료, 자료, 자료} // 전개 연산자 사용한 객체 요소 추가</code></pre>
<blockquote>
<p>기본 과제</p>
</blockquote>
<p>[문제]
객체, 속성, 메소드가 무엇인지 설명하기</p>
<p>[답]</p>
<ul>
<li>객체 : 실제로 존재하는 것<pre><code class="language-html">typeof([])
&gt;&gt; &quot;object&quot; // object가 객체</code></pre>
</li>
<li>속성 : 객체 내부에 있는 값, 이름과 값으로 구성</li>
<li>메소드 : 속성 중에 함수 자료형인 것</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자율학습] 12일차 ]]></title>
            <link>https://velog.io/@tt__zero/%EC%9E%90%EC%9C%A8%ED%95%99%EC%8A%B5-12%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@tt__zero/%EC%9E%90%EC%9C%A8%ED%95%99%EC%8A%B5-12%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sat, 01 Feb 2025 15:10:20 GMT</pubDate>
            <description><![CDATA[<h3 id="94-조건문-다루기">9.4 조건문 다루기</h3>
<p><strong>9.4.1 if, else, else if문</strong></p>
<ol>
<li><p>if문</p>
<pre><code class="language-html">if(조건식){
// 조건식이 참이면 블록문 실행
}</code></pre>
</li>
<li><p>else문</p>
<pre><code class="language-html">if(조건식) {
//조건식이 참이면 블록문 실행
}else{
//조건이 거짓이면 블록문 실행
}</code></pre>
</li>
<li><p>else if문</p>
<pre><code class="language-html">if(조건식1) {
//조건식1이 참이면 블록문 실행
} else if(조건식2){
//조건식2가 참이면 블록문 실행
}else{
//조건식이 모두 거짓이면 블록문 실행
}</code></pre>
</li>
<li><p>중첩하기</p>
</li>
</ol>
<ul>
<li>분기 처리 : 어떤 조건식 만족할 때 어떤 블록문 실행할지 결정하는 것</li>
</ul>
<p><strong>9.4.2 switch문</strong></p>
<pre><code class="language-html">switch(key){
 case value1:
  // key가 value1일 때 실행할 블록문
  break;
 case value2:
  // key가 value2일 때 실행할 블록문
  break;
 default:
  // 아무것도 일치하지 않을 때 실행할 블록문
  break;
}</code></pre>
<h3 id="95-반복문-다루기">9.5 반복문 다루기</h3>
<p><strong>9.5.1 while문</strong></p>
<pre><code class="language-html">while(조건식){
  // 조건식이 참이면 실행
}</code></pre>
<p><strong>9.5.2 무한 반복문</strong></p>
<ul>
<li>반복문의 조건이 계속 참으로 평가되어 반복문이 끝나지 않고 무한히 실행됨</li>
</ul>
<p><strong>9.5.3 do while문</strong></p>
<pre><code class="language-html">do{
  // 블록문
}while(조건식);</code></pre>
<p><strong>9.5.4 for문</strong></p>
<pre><code class="language-html">for(초깃값; 조건식; 증감식){
  //블록문
}</code></pre>
<p><strong>9.5.5 for문과 배열</strong></p>
<ul>
<li>for문은 횟수를 지정하는 반복문이라는 특징으로 배열과 같은 자료형을 반복 횟수 용도로 사용할 수 있음</li>
</ul>
<p><strong>9.5.6 for...in</strong></p>
<pre><code class="language-html">for(가변수 in 배열/객체 리터럴){
  //블록문
}</code></pre>
<p><strong>9.5.7 break문</strong></p>
<ul>
<li>어떤 반복문이라도 break문 만나면 반복문 종료됨</li>
</ul>
<p><strong>9.5.8 continue문</strong></p>
<ul>
<li>continue문은 반복문을 건너뛰고 실행하라는 명령</li>
<li>반복문의 블록문에서 continue 문을 만나면 해당 반복 실행만 건너뛰게 됨</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] ch.5 함수]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.5-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.5-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sat, 01 Feb 2025 14:57:38 GMT</pubDate>
            <description><![CDATA[<h3 id="5-1-함수의-기본-형태">5-1. 함수의 기본 형태</h3>
<ul>
<li>함수 호출 : 함수를 사용하는 것</li>
<li>배개 변수 : 괄호 내부에 자료를 넣는 것</li>
<li>리턴값 : 함수 호출해서 최종적으로 나오는 결과</li>
</ul>
<p><strong>1. 익명 함수</strong></p>
<ul>
<li><p>함수 : 코드의 집합을 나타내는 자료형</p>
<pre><code class="language-html">function() {}</code></pre>
</li>
<li><p>익명 함수 : 이름이 붙어있지 않은 함수</p>
</li>
</ul>
<p><strong>2. 선언적 함수</strong></p>
<pre><code class="language-html">function 함수() {}</code></pre>
<pre><code class="language-html">let 함수 = function() {}; // 이 코드와 같은 기능 수행</code></pre>
<p><strong>3. 매개변수와 리턴값</strong></p>
<ul>
<li>매개변수 : 함수 호출할 때 괄호 안에 적는 것<ul>
<li>prmopt() 함수 사용 시 매개변수로 message 넣으면 최종 결과 문자열로 나옴</li>
</ul>
</li>
<li>리턴값 : 함수의 최종 결과</li>
</ul>
<pre><code class="language-html">function 함수(매개변수, 매개변수, 매개변수) {
  문장
  문장
  return 리턴값
}</code></pre>
<ul>
<li><p>숫자를 계산해 출력할 때 기본 형태</p>
<pre><code class="language-html">function 함수(매개변수) {
let output = 초깃값
처리한다
return output
}</code></pre>
</li>
<li><p>가변 매개변수 함수 : 호출 시 매개변수 개수가 고정적이지 않은 함수</p>
</li>
<li><p>나머지 매개변수 </p>
<pre><code class="language-html">function 함수 이름(...나머지 매개변수) {}</code></pre>
</li>
<li><p><em>4. 기본 매개변수*</em></p>
</li>
<li><p>기본 매개변수 : 매개변수에 기본값 지정하는 형태</p>
<pre><code class="language-html">함수 이름(매개변수, 매개변수=기본값, 매개변수=기본값)</code></pre>
</li>
</ul>
<p>/
/</p>
<h3 id="5-2-함수-고급">5-2. 함수 고급</h3>
<p><strong>1. 콜백 함수</strong></p>
<ul>
<li>콜백 함수 : 매개변수로 전달하는 함수<ul>
<li>콜백 함수를 활용하는 함수 : forEach()<pre><code class="language-html">function (value, index, array) {}</code></pre>
</li>
</ul>
</li>
<li>콜백 함수를 활용하는 함수 : map()
콜백 함수에서 리턴한 값들을 기반으로 새로운 배열 만듦</li>
<li>콜백 함수를 활용하는 함수 : filter()
콜백 함수에서 리턴하는 값이 true인 것만 모아 새로운 배열 만듦</li>
</ul>
<p><strong>2. 화살표 함수</strong></p>
<ul>
<li>단순한 형태의 콜백 함수 쉽게 입력하고자 하는 목적</li>
<li>function 키워드 대신, =&gt;(화살표) 사용<pre><code class="language-html">(매개변수) =&gt; {}
</code></pre>
</li>
</ul>
<p>(매개변수) =&gt; 리턴값</p>
<pre><code>
- 메소드 체이닝 : 어떤 메소드가 리턴하는 값을 기반으로 함수를 연달아 사용하는 것

**3. 타이머 함수**
- setTimeout(함수, 시간) : 특정 시간 후에 함수 한 번 호출
- setInterval(함수, 시간) : 특정 시간마다 함수 호출
- clearTimeout(타이머_ID) : setTimeout()의 타이머 제거
- clearInterval(타이머_ID) : setInterval()의 타이머 제거
  - 타이머_ID = set 함수 호출 시 리턴값으로 나오는 숫자
  /


&gt;기본 과제

[문제]
p. 202 &lt;윤년을 확인하는 함수 만들기&gt; 예제를 실행하여 2022년이 윤년인지 확인하는 결과 인증하기

[코드]
```html
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
    function isLeapYear(year) {
      return (year%4==0) &amp;&amp; (year%100!=0) || (year%400===0)
    }
    console.log(`2022년은 윤년일까? === ${isLeapYear(2022)}`)
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>[결과]
<img src="https://velog.velcdn.com/images/tt__zero/post/94d544e5-7dc9-4025-bd4b-04f869b11f67/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자율학습] 11일차 ~9.3]]></title>
            <link>https://velog.io/@tt__zero/%EC%9E%90%EC%9C%A8%ED%95%99%EC%8A%B5-11%EC%9D%BC%EC%B0%A8-9.3</link>
            <guid>https://velog.io/@tt__zero/%EC%9E%90%EC%9C%A8%ED%95%99%EC%8A%B5-11%EC%9D%BC%EC%B0%A8-9.3</guid>
            <pubDate>Fri, 24 Jan 2025 14:55:16 GMT</pubDate>
            <description><![CDATA[<h3 id="91-변수와-상수">9.1 변수와 상수</h3>
<p>9.1.1 변수</p>
<ul>
<li>키워드 : 역할이나 기능이 정해진 특별한 단어<ul>
<li>var, let, typeof 등</li>
</ul>
</li>
<li>식별자 : 변수, 함수 등에 부여되는 이름</li>
<li>연산자 : 연산 작업에 사용</li>
<li>표현식 : 값을 반환하는 식 또는 코드</li>
<li>값 : 더 이상 평가할 수 없는 데이터</li>
<li>세미콜론 : 하나의 문이 끝났음을 의미</li>
<li>선언 : 변수의 식별자를 지정하는 행위</li>
<li>할당 : = 기호로 우변에 있는 값을 변수 공간에 대입하는 것</li>
<li>초기화 : 선언과 할당을 한 번에</li>
</ul>
<p>9.1.2 새로운 변수 선언 키워드 let</p>
<ul>
<li>변수명 중복 불가</li>
<li>호이스팅 불가</li>
<li>스코프의 범위 다름</li>
</ul>
<p>9.1.3 상수</p>
<ul>
<li>const 키워드 사용</li>
<li>재할당이 안 되어 선언 먼저하고 할당 나중에 하는 것도 안 됨</li>
</ul>
<h3 id="92-자료형">9.2 자료형</h3>
<p>9.2.1 문자열</p>
<ul>
<li>큰따옴표나 작음따옴표로 둘러싸인 값의 형태</li>
<li>템플릿 문자열 : 백틱으로 문자열 정의하는 방법<ul>
<li>엔터 눌렀을 때 줄 바꿈 적용됨</li>
<li>${} 문법 사용해 문자열에 변수, 식 넣을 수 있음</li>
</ul>
</li>
</ul>
<p>9.2.2 숫자형</p>
<ul>
<li>자바스크립트는 정수와 실수 구분하지 않고 하나의 숫자 자료형 취급<ul>
<li>10과 0.1은 같은 숫자형</li>
</ul>
</li>
</ul>
<p>9.2.3 논리형</p>
<ul>
<li>true, false 의미</li>
</ul>
<p>9.2.4 undefined</p>
<ul>
<li>변수와 상수 공간에 임시로 데이터 할당할 때 할당되는 값</li>
</ul>
<p>9.2.5 null</p>
<ul>
<li>변수나 상수 선언하고 의도적으로 선언한 공간 비워둘 때 할당</li>
</ul>
<p>9.2.6 객체</p>
<ul>
<li><p>자바스크립트의 핵심적인 자료형</p>
</li>
<li><p>객체 자료형에서 파생되는 자료형 &gt; 배열, 객체 리터럴, 함수</p>
</li>
<li><p>배열</p>
<ul>
<li>복수의 데이터 정의할 수 있는 자료형</li>
<li>요소 : 배열로 정의한 데이터</li>
<li>인덱스 : 0부터 시작하는, 위치를 가리키는 숫자</li>
</ul>
</li>
<li><p>객체 리터럴</p>
<ul>
<li>객체 정의하는 방법</li>
<li>객체 정의 시 중괄호 사용, 키와 값의 한 쌍 구성인 속성 들어감</li>
</ul>
</li>
</ul>
<h3 id="93-연산자">9.3 연산자</h3>
<p>9.3.1 산술 연산자</p>
<ul>
<li>이항 산술 연산자</li>
<li>단항 산술 연산자 <ul>
<li>전치 연산</li>
<li>후치 연산</li>
</ul>
</li>
<li>단항 부정 연산자 : 부호 반대로</li>
</ul>
<p>9.3.2 대입 연산자와 복합 대입 연산자</p>
<ul>
<li>대입 연산자 : =</li>
<li>복합 대입 연산자 : +=, -= /=, <em>=, %/, *</em>/</li>
</ul>
<p>9.3.3 비교 연산자</p>
<ul>
<li>== : 값 동일</li>
<li>=== : 값과 자료형 동일</li>
<li>!=, !==, &lt;, &lt;=, &gt;, &gt;=</li>
</ul>
<p>9.3.4 논리 연산자</p>
<ul>
<li>x&amp;&amp;y : x 참이면 y 반환, 거짓이면 x 반환</li>
<li>x||y : x 참이면 x 반환, 거짓이면 y 반환</li>
<li>!x : x 참이면 false 반환, 거짓이면 true 반환</li>
</ul>
<p>9.3.5 삼항 연산자
x?y:z : x 참이면 y 반환, 거짓이면 z 반환</p>
<p>9.3.6 연사자 우선순위</p>
<ul>
<li>1 : 그룹 연산자, 대괄호 연산자, 마침표 연산자</li>
<li>2 : 증감 연산자, 단항 부정, not delete new typeof 연산자</li>
<li>3 : 나눗셈, 곱셈, 나머지 연산자</li>
<li>4 : 덧셈, 뺄셈</li>
</ul>
<p>9.3.7 형 변환</p>
<ul>
<li>데이터의 자료형이 다른 자료형으로 바뀌는 것</li>
<li>암시적 형 변환</li>
<li>명시적 형 변환 &gt;&gt; String() 메서드 &gt; 문자열을 숫자로</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] ch.4 반복문]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.4-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.4-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Fri, 24 Jan 2025 14:10:47 GMT</pubDate>
            <description><![CDATA[<h3 id="4-1-배열">4-1. 배열</h3>
<ol>
<li>배열 만들기</li>
</ol>
<ul>
<li>배열 : 여러 개의 변수를 한 번에 선언해 다룰 수 있는 자료형<ul>
<li>대괄호 사용해 생성, 내부 값은 쉼표로 구분해 입력</li>
<li>요소 : 배열 내부에 들어 있는 값
[요소, 요소, 요소, ... ,요소]</li>
</ul>
</li>
</ul>
<ol start="2">
<li>배열 요소에 접근하기</li>
</ol>
<ul>
<li>각 요소에 접근하려면 배열 바로 뒤에 대괄호 [...] 입력하고 그 안에 숫자 입력</li>
<li>인덱스 : 요소의 순서(자바스크립트는 가장 앞에 있는 요소가 0번째)</li>
</ul>
<ol start="3">
<li>배열 요소 개수 확인하기</li>
</ol>
<ul>
<li>length 속성 사용 &gt;&gt; 배열.length</li>
</ul>
<ol start="4">
<li>배열 뒷부분에 요소 추가하기</li>
</ol>
<ul>
<li>push() 메소드를 사용해 배열 뒷부분에 요소 추가하기<ul>
<li>배열.push(요소)</li>
</ul>
</li>
<li>인덱스 사용해 배열 뒷부분에 요소 추가하기<ul>
<li>3개 요소를 가진 배열에 10번째 인덱스에 요소 강제 추가하기</li>
<li>4~9번째 인덱스는 empty 상태</li>
</ul>
</li>
</ul>
<ol start="5">
<li>배열 요소 제거하기</li>
</ol>
<ul>
<li>인덱스 기반으로 제거하는 경우<ul>
<li>splice() 메소드 사용 &gt;&gt; 접합</li>
<li>배열.splice(인덱스, 제거할 요소의 개수)</li>
</ul>
</li>
<li>값을 기반으로 제거하는 경우<ul>
<li>indexOf() 메소드 사용 &gt;&gt; 특정 값 위치, splice()로 제거</li>
<li>const 인덱스 = 배열.indexOf(요소)
배열.splice(인덱스, 1)</li>
<li>indexOf()는 배열 내부에 요소가 있을 경우 인덱스 리턴
배열 내부에 요소 없을 때는 -1 리턴</li>
</ul>
</li>
</ul>
<ol start="6">
<li>배열의 특정 위치에 요소 추가하기</li>
</ol>
<ul>
<li>splice() 메소드 사용</li>
<li>배열.splice(인덱스, 0, 요소)</li>
</ul>
<p>/</p>
<h3 id="4-2-반복문">4-2. 반복문</h3>
<ol>
<li>for in 반복문</li>
</ol>
<ul>
<li>배열 요소를 하나하나 꺼내 특정 문장 실행할 때 사용<pre><code class="language-html">for (const 반복 변수 in 배열 또는 객체) {
      문장
}</code></pre>
</li>
</ul>
<ol start="2">
<li>for of 반복문</li>
</ol>
<ul>
<li>반복 변수에 인덱스 들어감</li>
<li>요소의 값 반복 시에 안정적 사용 가능<pre><code class="language-html">for (const 반복 변수 of 배열 또는 객체) {
  문장
}</code></pre>
</li>
</ul>
<ol start="3">
<li>for 반복문</li>
</ol>
<ul>
<li>특정 횟수만큼 반복하고 싶을 때 사용<pre><code class="language-html">for (let i =0; i&lt;반복횟수; i++) {
   문장
}</code></pre>
</li>
</ul>
<ol start="4">
<li>while 반복문</li>
</ol>
<ul>
<li>불 표현식이 true면 문장 계속 실행<pre><code class="language-html">while(불 표현식) {
문장
}</code></pre>
</li>
</ul>
<ol start="5">
<li>break 키워드</li>
</ol>
<ul>
<li>조건문이나 반복문 벗어날 때 사용하는 키워드<pre><code class="language-html">while(true) {
</code></pre>
</li>
</ul>
<p>} break</p>
<pre><code>
6. continue 키워드
- 반복문 안의 반복 작업 멈추고 반복문 처음으로 돌아가 다음 반복 작업 진행

7. 중첩 반복문
- 1차원 배열 : 배열이 한 겹으로 감싸진 배열 [1,2,3]
- 2차원 배열 : 두 겹으로 감싸진 배열 [[1,2,3]]




/
### 3주차 과제
&gt; 기본 과제

Q. 비파괴적 처리와 파괴적 처리의 의미와 장단점 설명하기
A. 비파괴적 처리는 처리 후, 원본 내용이 변경되지 않고 파괴적 처리는 처리 후 원본 내용이 변경된다. 다만, 파괴적 처리는 메모리를 절약할 수 있으나 원본이 사라질 위험성이 크다. 비파괴적 처리는 메모리를 크게 차지하나 자료 보호를 목적으로 사용한다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공스] ch.3 조건문]]></title>
            <link>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.3-%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@tt__zero/%ED%98%BC%EA%B3%B5%EC%8A%A4-ch.3-%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Fri, 17 Jan 2025 06:34:32 GMT</pubDate>
            <description><![CDATA[<h3 id="3-1-if-조건문">3-1. if 조건문</h3>
<ul>
<li>조건 분기 : 코드가 실행되는 흐름을 변경하는 것</li>
<li>if 조건문 : 조건에 따라 코드를 실행하거나 실행하지 않을 때 사용<ul>
<li>조건 = 불 자료형 (비교 연산자, 논리 연산자 활용)</li>
</ul>
</li>
</ul>
<ol>
<li>if 조건문</li>
</ol>
<ul>
<li>불 표현식 값이 true면 중괄호 안의 문장 실행, false면 무시<pre><code class="language-html">if(불 값이 나오는 표현식) {
  불 값이 참일 때 실행할 문장
}</code></pre>
/</li>
</ul>
<ol start="2">
<li>if-else 조건문</li>
</ol>
<ul>
<li>else 구문<ul>
<li>서로 반대대는 상황을 표현하는 구문</li>
<li>if 조건문 바로 뒤에 붙여서 사용</li>
</ul>
</li>
</ul>
<pre><code class="language-html">if(불 값이 나오는 표현식) {
    불 값이 참일 때 실행할 문장
} else {
    불 값이 거짓일 때 실행할 문장
}</code></pre>
<p>/</p>
<ol start="3">
<li>중첩 조건문</li>
</ol>
<ul>
<li>조건문 안에 조건문을 중첩해 사용하는 것</li>
</ul>
<pre><code class="language-html">if (불 값이 나오는 표현식 1) {
    if (불 값이 나오는 표현식 2) {
        표현식 2가 참일 때 실행할 문장
    } else {
        표현식 2가 거짓일 때 실행할 문장
    }
} else {
    if (불 값이 나오는 표현식 3) {
        표현식 3이 참일 때 실행할 문장
    } else {
        표현식 3이 거짓일 때 실행할 문장
    }
}</code></pre>
<p>/
4. if else if 조건문</p>
<ul>
<li>중첩 조건문에서 중괄호를 생략한 형태<pre><code class="language-html">if(불 표현식) {
  문장
} else if (불 표현식) {
  문장
} else if (불 표현식) {
  문장
} else {
  문장
}</code></pre>
</li>
</ul>
<p>/
/
/</p>
<h3 id="3-2-switch-조건문과-짧은-조건문">3-2. switch 조건문과 짧은 조건문</h3>
<ol>
<li>switch 조건문<pre><code class="language-html">switch(자료) {
 case 조건 A:
     break
 case 조건 B:
     break
 default:
     break
}</code></pre>
</li>
</ol>
<ul>
<li>break : switch 조건문이나 반복문을 빠져나가기 위해 사용하는 키워드</li>
</ul>
<ol start="2">
<li>조건부 연산자<pre><code class="language-html">불 표현식 ? 참일 때의 결과 : 거짓일 때의 결과</code></pre>
</li>
<li>짧은 조건문</li>
</ol>
<ul>
<li>논리 연산자의 특성을 조건문으로 사용</li>
</ul>
<p>3-1. 논리합 연산자를 사용한 짧은 조건문</p>
<pre><code class="language-html">true|| 000</code></pre>
<pre><code class="language-html">불 표현식 || 불 표현식이 거짓일 때 실행할 문장</code></pre>
<ul>
<li>자바스크립트는 참이 확실할 때 추가 연산 진행하지 않음</li>
<li>논리합 연산자의 좌변이 참이면 우변 실행하지 않음</li>
</ul>
<p>3-2. 논리곱 연산자를 사용한 짧은 조건문</p>
<ul>
<li>논리곱 연산자는 양변이 모두 참일 때만 참이라 표현식은 항상 거짓</li>
<li>좌변이 거짓이면 우변 실행하지 않음<pre><code class="language-html">false &amp;&amp; 000</code></pre>
<pre><code class="language-html">결과가 거짓인 불 표현식 &amp;&amp; 불 표현식이 참일 때 실행할 문장</code></pre>
</li>
</ul>
<ol start="4">
<li>예제문제 풀이</li>
</ol>
<ul>
<li>&#39;문자열A&#39;.split(&#39;문자열B&#39;) 메소드는 문자열 A를 문자열B로 잘라 배열을 만들어내는 메소드</li>
</ul>
<h3 id="2주차-과제">2주차 과제</h3>
<blockquote>
<p>기본 과제</p>
</blockquote>
<p>p.139 Q3.문제</p>
<pre><code class="language-html">if (x&gt;10) {
  if(x&lt;20) {
           console.log(&#39;조건에 맞습니다.&#39;)
  }
}</code></pre>
<pre><code class="language-html">if(x&gt;10 &amp;&amp; x&lt;20) {
                 console.log(&#39;조건에 맞습니다.&#39;)
}</code></pre>
<p>정답</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
    const x = 15;
    if(x&gt;10 &amp;&amp; x&lt;20) {
                 console.log(&#39;조건에 맞습니다.&#39;)
    } else {
      console.log(&#39;조건에 맞지 않습니다.&#39;)
    }
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>결과
<img src="https://velog.velcdn.com/images/tt__zero/post/ac7df1f2-b6f6-4fe6-93c9-ba9993594a1f/image.png" alt=""></p>
<blockquote>
<p>추가 숙제</p>
</blockquote>
<p>p.152의 &lt;태어난 연도를 입력받아 띠 출력하기&gt; 예제 실행</p>
<p>코드</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;외부 스타일 시트&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
    const rawInput = prompt(&#39;태어난 해를 입력해주세요&#39;, &#39;&#39;);
    const year = Number(rawInput); // &#39;Mumber&#39; -&gt; &#39;Number&#39;로 수정
    const e = year % 12;

    let result;
    if (e === 0) { result = &#39;원숭이&#39;; }
    else if (e === 1) { result = &#39;닭&#39;; }
    else if (e === 2) { result = &#39;개&#39;; }
    else if (e === 3) { result = &#39;돼지&#39;; }
    else if (e === 4) { result = &#39;쥐&#39;; }
    else if (e === 5) { result = &#39;소&#39;; }
    else if (e === 6) { result = &#39;호랑이&#39;; }
    else if (e === 7) { result = &#39;토끼&#39;; }
    else if (e === 8) { result = &#39;용&#39;; }
    else if (e === 9) { result = &#39;뱀&#39;; }
    else if (e === 10) { result = &#39;말&#39;; }
    else if (e === 11) { result = &#39;양&#39;; }

    alert(`${year}년에 태어났다면 ${result} 띠입니다.`);
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>결과
<img src="https://velog.velcdn.com/images/tt__zero/post/a44ce260-2102-46ba-a625-fc5941425e8d/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>