<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mungge_jang322.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 14 Nov 2022 06:01:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. mungge_jang322.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mungge_jang322" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Python] map함수]]></title>
            <link>https://velog.io/@mungge_jang322/Python-map%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@mungge_jang322/Python-map%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 14 Nov 2022 06:01:33 GMT</pubDate>
            <description><![CDATA[<h2 id="map-함수란">map 함수란?</h2>
<h3 id="사용용도">사용용도</h3>
<p>1) 리스트 요소에 값을 더해주거나 곱하고 싶을 때 for문을 사용해 일일이 계산 후 append 할 필요없이 손쉽게 요소하나하나에 계산처리를 해줄 수 있다.
2) 연속적으로 입력받은 값의 손쉬운 형변환을 할 수 있다.</p>
<h3 id="map-함수-형식">map 함수 형식</h3>
<pre><code>map(function, iterable)
map(적용시킬 함수, 반복가능한 자료형(= 리스트, 튜플 등))</code></pre><h3 id="반환값">반환값</h3>
<p><strong>map 객체</strong>로 반환 값이 나오기 때문에 리스트나 튜플 형태로 변환을 시켜줘야 한다.</p>
<h3 id="1-리스트-요소-값">1. 리스트 요소 값</h3>
<h3 id="예시코드">예시코드</h3>
<ul>
<li>for문을 사용하는 방법과 map함수를 사용하는 방법 두가지로 구현해보자.<h4 id="예시1">예시1</h4>
</li>
<li>리스트의 요소에 2를 곱해보자.<pre><code>my_list = [1,2,3,4,5]
</code></pre></li>
</ul>
<h1 id="1-1-for문-사용---새로운-리스트-생성">1-1) for문 사용 - 새로운 리스트 생성</h1>
<p>result_list = []
for value in my_list:
    result_list.append(value*2)
print(f&quot;result: {result_list}&quot;)</p>
<h1 id="1-2-for문-사용---기존-리스트-값-변경">1-2) for문 사용 - 기존 리스트 값 변경</h1>
<p>for idx in range(len(my_list)):
    my_list[idx] = my_list[idx]*2
print(f&quot;result: {my_list}&quot;)</p>
<h1 id="2-map함수-사용-map함수는-기존-리스트의-값을-변경하지-않고-새로운-리스트를-생성한다">2) map함수 사용: map함수는 기존 리스트의 값을 변경하지 않고 새로운 리스트를 생성한다.</h1>
<p>result_list2 = []
def multiply_by_two(n):
    return n*2</p>
<p>result_list2 = list(map(multiply_by_two, my_list))
print(f&quot;result2: {result_list2}&quot;)</p>
<pre><code>
#### 예시2
- 리스트의 요소를 전부 정수형으로 바꿔보자.</code></pre><p>my_list = [1.1,2.1,3.1,4.1,5.1]</p>
<h1 id="1-for문-사용">1. for문 사용</h1>
<p>for idx in range(len(my_list)):
    my_list[idx] = int(my_list[idx])
print(f&quot;result: {my_list}&quot;)</p>
<h1 id="2-map함수-사용">2. map함수 사용</h1>
<p>result_list = list(map(int, my_list))
print(f&quot;result: {result_list}&quot;)</p>
<pre><code>&gt; map(int, 리스트명) 이렇게 하게 되면 리스트의 요소 하나하나가 모두 int형 즉, 정수형으로 바뀐다.

&gt; str과 같은 다른 자료형도 모두 가능하다.

&lt;br&gt;
&lt;br&gt;

### 2. 연속적으로 입력받은 값

### 예시코드</code></pre><p>input_list = input().split()
map_object = map(int, a) 
x, y = map_object    </p>
<pre><code>-&gt; input().split()은 문자열 리스트를 결과값으로 가지고 있다.
-&gt; map 객체는 변수 여러개에 저장할 수 있다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 정규표현식]]></title>
            <link>https://velog.io/@mungge_jang322/Python-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D</link>
            <guid>https://velog.io/@mungge_jang322/Python-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D</guid>
            <pubDate>Sun, 13 Nov 2022 05:05:25 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://wikidocs.net/4308">https://wikidocs.net/4308</a>
<br>
<br></p>
<h3 id="1-대괄호는-문자클래스이다">1. [](대괄호)는 문자클래스이다.</h3>
<pre><code>[0-9]: 숫자 0~9까지
[a-zA-Z]: 알파벳 모두
[abc]: a,b,c가 들어간 문자만 매치
^ 문자는 반대(NOT)라는 의미
[^0-9]: 숫자가 아닌 문자만 매치</code></pre><p>** * 자주 사용하는 문자클래스 **
[0-9], [a-zA-Z] 등은 무척 자주 사용하는 정규표현식</p>
<pre><code>1) \d : 숫자와 매치 (= [0-9])
2) \D : 숫자가 아닌 것만 매치 (= [^0-9])
3) \s : whitespace 문자와 매치 (= [(빈칸)\t\n\r\f\v])
4) \S : whitespace 문자가 아닌 것과 매치 (= [^(빈칸)\t\n\r\f\v])
5) \w : 문자+숫자와 매치 (= [a-zA-Z0-9_])
6) \W : 문자+숫자아닌 문자와 매치(= [^a-zA-Z0-9])</code></pre><br>
<br>

<h3 id="2-dot">2. Dot(.)</h3>
<pre><code>ex1) a.b =&gt; &quot;a+모든문자+b&quot;
즉, a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
-&gt; &quot;aab&quot;: 매치, &quot;abc&quot;: 매치안됨(a와 b사이 어던 문자라도 하나는 있어야함)

ex2) a[.]b =&gt; &quot;a + Dot(.)문자 + b&quot;
-&gt; &quot;a.b&quot;: 매치, &quot;aab&quot;: 매치안됨
=&gt; 여기선 모든문자라는 의미가 아니라 문자그대로 .(dot)이다.</code></pre><br>
<br>

<h3 id="3-반복">3. 반복(*)</h3>
<pre><code>ex) ca*t
-&gt; *(별) 바로 앞에 있는 문자 a가 0부터 무한대로 반복될수 있다는 의미(사실 메모리 제한으로 2억개 정도만 가능)
-&gt; ct: 매치(0번 반복), cat: 매치(1번 반복)</code></pre><br>
<br>

<h3 id="4-반복">4. 반복(+)</h3>
<p>: +는 최소 1번 이상 반복될 때 사용
즉, *(별) 이 반복횟수 0부터라면 +는 1부터</p>
<pre><code>ex) ca+t =&gt; &quot;c+a(1번 이상 반복)+t&quot;
-&gt; ct: 매치 안됨, cat: 매치, caat: 매치</code></pre><br>
<br>

<h3 id="5-반복mn-">5. 반복({m,n}, ?)</h3>
<h4 id="1-mn">1) {m,n}</h4>
<p>: {}메타문자(중괄호)를 사용하면 반복횟수를 고정할 수 있다.
{m,n}정규식을 사용하면 반복횟수가 m부터 n까지 매치할 수 있다.
또한, m 또는 n을 생략할 수도 있다.</p>
<pre><code>ex1) {3,}: 3이상, {,3}: 3이하
생략된 m은 0과 같고 생략된 n은 무한대의 의미

ex2) ca{2}t : &quot;c+a(반드시2번 반복)+t&quot;

ex3) ca{2,5}t : &quot;c+a(2~5회 반복)+t&quot;</code></pre><h4 id="2-">2) ?</h4>
<pre><code>ex) ab?c : &quot;a+b(있어도 되고 없어도된다.)+c&quot;</code></pre><p>=&gt; * ,&nbsp; +,&amp;nbsp ? 메타문자는 모두 {m,n} 형태로 고쳐쓰는 것이 가능하지만 가급적 간결한 *, +, ? 사용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Github] repository naming convention이 있을까?]]></title>
            <link>https://velog.io/@mungge_jang322/Github-repository-naming-convention%EC%9D%B4-%EC%9E%88%EC%9D%84%EA%B9%8C</link>
            <guid>https://velog.io/@mungge_jang322/Github-repository-naming-convention%EC%9D%B4-%EC%9E%88%EC%9D%84%EA%B9%8C</guid>
            <pubDate>Mon, 09 May 2022 12:12:37 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://stackoverflow.com/questions/11947587/is-there-a-naming-convention-for-git-repositories">https://stackoverflow.com/questions/11947587/is-there-a-naming-convention-for-git-repositories</a></p>
<h2 id="github-repository-naming-convention">Github repository naming convention</h2>
<h3 id="1-use-lowercase">1. use lowercase</h3>
<pre><code>ex) myproject</code></pre><h3 id="2-use-hyphens-">2. use hyphens(&#39;-&#39;)</h3>
<pre><code>ex) my-project</code></pre><h3 id="3-be-specific">3. be specific</h3>
<ul>
<li><p>만약 테트리스 게임을 만드는 repository를 생성한다고 가정한다면, 다음과 같이 이름을 작성 할 수 있을 것이다.</p>
<p>  ex) my-tetris-game-project</p>
<h3 id="4-be-consistent">4. be consistent</h3>
</li>
<li><p>다른 프로젝트를 진행할 때에도 일관성있게 작성해라.</p>
<p>  ex) my-ping-pong-game-project</p>
</li>
</ul>
<br>
<br>
<br>

<h2 id="결론">결론</h2>
<p>위 링크를 따라 들어가서 답변을 살펴보면 대체적으로 위와 같이 이야기 하지만, 딱히 정해져 있는 naming convention은 없는 것 같다.</p>
<p>개인적으로는 구체적이고 일관성있게 작성한다면 충분할 것으로 생각된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[5일차] Python 심화]]></title>
            <link>https://velog.io/@mungge_jang322/5%EC%9D%BC%EC%B0%A8-Python-%EC%8B%AC%ED%99%94</link>
            <guid>https://velog.io/@mungge_jang322/5%EC%9D%BC%EC%B0%A8-Python-%EC%8B%AC%ED%99%94</guid>
            <pubDate>Fri, 25 Feb 2022 13:55:56 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter-1">Chapter 1</h1>
<h2 id="실시간-검색어-확인하기">실시간 검색어 확인하기</h2>
<blockquote>
<p>우리는 실시간 검색어를 가져오는 코드(실시간 검색어 크롤링 프로그램)를 작성할 것이다.</p>
</blockquote>
<p>하지만, 현재는 실시간 검색어가 없어졌기 때문에 직접 결과를 받아올 순 없고 예전 교육 자료에 나와있는 결과를 사용할 것이다.</p>
<h3 id="크롤러-알아보기">크롤러 알아보기</h3>
<h4 id="크롤링crawling이란">크롤링(Crawling)이란?</h4>
<ul>
<li>크롤링을 알기 전 크롤러(Crawler)라는 단어를 살펴보자.</li>
</ul>
<p><strong>크롤러(Crawler)란?</strong></p>
<ul>
<li>사전에는 다음과 같은 뜻이 나오게 된다.</li>
</ul>
<ol>
<li>기는 것</li>
<li>파충류
=&gt; 우리는 웹 사이트를 기어다니면서 데이터를 모을 것이다. 사실 우리가 직접 기어다니는 건 아니고 우리가 사용할 크롤러가 대신 데이터를 모아줄 것이다.</li>
</ol>
<p>-&gt; 우리가 원하는 정보를 얻고 싶을 때 보통 구글링을 하는데 <strong>&#39;웹 크롤링&#39;</strong>을 통해서도 가능하다.</p>
<p><strong>Web Crawler</strong> 
: 웹 페이지의 데이터를 모아주는 소프트웨어</p>
<p><strong>Web Crawling</strong> 
: 크롤러를 사용해 웹 페이지의 데이터를 추출해 내는 행위</p>
<p>??우리의 프로그램은 어떻게 실시간 검색어를 가져온다는 걸까요??
-&gt; python의 크롤러를 이용!</p>
<hr>
<h3 id="블록-조립-키트">블록 조립 키트</h3>
<p>터미널에 아래와 같이 입력하면,</p>
<pre><code>pip install requests</code></pre><p>pip라는 도구가 requests라는 모듈을 찾아서 우리 컴퓨터에 설치해준다.
-&gt; 외부모듈을 설치하게 되면 설치가 다 됐다는 문구와 함께 사용할 수 있게 된다.</p>
<p>만약, 이미 존재하는 모듈의 설치를 입력했다면 아래와 같이 이미 존재 한다는 문구가 뜨게 된다.
<img src="https://images.velog.io/images/mungge_jang322/post/8a98cef9-65be-4198-b7a3-a46e70b66cff/image.png" alt=""></p>
<p><strong>코드</strong></p>
<ul>
<li>print문으로 requests모듈을 출력해보자.<pre><code>import requests
</code></pre></li>
</ul>
<p>print(requests)</p>
<pre><code>**결과**
- 모듈이 이러한 경로에 저장되어 있어 하는 의미의 결과다.
![](https://images.velog.io/images/mungge_jang322/post/0b287c7f-f728-4efb-a5b9-945fb2e87987/image.png)

위 내용 이해를 위해서는 파이썬의 함수와 모듈에 대한 이해가 필요하다.

파이썬의 함수란, 자주 사용하는 코드들을 묶어놓고 사용할 수 있게 해주는 것을 의미한다. 반복적인 작업을 줄일 수 있게끔 도와주는 파이썬의 문법이다.

모듈은, 자주 쓰는 함수들을 모아놓은 것이라고 생각하면 된다.

&gt; 우리는 남들이 만들어놓은 requests라는 모듈을 가져다가 사용법만 익혀 사용하면 된다!

---
### 블록 조립 키트 사용법
우리가 requests라는 모듈에서 원하는 값을 얻기 위해서는
1. requests라는 모듈에서
2. get함수를 꺼내
3. 요청을 보내줘
get 함수 -&gt; 자! 여기 응답값~
</code></pre><p>get 함수 -&gt; 자! 여기 응답값~
이걸 파이썬스럽게 바꾼다면
get 함수 -&gt; return 응답값~</p>
<pre><code>
-&gt; 우리가 응답값을 요청하니 get함수가 응답값을 만들어 우리에게 return 해주는 것이다.

---
### 요청하고 응답받기 1</code></pre><p>import 모듈</p>
<pre><code>-&gt; 이렇게 사용할 모듈에 대해 명시해 두지 않으면 파이썬은 우리가 이 모듈을 쓰고 싶어하는 것을 알 수가 없다.
</code></pre><p>// 모듈에 있는 함수를 사용할 때 형식이다.
모듈명.함수이름()</p>
<pre><code>
**코드**
- requests.get를 출력해보자.</code></pre><p>import requests</p>
<p>print(requests.get)</p>
<pre><code>**결과**
- get이라는 함수라는 뜻.
![](https://images.velog.io/images/mungge_jang322/post/de6b74b6-b845-458d-a328-20fb59d1e8c6/image.png)

**요청을 보내는 기능**</code></pre><p>PUT
GET
POST
DELETE</p>
<pre><code>-&gt; 이 중 우리는 get요청을 보내는 기능인 get 함수에 대해 알아볼 것이다.
그렇지만, 그 이전에 요청이 무엇인지 알아보자.

**요청과 응답이란?**
client(손님), server(요리사)라고 예를 들어보자.
- **요청**: client -&gt; server: 손님이 요리사에게 음식 주문하는 것과 비슷
- **응답**: server -&gt; client: 요리사가 손님에게 만든 음식을 주는 것과 비슷

**-&gt; client는 요청을 하는 존재, server는 응답을 하는 존재!**

---
### 요청하고 응답받기 2
get함수는 다음과 같이 사용이 가능하다.
아래 내용은 requests 모듈 공식 홈페이지에서 가져온 것이다.
![](https://images.velog.io/images/mungge_jang322/post/254b6c37-a548-4982-9d31-5a0b39c691a1/image.png)
- 여기서 우리가 살펴봐야 할 정보는 딱 세가지이다.
1. requests.get(url,params=None,**kwars)
2. Parameters
3. Returns
</code></pre><p>requests.get(url)
-&gt; return(응답값): requests.response</p>
<pre><code>- url: 우리가 요청을 보낸 서버의 주소이다.

---
### 요청하고 응답받기 3
서버에 요청을 보내고 응답을 출력해보는 코드를 작성해보자.</code></pre><p>import requests</p>
<p>requests.get(url)</p>
<pre><code>-&gt; url이 정의되어 있지 않아 오류가 발생한다.

**코드**
url을 정의해서 결과를 보자.</code></pre><p>import requests</p>
<p>url = &quot;<a href="http://www.daum.net&quot;">http://www.daum.net&quot;</a>
print(requests.get(url))</p>
<pre><code>
**결과**</code></pre><p>&lt;Response [200]&gt;</p>
<pre><code>-&gt; Response문구와 함께 200이라는 숫자가 함께 왔다. 200이라는 숫자는 코딩에서 성공을 의미한다. 우리의 요청이 성공적으로 갔고 응답을 잘 받아왔다는 뜻이다.

그러나 &#39;&lt;Response [200]&gt;&#39;은 우리가 원하는 응답값이 아니다!
</code></pre><p>import requests</p>
<p>url = &quot;<a href="http://www.daum.net&quot;">http://www.daum.net&quot;</a>
response = requests.get(url)</p>
<p>print(response.text)        // 응답 텍스트 출력 </p>
<pre><code>**결과**</code></pre><!DOCTYPE html><html lang="ko"> <head> <meta charset="utf-8" /> <title>Daum</title> <meta http-equiv="x-ua-compatible" content="IE=edge" /> <meta property="og:url" content="//www.daum.net/" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Daum" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" /> <meta name="referrer" content="origin" /> <meta property="og:image" content="https://i1.daumcdn.net/svc/image/U03/common_icon/5587C4E4012FCD0001" /> <meta property="og:description" content="ëì ê´ì¬ ì½íì¸ ë¥¼ ê°ì¥ ì¦ê²ê² ë³¼ ì ìë Daum" /> <meta name="msapplication-task" content="name=Daum;actio/;icon-uri=/favicon.ico" /> <meta name="msapplication-task" content="name=ë¯¸ëì´ë¤ì;action-uri=//news.daum.net/;icon-uri=/media_favicon.ico" /> <meta name="msapplicatsk" content="name=ë©ì¼;action-uri=//mail.daum.net;icon-uri=/mail_favicon.ico" /> <link href="https://t1.daumcdn.net/top/favicon.ico" rel="shortcut icon" /> <meta name="rerrer" content="origin" /> <link rel="search" type="application/opensearchdescription+xml" href="https://search.daum.net/OpenSearch.xml" title="ë¤ì" /> <link rel="stylesh" href="https://t1.daumcdn.net/top/tiller-pc/20220218_100902/css/common.css" /> <script src="https://t1.daumcdn.net/kas/static/na.min.js"></script> </head> <body> <noscript> ì´ ì¬ì´í¸ì ê¸°ë¥ì ëª¨ë íì©íê¸° ìí´ìë ìë°ì¤í¬ë¦½í¸ë¥¼ íì±í ìí¬ íìê° ììµëë¤. <a href="https://www.enable-javascript.com/ko/"ì°¸ê³  íì¸ì. </noscript> <script src="https://t1.daumcdn.net/tiara/js/v1/tiara.min.js" type="text/javascript"></script> <script src="https://t1.daumcdn.net/top/tiller-b/1636937121956/polyfill.min.js" type="text/javascript" ></script> <script src="https://t1.daumcdn.net/top/tiller-pc/20220218_100902/js/app.js" type="text/javascript"></script> <script src="https://t1.daumcdn.net/kas/static/ba.min.js" type="text/javascript" defer></script> <script src="https://t1.daumcdn.net/top/tiller-pc/1632900517149/tiller-pc-suggest.js" type="text/javascript" defer ></script> </body></html>
```
-> 대략 이런 html 코드가 온다.


<p><strong>아래 내용은 text뿐 아니라 가져올 수 있는 다양한 응답값이다.</strong></p>
<pre><code>#print(response.text)

#print(response.url)

#print(response.content)

#print(response.encoding)

#print(response.headers)

#print(response.json)

#print(response.links)

#print(response.ok)

#print(response.status_code)</code></pre><p>하나만 실행해보자.</p>
<pre><code>import requests

url = &quot;http://www.daum.net&quot;
response = requests.get(url)

print(response.encoding)</code></pre><p><strong>결과</strong></p>
<pre><code>ISO-8859-1</code></pre><hr>
<h3 id="beautiful-soup-1">Beautiful Soup 1</h3>
<p>Beautiful Soup이라는 새로운 기능을 배워보자.
Beautiful Soup는 모듈이 아니라 어떤 모듈의 기능이다.</p>
<pre><code>// 모듈에서 특정 기능만 가져와서 사용할 때 형식
from 모듈명 import 기능
// bs4모듈의 BeautifulSoup 기능을 사용할 것이다. 라는 의미
from bs4 import BeautifulSoup </code></pre><p><strong>예시 코드</strong>
response.text 출력부분을 주석처리하고, beautiful soup를 이용해서 결과를 출력해보자.</p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &quot;http://www.daum.net/&quot;
response = requests.get(url)
# print(response.text)

print(BeautifulSoup(response.text, &#39;html.parser&#39;))</code></pre><p><strong>결과</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;&lt;html lang=&quot;ko&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot; /&gt; &lt;title&gt;Daum&lt;/title&gt; &lt;meta http-equiv=&quot;x-ua-compatible&quot; content=&quot;IE=edge&quot; /&gt; &lt;meta property=&quot;og:url&quot; content=&quot;//www.daum.net/&quot; /&gt; &lt;meta property=&quot;og:type&quot; content=&quot;website&quot; /&gt; &lt;meta property=&quot;og:title&quot; content=&quot;Daum&quot; /&gt; &lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot; /&gt; &lt;meta http-equiv=&quot;Expires&quot; content=&quot;-1&quot; /&gt; &lt;meta name=&quot;referrer&quot; content=&quot;origin&quot; /&gt; &lt;meta property=&quot;og:image&quot; content=&quot;https://i1.daumcdn.net/svc/image/U03/common_icon/5587C4E4012FCD0001&quot; /&gt; &lt;meta property=&quot;og:description&quot; content=&quot;ëì ê´ì¬ ì½íì¸ ë¥¼ ê°ì¥ ì¦ê²ê² ë³¼ ì ìë Daum&quot; /&gt; &lt;meta name=&quot;msapplication-task&quot; content=&quot;name=Daum;actio/;icon-uri=/favicon.ico&quot; /&gt; &lt;meta name=&quot;msapplication-task&quot; content=&quot;name=ë¯¸ëì´ë¤ì;action-uri=//news.daum.net/;icon-uri=/media_favicon.ico&quot; /&gt; &lt;meta name=&quot;msapplicatsk&quot; content=&quot;name=ë©ì¼;action-uri=//mail.daum.net;icon-uri=/mail_favicon.ico&quot; /&gt; &lt;link href=&quot;https://t1.daumcdn.net/top/favicon.ico&quot; rel=&quot;shortcut icon&quot; /&gt; &lt;meta name=&quot;rerrer&quot; content=&quot;origin&quot; /&gt; &lt;link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot; href=&quot;https://search.daum.net/OpenSearch.xml&quot; title=&quot;ë¤ì&quot; /&gt; &lt;link rel=&quot;stylesh&quot; href=&quot;https://t1.daumcdn.net/top/tiller-pc/20220218_100902/css/common.css&quot; /&gt; &lt;script src=&quot;https://t1.daumcdn.net/kas/static/na.min.js&quot;&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;noscript&gt; ì´ ì¬ì´í¸ì ê¸°ë¥ì ëª¨ë íì©íê¸° ìí´ìë ìë°ì¤í¬ë¦½í¸ë¥¼ íì±í ìí¬ íìê° ììµëë¤. &lt;a href=&quot;https://www.enable-javascript.com/ko/&quot;ì°¸ê³  íì¸ì. &lt;/noscript&gt; &lt;script src=&quot;https://t1.daumcdn.net/tiara/js/v1/tiara.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt; &lt;script src=&quot;https://t1.daumcdn.net/top/tiller-b/1636937121956/polyfill.min.js&quot; type=&quot;text/javascript&quot; &gt;&lt;/script&gt; &lt;script src=&quot;https://t1.daumcdn.net/top/tiller-pc/20220218_100902/js/app.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt; &lt;script src=&quot;https://t1.daumcdn.net/kas/static/ba.min.js&quot; type=&quot;text/javascript&quot; defer&gt;&lt;/script&gt; &lt;script src=&quot;https://t1.daumcdn.net/top/tiller-pc/1632900517149/tiller-pc-suggest.js&quot; type=&quot;text/javascript&quot; defer &gt;&lt;/script&gt; &lt;/body&gt;&lt;/html&gt;</code></pre><p>-&gt; 결과는 아까 그냥 response.text를 출력한 것과 같다.
그렇지만, 둘은 다른 데이터다.</p>
<hr>
<h3 id="beautiful-soup-2">Beautiful Soup 2</h3>
<p>두개의 데이터가 어떻게 다른지 알아보기 위해 각각 type()을 씌워서 확인해보자.
<strong>코드</strong></p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &quot;http://www.daum.net/&quot;
response = requests.get(url)
print(type(response.text))

print(type(BeautifulSoup(response.text, &#39;html.parser&#39;)))</code></pre><p><strong>결과</strong></p>
<pre><code>&lt;class &#39;str&#39;&gt;
&lt;class &#39;bs4.BeautifulSoup&#39;&gt;</code></pre><p>-&gt; 위 결과를 보면 str타입이었던 response.text를 bs4.BeautifulSoup로 형변환 했다는 것을 알 수 있다.</p>
<p><strong>BeautifulSoup 기능은?</strong></p>
<ul>
<li>어떤 통에다가 정보를 담아주는 기능이다.</li>
</ul>
<hr>
<h3 id="beautiful-soup-3">Beautiful Soup 3</h3>
<p>Beautiful Soup로 무얼 할 수 있을까?
<strong>형식</strong></p>
<pre><code>BeautifulSoup(데이터, 파싱방법)</code></pre><ul>
<li>데이터에는 xml, html이 올 수 있다.<ul>
<li>그래서 우리는 response.text(html)를 데이터 자리에 넣을 수 있는 것이다.</li>
</ul>
</li>
<li>파싱은 쉽게 말해서 우리의 문서, 우리의 데이터를 의미있게 변경하는 작업이라고 생각하면 된다.<ul>
<li>즉, 어떤 문장, 어떤 문자열을 분석해서 의미 있는 것으로 변경한다.</li>
<li>이러한 파싱을 해주는 것을 parser라 한다. 우리는 기본 내장되어있는 html파서(html.parser)를 사용할 것이다. <pre><code>(BeautifulSoup(response.text, &#39;html.parser&#39;)</code></pre></li>
</ul>
</li>
</ul>
<p><strong>코드</strong></p>
<ul>
<li>우리가 만든 BeautifulSoup도 한 변수에 저장해서 사용해보자.<pre><code>import requests
from bs4 import BeautifulSoup
</code></pre></li>
</ul>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)</p>
<h1 id="printtyperesponsetext">print(type(response.text))</h1>
<p>soup = BeautifulSoup(response.text, &#39;html.parser&#39;)</p>
<p>print(soup.title)        // beautifulsoup로 나온 결과의 title 출력</p>
<pre><code>
**결과**</code></pre><title>Daum</title>
```
-> title 태그와 그 내용이 나온 것을 알 수 있다.

<hr>
<h3 id="beautiful-soup-4">Beautiful Soup 4</h3>
<p><strong>코드</strong></p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &quot;http://www.daum.net/&quot;
response = requests.get(url)

soup = BeautifulSoup(response.text, &#39;html.parser&#39;)

print(soup.title)
print(soup.title.string)        //변경된 코드</code></pre><p><strong>결과</strong></p>
<pre><code>&lt;title&gt;Daum&lt;/title&gt;
Daum</code></pre><p>-&gt; string을 출력하니 태그 안 내용값만 출력이 된다.</p>
<p><strong>코드</strong></p>
<pre><code>import requests
from bs4 import BeautifulSoup

url = &quot;http://www.daum.net/&quot;
response = requests.get(url)
print(response.text)

soup = BeautifulSoup(response.text, &#39;html.parser&#39;)

print(soup.title)
print(soup.title.string)
//추가코드 2줄
print(soup.span)                //span태그를 출력해라.    
print(soup.findAll(&#39;span&#39;))        //모든 span태그를 출력해라.</code></pre><p><strong>결과</strong></p>
<ul>
<li>span태그가 너무 많아 결과창을 올리기에 너무 길어지니 설명만 적겠다.<pre><code>print(soup.span)의 경우는 1개의 span태그만 출력이 되고,
print(soup.findAll(&#39;span&#39;))는 html 코드에 있는 모든 span태그가 나오게 된다.</code></pre></li>
</ul>
<p><strong>reference</strong>
<a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/">beautifulsoup 문서</a></p>
<hr>
<h3 id="beautiful-soup-5">Beautiful Soup 5</h3>
<p>많은 데이터 중 우리가 원하는 실시간 검색어만 가져와보자.
<strong>코드</strong></p>
<ul>
<li>가져온 데이터를 html문서에 저장해보자.<pre><code>from bs4 import BeautifulSoup
import requests
</code></pre></li>
</ul>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)</p>
<p>//추가된 코드 - 파일 생성 및 작성 코드
file = open(&quot;daum.html&quot;,&quot;w&quot;)        // daum.html이라는 파일을 생성하자.
file.write(response.text)            // response.text내용을 파일에 작성하자.
file.close()                        // 다 작성했으니 닫자.
//</p>
<p>print(soup.title)
print(soup.title.string)
print(soup.span)
print(soup.findAll(&#39;span&#39;))</p>
<pre><code>-&gt; 파일 작성하는 것은 나중에 자세히 배우자.

**결과**
- html 문서가 생성됨을 알 수 있다.
![](https://images.velog.io/images/mungge_jang322/post/c85e9e14-c129-40aa-b9fb-c051e7ed2ad7/image.png)
(내용이 너무 길어 문서 내용을 올릴 수가 없음.)

---
### Beautiful Soup 6
받은 html 코드에서 실시간 검색어만이 가진 공통점을 찾아 그것만 뽑아와보자.</code></pre><p>from bs4 import BeautifulSoup
import requests</p>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)</p>
<h1 id="html-문서에서-모든-a태그를-가져오는-코드">html 문서에서 모든 a태그를 가져오는 코드</h1>
<p>print(soup.findAll(&quot;a&quot;))</p>
<pre><code>-&gt; 그런데 a태그안에 묶인 태그들까지 같이 출력된다.

하지만 우리는 모든 a태그만이 아니라 실시간 검색어만 필요하다.
아래와 같이 작성해서 원하는 것만 가져오자.</code></pre><p>// 모든 a태그 중 class가 link_favorsch인 것을 다 가져오라는 뜻.
print(soup.findAll(&quot;a&quot;,&quot;link_favorsch&quot;))</p>
<pre><code>
---
### 예쁘게 출력하기
**코드**</code></pre><p>from bs4 import BeautifulSoup
import requests</p>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)</p>
<p>results = soup.findAll(&#39;a&#39;,&#39;link_favorsch&#39;)
print(results)</p>
<pre><code>**결과**
리스트에 담겨서 [실시간검색어1, 실시간검색어2, ...] 이렇게 실시간 검색어가 콤마로 구분되어 출력된다.
(너무 길어 내용 생략.)
-&gt; 그래서 우리는 반복문을 사용해 하나씩 출력해 볼 것이다.

**코드**</code></pre><p>from bs4 import BeautifulSoup
import requests</p>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)</p>
<p>results = soup.findAll(&#39;a&#39;,&#39;link_favorsch&#39;)</p>
<p>for result in results:
    print(result,&quot;\n&quot;)</p>
<pre><code>**결과**
리스트의 요소로 이루어졌던 결과들이 하나씩 출력되는 것을 볼 수 있다.

하지만, 우리는 실시간검색어를 보고 싶은 것이지 그 태그 전체를 보고싶은 것이 아니다.

**코드**</code></pre><p>from bs4 import BeautifulSoup
import requests</p>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)</p>
<p>results = soup.findAll(&#39;a&#39;,&#39;link_favorsch&#39;)</p>
<p>for result in results:
    print(result.get_text(),&quot;\n&quot;)</p>
<pre><code>**결과**
![](https://images.velog.io/images/mungge_jang322/post/181a2dca-42d8-4378-bedf-82a741bab38d/image.png)
이런식으로 검색어만 나온다.

순위도 함께 출력해보자.
**코드**</code></pre><p>from bs4 import BeautifulSoup
import requests</p>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)
rank = 1</p>
<p>results = soup.findAll(&#39;a&#39;,&#39;link_favorsch&#39;)</p>
<p>for result in results:
    print(rank,&quot;위 : &quot;,result.get_text(),&quot;\n&quot;)
    rank += 1</p>
<pre><code>**결과**
![](https://images.velog.io/images/mungge_jang322/post/3abc7c3c-b1f2-4b18-85e1-24d15581d9e4/image.png)


이번엔 몇 월 며칠의 실시간 검색어인지 뽑아 볼 것이다.
실시간 검색어는 말 그대로 실시간이기에 당일 날짜를 출력하면 된다.
**코드**</code></pre><p>print(datetime.today())</p>
<pre><code>**결과**
- 오늘 날짜를 출력하게 된다.</code></pre><p>2022-02-25 05:07:57.537312</p>
<pre><code>하지만 우리는 위와 같이 번거롭게 시간까지는 필요가 없다.
다음과 같이 깔끔하게 변경해주자.</code></pre><p>print(datetime.today().strftime(&quot;%Y년 %m월 %d일의 실시간 검색어 순위입니다.&quot;))</p>
<pre><code>**결과**</code></pre><p>2022년 02월 25일의 실시간 검색어 순위입니다.</p>
<pre><code>
---
### 파일로 출력하기
- 파일을 새로 만들거나, 읽어서 가져오거나 파일의 내용을 수정하고 싶으면 python의 open()내장함수를 사용해야 한다.
- python이 기본으로 가지고 있는 기능이기 때문에 우리는 사용법만 익히면 바로 사용할 수 있다.
</code></pre><p>open(파일, 모드)</p>
<pre><code>- 이 함수를 사용하기 위해서는 파일, 모드가 필요하다.
- 파일은 원하는 파일명과 확장자를 정해 사용하면 된다.</code></pre><p>open(&quot;파일명.파일확장자&quot;,모드)</p>
<pre><code>- 모드는 우리가 읽거나 쓸 대상이 되는 파일의 상태를 의미한다.
    - open 함수에서 정해져 있는 키워드들이 있다.
    - &#39;r&#39; -&gt; read: 읽기 전용 모드로 파일을 연다.
    - &#39;w&#39; -&gt; write: 새로 쓰거나 수정할 수 있다. 기존 내용이 있어도 새로운 내용으로 덮어씌워지게 된다.
    - &#39;a&#39; -&gt; append: 기존파일을 보존하고 거기에 내용을 덧붙여 작성할 수 있다.

**코드**</code></pre><p>from bs4 import BeautifulSoup
import requests
from datetime import datetime</p>
<p>url = &quot;<a href="http://www.daum.net/&quot;">http://www.daum.net/&quot;</a>
response = requests.get(url)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)
rank = 1</p>
<p>results = soup.findAll(&#39;a&#39;,&#39;link_favorsch&#39;)</p>
<p>//rankresult.txt라는 파일을 쓰기 모드로 연다는 뜻이다.
search_rank_file = open(&quot;rankresult.txt&quot;,&quot;w&quot;)    </p>
<p>print(datetime.today().strftime(&quot;%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n&quot;))</p>
<p>for result in results:
    //파일 작성 내용
    search_rank_file.write(str(rank)+&quot;위:&quot;+result.get_text()+&quot;\n&quot;)
    print(rank,&quot;위 : &quot;,result.get_text(),&quot;\n&quot;)
    rank += 1</p>
<pre><code>
**결과**
![](https://images.velog.io/images/mungge_jang322/post/686f550f-60be-4623-af73-d414c13077b7/image.png)
-&gt; 텍스트 파일이 생성된 것을 볼 수 있다.
![](https://images.velog.io/images/mungge_jang322/post/1a1b3605-4e15-4d68-bcb6-c9227bac12ea/image.png)
-&gt; 텍스트 파일 안에 우리가 작성한 내용이 쓰여 있는 것을 알 수 있다.

원래 코드에서 한글자만 수정해서 파일에 내용을 덧붙이는 코드로 변경해보자.
**코드**</code></pre><p>...
search_rank_file = open(&quot;rankresult.txt&quot;,&quot;a&quot;)    // &quot;w&quot;를 &quot;a&quot;로 변경
...</p>
<pre><code>-&gt; 이렇게 open함수의 모드를 a로 변경하면 내용을 덮어 버리는 것이 아닌 뒤에 덧붙여지게 된다.

---
### 응용 해보기
네이버 급상승 검색어를 가져와보자.
그렇지만, 내용을 가져오려는 경우 존재하지 않는 웹사이트라는 말이 뜬다.
이것은 코드가 잘못된 것이 아니다.
- 네이버와 같은 특정 웹사이트의 경우 불법으로 페이지의 정보를 크롤링 해가거나 정보를 수집하기 위한 행위를 하는 로봇들을 차단시켜 놓았기 때문이다.
- 크롤링 로봇들이 와서 네이버에 있는 모든 정보들을 가져가거나 숨어있는 정보들을 빼내간다면 문제가 되기 때문이다.

하지만, 우리는 로봇이 아니다. 그래서 이와 같이 로봇을 방지하기 위해 접근을 막은 사이트의 경우 다른 방법을 사용해 주어야 한다. 
- 난 로봇이 아니고 잠깐 크롤링을 하는 한 사용자일 뿐이야라고 말해주는 구문이 필요하다. 그 구문은 바로 아래와 같다.</code></pre><p>headers = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36&#39;}</p>
<pre><code>-&gt; 우리의 정보를 담아서 보낸다.
-&gt; 우리는 로봇이 아니고 이러한 환경에서 코딩을 하고 있는 유저야라고 설명해주는 것이다.
-&gt; 이렇게 만들어진 header를 request.get요청을 보낼때 같이 보내줘야 한다.
- 다음과 같이 수정하면 된다.</code></pre><p>response = requests.get(url,headers=headers)</p>
<pre><code>그럼 이제 값을 가져올 수 있게 된다.
**전체 코드**</code></pre><p>from bs4 import BeautifulSoup
import requests
from datetime import datetime</p>
<p>headers = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36&#39;}
url = &quot;<a href="https://datalab.naver.com/keyword/realtimeList.naver?age=20s&quot;">https://datalab.naver.com/keyword/realtimeList.naver?age=20s&quot;</a>
response = requests.get(url,headers=headers)
soup = BeautifulSoup(response.text, &#39;html.parser&#39;)
rank = 1</p>
<h1 id="span---item_title">span - item_title</h1>
<p>results = soup.findAll(&#39;span&#39;,&#39;item_title&#39;)</p>
<p>print(response.text)</p>
<p>search_rank_file = open(&quot;rankresult.txt&quot;,&quot;a&quot;)</p>
<p>print(datetime.today().strftime(&quot;%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n&quot;))</p>
<p>for result in results:
    search_rank_file.write(str(rank)+&quot;위:&quot;+result.get_text()+&quot;\n&quot;)
    print(rank,&quot;위 : &quot;,result.get_text(),&quot;\n&quot;)
    rank += 1</p>
<pre><code>
---
# Chapter 2
## 날씨 정보 받아오기
### API key 발급받기
https://home.openweathermap.org/
위 사이트에 접속해 회원가입 후 이메일 인증 하면 API key를 발급받을 수 있다.

---
### API 알아보기
- 목표: API를 사용하여 날씨 정보를 출력하는 프로그램
**API(Application Programming Interface)**
: client와 server를 연결해준다.
- client와 server간 데이터 이동을 도와준다.

**&quot;API를 만든다&quot;라는 것은, 사용자가 필요로 하는 기능을 만들고 서버에 올려놓은 뒤에 특정한 규약에 따라 사용할 수 있게 하는 프로그램을 만드는 것이다.**

**&quot;API를 사용한다&quot;라는 것은, 누군가가 만든 기능을 특정한 규약에 맞춰 사용한다는 것이다. 즉, 사용자가 만드는 프로그램과 기존에 있는 프로그램을 연결해주는 다리가 API다. **

**따로 비용을 지불하지 않아도 사용이 가능한 API = openAPI라고 부른다.**

---
### API key 알아보기
&quot;내가 만든 API를 누가 사용하고 있는걸까?&quot;라는 궁금증이 생겨서 다음부터 API를 만들 때 &#39;API를 사용하려면 누가 사용했는지 기재하고 사용해주세요&#39; 하고 조건을 넣은 것이다.

**다음과 같이 말이다.**
![](https://images.velog.io/images/mungge_jang322/post/f4e921e6-c258-4861-aae4-2fa517e838e1/image.png)
-&gt; 여기서는 &#39;철수&#39;, &#39;영희&#39;가 API key이다. 
- API를 사용할 때 본인이 누구인지 나타내는 것을 API key라고 한다.
- 위와 같이 &#39;철수&#39;, &#39;영희&#39;와 같이 흔한 이름으로 API key를 지정하는 것이 아니라 식별할 수 있는 고유의 문자열로 이루어져 있다.

---
### API 링크 만들기
- openweathermapAPI를 사용하기 위해서 [사이트](https://openweathermap.org/api)에 들어가 API doc을 눌러 API 사용 설명을 읽자.
- API doc에 들어가게 되면 아래와 같이 API를 호출할 수 있는 주소가 나와있다.</code></pre><p>api = &quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity">http://api.openweathermap.org/data/2.5/weather?q={city</a> name}&amp;appid={your api key}&quot;</p>
<pre><code>-&gt; 위 주소 중 중괄호로 감싸 있는 city name, your api key 같은 경우는 우리가 직접 채워주어야 하는 부분이다. **이 부분을 parameter라고 한다.**

우리는 파이썬의 기능인 **&quot;f-string&quot;**을 이용해 저 주소문자열에 city name과 api key를 넣어 줄 것이다.

**f-string이란**
- 아래와 같이 문자열의 맨 앞에 &#39;f&#39;를 붙여 f-string을 사용하면 우리가 사용하는 변수명을 중괄호 안에 적어주면 된다.
- 변수를 넣어 사용하고 싶을 땐 항상 중괄호를 해주어야 한다.
**코드**
- api key는 암호화</code></pre><p>city = &quot;Seoul&quot;
apikey = &quot;################################&quot;
api = f&quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;appid=%7Bapikey%7D&quot;">http://api.openweathermap.org/data/2.5/weather?q={city}&amp;appid={apikey}&quot;</a></p>
<p>print(api)</p>
<pre><code>**결과**</code></pre><p><a href="http://api.openweathermap.org/data/2.5/weather?q=Seoul&amp;appid=################################">http://api.openweathermap.org/data/2.5/weather?q=Seoul&amp;appid=################################</a></p>
<pre><code>
---
### 날씨 받아오기</code></pre><p>api = f&quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;appid=%7Bapikey%7D&quot;">http://api.openweathermap.org/data/2.5/weather?q={city}&amp;appid={apikey}&quot;</a></p>
<pre><code>-&gt; ?를 기준으로 왼쪽은 공통 api 주소이고 뒷쪽은 파라미터이다.

- requests모듈로 요청을 보내보자.
**코드**</code></pre><p>import requests</p>
<p>city = &quot;Seoul&quot;
apikey = &quot;################################&quot;
api = f&quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;appid=%7Bapikey%7D&quot;">http://api.openweathermap.org/data/2.5/weather?q={city}&amp;appid={apikey}&quot;</a></p>
<p>result = requests.get(api)</p>
<p>print(result)</p>
<pre><code>**결과**</code></pre><p>&lt;Response [200]&gt;</p>
<pre><code>
**코드**
- result의 text를 출력해보자.</code></pre><p>import requests</p>
<p>city = &quot;Seoul&quot;
apikey = &quot;################################&quot;
api = f&quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;appid=%7Bapikey%7D&quot;">http://api.openweathermap.org/data/2.5/weather?q={city}&amp;appid={apikey}&quot;</a></p>
<p>result = requests.get(api)</p>
<p>print(result.text)</p>
<pre><code>**결과**</code></pre><p>{&quot;coord&quot;:{&quot;lon&quot;:126.9778,&quot;lat&quot;:37.5683},&quot;weather&quot;:[{&quot;id&quot;:721,&quot;main&quot;:&quot;Haze&quot;,&quot;description&quot;:&quot;haze&quot;,&quot;icon&quot;:&quot;50d&quot;}],&quot;base&quot;:&quot;stations&quot;,&quot;main&quot;:{&quot;temp&quot;:279.45,&quot;feels_like&quot;:276.54,&quot;temp_min&quot;:277.84,&quot;temp_max&quot;:280.81,&quot;pressure&quot;:1024,&quot;humidity&quot;:75},&quot;visibility&quot;:3800,&quot;wind&quot;:{&quot;speed&quot;:4.12,&quot;deg&quot;:240},&quot;clouds&quot;:{&quot;all&quot;:75},&quot;dt&quot;:1645780695,&quot;sys&quot;:{&quot;type&quot;:1,&quot;id&quot;:8105,&quot;country&quot;:&quot;KR&quot;,&quot;sunrise&quot;:1645740593,&quot;sunset&quot;:1645780856},&quot;timezone&quot;:32400,&quot;id&quot;:1835848,&quot;name&quot;:&quot;Seoul&quot;,&quot;cod&quot;:200}</p>
<pre><code>-&gt; 지금 보내준 정보는 너무 많으니 원하는 정보만 뽑아주자.

---
### 예쁘게 출력하기 1

우리가 받아온 응답이 사실은 json타입이다.
json이란, javascript object notation의 줄임말이다.
- 여기서는 데이터를 주고 받을 때 사용하는 포맷이라고 생각하면 된다.
- 파이썬의 dictionary와 모양이 같다.
- 문자열을 json 으로 변경하기 위해서는 아래와 같이 사용하면 된다.</code></pre><p>json.loads(str)</p>
<pre><code>
**코드**</code></pre><p>import requests
import json</p>
<p>city = &quot;Seoul&quot;
apikey = &quot;################################&quot;
api = f&quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;appid=%7Bapikey%7D&quot;">http://api.openweathermap.org/data/2.5/weather?q={city}&amp;appid={apikey}&quot;</a></p>
<p>result = requests.get(api)</p>
<p>data = json.loads(result.text)</p>
<p>print(type(result.text))
print(type(data))</p>
<pre><code>
**결과**</code></pre><p>&lt;class &#39;str&#39;&gt;
&lt;class &#39;dict&#39;&gt;</p>
<pre><code>-&gt; type이 str에서 dict로 바뀐 것을 확인 할 수 있다.

---
### 예쁘게 출력하기 2
![](https://images.velog.io/images/mungge_jang322/post/eca5794e-6d66-4062-b315-6d796e80a289/image.png)

![](https://images.velog.io/images/mungge_jang322/post/51b91740-e1dd-4cdd-9910-a4b8b1039777/image.png)

**코드**
- 원하는 날씨 정보를 뽑아 출력해보자.</code></pre><p>import requests
import json</p>
<p>city = &quot;Seoul&quot;
apikey = &quot;################################&quot;
api = f&quot;<a href="http://api.openweathermap.org/data/2.5/weather?q=%7Bcity%7D&amp;appid=%7Bapikey%7D&quot;">http://api.openweathermap.org/data/2.5/weather?q={city}&amp;appid={apikey}&quot;</a></p>
<p>result = requests.get(api)</p>
<p>data = json.loads(result.text)</p>
<p>print(data[&quot;name&quot;],&quot;의 날씨입니다.&quot;)
print(&quot;날씨는 &quot;,data[&quot;weather&quot;][0][&quot;main&quot;],&quot;입니다.&quot;)
print(&quot;현재 온도는 &quot;,data[&quot;main&quot;][&quot;temp&quot;],&quot;입니다.&quot;)
print(&quot;하지만 체감 온도는 &quot;,data[&quot;main&quot;][&quot;feels_like&quot;],&quot;입니다.&quot;)
print(&quot;최저 기온은&quot;, data[&quot;main&quot;][&quot;temp_min&quot;], &quot;입니다.&quot;)
print(&quot;최고 기온은&quot;, data[&quot;main&quot;][&quot;temp_max&quot;], &quot;입니다.&quot;)
print(&quot;습도는&quot;, data[&quot;main&quot;][&quot;humidity&quot;], &quot;입니다.&quot;)
print(&quot;기압은&quot;, data[&quot;main&quot;][&quot;pressure&quot;], &quot;입니다.&quot;)
print(&quot;풍향은&quot;, data[&quot;wind&quot;][&quot;deg&quot;], &quot;입니다.&quot;)
print(&quot;풍속은&quot;, data[&quot;wind&quot;][&quot;speed&quot;], &quot;입니다.&quot;)</p>
<pre><code>
**결과**</code></pre><p>Seoul 의 날씨입니다.
날씨는  Haze 입니다.
현재 온도는  279.57 입니다.
하지만 체감 온도는  276.69 입니다.
최저 기온은 277.84 입니다.
최고 기온은 280.81 입니다.
습도는 68 입니다.
기압은 1024 입니다.
풍향은 240 입니다.
풍속은 4.12 입니다.</p>
<pre><code>-&gt; 온도는 화씨로 나오니 섭씨로 바꿔주자.

---
### 언어 및 단위 변경하기</code></pre><p>import requests
import json</p>
<p>city = &quot;Seoul&quot;
apikey = &quot;################################&quot;
lang = &quot;kr&quot;        // 한국어</p>
<h1 id="lang-units라는-파라미터를-추가해서-한국어로-변경하고-화씨를-섭씨-온도로-변경-했다">lang, units라는 파라미터를 추가해서 한국어로 변경하고, 화씨를 섭씨 온도로 변경 했다.</h1>
<p>api = f&quot;&quot;&quot;<a href="http://api.openweathermap.org/data/2.5/%5C">http://api.openweathermap.org/data/2.5/\</a>
weather?q={city}&amp;appid={apikey}&amp;lang={lang}&amp;units=metric&quot;&quot;&quot;    </p>
<p>result = requests.get(api)</p>
<h1 id="printresulttext">print(result.text)</h1>
<p>data = json.loads(result.text)</p>
<h1 id="지역--name">지역 : name</h1>
<p>print(data[&quot;name&quot;],&quot;의 날씨입니다.&quot;)</p>
<h1 id="자세한-날씨--weather---description">자세한 날씨 : weather - description</h1>
<p>print(&quot;날씨는 &quot;,data[&quot;weather&quot;][0][&quot;description&quot;],&quot;입니다.&quot;)</p>
<h1 id="현재-온도--main---temp">현재 온도 : main - temp</h1>
<p>print(&quot;현재 온도는 &quot;,data[&quot;main&quot;][&quot;temp&quot;],&quot;입니다.&quot;)</p>
<h1 id="체감-온도--main---feels_like">체감 온도 : main - feels_like</h1>
<p>print(&quot;하지만 체감 온도는 &quot;,data[&quot;main&quot;][&quot;feels_like&quot;],&quot;입니다.&quot;)</p>
<h1 id="최저-기온--main---temp_min">최저 기온 : main - temp_min</h1>
<p>print(&quot;최저 기온은 &quot;,data[&quot;main&quot;][&quot;temp_min&quot;],&quot;입니다.&quot;)</p>
<h1 id="최고-기온--main---temp_max">최고 기온 : main - temp_max</h1>
<p>print(&quot;최고 기온은 &quot;,data[&quot;main&quot;][&quot;temp_max&quot;],&quot;입니다.&quot;)</p>
<h1 id="습도--main---humidity">습도 : main - humidity</h1>
<p>print(&quot;습도는 &quot;,data[&quot;main&quot;][&quot;humidity&quot;],&quot;입니다.&quot;)</p>
<h1 id="기압--main---pressure">기압 : main - pressure</h1>
<p>print(&quot;기압은 &quot;,data[&quot;main&quot;][&quot;pressure&quot;],&quot;입니다.&quot;)</p>
<h1 id="풍향--wind---deg">풍향 : wind - deg</h1>
<p>print(&quot;풍향은 &quot;,data[&quot;wind&quot;][&quot;deg&quot;],&quot;입니다.&quot;)</p>
<h1 id="풍속--wind---speed">풍속 : wind - speed</h1>
<p>print(&quot;풍속은 &quot;,data[&quot;wind&quot;][&quot;speed&quot;],&quot;입니다.&quot;)</p>
<pre><code>
**결과**</code></pre><p>Seoul 의 날씨입니다.
날씨는  맑음 입니다.
현재 온도는  7.04 입니다.
하지만 체감 온도는  5.48 입니다.
최저 기온은  2.42 입니다.
최고 기온은  7.66 입니다.
습도는  85 입니다.
기압은  1025 입니다.
풍향은  224 입니다.
풍속은  2.3 입니다.</p>
<pre><code>
---
# Chapter 3
## 번역하기
### 미리보기
![](https://images.velog.io/images/mungge_jang322/post/33153f8a-dd05-4cbe-9383-0b56c7c0d1a3/image.png)

---
### [googletrans](https://py-googletrans.readthedocs.io/en/latest/) 알아보기
**googletrans란?**
: 언어 감지 및 번역 기능을 가진 모듈. 즉, 라이브러리이다.
- 우리가 앞에서 배웠던 모듈을 큰 기능 단위로 묶어둔 것을 라이브러리라고 부르는데 그런 의미에서 googletrans는 큰 기능을 가진 모듈의 집합
- 언어 감지 및 번역을 도와주는 라이브러리라고 볼 수 있다.

**언어 감지란?**
: &quot;안녕하세요는 한국어고, hello는 영어다&quot;라고 감지해주는 것이다.

우리는 translator라는 기능만 사용할 것이다.
**코드**</code></pre><p>from googletrans import translator</p>
<p>print(translator)</p>
<pre><code>**결과**</code></pre><p>&lt;class &#39;googletrans.client.Translator&#39;&gt;</p>
<pre><code>
---
### 언어 감지하기
언어를 감지 하기 위해서는 다음과 같은 순서가 필요하다.
1. 번역기를 만든다.
2. 언어 감지를 원하는 문장을 설정한다.
3. 언어를 감지한다.

**1.번역기를 만든다.**</code></pre><p>Translator()</p>
<pre><code>이 기능을 사용해 번역기를 만들자.

**2. 언어 감지를 원하는 문장을 설정한다.**</code></pre><p>translator.detect(언어감지를 원하는 문장)</p>
<pre><code>
**코드**</code></pre><p>from googletrans import Translator</p>
<p>translator = Translator()</p>
<p>sentence = &quot;안녕하세요 코드라이언입니다.&quot;
detected = translator.detect(sentence)</p>
<p>print(detected)</p>
<pre><code>
**결과**</code></pre><p>Detected(lang=ko, confidence=1)</p>
<pre><code>-&gt; lang=ko라는 결과는 한국어라는 뜻이다.
-&gt; confidence는 언어 감지 신뢰도이다. 1이면 높은 것.

**3. 언어를 감지한다.**
detected만으로 lang값만 가져오고 싶을 때?</code></pre><p>detected.lang</p>
<pre><code>
**코드**</code></pre><p>from googletrans import Translator</p>
<p>translator = Translator()</p>
<p>sentence = &quot;안녕하세요 코드라이언입니다.&quot;
detected = translator.detect(sentence)</p>
<p>print(detected.lang)</p>
<pre><code>
**결과**</code></pre><p>ko</p>
<pre><code>
직접 언어를 입력받아서 감지해보자.
**코드**</code></pre><p>from googletrans import Translator</p>
<p>translator = Translator()</p>
<p>sentence = input(&quot;언어를 감지할 문장을 입력해주세요 : &quot;)
detected = translator.detect(sentence)</p>
<p>print(detected.lang)</p>
<pre><code>
---
### 번역하기 1
1. 번역기를 만든다.
2. 번역을 원하는 문장을 만든다.
3. 번역을 원하는 언어를 설정한다.
4. 번역을 한다.

번역기는 이전에 만들어둔 것이 있기에 그것을 사용하자.

**2. 번역을 원하는 문장을 만든다.**
**3. 번역을 원하는 언어를 설정한다.**</code></pre><p>//dest: destination의 줄임말, src(source text)
translate(text, dest, src)<br>translate(번역을 원하는 문장 , 어떤 언어로 번역을 할지, 소스(생략가능))</p>
<pre><code>-&gt; src가 생략 가능한 이유는 translator()에서 언어 감지를 잘 해주기 때문에 

**코드**</code></pre><p>from googletrans import Translator</p>
<p>translator = Translator()</p>
<p>sentence = &quot;안녕하세요 코드라이언입니다.&quot;</p>
<p>result = translator.translate(sentence,&#39;en&#39;)
print(result)</p>
<pre><code>**결과**</code></pre><p>Translated(src=ko, dest=en, text=Hello, I&#39;m Coderian., pronunciation=None, extra_data=&quot;{&#39;translat...&quot;)</p>
<pre><code>-&gt;translate라는 함수를 사용하면 위와 같은 정보들을 translated라는 통에 담아서 돌려주게 된다.
-&gt; pronunciation=None은 영어로 번역할 경우 발음을 표시 해 줄 필요가 없기에 None이라고 뜬다.
-&gt; extra_data는 text와 pronunciationi을 제외한 부수적인 것이 번역된 부분이라고 보면 된다.

---
### 번역하기 2
**4. 번역을 한다.**
**코드**</code></pre><p>from googletrans import Translator</p>
<p>translator = Translator()</p>
<p>sentence = &quot;안녕하세요 코드라이언입니다.&quot;</p>
<p>result = translator.translate(sentence,&#39;en&#39;)
detected = translator.detect(sentence)</p>
<p>print(&quot;===========출 력 결 과===========&quot;)
print(detected.lang,&quot;:&quot;,sentence)
print(result.dest,&quot;:&quot;,result.text)
print(&quot;=================================&quot;)</p>
<pre><code>
**결과**</code></pre><p>===========출 력 결 과===========
ko : 안녕하세요 코드라이언입니다.
en : Hello, I&#39;m Coderian.
=================================</p>
<pre><code>
**여러가지 언어의 lang값**</code></pre><p>프랑스어: fr
아랍어: ar
베트남어: vi
독일어: de
스페인어: es
몽골어: mn
중국어: zh-CN
힌디어: hi</p>
<pre><code>
**코드**
- 사용자가 원하는 문장과 언어로 번역하도록 입력을 받아보자.</code></pre><p>from googletrans import Translator</p>
<p>translator = Translator()</p>
<p>sentence = input(&quot;번역을 원하는 문장을 입력해주세요 : &quot;)
dest = input(&quot;어떤 언어로 번역을 원하시나요?&quot;)</p>
<p>result = translator.translate(sentence,dest)
detected = translator.detect(sentence)</p>
<p>print(&quot;===========출 력 결 과===========&quot;)
print(detected.lang,&quot;:&quot;,sentence)
print(result.dest,&quot;:&quot;,result.text)
print(&quot;=================================&quot;)</p>
<pre><code>
**결과**</code></pre><p>번역을 원하는 문장을 입력해주세요 : 안녕
어떤 언어로 번역을 원하시나요?fr
===========출 력 결 과===========
ko : 안녕
fr : salut
=================================</p>
<pre><code>
---
# Chapter 4
## 메일 보내기
- 파이썬으로 메일을 보내보자!(gmail 사용예정)
### 사전 준비
#### Google 보안 수준 변경하기
- 메일 계정의 외부 접속에 대한 보안 설정
1. Google 메인 페이지에 접속 합니다.
2. 프로필 이미지 클릭, &#39;Google 계정 관리&#39; 버튼을 클릭 합니다.
3. 좌측 &#39;보안&#39; 탭을 클릭 합니다.
4. 액세스 사용 설정 페이지로 진입 합니다.
- (4-1) &#39;보안 수준이 낮은 앱의 액세스&#39; 섹션을 찾습니다. (보안 탭의 하단에 위치하고 있습니다.)
- (4-2) &#39;액세스 사용 설정(권장하지 않음)&#39; 텍스트를 클릭 합니다.
5. &#39;보안 수준이 낮은 앱&#39;의 액세스 권한을 허용 합니다.
6. 이제 Python 프로그램이 우리 메일 서버에 접근할 수 있어요.

#### Google IMAP 설정하기
IMAP이란?
: 다양한 기기에서 이메일에 접근하고 클라이언트 서버에 이메일과 첨부파일을 저장하기 위함이다.
- 이걸 사용으로 해두지 않으면 python 코드에서 동작하지 않는다.
- python 학습이 모두 끝나면 다시 사용안함으로 변경해도 상관없다.

1. Google 계정을 준비합니다.
2. Gmail 메인 페이지에 접속합니다.
3. 상단 톱니를( ⚙️) 클릭 합니다.
4. &#39;모든 설정 보기&#39; 버튼을 클릭 합니다.
5. 전달 및 POP/IMAP 탭을 클릭 합니다.
6. IMAP 액세스 / 상태 값을 &#39;IMAP 사용&#39;으로 변경합니다.

---
### SMTP 1
**SMTP란?**
: Simple Mail Transfer Protocol의 약자이다. 한국말로 간단히 표현하자면 &#39;간단하게 메일을 보내는 약속&#39;이다. 

- 우리의 python code(email client)에서 이메일을 생성해서 SMTP를 이용해 gmail server(email server)로 전송한다.

- email server끼리 메일을 주고 받을 때도 SMTP를 사용한다.

- email server가 우리 즉, client에 메일을 전달해 줘야 하는 경우도 있다. 이 경우에 사용하는 것이 IMAP이다.

- 따라서 IMAP 설정을 해주어야 client로 이메일을 가져올 수 있게 되는 것이다.

![](https://images.velog.io/images/mungge_jang322/post/fd842fdf-af2a-4084-acc6-a51c5b49e450/image.png)
- 우리는 평소 email server에 직접 들어가 SMTP만을 이용해 이메일을 보내기때문에 client입장에서 메일 보내는 것이 생소할 수 있다.

=&gt; SMTP 서버(email server)를 이용해서 우리가 원하는 곳으로 메일을 보낼 수 있다.

---
### SMTP 2
우리가 SMTP 서버에 접속할 때는 대략 smtp.gmail.com라는 주소의 465번 포트를 이용한다고 생각하면 된다.

그리고 SMTP를 좀 더 쉽게 사용할 수 있는 smtplib라이브러리가 있다.

---
### SMTP 3
1. SMTP 메일 서버를 연결한다.
2. SMTP 메일 서버에 로그인한다.
3. SMTP 메일 서버로 메일을 보낸다.

**1. SMTP 메일 서버를 연결한다.**
smtplib라이브러리는 따로 설치가 필요없다.</code></pre><p>import smtplib</p>
<p>smtplib.SMTP(서버주소, 포트번호)</p>
<pre><code>
**코드**</code></pre><p>import smtplib</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465                // gmail에서 지정한 포트번호라 변경 불가.</p>
<p>smtp = smtplib.SMTP(SMTP_SERVER,SMTP_PORT)
print(smtp)</p>
<pre><code>**결과**
-&gt; 연결할 수 없다는 메시지가 뜬다.

이것은 바로 보안문제 때문이다.
우리가 사용하는 gmail의 smtp서버는 ssl이라는 것을 필수적으로 요구한다.
이 ssl이란, 아무나 우리 메일 서버에 접근하지 못하도록 하는 막아주는 암호화 방식을 말한다.
우리는 이 암호화 방식을 포함하고 있는 함수를 사용해야 한다.</code></pre><p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)</p>
<pre><code>
**코드**</code></pre><p>import smtplib</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465</p>
<p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)    // 함수가 수정되었다.
print(smtp)</p>
<pre><code>**결과**</code></pre><p>&lt;smtplib.SMTP_SSL object at 0x7f3c9a139460&gt;</p>
<pre><code>-&gt; 아까의 오류가 뜨지 않는다. 
이렇게 되면 우리는 접속이 잘 된 것이다.

---
### SMTP 4
**2. SMTP 메일 서버에 로그인한다.**</code></pre><p>smtp.login(이메일계정, 비밀번호)</p>
<pre><code>-&gt; 계정정보로 로그인 할 수 있다.
![](https://images.velog.io/images/mungge_jang322/post/222c0504-06c3-4a91-b696-0e1b5e39b9f2/image.png)
-&gt; 이렇게 깔끔하게 나오면 로그인이 잘 된 것이다.

**3. SMTP 메일 서버로 메일을 보낸다.**</code></pre><p>smtp.send_message()        // 메일을 보내는 함수
smtp.quit()                // smtp서버와의    연결 끊기</p>
<pre><code>
---
### Email Message - MIME
#### MIME란?
: 메일을 보낼 때 이런형태로 보낼거야~ 하는 약속같은 것이다.

SMTP는 그냥 문서의 말을 못알아듣는다.
그래서 MIME형태로 내용을 변경해서 SMTP한테 보내줘야 하는 것이다.

그 중 우리는 python에 내장되어있는 모듈인 email.message를 이용할 것이다.</code></pre><p>email.message 모듈
.EmailMessage 기능</p>
<pre><code>
**MIME형태로 만드는 과정**
1. 이메일을 담을 통을 만든다.
2. 이메일에 내용을 담는다.
3. 이메일 제목,발신자, 수신자를 설정한다.

**1. 이메일을 담을 통을 만든다.**</code></pre><p>EmailMessage()</p>
<pre><code>-&gt; 이메일을 MIME형태로 만들어주는 하나의 통을 만든 것이다.

**2. 이메일에 내용을 담는다.**
**코드**</code></pre><p>import smtplib
from email.message import EmailMessage</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465</p>
<p>message = EmailMessage()            // MIME 로 변환하는 통
message.set_content(&quot;코드라이언 수업중입니다.&quot;)    // 메일의 본문을 쓴 것.</p>
<p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login(&quot;###@gmail.com&quot;,&quot;######&quot;)
smtp.send_message()
smtp.quit()</p>
<pre><code>-&gt; 메일의 제목과 나머지 내용도 적어주자.

---
### Email Message - Header
**MIME에는 header 라는 것이 있다.**
- 이 header에는 subject, from, to가 있다.

**3. 이메일 제목, 발신자, 수신자를 설정한다.**
</code></pre><p>import smtplib
from email.message import EmailMessage</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465</p>
<p>message = EmailMessage()
message.set_content(&quot;코드라이언 수업중입니다.&quot;)</p>
<p>message[&quot;Subject&quot;] = &quot;이것은 제목입니다.&quot;
message[&quot;From&quot;] = &quot;###@gmail.com&quot;
message[&quot;To&quot;] = &quot;###@gmail.com&quot;</p>
<p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login(&quot;###@gmail.com&quot;,&quot;######&quot;)
smtp.send_message()
smtp.quit()</p>
<pre><code>
---
### 메일 전송하기


**전체 코드**</code></pre><p>import smtplib
from email.message import EmailMessage</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465</p>
<h1 id="메일을-담을-내용">메일을 담을 내용</h1>
<p>message = EmailMessage()</p>
<h1 id="메일-본문">메일 본문</h1>
<p>message.set_content(&quot;코드라이언 수업중입니다.&quot;)</p>
<h1 id="메일-제목-발신자-수신자">메일 제목, 발신자, 수신자</h1>
<p>message[&quot;Subject&quot;] = &quot;이것은 제목입니다.&quot;
message[&quot;From&quot;] = &quot;###@gmail.com&quot;
message[&quot;To&quot;] = &quot;###@gmail.com&quot;</p>
<h1 id="smtp서버와-ssl연결">smtp서버와 ssl연결</h1>
<p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)</p>
<h1 id="계정-로그인">계정 로그인</h1>
<p>smtp.login(&quot;###@gmail.com&quot;,&quot;######&quot;)</p>
<h1 id="메일-전송">메일 전송</h1>
<p>smtp.send_message(message)</p>
<h1 id="smtp-서버와의-연결-끊기">smtp 서버와의 연결 끊기</h1>
<p>smtp.quit()</p>
<pre><code>
---
### 메일에 사진 첨부하기 1

#### 이미지 파일 읽어오기
이미지를 컴퓨터가 읽을 수 있도록 표현한 것이 binary이다.
이런 binary파일은 jpg, png, exe, mp4, mov 같은 것들이 포함된다.

**open()함수 사용**</code></pre><p>rb -&gt; read binary
wb -&gt; write binary
ab -&gt; append binary</p>
<pre><code>**코드**</code></pre><p>image = open(&quot;codelion.png&quot;,&quot;rb&quot;)
print(image.read())</p>
<pre><code>**결과**
출력하게 되면 읽을 수 없는 문자들이 막 나온다.(binary파일)

---
### 메일에 사진 첨부하기 2
**multipart/mixed타입의 메일**
: 글만 있는 것이 아니라 다른 요소가 포함된 메일</code></pre><p>add_attachment(...)</p>
<pre><code>-&gt; 이 add_attachment()를 사용하려면 세가지가 필요하다.
1. image
2. maintype(우리가 첨부할 내용의 종류 like 비디오, 사진등)
3. subtype(확장자)

이미지의 확장자가 바뀌더라도 전송하는데 문제가 없도록 코드를 작성해보자.</code></pre><p>import imghdr</p>
<p>image_type = imghdr.what(&#39;codelion&#39;,image_file)</p>
<pre><code>-&gt; 위 모듈은 이미지파일의 확장자를 알 수 있게 해준다.

**전체 코드**</code></pre><p>import smtplib
from email.message import EmailMessage
import imghdr</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465</p>
<p>message = EmailMessage()
message.set_content(&quot;코드라이언 수업중입니다.&quot;)</p>
<p>message[&quot;Subject&quot;] = &quot;이것은 제목입니다.&quot;
message[&quot;From&quot;] = &quot;###@gmail.com&quot;
message[&quot;To&quot;] = &quot;###@gmail.com&quot;</p>
<p>with open(&quot;codelion.png&quot;,&quot;rb&quot;) as image:
    image_file = image.read()</p>
<p>image_type = imghdr.what(&#39;codelion&#39;,image_file)
message.add_attachment(image_file,maintype=&#39;image&#39;,subtype=image_type)        // 이렇게 확장자를 고정하지 않고 사용할 이미지의 확장자에 따라 유연하게 바뀌도록!</p>
<p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login(&quot;###@gmail.com&quot;,&quot;######&quot;)
smtp.send_message(message)
smtp.quit()</p>
<pre><code>
---
### 유효성 검사하기 1
이메일 주소의 유효성을 검사한다는 것은 그 이메일 주소가 정말 존재하는 이메일 주소인지 확인하는 것이다.

어떻게 확인하면 좋을까?
-&gt; 이럴때 사용하는 것이 정규표현식이다.

**정규표현식이란?**
: 쉽게 말해 문자열에서 나타나는 특정 패턴을 알아내서 대응시키기 위해 사용되는 표현식이다.

- 이메일 정규표현식
: 이메일에 나타나는 특정한 패턴을 조건으로 주고 이 문자열이 적합한지 아닌지 확인하는 것이다.

**정규표현식**
![](https://images.velog.io/images/mungge_jang322/post/99d5b8a5-1bc5-4147-b85b-5e9dafced8f6/image.png)

![](https://images.velog.io/images/mungge_jang322/post/03731675-10f0-4c60-8297-51c1cda385b3/image.png)
-&gt; 정규표현식에서 대괄호 안에 어떤 문자들이 있다면 이 대괄호는 대괄호 안에 포함된 문자 하나를 가리킨다.
-&gt; 대괄호 뒤 &#39;+&#39;는 앞에 내용이 1회 이상 반복된다는 뜻이다.
-&gt; 이 조건식에 부합하는 문자는 무엇이 있을까요?
ex) codelion.example - 부합한다.
문자는 a-z사이에 있고 .(점)도 포함이어서 부합하는 것이다.

![](https://images.velog.io/images/mungge_jang322/post/a1326a11-57db-49ae-b7b8-d4c45d30ba7e/image.png)


![](https://images.velog.io/images/mungge_jang322/post/2e81eef2-c9b1-4c72-b3cc-b343668038f1/image.png)

![](https://images.velog.io/images/mungge_jang322/post/a929efb7-74c7-447d-970b-9443dafc466d/image.png)
-&gt; 정규표현식으로써의 (.)점이아니라 실제 문자로써의 점이길 바래서 앞에 역슬래쉬(\)를 넣어준 것이다.

![](https://images.velog.io/images/mungge_jang322/post/397c88ac-e15c-4d84-8c5e-b88c533c8a1e/image.png)
-&gt; 중괄호 안 숫자는{최소값, 최대값}이다.


---
### 유효성 검사하기 2
정규표현식을 사용하기 위해서는 re(regular expression의 줄임말) 모듈을 import 해주어야 한다.</code></pre><p>re.match(정규표현식, 매칭할 내용)</p>
<pre><code>**코드**</code></pre><p>import re</p>
<p>reg = &quot;^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+.[a-zA-Z]{2,3}$&quot;    // 정규표현식
print(re.match(reg,&quot;<a href="mailto:codelion.example@gmail.com">codelion.example@gmail.com</a>&quot;))    // 매칭결과 출력</p>
<pre><code>
**결과**
![](https://images.velog.io/images/mungge_jang322/post/14f15746-feb8-4d9e-ba4a-b643383e0e85/image.png)

**매칭이 안됐을 때 결과**
![](https://images.velog.io/images/mungge_jang322/post/84cfd82a-d980-482c-8b16-8bfc013f7252/image.png)

---
### 유효성 검사하기 3
이메일 주소의 유효성을 검사하고 유효하다면 메일을 보내고 유효하지 않으면 메일을 보내지 않는 함수를 만들어 보자.
**함수**</code></pre><p>def sendEmail(addr):
    reg = &quot;^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+.[a-zA-Z]{2,3}$&quot;
    if bool(re.match(reg,addr)):
        smtp.send_message(message)
        print(&quot;정상적으로 메일이 발송되었습니다.&quot;)
    else:
        print(&quot;유효한 이메일 주소가 아닙니다.&quot;)</p>
<pre><code>
**전체 코드**</code></pre><p>import smtplib
from email.message import EmailMessage
import imghdr
import re</p>
<p>SMTP_SERVER = &quot;smtp.gmail.com&quot;
SMTP_PORT = 465</p>
<p>def sendEmail(addr):
    reg = &quot;^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+.[a-zA-Z]{2,3}$&quot;
    if bool(re.match(reg,addr)):
        smtp.send_message(message)
        print(&quot;정상적으로 메일이 발송되었습니다.&quot;)
    else:
        print(&quot;유효한 이메일 주소가 아닙니다.&quot;)</p>
<p>message = EmailMessage()
message.set_content(&quot;코드라이언 수업중입니다.&quot;)</p>
<p>message[&quot;Subject&quot;] = &quot;이것은 제목입니다.&quot;
message[&quot;From&quot;] = &quot;###@gmail.com&quot;
message[&quot;To&quot;] = &quot;###@gmail.com&quot;</p>
<p>with open(&quot;codelion.png&quot;,&quot;rb&quot;) as image:
    image_file = image.read()</p>
<p>image_type = imghdr.what(&#39;codelion&#39;,image_file)
message.add_attachment(image_file,maintype=&#39;image&#39;,subtype=image_type)</p>
<p>smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login(&quot;###@gmail.com&quot;,&quot;######&quot;)</p>
<h1 id="메일을-보내는-sendemail-함수를-호출">메일을 보내는 sendEmail 함수를 호출</h1>
<p>sendEmail(&quot;###gmailcom&quot;)
smtp.quit()</p>
<pre><code>**결과**</code></pre><p>정상적으로 메일이 발송되었습니다.
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[4일차] Python 기초]]></title>
            <link>https://velog.io/@mungge_jang322/4%EC%9D%BC%EC%B0%A8-Python-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@mungge_jang322/4%EC%9D%BC%EC%B0%A8-Python-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Thu, 24 Feb 2022 10:09:09 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter-1">Chapter 1</h1>
<h2 id="순차---차례대로-하나씩">순차 - 차례대로 하나씩</h2>
<h3 id="친구야-안녕-1---인사하기">친구야 안녕 1 - 인사하기</h3>
<ul>
<li>목표 : 친구와 만나 밥을 먹을거예요.</li>
<li><em>step 1.*</em> 친구의 이름을 입력받고, &quot;이름&quot;아 안녕!이라고 출력해보자.</li>
</ul>
<p>우리의 목표를 이루기 위해서는 python 의 기초 문법인 아래 기능들이 필요하다.</p>
<pre><code>input()        // 입력 - 사용자에게 어떠한 데이터를 입력 받아 컴퓨터에 저장해준다.
ex) a=input(&#39;숫자를 입력하세요&#39;)

print()        // 출력 - 컴퓨터에 들어있는 데이터를 사용자에게 출력해준다.</code></pre><p><strong>코드</strong></p>
<pre><code>name = input(&quot;이름을 입력해주세요: &quot;)

print(name + &quot;씨 안녕!!&quot;)</code></pre><p><strong>결과</strong></p>
<pre><code>이름을 입력해주세요: 장멍게
장멍게씨 안녕!!</code></pre><hr>
<h3 id="친구야-안녕-1---계산하기">친구야 안녕 1 - 계산하기</h3>
<ul>
<li>목표 : 친구와 만나 밥을 먹을거예요.</li>
<li><em>step 2.*</em> 친구와 먹은 가격을 더해서, 총 금액을 계산해 출력해보자.</li>
</ul>
<p><strong>코드</strong>
나와 친구가 먹은 음식 가격을 입력받아 더해서 출력해보자.</p>
<pre><code>food1 = input(&quot;내가 먹은 음식의 가격&quot;)
food2 = input(&quot;친구가 먹은 음식의 가격&quot;)

print(food1 + food2)</code></pre><p><strong>결과</strong></p>
<pre><code>내가 먹은 음식의 가격 : 5000
친구가 먹은 음식의 가격 : 7000
50007000</code></pre><p>-&gt; 우리가 생각한 결과가 아니다.</p>
<p>사실 우리가 사용하고 있는 이 input()은 모두 글자로 저장이 되고 있다.
즉, 우리가 숫자를 입력했다고 하지만 5000, 7000이라는 데이터는 모두 글자다.</p>
<blockquote>
<p>우리가 원했던 더하기를 하려면 어떻게 해야할까?</p>
</blockquote>
<pre><code>int()        // 글자를 숫자로 변환시켜준다.</code></pre><p>-&gt; 이런 것을 <strong>형변환</strong>이라 한다.</p>
<p><strong>최종 코드</strong></p>
<pre><code>food1 = input(&quot;내가 먹은 음식의 가격 : &quot;)
food2 = input(&quot;친구가 먹은 음식의 가격 : &quot;)

food1 = int(food1)        // 문자로 입력받은 food1값 숫자로 변경
food2 = int(food2)        // 문자로 입력받은 food2값 숫자로 변경

print(food1 + food2)</code></pre><p><strong>결과</strong></p>
<pre><code>내가 먹은 음식의 가격 : 5000
친구가 먹은 음식의 가격 : 7000
12000</code></pre><p>-&gt; 이제 결과가 우리가 생각한 대로 잘 나온다.</p>
<hr>
<h3 id="월세와-관리비">월세와 관리비</h3>
<p><strong>연산자</strong>
가장 기본적인 사칙연산(+, -, <em>, /)에 대해 알아보자.
*</em>코드(+,-)**</p>
<pre><code>print(10+20)
print(10-20)</code></pre><p><strong>결과</strong></p>
<pre><code>30
-10</code></pre><p><strong>월세와 관리비를 입력받아 더해보자.</strong></p>
<p><strong>코드</strong></p>
<pre><code>월세 = int(input(&quot;월세를 입력해주세요 : &quot;))
관리비 = int(input(&quot;관리비를 입력해주세요 : &quot;))

print(월세 + 관리비)</code></pre><p><strong>결과</strong></p>
<pre><code>월세를 입력해주세요 : 500000
관리비를 입력해주세요 : 100000
600000</code></pre><p><strong>사칙연산을 모두사용해보자.</strong>
<strong>코드</strong></p>
<pre><code>월세 = int(input(&quot;월세를 입력해주세요 : &quot;))
관리비 = int(input(&quot;관리비를 입력해주세요 : &quot;))

print(월세 + 관리비)
print(월세 - 관리비)
print((월세 + 관리비) * 12)
print(월세 / 관리비)</code></pre><p><strong>결과</strong></p>
<pre><code>월세를 입력해주세요 : 500000
관리비를 입력해주세요 : 100000
600000
400000
7200000
5.0</code></pre><hr>
<h3 id="중식당-주문-1---주문서-제작하기">중식당 주문 1 - 주문서 제작하기</h3>
<ul>
<li>목표 : 중식당에서 주문을 해봅시다. 나열한 순서대로 주문합니다.</li>
<li><em>step 1.*</em> 비어있는 주문서(list)를 만들어 &quot;orders&quot;라는 이름을 지어주세요.</li>
<li><em>코드*</em><pre><code>orders = []
</code></pre></li>
</ul>
<p>print(orders)</p>
<pre><code>**결과**</code></pre><p>[]</p>
<pre><code>
---
### 중식당 주문 2 - 작성하기
**step 2.** 순서대로 &quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;을 넣어주세요.
**코드**</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<pre><code>- 각 data를 **요소(elements)**라고 부른다.
- 각 data는 index로 구분된다.
    - 짜장: 0
    - 짬뽕: 1
    - 탕수육: 2

**코드**</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<p>print(orders[0])
print(orders[1])
print(orders[2])</p>
<pre><code>
**결과**</code></pre><p>짜장
짬뽕
탕수육</p>
<pre><code>
---
### 중식당 주문 3 - 추가하기
**step 3.** &quot;냉면&quot;을 첫번째로 추가해주세요.
#### &lt; list[]의 기능들 &gt;
##### 1. list[]에 data 추가하기</code></pre><p>append()    // 리스트의 맨 뒤에 추가된다.
insert()    // 리스트의 원하는 위치에 추가된다.</p>
<pre><code>**적용 코드**</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<p>orders.append(&quot;냉면&quot;)
orders.insert(3, &quot;양장피&quot;)
print(orders)</p>
<pre><code>
**결과**</code></pre><p>[&#39;짜장&#39;, &#39;짬뽕&#39;, &#39;탕수육&#39;, &#39;양장피&#39;, &#39;냉면&#39;]</p>
<pre><code>
---
### 중식당 주문 4 - 제거하기
**step 4.** 생각해보니 &quot;짬뽕&quot;이 안땡겨요. 삭제해주세요.
##### 2. list[] data 삭제하기</code></pre><p>del            //
ex) del 리스트이름[인덱스번호]
remove()    //
ex) 리스트이름.remove(value)</p>
<pre><code>
&gt; &#39;짬뽕&#39;을 삭제하라.

**적용 코드**
- remove활용</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<p>orders.remove(&quot;짬뽕&quot;)</p>
<p>print(orders)</p>
<pre><code>**결과**</code></pre><p>[&#39;짜장&#39;, &#39;탕수육&#39;]</p>
<pre><code>-&gt; 짬뽕이 삭제된 것을 확인 할 수 있다.

- del활용</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<p>del orders[1]</p>
<p>print(orders)</p>
<pre><code>
**결과**</code></pre><p>[&#39;짜장&#39;, &#39;탕수육&#39;]</p>
<pre><code>-&gt; 짬뽕이 삭제된 것을 확인 할 수 있다.

---
### 중식당 주문 5 - 계산하기
**step 5.** 주문서에 총 몇 개의 음식이 있나요?
##### 3. list[]의 길이 구하기</code></pre><p>len()</p>
<pre><code>**적용 코드**</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<p>print(len(orders))</p>
<pre><code>**결과**</code></pre><p>3</p>
<pre><code>
len()을 이용해 문자열의 길이도 알 수 있다.</code></pre><p>name = &quot;안녕하세요 코드라이언입니다.&quot;
print(len(name))</p>
<pre><code>**결과**</code></pre><p>15</p>
<pre><code>
---
### 숫자 리스트 1
- 목표: 숫자로 구성된 list를 만들어 보자.
**step 1.** 20, 40, 50, 10, 30으로 이루어진 이름이 num인 list를 만들어 주세요.
**코드**</code></pre><p>num = [20, 40, 50, 10, 30]</p>
<p>print(num)</p>
<pre><code>**결과**</code></pre><p>[20, 40, 50, 10, 30]</p>
<pre><code>
**step 2.** list 안의 숫자들의 전체 합을 출력해주세요.
**코드**</code></pre><p>num = [20, 40, 50, 10, 30]</p>
<p>add = num[0] + num[1] + num[2] + num[3] + num[4]
print(add)</p>
<pre><code>
**결과**</code></pre><p>150</p>
<pre><code>-&gt; 결과는 잘 나왔지만, 위처럼 일일이 더하면 요소가 100개, 1000개가 넘어가게 되면 불가능한 방법이다.
</code></pre><p>sum()</p>
<pre><code>-&gt; 위 함수를 사용하자.

**코드**</code></pre><p>num = [20, 40, 50, 10, 30, 100, 200]</p>
<p>add = sum(num)
print(add)</p>
<pre><code>
**결과**</code></pre><p>450</p>
<pre><code>
---
### 숫자 리스트 2
**step 3.** list 안의 숫자들의 평균을 출력해주세요.
평균 = (전체의합)/전체개수

**코드**</code></pre><p>num = [20, 40, 50, 10, 30]</p>
<p>print(sum(num) / len(num))</p>
<pre><code>
**결과**</code></pre><p>30.0</p>
<pre><code>**step 4.** 가장 큰 값과 가장 작은 값을 각각 출력해주세요.</code></pre><p>max()
min()</p>
<pre><code>**코드**</code></pre><p>num = [20, 40, 50, 10, 30]</p>
<p>print(max(num))
print(min(num))</p>
<pre><code>**결과**</code></pre><p>50
10</p>
<pre><code>-&gt; 이렇게 가장 큰 값과 작은 값을 찾아낼 수 있다.

---
### 중식당 메뉴판 1 - 제작하기
- 목표: 중식당 메뉴판을 만들어보자.
**step 1.** 비어있는 메뉴판(dictionary)를 만들어 &quot;menu&quot;라는 이름을 지어주세요.</code></pre><p>menu = {}</p>
<pre><code>-&gt; 딕셔너리는 중괄호를 이용해 생성할 수 있다.

**step 2.** 메뉴판에 음식 이름과 가격을 넣어 메뉴판을 만들어 주세요.
![](https://images.velog.io/images/mungge_jang322/post/d0950fae-d99d-45e4-9ea9-fab902a4ae25/image.png)
위 내용을 코드로 변경하면 아래와 같다.</code></pre><p>menu = {&quot;짜장&quot;: 4000,&quot;짬뽕&quot;: 5000, &quot;탕수육: 9000}</p>
<p>print(menu)</p>
<pre><code>**결과**</code></pre><p>{&#39;짜장&#39;: 4000, &#39;짬뽕&#39;: 5000, &#39;탕수육&#39;: 9000}</p>
<pre><code>-&gt; 결과가 잘 나오는 것을 볼 수 있다.

---
### 중식당 메뉴판 2 - 수정하기
**step 3.** 새로운 메뉴 &quot;냉면&quot;을 메뉴판에 추가해주세요.</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>menu[&quot;냉면&quot;] = 6000</p>
<p>print(menu)</p>
<pre><code>
**결과**</code></pre><p>{&#39;짜장&#39;: 4000, &#39;짬뽕&#39;: 5000, &#39;탕수육&#39;: 9000, &#39;냉면&#39;: 6000}</p>
<pre><code>-&gt; 잘 추가된 것을 확인 할 수 있다.


**step 4.** &quot;짬뽕&quot;의 가격이 얼마죠? &quot;짬뽕&quot;의 가격을 출력해 주세요.</code></pre><p>print(딕셔너리이름[key값])</p>
<pre><code>**코드**</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>print(menu[&quot;짬뽕&quot;])</p>
<pre><code>
**결과**</code></pre><p>5000</p>
<pre><code>
**step 5.** 생각보다 탕수육이 비싼 것 같아요. 탕수육의 가격을 8500원으로 변경해주세요.

기존 value를 변경할 때도 추가하는 것과 구성은 똑같다.
즉, key값이 존재하면 value값 변경이 되는 것이고, key값이 존재하지 않으면 추가가 되는 것이다.

**코드**</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>menu[&quot;탕수육&quot;] = 8500</p>
<p>print(menu)</p>
<pre><code>
**결과**</code></pre><p>{&#39;짜장&#39;: 4000, &#39;짬뽕&#39;: 5000, &#39;탕수육&#39;: 8500}</p>
<pre><code>
---
### 중식당 메뉴판 3 - 완성하기
**step 6.** 준비해둔 &quot;짜장&quot;재료가 다 떨어졌어요. &quot;짜장&quot;을 메뉴판에서 삭제해 주세요.
**코드**</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>del menu[&quot;짜장&quot;]</p>
<p>print(menu)</p>
<pre><code>**결과**</code></pre><p>{&#39;짬뽕&#39;: 5000, &#39;탕수육&#39;: 9000}</p>
<pre><code>
**step 7.** 완성된 메뉴판 전체를 출력해 주세요.
**코드**</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>menu[&quot;냉면&quot;] = 6000</p>
<p>print(menu[&quot;짬뽕&quot;])</p>
<p>menu[&quot;탕수육&quot;] = 8500</p>
<p>del menu[&quot;짜장&quot;]</p>
<p>print(menu)</p>
<pre><code>**결과**</code></pre><p>5000
{&#39;짬뽕&#39;: 5000, &#39;탕수육&#39;: 8500, &#39;냉면&#39;: 6000}</p>
<pre><code>
---
# Chapter 2
## 조건 - 상황에 다르게
### 학번 계산기 1 - 관계 연산자
- 목표: 나와 동료의 학번을 입력하고, 호칭을 정해보자.

**step 1.** 나와 동료의 학번을 입력받아서 비교해봅시다.
- 조건: 하나의 수식을 이야기 하는데, 결과가 True 혹은 False로만 이루어져 있다.

**관계연산자 종류**</code></pre><p>a==b        // a와 b가 같니?
a!=b        // a와 b가 다르니?
a&lt;b            // a가 b보다 작니?
a&gt;b            // a가 b보다 크니?
a&lt;=b        // a가 b보다 작거나 같니?
a&gt;=b        // a가 b보다 크거나 같니?</p>
<pre><code>
---
### 학번 계산기 2 - 관계 연산자
**코드**</code></pre><p>myGrade = int(input(&quot;학번을 입력하세요 : &quot;))
yourGrade = int(input(&quot;학번을 입력하세요 : &quot;))</p>
<p>print(myGrade != yourGrade)
print(myGrade == yourGrade)
print(myGrade &gt; yourGrade)
print(myGrade &lt; yourGrade)
print(myGrade &gt;= yourGrade)
print(myGrade &lt;= yourGrade)</p>
<pre><code>
**결과**</code></pre><p>학번을 입력하세요 : 15
학번을 입력하세요 : 17
True
False
False
True
False
True</p>
<pre><code>

---
### 학번 계산기 3 - 학번 비교하기
**step 2.** 동료의 학번이 나와 같다면, &quot;앗!동기네요&quot;라고 출력해봅시다.</code></pre><p>if 조건:
    실행할 코드</p>
<pre><code>-&gt; if는 조건문 사이에 스페이스로 한칸 띄어줘야 하고 실행할 코드는 tab을 이용해 띄워줘야 한다.

---
### 학번 계산기 4 - 인사하기
**step 3.** 동료의 학번에 따라 호칭을 다르게 인사 해봅시다.
(e.g.안녕하세요(후배님/동기님/선배님)
**코드**</code></pre><p>myGrade = int(input(&quot;학번을 입력하세요 : &quot;))
yourGrade = int(input(&quot;학번을 입력하세요 : &quot;))</p>
<p>if myGrade == yourGrade :
    print(&quot;앗 동기네요!&quot;)
    print(&quot;반갑습니다.&quot;)</p>
<pre><code>
**결과**</code></pre><p>학번을 입력하세요 : 10
학번을 입력하세요 : 10
앗 동기네요!
반갑습니다.</p>
<pre><code>
---
### 학번 계산기 5 - 동기에게 인사하기
- 조건문을 사용해 나의 동기라면 인사를 해보자.
</code></pre><p>myGrade = int(input(&quot;학번을 입력하세요 : &quot;))
yourGrade = int(input(&quot;학번을 입력하세요 : &quot;))</p>
<p>if myGrade == yourGrade :
    print(&quot;앗 동기네요!&quot;)
else :
    print(&quot;앗 동기가 아니네요!&quot;)</p>
<pre><code>
---
### 학번 계산기 6 - 다르게 인사하기
- 여러개의 조건문 </code></pre><p>if 조건:
    True일때 실행될 코드
elif 조건:
    위에있는 if가 False이고, elif 조건이 True일때 실행될 코드
else:
    모든 조건문이 False일때 실행될 코드</p>
<pre><code>
**코드**</code></pre><p>myGrade = int(input(&quot;학번을 입력하세요 : &quot;))
yourGrade = int(input(&quot;학번을 입력하세요 : &quot;))</p>
<p>if myGrade == yourGrade :        // 나의 학번과 동료 학번이 같으면
    print(&quot;안녕하세요 동기님!&quot;)
elif myGrade &lt; yourGrade :        // 나의 학번이 동료 학번보다 높으면
    print(&quot;안녕하세요 선배님!&quot;)
elif myGrade &gt; yourGrade :        // 나의 학번이 동료 학번보다 낮으면
    print(&quot;안녕하세요 후배님!&quot;)
else :                            // 위 세가지 경우가 다 아니라면
    print(&quot;누구세요?&quot;)</p>
<pre><code>
---
### 지금 주문 되나요? 1</code></pre><p>if + list 조합을 사용해보자.</p>
<pre><code>
**코드**</code></pre><p>orders = [&quot;짜장&quot;, &quot;짬뽕&quot;, &quot;탕수육&quot;]</p>
<p>food = input(&quot;먹고싶은 메뉴를 입력해주세요 : &quot;)</p>
<p>if food in orders :                // 리스트의 요소들과 food 비교 
    print(&quot;주문할 수 있습니다.&quot;)
else :
    print(&quot;주문할 수 없습니다.&quot;)</p>
<pre><code>-&gt; 위에 &#39;if food in orders:&#39; 처럼 작성하게 되면 &#39;orders라는 리스트안에 food가 존재한다면&#39; 이라는 조건문이 된다.

**결과**</code></pre><p>//짜장을 입력했을 때
먹고싶은 메뉴를 입력해주세요 : 짜장
주문할 수 있습니다.                //짜장은 리스트 요소에 포함되어 있기 때문에 가능
//냉면을 입력했을 때
먹고싶은 메뉴를 입력해주세요 : 냉면
주문할 수 없습니다.                //냉면은 리스트 요소에 없기 때문에 불가능</p>
<pre><code>
---
### 지금 주문 되나요? 2</code></pre><p>if + dict 조합을 사용해보자.</p>
<pre><code>- dict는 dictionary를 뜻한다.

**코드**</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>food = input(&quot;먹고싶은 메뉴를 입력해주세요 : &quot;)</p>
<p>if food in menu :
    print(&quot;주문 가능&quot;)
else :
    print(&quot;주문 불가&quot;)</p>
<pre><code>
**결과**</code></pre><p>// 짜장 입력했을 때
먹고싶은 메뉴를 입력해주세요 : 짜장
주문 가능
// 냉면 입력했을 때
먹고싶은 메뉴를 입력해주세요 : 냉면
주문 불가</p>
<pre><code>
**이번엔 먹고 싶은 음식의 가격을 출력해보자.**

**코드**</code></pre><p>menu = {&quot;짜장&quot; : 4000, &quot;짬뽕&quot; : 5000, &quot;탕수육&quot; : 9000}</p>
<p>food = input(&quot;먹고싶은 메뉴를 입력해주세요 : &quot;)</p>
<p>if food in menu :
    print(menu[food], &quot;원 입니다.&quot;)
else :
    print(&quot;주문 불가&quot;)</p>
<pre><code>
**결과**</code></pre><p>먹고싶은 메뉴를 입력해주세요 : 짬뽕
5000 원 입니다.</p>
<pre><code>
---
# Chapter 3
## 반복 - 일정한 패턴으로 반복
### 무한반복</code></pre><p>while문
: ~하는 동안에
-&gt; 조건이 True인 동안에 계속 실행해라.</p>
<pre><code>![](https://images.velog.io/images/mungge_jang322/post/272c1e4a-19bf-4f88-9779-9905e7e48788/image.png)

**코드**</code></pre><p>while 10 &lt; 90 :
    print(&quot;True&quot;)</p>
<pre><code>
**결과**
-&gt; 위 코드에서 while문의 조건이 항상 참이기 때문에 &#39;True&#39;가 무한반복해서 출력된다.
-&gt; 멈추려면 Ctrl + c 를 입력하면 된다.

---
### 순차출력
무한반복의 경우는 특별한 경우가 아닌 이상 쓸 곳이 별로 없다.

무한반복이 아닌 6번만 출력하도록 해보자.
**코드**</code></pre><p>i = 0</p>
<p>while i &lt; 6 :
    print(i)
    i = i + 1</p>
<pre><code>
**결과**</code></pre><p>0
1
2
3
4
5</p>
<pre><code>역순으로도 출력해보자.
**코드**</code></pre><p>i = 5</p>
<p>while i &gt;= 0 :
    print(i)
    i = i - 1</p>
<pre><code>
**결과**</code></pre><p>5
4
3
2
1
0</p>
<pre><code>---
### 탈출하기
반복문을 빠져나갈 때 사용하는 것이 있다. 그것이 바로 break문이다.</code></pre><p>break</p>
<pre><code>
**코드**
if문을 사용해서 특정조건에 break문을 사용해 무한 반복문을 빠져나오게 해보자.</code></pre><p>i = 0
while True :
    print(i)
    i = i + 1</p>
<pre><code>if i &gt;= 3 :
    print(&quot;if문 동작&quot;)
    break</code></pre><p>print(&quot;반복문 종료!&quot;)</p>
<pre><code>
**결과**</code></pre><p>0
1
2
if문 동작
반복문 종료!</p>
<pre><code>
---
### 건너뛰기
반복문을 빠져나가는 것이 아니라 continue문을 만나면 다시 반복문의 조건을 확인하러 올라간다.</code></pre><p>continue</p>
<pre><code>![](https://images.velog.io/images/mungge_jang322/post/5d0fc63c-0c95-4bc5-801b-aa33c00a83c8/image.png)

**코드**</code></pre><p>i = 0
while i &lt; 10 :
    i = i + 1</p>
<pre><code>if i % 2 == 0 :        // 2의 배수라면
    continue        // 아래 print 코드가 동작되기 전에 다시 while 조건문을 확인한다.
print(i)</code></pre><p>print(&quot;반복 종료!&quot;)</p>
<pre><code>-&gt; 2의 배수가 아닌 즉, 홀수만 출력되도록 작성된 코드이다.

**결과**</code></pre><p>1
3
5
7
9
반복 종료!</p>
<pre><code>
---
### x까지 반복
**for문**</code></pre><p>for 변수 in 시퀀스:
    실행될 코드</p>
<pre><code>**시퀀스란?**
: 어떠한 순서를 가지고 있는 데이터의 집합을 말한다.
ex) 튜플, 리스트 등

**코드**</code></pre><p>for x in [10, 20, 30]:
    print(x)</p>
<pre><code>
**결과**</code></pre><p>10
20
30</p>
<pre><code>-&gt; 시퀀스(리스트)의 끝을 만나게 되면 그때 반복을 멈추게 된다.

---
### x부터 y까지 반복</code></pre><p>range(시작숫자, 종료숫자, 스텝)</p>
<pre><code>- 시작숫자와 스텝은 생략이 가능하다. 
- 종료숫자만 입력될 경우 0~종료숫자 이렇게 범위 형성이 된다.
- 시작숫자, 종료숫자를 입력하게 되면 시작숫자~종료숫자까지의 범위 형성이 된다.

**코드**</code></pre><p>for x in range(10) :
    print(x)</p>
<pre><code>**결과**</code></pre><p>0
1
2
3
4
5
6
7
8
9</p>
<pre><code>-&gt; 0부터 종료숫자(10) 전까지 나오는 것을 볼 수 있다.

---
### x부터 y까지 z만큼 반복</code></pre><p>range(시작숫자, 종료숫자, 스텝)</p>
<pre><code>- 시작숫자와 스텝은 생략이 가능하다. 
- 종료숫자만 입력될 경우 0~종료숫자 이렇게 범위 형성이 된다.
- 시작숫자, 종료숫자를 입력하게 되면 시작숫자~종료숫자까지의 범위 형성이 된다.
- 시작숫자, 종료숫자, 스텝을 모두 입력하게 되면 시작숫자~종료숫자까지 스텝만큼증가 하게 된다.

**코드**</code></pre><p>for x in range(10, 20, 2) :     // 10~20까지 2씩 증가하며 반복
    print(x)</p>
<pre><code>
**결과**</code></pre><p>10
12
14
16
18</p>
<pre><code>
---
### 100까지의 합
1부터 100까지 모두 더하는 프로그램을 작성해보자.
**코드**</code></pre><p>result = 0</p>
<p>for x in range(1, 101) :
    result = result + x</p>
<p>print(result)</p>
<pre><code>**결과**</code></pre><p>5050</p>
<pre><code>
1부터 10까지 곱해보자.

**코드**</code></pre><p>result = 1</p>
<p>for x in range(1, 11) :
    result = result * x</p>
<p>print(result)</p>
<pre><code>
**결과**</code></pre><p>3628800</p>
<pre><code>
---
# Chapter 4
## 직접 풀어보기
### 별이 빛나는 밤
**1. 세로로 별 5개를 찍어보자.**
**코드**</code></pre><p>for i in range(5):
    print(&quot;*&quot;)</p>
<pre><code>
**결과**</code></pre><p>*
*
*
*
*</p>
<pre><code>
**2. 별을 가로로 10개 찍어보자.**
**코드**</code></pre><p>for x in range(10) :
    print(&quot;*&quot;, end=&quot;&quot;)</p>
<pre><code>-&gt; end옵션을 사용하면 그 뒤의 출력값과 이어서 출력한다. (즉, 줄바꿈을 하지 않게 된다.)

**결과**</code></pre><hr>
<pre><code>
**&lt; 문제 1 &gt;**
다음과 같이 출력하는 코드를 작성해보자.</code></pre><hr>
<hr>
<hr>
<hr>
<hr>
<pre><code>**코드**</code></pre><p>for x in range(5):
    for y in range(5):
        print(&quot;*&quot;, end=&quot;&quot;)
    print()</p>
<pre><code>
**&lt; 문제 2 &gt;**
다음과 같이 출력하는 코드를 작성해보자.</code></pre><p>*
**</p>
<hr>
<hr>
<hr>
<pre><code>
**코드**</code></pre><p>for x in range(1,6):
    for y in range(x):
        print(&quot;*&quot;, end=&quot;&quot;)
    print()</p>
<pre><code>
---
### 줄 바꿔 출력하기
변수 x에 숫자를 입력받아 1부터 x까지의 숫자 모두 출력하기
ex) x에 5를 입력받아 1,2,3,4,5를 출력하는 코드

**코드**</code></pre><p>x = int(input(&#39;숫자를 입력해주세요&#39;))</p>
<p>for i in range(x):
    print(i+1)</p>
<pre><code>
**결과**</code></pre><p>숫자를 입력해주세요5
1
2
3
4
5</p>
<pre><code>
**&lt; 문제 1 &gt;**
변수 x에 숫자를 입력받아 1부터 x까지의 숫자 모두 출력하는데 10개를 1줄로 구성해서 출력하기
ex) 30을 입력했다면,
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30

**코드**</code></pre><p>x = int(input(&#39;숫자를 입력해주세요&#39;))</p>
<p>for i in range(x):
    if ((i+1) % 10)==0:
        print(i+1)
    else:
        print(i+1, end= &quot; &quot;)</p>
<pre><code>
**결과**</code></pre><p>숫자를 입력해주세요30
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30</p>
<pre><code>
---
### 오늘의 당첨번호
**로또 번호를 선택하는 방법!**
**step1.** 1부터 45까지 숫자가 하나씩

**step2.** 이 중 아무거나 6개를 선택

**random 사용법**</code></pre><p>random.sample(랜덤범위, 개수)</p>
<pre><code>-&gt; random기능을 사용하기 위해서는 import 해야한다.

**코드**
- 1부터 100까지 숫자 중에 10개를 랜덤으로 출력해보자.</code></pre><p>import random</p>
<p>randomNumber = random.sample(range(1, 100), 10)
print(randomNumber)</p>
<pre><code>-&gt; 1부터 50까지 3개를 뽑고 싶으면 아래같이 변경하면 된다.</code></pre><p>randomNumber = random.sample(range(1, 50), 3)</p>
<pre><code>
**결과**</code></pre><p>[87, 42, 10, 84, 59, 23, 72, 34, 61, 88]</p>
<pre><code>-&gt; 1부터 100까지 숫자 중에 10개의 숫자가 랜덤으로 출력된 것을 확인 할 수 있다.

**문제**
1. 사용자에게 로또를 몇 개 살건지 숫자 입력
2. 1부터 45까지 숫자 중 6개를 랜덤으로 뽑기
3. 사용자에게 입력받은 개수만큼 2를 뽑기
4. 오름차순으로 정렬해서 출력하기

**코드**</code></pre><p>import random</p>
<p>lotto_count = int(input(&#39;로또를 몇 개 살건가요?&#39;))</p>
<p>for i in range(lotto_count):
    randomNumber = random.sample(range(1, 46), 6)
    randomNumber.sort()
    print(randomNumber)</p>
<pre><code>
**결과**</code></pre><p>로또를 몇 개 살건가요?2
[9, 11, 14, 23, 35, 38]
[14, 17, 25, 36, 37, 43]</p>
<pre><code>
---
# Chapter 5
## 같이 풀어보기
### 별이 빛나는 밤 - 해설
&gt; 아래 결과를 출력하는 여러가지 방법을 알아보자.

**결과 1**</code></pre><hr>
<pre><code>
**방법 1**</code></pre><p>print(&quot;*****&quot;)</p>
<pre><code>
**방법 2**</code></pre><p>for x in range(5) :
    print(&quot;*&quot;, end=&quot;&quot;)</p>
<pre><code>
**방법 3**</code></pre><p>print(&quot;*&quot; * 5)</p>
<pre><code>
**결과 2**</code></pre><hr>
<hr>
<hr>
<hr>
<hr>
<pre><code>**방법 1**</code></pre><p>for x in range(5) :
    print(&quot;*&quot; * 5)</p>
<pre><code>
**결과 3**</code></pre><p>*
**</p>
<hr>
<hr>
<hr>
<pre><code>
**방법 1**</code></pre><p>for x in range(5) :
    print(&quot;*&quot; * (x + 1))</p>
<pre><code>
---
### 줄 바꿔 출력하기 - 해설

**결과 1**
x에 5를 입력했을 때 </code></pre><p>5
4
3
2
1</p>
<pre><code>
**방법 1**</code></pre><p>x = int(input(&quot;숫자를 입력하세요 : &quot;))</p>
<p>for i in range(x, 0, -1) :
    print(i)</p>
<pre><code>

**결과 2**
x에 30을 입력했을 때</code></pre><p>1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30</p>
<pre><code>**방법 1**</code></pre><p>x = int(input(&quot;숫자를 입력하세요 : &quot;))</p>
<p>for i in range(x) :
    if i % 10 == 0 :
        print()
    print(i+1, end=&quot;&quot;)</p>
<p>print()</p>
<pre><code>
**방법 2**
좀 더 깔끔한 출력을 위해 /t사용
- /t는 한 탭을 띄워준다는 의미이다.</code></pre><p>x = int(input(&quot;숫자를 입력하세요 : &quot;))</p>
<p>for i in range(x) :
    if i % 10 == 0 :
        print()
    print(i+1, end=&quot;\t&quot;)</p>
<p>print()</p>
<pre><code>---
### 오늘의 당첨 번호 - 해설
**문제**
1. 사용자에게 로또를 몇 개 살건지 숫자 입력
2. 1부터 45까지 숫자 중 6개를 랜덤으로 뽑기
3. 사용자에게 입력받은 개수만큼 2를 뽑기
4. 오름차순으로 정렬해서 출력하기


**방법 1**</code></pre><p>import random</p>
<p>count = int(input(&quot;로또를 몇개 구매하시겠습니까? &quot;))</p>
<p>for i in range(count) :
    lotto = random.sample(range(1, 46), 6)
    lotto.sort()
    print(lotto)</p>
<p>print(&quot;로또 종료&quot;)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[3일차] Javascript]]></title>
            <link>https://velog.io/@mungge_jang322/3%EC%9D%BC%EC%B0%A8-Javascript</link>
            <guid>https://velog.io/@mungge_jang322/3%EC%9D%BC%EC%B0%A8-Javascript</guid>
            <pubDate>Wed, 23 Feb 2022 14:47:27 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter-1">Chapter 1</h1>
<h2 id="javascript를-배워야-하는-이유">Javascript를 배워야 하는 이유</h2>
<p><strong>1. 문법이 쉽고 직관적이어서 초보자도 배우기 좋다.</strong></p>
<ul>
<li>실제 웹사이트 화면에서 내가 작성한 코드에 결과를 확인하면서 훨씬 재미있게 배울 수 있다.</li>
</ul>
<p><strong>2. 배워 놓으면 활용할 수 있는 범위가 매우 넓다.</strong></p>
<ul>
<li>웹 서비스를 구성하는 프론트엔드라고 불리는 화면 부분부터 뒷단의 백엔드 서버, DataBase까지 모두 Javascript 언어를 이용해서 만들 수 있다.</li>
<li>스마트폰 앱도 안드로이드, IOS에서 둘 다 동작할 수 있는 앱을 만들 수 있다.</li>
<li>심지어 PC에서 사용할 수 있는 프로그램, IoT기기, VR/AR까지 정말 다양한 분야의 개발에 Javascript가 사용된다.</li>
</ul>
<p><strong>3. 정말 많은 사람들이 사용하는 언어이다.</strong></p>
<ul>
<li>많은 사람들이 사용하다 보니 참고 할 수 있는 양질의 오픈소스 코드가 많이 있으며 어려운 기능을 쉽게 사용할 수 있도록 잘 만들어진 라이브러리도 굉장히 많다.</li>
<li>따라서 웬만한 기능은 직접 코드로 구현하지 않아도 가져다 쓰는 것만으로도 쉽게 구현이 가능하다.</li>
<li>게다가 코딩을 하다가 막히는 부분이 있을 때 인터넷 검색 시 stackoverflow 등 질의 응답 사이트에 질문도 많고 답변도 많고 또 새로운 질문에 답변해 줄 사람도 많아서 막히는 부분에 대한 답을 쉽게 찾을 수 있다.</li>
<li>기업에서도 많이 사용하여 관련 일자리가 많아 취업에 상당히 유리할 수 있다.</li>
</ul>
<hr>
<h1 id="chapter-2">Chapter 2</h1>
<h2 id="javascript로-만드는-로또-번호-추첨기">Javascript로 만드는 [로또 번호 추첨기]</h2>
<h3 id="javascript-사용-방법">Javascript 사용 방법</h3>
<h4 id="1-html">1. html</h4>
<ul>
<li>html 파일 내부에서 작성 가능하다.</li>
<li>코드는 위에서부터 아래로 읽기때문에 보통 html파일을 모두 불러오고 난 다음에 동작시키는 경우가 많아서, body태그가 끝나는 지점 바로 위쪽에 작성해 주는 경우가 많다.</li>
<li>자바 스크립트 코드를 작성하려면 script라는 태그로 감싸고 작성을 해야 이 코드가 자바 스크립트 코드다 라는 것이 인식이 된다.</li>
</ul>
<p><strong>작성 형식</strong></p>
<pre><code>&lt;body&gt;
...
&lt;script&gt;
javascript code
...
&lt;/script&gt;
&lt;/body&gt;</code></pre><ul>
<li>처음으로 알아볼 자바스크립트 코드는 다음과 같다.</li>
</ul>
<pre><code>document.write()        //괄호 안에 원하는 문자열을 입력하면 화면에 출력이 가능하다.</code></pre><p><strong>코드 예시</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;JavaScript 사용 방법&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;JavaScript 사용 방법&lt;/h1&gt;
    &lt;script&gt;
        document.write(&#39;코드라이언 짱짱&#39;)
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/3418c5c6-06cf-4d91-b4b9-f998fef99cd2/image.png" alt=""></p>
<h4 id="2-js-파일">2. js 파일</h4>
<ul>
<li>별도의 javascript파일로 작성할 수 있다.</li>
</ul>
<p><strong>js파일 코드(myScript.js)</strong></p>
<pre><code>document.write(&#39;코드라이언 짱짱&#39;)</code></pre><p><strong>html파일 코드(index.html)</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;JavaScript 사용 방법&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;JavaScript 사용 방법&lt;/h1&gt;
    &lt;script src=&#39;myScript.js&#39;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/f500ad18-2507-4c4d-8b84-fd8328c18c8d/image.png" alt=""></p>
<ul>
<li>html에 직접 작성할 때와 동일한 결과가 나온다.</li>
</ul>
<hr>
<h3 id="세미콜론과-주석">세미콜론(;)과 주석</h3>
<h4 id="세미콜론이란">세미콜론(;)이란?</h4>
<p>: 보통 프로그래밍 언어에서 하나의 명령어가 끝났다는 의미로 사용되는 기호이다.</p>
<p><strong>예시</strong></p>
<pre><code>&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;script&gt;
        // 자바스크립트 코드 시작
        document.write(&#39;안녕&#39;);
        document.write(&#39;하이&#39;);
        // 자바스크립트 코드 종료
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>하지만 자바스크립트는 유연한 언어여서 세미콜론을 적어주지 않아도 줄바꿈만으로도 각각 하나의 명령어로 인식한다.</li>
<li>그러나 만약에 두 줄의 코드가 한 줄로 붙어버리게 되면 아무것도 출력되지 않는다. 따라서 이 때는 세미콜론을 꼭 붙여주어야 한다.</li>
</ul>
<h4 id="주석">주석</h4>
<p><strong>주석의 용도</strong></p>
<ol>
<li>코드 설명을 적어줄 때</li>
<li>코드를 동작시키고 싶지 않을 때</li>
</ol>
<p><strong>한줄 주석 예시</strong></p>
<ul>
<li>// 사용<pre><code>&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;script&gt;
      //&#39;안녕&#39;을 출력하는 코드
      document.write(&#39;안녕&#39;);
      //document.write(&#39;하이&#39;);
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></li>
<li>두개의 슬러쉬를 연달아 쓴다.</li>
<li>뒤에 나오는 코드의 설명을 적을 수도 있다.</li>
<li>코드 앞에 슬러쉬를 넣게 되면 컴퓨터가 읽을 수가 없는 코드가 되어 그 코드는 실행되지 않는다.</li>
</ul>
<p><strong>여러 줄 주석 예시1</strong></p>
<ul>
<li>/* */<pre><code>&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;script&gt;
      /* document.write(&#39;안녕&#39;);
      document.write(&#39;하이&#39;);  */
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></li>
<li><em>여러 줄 주석 예시2**
```
/</em>
   작성자 : 장멍게
   작성년도 : 2022년</li>
<li>/
```</li>
<li>여러줄의 코드를 한번에 주석처리하고 싶을 때 사용한다.</li>
<li>작성자, 작성년도 등 코드를 작성한 사람과 날짜의 정보를 넣을 때 쓰기도 한다.</li>
</ul>
<hr>
<h3 id="데이터-상자-만들기">데이터 상자 만들기</h3>
<ul>
<li>자바스크립트에서는 variable(변수)의 앞글자를 따서 var를 사용한다.</li>
<li><em>예시*</em><pre><code>var 변수명 = 값;</code></pre></li>
<li><em>참고*</em></li>
<li>최신 자바스크립트 문법 ES6문법에서는 &#39;let&#39;이나 &#39;const&#39;같은 단어를 앞에 써주기도 한다.<pre><code>let 변수명 = 값;
const 변수명 = 값;</code></pre></li>
<li>위와 같이도 변수 선언이 가능하다.</li>
</ul>
<p><strong>자료형의 종류</strong></p>
<p><strong>1. 문자열(String)</strong></p>
<ul>
<li>이름이나 문장의 경우 문자열 자료형 사용</li>
<li>(&#39;&#39;)작은따옴표나 (&quot;&quot;)큰 따옴표로 감싸서 사용</li>
</ul>
<p><strong>2. 숫자(int, float)</strong></p>
<ul>
<li>정수형(int), 실수형(float)이 있다.</li>
</ul>
<p><strong>3. 불(bool)</strong></p>
<ul>
<li>참인지 거짓인지 구분하는 자료형</li>
<li>true이거나 false 둘 중 하나이다.</li>
</ul>
<p><strong>데이터의 자료형 알아내는 명령어</strong></p>
<pre><code>typeof 데이터</code></pre><p><strong>코드 예시</strong></p>
<pre><code>&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;script&gt;
        var name = &#39;장멍게&#39;;
        document.write(name);
        document.write(typeof name);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/e5636685-c77b-4e1c-8c6e-d7380bdd8c02/image.png" alt=""></p>
<hr>
<h3 id="로또-번호-추첨기-1">로또 번호 추첨기 1</h3>
<p><strong>랜덤 숫자 뽑는 함수</strong></p>
<pre><code>Math.random();        // 0이상 1미만 실수(float)를 랜덤으로 추출</code></pre><p><strong>코드예시</strong></p>
<ul>
<li>body태그 내부 자바스크립트 코드이다.<pre><code>&lt;body&gt;
  &lt;h1&gt;로또 번호 추첨기 1&lt;/h1&gt;
  &lt;script&gt;
      var num = Math.random();
      document.write(num);
  &lt;/script&gt;
&lt;/body&gt;</code></pre></li>
<li><blockquote>
<p>랜덤으로 숫자를 뽑아 출력하는 예시 코드이다.</p>
</blockquote>
</li>
<li>우리는 로또 번호추첨을 위해 1~45까지의 숫자를 랜덤으로 뽑아야 하기 때문에 다음과 같이 코드를 변경해서 사용하도록 하자.<pre><code>Math.random()*45;        // 0이상 45미만 실수(float)
Math.random()*45+1;        // 1이상 46미만 실수(float)</code></pre></li>
<li>우리는 실수형 자료형이 아니라 정수형 자료형을 뽑을 것이기 때문에 다음과 같이 실수를 정수로 변환해야 한다.<pre><code>parseInt();        //소수점을 버리고 정수로 변환하는 함수</code></pre><pre><code>parseInt(Math.random()*45+1);    // 1이상45이하 정수(int)로 변환</code></pre></li>
<li><em>최종 랜덤 숫자 뽑기 코드*</em><pre><code>&lt;body&gt;
   &lt;h1&gt;로또 번호 추첨기 1&lt;/h1&gt;
   &lt;script&gt;
       var num = Math.random()*45+1;
       var ball1 = parseInt(num);
       document.write(ball1);
   &lt;/script&gt;
&lt;/body&gt;</code></pre></li>
</ul>
<hr>
<h3 id="로또-번호-추첨기-2">로또 번호 추첨기 2</h3>
<ul>
<li>여섯개의 공을 나타내는 변수 선언<pre><code>var ball1 = 1;
var ball2 = 2;
var ball3 = 3;
...
var ball6 = 6;</code></pre></li>
<li><blockquote>
<p>그러나 변수가 많아지면 일일이 선언하기 너무 힘들어진다.
따라서, <strong>배열(Array)</strong>이라는 자료형의 변수를 사용해보자.</p>
</blockquote>
</li>
</ul>
<p><strong>자바스크립트에서 배열 선언하기</strong></p>
<ul>
<li><p><strong>예시</strong></p>
<pre><code>var lotto = [1,2,3,4,5,6];</code></pre></li>
<li><blockquote>
<p>대괄호 안에 값을 넣고 콤마로 구분해주면 된다.</p>
</blockquote>
</li>
<li><p>그리고 그 안의 값을 꺼내올 때는 위치번호(인덱스(index)라고 부른다.)를 이용하면된다.</p>
<pre><code>lotto[0]    // 첫번째 값(1)을 나타낸다. 인덱스는 0부터 시작!</code></pre></li>
<li><p><em>배열의 함수*</em></p>
<pre><code>.push()        // 배열의 마지막 값 추가하는 함수</code></pre></li>
<li><p>빈 배열을 생성한 뒤 push함수를 이용해 배열에 6개의 랜덤 숫자 추가하는 코드를 작성해보자.</p>
</li>
<li><p><em>코드*</em></p>
<pre><code>&lt;body&gt;
   &lt;h1&gt;로또 번호 추첨기&lt;/h1&gt;
   &lt;script&gt;
       var lotto = [];
       lotto.push(parseInt(Math.random() * 45 + 1));
       lotto.push(parseInt(Math.random() * 45 + 1));
       lotto.push(parseInt(Math.random() * 45 + 1));
       lotto.push(parseInt(Math.random() * 45 + 1));
       lotto.push(parseInt(Math.random() * 45 + 1));
       lotto.push(parseInt(Math.random() * 45 + 1));
       document.write(lotto);
   &lt;/script&gt;
&lt;/body&gt;</code></pre></li>
</ul>
<hr>
<h3 id="로또-번호-추첨기-3">로또 번호 추첨기 3</h3>
<blockquote>
<p>위 작성한 코드를 보면 똑같은 코드가 6번이나 반복되는 것을 알 수 있다.
프로그래밍에서는 반복적인 코드를 작성하는 것을 안좋게 생각한다. </p>
</blockquote>
<h4 id="반복문">반복문</h4>
<p><strong>1. for</strong>
<strong>형식</strong></p>
<pre><code>for(시작; 끝; 증가){
    반복하려는 코드
}</code></pre><p><strong>예시 코드1</strong></p>
<pre><code>for(var i=0; i&lt;6; i++){        // i=0으로 시작해서 코드가 실행 후 i 1씩 증가
                            // i가 6보다 작은 조건을 벗어나면 반복문 종료
    반복하려는 코드
}</code></pre><p><strong>예시 코드2</strong></p>
<pre><code>for (var i = 0; i &lt; 6; i++){
            document.write(i);
        }</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/ed815faa-3f3e-4b51-b7f8-75acb8f51e71/image.png" alt=""></p>
<p><strong>for문 사용해서 6개의 랜덤 숫자 뽑기</strong></p>
<pre><code>&lt;body&gt;
    &lt;h1&gt;로또 번호 추첨기&lt;/h1&gt;
    &lt;script&gt;
        var lotto = [];

        for (var i = 0; i &lt; 6; i++){
            lotto.push(parseInt(Math.random() * 45 + 1));
        }
        document.write(lotto);
    &lt;/script&gt;
&lt;/body&gt;</code></pre><hr>
<h3 id="로또-번호-추첨기-4">로또 번호 추첨기 4</h3>
<blockquote>
<p>위 코드와 같이 작성하면 중복되서 나오는 숫자가 있을 수 있다!</p>
</blockquote>
<p><strong>따라서 만약에 중복된 숫자가 아니라면 .push() 하자!</strong>
<strong>-&gt; 조건문 사용!</strong></p>
<pre><code>if(조건문){
    조건에 충족되면 실행할 문장
}</code></pre><p>그럼 어떻게 검사를 하면 좋을까?
다음과 같은 배열의 기능을 사용하자!</p>
<pre><code>.indexOf(값)        // 값이 있으면 위치값 추출, 없으면 -1 출력</code></pre><p><strong>조건문 사용해 중복 체크 후 값 추가하기</strong></p>
<pre><code>if (lotto.indexOf(num) == -1) {
                lotto.push(num);
            }</code></pre><p><strong>조건문(if문)사용해서 중복 체크 후 값 추가하기 전체코드</strong></p>
<pre><code>&lt;body&gt;
    &lt;h1&gt;로또 번호 추첨기&lt;/h1&gt;
    &lt;script&gt;
        var lotto = [];
        for (var i = 0; i &lt; 6; i++){
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num);
            }
        }
        document.write(lotto);
    &lt;/script&gt;
&lt;/body&gt;</code></pre><hr>
<h3 id="로또-번호-추첨기-5">로또 번호 추첨기 5</h3>
<blockquote>
<p>위 코드와 같이 작성하면 반복문이 6번만 반복되기 때문에 중복된 숫자가 나왔을 때 6개의 숫자가 나오지 않는 문제가 생긴다!</p>
</blockquote>
<p>이런 부분을 방지 하기 위해 공이 6개가 될 때까지 숫자를 뽑아주면 된다!
이때 사용하는 것이 while반복문이다.</p>
<pre><code>while(조건문){
    반복하려는 코드
}</code></pre><pre><code>배열.length        //배열의 길이</code></pre><p>-&gt; 배열안에 몇 개의 값이 있는지 알려준다. 이 기능을 통해 while조건문에 배열의 개수가 6개인지 확인을 해서 반복문을 종료해주면 된다.</p>
<p><strong>while문 사용한 코드</strong></p>
<pre><code>&lt;body&gt;
    &lt;h1&gt;로또 번호 추첨기&lt;/h1&gt;
    &lt;script&gt;
        var lotto = [];
        while(lotto.length &lt;6){
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num);
            }
        }
        document.write(lotto);
    &lt;/script&gt;
&lt;/body&gt;</code></pre><p>-&gt; 이젠 6개가 모두 중복없이 잘 나온다.</p>
<hr>
<h3 id="로또-번호-추첨기-6">로또 번호 추첨기 6</h3>
<p>이제 뽑은 숫자를 정렬해보자.</p>
<pre><code>배열.sort()        // 배열 요소들을 정렬해준다.</code></pre><p><strong>테스트 코드</strong></p>
<pre><code>var lotto = [1,33,2,22,11,3]
lotto.sort()
document.write(lotto)</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/6f5f3d2d-1ced-4d67-8f04-98ff1c4d9c64/image.png" alt="">
-&gt; 결과가 우리의 예상과 다르게 숫자크기로 정리가 된 것이 아님을 알 수 있다.
-&gt; 그냥 sort를 하게되면 위와 같이 사전순으로 앞에 있는 문자 기준으로 정렬이 된다.</p>
<blockquote>
<p>숫자의 크기순으로 정리하려면 어떻게 해야 할까?</p>
</blockquote>
<pre><code>.sort((a,b)=&gt;a-b)        //오름차순 정렬
.sort((a,b)=&gt;b-a)        //내림차순 정렬</code></pre><p><strong>숫자 오름차순 정렬 코드</strong></p>
<pre><code>&lt;body&gt;
    &lt;h1&gt;로또 번호 추첨기&lt;/h1&gt;
    &lt;script&gt;
        var lotto = [];
        while (lotto.length &lt; 6) {
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num);
            }
        }
        lotto.sort((a,b)=&gt;a-b);
        document.write(lotto);
    &lt;/script&gt;
&lt;/body&gt;</code></pre><p><strong>최종 코드</strong>
<strong>html,css이용해서 이쁘게 꾸며준 코드 추가</strong>
<strong>html파일</strong></p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;로또 번호 추첨기&lt;/h1&gt;
    &lt;script&gt;
        var lotto = [];
        while (lotto.length &lt; 6) {
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num);
            }
        }
        lotto.sort((a,b)=&gt;a-b);
        document.write(&quot;&lt;div class=&#39;ball ball1&#39;&gt;&quot; + lotto[0] + &quot;&lt;/div&gt;&quot;);
        document.write(&quot;&lt;div class=&#39;ball ball2&#39;&gt;&quot; + lotto[1] + &quot;&lt;/div&gt;&quot;);
        document.write(&quot;&lt;div class=&#39;ball ball3&#39;&gt;&quot; + lotto[2] + &quot;&lt;/div&gt;&quot;);
        document.write(&quot;&lt;div class=&#39;ball ball4&#39;&gt;&quot; + lotto[3] + &quot;&lt;/div&gt;&quot;);
        document.write(&quot;&lt;div class=&#39;ball ball5&#39;&gt;&quot; + lotto[4] + &quot;&lt;/div&gt;&quot;);
        document.write(&quot;&lt;div class=&#39;ball ball6&#39;&gt;&quot; + lotto[5] + &quot;&lt;/div&gt;&quot;);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>css파일</strong></p>
<pre><code>.ball {
    float: left;
    width: 60px;
    height: 60px;
    line-height: 60px;
    font-size: 28px;
    border-radius: 100%;
    text-align: center;
    vertical-align: middle;
    color: #fff;
    font-weight: 500;
    text-shadow: 0px 0px 3px rgba(73, 57, 0, .8);
    margin-right: 6px;
}

.ball1 {
    background: #fbc400;
}
.ball2 {
    background: #69c8f2;
}
.ball3 {
    background: #ff7272;
}
.ball4 {
    background: #aaa;
}
.ball5 {
    background: #b0d840;
}
.ball6 {
    background: #c7c7c7;
}
</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/5a23f377-47bd-426a-98f2-4202bbee8bec/image.png" alt=""></p>
<hr>
<h1 id="chapter-3">Chapter 3</h1>
<h2 id="javascript로-만드는-자소서-글자수-계산기">Javascript로 만드는 [자소서 글자수 계산기]</h2>
<h3 id="자소서-글자수-계산기-미리보기">자소서 글자수 계산기 미리보기</h3>
<p><img src="https://images.velog.io/images/mungge_jang322/post/64f40908-48df-4a5e-bb9e-af317bbbe38f/image.png" alt=""></p>
<hr>
<h3 id="dom">DOM</h3>
<p>DOM이란?
: Document Object Model의 약자로, 웹 화면을 구성하는 html 코드를 쉽게 접근 할 수 있도록 만든 모델이다.</p>
<ul>
<li>우리가 배우는 자바스크립트로 이런 DOM을 활용하여 화면을 구성하는 코드를 원하는 대로 변경할 수 있다.</li>
<li>왼쪽이 웹페이지를 구성하는 html 코드이고, h1태그 안에 적힌 &#39;안녕&#39;이라는 글씨를 dom을 통해 접근해서 hi라고 바꿔줄 수 있다.
<img src="https://images.velog.io/images/mungge_jang322/post/84e93526-2274-4e9b-9bb9-f9b0eba60a4c/image.png" alt="">
<img src="https://images.velog.io/images/mungge_jang322/post/19002e91-3028-4526-b0de-98806debe6d5/image.png" alt=""></li>
<li>그리고 다음과 같이 새로운 태그(p태그)를 추가해서 새로운 글자를 추가할 수도 있다.
<img src="https://images.velog.io/images/mungge_jang322/post/4f1b7bbb-be67-4432-9819-736955c9659d/image.png" alt=""></li>
<li>심지어 다음과 같이 클래스를 추가하는 등 특성 변경도 가능하다.
<img src="https://images.velog.io/images/mungge_jang322/post/1d53c82a-33af-4a43-937d-92601e2fed31/image.png" alt=""></li>
</ul>
<blockquote>
<p>즉, 자바스크립트는 DOM을 활용하여 화면을 구성하는 모든 것들에 접근할 수 있고, 원하는 대로 다 바꿀 수 있다.</p>
</blockquote>
<hr>
<h3 id="자소서-글자수-계산기-1">자소서 글자수 계산기 1</h3>
<p><strong>document</strong></p>
<pre><code>&lt;html&gt;
    &lt;head&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;자기소개&lt;/h1&gt;
        &lt;textarea id = &#39;jasoseol&#39;&gt;
            저는 인성 문제가 없습니다.
        &lt;/textarea&gt;
     &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>DOM을 사용하기</strong></p>
<pre><code>// 특정 아이디(jasoseol)를 가진 태그를 불러올 수 있다.
document.getElementById(&#39;jasoseol&#39;);

&lt;textarea id = &#39;jasoseol&#39;&gt;
    저는 인성 문제가 없습니다.
&lt;/textarea&gt;</code></pre><pre><code>//태그 안쪽 내용만을 불러올 수 있다.
document.getElementById(&#39;jasoseol&#39;).value;
or
document.getElementById(&#39;jasoseol&#39;).innerHTML;</code></pre><p><img src="https://images.velog.io/images/mungge_jang322/post/aeefd5c6-5da8-45ef-bc4b-da3d41652d30/image.png" alt=""></p>
<p>textarea에 원하는 말을 작성 할 수 있다.
textarea에 있는 텍스트를 자바스크립트를 이용해서 가져와보자.</p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; integrity=&quot;sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;style&gt;
        h1 {
            margin-top: 30px;
        }
        #count {
            float: right;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;script&gt;
        console.log(&#39;코드라이언&#39;);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>지금까지는 <strong>document.write()</strong> 를 사용해서 출력해왔다.
새로운 출력방법을 배워보자!</p>
<pre><code>console.log(&#39;코드라이언&#39;)    //콘솔창에 &#39;코드라이언&#39;을 출력할 수 있다.</code></pre><p>-&gt; 꼭 브라우저에서 출력 할 필욘 없다.</p>
<p><strong>body태그부분 코드</strong></p>
<pre><code>&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;script&gt;
        var content = document.getElementById(&#39;jasoseol&#39;).value;    // 아이디가 &#39;jasoseol&#39;인 태그의 내용을 가져와 content변수에 저장.
        console.log(content)     // 콘솔 창에 content변수 내용 출력.
    &lt;/script&gt;
&lt;/body&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/61309e8e-4b48-451b-8566-0287d0154098/image.png" alt=""></p>
<hr>
<h3 id="자소서-글자수-계산기-2">자소서 글자수 계산기 2</h3>
<p>가져온 글자수의 길이를 측정해보자.
문자열의 길이도 배열과 마찬가지로 <strong>.length</strong>를 통해 알아낼 수 있다.</p>
<pre><code>문자열.length        // 문자열의 길이</code></pre><p>-&gt; 문자열의 공백을 포함한 글자수가 나오게 된다.</p>
<p><strong>body태그부분 코드</strong></p>
<pre><code>&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;script&gt;
        var content = document.getElementById(&#39;jasoseol&#39;).value;    // 아이디가 &#39;jasoseol&#39;인 태그의 내용을 가져와 content변수에 저장.
        console.log(content.length)     // 콘솔 창에 content 문자열 길이 출력.
    &lt;/script&gt;
&lt;/body&gt;</code></pre><p><strong>결과</strong></p>
<pre><code>15</code></pre><hr>
<h3 id="자소서-글자수-계산기-3">자소서 글자수 계산기 3</h3>
<p><strong>document</strong></p>
<pre><code>&lt;html&gt;
    &lt;head&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;자기소개&lt;/h1&gt;
        &lt;textarea id = &#39;jasoseol&#39;&gt;
            저는 인성 문제가 없습니다.
        &lt;/textarea&gt;
        &lt;span id=&#39;count&#39;&gt;(0/200)&lt;/span&gt;    //이와 같이 원하는 위치에 원하는 형태로 값을 넣어주자.
     &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>코드(body태그 내부 코드만)</strong></p>
<pre><code>&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
    &lt;script&gt;
        var content = document.getElementById(&#39;jasoseol&#39;).value;
        document.getElementById(&#39;count&#39;).innerHTML = content.length;    // content 문자열 글자수로 태그 안 내용을 변경.
    &lt;/script&gt;
&lt;/body&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/e040a460-99a5-48c8-be2f-487094b3c545/image.png" alt="">
-&gt; 하지만 이것은 우리가 원하는 형태가 아니다. 현재 얼마나 입력되었고, 제한 문자열이 몇인지 나타내고 싶다.</p>
<p>그럼 어떻게 해야 할까?
문자열은 다음과 같이 더해서 합칠 수 있다.</p>
<pre><code>&#39;(&#39; + 15 + &#39;/200)&#39;
=&gt; &#39;(15/200&#39;)</code></pre><p><strong>코드</strong></p>
<pre><code>document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;</code></pre><ul>
<li>위와 같이 코드를 변경하고 실행해보자.</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/9cf7fa5a-2cc9-4acb-a25c-65f778e27625/image.png" alt=""></p>
<p>-&gt; 결과가 원하는 대로 잘 나오는 것을 볼 수 있다.</p>
<hr>
<h3 id="자소서-글자수-계산기-4">자소서 글자수 계산기 4</h3>
<p>위에서 사용한 긴 코드를 우리는 매번 계속 써야할까??
함수를 이용해보자!</p>
<p><strong>함수란?</strong>
: 쉽게 말해서 명령어의 모음이다.</p>
<p><strong>함수형식</strong></p>
<pre><code>//함수 정의
function 함수이름() {
    명령어1;
    명령어2;
    ...
}

//함수 호출
함수이름();</code></pre><p><strong>기존 body 코드</strong></p>
<pre><code>&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
    &lt;script&gt;
        var content = document.getElementById(&#39;jasoseol&#39;).value;
        document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
    &lt;/script&gt;
&lt;/body&gt;</code></pre><p><strong>함수 사용 body 코드</strong></p>
<pre><code>&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
    &lt;script&gt;
        function counter() {
            var content = document.getElementById(&#39;jasoseol&#39;).value;
            document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
        };
        counter();
    &lt;/script&gt;
&lt;/body&gt;</code></pre><hr>
<h3 id="자소서-글자수-계산기-5">자소서 글자수 계산기 5</h3>
<blockquote>
<p>글자를 쓸 때마다 글자수를 업데이트 하려면 어떻게 해야 할까?</p>
</blockquote>
<p>키보드를 누를 때 마다 글자수를 세면 된다!
그러기 위해서는 자바스크립트에서 <strong>이벤트</strong>를 사용하면 된다.</p>
<p><strong>이벤트 종류</strong></p>
<pre><code>마우스 클릭
키보드 누름
값 변화
페이지 로딩
...</code></pre><p><strong>이벤트 핸들링이란?</strong>
: 이벤트가 발생하면, ___해라.</p>
<pre><code>키보드를 누를 때마다        // 이벤트
글자 수를 세주어라.        // 이벤트 핸들링</code></pre><p><strong>이벤트 코드 형식</strong></p>
<pre><code>&lt;textarea 이벤트 = 이벤트핸들링&gt;&lt;/textarea&gt;</code></pre><p><strong>코드예시</strong></p>
<pre><code>//onkeydown: 이벤트, counter()함수: 이벤트 핸들링

&lt;textarea onkeydown = &#39;counter()&#39; class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;</code></pre><hr>
<h3 id="자소서-글자수-계산기-6">자소서 글자수 계산기 6</h3>
<blockquote>
<p>200자 넘으면(조건문) 더이상 안써지도록 하려면?(200글자 이후는 잘라버리기)</p>
</blockquote>
<p>&#39;문자열 자료형에서 몇글자까지 자른다&#39; 하는 기능은 <strong>.substring()</strong>이다.</p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/11b4a46d-5615-4552-9339-b63141f5feda/image.png" alt="">
-&gt; 문자열도 배열과 같이 각각의 인덱스가 있다.</p>
<pre><code>content = &#39;인성 문제 없습니다.&#39;
content.substring(0,5);        //0이상 5미만
//결과
인성 문제</code></pre><p>그럼 우리는 <strong>.substring(0,200)</strong> 으로 사용하면된다.</p>
<p><strong>조건문과 substring을 사용한 코드</strong></p>
<pre><code>if (content.length &gt; 200) {        //200글자가 넘어간다면
                content = content.substring(0,200);        //0~200자까지를 잘라서 다시 content에 넣는다.
                document.getElementById(&#39;jasoseol&#39;).value = content;
            }</code></pre><p><strong>전체 body 코드</strong></p>
<pre><code>&lt;body class=&quot;container&quot;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot; onkeydown=&quot;counter();&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
    &lt;script&gt;
        function counter() {
            var content = document.getElementById(&#39;jasoseol&#39;).value;
            if (content.length &gt; 200) {
                content = content.substring(0,200);
                document.getElementById(&#39;jasoseol&#39;).value = content;
            }
            document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
        }
        counter();
    &lt;/script&gt;
&lt;/body&gt;</code></pre><hr>
<h3 id="자소서-글자수-계산기-정리하기">자소서 글자수 계산기 정리하기</h3>
<p><strong>최종 전체 코드</strong></p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; integrity=&quot;sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;style&gt;
        h1 {
            margin-top: 30px;
        }
        #count {
            float: right;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class=&#39;container&#39;&gt;
    &lt;h1&gt;자기소개&lt;/h1&gt;
    &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot; onkeydown=&quot;counter();&quot;&gt;저는 인성 문제가 없습니다.&lt;/textarea&gt;
    &lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
    &lt;script&gt;
        function counter() {
            var content = document.getElementById(&#39;jasoseol&#39;).value;
            if (content.length &gt; 200) {
                content = content.substring(0,200);
                document.getElementById(&#39;jasoseol&#39;).value = content;
            }
            document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
        }
        counter();
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><hr>
<h1 id="chapter-4">Chapter 4</h1>
<h2 id="javascript로-만드는-미니-스타크래프트">Javascript로 만드는 [미니 스타크래프트]</h2>
<h3 id="미니-스타크래프트-미리보기">미니 스타크래프트 미리보기</h3>
<p><img src="https://images.velog.io/images/mungge_jang322/post/13201edf-08f8-4905-94bf-aec011778a3f/image.png" alt="">
-&gt; 분홍 캐릭터를 클릭하면 침을 날려 오른쪽 벙커를 파괴하는 내용이다.</p>
<hr>
<h3 id="jquery-시작하기">jQuery 시작하기</h3>
<h4 id="jquery란">jQuery란?</h4>
<p>: 자바스크립트를 쉽게 사용할 수 있게 해주는 라이브러리다.</p>
<ul>
<li>자바스크립트를 이용해서 DOM을 제어해서 html의 어떤 요소를 선택하고 그 값을 가져오려면 &#39;document.getElementById(&#39;content&#39;).value;&#39;와 같이 긴 코드를 작성해야 했었지만, jQuery를 활용하면 &#39;$(&#39;#content&#39;).value();&#39; 이렇게 짧은 코드로 사용할 수 있게 해준다.</li>
</ul>
<h4 id="jquery-장점">jQuery 장점</h4>
<p><strong>1. 문법이 간결하다.</strong>
<strong>2. 편리한 API를 제공하고 있다.</strong>
<strong>3. 크로스 브라우징</strong></p>
<ul>
<li>각 브라우저나 버전마다 코드가 동작할 수도 안할 수도 있는데 jQuery를 활용하면 모든 브라우저, 모든 버전에서 동일하게 동작한다.</li>
</ul>
<h4 id="jquery-사용방법">jQuery 사용방법</h4>
<p>&quot;code.jquery.com&quot; 사이트 접속 -&gt; 가장 최신 버전 jQuery의 minified를 클릭하면 다음과 같이 코드를 복사 할 수 있는 화면이 나온다.
<img src="https://images.velog.io/images/mungge_jang322/post/ecef8259-291d-44ad-8a02-99ef7bb4d593/image.png" alt="">
이 코드를 복사해 내 html에 붙여넣으면 jQuery 라이브러리를 사용할 수 있다.</p>
<h4 id="jquery의-가장-기본적인-문법">jQuery의 가장 기본적인 문법</h4>
<pre><code>$(선택자).행위;</code></pre><p>아까 복붙해온 아래 코드를 추가 하고 나면 추가한 그 지점 이후부터 jQuery를 쓸 수 있게 된다.</p>
<pre><code>&lt;script
    src=&quot;https://code.jquery.com/jquery-3.5.1.js&quot;
    integrity=&quot;sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=&quot;
    crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;</code></pre><p>jQuery를 이용해 textarea에서 글자를 가져오는 코드를 짜보자.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;jQuery 기초&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;jQuery 기초&lt;/h1&gt;
    &lt;textarea id=&quot;content&quot;&gt;jQuery를 배워보자&lt;/textarea&gt;
    &lt;script
    src=&quot;https://code.jquery.com/jquery-3.5.1.js&quot;
    integrity=&quot;sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=&quot;
    crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        console.log($(&#39;#content&#39;).val());    //val대신 value도 가능
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/7ad473d1-54d4-4e26-9df4-e49bc9d4f6d8/image.png" alt=""></p>
<hr>
<h3 id="jquery-event">jQuery Event</h3>
<p><strong>jQuery 사용x</strong></p>
<pre><code>&lt;button id=&#39;click&#39; onclick=&#39;hello();&#39;&gt;클릭&lt;/button&gt;</code></pre><p><strong>jQuery 사용o</strong></p>
<pre><code>&lt;button id=&#39;click&#39;&gt;클릭&lt;/button&gt;
$(&#39;#click&#39;).click(hello);</code></pre><hr>
<h3 id="익명-함수">익명 함수</h3>
<h4 id="익명-함수란">익명 함수란?</h4>
<p>: 말그대로 이름이 없는 함수를 말한다.</p>
<pre><code>// 기본 함수를 보면 함수명이 hello이다.
function hello(){            
    console.log(&#39;hello&#39;);
}
$(&#39;#click&#39;).click(hello);</code></pre><p>-&gt; 일반 함수의 경우에는 함수를 정의 하고 그 뒤에 호출해서 사용했어야 했지만, 익명 함수의 경우는 정의 없이 사용이 가능하다.</p>
<p><strong>익명 함수 사용 코드</strong></p>
<pre><code>$(&#39;#click&#39;).click(function(){
    console.log(&#39;hello&#39;);
})</code></pre><p>-&gt; 함수 이름도 정해주지 않고 바로 function(){}만 쓴다.</p>
<hr>
<h3 id="미니-스타크래프트-1">미니 스타크래프트 1</h3>
<p>첫 화면에서 침의 경우는 css를 이용해 이미지를 숨겨두었다.
-&gt; display: none;</p>
<p>드론(분홍색 캐릭터)를 클릭시 침을 발사한다.
<strong>html 코드</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;스타크래프트&lt;/title&gt;
    &lt;style&gt;
        .background {
            position: relative;
            background-image: url(&#39;background.png&#39;);
            background-size: 500px 330px;
            width: 500px;
            height: 330px;
        }
        #drone {
            position: absolute;
            width: 100px;
            height: 100px;
            top: 100px;
            left: 60px;
        }
        #bunker {
            position: absolute;
            width: 150px;
            height: 150px;
            top: 80px;
            right: 20px;
        }
        #spit {
            display: none;
            position: absolute;
            top: 140px;
            left: 150px;
            width: 50px;
            height: 30px;
            z-index: 2;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&#39;background&#39;&gt;
        &lt;img id=&#39;drone&#39; src=&quot;drone.png&quot; alt=&quot;drone&quot;&gt;
        &lt;img id=&#39;spit&#39; src=&quot;spit.png&quot; alt=&quot;spit&quot;&gt;
        &lt;img id=&#39;bunker&#39; src=&quot;bunker.png&quot; alt=&quot;bunker&quot;&gt;
    &lt;/div&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.js&quot;
  integrity=&quot;sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        //$() .click() 익명함수
        $(&#39;#drone&#39;).click(function(){
            console.log(&#39;침 발사&#39;);
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>-&gt; 클릭했다는 것을 콘솔 창을 통해 확인하기 위해 console.log()를 통해 &#39;침 발사&#39;라는 문자열을 출력.</p>
<hr>
<h3 id="미니-스타크래프트-2">미니 스타크래프트 2</h3>
<p>이번에는 침을 직접 발사하는 이미지를 나타내보자.
우리는 모든 기능을 다 외우고 있을 수 없다.
그래서 필요한 기능이 무엇인지만 알고 있다면 구글링을 통해 알아내면 된다.</p>
<p><strong>구글링 하는 법</strong>
검색어 -&gt; 언어/라이브러리 + 원하는 기능
ex) jQuery 나타나기(클릭시 이미지가 나타나길 원해서)</p>
<p>jquery.com 사이트에 들어가보면 
<img src="https://images.velog.io/images/mungge_jang322/post/d573aec7-4468-4bda-be44-1526bce8e6df/image.png" alt="">
공식문서를 통해 사용 방법이 나와있다.</p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/e88ab471-4c47-4a63-8145-6de252f091db/image.png" alt="">
대괄호로 묶여있다면 선택사항이라는 뜻이다.</p>
<p><strong>적용 코드</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;스타크래프트&lt;/title&gt;
    &lt;style&gt;
        .background {
            position: relative;
            background-image: url(&#39;background.png&#39;);
            background-size: 500px 330px;
            width: 500px;
            height: 330px;
        }
        #drone {
            position: absolute;
            width: 100px;
            height: 100px;
            top: 100px;
            left: 60px;
        }
        #bunker {
            position: absolute;
            width: 150px;
            height: 150px;
            top: 80px;
            right: 20px;
        }
        #spit {
            display: none;
            position: absolute;
            top: 140px;
            left: 150px;
            width: 50px;
            height: 30px;
            z-index: 2;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&#39;background&#39;&gt;
        &lt;img id=&#39;drone&#39; src=&quot;drone.png&quot; alt=&quot;drone&quot;&gt;
        &lt;img id=&#39;spit&#39; src=&quot;spit.png&quot; alt=&quot;spit&quot;&gt;
        &lt;img id=&#39;bunker&#39; src=&quot;bunker.png&quot; alt=&quot;bunker&quot;&gt;
    &lt;/div&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.js&quot;
  integrity=&quot;sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/e263a193-b381-484a-81bb-72341373c496/image.png" alt="">
-&gt; 침이 나타난 것을 볼 수 있다.</p>
<hr>
<h3 id="미니-스타크래프트-3">미니 스타크래프트 3</h3>
<p>이제는 침을 발사해서 목표물까지 이동하도록 해보자.</p>
<pre><code>.animate(properties, [duration], [easing], [complete])</code></pre><p>-&gt; 위 기능을 사용할 것이다.</p>
<ul>
<li>여기서 properties는 css요소를 적어주면 된다.
<img src="https://images.velog.io/images/mungge_jang322/post/90c9a410-3637-449e-96bc-9fa4bbfddc7e/image.png" alt=""></li>
<li><blockquote>
<p>위에서 말한 사이트에서 example 코드를 확인해 사용법을 알 수 있다.</p>
</blockquote>
</li>
</ul>
<p><strong>코드</strong></p>
<pre><code>&lt;script&gt;
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({left: &#39;+=250&#39;});
        });
    &lt;/script&gt;</code></pre><p>-&gt; css요소인 left를 250씩 늘려 오른쪽으로 이동하는 것처럼 보이게 만든다.</p>
<hr>
<h3 id="미니-스타크래프트-4">미니 스타크래프트 4</h3>
<p>이번엔 침이 발사되고 벙커 앞에서 사라지게 해서 벙커가 맞은 것처럼 보이게 하자.</p>
<pre><code>fadeOut()</code></pre><p>을 사용해 이미지를 없앨 것이다.</p>
<p><strong>코드</strong></p>
<pre><code>&lt;script&gt;
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({left: &#39;+=250&#39;});
            $(&#39;#spit&#39;).fadeOut();
        });
    &lt;/script&gt;</code></pre><p>-&gt; 그런데 이렇게 되면 다음 침을 발사 할 때 벙커에서 침이 나타나게 된다. 이 침을 다시 드론 앞으로 옮겨야 한다.</p>
<p>여기서는 animate를 사용해서 옮길 수 도 있지만 어차피 안보이는 영역이기도 해서 <strong>.css()</strong> 를 사용할 것이다.</p>
<pre><code>.css()</code></pre><p>-&gt; 변경하고 싶은 css요소가 있으면 애니메이션 없이 바로 css가 변경되는 코드이다.</p>
<p><strong>코드</strong></p>
<pre><code>&lt;script&gt;
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({left: &#39;+=250&#39;});
            $(&#39;#spit&#39;).fadeOut();
            $(&#39;#spit&#39;).css({left: &#39;150px&#39;});
        });        // 이렇게 되면 원래의 자리로 돌아가게 된다.
    &lt;/script&gt;</code></pre><hr>
<h3 id="미니-스타크래프트-5">미니 스타크래프트 5</h3>
<p>이번에는 벙커가 침을 맞을 때마다 HP가 감소하도록 해보자.
<strong>body 코드</strong></p>
<pre><code>&lt;body&gt;
    &lt;h1 id=&#39;hp&#39;&gt;HP: 3&lt;/h1&gt;        //HP: 3으로 시작하는 텍스트를 나타낸다.
    &lt;div class=&#39;background&#39;&gt;
        &lt;img id=&#39;drone&#39; src=&quot;drone.png&quot; alt=&quot;drone&quot;&gt;
        &lt;img id=&#39;spit&#39; src=&quot;spit.png&quot; alt=&quot;spit&quot;&gt;
        &lt;img id=&#39;bunker&#39; src=&quot;bunker.png&quot; alt=&quot;bunker&quot;&gt;
    &lt;/div&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.js&quot;
  integrity=&quot;sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var hp = 3;        //hp라는 이름의 정수형 변수를 선언해준다.
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({left: &#39;+=250&#39;});
            $(&#39;#spit&#39;).fadeOut();
            $(&#39;#spit&#39;).css({left: &#39;150px&#39;});
            hp = hp - 1;        //침이 벙커에 맞을 때마다 감소하도록 1을 빼준다.
            $(&#39;#hp&#39;).text(&#39;HP :&#39; + hp);        //변경된 값으로 텍스트 변경한다.
        });
    &lt;/script&gt;
&lt;/body&gt;</code></pre><blockquote>
<p>근데 이렇게 되면 벙커에 침을 맞기도 전에 HP가 감소해버려 타이밍이 맞지 않게 된다.</p>
</blockquote>
<p>jQuery에는 콜백(callback)이라는 개념이 있다.
어떤 함수에서 complete(ex- .fadeOut([duration],[complete]))라는 인자를 주게 되면 &#39;이 함수가 실행이 끝나고 난 뒤 그 다음 함수를 실행하겠다&#39; 라는 뜻이다. 
즉, 그냥 코드 아랫줄에 써주는 것이 아니라 그 함수 안쪽에 콜백함수로 사용하게 되면 실행한 함수의 동작이 모두 종료되고 그 다음에 이 complete 내용의 함수가 실행된다.</p>
<p><strong>코드</strong></p>
<pre><code>&lt;script&gt;
        var hp = 3;
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({left: &#39;+=250&#39;});
            $(&#39;#spit&#39;).fadeOut(function(){    //이렇게 fadeOut함수가 동작이 끝난 뒤 
                hp = hp - 1;    //즉, 침이 사라진 뒤 hp를 감소시키는 것이다.
                $(&#39;#hp&#39;).text(&#39;HP :&#39; + hp);
            });
            $(&#39;#spit&#39;).css({left: &#39;150px&#39;});
        });
    &lt;/script&gt;</code></pre><p>-&gt; 이렇게 되면 타이밍이 맞게 된다.</p>
<hr>
<h3 id="미니-스타크래프트-6">미니 스타크래프트 6</h3>
<p>이제는 마지막으로 벙커의 hp가 0이 되었을 때 사라지는 코드를 작성해보자.</p>
<p>조건문을 사용해 hp가 0일때 벙커를 fadeOut 하면 될 것이다.</p>
<p><strong>코드</strong></p>
<pre><code>&lt;script&gt;
        var hp = 3;
        $(&#39;#drone&#39;).click(function(){
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({left: &#39;+=250&#39;});
            $(&#39;#spit&#39;).fadeOut(function(){
                hp = hp - 1;
                $(&#39;#hp&#39;).text(&#39;HP: &#39; + hp);
                if(hp == 0) {
                    $(&#39;#bunker&#39;).fadeOut();
                }
            });
            $(&#39;#spit&#39;).css({left: &#39;150px&#39;});
        });
    &lt;/script&gt;</code></pre><hr>
<h3 id="미니-스타크래프트-정리하기">미니 스타크래프트 정리하기</h3>
<p><strong>전체 코드</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;스타크래프트&lt;/title&gt;
    &lt;style&gt;
        .background {
            position: relative;
            background-image: url(&#39;background.png&#39;);
            background-size: 500px 330px;
            width: 500px;
            height: 330px;
        }
        #drone {
            position: absolute;
            width: 100px;
            height: 100px;
            top: 100px;
            left: 60px;
        }
        #bunker {
            position: absolute;
            width: 150px;
            height: 150px;
            top: 80px;
            right: 20px;
        }
        #spit {
            display: none;
            position: absolute;
            top: 140px;
            left: 150px;
            width: 50px;
            height: 30px;
            z-index: 2;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1 id=&#39;hp&#39;&gt;HP: 3&lt;/h1&gt;
    &lt;div class=&#39;background&#39;&gt;
        &lt;img id=&#39;drone&#39; src=&quot;drone.png&quot; alt=&quot;drone&quot;&gt;
        &lt;img id=&#39;spit&#39; src=&quot;spit.png&quot; alt=&quot;spit&quot;&gt;
        &lt;img id=&#39;bunker&#39; src=&quot;bunker.png&quot; alt=&quot;bunker&quot;&gt;
    &lt;/div&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.js&quot;
  integrity=&quot;sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var hp = 3;
        $(&#39;#drone&#39;).click(function() {
            $(&#39;#spit&#39;).fadeIn();
            $(&#39;#spit&#39;).animate({&#39;left&#39;: &#39;+=250px&#39;});
            $(&#39;#spit&#39;).fadeOut(function(){
                hp = hp - 1;
                $(&#39;#hp&#39;).text(&#39;HP: &#39; + hp);
                if (hp == 0) {
                    $(&#39;#bunker&#39;).fadeOut();
                }
            });
            $(&#39;#spit&#39;).css({left: 150});
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><hr>
<h1 id="chapter-5">Chapter 5</h1>
<h2 id="javascript로-만드는-기념일-계산기">Javascript로 만드는 [기념일 계산기]</h2>
<h3 id="기념일-계산기-미리보기">기념일 계산기 미리보기</h3>
<ul>
<li>커플이 사귄지 몇일 째 되는지</li>
<li>앞으로의 기념일까지 얼마나 남았는지
의 기능을 담은 기념일 계산기를 만들 것이다.</li>
</ul>
<hr>
<h3 id="객체object-알아보기">객체(Object) 알아보기</h3>
<h4 id="객체란">객체란?</h4>
<p>: &#39;이 사람은 이름은 장멍게이고 나이는 20살이다&#39;와 같은 정보를 담고 있는 것이 객체다.</p>
<ul>
<li>코드로 표현하면 다음과 같다.<pre><code>var person = {
  name: &#39;jangmungge&#39;,
  age: 20
}</code></pre></li>
<li>name, age가 키(key), 속성명이라 하고, jangmungge와 20이 값(value)이자 속성 혹은 속성값이라 한다.</li>
<li>배열, 객체, 함수 모두 속성값이 될 수 있다.</li>
<li><strong>&#39;객체.키&#39;</strong> 를 통해 값을 가져올 수 있다.<pre><code>ex)
person.name;        // jangmunnge </code></pre></li>
</ul>
<blockquote>
<p>자바스크립트의 모든 것은 객체다.</p>
</blockquote>
<pre><code>content.length;
document.write();
console.log();</code></pre><p>-&gt; 이 모든 것이 객체를 활용한 것이다.</p>
<p><strong>예시 전체 코드</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;객체(Object)&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;객체(Object)&lt;/h1&gt;
    &lt;script&gt;
        var person = {
            name: &#39;jangmungge&#39;,
            sayHello: function() { console.log(&#39;hello&#39;); }
        }
        console.log(person.name);
        person.sayHello();
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/20b89646-2863-458c-be4f-fb993578db09/image.png" alt=""></p>
<hr>
<h3 id="date-객체-알아보기">Date 객체 알아보기</h3>
<p>자바스크립트에서는 특정기능을 가진 객체를 내장하고 있다.
<strong>Date 객체가 바로 그 예시이다.</strong></p>
<pre><code>var now = new Date();</code></pre><p>-&gt; 이렇게 Date()객체를 만들어주면 현재 시각으로 객체가 만들어져 now 변수에 담기게 된다.
그럼 다음과 같은 객체의 메소드를 사용할 수 있게 된다.</p>
<pre><code>now.getMonth();
now.getDate();
now.getTime();
...</code></pre><p>Date 객체의 다양한 메소드를 경험해보자.
<strong>코드</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;Date 객체&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Date 객체&lt;/h1&gt;
    &lt;script&gt;
        //1. Date 객체 생성
        var now = new Date();
        //2. 연도를 가져오는 메서드 .getFullYear()
        console.log(now.getFullYear());
        //3. 월 정보를 가져오는 메서드 .getMonth() {0: 1월, 1: 2월, ... 10: 11월, 11: 12월}
        console.log(now.getMonth());
        //4. 일 정보를 가져오는 메서드 .getDate()
        console.log(now.getDate());
        //5. 1970년 1월 1일 00:00:00을 기준으로 흐른 시간을 밀리초로 표시하는 메서드 .getTime()
        console.log(now.getTime());
        //6. 특정 일의 Date 객체 생성
        var christmas = new Date(&#39;2020-12-25&#39;);
        console.log(christmas);
        //7. 특정 ms의 Date 객체 생성
        var ms = new Date(1000);
        console.log(ms);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><hr>
<h3 id="기념일-계산기-1">기념일 계산기 1</h3>
<p>사귄지 며칠 째인지 계산하는 코드를 작성해보자.</p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/fe70de90-7749-4b41-add6-d4550e6019dc/image.png" alt="">
-&gt; 위와 같은 방법으로 계산해주면 &#39;만난 일수&#39;를 구할 수 있다.</p>
<p><strong>코드</strong></p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; integrity=&quot;sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;title&gt;기념일 계산기&lt;/title&gt;
    &lt;style&gt;
        * {
            color: #333333;
        }
        p {
            margin-bottom: 1px;
        }
        .photos {
            margin-top: 50px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #duhee {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-right: 30px;
        }
        #jisook {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-left: 30px;
        }
        #heart {
            width:50px;
            height:50px;
        }
        .gray {
            color: #a0a0a0;
        }
        .special-day {
            display: flex;
            justify-content: space-between;
        }
        .title {
            display: flex;
            align-items: center;
        }
        .days-left {
            text-align: right;
        }
        .date {
            text-align: right;
            color: #a0a0a0;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class=&quot;container&quot;&gt;
    &lt;section class=&#39;photos&#39;&gt;
        &lt;img id=&#39;duhee&#39; src=&quot;duhee.jpeg&quot; alt=&quot;duhee&quot;&gt;
        &lt;img id=&#39;heart&#39; src=&quot;heart.png&quot; alt=&quot;heart&quot;&gt;
        &lt;img id=&#39;jisook&#39; src=&quot;jisook.jpeg&quot; alt=&quot;jisook&quot;&gt;
    &lt;/section&gt;
    &lt;div class=&#39;container d-flex flex-column justify-content-center align-items-center mt-3&#39;&gt;
        &lt;h3&gt;두희♥지숙&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2020.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2020-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>Math.floor()는 소수점을 없애주는 내장 메소드이다.</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/08612a28-f858-49ca-b15e-e826dddf2ead/image.png" alt=""></p>
<hr>
<h3 id="기념일-계산기-2">기념일 계산기 2</h3>
<p>이번엔 기념일까지 몇일이 남았는지 알려주는 코드를 작성해보자.</p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/878a2ef5-d25f-4302-933c-8000ac5a47d9/image.png" alt="">
-&gt; 위와 같은 방법으로 계산해주면 &#39;기념일까지 몇일이 남았는지&#39;를 구할 수 있다.</p>
<p><strong>코드</strong></p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; integrity=&quot;sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;title&gt;기념일 계산기&lt;/title&gt;
    &lt;style&gt;
        * {
            color: #333333;
        }
        p {
            margin-bottom: 1px;
        }
        .photos {
            margin-top: 50px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #duhee {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-right: 30px;
        }
        #jisook {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-left: 30px;
        }
        #heart {
            width:50px;
            height:50px;
        }
        .gray {
            color: #a0a0a0;
        }
        .special-day {
            display: flex;
            justify-content: space-between;
        }
        .title {
            display: flex;
            align-items: center;
        }
        .days-left {
            text-align: right;
        }
        .date {
            text-align: right;
            color: #a0a0a0;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class=&quot;container&quot;&gt;
    &lt;section class=&#39;photos&#39;&gt;
        &lt;img id=&#39;duhee&#39; src=&quot;duhee.jpeg&quot; alt=&quot;duhee&quot;&gt;
        &lt;img id=&#39;heart&#39; src=&quot;heart.png&quot; alt=&quot;heart&quot;&gt;
        &lt;img id=&#39;jisook&#39; src=&quot;jisook.jpeg&quot; alt=&quot;jisook&quot;&gt;
    &lt;/section&gt;
    &lt;div class=&#39;container d-flex flex-column justify-content-center align-items-center mt-3&#39;&gt;
        &lt;h3&gt;두희♥지숙&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2020.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;발렌타인 데이&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;valentine&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p class=&#39;date&#39;&gt;2021.2.14&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2020-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);

        var valentine = new Date(&#39;2021-02-14&#39;);
        var timeDiff2 = valentine.getTime() - now.getTime();
        var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#valentine&#39;).text(day2 + &#39;일 남음&#39;);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/ec5cf86d-1fd6-4341-a0a4-94e6237ac7bf/image.png" alt=""></p>
<hr>
<h3 id="기념일-계산기-3">기념일 계산기 3</h3>
<p>이번엔 &#39;천일은 언제인가?&#39;를 계산해주는 코드를 작성해보자.
<img src="https://images.velog.io/images/mungge_jang322/post/32ecf87d-9af7-4e7f-aba9-d1379ab9258c/image.png" alt="">
-&gt; 위와 같이 계산해주면 구할 수 있다.</p>
<p><strong>코드</strong></p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; integrity=&quot;sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;title&gt;기념일 계산기&lt;/title&gt;
    &lt;style&gt;
        * {
            color: #333333;
        }
        p {
            margin-bottom: 1px;
        }
        .photos {
            margin-top: 50px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #duhee {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-right: 30px;
        }
        #jisook {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-left: 30px;
        }
        #heart {
            width:50px;
            height:50px;
        }
        .gray {
            color: #a0a0a0;
        }
        .special-day {
            display: flex;
            justify-content: space-between;
        }
        .title {
            display: flex;
            align-items: center;
        }
        .days-left {
            text-align: right;
        }
        .date {
            text-align: right;
            color: #a0a0a0;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class=&quot;container&quot;&gt;
    &lt;section class=&#39;photos&#39;&gt;
        &lt;img id=&#39;duhee&#39; src=&quot;duhee.jpeg&quot; alt=&quot;duhee&quot;&gt;
        &lt;img id=&#39;heart&#39; src=&quot;heart.png&quot; alt=&quot;heart&quot;&gt;
        &lt;img id=&#39;jisook&#39; src=&quot;jisook.jpeg&quot; alt=&quot;jisook&quot;&gt;
    &lt;/section&gt;
    &lt;div class=&#39;container d-flex flex-column justify-content-center align-items-center mt-3&#39;&gt;
        &lt;h3&gt;두희♥지숙&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2020.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;발렌타인 데이&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;valentine&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p class=&#39;date&#39;&gt;2021.2.14&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;1000일&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;thousand&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p id=&#39;thousand-date&#39; class=&#39;date&#39;&gt;0000.00.00&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2020-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);

        var valentine = new Date(&#39;2021-02-14&#39;);
        var timeDiff2 = valentine.getTime() - now.getTime();
        var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#valentine&#39;).text(day2 + &#39;일 남음&#39;);

        var ms = start.getTime() + 999 * (1000 * 60 * 60 * 24);
        var thousand = new Date(ms);
        var thousandDate = thousand.getFullYear() + &#39;.&#39; + (thousand.getMonth()+1) + &#39;.&#39; + thousand.getDate();
        $(&#39;#thousand-date&#39;).text(thousandDate);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/f6d51445-f24c-4ccf-aac3-999b29b5e2c7/image.png" alt=""></p>
<hr>
<h3 id="기념일-계산기-4">기념일 계산기 4</h3>
<p>천일이 언제인지 구했으니 천일까지 얼마나 남았는지 코드로 작성해보자.</p>
<p><strong>코드</strong></p>
<pre><code>&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;link rel=&quot;stylesheet&quot; href=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&quot; integrity=&quot;sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;title&gt;기념일 계산기&lt;/title&gt;
    &lt;style&gt;
        * {
            color: #333333;
        }
        p {
            margin-bottom: 1px;
        }
        .photos {
            margin-top: 50px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #duhee {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-right: 30px;
        }
        #jisook {
            width:150px;
            height:150px;
            object-fit:cover;
            border-radius:50%;
            margin-left: 30px;
        }
        #heart {
            width:50px;
            height:50px;
        }
        .gray {
            color: #a0a0a0;
        }
        .special-day {
            display: flex;
            justify-content: space-between;
        }
        .title {
            display: flex;
            align-items: center;
        }
        .days-left {
            text-align: right;
        }
        .date {
            text-align: right;
            color: #a0a0a0;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body class=&quot;container&quot;&gt;
    &lt;section class=&#39;photos&#39;&gt;
        &lt;img id=&#39;duhee&#39; src=&quot;duhee.jpeg&quot; alt=&quot;duhee&quot;&gt;
        &lt;img id=&#39;heart&#39; src=&quot;heart.png&quot; alt=&quot;heart&quot;&gt;
        &lt;img id=&#39;jisook&#39; src=&quot;jisook.jpeg&quot; alt=&quot;jisook&quot;&gt;
    &lt;/section&gt;
    &lt;div class=&#39;container d-flex flex-column justify-content-center align-items-center mt-3&#39;&gt;
        &lt;h3&gt;두희♥지숙&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2020.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;발렌타인 데이&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;valentine&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p class=&#39;date&#39;&gt;2021.2.14&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;1000일&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;thousand&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p id=&#39;thousand-date&#39; class=&#39;date&#39;&gt;0000.00.00&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2020-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);

        var valentine = new Date(&#39;2021-02-14&#39;);
        var timeDiff2 = valentine.getTime() - now.getTime();
        var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#valentine&#39;).text(day2 + &#39;일 남음&#39;);

        var thousand = new Date(start.getTime() + 999 * (1000 * 60 * 60 * 24));
        var thousandDate = thousand.getFullYear() + &#39;.&#39; + (thousand.getMonth()+1) + &#39;.&#39; + thousand.getDate();
        $(&#39;#thousand-date&#39;).text(thousandDate);

        var timeDiff3 = thousand.getTime() - now.getTime();
        var day3 = Math.floor(timeDiff3 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#thousand&#39;).text(day3 + &#39;일 남음&#39;);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/5013b724-aa52-4150-9bff-fb9e0047a6f8/image.png" alt=""></p>
<hr>
<h1 id="chapter-6">Chapter 6</h1>
<h2 id="프로젝트-배포하기">프로젝트 배포하기</h2>
<h3 id="github">GitHub</h3>
<p>우리가 작성한 코드를 인터넷 서버에 올리는 작업을 해보자.</p>
<h4 id="github란">GitHub란?</h4>
<p>: 인터넷 상에 코드를 저장할 수 있는 공간을 제공해주는 웹서비스이다.</p>
<ul>
<li>원격저장소라고 부르기도 한다.</li>
<li>깃허브는 단순히 코드를 저장하는 것을 넘어서 누가 어느 부분을 수정했는지 예전 코드는 뭐였는지를 알 수 있어 버전관리도 할 수 있어 여러 사람이 협업할 때 사용할 수 있다.</li>
</ul>
<p><strong>원격저장소란?</strong></p>
<ul>
<li>우리는 보통 본인의 컴퓨터에 코드를 작성하게 되는데, 이렇게 작성한 코드를 깃허브 라는 원격 저장공간에 밀어넣어서 보관하도록 하는 것이다.</li>
<li>이렇게 원격저장소에 저장해두면 내 컴퓨터가 고장이 나거나 잃어버려도 그대로 불러올 수 있다.</li>
<li>또한, 본인뿐만 아니라 다른 사람들도 권한을 주면 여러명이 내 저장공간에 접근하여 코드를 받고 수정할 수 있다.</li>
</ul>
<hr>
<h3 id="github---가입-및-저장소-생성">Github - 가입 및 저장소 생성</h3>
<ol>
<li>인터넷 브라우저에서 <a href="https://github.com/">github.com</a> 사이트에 접속해 가입한다.</li>
<li>repository(리포지토리)를 생성한다. - 원격저장소를 만드는 것</li>
<li>리포지토리 이름은 자유롭게 정한다.</li>
</ol>
<hr>
<h3 id="github---push">Github - push</h3>
<p>이번엔 우리가 만든 코드를 github repository에 올려보자.</p>
<p>push(나의 코드를 원격저장소에 올리기)를 하기 전에 설정해야 할 것들이 있다.</p>
<pre><code>- 시작하기: git init        //이 프로젝트를 git으로 관리하겠다는 의미
- 유저 이름 설정: git config --global user.name &quot;jangmungge&quot;
- 이메일 등록: git config --global user.email #####@gmail.com</code></pre><p>위의 과정을 모두 마쳤다면 아래와 같이 파일을 추가 하는 것부터 시작해서 push해보자.</p>
<pre><code>- 모든파일 추가: git add .
- 특정파일 추가: git add 파일명
- 메세지(커밋) 입력: git commit -m &quot;first commit&quot;    //어떤 작업을 했는지 설명을 입력한다.
- 보낼 곳(원격저장소) 등록: git remote add origin https://github.com/codelion-jocoding/myrepo.git
- 보낼 곳(원격저장소)으로 코드 전송: git push origin master</code></pre><p>-&gt; 후에 등록이 잘 되었는지 리포지토리 확인해주자!</p>
<hr>
<h3 id="deploy">Deploy</h3>
<ul>
<li><p>아무리 잘 만든 웹서비스여도 내 컴퓨터에만 있으면 아무 의미가 없다!</p>
</li>
<li><p>그래서 전세계 사람들이 접속 할 수 있도록 웹 서버에 올려야 비로소 웹사이트라 할 수 있다!</p>
</li>
<li><p>github에 올린 코드를 웹서버에 올리는 작업을 해보자.</p>
</li>
<li><p>이런 웹서버를 제공하는 대표하는 기업으로 aws, Azure, Google Cloud이 있다.</p>
</li>
<li><p>그러나 이러한 서비스는 여러가지 기능도 있고 확장성도 있지만 유료여서 길게 사용하긴 힘들다는 단점이 있다.</p>
</li>
<li><p>따라서 우리는 netlify라는 서비스를 사용해볼 것이다.</p>
</li>
</ul>
<hr>
<h3 id="netlify로-deploy하기">Netlify로 deploy하기</h3>
<ol>
<li><a href="https://www.netlify.com/">netlify.com</a> 사이트에 접속한다.</li>
<li>우측 상단에 sigh up 버튼을 클릭해 회원가입을 한다.(github계정 연동으로 가입할 수 있다.)</li>
<li>&#39;New site from Git&#39; 버튼을 눌러준다.</li>
<li>github버튼을 눌러준다.</li>
<li>Authorize Netlify 눌러서 깃허브와 연결해준다.</li>
<li>다시 한번 github버튼을 눌러준다.</li>
<li>내용을 다 입력하고 Deploy site를 눌러준다.</li>
<li>조금만 기다리면 deploy가 되어 주소가 생성된다.</li>
<li>주소를 클릭하면 우리가 만든 웹사이트가 생성된 것을 볼 수 있다.</li>
<li>추가적으로 주소가 굉장히 복잡하게 되어있는데 site setting으로 들어가서 change site name을 이용해 이름을 바꿔줄 수 있다.</li>
<li>그럼 전세계 누구라도 이 주소로 접속하면 이 웹사이트에 접속이 가능하다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2일차] Python]]></title>
            <link>https://velog.io/@mungge_jang322/2%EC%9D%BC%EC%B0%A8-Python</link>
            <guid>https://velog.io/@mungge_jang322/2%EC%9D%BC%EC%B0%A8-Python</guid>
            <pubDate>Tue, 22 Feb 2022 11:24:58 GMT</pubDate>
            <description><![CDATA[<h1 id="chapter-1">chapter 1</h1>
<h2 id="python을-배워야-하는-이유">Python을 배워야 하는 이유</h2>
<p>요즘 IT의 핫한 핵심 키워드가 모두 데이터와 관련되어 있다.
ex) 머신러닝, 딥러닝, 데이터 마이닝, 빅 데이터, 인공지능 등</p>
<p>한때는 작은 범위를 말했던 데이터 사이언스가 이제는 저 키워드를 다 삼키는 것을 넘어서 비즈니스와 마케팅, 의학, 스포츠등으로 다른 영역까지 침투하고 있습니다.</p>
<p>데이터는 현 시대를 사는 모든 사람을 관통하는 키워드가 되었다.</p>
<p>이렇게 우리가 데이터가 중요한 세상에 살고 있는데 어떡해야 데이터를 소유하고, 어떻게 데이터를 다룰까에 대해서 고민을 해보면 그 답은 <strong>&#39;파이썬&#39;</strong> 에 있다.</p>
<blockquote>
<p>데이터를 다룰 때 가장 많이 쓰는 언어가 파이썬이다.</p>
</blockquote>
<p>파이썬은 데이터와 함께 성장하고 있는 언어이다.
데이터의 중요성이 부각되기 이전 파이썬은 그냥 흔한 언어 중 하나였다.</p>
<p>그런데 데이터 처리 관련 능력이 급격히 발전하면서 이제 파이썬은 독자적인 위치로 급부상을 했고, 지금은 사실 대체 불가능한 영역까지 올라와 있다.</p>
<p>데이터가 다양한 영역으로 확장되면서 파이썬도 똑같이 다양한 영역으로 확장을 하고 있다.</p>
<p>따라서 현재 가장 대중화된 언어 중 하나이자 가장 좋은 평가를 받고 있는 언어 중에 하나이다.</p>
<p>현재 가장 큰 클라우드 서비스인 아마존 클라우드가 파이썬을 전폭적으로 지원하고 있다.
아마존 뿐만 아니라, 다른 대형 IT 회사들이 파이썬을 기본 제공하고 있고, 다른 언어를 옵션으로 두는 경우가 굉장히 많다.</p>
<p>따라서 파이썬을 할 수 있는 사람이 최첨단 기술을 남들보다 빠르게 접할 수 있게 되는 것이다.</p>
<blockquote>
<p>하지만 파이썬의 장점은 이런 기술적인 이야기를 다 떠나서 파이썬 생태계가 아주 크다는 점에 있다.</p>
</blockquote>
<p>이미 오픈 소스로 선개발된 프로그램이 많아서 코드 한줄, 한줄을 우리가 직접 짜지 않고 남이 가져다준걸 쓸 수 있다.</p>
<ol>
<li>즉, 오픈 소스 활용 폭이 굉장히 넓다.</li>
<li>또한 활성화된 온/오프라인 커뮤니티가 굉장히 많아서 질문 답변이 쌓인 양이 다른 언어에 비해 굉장히 풍부하다. 그래서 코딩하다가 헤매는 상황을 빠르게 탈출이 가능하다!</li>
<li>거기에 더해서 행사도 굉장히 많아서 비슷한 작업을 하는 사람을 굉장히 쉽게 만날 수 있는데 이런 것은 정말 다른 언어에서 누릴 수 없는 굉장히 큰 장점이다.</li>
<li>파이썬을 사용하는 회사가 많아서 직장을 선택할 때 폭이 넓은 편이다.</li>
</ol>
<hr>
<h1 id="chapter-2">Chapter 2</h1>
<h2 id="오늘은-뭐-드실-제작하기">&#39;오늘은 뭐 드실?&#39; 제작하기</h2>
<h3 id="python-맛보기">Python 맛보기</h3>
<p><strong>예시</strong></p>
<pre><code>import random            //import 모듈

print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;]))</code></pre><ul>
<li>위 예시는 된장찌개, 피자, 제육볶음 중 하나를 랜덤으로 골라 출력하는 코드이다.</li>
<li>된장찌개, 피자, 제육볶음을 싸고 있는 대괄호는 List라는 python자료형이다.</li>
<li>random 기능은 python이 가진 기본 기능이 아니기 때문에 import random 코드를 맨 위에 작성해준다. </li>
<li>기본 기능인 print를 사용할 때는 다른 별도의 import를 사용하지 않는다.</li>
<li>python은 이와 같이 기본 기능이 아닌 함수를 사용할 때 import를 해주어야 사용이 가능하다.</li>
</ul>
<p><strong>파이썬 코드 실행 방법</strong></p>
<pre><code>python 파일명.py</code></pre><ul>
<li>위 명령어를 터미널에 입력해준다.</li>
<li>명령어를 한번 입력했다면, 그 뒤부터는 바로 전 명령어를 위 방향키를 누르면 자동으로 입력된다.</li>
</ul>
<hr>
<h3 id="직접-반복하기">직접 반복하기</h3>
<ul>
<li>랜덤으로 30개의 음식을 뽑아보자.</li>
<li><em>코드*</em><pre><code>import random
</code></pre></li>
</ul>
<p>print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))</p>
<pre><code>- 위 내용은 직접 코드를 복사 붙여넣기를 통해 30줄을 작성한 것이다.
**결과**</code></pre><p>치킨
된장찌개
된장찌개
라면
제육볶음
치킨
피자
피자
된장찌개
라면
된장찌개
된장찌개
제육볶음
떡볶이
피자
떡볶이
피자
피자
라면
치킨
피자
떡볶이
라면
치킨
치킨
제육볶음
제육볶음
떡볶이
피자
떡볶이</p>
<pre><code>- 위와 같이 30개의 음식이 랜덤으로 잘 나오는 것을 확인 할 수 있다.

**문제점**
- 메뉴를 추가,수정,삭제할 때 모든 코드를 하나하나 다 수정을 해야 해서 번거롭다.
- 코드 수정시 오타가 생길 가능성도 크고, 시간도 많이 소요된다.

---

### 대신 반복하기
- 동일한 코드를 여러번 작성하는 것이 아닌 for문과 while문을 사용해서 print문을 반복해보자.

#### 1. for문 사용
**형식**</code></pre><p>for 변수 in 리스트(또는 튜플, 문자열):</p>
<pre><code>- in 다음 설정하는 것에 따라 반복하는 횟수와 변수에 들어가게 되는 내용이 달라진다.

**코드**</code></pre><p>import random</p>
<p>for x in range(30):<br>    print(random.choice([&quot;된장찌개&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))</p>
<pre><code>- for: 이제 반복을 시작하겠다는 뜻.
- range(30): 0~29까지 숫자를 세겠다는 뜻.
- x in range(30): 0부터 29까지의 숫자를 셀 때마다 변수 x에 넣겠다는 뜻.
- 끝에 있는 &#39;:&#39;콜론: for문에서 꼭 쓰는 마침표 같은 존재.
- &#39;for x in range(30):&#39;은 아래 있는 코드를 30번 반복하겠다는 뜻.

**결과**</code></pre><p>치킨
치킨
된장찌개
라면
된장찌개
된장찌개
치킨
제육볶음
떡볶이
된장찌개
된장찌개
제육볶음
라면
제육볶음
제육볶음
라면
라면
제육볶음
라면
제육볶음
떡볶이
치킨
제육볶음
라면
된장찌개
떡볶이
라면
떡볶이
치킨
된장찌개</p>
<pre><code>- 위와 같이 결과는 동일하게 잘 나온다.
- 코드 수가 30줄에서 2줄로 바뀌어 더욱 읽기 쉬워졌다.
- 메뉴 추가,수정,삭제시에도 한줄만 수정하면 된다.

#### python의 강력한 들여쓰기를 확인해보자!
**예시1**
- for문 아래 문장은 들여쓰기가 되어있는 문장이고, 바로 다음 줄 print문은 들여쓰기가 되어있지 않다.</code></pre><p>import random</p>
<p>for x in range(30):
    print(random.choice([&quot;된장찌개&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
print(&quot;이 문장도 반복되나&quot;)</p>
<pre><code>**결과**</code></pre><p>치킨
치킨
된장찌개
라면
된장찌개
된장찌개
치킨
제육볶음
떡볶이
된장찌개
된장찌개
제육볶음
라면
제육볶음
제육볶음
라면
라면
제육볶음
라면
제육볶음
떡볶이
치킨
제육볶음
라면
된장찌개
떡볶이
라면
떡볶이
치킨
된장찌개
이 문장도 반복되나</p>
<pre><code>
**예시2**
- for문 아래 문장과 바로 다음 줄 print문까지 들여쓰기가 되어있다.</code></pre><p>import random</p>
<p>for x in range(30):
    print(random.choice([&quot;된장찌개&quot;,&quot;제육볶음&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;]))
    print(&quot;이 문장도 반복되나&quot;)</p>
<pre><code>**결과**</code></pre><p>된장찌개
이 문장도 반복되나
제육볶음
이 문장도 반복되나
라면
이 문장도 반복되나
된장찌개
이 문장도 반복되나
제육볶음
이 문장도 반복되나
된장찌개
이 문장도 반복되나
된장찌개
이 문장도 반복되나
된장찌개
이 문장도 반복되나
떡볶이
이 문장도 반복되나
된장찌개
이 문장도 반복되나
제육볶음
이 문장도 반복되나
라면
이 문장도 반복되나
제육볶음
이 문장도 반복되나
치킨
이 문장도 반복되나
제육볶음
이 문장도 반복되나
치킨
이 문장도 반복되나
제육볶음
이 문장도 반복되나
라면
이 문장도 반복되나
치킨
이 문장도 반복되나
제육볶음
이 문장도 반복되나
된장찌개
이 문장도 반복되나
된장찌개
이 문장도 반복되나
떡볶이
이 문장도 반복되나
제육볶음
이 문장도 반복되나
라면
이 문장도 반복되나
제육볶음
이 문장도 반복되나
라면
이 문장도 반복되나
라면
이 문장도 반복되나
된장찌개
이 문장도 반복되나
된장찌개
이 문장도 반복되나</p>
<pre><code>
**결론**
- **예시1**과 **예시2**를 보면 알 수 있듯이 python은 들여쓰기를 엄청나게 강력하게 체크를 한다.
- 다른 언어들은 명시적 체크를 해주어야 가능하거나 들여쓰기가 좀 잘못되어도 크게 문제가 되지 않을 때가 있다.
- 들여쓰기를 하면 for문에 포함이 된다.

#### 2. while문 사용
**형식**</code></pre><p>while 조건문:
    적용코드</p>
<pre><code>- while문은 위 조건문이 참일 때만 반복하게 된다.

**코드**</code></pre><p>import random</p>
<p>while True:
    print(random.choice([&quot;된장찌개&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;,&quot;감자튀김&quot;]))
    print(&quot;이 문장도 반복되나&quot;)</p>
<pre><code>- 이렇게 작성하게 되면 조건문이 계속 참이기 때문에 무한반복이 되며 굉장히 빠른 속도로 출력하게 된다.

**코드수정**</code></pre><p>import random
import time</p>
<p>while True:
    print(random.choice([&quot;된장찌개&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;,&quot;감자튀김&quot;]))
    print(&quot;이 문장도 반복되나&quot;)
    time.sleep(1)</p>
<pre><code>- time모듈을 추가해서 1초마다 출력되도록 변경해서 출력시간을 천천히 한다.
- 그렇지만 무한 반복이기에 ctrl+c를 눌러 멈춰야 한다.

**코드수정2 - break 사용**</code></pre><p>import random
import time</p>
<p>while True:
    print(random.choice([&quot;된장찌개&quot;,&quot;치킨&quot;,&quot;떡볶이&quot;,&quot;라면&quot;,&quot;감자튀김&quot;]))
    break
    print(&quot;이 문장도 반복되나&quot;)
    time.sleep(1)</p>
<pre><code>- break문을 만나게되면 반복문에서 반복을 멈추고 나오게 된다.

---
### 데이터 상자 만들기

- 점심메뉴를 담는 데이터 상자(변수) lunch와 저녁메뉴를 담는 데이터 상자(변수) dinner를 작성해보자.
- 데이터를 담는 상자를 변수라고 한다.

**코드**</code></pre><p>import random</p>
<p>lunch = random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;])
dinner = random.choice([&quot;김밥&quot;,&quot;쫄면&quot;,&quot;돈까스&quot;])
print(lunch)</p>
<pre><code>**결과**</code></pre><p>피자</p>
<pre><code>- 이런식으로 랜덤선정된 점심메뉴가 lunch라는 변수에 담겨 출력된다.

---

### Dictionary
- python 자료형 중 하나인 Dictionary에 대해 알아보자.

**Dictionary란?**
: 사전(dictionary)은 파이썬에서 리스트(list)와 더불어 가장 많이 사용되는 내장 데이터 타입 중 하나이다.
- 해시 테이블(hash table) 자료 구조 기반으로 하는 사전(dictionary)은 키(key)와 값(value)으로 이루어진 여러 쌍의 데이터를 담아 둘 때 사용한다.

**코드**</code></pre><p>information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;, &quot;좋아하는 음식&quot;:&quot;국수&quot;}
print(information)
print(information.get(&quot;취미&quot;))</p>
<pre><code>- 여기서 key는 고향, 취미, 좋아하는 음식이고, value는 수원, 영화관람, 국수이다.

**결과**</code></pre><p>{&#39;고향&#39;: &#39;수원&#39;, &#39;취미&#39;: &#39;영화관람&#39;, &#39;좋아하는 음식&#39;: &#39;국수&#39;}
영화관람</p>
<pre><code>- 첫번째로, dictionary가 그대로 출력되고 두번째로, dictionary의 get함수를 이용해 입력한 key(&quot;취미&quot;)에 맞는 value(&quot;영화관람&quot;)를 출력한다.

---

### List와 Dictionary
#### 1. Dictionary 사용법
**&lt; 특정값 가져오기 &gt;**

**코드** </code></pre><p>information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;,&quot;좋아하는 음식&quot;:&quot;국수&quot;}
print(information.get(&quot;취미&quot;))</p>
<pre><code>**결과**</code></pre><p>영화관람</p>
<pre><code>**&lt; 값 추가 &gt;**
**코드** </code></pre><p>information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;,&quot;좋아하는 음식&quot;:&quot;국수&quot;}
information[&quot;특기&quot;] = &quot;피아노&quot;
information[&quot;사는곳&quot;] = &quot;서울&quot;
print(information)</p>
<pre><code>**결과**</code></pre><p>{&#39;고향&#39;: &#39;수원&#39;, &#39;취미&#39;: &#39;영화관람&#39;, &#39;좋아하는 음식&#39;: &#39;국수&#39;, &#39;특기&#39;: &#39;피아노&#39;, &#39;사는곳&#39;: &#39;서울&#39;}</p>
<pre><code>
**&lt; 값 삭제 &gt;**
**코드**</code></pre><p>information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;,&quot;좋아하는 음식&quot;:&quot;국수&quot;}
del information[&quot;좋아하는 음식&quot;]
print(information)</p>
<pre><code>**결과**</code></pre><p>{&#39;고향&#39;: &#39;수원&#39;, &#39;취미&#39;: &#39;영화관람&#39;}</p>
<pre><code>
**&lt; key, value 쌍 갯수 출력 &gt;**
**코드**</code></pre><p>information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;,&quot;좋아하는 음식&quot;:&quot;국수&quot;}
print(len(information))</p>
<pre><code>**결과**</code></pre><p>3</p>
<pre><code>- len은 length의 줄임말로 개수나 길이를 출력해준다.

**&lt; 값 모두 삭제 &gt;**
**코드**</code></pre><p>information.clear()
print(information)</p>
<pre><code>**결과**</code></pre><p>{}</p>
<pre><code>
#### 2. List 사용법
**&lt; 특정 값 읽기 &gt;**

**코드** </code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
print(foods[-2])</p>
<pre><code>**결과**</code></pre><p>피자</p>
<pre><code>![](https://images.velog.io/images/mungge_jang322/post/4e6b1ac3-0fd9-437e-9fb5-3cc615a38065/image.png)

**&lt; 값 추가 &gt;**
**코드** </code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
foods.append(&quot;김밥&quot;)
print(foods)</p>
<pre><code>**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;김밥&#39;]</p>
<pre><code>
**&lt; 값 삭제 &gt;**
**코드**</code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
del foods[1]
print(foods)</p>
<pre><code>**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;제육볶음&#39;]</p>
<pre><code>---

### 끝까지 반복하기
#### 모든 딕셔너리의 각 요소 출력하기
**코드**</code></pre><p>information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;, &quot;좋아하는 음식&quot;:&quot;국수&quot;}
for x, y in information.items():
    print(x)
    print(y)</p>
<pre><code>
**결과**</code></pre><p>고향
수원
취미
영화관람
좋아하는 음식
국수</p>
<pre><code>- 딕셔너리의 경우 key, value 두가지 요소를 쌍으로 받아야 해서 x, y 두개의 변수 지정을 해주어야 한다. 
- 각각 앞에서부터 x(=key), y(=value)이렇게 대입된다.
- 딕셔너리의 요소가 100개든 1000개든 모두 요소 출력이 가능하다.

#### 모든 리스트의 각 요소 출력하기
**코드**</code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
for x in range(3):
    print(foods[x])</p>
<pre><code>**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;]</p>
<pre><code>- 모든 요소를 출력하며 결과가 잘 나온다. 하지만, 이렇게 되면 리스트의 길이가 변할때마다(요소가 추가되거나 삭제될 때) 숫자를 일일이 수정해주어야 한다.
- 따라서 아래와 같이 코드를 수정해서 효율을 높이자.

**수정된 코드**</code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
for x in foods:
    print(x)</p>
<pre><code>**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;]</p>
<pre><code>- 이렇게 수정되면 리스트의 요소가 100개든 1000개든 모두 요소 출력이 가능하다.

---

### 집합 알아보기</code></pre><p>information = [&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;]
information.append(&quot;된장찌개&quot;)</p>
<pre><code>-&gt; 위와 같이 코드를 작성하게 되면 한 리스트에 데이터(된장찌개)가 중복된다.
- 이렇게 메뉴 개수가 적으면 중복여부를 쉽게 알 수 있지만, 메뉴가 세기 힘들게 많아진다면 중복을 확인하기 힘들다.
&gt; 이때 필요한 것이 집합이다.

#### 집합이란? 
- 여러가지 원소들의 모음이다.
- 리스트는 순서가 명확한 반면, 집합은 순서가 없다.
- 리스트와 달리 겹치는 요소 즉, 중복된 요소가 없다.

**합집합 연산**
- 두개의 집합을 합치게 되면 중복되는 요소를 하나로 합쳐준다.

**차집합 연산**
- 두 집합에 대해서 겹치는 요소를 빼준다.

**교집합 연산**
- 겹치는 요소만 뽑아준다.

&gt; 리스트를 set()으로 감싸면 어떻게 될까?

**코드**</code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
foods_set1 = set(foods)
print(foods_set1)</p>
<pre><code>**결과**</code></pre><p>{&#39;피자&#39;, &#39;된장찌개&#39;, &#39;제육볶음&#39;}</p>
<pre><code>- 순서가 있는 리스트를 set()으로 감쌌더니 순서가 없는 집합이 되었다.

---

### 집합 사용하기
- 집합을 특성을 사용해 리스트의 중복을 없애보자.

**코드**</code></pre><p>foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;된장찌개&quot;]
foods_set = set(foods)
print(foods)
print(foods_set)</p>
<pre><code>**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;된장찌개&#39;]
{&#39;제육볶음&#39;, &#39;피자&#39;, &#39;된장찌개&#39;}</p>
<pre><code>- 리스트 출력에선 된장찌개가 2개가 나왔지만, 집합에선 1개로 합쳐 나왔다.
- 리스트를 집합으로 변경하면 중복을 없앨 수 있다.


**&lt; 합집합 &gt;**
**코드**</code></pre><p>menu1 = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;])
menu2 = set([&quot;된장찌개&quot;, &quot;떡국&quot;, &quot;김밥&quot;])
menu3 = menu1 | menu2
print(menu3)</p>
<pre><code>**결과**</code></pre><p>{&#39;피자&#39;, &#39;제육볶음&#39;, &#39;김밥&#39;, &#39;된장찌개&#39;, &#39;떡국&#39;}</p>
<pre><code>
**&lt; 교집합 &gt;**
**코드**</code></pre><p>menu1 = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;])
menu2 = set([&quot;된장찌개&quot;, &quot;떡국&quot;, &quot;김밥&quot;])
menu3 = menu1 &amp; menu2
print(menu3)</p>
<pre><code>**결과**</code></pre><p>{&#39;된장찌개&#39;}</p>
<pre><code>
**&lt; 차집합 &gt;**
**코드**</code></pre><p>menu1 = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;])
menu2 = set([&quot;된장찌개&quot;, &quot;떡국&quot;, &quot;김밥&quot;])
menu3 = menu1 - menu2
print(menu3)</p>
<pre><code>**결과**</code></pre><p>{&#39;피자&#39;, &#39;제육볶음&#39;}</p>
<pre><code>---

### 만약에
- 랜덤으로 뽑았을 때 만약에 제육볶음이 나오면 곱배기로 먹고싶다면?
-&gt; 조건문인 if문을 사용해보자!
**코드**</code></pre><p>import random</p>
<p>food = random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;])</p>
<p>print(food)
if(food == &quot;제육볶음&quot;):
    print(&quot;곱배기 주세요&quot;)
else:
    print(&quot;그냥 주세요&quot;)
print(&quot;종료&quot;)</p>
<pre><code>- if문도 반복문인 for문, while문과 마찬가지로 들여쓰기를 통해 영역 지정을 해준다.
- else문은 앞에 if문을 썼을 때만 사용가능하며, if조건문에 들어가지 않는 모든 조건을 의미한다.

---

### [오늘은 뭐드실?] 제작하기(1)

**코드**
- 기존 메뉴에 돈까스 메뉴를 추가해보자.</code></pre><p>lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;]
item = input(&quot;음식을 추가 해주세요 : &quot;)
lunch.append(item)
print(lunch)</p>
<pre><code>- input함수를 이용해 값을 받아와 list에 추가해주는 코드이다.

**결과**</code></pre><p>음식을 추가 해주세요 : 돈까스
[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;]</p>
<pre><code>
---

### [오늘은 뭐드실?] 제작하기(2)
- while문을 이용해 음식을 계속해서 추가해보고, q를 입력하면 종료하도록 해보자.

**코드**</code></pre><p>lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;]</p>
<p>while True:
    print(lunch)
    item = input(&quot;음식을 추가 해주세요 : &quot;)
    if(item == &quot;q&quot;):
        break
    else:
        lunch.append(item)</p>
<p>print(lunch)</p>
<pre><code>
**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;]
음식을 추가 해주세요 : 돈까스
[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;]
음식을 추가 해주세요 : q
[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;]</p>
<pre><code>- 돈까스는 추가되고 q를 입력하니 전체 음식을 출력하고 종료된다.

---

### [오늘은 뭐드실?] 제작하기(3)
- 짜장면을 메뉴에서 빼보자.
**코드**</code></pre><p>set_dinner = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;])
food = &quot;짜장면&quot;</p>
<p>print(set_dinner - food)</p>
<pre><code>- 위 코드를 실행시켜보면 error가 발생한다.
- &#39;-&#39; 차집합 기호는 집합과 집합간에만 사용이 가능해서, 집합에서 문자열을 빼는 것은 불가능해 발생하는 error이다.
- 따라서 문자열인 food를 집합으로 바꿔줘야한다. 문자열이 집합이 되기 위해서는 리스트로 만든 후 set()으로 감싸야 한다.

**수정된 코드**</code></pre><p>set_dinner = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;])
food = &quot;짜장면&quot;</p>
<p>print(set_dinner - set([food]))
print(set_dinner)</p>
<pre><code>**결과**</code></pre><p>{&#39;피자&#39;, &#39;제육볶음&#39;, &#39;된장찌개&#39;}
{&#39;피자&#39;, &#39;제육볶음&#39;, &#39;된장찌개&#39;, &#39;짜장면&#39;}</p>
<pre><code>- food 문자열을 집합으로 변경해서 실행하면 에러가 발생하지 않는다. 그러나, 차집합 연산을 한 뒤에 set_dinner에는 실질적으로 짜장면이 빠진 것은 아니다.
- 이를 해결하기 위해서는 차집합을 그대로 원래의 집합인 set_dinner에 대입을 하면 된다.

**수정된 코드**</code></pre><p>set_dinner = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;])
food = &quot;짜장면&quot;</p>
<p>set_dinner = set_dinner - set([food])
print(set_dinner)</p>
<pre><code>**결과**</code></pre><p>{&#39;피자&#39;, &#39;제육볶음&#39;, &#39;된장찌개&#39;}</p>
<pre><code>
---

### [오늘은 뭐드실?] 제작하기(4)

**코드**</code></pre><p>import random
import time</p>
<p>lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;]</p>
<p>while True:
    print(lunch)
    item = input(&quot;음식을 추가 해주세요 : &quot;)
    if(item == &quot;q&quot;):
        break
    else:
        lunch.append(item)
print(lunch)</p>
<p>set_lunch = set(lunch)
while True:
    print(set_lunch)
    item = input(&quot;음식을 삭제해주세요 : &quot;)
    if(item == &quot;q&quot;):
        break
    else:
        set_lunch = set_lunch - set([item])</p>
<p>print(set_lunch, &quot;중에서 선택합니다.&quot;)
print(&quot;5&quot;)
time.sleep(1)
print(&quot;4&quot;)
time.sleep(1)
print(&quot;3&quot;)
time.sleep(1)
print(&quot;2&quot;)
time.sleep(1)
print(&quot;1&quot;)
time.sleep(1)
print(random.choice(list(set_lunch)))</p>
<pre><code>**결과**</code></pre><p>[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;]
음식을 추가 해주세요 : 돈까스
[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;]
음식을 추가 해주세요 : q
[&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;]
{&#39;피자&#39;, &#39;된장찌개&#39;, &#39;돈까스&#39;, &#39;제육볶음&#39;, &#39;짜장면&#39;}
음식을 삭제해주세요 : 된장찌개
{&#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;, &#39;피자&#39;}
음식을 삭제해주세요 : q
{&#39;제육볶음&#39;, &#39;짜장면&#39;, &#39;돈까스&#39;, &#39;피자&#39;} 중에서 선택합니다.
5
4
3
2
1
피자</p>
<pre><code>- 기존 메뉴가 있는 상태에서 원하는 메뉴를 추가하고 추가가 끝나면 q를 입력해 종료
- 삭제를 원하는 메뉴가 있다면 입력하고 입력이 끝나면 q를 입력해 종료
- 이후 남은 목록 중 랜덤으로 메뉴를 선정하는 코드이다.
---

### [오늘은 뭐드실?] 정리하기

**최종코드 리뷰**</code></pre><p>import random        //메뉴를 랜덤으로 뽑기 위해 import
import time            //초를 세기 위해 import</p>
<p>lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;] //리스트 형태로 메뉴 저장</p>
<p>while True:                //무한루프
    print(lunch)
    item = input(&quot;음식을 추가 해주세요 : &quot;)    //메뉴를 입력받는다.
    if(item == &quot;q&quot;):<br>        break                //사용자 입력이 q이면 반복문 종료
    else:
        lunch.append(item)    //사용자 입력이 q가 아닌 경우 리스트에 추가
print(lunch)</p>
<p>set_lunch = set(lunch)        //리스트를 집합으로 변경해 중복제거
while True:
    print(set_lunch)
    item = input(&quot;음식을 삭제해주세요 : &quot;)
    if(item == &quot;q&quot;):
        break
    else:
        set_lunch = set_lunch - set([item])        //차집합을 통해 요소 삭제</p>
<p>print(set_lunch, &quot;중에서 선택합니다.&quot;)    //,(콤마)로 변수와 문자열을 동시 출력할 수 있다.
print(&quot;5&quot;)
time.sleep(1)        //1초 쉬기
print(&quot;4&quot;)
time.sleep(1)
print(&quot;3&quot;)
time.sleep(1)
print(&quot;2&quot;)
time.sleep(1)
print(&quot;1&quot;)
time.sleep(1)
print(random.choice(list(set_lunch)))    //랜덤으로 메뉴 최종 선정</p>
<pre><code>

---

# Chapter 3
## Python으로 만드는 익명 질문 게시판
### 함수 알아보기
**돌체라떼 레시피**
![](https://images.velog.io/images/mungge_jang322/post/f0253619-b2d0-4f5c-97c4-e0b37e241438/image.png)

-&gt; 이 레시피(함수가 해야 할 내용)대로 만드는 돌체라떼 기계가 바로 **함수**이다.


**함수 형식**</code></pre><p>def 함수이름():
    함수가 해야 할 내용 1
    함수가 해야 할 내용 2
    ...</p>
<pre><code>**예시**</code></pre><p>def make_dolcelatte():
    print(&quot;1. 얼음을 넣는다.&quot;)
    print(&quot;2. 연유를 30ml 넣는다.&quot;)
    print(&quot;3. 찬 우유를 넣는다.&quot;)
    print(&quot;4. 에스프레소샷을 넣는다.&quot;)</p>
<p>def make_blueberry_smoothie():
    print(&quot;1. 블루베리 20g을 넣는다.&quot;)
    print(&quot;2. 우유 300ml를 넣는다.&quot;)
    print(&quot;3. 얼음을 넣는다.&quot;)
    print(&quot;4. 믹서기에 간다.&quot;)</p>
<p>def make_simple_latte():
    print(&quot;1. 커피를 넣는다.&quot;)
    print(&quot;2. 우유를 넣는다.&quot;)
    print(&quot;3. 신나게 섞는다.&quot;)</p>
<pre><code>-&gt; 이대로 파일을 실행해도 아무것도 출력되지 않는다.
왜? 함수를 호출해야 함수가 동작한다.

**함수 호출 방법**</code></pre><p>함수이름()</p>
<pre><code>
**함수 호출 코드**</code></pre><p>def make_dolcelatte():
    print(&quot;1. 얼음을 넣는다.&quot;)
    print(&quot;2. 연유를 30ml 넣는다.&quot;)
    print(&quot;3. 찬 우유를 넣는다.&quot;)
    print(&quot;4. 에스프레소샷을 넣는다.&quot;)</p>
<p>def make_blueberry_smoothie():
    print(&quot;1. 블루베리 20g을 넣는다.&quot;)
    print(&quot;2. 우유 300ml를 넣는다.&quot;)
    print(&quot;3. 얼음을 넣는다.&quot;)
    print(&quot;4. 믹서기에 간다.&quot;)</p>
<p>def make_simple_latte():
    print(&quot;1. 커피를 넣는다.&quot;)
    print(&quot;2. 우유를 넣는다.&quot;)
    print(&quot;3. 신나게 섞는다.&quot;)</p>
<p>make_simple_latte()</p>
<pre><code>
**결과**</code></pre><ol>
<li>커피를 넣는다.</li>
<li>우유를 넣는다.</li>
<li>신나게 섞는다.<pre><code></code></pre></li>
</ol>
<hr>
<h3 id="이상형이-뭐예요-제작하기-1">[이상형이 뭐예요?] 제작하기 (1)</h3>
<ul>
<li><p>우리는 익명 게시판에서 받은 질문과 답변을 모두 저장할 것이다.
<img src="https://images.velog.io/images/mungge_jang322/post/1b6e50ff-cee9-4a0b-91ef-338d49976b1e/image.png" alt=""></p>
</li>
<li><p>질문을 딕셔너리(dictionary)의 key로, 답변을 value로 나눌 수 있다.
<img src="https://images.velog.io/images/mungge_jang322/post/a0f6001f-02e8-427c-85a5-81ea4df94161/image.png" alt=""></p>
</li>
<li><p>아래와 같이 두개의 딕셔너리(dictionary)를 하나의 리스트에 담을 수 있다.
<img src="https://images.velog.io/images/mungge_jang322/post/f332dc45-f5e8-4244-8076-9a834f5500c2/image.png" alt=""></p>
</li>
<li><p>두가지 형태로 나누어 구성해보자.</p>
</li>
<li><p>1번과 같이 처음 보는 사람도 질문인지 답변인지 알 수 있도록 작성할 수도 있고, 2번과 같이 처음 보는 사람은 모르지만 간결하게 작성할 수 있는 방법도 있다.
<img src="https://images.velog.io/images/mungge_jang322/post/57243f5c-e020-4238-9d38-f190ae39c77e/image.png" alt=""></p>
</li>
</ul>
<hr>
<h3 id="이상형이-뭐예요-제작하기-2">[이상형이 뭐예요?] 제작하기 (2)</h3>
<p><img src="https://images.velog.io/images/mungge_jang322/post/0e9c5a0b-8e10-4d7a-bf57-37c7d0493f54/image.png" alt=""></p>
<p><strong>코드</strong></p>
<ul>
<li>질문을 입력받아서 딕셔너리(dictionary)의 key값에 저장해보자.<pre><code>total_dictionary = {}
</code></pre></li>
</ul>
<p>while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_dictionary[question] = &quot;&quot;
print(total_dictionary)</p>
<pre><code>- 질문을 입력받아 dictionary의 key에 저장하고 답변인 value값은 비워둔다.

---

### [이상형이 뭐예요?] 제작하기 (3)
- 답변을 입력받아 딕셔너리(dictionary)의 value값에 저장해보자.</code></pre><p>total_dictionary = {}</p>
<p>while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_dictionary[question] = &quot;&quot;
//추가된 내용
for i in total_dictionary:
    print(i)
    answer = input(&quot;답변을 입력해주세요 : &quot;)
    total_dictionary[i] = answer
print(total_dictionary)</p>
<pre><code>- for문을 사용해 앞에서 저장한 질문을 뽑아서 출력하고 그에 맞는 답변을 입력받아 딕셔너리(dictionary)의 value값에 저장한다.

---

### [이상형이 뭐예요?] 제작하기 (4)
![](https://images.velog.io/images/mungge_jang322/post/56b02e45-536a-42cb-b6a1-e70a77c7aced/image.png)
**코드**
- 질문을 입력받아 딕셔너리로 구성 후 리스트에 추가.</code></pre><p>total_list = []</p>
<p>while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_list.append({&quot;질문&quot; : question, &quot;답변&quot; : &quot;&quot;})</p>
<pre><code>
---

### [이상형이 뭐예요?] 제작하기 (5)
**코드**
- 질문에 따른 답변을 입력받아 &quot;답변&quot;key의 value에 저장.</code></pre><p>total_list = []</p>
<p>while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_list.append({&quot;질문&quot; : question, &quot;답변&quot; : &quot;&quot;})
//추가된 내용
for i in total_list:
    print(i[&quot;질문&quot;])
    answer = input(&quot;답변을 입력해주세요 : &quot;)
    i[&quot;답변&quot;] = answer
print(total_list)</p>
<pre><code>**결과**</code></pre><p>질문을 입력해주세요 : 취미는?
질문을 입력해주세요 : 특기는?
질문을 입력해주세요 : q
취미는?
답변을 입력해주세요 : 노래듣기
특기는?
답변을 입력해주세요 : 노래부르기
[{&#39;질문&#39;: &#39;취미는?&#39;, &#39;답변&#39;: &#39;노래듣기&#39;}, {&#39;질문&#39;: &#39;특기는?&#39;, &#39;답변&#39;: &#39;노래부르기&#39;}]</p>
<pre><code>---

### [이상형이 뭐예요?] 정리하기
**최종 코드 리뷰**</code></pre><p>total_list = []</p>
<p>while True:                //무한루프
    question = input(&quot;질문을 입력해주세요 : &quot;)<br>    if question == &quot;q&quot;:        //q를 입력하면 
        break                //질문 입력 종료
    else:
        total_list.append({&quot;질문&quot; : question, &quot;답변&quot; : &quot;&quot;})</p>
<p>for i in total_list:
    print(i[&quot;질문&quot;])
    answer = input(&quot;답변을 입력해주세요 : &quot;)
    i[&quot;답변&quot;] = answer
print(total_list)</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[1일차] HTML/CSS]]></title>
            <link>https://velog.io/@mungge_jang322/1%EC%9D%BC%EC%B0%A8-HTMLCSS-mbfqplts</link>
            <guid>https://velog.io/@mungge_jang322/1%EC%9D%BC%EC%B0%A8-HTMLCSS-mbfqplts</guid>
            <pubDate>Mon, 21 Feb 2022 13:44:01 GMT</pubDate>
            <description><![CDATA[<h2 id="htmlcss를-배워야-하는-이유">HTML/CSS를 배워야 하는 이유</h2>
<p>컴퓨터에는 사람의 생각을 화면에 시각화 해주는 도구가 굉장히 많다.
많은 시각화 도구 중 가장 빠르고, 간편하면서, 완벽하고, 보편적인 것이 HTML/CSS이다.</p>
<p>3d그래픽 도구를 이용하게 되면 몇날 며칠 어쩌면 몇달이 걸릴지 모른다.
그림을 그려주는 언어를 쓰거나 영상을 제작해주는 도구를 쓰면 노력이 아주 많이 들어간다.</p>
<p>하지만 HTML/CSS는 아주 간단한 문법으로 내 생각과 의도를 굉장히 정확하게 표현해낼 수 있다.
그렇기 때문에 아무리 컴퓨터를 잘 하는 사람이라도 HTML/CSS는 빼놓지 않고 다루고 있다.</p>
<h2 id="htmlcss의-장점">HTML/CSS의 장점</h2>
<ul>
<li><p>다른 언어들과 콜라보레이션이 굉장히 잘 된다.
즉, 자바스크립트나 파이썬, 루비 같은 완전히 다른 성격의 언어와도 잘 섞여서 그 언어들이 표현하고 싶은 내용을 대신 표현해주는 아주 좋은 도구이다.</p>
<ul>
<li>따라서, HTML/CSS는 단독으로 동작할 때도 빛이 나지만, 이처럼 다른 도구와 섞여서 있을 때도 빛이 나는 그런 언어이다.</li>
</ul>
</li>
<li><p>HTML/CSS의 결과물이 누구나 접속 가능한 웹페이지라는 것이 가장 큰 장점이다.</p>
<ul>
<li>따라서 우리는 언제든지 어디서든 웹 브라우저 사용만 가능하면 HTML/CSS 결과물에 접근할 수 있고 여러 상황에서도 실행을 해 볼 수가 있고, 간편하게 동작을 시켜 볼 수가 있다.</li>
</ul>
</li>
</ul>
<p><em><strong>&#39;누구나 접근이 가능하다&#39;</strong> 라는 것은 다른 그 어떤 시각화 도구보다도 HTML/CSS를 돋보이게 하는 가장 중요한 포인트이다.</em></p>
<ul>
<li>HTML/CSS는 문법이 아주 간단하고, 로직이 복잡하지 않다.</li>
</ul>
<p>그렇기에 HTML/CSS는 꼭 한번 배워 놓으시는 것을 강력 추천한다!</p>
<h2 id="htmlcss로-나만의-이력서-만들기">HTML/CSS로 나만의 이력서 만들기</h2>
<h3 id="직접-htmlcss-사용해보기">직접 HTML/CSS 사용해보기</h3>
<p>코드를 작성한다기 보단 문서를 작성한다고 생각하고 해보자.</p>
<p>HTML/CSS를 이용해 문서를 작성하는 것은 Microsoft word와 같은 프로그램으로 작성하는 것과 별반 다를 것이 없다.
그렇지만 왜 HTML/CSS를 사용할까?
word와 같은 프로그램은 다른 python, ruby와 같은 언어와 콜라보하기가 어렵기 때문이다. 
이것이 HTML/CSS를 가장 유명한 언어로 만든 강력한 이유다.</p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/34c305f7-d99e-44dd-8c0c-0eb42679fca9/image.png" alt=""></p>
<ul>
<li>이걸 보면 알 수 있듯이 자주 많이 쓰이는 몇개의 태그만 알아두면 문서를 작성하는데 큰 문제가 없다.</li>
<li>자주 쓰이는 태그 몇개를 알아보자.</li>
</ul>
<hr>
<h2 id="여러가지-태그의-종류와-특징">여러가지 태그의 종류와 특징</h2>
<h3 id="1-html-태그">1. html 태그</h3>
<ul>
<li>&#39;이 문서는 html 문서다&#39; 가장 많이 쓰이는 태그이다.</li>
<li>html문서 중 가장 큰 가방이라고 생각하면 된다.</li>
<li><em>예시*</em><pre><code>&lt;html&gt;&lt;/html&gt;</code></pre></li>
<li>크롬과 같은 최신 브라우저에서는 이 태그가 없어도 동작을 하는데 문제가 없다.
하지만 뭔지 모를 이유로 대부분의 웹페이지는 없어도 될 이 html 태그를 꼭 써주고 있다.</li>
</ul>
<h3 id="2-doctype-태그">2. doctype 태그</h3>
<ul>
<li>위 html 태그와 쌍으로 묶이는 것이 바로 doctype이다.</li>
<li><em>예시*</em><pre><code>&lt;!DOCTYPE html&gt;</code></pre></li>
<li>이 태그는 가장 맨 위에 작성.</li>
<li>이 태그도 html태그와 마찬가지로 없어도 크롬과 같은 최신 브라우저에서는 동작을 하는데 문제가 없다. 하지만 이 역시도 뭔지 모를 이유로 대부분의 웹페이지는 없어도 될 이 html 태그를 꼭 써주고 있다.</li>
</ul>
<p><strong>예시 - html태그와 doctype 태그 함께 사용</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;/html&gt;</code></pre><ul>
<li>위 세줄은 어떤 html 문서를 막론하고 꼭 써줘야 한다. <strong>암기!</strong></li>
</ul>
<h3 id="3-head-태그--body-태그">3. head 태그 &amp; body 태그</h3>
<ul>
<li><p>head 태그에는 contents에 대한 추가 정보가 담겨있다.</p>
</li>
<li><p>HTML/CSS에서 표현되는 모든 내용(contents)이 body 태그에 전부 들어가게 된다.</p>
<ul>
<li>이력서를 예로 들면, 경력이나 학력과 같은 내용이 여기에 들어가게 된다.<blockquote>
<p>html 문서를 크게 두 부분으로 나누게 되면 부가정보를 담고 있는 <strong>head 태그</strong>와 contents의 내용을 담고 있는 <strong>body 태그</strong>로 이루어져 있다.</p>
</blockquote>
</li>
</ul>
</li>
<li><p>이것을 코드로 작성하면 다음과 같다.</p>
</li>
<li><p><em>예시*</em></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
   &lt;head&gt;&lt;/head&gt;
   &lt;body&gt;&lt;/body&gt;
&lt;/html&gt;</code></pre></li>
</ul>
<h3 id="4-meta-태그">4. meta 태그</h3>
<ul>
<li>한글을 사용하기 위해 필요한 태그이다.</li>
<li><em>예시*</em><pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
   &lt;head&gt;
       &lt;meta charset=&quot;UTF-8&quot;&gt;
   &lt;/head&gt;
   &lt;body&gt;&lt;/body&gt;
&lt;/html&gt;</code></pre></li>
<li><strong>meta charset=&quot;UTF-8</strong> 의 의미는 깊게 알 필요가 없다.
그냥 이 코드를 써야 한글을 정상적으로 사용이 가능하다는 것을 알고 있으면 된다.<ul>
<li>이 문서엔 한글도 있다는 것을 알려주는 것.</li>
</ul>
</li>
</ul>
<h3 id="5-title-태그">5. title 태그</h3>
<ul>
<li>페이지 이름을 나타낸다.</li>
<li><em>예시*</em><pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
   &lt;head&gt;
       &lt;meta charset=&quot;UTF-8&quot;&gt;
       &lt;title&gt;김멋사의 이력서&lt;/title&gt;
   &lt;/head&gt;
   &lt;body&gt;&lt;/body&gt;
&lt;/html&gt;</code></pre></li>
</ul>
<h3 id="6-p-태그--h1-태그">6. p 태그 &amp; h1 태그</h3>
<h4 id="h1태그">h1태그</h4>
<pre><code>- heading1의 줄임말이다.
- 제목을 정의할 때 사용
- h1은 한 문서에 한개만 사용해야 한다.
- h1~h6까지 있으며, 6가지 단계의 섹션 제목을 나타낸다.</code></pre><h4 id="p태그">p태그</h4>
<pre><code>- paragraph(문단)의 줄임말이다.
- 일반 텍스트를 작성할 때 사용한다.</code></pre><p><strong>예시</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;김멋사의 이력서&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;김멋사&lt;/h1&gt;
        &lt;p&gt;HTML/CSS&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="7-footer-태그">7. footer 태그</h3>
<h4 id="footer란">footer란?</h4>
<pre><code>- 웹 페이지마다 맨 아래에 공통적으로 써 있는 내용이다.
- 쇼핑몰 사이트의 경우 회사 이름과 대표이사 이름 사업자등록번호등이 쓰여 있을 것이고,
- 영화관 사이트의 경우 고객센터 번호등이 적혀 있을 것이다.
- 대부분 웹 사이트의 저작권이 명시가 되어 있다.
- 그냥 p태그를 썼을 때와 글씨체나 크기가 차이가 없다.</code></pre><p><strong>예시</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;김멋사의 이력서&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;김멋사&lt;/h1&gt;
        &lt;p&gt;HTML/CSS&lt;/p&gt;
        &lt;footer&gt;copyright CODE LION. All rights reserved.&lt;/footer&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>우리가 만들 이력서 페이지에는 고객센터 번호도 없고 사업자 등록 번호도 없으니 위와 같이 간단히 저작권만 써놓도록 하겠다.</li>
</ul>
<hr>
<blockquote>
<p>이쯤에서 css파일을 생성해보자.</p>
</blockquote>
<ul>
<li>html은 문서의 요소요소를 구분하는 역할을 하고 그 요소요소에 의미를 부여하는 역할을 하고, css는 폰트 설정 및 표현하는 부분을 설정하는 역할을 한다.</li>
</ul>
<p><img src="https://images.velog.io/images/mungge_jang322/post/13404195-2bf8-4983-a743-4b52591b9e03/image.png" alt=""></p>
<ul>
<li>위와 같이 html파일과 css파일 구분해서 생성</li>
<li>보통 index.html 파일을 시작페이지로 많이 쓰기 때문에 위와 같이 파일명 설정한다.</li>
</ul>
<blockquote>
<p>html파일과 css파일을 연결해줄 것이 필요하다.</p>
</blockquote>
<p>다시한번 말하지만 body에는 화면에 직접적으로 표현되는 컨텐츠들만 들어가고 컨텐츠 표현을 위한 부수적인 모든 것들은 head에 들어간다.</p>
<p>따라서, html파일과 css파일을 연결하겠다는 내용은 head에 들어가게 된다.</p>
<p>두 파일을 연결하는 태그는 <strong>link 태그</strong> 이다.</p>
<h3 id="8-link-태그">8. link 태그</h3>
<ul>
<li>meta태그와 동일하게 닫아주는 것이 없는 단일 태그이다.</li>
<li>css파일과 html파일을 연결해주는 태그이다.</li>
</ul>
<p><strong>예시</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;김멋사의 이력서&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;codelion.css&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;김멋사&lt;/h1&gt;
        &lt;p&gt;HTML/CSS&lt;/p&gt;
        &lt;footer&gt;copyright CODE LION. All rights reserved.&lt;/footer&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>예시 - css파일</strong></p>
<ul>
<li><p>쓰는 순서는 지키지 않아도 된다.</p>
</li>
<li><p>중괄호를 사용한다.</p>
<pre><code>footer {
  text-align: center;
  background-color: black;
  color: white;
}</code></pre></li>
<li><p><strong>text-align</strong>
: 문단 정렬 속성이다.</p>
</li>
</ul>
<h5 id="ex-text-align의-종류">ex) text-align의 종류</h5>
<pre><code>- center: 가운데 정렬
- left: 왼쪽 정렬
- right: 오른쪽 정렬
- justify: 양쪽정렬 
- initial: 기본값으로 설정
- inherit: 부모 요소의 속성값을 상속 받음</code></pre><ul>
<li><p><strong>color</strong>
:글자 색</p>
</li>
<li><p><strong>background-color</strong>
: 배경 색</p>
</li>
</ul>
<blockquote>
<p>보통 footer 태그가 2개일리 없지만 학습목적으로 두개를 써보자!</p>
</blockquote>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;김멋사의 이력서&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;codelion.css&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;김멋사&lt;/h1&gt;
        &lt;p&gt;HTML/CSS 개발자&lt;/p&gt;
        &lt;footer&gt;copyright CODE LION. All rights reserved.&lt;/footer&gt;
        &lt;footer&gt;아무내용&lt;/footer&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/4b0f93c8-be01-47d0-a6d4-2f12f9b86c61/image.png" alt=""></p>
<p><strong>예시</strong></p>
<ul>
<li>footer를 다른 위치에 하나 더 써보자.</li>
</ul>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;김멋사의 이력서&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;codelion.css&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;footer&gt;또 다른 아무내용&lt;/footer&gt;
        &lt;h1&gt;김멋사&lt;/h1&gt;
        &lt;p&gt;HTML/CSS 개발자&lt;/p&gt;
        &lt;footer&gt;copyright CODE LION. All rights reserved.&lt;/footer&gt;
        &lt;footer&gt;아무내용&lt;/footer&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>결과</strong></p>
<ul>
<li>그 위치에 맞게 footer가 생성된다.
<img src="https://images.velog.io/images/mungge_jang322/post/eb72f6e7-bd43-4d8e-ae37-ae66076d991f/image.png" alt=""></li>
</ul>
<p><strong>예시 - html파일</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;codelion.css&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;p&gt;내 이름은 김멋사&lt;/p&gt;
        &lt;p&gt;코드라이언으로 코딩 배웠지&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>예시 - css 파일</strong></p>
<pre><code>p {
    font-size: 30px;
}</code></pre><ul>
<li>p태그의 모든 글씨크기를 30픽셀로 설정한다는 의미다!</li>
</ul>
<p>??부분적인 p태그의 글씨크기만 변경하고 싶다면??
=&gt; class 를 나누자!
<strong>예시 - html파일</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;codelion.css&quot;&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;p class=&quot;big-font&quot;&gt;내 이름은 김멋사&lt;/p&gt;
        &lt;p class=&quot;small-font&quot;&gt;코드라이언으로 코딩 배웠지&lt;/p&gt;
        &lt;p class=&quot;small-font&quot;&gt;반갑습니다.&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p><strong>예시 - css파일</strong></p>
<pre><code>p {
    font-size: 30px;
}

.big-font {
    font-size: 40px;
}

.small-font {
    font-size: 10px;
}</code></pre><ul>
<li>위와 같이 앞에 점을 찍으면 &#39;big-font라는 클래스를 꾸민다&#39;는 의미가 된다.</li>
<li>class를 나누었다면 점을 잊지말자!<ul>
<li>점이 없으면 그냥 p태그 내용만 적용된다!</li>
</ul>
</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/d3bad549-ea3d-46dc-8f3e-da4734c42c0b/image.png" alt=""></p>
<hr>
<h3 id="css에서-색을-좀더-다양하게-사용하고-싶다면">css에서 색을 좀더 다양하게 사용하고 싶다면?</h3>
<ul>
<li><p>google에 <strong>&#39;html color code&#39;</strong> 라고 검색해보자.</p>
</li>
<li><p>그러면 다음과 같은 결과가 나온다.
<img src="https://images.velog.io/images/mungge_jang322/post/8b25c849-ea3f-43af-9b47-f5268d5b495f/image.png" alt=""></p>
</li>
<li><p>지금은 글자로 white, black 이런식으로 지정을 해주지만 모니터에는 수만가지 색 표현이 가능하다. 이때 필요한 것이 color code이다.</p>
</li>
</ul>
<h3 id="9-div-태그">9. div 태그</h3>
<ul>
<li>division의 줄임말이다.</li>
<li>이 태그는 html요소를 묶어서 테두리를 그린다거나, 한꺼번에 묶어서 우측 정렬을 한다거나, 한꺼번에 붂어서 배경색을 바꾼다거나 할 때 쓰인다.</li>
</ul>
<p><img src="https://images.velog.io/images/mungge_jang322/post/9bf48e71-a3e4-4002-8c81-6ebfea4f5423/image.png" alt=""></p>
<ul>
<li>위와 같이 영역으로 나눠준 부분을 css로 꾸며주면된다.</li>
</ul>
<pre><code>border : 두께 방식 색깔;
ex) border: 5px solid black;</code></pre><p><strong><a href="https://developer.mozilla.org/ko/docs/Web/CSS/border-style">border-style 확인하기 클릭!</a></strong></p>
<p><strong>예시</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/3a63dddb-f2f9-49a1-a5dc-140240d68618/image.png" alt=""></p>
<p><strong>div태그의 text-align설정</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/10f67c17-5b91-4931-a6f6-bba953cfc476/image.png" alt=""></p>
<ul>
<li>center를 설정하면 div박스가 웹페이지 중간에 가는게 아니라 박스안에 내용물들이 박스의 가운데 정렬이 된다.</li>
</ul>
<p><img src="https://images.velog.io/images/mungge_jang322/post/7cbfd636-312c-4fa4-a134-6d7d53c51c45/image.png" alt=""></p>
<ul>
<li>그 어디에도 가운데로 위치하라는 말이 없어보이지만 위 코드가 div박스를 웹페이지의 가운데로 정렬하는 방법이다.</li>
</ul>
<hr>
<h2 id="박스-나누기">박스 나누기</h2>
<p><img src="https://images.velog.io/images/mungge_jang322/post/58771495-4a14-44eb-bbfa-9828692ab6ce/image.png" alt=""></p>
<ul>
<li>위와 같이 바깥에서부터 Margine, Border, Padding, Content로 나눌 수 있다.</li>
</ul>
<p><img src="https://images.velog.io/images/mungge_jang322/post/53336598-0e3d-49dc-91bd-2d6b56e9a729/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/f95b91c3-fc28-45cc-8246-4089b0f27a64/image.png" alt=""></p>
<ul>
<li>박스테두리를 위와 같이 두껍게 해도 박스 내부 크기는 변하지 않는다.</li>
</ul>
<p><strong>??전체 박스 크기를 원래 크기로 유지한 채 박스 테두리를 치려면 어떻게 해야할까??</strong></p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/1ef21a15-17d1-418c-b953-79f9222c3aa0/image.png" alt=""></p>
<ul>
<li>위와 같이 width와 height pixel값을 조절해서 맞추면 된다.
<img src="https://images.velog.io/images/mungge_jang322/post/f6bcbd33-054c-47b9-9534-f980e56b7bae/image.png" alt=""></li>
<li>위 결과를 보면 박스 전체사이즈는 아래와 같은걸 알 수 있다.<pre><code>가로 = width + 2*border-width
세로 = height + 2*border-width</code></pre></li>
</ul>
<h3 id="padding">padding</h3>
<p><img src="https://images.velog.io/images/mungge_jang322/post/9833f24b-70b6-482a-a091-165104198074/image.png" alt=""></p>
<ul>
<li>text-align : right를 통해 위와 같이 오른쪽 정렬을 하면 글씨가 너무 오른쪽에 붙게된다.</li>
<li>해결법: padding을 넣어주면 띄울 수 있다!</li>
</ul>
<pre><code>.mainbox{
      width:610px;
      margin-right: auto;
      margin-left: auto;
      border: 1px solid #ebebeb;
      text-align: right;
      padding: 20px;
}</code></pre><p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/6f950a3f-fe1b-4e8e-8f6c-cd21fe60648c/image.png" alt=""></p>
<hr>
<h2 id="그림자-표현하기">그림자 표현하기</h2>
<pre><code>.name-text {                                  
    font-size: 17px;                         
    color: #7c7c7c;
    font-weight: bold;
}</code></pre><ul>
<li>font-weight의 종류
```</li>
<li>bold: 두껍게</li>
<li>ligher: 얇게</li>
<li>normal: 기본<pre><code>

</code></pre></li>
</ul>
<h3 id="그림자-생성-css-코드">그림자 생성 css 코드</h3>
<pre><code>.mainbox {
    width: 610px;
    padding: 30px;
    margin: 30px;
    margin-right: auto;
    margin-left: auto;
    border: 1px solid #ebebeb;
    box-shadow: 0 1px 20px 0 rgba(0,0,0,0.1);
}</code></pre><ul>
<li><p>0: x축으로 그림자가 얼마나 뻗어가는지</p>
<ul>
<li>음수면 왼쪽으로 뻗어나간다.</li>
<li>양수면 오른쪽으로 뻗어나간다.</li>
<li>0은 나오지 않는다.</li>
</ul>
</li>
<li><p>1px: y축 그림자가 얼마나 뻗어가는지</p>
</li>
<li><p>20px: 그림자의 흐림정도</p>
</li>
<li><p>0: 그림자의 퍼짐정도</p>
</li>
<li><p>rgba(0,0,0,0.1): 그림자의 색을 나타낸다.</p>
<ul>
<li>마지막 0.1자리는 투명도를 나타내는 숫자다.</li>
<li>0이 가장 투명한 색이다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="구글-웹-폰트-사용하기">구글 웹 폰트 사용하기</h2>
<pre><code>@import url(&#39;https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800&amp;display=swap&#39;);</code></pre><ul>
<li>구글에 검색하면 나오는 코드로 외울필요 없다.</li>
<li>위 폰트는 Montserrat라는 폰트이다.</li>
<li>@import url() 이 괄호 안에 검색한 것을 넣으면 된다.</li>
</ul>
<pre><code>* {
    font-family: &#39;Montserrat&#39;;
}</code></pre><ul>
<li>몬세라트 폰트를 사용한다는 뜻이다.</li>
<li>앞에 별이 의미하는 것은 모든 문서에 적용된다는 뜻이다.</li>
</ul>
<blockquote>
<p>브라우저별로 margin과 padding의 기본값이 다를 수 있다.
-&gt; 그러면 같은 태그라도 서로 다르게 보여지는 상황이 발생한다.</p>
</blockquote>
<ul>
<li>그래서 다음과 같이 0px로 전부 초기화시켜준다.</li>
</ul>
<pre><code>body,h1,h2 {
    margin: 0px;
    padding: 0px;
}</code></pre><h3 id="section-태그">section 태그</h3>
<ul>
<li><p>section태그는 사실 div 태그와 똑같은 태그이다.</p>
</li>
<li><p>단지, 약간의 의미를 부여하기 위해 section이라는 다른이름을 쓸 뿐 html요소들을 꾸미기 위해서 묶는 태그이다.</p>
</li>
<li><p>div태그와 section태그 같은 것들이 가장 많이 쓰이는 태그일지 모른다.</p>
</li>
<li><p>우리는 같은 정보라도 보이는 형태에 따라서 컨텐츠의 무게가 달라지는 세상에 살고 있다. 따라서 이렇게 html을 꾸미는 div는 날이 갈수록 그 역할이 커지고 있다.</p>
</li>
<li><p>html문서가 조금만 복잡해져도 div안에 또 div가 있고 또...있고..굉장한 div 파티 문서가 생긴다.</p>
</li>
<li><blockquote>
<p>div만으로 구성을 하면 너무 난잡해져서 section과 div를 적당히 섞어 사용하는 것이 좋다.</p>
</blockquote>
</li>
</ul>
<h3 id="article-태그">article 태그</h3>
<ul>
<li>div태그와 동일하지만 겉모습만 다른것이다.</li>
</ul>
<p><strong>예시 - div, section, article을 적절히 섞어쓴 경우</strong></p>
<pre><code>   &lt;section&gt;
            &lt;div&gt;
                &lt;div&gt;
                    &lt;article&gt;
                        content1
                    &lt;/article&gt;
                    &lt;article&gt;
                        content2
                    &lt;/article&gt;
                &lt;/div&gt;
                &lt;article&gt;
                    content3
                &lt;/article&gt;
            &lt;/div&gt;
            &lt;article&gt;
                content4
            &lt;/article&gt;
        &lt;/div&gt;
   &lt;/section&gt;</code></pre><ul>
<li>content를 직접 감싸고 있는 부분은 article 태그를 사용하고, 전체는 section 태그로 감싸고 나머지는 div 태그를 사용했다.</li>
<li>각각의 의미로 조금은 나누어져 있어 보기 편하다.</li>
</ul>
<hr>
<h2 id="about-me-제작하기">About Me 제작하기</h2>
<h3 id="lorem-ipsum">lorem ipsum</h3>
<p><strong>lorem ipsum이란?</strong>
: 그래픽 요소나 시각적 연출을 보여줄 때 사용하는 표준 채우기 텍스트로, 최종 결과물에 들어가는 실제적인 문장 내용이 채워지기 전에 시각 디자인 프로젝트 모형의 채움 글로도 이용된다.</p>
<pre><code>ex) Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry&#39;s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</code></pre><p><strong>html파일</strong></p>
<pre><code>&lt;section&gt;
      &lt;h2&gt;ABOUT ME&lt;/h2&gt;
      &lt;p class=&quot;about-me-text&quot;&gt;
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      &lt;/p&gt;
&lt;/section&gt;</code></pre><p><strong>css파일</strong></p>
<pre><code>.about-me-text {
    font-size: 10px;
    line-height: 16px;
}</code></pre><ul>
<li>line-height는 줄간 간격을 나타낸다.</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/1dd4bca0-3a49-488f-ab33-f6564cf2ac55/image.png" alt=""></p>
<hr>
<h2 id="experience-제작하기">Experience 제작하기</h2>
<p><img src="https://images.velog.io/images/mungge_jang322/post/8b8d3551-1017-4f37-9fee-239393a80c13/image.png" alt=""></p>
<pre><code>.title-text {
    font-size: 11px;
    font-weight: bold;
    color: #282828;
    text-align: left;
}

.year-text {
    font-size: 11px;
    font-weight: bold;
    color: #282828;
    text-align: right;
}</code></pre><ul>
<li>이렇게 하면 다음과 같이 결과가 조금 이상하게 나온다.</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/d705e625-49c0-4910-b760-27cbb10c750e/image.png" alt=""></p>
<ul>
<li>왼쪽 정렬, 오른쪽 정렬은 올바르게 되었지만 같은 줄에 있지 않다.</li>
</ul>
<p><strong>따라서, 아래와 같이 수정을 해보자.</strong></p>
<pre><code>.title-text {
    font-size: 11px;
    font-weight: bold;
    color: #282828;
    float: left;
}

.year-text {
    font-size: 11px;
    font-weight: bold;
    color: #282828;
    float: right;
}</code></pre><ul>
<li>float이란?
  : 여기서 float는 &#39;둥둥 떠다니다&#39;라는 뜻을 가지고 있다.</li>
<li>따라서 folat: left는 &#39;왼쪽으로 붙어서 둥둥떠다녀라&#39;라는 뜻이고, float: right는 &#39;오른쪽으로 붙어서 둥둥떠다녀라&#39;라는 뜻이다.</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/9dc46dc2-4b84-4929-b5bc-56bf0d4fb03b/image.png" alt=""></p>
<hr>
<p>이어서 p태그를 사용해 글씨를 추가하게 되면 아래와 같은 결과가 나온다.</p>
<p><img src="https://images.velog.io/images/mungge_jang322/post/80c56893-b652-4424-94fc-b584e2f318df/image.png" alt=""></p>
<ul>
<li>글씨가 겹쳐나온다!</li>
<li>그 이유는 float 때문이다. 둥둥 떠다니기 때문에 다른 요소들(글이나 그림)과 겹칠 수 있다.</li>
</ul>
<blockquote>
<p>그래서 겹치지 않게 가두리를 만들어 줘야 한다.(div사용)</p>
</blockquote>
<p><strong>html파일</strong></p>
<pre><code>      &lt;div class=&quot;float-wrap&quot;&gt;
        &lt;p class=&quot;title-text&quot;&gt;Awesome Programming Company&lt;/p&gt;
        &lt;p class=&quot;year-text&quot;&gt;2020 - Now&lt;/p&gt;
      &lt;/div&gt;</code></pre><p><strong>css파일</strong></p>
<pre><code>.float-wrap {
    overflow: hidden;
}</code></pre><ul>
<li>overflow: hidden는 float로 띄워져 있는 요소들을 다 묶어주고 다음에 오는 html요소들이 float의 영향을 받지 않도록 해준다.</li>
<li>왜 float를 묶어주는 이름이 overflow: hidden인지는 정말 추론하기 어렵다.</li>
<li>css의 이런 성질들 때문에 배우기가 참 난해하다.</li>
</ul>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/f419e200-a0ed-4f60-b5de-5e1ac620aadc/image.png" alt=""></p>
<hr>
<h2 id="image-삽입하기">image 삽입하기</h2>
<h3 id="img-태그">img 태그</h3>
<p><img src="https://images.velog.io/images/mungge_jang322/post/e0f754bf-5a61-4609-8d86-8ae6d8b2a098/image.png" alt=""></p>
<ul>
<li>위와 같이 images폴더에 이미지를 4개 넣어 두었다.</li>
</ul>
<pre><code>&lt;img class=&quot;sns-img&quot; src=&quot;images/facebook.png&quot;&gt;
&lt;img class=&quot;sns-img&quot; src=&quot;images/twitter.png&quot;&gt;
&lt;img class=&quot;sns-img&quot; src=&quot;images/linked-in.png&quot;&gt;
&lt;img class=&quot;sns-img&quot; src=&quot;images/insta.png&quot;&gt;</code></pre><ul>
<li>모두 동일한 클래스로 지정해서 동일한 설정을 주자.<pre><code>.sns-img {
  width: 12px;
  height: 12px;
}</code></pre>사이즈를 줄이고,</li>
</ul>
<pre><code>&lt;div class=&quot;sns-wrap&quot;&gt;
        &lt;img class=&quot;sns-img&quot; src=&quot;images/facebook.png&quot;&gt;
        &lt;img class=&quot;sns-img&quot; src=&quot;images/twitter.png&quot;&gt;
        &lt;img class=&quot;sns-img&quot; src=&quot;images/linked-in.png&quot;&gt;
        &lt;img class=&quot;sns-img&quot; src=&quot;images/insta.png&quot;&gt;
&lt;/div&gt;</code></pre><p>하나의 division으로 묶어서</p>
<pre><code>.sns-wrap {
    text-align: right;
}</code></pre><p>우측 정렬을 한다.</p>
<p><strong>결과</strong>
<img src="https://images.velog.io/images/mungge_jang322/post/ca68e387-e278-4ab4-9b29-66dc6b0a9037/image.png" alt=""></p>
<p>이제 사진에 링크를 걸어보자.</p>
<blockquote>
<p><strong>a태그</strong>를 사용하면 된다.</p>
</blockquote>
<pre><code>&lt;a href=&quot;http://facebook.com&quot;&gt;&lt;img class=&quot;sns-img&quot; src=&quot;images/facebook.png&quot;&gt;&lt;/a&gt;</code></pre><ul>
<li>이렇게 지정을 하면 이제 사진에 어느 부분을 눌러도 링크로 가게 된다.</li>
</ul>
<hr>
<h2 id="최종문서">최종문서</h2>
<p><img src="https://images.velog.io/images/mungge_jang322/post/6a6c2b23-38e3-4733-a438-5cf9b8443103/image.png" alt=""></p>
<h3 id="html문서">HTML문서</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;김멋사의 이력서&lt;/title&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;codelion.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;mainbox&quot;&gt;
    &lt;div class=&quot;title-box&quot;&gt;
      &lt;h1&gt;김멋사&lt;/h1&gt;
      &lt;p class=&quot;name-text&quot;&gt;HTML/CSS 개발자&lt;/p&gt;
    &lt;/div&gt;
    &lt;section&gt;
      &lt;h2&gt;ABOUT ME&lt;/h2&gt;
      &lt;p class=&quot;about-me-text&quot;&gt;
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      &lt;/p&gt;
    &lt;/section&gt;
    &lt;section&gt;
        &lt;h2&gt;EXPERIENCE&lt;/h2&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
          &lt;p class=&quot;title-text&quot;&gt;Awesome Programming Company&lt;/p&gt;
          &lt;p class=&quot;year-text&quot;&gt;2020 - Now&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Front-End Web Developer&lt;/p&gt;
        &lt;p class=&quot;desc-subtext&quot;&gt;HTML/CSS, JS, React, ...&lt;/p&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
          &lt;p class=&quot;title-text&quot;&gt;Ministry of Health&lt;/p&gt;
          &lt;p class=&quot;year-text&quot;&gt;2015 - 2018&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;UI/UX Designer&lt;/p&gt;
        &lt;p class=&quot;desc-subtext&quot;&gt;Web design&lt;/p&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
            &lt;p class=&quot;title-text&quot;&gt;Freelance Work&lt;/p&gt;
            &lt;p class=&quot;year-text&quot;&gt;2011 - 2015&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Graphic Designer&lt;/p&gt;
        &lt;p class=&quot;desc-subtext&quot;&gt;Graphic Design, Editorial Design&lt;/p&gt;
      &lt;/section&gt;

      &lt;section&gt;
        &lt;h2&gt;ACTIVITIES&lt;/h2&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
          &lt;p class=&quot;title-text&quot;&gt;Front-End Web Developer Forum Volunteer&lt;/p&gt;
          &lt;p class=&quot;year-text&quot;&gt;2019 - 2020&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Application Page Development&lt;/p&gt;
        &lt;p class=&quot;desc-subtext&quot;&gt;Lorem ipsum dolor sit amet.&lt;/p&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
          &lt;p class=&quot;title-text&quot;&gt;LIKELION SEOUL&lt;/p&gt;
          &lt;p class=&quot;year-text&quot;&gt;2017 - 2018&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Teacher in Mutsa University&lt;/p&gt;
        &lt;p class=&quot;desc-subtext&quot;&gt;Lorem ipsum dolor sit amet.&lt;/p&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
          &lt;p class=&quot;title-text&quot;&gt;Open Source Committer&lt;/p&gt;
          &lt;p class=&quot;year-text&quot;&gt;2011 - 2013&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Angular JS&lt;/p&gt;
        &lt;p class=&quot;desc-subtext&quot;&gt;Lorem ipsum dolor sit amet.&lt;/p&gt;
    &lt;/section&gt;

    &lt;section&gt;
        &lt;h2&gt;EDUCATION&lt;/h2&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
            &lt;p class=&quot;title-text&quot;&gt;Mutsa University&lt;/p&gt;
            &lt;p class=&quot;year-text&quot;&gt;2008 - 2012&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Computer Science and Engineering&lt;/p&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
            &lt;p class=&quot;title-text&quot;&gt;Mutsa High school&lt;/p&gt;
            &lt;p class=&quot;year-text&quot;&gt;2006 - 2008&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Visual Communication Design&lt;/p&gt;
        &lt;div class=&quot;float-wrap&quot;&gt;
            &lt;p class=&quot;title-text&quot;&gt;Online Programming Academy&lt;/p&gt;
            &lt;p class=&quot;year-text&quot;&gt;2006 - 2007&lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;desc-text&quot;&gt;Python Course&lt;/p&gt;
    &lt;/section&gt;

    &lt;section&gt;
      &lt;h2&gt;AWARDS&lt;/h2&gt;
      &lt;div class=&quot;float-wrap&quot;&gt;
        &lt;p class=&quot;title-text&quot;&gt;LIKELION SEOUL&lt;/p&gt;
        &lt;p class=&quot;year-text&quot;&gt;2018&lt;/p&gt;
      &lt;/div&gt;
      &lt;p class=&quot;desc-text&quot;&gt;Best Developer Award&lt;/p&gt;
    &lt;/section&gt;

    &lt;div class=&quot;sns-wrap&quot;&gt;
      &lt;a href=&quot;http://facebook.com&quot;&gt;&lt;img class=&quot;sns-img&quot; src=&quot;images/facebook.png&quot;&gt;&lt;/a&gt;
      &lt;img class=&quot;sns-img&quot; src=&quot;images/twitter.png&quot;&gt;
      &lt;img class=&quot;sns-img&quot; src=&quot;images/linked-in.png&quot;&gt;
      &lt;img class=&quot;sns-img&quot; src=&quot;images/insta.png&quot;&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;footer&gt;
      &lt;p&gt;Copyright CODE LION All rights reserved. &lt;/p&gt;
  &lt;/footer&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><h3 id="css-문서">CSS 문서</h3>
<pre><code>@import url(&#39;https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800&amp;display=swap&#39;);

* {
    font-family: &#39;Montserrat&#39;;
}

body,h1,h2 {
    margin:0px;
    padding:0px;
}


body {
    min-width: fit-content;
}

h1 {
    font-size:36px;
    font-weight: bold;
    font-style: italic;
}


h2 {
    font-size:20px;
    color:#282828;
    font-weight: lighter;
    margin-bottom: 16px;
    border-bottom: 1px solid #ebebeb;
    padding-bottom: 5px;
}

.name-text {
    font-size:16px;
    color:#7c7c7c;
    font-weight: bold;
}

.about-me-text {
    font-size:10px;
    line-height: 16px;
}

.mainbox {
    width: 610px;
    padding: 30px;
    margin: 30px;
    margin-right: auto;
    margin-left: auto;
    border: 1px solid #ebebeb;
    box-shadow: 0 1px 20px 0 rgba(0, 0, 0, 0.1);
}

.title-box {
    text-align: right;
}

section {
    margin-bottom:24px;
}

.float-wrap {
    overflow: hidden;
}

.title-text {
    font-size:11px;
    font-weight: bold;
    color: #282828;
    float: left;
}

.year-text{
    font-size:11px;
    font-weight: bold;
    color: #282828;
    float: right;
}

.desc-text {
    font-size: 9px;
}

.desc-subtext {
    font-size: 9px;
    color:#282828;
    padding-left:16px;
}

.sns-img {
    width:12px;
    height:12px;
}

.sns-wrap {
    text-align:right;
}

footer {
    text-align: center;
    background-color: #1e1e1e;
    padding: 20px;
    font-size: 12px;
    color: #919191;
}
</code></pre>]]></description>
        </item>
    </channel>
</rss>