<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>soo log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 08 Feb 2021 08:21:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>soo log</title>
            <url>https://images.velog.io/images/dla-tngus/profile/dc5ef939-7a6f-467d-b9af-83dd98610835/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. soo log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dla-tngus" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CSS 개념정리 4]]></title>
            <link>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-4</link>
            <guid>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-4</guid>
            <pubDate>Mon, 08 Feb 2021 08:21:27 GMT</pubDate>
            <description><![CDATA[<h1 id="box-shadow">Box Shadow</h1>
<p>h-offset / v-offset / blur / spread / color
x / y / 흐린정도 / 그림자사이즈 / 색상</p>
<p>ex) box-shadow : 0 10px 16px 0 rgba(255, 255, 73, 0.35);</p>
<p>👁‍🗨 예시</p>
<pre><code>.cancel-button{
    background-color: #ff4949;
    transition: box-shadow 250ms;
}

.cancel-button:hover{
    box-shadow: 0 10px 16px 0 rgba(255, 73, 73, 0.35);
}</code></pre><h1 id="opacity투명도">Opacity(투명도)</h1>
<p>🔑 0 - 완전 투명 / 1- 완전 불투명</p>
<p>ex) opacity:0.8;</p>
<h1 id="overflow">Overflow</h1>
<ul>
<li>visible : 기본값(넘쳐 흘러도 그냥 둠)</li>
<li>auto : 넘쳐 흐르면 알아서 해라(보통 scroll로 처리됨)</li>
<li>scroll : 넘쳐 흐르면 scroll로 표시해라</li>
<li>hidden : 넘쳐 흐르면 숨겨라</li>
</ul>
<p>ex) overflow : hidden;</p>
<h1 id="transform">Transform</h1>
<p>🔑 transform : 모양을 변형시키는 역할을 함 / 다른 요소를 방해하지 않음</p>
<p>🔎 transform 요소에서 쓰이는 함수들</p>
<ul>
<li>translate() : 위치를 옮김</li>
<li>scale() : 크기를 변화시킴</li>
<li>rotate() : 각도를 변화시킴</li>
</ul>
<p>👁‍🗨 예시</p>
<pre><code>.box{
    width : 300px;
    height : 300px;
    border-radius : 20px;
    background-color : #0066ff;
    transform : traslate(40px, 50px);
    transform : scale(0.5, 3);
    transform : rotate(45deg);
}</code></pre><h1 id="visibility">Visibility</h1>
<p>🔑 visibility : 요소가 보여질지 안 보여질지 조정하는 속성
-&gt; visible / hidden</p>
<p>ex) visibility : hidden; - 이 경우 존재하지만 보이지는 않는다
그러나 display : none; 을 할 경우 존재 자체가 없어진다</p>
<h1 id="selector선택자">Selector(선택자)</h1>
<ul>
<li><p>type selector : h1, p, span 등과 같은 html의 기본적인 타입을 선택지로 사용</p>
</li>
<li><p>class selector : html에서 class로 선언해준것을 선택자로 사용, 
클래스 이름 앞에 &quot;.&quot;을 꼭 찍어 주어야 한다.</p>
</li>
</ul>
<p>예시</p>
<pre><code>&lt;div class = &quot;box&quot;&gt;  -&gt;  .box{ ... }</code></pre><ul>
<li>ID selector : html에서 id로 선언해준것을 선택자로 사용,
id 이름 앞에 &quot;#&quot;을 꼭 적어 주어야 한다.</li>
</ul>
<p>예시</p>
<pre><code>&lt;h1 id = &quot;soohyeon&quot;&gt;  -&gt;  #soohyeon{ ... }</code></pre><h1 id="child-descendant--sibling-combinators">Child, Descendant &amp; Sibling Combinators</h1>
<ul>
<li><p>child combinator(자식 선택자) : parent &gt; child
ex) section &gt; h1 { ... }</p>
</li>
<li><p>descendant combinator(자손 선택자) : parent descendant (한 칸을 꼭 띄어주어야 한다)
ex) section h1 { ... }</p>
</li>
<li><p>sibling combinators : parent+sibling / parent<del>sibling
ex) .active</del>li { ... } -&gt; active 뒤에 오는 모든 li들에게 ...을 적용
ex) .active+li { ... } -&gt; active 바로 뒤에 오는 li 하나에게 ...을 적용</p>
</li>
</ul>
<h1 id="structural-pseudo-classes구조적-가상-클래스-선택자">Structural Pseudo-classes(구조적 가상 클래스 선택자)</h1>
<ul>
<li><p>element:first-child  - 요소 중 첫번째 선택
ex) li:first-child { ... }</p>
</li>
<li><p>element:last-child - 요소 중 마지막 선택
ex) li:lasat-child { ... }</p>
</li>
<li><p>element:nth-child(n) - 요소 중 n번째 선택
ex
li:nth-child(3) { ... } - 3번째 선택
li:nth-child(2n) { ... } - 짝수만 선택
li:nth-child(2n-1) { ... } - 홀수만 선택</p>
</li>
</ul>
<h1 id="user-action-pseudo-classes동적-가상-클래스-선택자">User Action Pseudo-classes(동적 가상 클래스 선택자)</h1>
<ul>
<li><p>element:hover - 어떤 요소에 마우스 커서를 올렸을때 상태를 표현
ex) a:hover { background-color : #7e5bdf;}</p>
</li>
<li><p>element:focus - 어떤 요소가 focus 됐을 때 상태 표현
ex) input:focus { border-color : # 1fb6ff;}</p>
</li>
<li><p>element:active - 어떤 요소를 누르는 찰나의 상태 표현
ex) a:active { background-color : #592dea;}</p>
</li>
</ul>
<h1 id="css-선택자-우선순위">CSS 선택자 우선순위</h1>
<p>① ID selector ② class/pseudo-class ③ type selector</p>
<p>※ Rule breaker1 : Inline style ( html 태그안에 스타일 주는거 ) ⭐강력</p>
<pre><code>&lt;p style = &quot;color : #ff4949;&quot;&gt;</code></pre><p>※ Rule breaker2 : !important ⭐⭐제일강력</p>
<pre><code>p { color : #ff4949 !important;}</code></pre><p>🔥🔥 Rule breaker들은 사용을 지양하는게 좋다!!!</p>
<h1 id="grid-system">Grid System</h1>
<p>🔑 grid system : 디자이너들이 디자인 하기 위해 만들어둔 일종의 가이드 라인</p>
<ul>
<li>container : grid가 적용되는 전체 영역</li>
<li>column : 화면의 칸을 나누기위해 사용, 보통 12칸으로 많이 나눔</li>
<li>gutter : 간격을 위한 여백</li>
</ul>
<h1 id="bootstrap">Bootstrap</h1>
<p>🔑 bootstrap : 반응형 웹을 만들때 매우 유용</p>
<p>👁‍🗨 형식</p>
<pre><code>&lt;body&gt;
    &lt;div class = &quot;container&quot;&gt;
        &lt;div class = &quot;row&quot;&gt;
            &lt;div class = &quot;col-1&quot;&gt;
                &lt;p&gt; ~ &lt;/p&gt;
            &lt;/div&gt;
            &lt;div class=&quot;col-12&quot;&gt;
                &lt;div class=&quot;box&quot;&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</code></pre><p>⭐ ex) </p>
<pre><code>&lt;div class=&quot;col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2&quot;&gt;</code></pre><p>▲ 화면 크기(break point)마다 col이 바뀜</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS 개념정리 3]]></title>
            <link>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-3</link>
            <guid>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-3</guid>
            <pubDate>Fri, 05 Feb 2021 09:09:26 GMT</pubDate>
            <description><![CDATA[<h1 id="media-queryresponsive-web반응형-웹">Media Query(Responsive web[반응형 웹])</h1>
<p>🔴 반응형 웹을 만들기 위해서는 우선 html코드의 meta코드에 </p>
<pre><code>&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;/&gt;</code></pre><p>위의 코드를 선언해 주어야 한다.</p>
<p>🟠 그 후 CSS코드에</p>
<pre><code>@media screen and (min-width : 768px) and (max-width : 991px){
/* CSS코드 작성 최소 768px이상 최대 991px이하일 경우 
여기에 쓰여진 CSS코드가 적용됨*/ } </code></pre><p> 이와 같이 작성해 주면 된다.</p>
<p>🟡 vh(viewport height)</p>
<pre><code>.box{
width: 100%;
height: 100vh; // 100vh는 viewport height의 100%를 차지한다는 것이다.
}</code></pre><p>📌 반응형 웹을 만들때는 작은 크기의 모바일부터 시작하여 확장공사를 하듯 점점 큰 Desktop을 만드는 순서로 하면된다.</p>
<h1 id="typography-1">Typography 1</h1>
<p>🔑 Typography - 텍스트를 예쁘게 디자인 하는것</p>
<p>px - 절대단위(Absolute unit)
em, rem - 상대단위(Relative unit)</p>
<p>em = equalto capitalM(1em = 실제로 적용된 폰트 사이즈)
rem = rootem(1rem = html에 적용된 폰트 사이즈)</p>
<p>🔴 <strong>font-size</strong> - 글자 크기 바꾸는 속성(px 주로 사용)
ex) font-size : 10px; </p>
<p>🟠 <strong>line-height</strong> - 줄 간격 바꾸는 속성(em 주로 사용)
ex) line-height : 1.5; (em은 생략 가능)</p>
<p>⭐ 글자는 줄간격의 가장 가운데에 배치된다. ⭐</p>
<p>🟡 <strong>letter-spacing</strong> - 글자 간격 바꾸는 속성(em 주로 사용)
letter-spacing : -.03em; (em 생략 불가능)</p>
<p>🟢 <strong>font-family</strong> - 글자 폰트 바꾸는 속성
font-family : &quot;Poppins&quot;, sans-serif; // Poppins 폰트를 적용하는데 없으면 sans-serif를 적용한다는 의미</p>
<p>🔵 <strong>font-weight</strong> - 글자 굵기 바꾸는 속성
font-weight : 400;</p>
<p>Thin - 100
Thin Italic
Light - 300
Light Italic
<strong>Regular - 400</strong>
Regular Italic
Medium - 500
Medium Italic
<strong>Bold - 700</strong>
Bold Italic
Black - 900
Black Italic</p>
<p>🟣 color - 글자 색상 바꾸는 속성
hex - ex)#0066ff
rgb - ex)rgb(0, 102, 255)
rgba - ex)rgba(0, 102, 255, 1) 
rgba의 a는 투명도(alpha)를 나타내며 &#39;1 = 불투명, 0 = 투명&#39; 을 의미한다
color : hotpink;</p>
<h1 id="typography-2">Typography 2</h1>
<p>🔴 <strong>text-align</strong> - 글을 정렬할때 사용하는 속성
text-align : right; // left/right/center 사용가능</p>
<p>🟠 <strong>text-indent</strong> - 글자를 들여쓰기 할때 사용하는 속성
text-indent : 10px;</p>
<p>🟡 <strong>text-transform</strong> - 영문자를 소문자나 대문자로 바꿀때 사용
text-transform : capitalize; // none/capitalize/uppercase/lowercase </p>
<p>🟢 <strong>text-decoration</strong> - 글자에 줄 그을때 사용하는 속성
text-decoration : underline; // none/underline/line-through/overline</p>
<p>🔵 <strong>font-style</strong> - 글자 기울기를 줄 때 사용하는 속성
font-style : italic; // normal/italic/oblique</p>
<h1 id="webfont-사용법">Webfont 사용법</h1>
<p>✨ 직접 font-face 선언방법
ex)</p>
<pre><code>@font-face{
    font-family : &quot;pretty&quot;;
    font-style : normal;
    font-weight : 400;
    src : url(&#39;~&#39;);
    src : url(&#39;~&#39;) format(&#39;~&#39;),
          url(&#39;~&#39;) format(&#39;~&#39;),
          ~
          url(&#39;~&#39;) format(&#39;~&#39;);</code></pre><p>⭐ font 적용방법</p>
<ol>
<li>html에 link태그로 선언</li>
<li>css파일에 @import url(&quot;~&quot;);로 선언</li>
</ol>
<h1 id="background">Background</h1>
<p>🔴 background-color - 배경 색깔 지정하는 속성</p>
<pre><code>background-color : #0066ff; // hex/rgb/rgba 등이 올 수 있다</code></pre><p>🟠 background-image - 배경으로 이미지 지정하는 속성</p>
<pre><code>background-image : url(&quot;~~&quot;);</code></pre><p>🟡 background-repeat - 배경 이미지 반복 지정하는 속성</p>
<pre><code>background-repeat : no-repeat; // repeat/no-repeat 등이 올 수 있다.</code></pre><p>🟢 background-size - 배경 이미지 크기 지정하는 속성</p>
<ul>
<li>contain - 어떻게든 이미지가 다 적용</li>
<li>cover - 이미지가 짤리더라도 공간을 이미지로 가득 채움</li>
<li>custom - 사용자가 원하는대로 설정<br>ex) background-size : 50% 50% ;<pre><code>background-size : auto 100%; // contain/cover/custom 등이 올 수 있다.</code></pre>🔵 background-position - 배경 이미지 위치 지정하는 속성<pre><code>background-position : center center;</code></pre></li>
</ul>
<p>👁‍🗨 예시</p>
<pre><code>.box{
    width: 300px;
    height: 300px;
    background-color: hotpink;
    background-repeat: no-repeat;
    background-image: url(&quot;~~&quot;);
    background-size: contain;
    background-position: center center;
}</code></pre><h3 id="스크린-리더에서만-보이게-하도록-하기-위한-css코드">스크린 리더에서만 보이게 하도록 하기 위한 CSS코드</h3>
<p>📍 첫번째 방법</p>
<pre><code>.sr-only{
    display:none;</code></pre><p>📍📍 두번째 방법(⭐추천)</p>
<pre><code>.sr-only{
    position:absolute;
    z-index:-100;
    width:1px;
    height:1px;
    overflow:hidden;
    opacity:0;
    }</code></pre><h1 id="transition">Transition</h1>
<p>🔑 transition - 변화가 스르륵 일어나게 도와주는 친구</p>
<p><strong>형식</strong></p>
<ul>
<li>transition : property duration [timing-function] [delay]</li>
</ul>
<p>🔴 property - 어떤 속성을 바꿀 것인지
🟠 duration - 변화를 얼마동안 일어나게 할 것인지 (ms/s로 표현 [1s=1000ms])
🟡 timing-function - 움직이는 속도 변화 ( ease-in[점점 빠르게] / ease-out[점점 느려짐] / ease-in-out / cubic-bezier()[직접 timing 설정])
🟢 delay - 얼마동안의 delay를 줄 건지 설정</p>
<p>👁‍🗨 예시</p>
<pre><code>.box{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 300px;
    height: 300px;
    border-radius: 5px;
    font-size: 20px;
    font-weight: 500;
    color: #fff;
    background-color: #0066ff;
    transition: font-size 1000ms ease-out, 
    background-color 2000ms cubic-bezier(0.08, 0.57, 0.97, -0.78) 1000ms;
}

.box.active{
    font-size: 30px;
    background-color: #ff4949;
}</code></pre><h1 id="animation">animation</h1>
<p>🔑 transition과 비슷하므로 바로 예시를 보도록 하겠습니다!</p>
<p>👁‍🗨 예시</p>
<pre><code>.box{
    position: relative;
    width: 300px;
    height: 300px;
    background-color: #0066ff;
    animation-name: move-box; 
    animation-duration: 1000ms;
    animation-timing-function: ease-in-out;
    animation-delay: 1000ms;
    animation-iteration-count: infinite;
    animation-direction: alternate;
}

@keyframes move-box{
    from {
        top: 0;
        background-color: #0066ff;
    }

    to{
        top: 200px;
        background-color: #ff4949;
    }
}

    or

/* @keyframes move-box{
      0%{
          rules
      }
      50%{
          rules
      }
      100%{
          rules
      }
  }  */  &lt;from to 또는 0%~100%로 방향을 설정할 수 있음&gt;
</code></pre><p>🔴 animation-name은 @keyframes 다음에 오는 이름으로 설정해준다.</p>
<p>🟠 animation-iteration-count : 애니메이션 반복 횟수 설정해주는 속성</p>
<p>🟡 animation-direction : 애니메이션 진행 방향( from to or 0%~100%의 방향을 의미 ) 설정
ex) animation-direction: alternate; // alternate는 진행 방향을 &lt;원래 반대 원래 반대 ...&gt; 순으로 애니메이션 진행방향을 설정함</p>
<p><a href="https://developer.mozilla.org/ko/">https://developer.mozilla.org/ko/</a> - CSS 속성 검색 유용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[예외 처리]]></title>
            <link>https://velog.io/@dla-tngus/%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@dla-tngus/%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Fri, 05 Feb 2021 06:41:58 GMT</pubDate>
            <description><![CDATA[<h1 id="예외-처리">예외 처리</h1>
<p>🔑 프로그램을 만들다 보면 수없이 많은 오류를 만나게 된다. 물론 오류가 발생하는 이유는 프로그램이 잘못 동작하는 것을 막기 위한 파이썬의 배려이다. 하지만 때때로 이러한 오류를 무시하고 싶을 때도 있다. 이를 위해 파이썬은 try, except를 사용해서 예외적으로 오류를 처리할 수 있게 해준다.</p>
<h1 id="오류-예외-처리-기법">오류 예외 처리 기법</h1>
<h3 id="try-except문">try, except문</h3>
<p>다음은 오류 처리를 위한 try, except문의 기본 구조이다.</p>
<pre><code>try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...</code></pre><p>try 블록 수행 중 오류가 발생하면 except 블록이 수행된다. 하지만 try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.</p>
<p>except 구문을 자세히 살펴보자.</p>
<p>except [발생 오류 [as 오류 메시지 변수]]:</p>
<p>위 구문을 보면 [ ] 기호를 사용하는데, 이 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법이다. 즉 except 구문은 다음 3가지 방법으로 사용할 수 있다.</p>
<p><strong>1. try, except만 쓰는 방법</strong></p>
<pre><code>try:
    ...
except:
    ...</code></pre><p>이 경우는 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행한다.</p>
<p><strong>2. 발생 오류만 포함한 except문</strong></p>
<pre><code>try:
    ...
except 발생 오류:
    ...</code></pre><p>이 경우는 오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 뜻이다.</p>
<p><strong>3. 발생 오류와 오류 메시지 변수까지 포함한 except문</strong></p>
<pre><code>try:
    ...
except 발생 오류 as 오류 메시지 변수:
    ...</code></pre><p>이 경우는 두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법이다.</p>
<p>이 방법의 예를 들어 보면 다음과 같다.</p>
<pre><code>try:
    4 / 0
except ZeroDivisionError as e:
    print(e)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/adcf9925-acbb-49b4-b622-2d59d90edc3b/image.png" alt="">
위처럼 4를 0으로 나누려고 하면 ZeroDivisionError가 발생하여 except 블록이 실행되고 변수 e에 담기는 오류 메시지를 다음과 같이 출력한다.</p>
<h3 id="try--finally">try .. finally</h3>
<p>try문에는 finally절을 사용할 수 있다. finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다. 보통 finally절은 사용한 리소스를 close해야 할 때에 많이 사용한다.</p>
<p>다음 예를 보자.</p>
<pre><code>f = open(&#39;foo.txt&#39;, &#39;w&#39;)
try:
    # 무언가를 수행한다.
finally:
    f.close()</code></pre><p>foo.txt 파일을 쓰기 모드로 연 후에 try문을 수행한 후 예외 발생 여부와 상관없이 finally절에서 f.close()로 열린 파일을 닫을 수 있다.</p>
<h3 id="여러개의-오류-처리하기">여러개의 오류 처리하기</h3>
<p>try문 안에서 여러 개의 오류를 처리하기 위해 다음 구문을 사용한다.</p>
<pre><code>try:
    ...
except 발생 오류1:
   ... 
except 발생 오류2:
   ...</code></pre><p>즉 0으로 나누는 오류와 인덱싱 오류를 다음과 같이 처리할 수 있다.</p>
<pre><code>try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError:
    print(&quot;0으로 나눌 수 없습니다.&quot;)
except IndexError:
    print(&quot;인덱싱 할 수 없습니다.&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/1911556f-6deb-419b-b836-3cfa45893973/image.png" alt="">
a는 2개의 요솟값을 가지고 있기 때문에 a[3]는 IndexError를 발생시키므로 &quot;인덱싱할 수 없습니다.&quot;라는 문자열이 출력될 것이다. 인덱싱 오류가 먼저 발생했으므로 4/0으로 발생되는 ZeroDivisionError 오류는 발생하지 않았다.</p>
<p>앞에서 알아본 것과 마찬가지로 오류 메시지도 다음과 같이 가져올 수 있다.</p>
<pre><code>try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError as e:
    print(e)
except IndexError as e:
    print(e)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/1e887ee7-76c4-4f53-a78f-80c021fc22eb/image.png" alt=""></p>
<p>다음과 같이 ZerroDivisionError와 IndexError를 함께 처리할 수도 있다.</p>
<pre><code>try:
    a = [1,2]
    print(a[3])
    4/0
except (ZeroDivisionError, IndexError) as e:
    print(e)</code></pre><p>2개 이상의 오류를 동일하게 처리하기 위해서는 위와 같이 괄호를 사용하여 함께 묶어 처리하면 된다.</p>
<h3 id="try문에-else절-사용하기">try문에 else절 사용하기</h3>
<p>try문에는 else절을 사용할 수 있다. try, except, else 문의 기본 구조는 다음과 같다.</p>
<pre><code>try:
    ...
except 발생 오류:
    ...
else:  # 오류가 없을 경우에만 수행된다.
    ...</code></pre><p>다음은 try문에 else절을 활용하는 간단한 예이다.</p>
<pre><code>try:
    age=int(input(&#39;나이를 입력하세요: &#39;))
except:
    print (&#39;입력이 정확하지 않습니다.&#39;)
else:
    if age &lt;= 18:
        print(&#39;미성년자는 출입금지입니다.&#39;)
    else:
        print(&#39;환영합니다.&#39;)</code></pre><p>만약 &#39;나이를 입력하세요:&#39; 라는 질문에 숫자가 아닌 다른 값을 입력하면 오류가 발생하여 &#39;입력이 정확하지 않습니다.&#39;라는 문장을 출력한다. 오류가 없을 경우에만 else절이 수행된다.</p>
<h1 id="오류-회피하기">오류 회피하기</h1>
<p>프로그래밍을 하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있다. 다음 예를 보자.</p>
<pre><code>try:
    f = open(&quot;나없는파일&quot;, &#39;r&#39;)
except FileNotFoundError:
    pass</code></pre><p>try문 안에서 FileNotFoundError가 발생할 경우에 pass를 사용하여 오류를 그냥 회피하도록 작성한 예제이다.</p>
<h1 id="오류-일부러-발생시키기">오류 일부러 발생시키기</h1>
<p>이상하게 들리겠지만 프로그래밍을 하다 보면 종종 오류를 일부러 발생시켜야 할 경우도 생긴다. 파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.</p>
<p>예를 들어 Bird 클래스를 상속받는 자식 클래스는 반드시 fly라는 함수를 구현하도록 만들고 싶은 경우(강제로 그렇게 하고 싶은 경우)가 있을 수 있다. 다음 예를 보자.</p>
<pre><code>class Bird:
    def fly(self):
        raise NotImplementedError</code></pre><p>위 예제는 Bird 클래스를 상속받는 자식 클래스는 반드시 fly 함수를 구현해야 한다는 의지를 보여 준다. 만약 자식 클래스가 fly 함수를 구현하지 않은 상태로 fly 함수를 호출한다면 어떻게 될까?</p>
<p>※ NotImplementedError는 파이썬 내장 오류로, 꼭 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 일으키기 위해 사용한다.</p>
<pre><code>class Eagle(Bird):
    pass

eagle = Eagle()
eagle.fly()</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/5b66c682-86ca-45a7-90e4-cdac181306d0/image.png" alt="">
Eagle 클래스는 Bird 클래스를 상속받는다. 그런데 Eagle 클래스에서 fly 함수를 구현하지 않았기 때문에 Bird 클래스의 fly 함수가 호출된다. 그리고 raise문에 의해 NotImplemented Error가 발생할 것이다.</p>
<p>NotImplementedError가 발생되지 않게 하려면 다음과 같이 Eagle 클래스에 fly 함수를 반드시 구현해야 한다.</p>
<pre><code>class Eagle(Bird):
    def fly(self):
        print(&quot;very fast&quot;)

eagle = Eagle()
eagle.fly()</code></pre><h1 id="예외-만들기">예외 만들기</h1>
<p>프로그램 수행 도중 특수한 경우에만 예외 처리를 하기 위해서 종종 예외를 만들어서 사용한다. 직접 예외를 만들어 보자. 예외는 다음과 같이 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.</p>
<pre><code>class MyError(Exception):
    pass</code></pre><p>그리고 별명을 출력해 주는 함수를 다음과 같이 작성한다.</p>
<pre><code>def say_nick(nick):
    if nick == &#39;바보&#39;:
        raise MyError()
    print(nick)</code></pre><p>그리고 다음과 같이 say_nick 함수를 호출해 보자.</p>
<pre><code>say_nick(&quot;천사&quot;)
say_nick(&quot;바보&quot;)</code></pre><p>저장한 뒤 프로그램을 실행해 보면 &quot;천사&quot;가 한 번 출력된 후 MyError가 발생한다.</p>
<p>이번에는 예외 처리 기법을 사용하여 MyError 발생을 예외 처리해 보자.</p>
<pre><code>class MyError(Exception):
    pass

def say_nick(nick):
    if nick == &#39;바보&#39;:
        raise MyError()
    print(nick)

try:
    say_nick(&quot;천사&quot;)
    say_nick(&quot;바보&quot;)
except MyError:
    print(&quot;허용되지 않는 별명입니다.&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/02587b59-0733-4ccc-8801-798129f654b8/image.png" alt="">
프로그램을 실행하면 위와 같이 출력된다.</p>
<p>만약 오류 메시지를 사용하고 싶다면 다음처럼 예외 처리를 하면 된다.</p>
<pre><code>class MyError(Exception):
    pass

def say_nick(nick):
    if nick == &#39;바보&#39;:
        raise MyError()
    print(nick)

try:
    say_nick(&quot;천사&quot;)
    say_nick(&quot;바보&quot;)
except MyError as e:
    print(e)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/3b40dd25-46e1-4d99-a33b-ec936063bb49/image.png" alt="">
하지만 프로그램을 실행해 보면 print(e)로 오류 메시지가 출력되지 않는 것을 확인할 수 있다. 오류 메시지를 출력했을 때 오류 메시지가 보이게 하려면 오류 클래스에 다음과 같은 <strong>str</strong> 메서드를 구현해야 한다. <strong>str</strong> 메서드는 print(e)처럼 오류 메시지를 print문으로 출력할 경우에 호출되는 메서드이다.</p>
<pre><code>class MyError(Exception):
    def __str__(self):
        return &quot;허용되지 않는 별명입니다.&quot;

def say_nick(nick):
    if nick == &#39;바보&#39;:
        raise MyError()
    print(nick)

try:
    say_nick(&quot;천사&quot;)
    say_nick(&quot;바보&quot;)
except MyError as e:
    print(e)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/16e41eb8-feeb-4213-b153-d310fa15007e/image.png" alt="">
프로그램을 다시 실행해 보면 위와 같은 결과가 나오는 것을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모듈]]></title>
            <link>https://velog.io/@dla-tngus/%EB%AA%A8%EB%93%88</link>
            <guid>https://velog.io/@dla-tngus/%EB%AA%A8%EB%93%88</guid>
            <pubDate>Thu, 04 Feb 2021 08:39:44 GMT</pubDate>
            <description><![CDATA[<h1 id="모듈이란">모듈이란?</h1>
<p>🔑 모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다. 우리는 파이썬으로 프로그래밍을 할 때 굉장히 많은 모듈을 사용한다. 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어서 사용할 수도 있다. 여기에서는 모듈을 어떻게 만들고 사용할 수 있는지 알아보겠다.</p>
<h1 id="모듈-만들기">모듈 만들기</h1>
<p>🎈 모듈에 대해 자세히 살펴보기 전에 간단한 모듈을 한번 만들어 보자.</p>
<pre><code># mod1.py
def add(a, b):
    return a + b

def sub(a, b): 
    return a-b</code></pre><p>위와 같이 add와 sub 함수만 있는 파일 mod1.py를 만들고 C:\doit 디렉터리에 저장하자. 이 mod1.py 파일이 바로 모듈이다. 지금까지 에디터로 만들어 온 파일과 다르지 않다.</p>
<p>⭐ 파이썬 확장자 .py로 만든 파이썬 파일은 모두 모듈이다. ⭐</p>
<h1 id="모듈-불러오기">모듈 불러오기</h1>
<pre><code>import mod1

print(mod1.add(3, 4))
print(mode1.sub(4, 2))</code></pre><p>mod1.py를 불러오기 위해 import mod1이라고 입력하였다. 실수로 import mod1.py로 입력하지 않도록 주의하자. import는 이미 만들어 놓은 파이썬 모듈을 사용할 수 있게 해주는 명령어이다. mod1.py 파일에 있는 add 함수를 사용하기 위해서는 위 예와 같이 mod1.add처럼 모듈 이름 뒤에 &quot;.&quot;(도트 연산자)를 붙이고 함수 이름을 쓰면 된다.</p>
<p>※ import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈만 불러올 수 있다. 파이썬 라이브러리는 파이썬을 설치할 때 자동으로 설치되는 파이썬 모듈을 말한다.</p>
<p>📌 import의 사용 방법은 다음과 같다.</p>
<pre><code>import 모듈이름</code></pre><p>여기에서 모듈 이름은 mod1.py에서 .py 확장자를 제거한 mod1만을 가리킨다.</p>
<p>때로는 mod1.add, mod1.sub처럼 쓰지 않고 add, sub처럼 모듈 이름 없이 함수 이름만 쓰고 싶은 경우도 있을 것이다. 이럴 때는 &quot;from 모듈 이름 import 모듈 함수&quot;를 사용하면 된다.</p>
<p><strong>🔥 from 모듈이름 import 모듈함수</strong></p>
<p>위 형식을 사용하면 위와 같이 모듈 이름을 붙이지 않고 바로 해당 모듈의 함수를 쓸 수 있다.</p>
<pre><code>from mod1 import add
add(3, 4)</code></pre><p>그런데 위와 같이 하면 mod1.py 파일의 add 함수만 사용할 수 있다. add 함수와 sub 함수를 둘 다 사용하고 싶다면 어떻게 해야 할까?</p>
<p>2가지 방법이 있다.</p>
<pre><code>from mod1 import add, sub</code></pre><p>📍 첫 번째 방법은 위와 같이 from 모듈 이름 import 모듈 함수1, 모듈 함수2처럼 사용하는 것이다. 콤마로 구분하여 필요한 함수를 불러올 수 있다.</p>
<pre><code>from mod1 import *</code></pre><p>📍📍 두 번째 방법은 위와 같이 * 문자를 사용하는 방법이다. </p>
<p>from mod1 import *는 mod1.py의 모든 함수를 불러서 사용하겠다는 뜻이다.</p>
<h1 id="if____name____--main-의-의미">if____name____ == &quot;<strong><strong>main</strong></strong>&quot;: 의 의미</h1>
<p>mod1.py 파일을 다음과 같이 변경했다.</p>
<pre><code># mod1.py 
def add(a, b): 
    return a+b

def sub(a, b): 
    return a-b

print(add(1, 4))
print(sub(4, 2))</code></pre><p>다음과 같이 변경된 mod1.py 파일을 아래와 같이 실행시켜보면</p>
<pre><code>import mod1</code></pre><p>5와 2가 출력으로 나오게 될 것이다.</p>
<p>하지만 단지 mod1.py 파일의 add와 sub 함수만 사용하길 원했다면
다음과 같은 출력은 반갑지 않을 것이다. 그러므로 이러한 문제를 방지하기 위해서는 mod1.py 파일을 다음과 같이 변경해야 한다.</p>
<pre><code># mod1.py 
def add(a, b): 
    return a+b

def sub(a, b): 
    return a-b

if __name__ == &quot;__main__&quot;:
    print(add(1, 4))
    print(sub(4, 2))</code></pre><p>다음과 같이 변경할 경우 mod1.py 파일 내에서 실행하는 경우가 아니라면 </p>
<pre><code>import mod1</code></pre><p>다음과 같은 코드에서 아무 출력값도 나오지 않게 될 것이다.</p>
<p>즉 if____name____ == &quot;<strong><strong>main</strong></strong>&quot;를 사용하면 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 if____name____ == &quot;<strong><strong>main</strong></strong>&quot;이 거짓이 되어 if문 다음 문장이 수행되지 않게된다.</p>
<h3 id="❓-name-변수란">❓ <strong><strong>name</strong></strong> 변수란?</h3>
<p>파이썬의 <strong>name</strong> 변수는 파이썬이 내부적으로 사용하는 특별한 변수 이름이다. 만약 C:\doit&gt;python mod1.py처럼 직접 mod1.py 파일을 실행할 경우 mod1.py의 <strong>name</strong> 변수에는 <strong>main</strong> 값이 저장된다. 하지만 파이썬 셸이나 다른 파이썬 모듈에서 mod1을 import 할 경우에는 mod1.py의 <strong>name</strong> 변수에는 mod1.py의 모듈 이름 값 mod1이 저장된다.</p>
<h1 id="클래스나-변수-등을-포함한-모듈">클래스나 변수 등을 포함한 모듈</h1>
<p>🔑 지금까지 살펴본 모듈은 함수만 포함했지만 클래스나 변수 등을 포함할 수도 있다. 다음 프로그램을 작성해 보자.</p>
<pre><code># mod2.py 
PI = 3.141592

class Math: 
    def solv(self, r): 
        return PI * (r ** 2) 

def add(a, b): 
    return a+b </code></pre><p>이 파일은 원의 넓이를 계산하는 Math 클래스와 두 값을 더하는 add 함수 그리고 원주율 값에 해당되는 PI 변수처럼 클래스, 함수, 변수 등을 모두 포함하고 있다.</p>
<p>이럴 경우 다음과 같이 모듈을 불러와 모듈 안에 있는 변수나 함수, 클래스 등을 사용할 수 있다.</p>
<pre><code>import mod2

a = mod2.Math()
print(a.solv(2))

b = mod2.add(mod2.PI, 4)
print(b)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[클래스(Class)]]></title>
            <link>https://velog.io/@dla-tngus/%ED%81%B4%EB%9E%98%EC%8A%A4Class</link>
            <guid>https://velog.io/@dla-tngus/%ED%81%B4%EB%9E%98%EC%8A%A4Class</guid>
            <pubDate>Thu, 04 Feb 2021 07:21:36 GMT</pubDate>
            <description><![CDATA[<h1 id="클래스와-객체">클래스와 객체</h1>
<p>🔑 클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면이고, 객체(object)란 클래스로 만든 피조물을 뜻한다.</p>
<p>클래스로 만든 객체에는 중요한 특징이 있다. 바로 객체마다 고유한 성격을 가진다는 것이다. 과자 틀로 만든 과자에 구멍을 뚫거나 조금 베어 먹더라도 다른 과자에는 아무 영향이 없는 것과 마찬가지로 동일한 클래스로 만든 객체들은 서로 전혀 영향을 주지 않는다.</p>
<p>🤍 객체는 클래스로 만들며 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있다.</p>
<p>예시)</p>
<pre><code>class Cookie :
    pass
a = Cookie()
b = Cookie()</code></pre><h3 id="👁🗨-객체와-인스턴스의-차이">👁‍🗨 객체와 인스턴스의 차이</h3>
<p>클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각해 보자. a = Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. &quot;a는 인스턴스&quot;보다는 &quot;a는 객체&quot;라는 표현이 어울리며 &quot;a는 Cookie의 객체&quot;보다는 &quot;a는 Cookie의 인스턴스&quot;라는 표현이 훨씬 잘 어울린다.</p>
<h1 id="클래스-만들기">클래스 만들기</h1>
<p>🔑 클래스 기본구조는 다음과 같다.</p>
<pre><code>class 클래스이름 : 
    메서드 또는 수행할 내용</code></pre><h3 id="객체에-숫자-지정할-수-있게-만들기">객체에 숫자 지정할 수 있게 만들기</h3>
<p>객체에 숫자를 지정할 수 있게 만들기 위해서는 클래스 안에 구현된 함수 즉 <strong>메서드</strong>가 필요하다.</p>
<p>예시)</p>
<pre><code>class FourCal:
    def setdata(self, first, second) :  # 메서드의 매개변수
        self.first = first              # 메서드의 수행문
        self.second = second            # 메서드의 수행문

a = FourCal()
a.setdata(4, 2)</code></pre><p>그런데 뭔가 좀 이상하지 않은가? setdata 메서드에는 self, first, second 총 3개의 매개변수가 필요한데 실제로는 a.setdata(4, 2)처럼 2개 값만 전달했다. 왜 그럴까? 그 이유는 a.setdata(4, 2)처럼 호출하면 setdata 메서드의 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달되기 때문이다. 다음 그림을 보면 객체를 호출할 때 입력한 값이 메서드에 어떻게 전달되는지 쉽게 이해할 수 있을 것이다.
<img src="https://images.velog.io/images/dla-tngus/post/3800091d-9f37-4ccc-9cee-bed44021271a/image.png" alt="">
파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다. 물론 self말고 다른 이름을 사용해도 상관없다.</p>
<h3 id="메서드의-수행문-해석">메서드의 수행문 해석</h3>
<p>다음 예시 메서드의 수행문에 대해 알아보자.</p>
<pre><code>def setdata(self, first, second) :      # 메서드의 매개변수
    self.first = first                  # 메서드의 수행문
    self.second = second                # 메서드의 수행문</code></pre><p>a.setdata(4, 2)처럼 호출하면 setdata 메서드의 매개변수 first, second에는 각각 값 4와 2가 전달되어 setdata 메서드의 수행문은 다음과 같이 해석된다.</p>
<pre><code>self.first = 4
self.second = 2</code></pre><p>self는 전달된 객체 a이므로 다시 다음과 같이 해석된다.</p>
<pre><code>a.first = 4
a.second = 2</code></pre><p>a.first = 4 문장이 수행되면 a 객체에 객체변수 first가 생성되고 값 4가 저장된다. 마찬가지로 a.second = 2 문장이 수행되면 a 객체에 객체변수 second가 생성되고 값 2가 저장된다.</p>
<p>다음과 같이 확인해 보자.</p>
<pre><code>class FourCal:
    def setdata(self, first, second) :  # 메서드의 매개변수
        self.first = first              # 메서드의 수행문
        self.second = second            # 메서드의 수행문
a = FourCal()
a.setdata(4, 2)
print(a.first)
print(a.second)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/71dd43c8-6475-4d64-9798-25d96c73a2f9/image.png" alt="">
a 객체에 객체변수 first와 second가 생성되었음을 확인할 수 있다.</p>
<h1 id="생성자constructor">생성자(Constructor)</h1>
<p>🔑 생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.
파이썬 메서드 이름으로 <strong><strong>init</strong></strong>를 사용하면 이 메서드는 생성자가 된다. 다음과 같이 FourCal 클래스에 생성자를 추가해 보자.</p>
<p>※ <strong><strong>init</strong></strong> 메서드의 init 앞뒤로 붙은 <strong><strong>는 언더스코어(</strong></strong>) 두 개를 붙여 쓴 것이다.</p>
<pre><code>class FourCal:
     def __init__(self, first, second):
         self.first = first
         self.second = second
     def setdata(self, first, second):
         self.first = first
         self.second = second
     def add(self):
         result = self.first + self.second
         return result
     def div(self):
         result = self.first / self.second
         return result</code></pre><p>새롭게 추가된 생성자 <strong>init</strong> 메서드만 따로 떼어 내서 살펴보자.</p>
<pre><code>def __init__(self, first, second):
         self.first = first
         self.second = second</code></pre><p><strong><strong>init</strong></strong> 메서드는 setdata 메서드와 이름만 다르고 모든 게 동일하다. 단 메서드 이름을 <strong><strong>init</strong></strong>으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출되는 차이가 있다.</p>
<h1 id="클래스의-상속">클래스의 상속</h1>
<p>상속(Inheritance)이란 &quot;물려받다&quot;라는 뜻으로, &quot;재산을 상속받다&quot;라고 할 때의 상속과 같은 의미이다. 클래스에도 이 개념을 적용할 수 있다. 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.</p>
<p>이번에는 상속 개념을 사용하여 우리가 위에서 만든 FourCal 클래스에 ab (a의 b제곱)을 구할 수 있는 기능을 추가해 보자.</p>
<p>앞에서 FourCal 클래스는 이미 만들어 놓았으므로 FourCal 클래스를 상속하는 MoreFourCal 클래스는 다음과 같이 간단하게 만들 수 있다.</p>
<pre><code>class MoreFourCal(FourCal):
    pass</code></pre><p>클래스를 상속하기 위해서는 다음처럼 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.
<strong>📣 class 클래스 이름(상속할 클래스 이름)</strong></p>
<p>MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능을 사용할 수 있어야 한다.</p>
<pre><code>class FourCal:
     def __init__(self, first, second):
         self.first = first
         self.second = second
     def setdata(self, first, second):
         self.first = first
         self.second = second
     def add(self):
         result = self.first + self.second
         return result
     def div(self):
         result = self.first / self.second
         return result

class MoreFourCal(FourCal):
    pass
a = MoreFourCal(4, 2)
print(a.add())</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/f0cd05e9-4874-45a2-b55d-656e3d3cf411/image.png" alt=""></p>
<h3 id="왜-상속을-해야-할까">왜 상속을 해야 할까?</h3>
<p>보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.</p>
<p>&quot;클래스에 기능을 추가하고 싶으면 기존 클래스를 수정하면 되는데 왜 굳이 상속을 받아서 처리해야 하지?&quot; 라는 의문이 들 수도 있다. 하지만 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.</p>
<p>이제 원래 목적인 a의 b제곱(ab)을 계산하는 MoreFourCal 클래스를 만들어 보자.</p>
<pre><code>class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result

a = MoreFourCal(4, 2)
print(a.pow())</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/977a6504-242d-4074-aec3-775a5448e0e0/image.png" alt="">
MoreFourCal 클래스로 만든 a 객체에 값 4와 2를 설정한 후 pow 메서드를 호출하면 4의 2제곱 (42)인 16을 돌려주는 것을 확인할 수 있다.</p>
<h1 id="메서드-오버라이딩">메서드 오버라이딩</h1>
<p>🔑 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(Overriding)이라고 한다. 메서드를 오버라이딩하면 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.</p>
<p>예시로 위에서 만들어둔 FourCal 클래스의 div 메서드를 오버라이딩 해보자.</p>
<pre><code>class SafeFourCal(FourCal) :
    def div(self):
        if self.second == 0 :
            return 0
        else :
            return self.first / self.second</code></pre><h1 id="클래스-변수">클래스 변수</h1>
<p>🔑 객체변수는 다른 객체들에 영향받지 않고 독립적으로 그 값을 유지한다는 점을 이미 알아보았다. 이번에는 객체변수와는 성격이 다른 클래스 변수에 대해 알아보자.</p>
<p>다음 클래스를 작성해 보자.</p>
<pre><code>class Family:
    lastname = &quot;김&quot;</code></pre><p>Family 클래스에 선언한 lastname이 바로 클래스 변수이다. 클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.</p>
<p>이제 Family 클래스를 다음과 같이 사용해 보자.</p>
<pre><code>class Family:
    lastname = &quot;김&quot;

print(Family.lastname)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/6eb322c6-01ae-4865-b857-63139a6fbb98/image.png" alt="">
클래스 변수는 위 예와 같이 <strong>클래스이름.클래스 변수</strong>로 사용할 수 있다.</p>
<p>또는 다음과 같이 Family 클래스로 만든 객체를 통해서도 클래스 변수를 사용할 수 있다.</p>
<pre><code>class Family:
    lastname = &quot;김&quot;

a = Family()
b = Family()
print(a.lastname)
print(b.lastname)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/40ce83f0-66aa-458c-af45-cd8196ec5f71/image.png" alt=""></p>
<p>만약 Family 클래스의 lastname을 다음과 같이 &quot;박&quot;이라는 문자열로 바꾸면 어떻게 될까?</p>
<pre><code>class Family:
    lastname = &quot;김&quot;

a = Family()
b = Family()

Family.lastname = &quot;박&quot;

print(a.lastname)
print(b.lastname)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/5e1e6226-ebd4-46f5-b94d-1614eb9fe727/image.png" alt="">
클래스 변수 값을 변경했더니 클래스로 만든 객체의 lastname 값도 모두 변경된다는 것을 확인할 수 있다. <strong>즉 클래스 변수는 클래스로 만든 모든 객체에 공유된다는 특징이 있다.</strong></p>
<p>클래스 변수를 가장 늦게 설명하는 이유는 클래스에서 클래스 변수보다는 객체변수가 훨씬 중요하기 때문이다. 실무 프로그래밍을 할 때도 클래스 변수보다는 객체변수를 사용하는 비율이 훨씬 높다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[사용자 입력과 출력]]></title>
            <link>https://velog.io/@dla-tngus/%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@dla-tngus/%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Tue, 02 Feb 2021 09:03:06 GMT</pubDate>
            <description><![CDATA[<h1 id="사용자-입력">사용자 입력</h1>
<p>❓ 사용자가 입력한 값을 어떤 변수에 대입하고 싶을 때는 어떻게 해야 할까?</p>
<h3 id="input의-사용">input의 사용</h3>
<pre><code>a = input()
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/776af57b-bf06-4688-80aa-5373fba21d81/image.png" alt=""></p>
<p>🔑 input은 입력되는 모든 것을 문자열로 취급한다.</p>
<h3 id="프롬프트를-띄워서-사용자-입력-받기">프롬프트를 띄워서 사용자 입력 받기</h3>
<p>사용자에게 입력받을 때 &quot;숫자를 입력하세요&quot;라든지 &quot;이름을 입력하세요&quot;라는 안내 문구 또는 질문이 나오도록 하고 싶을 때가 있다. 그럴 때는 <strong>input()의 괄호 안에 질문을 입력</strong>하여 프롬프트를 띄워주면 된다.</p>
<pre><code>number = input(&quot;숫자를 입력하세요: &quot;)
print(number)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/923dd6ab-3856-4ed4-8acf-0d2719fea04b/image.png" alt=""></p>
<h1 id="print-자세히-알기">Print 자세히 알기</h1>
<p>🔑 지금껏 print문이 수행해 온 일은 우리가 입력한 자료형을 출력하는 것이었다. </p>
<p>print의 사용예는 다음과 같다.</p>
<pre><code>a = 123
print(a)
b = &quot;Python&quot;
print(b)
c = [1, 2, 3]
print(c)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/971452f3-4c10-4b4b-9c3b-ac23c5c21c11/image.png" alt="">
이제 print문으로 할 수 있는 일에 대해서 조금 더 자세하게 알아보자.</p>
<h3 id="큰따옴표로-둘러싸인-문자열은--연산과-동일하다">큰따옴표(&quot;)로 둘러싸인 문자열은 + 연산과 동일하다</h3>
<pre><code>print(&quot;life&quot; &quot;is&quot; &quot;too short&quot;) # 1
print(&quot;life&quot;+&quot;is&quot;+&quot;too short&quot;) # 2</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/bdf1d2d3-52ac-4646-8b35-ae75c1b4920e/image.png" alt=""></p>
<p>📌 위 예에서 1과 2는 완전히 동일한 결괏값을 출력한다. 즉 따옴표로 둘러싸인 문자열을 연속해서 쓰면 + 연산을 할 것과 같다.</p>
<h3 id="문자열-띄어쓰기는-콤마로-한다">문자열 띄어쓰기는 콤마로 한다</h3>
<pre><code>print(&quot;life&quot;, &quot;is&quot;, &quot;too short&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/b17f751b-ad49-4e2b-bc9b-c5fe24e12320/image.png" alt=""></p>
<p>🔥 콤마(,)를 사용하면 문자열 사이에 띄어쓰기를 할 수 있다.</p>
<h3 id="한-줄에-결괏값-출력하기">한 줄에 결괏값 출력하기</h3>
<p>💥 한 줄에 결괏값을 계속 이어서 출력하려면 <strong>매개변수 end</strong>를 사용해 끝 문자를 지정해야 한다.</p>
<pre><code>for i in range(10):
    print(i, end=&#39; &#39;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/6d886055-a088-4dff-9d7d-03a1edb5d720/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[그래프(Graph)]]></title>
            <link>https://velog.io/@dla-tngus/%EA%B7%B8%EB%9E%98%ED%94%84Graph</link>
            <guid>https://velog.io/@dla-tngus/%EA%B7%B8%EB%9E%98%ED%94%84Graph</guid>
            <pubDate>Tue, 02 Feb 2021 08:46:19 GMT</pubDate>
            <description><![CDATA[<h1 id="그래프의-개념">그래프의 개념</h1>
<p>🔑 그래프란 정점과 간선들로 이루어진 집합으로 표현되는 자료구조이다.</p>
<p>트리도 일종의 그래프라고 할 수 있다.</p>
<h1 id="그래프의-종류">그래프의 종류</h1>
<p>🔴 무방향 그래프 : 간선이 방향을 가지지 않음</p>
<p>🟠 방향 그래프 : 간선이 방향을 가지고 있음</p>
<p>🟡 가중치 그래프 : 각 간선에 가중치 정보가 포함됨. 가중치는 거리, 비용 등으로 표현 할 수 있다.</p>
<h1 id="그래프의-구현">그래프의 구현</h1>
<p>⚽ <strong>인접 행렬</strong> 기반 그래프
각 장점간의 가중치나 간선의 유무를 행렬로 표현한다.
무방향 그래프의 경우 전치행렬이 되어도 값이 같다.
<img src="https://images.velog.io/images/dla-tngus/post/68678e49-ad45-4978-8c65-c5d6d5da8e6b/image.png" alt=""></p>
<p>👁‍🗨 <strong>인접 리스트</strong> 기반 그래프
인접 행렬이 행렬을 이용한것과는 달리 인접 리스트로 구현한다.
<img src="https://images.velog.io/images/dla-tngus/post/adc48257-a6b9-4e31-8587-5f0ba3e6922d/image.png" alt=""></p>
<p>💨 파이썬에서는 그냥 딕셔너리 자료형에 리스트를 넣어 쉽게 인접 리스트처럼 구현하여 사용할 수 있다.</p>
<h1 id="bfs너비-우선-탐색">BFS(너비 우선 탐색)</h1>
<p>🔑 BFS는 너비 우선 탐색으로, 현재 Node(Vertex)에서 연결된 Node로 우선적으로 탐색하는 것을 뜻한다.</p>
<p>즉 아래 그림에서 A에서 BFS를 시작한다고 하면, B, E, I를 우선적으로 탐색하고, 그 후 B, E, I에 연결된 Node를 탐색한다.</p>
<p>즉 방문하는 순서는 [&#39;A&#39;, &#39;B&#39;, &#39;E&#39;, &#39;I&#39;, &#39;C&#39;, &#39;F&#39;, &#39;H&#39;, &#39;J&#39;, &#39;D&#39;, &#39;G&#39;] 순이 된다.</p>
<p>queue를 이용해서 구현할 수 있다.</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/36ffa392-eb5f-4df2-856f-e5f602e3376d/image.png" alt=""></p>
<h1 id="dfs깊이-우선-탐색">DFS(깊이 우선 탐색)</h1>
<p>🔑 DFS는 깊이 우선 탐색으로, 현재 Node(Vertex)에서 연결된 Node중에서 하나를 골라 더이상 진행할 수 없을때까지 탐색한다. 그 후 더이상 진행이 불가능하면, 진행이 가능한 Node 까지 되돌아 와서 탐색을 한다.</p>
<p>즉 위 그림에서 A에서 BFS를 시작한다고 하면, B를 우선적으로 탐색하고, 그 후 B에 연결된 Node를 탐색한다.</p>
<p>즉 방문하는 순서는 [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;] 순이 된다.</p>
<p>stack을 이용해서 구현할 수 있고, 함수의 재귀호출을 이용해서 구현할 수도 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS 개념정리 2]]></title>
            <link>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-2</link>
            <guid>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-2</guid>
            <pubDate>Mon, 01 Feb 2021 09:18:36 GMT</pubDate>
            <description><![CDATA[<h1 id="float-1">Float 1</h1>
<p>🔑 Float를 배우는 이유는 가로배치를 하기 위해서이다.</p>
<p>📌 Float를 사용함으로써 일어나게 되는 🐶개판난 경우들!</p>
<p>▷ 자식 요소가 float 되어버리면 부모는 자식을 더 이상 찾을 수 없다.</p>
<p>▶ 요소가 float 되어버리면 <strong>Display 타입이 Block</strong>으로 변한다.</p>
<p>▷ float로 인해 타입이 Block이 된 친구들은 더 이상 길막을 할 수 없다.
즉 블록의 특징? 단점?이 사라지게 된다.</p>
<p>▶ Inline 타입의 요소는 float 된 것을 인지한다(그래서 피해다닌다).</p>
<h1 id="float-2">Float 2</h1>
<p>🔑 Float를 사용함으로써 일어나는 🐶개판 해결방안</p>
<ol>
<li><p>overfloaw : hidden; - 이걸 사용하면 부모는 집나간 자식 요소를 찾을 수 있다.</p>
</li>
<li><p>정석적인 해결방안  - clear fix(오로지 float로 인해서 망가진 레이아웃을 고치기위해 탄생한 속성)
▷ clear는 총 3가지 (left, right, both) 값을 가질 수 있다. 
▶ clear 속성은 display가 block인 경우에만 사용이 가능하다.
▷ pseudo element(html에는 존재하지 않는 가상요소)
▶ content : 가상요소를 만들기 위해서 무조건 있어야 한다.</p>
</li>
</ol>
<p>▼ float로 인해 나타나는 문제를 해결하는 정석적인 방법</p>
<pre><code>.parent :: after{
    content : &quot; &quot;;
    display : block;
    clear : both;</code></pre><h1 id="position">Position</h1>
<p>🔑 position : 요소를 원하는 위치에 자유롭게 이동시키기 위해 사용하는 property</p>
<p>🔥 종류 : static, relative, absolute, fixed, sticky
※ sticky는 지원하는 브라우저가 별로 없어서 거의 사용하지 않는다.</p>
<p>📌 고려해야할 사항
☆ Type(어떤 종류의 position 인지)
★ 기준점(무엇을 기준으로 요소를 위치시키는지)</p>
<p>🔴 static : 가장 일반적인 상태</p>
<p>🟠 relative : 영혼은 남겨두고 몸만 붕떠서 나감</p>
<p>🟡 absolute 
▷ float를 했을때와 비슷한 상황이 발생한다.
▶ 부모는 자식을 더 이상 찾을수 없게 된다
▷ display 타입이 block으로 변한다
▶ 타입이 block이 된 친구들은 더이상 길막을 할 수 없다
▷ float의 상황과 유일하게 다른점은 inline요소가 인지하지 못한다는 것이다.</p>
<p>🔆 <strong>기준점</strong> - position이 static이 아닌것들 중에서 기준을 잡는다. 그러므로 기준으로 잡고싶은 부모요소의 position을 주로 relative로 지정한다.</p>
<p>🟢 fixed 
▷ <strong>viewport 사이즈를 기준으로</strong> 삼는다.
▶ absolute와 기준점 빼고는 똑같다.</p>
<p>⭐ 요소를 원하는 위치로 이동시키기 위해 top, right, bottom, left를 사용한다. 그런데 이때 4개를 모두 다 사용하지 말고 top, bottom 중 1개, right, left 중 1개를 기준으로 잡아 사용하여야 엉망징창되지 않는다 ⭐</p>
<p>🔆 Z-index : Z축을 기준으로 어느 위치에 있는지 정할때 사용한다.</p>
<p>📌 이미지 사이즈를 조정할때 많이 쓰이는 조합</p>
<pre><code>.card - carousel img{
    width : 100%
    height : auto;
    }</code></pre><p>📣 transform : translateY(-50%);
▷ 정가운데로 위치 시키거나 할 때 사용해야하는 속성</p>
<pre><code>#next{
    position : absolute;
    top : 50%;
    transform : translateY(-50%); 
    }</code></pre><h1 id="flex-box-1-정렬의-끝판왕">Flex box 1 (정렬의 끝판왕)</h1>
<p>🔑 Flexbox를 쓰기위한 4가지 사고과정</p>
<ol>
<li>나, 플렉스박스 쓸거임!!</li>
<li>가로 정렬? 세로 정렬?</li>
<li>무조건 한 줄 안에 다 정렬?? 아니면 여러줄에 걸쳐서 정렬??</li>
<li>신나는 플렉스박스 파티 타임 🎶</li>
</ol>
<p>🔆 플렉스박스 선언 방법</p>
<pre><code>.flexbox{
    display : flex; //or display : inline-flex;
    }</code></pre><p>🔎 이 선언을 어디에 해주어야 할까?
-&gt; <strong>정렬하고자 하는 요소를 감싸는 부모에게 display : flex;를 선언해주면 된다!</strong></p>
<h3 id="플렉스박스-정렬-방법가로-세로">플렉스박스 정렬 방법(가로? 세로?)</h3>
<pre><code>.flexbox{
    display : flex;
    flex-direction : row;
    /* column or row-reverse or column-reverse */
    }</code></pre><p>⭐ flex-direction : row; 일 경우 axis 생성 현황</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/4e995353-0c7c-40d5-bc5b-2e81efab42df/image.png" alt=""></p>
<p>⭐ flex-direction : column; 일 경우 axis 생성 현황</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/cd9d4665-a47d-441a-8b13-4d66f93dfbc9/image.png" alt=""></p>
<p>⭐ flex-direction : row-reverse; 일 경우 axis 생성 현황</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/aceefb5c-dd41-4975-a51d-6de2b08a7f74/image.png" alt=""></p>
<p>⭐ flex-direction : column-reverse; 일 경우 axis 생성 현황</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/9c191d93-4688-4476-a920-832df2509420/image.png" alt=""></p>
<h3 id="플렉스박스-정렬-방법한-줄-안에-다-나눠서">플렉스박스 정렬 방법(한 줄 안에 다? 나눠서?)</h3>
<pre><code>.flexbox{
    display : flex;
    flex-direction : row;
    flex-wrap : nowrap; //or wrap</code></pre><p>🤍 감싸지(wrap)않고 자식의 사이즈를 줄여서라도 <strong>한 줄로 정렬</strong>해 버리는 
<strong>flex-wrap : nowrap;</strong></p>
<p>🖤 한 줄에 모두 정렬하기에 공간이 넉넉하지 않으면 <strong>여러 줄</strong>을 만들어 버리는 
<strong>flex-wrap : wrap;</strong></p>
<h1 id="flex-box-2">Flex box 2</h1>
<p>🔑 정렬 방법(가운데 정렬? 양 옆으로 정렬?? 등등)</p>
<ol>
<li><p><strong>main axis</strong>를 기준으로 정렬 하고 싶을 때는 <strong>justify-content</strong>라는 css property를 사용해서 정렬을 하면된다.</p>
</li>
<li><p><strong>cross axis</strong>를 기준으로 정렬 하고 싶을 때는 <strong>align-items</strong> or <strong>align-content</strong>라는 css property를 사용해서 정렬을 하면 된다.</p>
<pre><code>.flexbox{
 display : flex;
 flex-direction : row;
 flex-wrap : nowrap; 
 justify-content : center; //or space around, space between 등
 }</code></pre><p>🌞 선 align-items 후 align-content를 추천한다</p>
</li>
</ol>
<p>📣 order : 요소의 순서를 설정할 수 있는 css property 이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[함수]]></title>
            <link>https://velog.io/@dla-tngus/%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@dla-tngus/%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 01 Feb 2021 08:30:10 GMT</pubDate>
            <description><![CDATA[<h1 id="파이썬-함수의-구조">파이썬 함수의 구조</h1>
<p>🔑 파이썬 함수의 구조는 다음과 같다.</p>
<pre><code>def 함수명(매개변수) :
    &lt;수행할 문장1&gt;
    &lt;수행할 문장2&gt;</code></pre><p>def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다. 함수 이름 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다. 이렇게 함수를 정의한 다음 if, while, for문 등과 마찬가지로 함수에서 수행할 문장을 입력한다.</p>
<p>예시</p>
<pre><code>def add(a, b) :
    return a + b
a = 3
b = 4
c = add(a, b)
print(c)</code></pre><p>여기에서 <strong>return</strong>은 함수의 결괏값을 돌려주는 명령어이다. </p>
<h1 id="매개변수와-인수">매개변수와 인수</h1>
<p>🔑 매개변수(parameter)와 인수(arguments)는 혼용해서 사용되는 헷갈리는 용어이므로 잘 기억해 두자. 매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미한다.</p>
<pre><code>def add(a, b) :  # a, b는 매개변수
    return a+b

print(add(3, 4)) # 3, 4는 인수</code></pre><h1 id="입력값과-결괏값에-따른-함수의-형태">입력값과 결괏값에 따른 함수의 형태</h1>
<p>🔑 함수는 들어온 입력값을 받아 어떤 처리를 하여 적절한 결괏값을 돌려준다.</p>
<p><strong>🔥 입력값 --&gt; 함수 --&gt; 결괏값</strong></p>
<p>▽ 함수의 형태는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉜다.</p>
<h3 id="일반적인-함수">일반적인 함수</h3>
<p>📌 입력값이 있고 결괏값이 있는 함수가 일반적인 함수이다. </p>
<p>예시)</p>
<pre><code>def add(a, b) :
    result = a + b
    return result
a = add(3, 4)
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/1f9f80e2-800c-4eea-91a7-fac61272d650/image.png" alt="">
add 함수는 2개의 입력값을 받아서 서로 더한 결괏값을 돌려준다.</p>
<p>이처럼 입력값과 결괏값이 있는 함수의 사용법을 정리하면 다음과 같다.
<strong>⭐ 결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)</strong></p>
<h3 id="입력값이-없는-함수">입력값이 없는 함수</h3>
<p>예시)</p>
<pre><code>def say() :
    return &#39;Hi&#39;
a = say()
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/ab13c382-8f4b-4416-8abb-bd14d354a441/image.png" alt="">
위 함수를 쓰기 위해서는 say()처럼 괄호 안에 아무 값도 넣지 않아야 한다. 이 함수는 입력값은 없지만 결괏값으로 Hi라는 문자열을 돌려준다. a = say()처럼 작성하면 a에 Hi 문자열이 대입되는 것이다.</p>
<p>이처럼 입력값이 없고 결괏값만 있는 함수는 다음과 같이 사용된다.
<strong>⭐ 결괏값을 받을 변수 = 함수이름()</strong></p>
<h3 id="결괏값이-없는-함수">결괏값이 없는 함수</h3>
<p>예시)</p>
<pre><code>def add(a, b) :
    print(&quot;%d, %d의 합은 %d입니다.&quot; %(a, b, a+b))
add(3, 4)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/efac3044-4897-402a-a091-d9c913bd3592/image.png" alt="">
결괏값이 없는 함수는 호출해도 돌려주는 값이 없기 때문에 위와 같이 사용한다.</p>
<p>아마도 여러분은 ‘3, 4의 합은 7입니다.’라는 문장을 출력해 주었는데 왜 결괏값이 없다는 것인지 의아하게 생각할 것이다. 이 부분이 초보자들이 혼란스러워하는 부분이기도 한데 print문은 함수의 구성 요소 중 하나인 &lt;수행할 문장&gt;에 해당하는 부분일 뿐이다. 결괏값은 당연히 없다. 결괏값은 오직 return 명령어로만 돌려받을 수 있다.</p>
<p>이를 확인해 보자. 돌려받을 값을 a 변수에 대입하여 출력해 보면 결괏값이 있는지 없는지 알 수 있다.</p>
<pre><code>def add(a, b) :
    print(&quot;%d, %d의 합은 %d입니다.&quot; %(a, b, a+b))
a = add(3, 4)
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/384bcb45-e6f0-44d9-aae1-3170c06c64ab/image.png" alt=""></p>
<p>a 값은 None이다. None이란 거짓을 나타내는 자료형이라고 언급한 적이 있다. add 함수처럼 결괏값이 없을 때 a = add(3, 4)처럼 쓰면 함수 add는 반환 값으로 a 변수에 None을 돌려준다. 이것을 가지고 결괏값이 있다고 생각하면 곤란하다.</p>
<p>즉 결괏값이 없는 함수는 다음과 같이 사용한다.
<strong>⭐ 함수이름(입력인수1, 입력인수2, ...)</strong></p>
<h3 id="입력값도-결괏값도-없는-함수">입력값도 결괏값도 없는 함수</h3>
<p>예시)</p>
<pre><code>def say() :
    print(&#39;Hi&#39;)
say()</code></pre><p>입력 인수를 받는 매개변수도 없고 return문도 없으니 입력값도 결괏값도 없는 함수이다.</p>
<p>이 함수를 사용하는 방법은 단 한 가지이다.
즉 입력값도 결괏값도 없는 함수는 다음과 같이 사용한다.
<strong>⭐ 함수이름()</strong></p>
<h1 id="매개변수-지정하여-호출하기">매개변수 지정하여 호출하기</h1>
<p>🔑 함수를 호출할 때 매개변수를 지정할 수도 있다.</p>
<p>예시)</p>
<pre><code>def add(a, b) :
    return a+b
result = add(a=3, b=7)
print(result)

result2 = add(b=5, a=3)
print(result2)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/5ec6b946-ac43-486d-ad1f-8484019f1045/image.png" alt=""></p>
<h1 id="입력값이-몇-개가-될지-모를-때는-어떻게-해야-할까">입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?</h1>
<p>🔑 입력값이 여러 개일 때 그 입력값을 모두 더해 주는 함수를 생각해 보자. 하지만 몇 개가 입력될지 모를 때는 어떻게 해야 할까? 아마도 난감할 것이다. 파이썬은 이런 문제를 해결하기 위해 다음과 같은 방법을 제공한다.</p>
<pre><code>def 함수이름(*매개변수) :
    &lt;수행할 문장&gt;</code></pre><p>일반적으로 볼 수 있는 함수 형태에서 괄호 안의 매개변수 부분이 <strong>*매개변수</strong>로 바뀌었다.</p>
<h3 id="여러-개의-입력값을-받는-함수-만들기">여러 개의 입력값을 받는 함수 만들기</h3>
<p>다음 예를 통해 여러 개의 입력값을 모두 더하는 함수를 직접 만들어 보자. 예를 들어 add_many(1, 2)이면 3을, add_many(1,2,3)이면 6을, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이면 55를 돌려주는 함수를 만들어 보자.</p>
<pre><code>def add_many(*args) :
    result = 0
    for i in args :
        result = result + i
    return result

result = add_many(1, 2, 3)
print(result)</code></pre><p>위에서 만든 add_many 함수는 입력값이 몇 개이든 상관이 없다. <strong>**<em>args처럼 *</em>매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 주기</strong> 때문이다. 만약 add_many(1, 2, 3)처럼 이 함수를 쓰면 args는 (1, 2, 3)이 되고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)처럼 쓰면 args는 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이 된다. 여기에서 <strong><strong>*args는 임의로 정한 변수 이름이다. *</strong></strong>pey, *python처럼 아무 이름이나 써도 된다.</p>
<h3 id="입력값을-딕셔너리로-만들기">입력값을 딕셔너리로 만들기</h3>
<p>🔑 <strong>**</strong>kwargs처럼 매개변수 이름 앞에 <strong>**</strong>을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.</p>
<p>예제)</p>
<pre><code>def print_kwargs(**kwargs) :
    print(kwargs)
print_kwargs(a=1)
print_kwargs(name=&#39;foo&#39;, age=3)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/4a39dfc2-fbcc-4071-988a-903c7f693d3a/image.png" alt=""></p>
<h1 id="함수의-결괏값은-언제나-하나이다">함수의 결괏값은 언제나 하나이다</h1>
<p>다음 예시를 보자.</p>
<pre><code>def add_and_mul(a, b) :
    return a+b, a*b

result = add_and_mul(3, 4)
print(result)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/372c2fc5-d8cd-40a5-b26f-d58feb3f378a/image.png" alt=""></p>
<p>결괏값은 a+b와 a<em>b 2개인데 결괏값을 받아들이는 변수는 result 하나만 쓰였으니 오류가 발생하지 않을까? 당연한 의문이다. 하지만 오류는 발생하지 않는다. 그 이유는 함수의 결괏값은 2개가 아니라 언제나 1개라는 데 있다. add_and_mul 함수의 결괏값 a+b와 a****</em>b는 튜플값 하나인 (a+b, a*b)로 돌려준다.</p>
<p>즉 결괏값으로 (7, 12)라는 튜플 값을 갖게 되는 것이다.</p>
<p>만약 이 하나의 튜플 값을 2개의 결괏값처럼 받고 싶다면 다음과 같이 함수를 호출하면 된다.</p>
<pre><code>result1, result2 = add_and_mul(3, 4)</code></pre><p>이렇게 호출하면 result1, result2 = (7, 12)가 되어 result1은 7이 되고 result2는 12가 된다.</p>
<p>또 다음과 같은 의문이 생길 수도 있다.</p>
<pre><code>def add_and_mul(a, b) :
    return a+b
    return a*b
result = add_and_mul(3, 4)
print(result)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/14ae1071-2584-4f7b-afb4-a8119fbe34a9/image.png" alt="">
위와 같이 return문을 2번 사용하면 2개의 결괏값을 돌려주지 않을까? 하지만 파이썬에서 위와 같은 함수는 참 어리석은 함수이다.</p>
<p>위에서 볼 수 있듯이 두 번째 return문인 return a*b는 실행되지 않았다. 따라서 이 함수는 다음과 완전히 동일하다.</p>
<pre><code>def add_and_mul(a, b) :
    return a+b</code></pre><p>💥 <strong>즉 함수는 return문을 만나는 순간 결괏값을 돌려준 다음 함수를 빠져나가게 된다.</strong></p>
<h3 id="return의-또-다른-쓰임새">return의 또 다른 쓰임새</h3>
<p>🔑 특별한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있다. 다음 예를 보자.</p>
<pre><code>def say_nick(nick) :
    if nick == &quot;바보&quot; :
        return
    print(&quot;나의 별명은 %s 입니다.&quot; %nick)

say_nick(&#39;야호&#39;)
say_nick(&#39;바보&#39;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/5da94f09-e4bb-4c88-a5ba-3b3c4d0b3c7a/image.png" alt="">
위 함수는 &#39;별명&#39;을 입력으로 전달받아 출력하는 함수이다. 이 함수 역시 반환 값(결괏값)은 없다.</p>
<p>만약에 입력값으로 &#39;바보&#39;라는 값이 들어오면 문자열을 출력하지 않고 함수를 즉시 빠져나간다.</p>
<p>이처럼 return으로 함수를 빠져나가는 방법은 실제 프로그래밍에서 자주 사용한다.</p>
<h1 id="매개변수에-초깃값-미리-설정하기">매개변수에 초깃값 미리 설정하기</h1>
<p>예시)</p>
<pre><code>def say_myself(name, old, man=True): 
    print(&quot;나의 이름은 %s 입니다.&quot; % name) 
    print(&quot;나이는 %d살입니다.&quot; % old) 
    if man: 
        print(&quot;남자입니다.&quot;)
    else: 
        print(&quot;여자입니다.&quot;)

say_myself(&quot;박응용&quot;, 27)
say_myself(&quot;박응용&quot;, 27, True)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/93e8cc5c-43b9-4a2f-a9ba-43b1bdecd3d0/image.png" alt=""></p>
<p>위 예시에서 2가지 방법은 모두 동일한 결과를 출력한다는것을 볼 수 있다.</p>
<p>하지만 함수의 매개변수에 초깃값을 설정할 때 주의할 것이 하나 있다. 만약 위에서 본 say_myself 함수를 다음과 같이 만들면 어떻게 될까?</p>
<pre><code>def say_myself(name, man=True, old): 
    print(&quot;나의 이름은 %s 입니다.&quot; % name) 
    print(&quot;나이는 %d살입니다.&quot; % old) 
    if man: 
        print(&quot;남자입니다.&quot;) 
    else: 
        print(&quot;여자입니다.&quot;)

say_myself(&quot;박응용&quot;, 27)</code></pre><p>이전 함수와 바뀐 부분은 초깃값을 설정한 매개변수의 위치이다. 결론을 미리 말하면 이것은 함수를 실행할 때 오류가 발생한다.</p>
<p>오류 메시지를 보면 다음과 같다.
SyntaxError: non-default argument follows default argument</p>
<p>위 오류 메시지는 초깃값을 설정해 놓은 매개변수 뒤에 초깃값을 설정해 놓지 않은 매개변수는 사용할 수 없다는 뜻이다. 즉 매개변수로 (name, old, man=True)는 되지만 (name, man=True, old)는 안 된다는 것이다. </p>
<p><strong>🔥 초기화시키고 싶은 매개변수를 항상 뒤쪽에 놓는 것을 잊지 말자.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[for문]]></title>
            <link>https://velog.io/@dla-tngus/for%EB%AC%B8</link>
            <guid>https://velog.io/@dla-tngus/for%EB%AC%B8</guid>
            <pubDate>Mon, 01 Feb 2021 06:45:15 GMT</pubDate>
            <description><![CDATA[<h1 id="for문의-기본-구조">for문의 기본 구조</h1>
<p>🔑 for문의 기본 구조는 다음과 같다</p>
<pre><code>for 변수 in 리스트(또는 튜플, 문자열) :
    수행할 문장1
    수행할 문장2
    ...</code></pre><p>리스트나 튜플, 문자열의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 &quot;수행할 문장1&quot;, &quot;수행할 문장2&quot; 등이 수행된다.</p>
<p>예시) &quot;총 5명의 학생이 시험을 보았는데 시험 점수가 60점이 넘으면 합격이고 그렇지 않으면 불합격이다. 합격인지 불합격인지 결과를 보여 주시오.&quot;</p>
<pre><code>marks = [90, 25, 67, 45, 80]

number = 0 
for mark in marks: 
    number = number +1 
    if mark &gt;= 60: 
        print(&quot;%d번 학생은 합격입니다.&quot; % number)
    else: 
        print(&quot;%d번 학생은 불합격입니다.&quot; % number)</code></pre><h1 id="for문과-continue">for문과 continue</h1>
<p>🔑 while문에서 살펴본 continue문을 for문에서도 사용할 수 있다. 즉 for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.</p>
<p>예제) 60점 이상인 사람에게는 축하 메시지를 보내고 나머지 사람에게는 아무 메시지도 전하지 않는 프로그램을 작성하시오.</p>
<pre><code>marks = [90, 25, 67, 45, 80]

number = 0 
for mark in marks: 
    number = number +1 
    if mark &lt; 60:
        continue 
    print(&quot;%d번 학생 축하합니다. 합격입니다. &quot; % number)</code></pre><p>점수가 60점 이하인 학생일 경우에는 mark &lt; 60이 참이 되어 continue문이 수행된다. 따라서 축하 메시지를 출력하는 부분인 print문을 수행하지 않고 for문의 처음으로 돌아가게 된다.</p>
<h1 id="for문과-함께-자주-사용하는-range-함수">for문과 함께 자주 사용하는 range 함수</h1>
<p>🔑 for문은 숫자 리스트를 자동으로 만들어 주는 range 함수와 함께 사용하는 경우가 많다. 시작 숫자와 끝 숫자를 지정하려면 range(시작 숫자, 끝 숫자) 형태를 사용하는데, 이때 끝 숫자는 포함되지 않는다.</p>
<pre><code>a = range(1, 11)
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/83e25af2-dd0b-4bec-a56b-ee324075fc3b/image.png" alt=""></p>
<h3 id="range-함수의-예시-살펴보기">range 함수의 예시 살펴보기</h3>
<p>for와 range 함수를 사용하면 1부터 10까지 더하는 것을 다음과 같이 쉽게 구현할 수 있다.</p>
<pre><code>add = 0
for i in range(1, 11) :
    add = add + i
print(add)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/065b6690-34aa-4133-ac33-200ad70f6028/image.png" alt="">
range(1, 11)은 숫자 1부터 10까지(1 이상 11 미만)의 숫자를 데이터로 갖는 객체이다. 따라서 위 예에서 i 변수에 리스트의 숫자가 1부터 10까지 하나씩 차례로 대입되면서 add = add + i 문장을 반복적으로 수행하고 add는 최종적으로 55가 된다.</p>
<p>💥 또한 우리가 앞에서 살본 &quot;60점 이상이면 합격&quot;이라는 문장을 출력하는 예제도 range 함수를 사용해서 바꿀 수 있다. 다음을 보자.</p>
<pre><code>marks = [90, 25, 67, 45, 80]
for number in range(len(marks)):
    if marks[number] &lt; 60: 
        continue
    print(&quot;%d번 학생 축하합니다. 합격입니다.&quot; % (number+1))</code></pre><p>len 함수는 리스트 안의 요소 개수를 돌려주는 함수이다. 따라서 len(marks)는 5가 될 것이고 range(len(marks))는 range(5)가 될 것이다. number 변수에는 차례로 0부터 4까지의 숫자가 대입될 것이고, marks[number]는 차례대로 90, 25, 67, 45, 80 값을 갖게 된다.</p>
<h1 id="리스트-내포-사용하기">리스트 내포 사용하기</h1>
<p>🔑 리스트 안에 for문을 포함하는 리스트 내포(List comprehension)를 사용하면 좀 더 편리하고 직관적인 프로그램을 만들 수 있다. 다음 예제를 보자.</p>
<pre><code>a = [1, 2, 3, 4]
result = []
for num in a :
    result.append(num*3)
print(result)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/aa02506b-a11c-4275-b5dd-26c73f9f742b/image.png" alt="">
위 예제는 a 리스트의 각 항목에 3을 곱한 결과를 result 리스트에 담는 예제이다.</p>
<p>이것을 리스트 내포를 사용하면 다음과 같이 간단히 해결할 수 있다.</p>
<pre><code>a = [1, 2, 3, 4]
result = [num * 3 for num in a]
print(result)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/3e105362-6276-4b36-8f87-e6f9620a59a8/image.png" alt="">
만약 [1,2,3,4] 중에서 짝수에만 3을 곱하여 담고 싶다면 다음과 같이 리스트 내포 안에 &quot;if 조건&quot;을 사용할 수 있다.</p>
<pre><code>a = [1, 2, 3, 4]
result = [num * 3 for num in a if num % 2 ==0]
print(result)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/61b595ae-538e-4638-8588-f6b6c59c7d7d/image.png" alt="">
리스트 내포의 일반 문법은 다음과 같다. &quot;if 조건&quot; 부분은 앞의 예제에서 볼 수 있듯이 생략할 수 있다.
⭐ [ 표현식 for 항목 in 반복가능객체 if 조건문 ] ⭐</p>
<p>조금 복잡하지만 for문을 2개 이상 사용하는 것도 가능하다. for문을 여러 개 사용할 때의 문법은 다음과 같다.
<img src="https://images.velog.io/images/dla-tngus/post/d7d1f6cc-5683-4bf2-ab36-619583b0a1c9/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[트리🎄(Tree)]]></title>
            <link>https://velog.io/@dla-tngus/%ED%8A%B8%EB%A6%ACTree</link>
            <guid>https://velog.io/@dla-tngus/%ED%8A%B8%EB%A6%ACTree</guid>
            <pubDate>Sun, 31 Jan 2021 08:47:41 GMT</pubDate>
            <description><![CDATA[<h1 id="트리란">트리란?</h1>
<p>▷ 트리는 일반적으로 대상 정보의 각 항목들을 계층적으로 연관되도록 구조화시키고자 할 때 사용하는 비선형 자료구조이다.</p>
<p>▶ 데이터 요소들의 단순한 나열이 아닌 부모-자식 관계의 계층적 구조로 표현이 된다. 트리는 그래프의 한 종류이며 사이클이 없다.</p>
<h1 id="트리와-관련된-용어">트리와 관련된 용어</h1>
<p><img src="https://images.velog.io/images/dla-tngus/post/c2f3eb98-c494-49c3-9f55-14cd80df4b93/image.png" alt=""></p>
<p><strong>▷ 루트 노드(root node) :</strong> 부모가 없는 노드, 트리는 하나의 루트 노드만을 가진다.</p>
<p><strong>▶ 노드(node) :</strong> 트리를 구성하고 있는 각 요소</p>
<p><strong>▷ 간선(edge) :</strong> 노드를 연결하는 선(link, branch 라고도 부름)</p>
<p><strong>▶ 형제(sibling) :</strong> 같은 부모를 가지는 노드</p>
<p><strong>▷ 노드의 레벨(level) :</strong> 트리의 특정 깊이를 가지는 노드의 집합</p>
<p><strong>▶ 노드의 차수(degree) :</strong> 하위 트리 개수 / 간선 수(degree) = 각 노드가 지닌 가지의 수</p>
<h1 id="트리의-종류">트리의 종류</h1>
<h3 id="이진-트리🎄🌲binary-tree">이진 트리🎄🌲(Binary Tree)</h3>
<p>⊙ 각 노드가 최대 두 개의 자식을 갖는 트리
⊙ 모든 트리가 이진 트리는 아니다.
⊙ 이진트리는 완전 이진 트리(Complete Binary Tree)와 포화 이진 트리(Perfect Binary Tree), 전 이진 트리(Full Binary Tree)라고 하는 특별한 트리 구조를 정의할 수 있다.
<img src="https://images.velog.io/images/dla-tngus/post/f47ca68f-db1b-4996-ad61-9553f6d1bacb/image.png" alt=""></p>
<h4 id="🎄-완전-이진-트리complete-binary-tree">🎄 완전 이진 트리(Complete Binary Tree)</h4>
<p><img src="https://images.velog.io/images/dla-tngus/post/12d3f28a-6a71-4e7f-84a0-3247a3a1988c/image.png" alt="">
⊙ 트리의 모든 높이에서 노드가 꽉 차 있는 이진 트리. 즉, 마지막 레벨을 제외하고 모든 레벨이 완전히 채워져 있다.
⊙ 마지막 레벨은 꽉 차 있지 않아도 되지만 노드가 왼쪽에서 오른쪽으로 채워져야 한다.</p>
<h4 id="🌲-전-이진-트리full-binary-tree-or-strictly-binary-tree">🌲 전 이진 트리(Full Binary Tree or Strictly Binary Tree)</h4>
<p><img src="https://images.velog.io/images/dla-tngus/post/1c1c0c81-d979-40cf-a33e-de25b3c96cb6/image.png" alt="">
⊙ 모든 노드가 0개 또는 2개의 자식 노드를 갖는 트리</p>
<h4 id="🌳-포화-이진-트리perfect-binary-tree">🌳 포화 이진 트리(Perfect Binary Tree)</h4>
<p><img src="https://images.velog.io/images/dla-tngus/post/34ac12c1-f63c-450e-a26a-5b64455fc4d7/image.png" alt="">
⊙ 모든 레벨에 노드가 차있는 상태로 최대 노드 수인 2^k-1개로 채워져 있는 트리
⊙ 전 이진 트리이면서 완전 이진 트리인 경우</p>
<h3 id="🔎-이진-트리-순회">🔎 이진 트리 순회</h3>
<p> <strong>a. 중위 순회(in-order traversal)</strong> : 왼쪽 가지 -&gt; 현재 노드(루트) -&gt; 오른쪽 가지</p>
<pre><code>def inorder(node) :
    if node.left != None :
        inorder(tree[node.left])
    print(node.item, end = &#39; &#39;)
    if node.right != None :
        inorder(tree[node.right])</code></pre><p> <strong>b. 전위 순회(pre-order traversal)</strong> : 현재 노드(루트) -&gt; 왼쪽 가지 -&gt; 오른쪽 가지</p>
<pre><code>def preorder(node) :
    print(node.item, end = &#39; &#39;)
    if node.left != None :
        inorder(tree[node.left])
    if node.right != None :
        inorder(tree[node.right])</code></pre><p><strong>c. 후위 순회(post-order traversal)</strong> : 왼쪽 가지 -&gt; 오른쪽 가지 -&gt; 현재 노드(루트)</p>
<pre><code>def postorder(node) :
    if node.left != None :
        inorder(tree[node.left])
    if node.right != None :
        inorder(tree[node.right])
    print(node.item, end = &#39; &#39;)</code></pre><h3 id="🔍-이진-탐색-트리binary-search-tree">🔍 이진 탐색 트리(Binary Search Tree)</h3>
<p>모든 노드가 자신의 왼쪽 서브트리에는 현재노드보다 작은 키값이, 오른쪽 서브트리에는 현재 노드보다 큰 값이 오는 규칙을 만족하는 이진트리이다.</p>
<p><strong>📌 모든 왼쪽 자식들 &lt;= n &lt; 모든 오른쪽 자식들</strong> (모든 노드 n에 대해서 반드시 참)</p>
<h1 id="힙heap">힙(heap)</h1>
<p>🔑 완전 이진 트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다.
여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다.</p>
<p>📍 트리의 마지막 단계에서 오른쪽 부분을 뺀 나머지 부분이 가득 채워져 있는 완전 이진 트리이다.</p>
<p><strong>최소 힙(min heap)</strong>
부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리
key(부모 노드) &lt;= key(자식 노드)</p>
<p><strong>최대 힙(max heap)</strong>
부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리
key(부모 노드) &gt;= key(자식 노드)</p>
<p><strong>MAX - Heapify</strong>
트리의 전체 모양은 complete binary tree이다. 왼쪽 부트리(subtree)는 그 자체로 heap이고, 오른쪽 부트리(subtree)도 그 자체로 heap일 때 유일하게 루트만이 heap property를 만족하지 않을 때 heap property를 만족하도록 만들어주는 것이다.
⭐ 방법 : 두 자식들 중 더 큰 쪽과 exchange 한다. 이걸 반복하면 된다.</p>
<h3 id="💥-heap-sort">💥 heap sort</h3>
<ol>
<li><p>주어진 데이터로 힙을 만든다</p>
</li>
<li><p>힙에서 최대값(루트)을 가장 마지막 값과 바꾼다</p>
</li>
<li><p>힙의 크기가 1 줄어든 것으로 간주한다. 즉, 가장 마지막 값은 힙의 일부가 아닌 것으로 간주한다</p>
</li>
<li><p>루트 노드에 대해서 Heapify(1)한다</p>
</li>
<li><p>2~4번을 반복한다</p>
</li>
</ol>
<p>🔥 <strong>완전 이진 트리, 이진 탐색 트리, heap</strong>의 정의를 정확히 알아두고 헷갈리지 않도록 하자! 🔥</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[while문]]></title>
            <link>https://velog.io/@dla-tngus/while%EB%AC%B8</link>
            <guid>https://velog.io/@dla-tngus/while%EB%AC%B8</guid>
            <pubDate>Sat, 30 Jan 2021 08:52:20 GMT</pubDate>
            <description><![CDATA[<h1 id="while문의-기본-구조">while문의 기본 구조</h1>
<p>🔑 반복해서 문장을 수행해야 할 경우 while문을 사용한다. 그래서 while문을 반복문이라고도 부른다.</p>
<p>▷ 다음은 while문의 기본 구조이다.</p>
<pre><code>while &lt;조건문&gt;:
    &lt;수행할 문장1&gt;
    &lt;수행할 문장2&gt;
    &lt;수행할 문장3&gt;
    ...</code></pre><p>▶ while문은 조건문이 참인 동안에 while문 아래의 문장이 반복해서 수행된다.</p>
<p>예제) &quot;열 번 찍어 안 넘어가는 나무 없다&quot;는 속담을 파이썬 프로그램으로 만들어라.</p>
<pre><code>treeHit = 0
while treeHit &lt; 10:
    treeHit = treeHit + 1
    print(&quot;나무를 %d번 찍었습니다.&quot; %treeHit)
    if treeHit == 10:
        print(&quot;나무 넘어갑니다.&quot;)</code></pre><h1 id="while문-강제로-빠져나가기">while문 강제로 빠져나가기</h1>
<p>🔑 while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행한다. 하지만 강제로 while문을 빠져나가고 싶을 때가 있다. 그럴때 사용하는 것이 바로 <strong>break문</strong>이다.</p>
<p>예제) 커피 자판기 만들어보기</p>
<pre><code>coffee = 10
while True:
    money = int(input(&quot;돈을 넣어 주세요: &quot;))
    if money == 300:
        print(&quot;커피를 줍니다.&quot;)
        coffee = coffee -1
    elif money &gt; 300:
        print(&quot;거스름돈 %d를 주고 커피를 줍니다.&quot; % (money -300))
        coffee = coffee -1
    else:
        print(&quot;돈을 다시 돌려주고 커피를 주지 않습니다.&quot;)
        print(&quot;남은 커피의 양은 %d개 입니다.&quot; % coffee)
    if coffee == 0:
        print(&quot;커피가 다 떨어졌습니다. 판매를 중지 합니다.&quot;)
        break</code></pre><h1 id="while문의-맨-처음으로-돌아가기">while문의 맨 처음으로 돌아가기</h1>
<p>🔑 while문 안의 문장을 수행할 때 입력 조건을 검사해서 조건에 맞지 않으면 while문을 빠져나간다. 그런데 프로그래밍을 하다 보면 while문을 빠져나가지 않고 while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶은 경우가 생기게 된다. 이때 사용하는 것이 바로 <strong>continue문</strong>이다.</p>
<p>▷ 1부터 10까지의 숫자 중에서 홀수만 출력하는 것을 while문을 사용해서 작성한다고 생각해보자. 어떤 방법이 좋을까?</p>
<pre><code>a = 0
while a &lt; 10:
    a = a + 1
    if a % 2 ==0: continue
    print(a)</code></pre><p>▶ 위 예는 1부터 10까지의 숫자 중 홀수만 출력하는 예이다. a가 10보다 작은 동안 a는 1만큼씩 계속 증가한다. if a % 2 == 0(a를 2로 나누었을 때 나머지가 0인 경우)이 참이 되는 경우는 a가 짝수일 때이다. 즉 a가 짝수이면 continue 문장을 수행한다. 이 continue문은 while문의 맨 처음(조건문: a&lt;10)으로 돌아가게 하는 명령어이다. 따라서 위 예에서 a가 짝수이면 print(a)는 수행되지 않을 것이다.</p>
<h1 id="무한-루프">무한 루프</h1>
<p>🔑 이번에는 무한 루프(Loop)에 대해 알아보자. 무한 루프란 무한히 반복한다는 의미이다. 우리가 사용하는 일반 프로그램 중에서 무한 루프 개념을 사용하지 않는 프로그램은 거의 없다. 그만큼 자주 사용한다는 뜻이다.</p>
<p>▷ 파이썬에서 무한 루프는 while문으로 구현할 수 있다. 다음은 무한 루프의 기본 형태이다.</p>
<pre><code>while True: 
    수행할 문장1 
    수행할 문장2
    ...</code></pre><p>▶ while문의 조건문이 True이므로 항상 참이 된다. 따라서 while문 안에 있는 문장들은 무한하게 수행될 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[if문]]></title>
            <link>https://velog.io/@dla-tngus/if%EB%AC%B8</link>
            <guid>https://velog.io/@dla-tngus/if%EB%AC%B8</guid>
            <pubDate>Sat, 30 Jan 2021 08:31:25 GMT</pubDate>
            <description><![CDATA[<h1 id="if문의-기본-구조">if문의 기본 구조</h1>
<p>🔑 다음은 if와 else를 사용한 조건문의 기본 구조이다.</p>
<pre><code>if 조건문 :
    수행할 문장1
    수행할 문장2
    ...
else :
    수행할 문장A
    수행할 문장B
    ...</code></pre><p>▶ 조건문을 테스트해서 참이면 if문 바로 다음 문장(if 블록)들을 수행하고, 조건문이 거짓이면 else문 다음 문장(else 블록)들을 수행하게 된다. 그러므로 else문은 if문 없이 독립적으로 사용할 수 없다.</p>
<h3 id="🎈-들여쓰기">🎈 들여쓰기</h3>
<p>▷ if문을 만들 때는 if 조건문: 바로 아래 문장부터 if문에 속하는 모든 문장에 들여쓰기(indentation)를 해주어야 한다. 들여쓰기를 하지 않을 경우 오류가 발생한다.</p>
<pre><code>if 조건문 : 
    수행할 문장1
    수행할 문장2
    수행할 문장3</code></pre><h3 id="⚽-콜론">⚽ 콜론</h3>
<p>▶ if 조건문 뒤에는 반드시 콜론(:)이 붙는다. 어떤 특별한 의미가 있다기보다는 파이썬의 문법 구조이다. while이나 for, def, class문에도 역시 문장의 끝에 콜론(:)이 항상 들어간다. 초보자들은 이 콜론(:)을 빠뜨리는 경우가 많으니 특히 주의하자.</p>
<h1 id="조건문이란-무엇인가">조건문이란 무엇인가?</h1>
<p>🔑 if 조건문에서 &#39;조건문&#39;이란 참과 거짓을 판단하는 문장을 말한다.</p>
<p>▷ 다음의 예제에서 조건문은 money가 된다.</p>
<pre><code>money = True
if money :</code></pre><p>▶ money는 True이기 때문에 조건이 참이 되어 if문 다음 문장을 수행한다.</p>
<h3 id="🔴-비교연산자">🔴 비교연산자</h3>
<p><img src="https://images.velog.io/images/dla-tngus/post/b9a9b650-0c4d-4c6c-a3d4-4d13b9cca082/image.png" alt="">
예제)</p>
<pre><code>money = 2000
if money &gt;= 3000:
    print(&quot;택시를 타고 가라&quot;)
else:
    print(&quot;걸어가라&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/e8ec88bd-0cf8-4ed8-92d1-8eadc2b4e228/image.png" alt="">
▷ money &gt;= 3000 조건문이 거짓이 되기 때문에 else문 다음 문장을 수행하게 된다.</p>
<h3 id="🟠-and-or-not">🟠 and, or, not</h3>
<p>🔑 조건을 판단하기 위해 사용하는 다른 연산자로는 and, or, not이 있다. 각각의 연산자는 다음처럼 동작한다.</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/f3800bf8-ecc3-4010-99e8-935624c0cac6/image.png" alt=""></p>
<p>예제 ) &quot;돈이 3000원 이상 있거나 카드가 있다면 택시를 타고 그렇지 않으면 걸어 가라.&quot;</p>
<pre><code>money = 2000
card = True
if money &gt;= 3000 or card:
    print(&quot;택시를 타고 가라&quot;)
else:
    print(&quot;걸어가라&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/7e442a57-eec0-4331-b584-08cdafddd816/image.png" alt="">
▶ money는 2000이지만 card가 True이기 때문에 money &gt;= 3000 or card 조건문이 참이 된다. 따라서 if문 다음 ‘택시를 타고 가라’ 문장이 출력된다.</p>
<h3 id="🟡-x-in-s-x-not-in-s">🟡 x in s, x not in s</h3>
<p>🔑 더 나아가 파이썬은 다른 프로그래밍 언어에서 쉽게 볼 수 없는 재미있는 조건문을 제공한다.</p>
<p>▷ 바로 다음과 같은 것들이다.</p>
<p><img src="https://images.velog.io/images/dla-tngus/post/92ecd3c6-3a43-48ce-aa26-289ff1557b8d/image.png" alt=""></p>
<p>▶ 영어 단어 in의 뜻이 &quot;~안에&quot;라는 것을 생각해 보면 다음 예가 쉽게 이해될 것이다.</p>
<p>예제) &quot;만약 주머니에 돈이 있으면 택시를 타고, 없으면 걸어 가라.&quot;</p>
<pre><code>pocket = [&#39;paper&#39;, &#39;cellphone&#39;, &#39;money&#39;]
if &#39;money&#39; in pocket:
    print(&quot;택시를 타고 가라&quot;)
else:
    print(&quot;걸어가라&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/885f72f2-518e-4d36-8952-e0f00b712b9c/image.png" alt="">
▷ [&#39;paper&#39;, &#39;cellphone&#39;, &#39;money&#39;] 리스트 안에 &#39;money&#39;가 있으므로 &#39;money&#39; in pocket은 참이 된다. 따라서 if문 다음 문장이 수행된다.</p>
<h3 id="🟢-조건문에서-아무-일도-하지-않게-설정하기">🟢 조건문에서 아무 일도 하지 않게 설정하기</h3>
<p>🔑 가끔 조건문의 참, 거짓에 따라 실행할 행동을 정의할 때, 아무런 일도 하지 않도록 설정하고 싶을 때가 있다.</p>
<p>예제) &quot;주머니에 돈이 있으면 가만히 있고 주머니에 돈이 없으면 카드를 꺼내라.&quot;</p>
<pre><code>pocket = [&#39;paper&#39;, &#39;cellphone&#39;, &#39;money&#39;]
if &#39;money&#39; in pocket:
    pass
else:
    print(&quot;카드를 꺼내라&quot;)</code></pre><p>▶ pocket 리스트 안에 money 문자열이 있기 때문에 if문 다음 문장인 pass가 수행되고 아무 결과값도 보여 주지 않는다.</p>
<h1 id="다양한-조건을-판단하는-elif">다양한 조건을 판단하는 elif</h1>
<p>🔑 if와 else만으로는 다양한 조건을 판단하기 어렵다. 이러한 문제를 해결하기 위해 파이썬에서는 다중 조건 판단을 가능하게 하는 elif를 사용한다.</p>
<pre><code>pocket = [&#39;paper&#39;, &#39;cellphone&#39;]
card = True
if &#39;money&#39; in pocket:
    print(&quot;택시를 타고가라&quot;)
elif card:
    print(&quot;택시를 타고가라&quot;)
else:
    print(&quot;걸어가라&quot;)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/1bb9e797-7404-4ab2-8a56-d8cf2779b95b/image.png" alt=""></p>
<p>▷ elif는 개수에 제한 없이 사용할 수 있다.</p>
<h3 id="⭐-if문-한-줄로-작성하기">⭐ if문 한 줄로 작성하기</h3>
<p>🔑 수행할 문장이 한 줄이 경우 조금 더 간략하게 코드를 작성하는 방법이 있다. if문 다음 수행할 문장을 콜론(:) 뒤에 바로 적어주는 것이다. else문 역시 마찬가지이다.</p>
<pre><code>pocket = [&#39;paper&#39;, &#39;money&#39;, &#39;cellphone&#39;]
if &#39;money&#39; in pocket: pass
else: print(&quot;카드를 꺼내라&quot;)</code></pre><h1 id="조건부-표현식삼항-연산자-조건-연산자">조건부 표현식(삼항 연산자, 조건 연산자)</h1>
<p>🔑 다음과 같은 코드를 보자.</p>
<pre><code>if score &gt;= 60:
    message = &quot;success&quot;
else:
    message = &quot;failure&quot;</code></pre><p>▶ 위 코드는 score가 60 이상일 경우 message에 문자열 &quot;success&quot;를, 아닐 경우에는 &quot;failure&quot;를 대입하는 코드이다.</p>
<p>▷ 파이썬의 조건부 표현식(conditional expression)을 사용하면 위 코드를 다음과 같이 간단히 표현할 수 있다.</p>
<pre><code>message = &quot;success&quot; if score &gt;= 60 else &quot;failure&quot;</code></pre><p>📌 조건부 표현식은 다음과 같이 정의한다.</p>
<p>*<em>⭐ 조건문이 참인 경우 if 조건문 else 조건문이 거짓인 경우 ⭐
*</em>
조건부 표현식은 가독성에 유리하고 한 줄로 작성할 수 있어 활용성이 좋다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[불 자료형]]></title>
            <link>https://velog.io/@dla-tngus/%EB%B6%88-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@dla-tngus/%EB%B6%88-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Fri, 29 Jan 2021 09:22:58 GMT</pubDate>
            <description><![CDATA[<h1 id="불-자료형이란">불 자료형이란?</h1>
<p>🔑 불(bool) 자료형이란 참(True)과 거짓(False)을 나타내는 자료형이다. 불 자료형은 다음 2가지 값만을 가질 수 있다.</p>
<p>🤍 True - 참
🖤 False - 거짓</p>
<p>※ True나 False는 파이썬의 예약어로 true, false와 같이 사용하지 말고 첫 문자를 항상 대문자로 사용해야 한다.</p>
<pre><code>a = True
b = False</code></pre><p>✔ 위의 코드는 따옴표로 감싸지 않은 문자열을 변수에 지정해서 오류가 발생할 것 같지만 잘 실행된다. </p>
<p>▼ type 함수를 변수 a와 b에 사용하면 두 변수의 자료형이 bool로 지정된 것을 확인할 수 있다.</p>
<pre><code>a = True
b = False
print(type(a))
print(type(b))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/635d5cac-11ad-4474-a404-b09c64730ddf/image.png" alt=""></p>
<h1 id="자료형의-참과-거짓">자료형의 참과 거짓</h1>
<p>🔑 자료형에 참과 거짓이 있다? 조금 이상하게 들리겠지만 참과 거짓은 분명히 있다. 이는 매우 중요한 특징이며 실제로도 자주 쓰인다.</p>
<p>💖 자료형의 참과 거짓을 구분하는 기준은 다음과 같다.
<img src="https://images.velog.io/images/dla-tngus/post/3cdb3c67-66ce-4cf5-96c1-9009a41318b9/image.png" alt="">
💨 문자열, 리스트, 튜플, 딕셔너리 등의 값이 비어 있으면(&quot; &quot;, [ ], ( ), { }) 거짓이 된다. 당연히 비어있지 않으면 참이 된다. 숫자에서는 그 값이 0일 때 거짓이 된다.</p>
<p>▼ 다음 예를 보고 참과 거짓이 프로그램에서 어떻게 쓰이는지 간단히 알아보자.</p>
<pre><code>a = [1, 2, 3, 4]
while a:
    print(a.pop())
    ...</code></pre><p>while문은 조건문이 참인 동안 조건문 안에 있는 문장을 반복해서 수행한다. 즉 위 예를 보면 a가 참인 경우에 a.pop( )을 계속 실행하라는 의미이다. a.pop( ) 함수는 리스트 a의 마지막 요소를 끄집어내는 함수이므로 리스트 안에 요소가 존재하는 한(a가 참인 동안) 마지막 요소를 계속해서 끄집어낼 것이다. </p>
<p>결국 더 이상 끄집어낼 것이 없으면 a가 빈 리스트([ ])가 되어 거짓이 된다. 따라서 while문에서 조건이 거짓이 되므로 중지된다. 위에서 본 예는 파이썬 프로그래밍에서 매우 자주 사용하는 기법 중 하나이다.</p>
<h1 id="불-연산">불 연산</h1>
<p>🔑 자료형에 참과 거짓이 있음을 이미 알아보았다. <strong>bool 내장 함수</strong>를 사용하면 자료형의 참과 거짓을 식별할 수 있다.</p>
<pre><code>print(bool(&#39;python&#39;))
print(bool(&#39;&#39;))
print(bool([1,2,3]))
print(bool([]))
print(bool(0))
print(bool(3))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/45dc0123-8d71-466f-aa24-5f3bc6941188/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[집합 자료형]]></title>
            <link>https://velog.io/@dla-tngus/%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@dla-tngus/%EC%A7%91%ED%95%A9-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Fri, 29 Jan 2021 08:53:56 GMT</pubDate>
            <description><![CDATA[<h1 id="집합-자료형은-어떻게-만들까">집합 자료형은 어떻게 만들까?</h1>
<p>🔑 집합(set)은 파이썬 2.3부터 지원하기 시작한 자료형으로, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형이다.</p>
<p>📌 집합 자료형은 다음과 같이 set 키워드를 사용해 만들 수 있다.</p>
<pre><code>s1 = set([1, 2, 3])
print(s1)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/8e32f75a-49f3-47f4-887e-759acdf8047f/image.png" alt="">
📣 위와 같이 set()의 괄호 안에 리스트를 입력하여 만들거나 다음과 같이 문자열을 입력하여 만들 수도 있다.</p>
<pre><code>s2 = set(&quot;Hello&quot;)
print(s2)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/920a0099-3db4-433c-b773-af02be08d3ba/image.png" alt="">
❗ set(&quot;Hello&quot;)의 결과가 이상한 이유는 아래에 설명할 집합 자료형의 특징 때문이다.</p>
<p>※ 비어 있는 집합 자료형은 s = set()로 만들수 있다.</p>
<h1 id="집합-자료형의-특징">집합 자료형의 특징</h1>
<p>🔑 집합 자료형에는 다음과 같은 2가지 큰 특징이 있다.
📍 중복을 허용하지 않는다.
📍📍 순서가 없다(Unordered).</p>
<p>🔥 리스트나 튜플은 순서가 있기(ordered) 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있지만 set 자료형은 순서가 없기(unordered) 때문에 인덱싱으로 값을 얻을 수 없다.</p>
<p>📣 만약 set 자료형에 저장된 값을 인덱싱으로 접근하려면 다음과 같이 리스트나 튜플로 변환한후 해야 한다.</p>
<pre><code>s1 = set([1, 2, 3])
l1 = list(s1)
print(l1)
print(l1[0])

t1 = tuple(s1)
print(t1)
print(t1[0])</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/f626d0dc-6b26-4845-b93b-7b493683bf2a/image.png" alt="">
※ 중복을 허용하지 않는 set의 특징은 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용하기도 한다.</p>
<h1 id="교집합-합집합-차집합-구하기">교집합, 합집합, 차집합 구하기</h1>
<p>🔑 set 자료형을 정말 유용하게 사용하는 경우는 교집합, 합집합, 차집합을 구할 때이다.</p>
<h3 id="🔴-교집합">🔴 교집합</h3>
<p>s1과 s2의 교집합을 구해 보자.</p>
<pre><code>s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1 &amp; s2)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/00c2d389-18bb-4a69-952e-f3a7723336c4/image.png" alt="">
🌞 &quot;&amp;&quot; 기호를 이용하면 교집합을 간단히 구할 수 있다.</p>
<p>또는 다음과 같이 intersection 함수를 사용해도 동일한 결과를 돌려준다.</p>
<pre><code>s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1.intersection(s2))
※ s2.intersection(s1)을 사용해도 결과는 같다.</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/8542c861-20d1-47db-a072-400f62dc3041/image.png" alt=""></p>
<h3 id="🟠-합집합">🟠 합집합</h3>
<p>s1과 s2의 합집합을 구해 보자.</p>
<pre><code>s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1 | s2)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/c2c8bb86-2d5d-43d2-85d3-9d1a626ece51/image.png" alt="">
🌞 &quot;|&quot; 기호를 이용하면 합집합을 간단히 구할 수 있다.</p>
<p>또는 union 함수를 사용하면 된다. 교집합에서 사용한 intersection 함수와 마찬가지로 s2.union(s1)을 사용해도 동일한 결과를 돌려준다.</p>
<pre><code>s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1.union(s2))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/ad1fa7ef-2fe7-4dd8-abb1-705bb6a8c31b/image.png" alt=""></p>
<h3 id="🟡-차집합">🟡 차집합</h3>
<p>s1과 s2의 차집합을 구해 보자.</p>
<pre><code>s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1-s2)
print(s2-s1)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/e84cdc93-30dd-43d1-86f6-677b5cf67474/image.png" alt="">
🌞 &quot;-&quot; 기호를 이용하면 차집합을 간단히 구할 수 있다.</p>
<pre><code>s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
print(s1.difference(s2))
print(s2.difference(s1))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/6bbdd1a6-01f4-414a-8589-689751572956/image.png" alt="">
difference 함수를 사용해도 차집합을 구할 수 있다.</p>
<h1 id="집합-자료형-관련-함수들">집합 자료형 관련 함수들</h1>
<h3 id="🟢-값-1개-추가하기add">🟢 값 1개 추가하기(add)</h3>
<p>이미 만들어진 set 자료형에 값을 추가할 수 있다. 1개의 값만 추가(add)할 경우에는 다음과 같이 한다.</p>
<pre><code>s1 = set([1, 2, 3])
s1.add(4)
print(s1)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/c6588e89-d326-4d4d-91f9-3aa882aae30c/image.png" alt=""></p>
<h3 id="🔵-값-여러-개-추가하기update">🔵 값 여러 개 추가하기(update)</h3>
<p>여러 개의 값을 한꺼번에 추가(update)할 때는 다음과 같이 하면 된다.</p>
<pre><code>s1 = set([1, 2, 3])
s1.update([4, 5, 6])
print(s1)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/60550012-cf32-461c-8e4d-8445ac632615/image.png" alt=""></p>
<h3 id="🟣-특정-값-제거하기remove">🟣 특정 값 제거하기(remove)</h3>
<p>특정 값을 제거하고 싶을 때는 다음과 같이 하면 된다.</p>
<pre><code>s1 = set([1, 2, 3])
s1.remove(2)
print(s1)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/fbd071e4-37cf-4cf3-ba1a-d8cacf89e47f/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS 개념정리 1]]></title>
            <link>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-1</link>
            <guid>https://velog.io/@dla-tngus/CSS-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-1</guid>
            <pubDate>Fri, 29 Jan 2021 07:50:21 GMT</pubDate>
            <description><![CDATA[<h1 id="csscascading-style-sheet-기본형태">CSS(Cascading Style Sheet) 기본형태</h1>
<p>🔴 selector : 선택자
🟠 property : 속성
🟡 value : 값</p>
<p>❗ &#39;;&#39; 세미콜론 빼먹지 않게 항상 주의</p>
<pre><code>selector{
    property : value;</code></pre><p>📌 대게 아래와 같은 방법으로 HTML에 CSS를 적용한다</p>
<pre><code>&lt;link rel = &quot;stylesheet&quot; href = &quot;style.css&quot;/&gt;</code></pre><h1 id="box-model">Box Model</h1>
<p><img src="https://images.velog.io/images/dla-tngus/post/6999c1d0-a487-4148-a02a-f0e18f545f8c/image.png" alt="">
🔴 Content : 가로는 width, 세로는 height</p>
<p>🟠 Padding : 안쪽 여백, 즉 content와 border 사이의 공간을 나타낸다</p>
<p>🟡 Border : 테두리를 나타내는 border</p>
<p>✔ border : 1px solid #000
✔ border : 굵기 스타일 색상 - 순서무관</p>
<p>-&gt; 테두리를 쓰고 싶지 않을 때 - border : none 이라고 적어준다.
-&gt; 테두리를 둥글게 할 때 - border-radius : 4px or border-radius : 50%</p>
<p>🟢 Margin : 바깥 여백, 즉 요소와 요소 사이의 간격을 나타낸다</p>
<p>✔ 속기형(shorthand) - 빠르게 쓰는법 : padding과 margin의 값을 정할 때 top -&gt; right -&gt; bottom -&gt; left 순으로(시계방향으로) 값이 설정 되게 된다.</p>
<p>예시)</p>
<pre><code>
.box{
    width : 500px;
    height : 300px;
    padding : 20px 0;
    border : 1px solid #212121;
    margin-top : 30px;
    }</code></pre><h1 id="box-sizing">Box Sizing</h1>
<p>📌 html에서의 class 이름이 css에서 선택자 이름으로 쓰인다.</p>
<pre><code>// HTML
&lt;div class = &quot;box&quot;&gt;
    Hello CSS
&lt;/div&gt;</code></pre><pre><code>//CSS
.box{
    width : ~ ;
    ~;
    }</code></pre><p>🔥 보통 css 코딩을 시작할 때 우리의 상식에 맞게 Box를 만들기 위해 아래와 같은 코드를 깔아두고 코딩을 시작한다.</p>
<pre><code>// *은 전체선택자를 의미한다.
*{
    box-sizing : border-box;
 }</code></pre><h1 id="box">BOX</h1>
<p>🤍 Box-type에는 Block, Inline, Inline Block, Flex가 있다.</p>
<p>🖤 Box-type에는 여러 종류가 있고 종류마다 동작 방식이 다르므로 정확하게 알아두어야 한다.</p>
<h1 id="block">Block</h1>
<p>🔑 Block의 특징</p>
<p>🔴 Block = 길막</p>
<p>🟠 Block 타입의 요소로 따로 width를 선언하지 않은 경우 : width = 부모의 content-box의 100%</p>
<p>🟡 width를 선언한 경우 : 남은 공간은 margin으로 자동 채움</p>
<p>🟢 따로 부모의 height를 선언하지 않은 경우 : 자식 요소의 height의 합 = 부모의 height</p>
<p>🔵 Box-model의 모든 요소를 다 사용할 수 있다</p>
<p>🟣 margin : 0 auto; // 가운데 정렬</p>
<h1 id="inline">Inline</h1>
<p>🔑 Inline의 특징</p>
<p>🔴 Inline = 흐름</p>
<p>🟡 Box-model의 요소중 일부는 사용이 불가능하다</p>
<p>🟢 사용불가한 요소 : width, height, padding-top, padding-bottom, border-top, border-bottom, margin-top, margin-bottom</p>
<h1 id="inline---block">Inline - Block</h1>
<p>🔑 Inline과 Block의 🍲짬뽕 콜라보!</p>
<p>🔥 약간 Inline의 단점을 보완한 친구랄까?? 그래서 Inline에서 사용불가한 요소들을 사용할 수 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[딕셔너리 자료형]]></title>
            <link>https://velog.io/@dla-tngus/%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@dla-tngus/%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Fri, 29 Jan 2021 06:01:59 GMT</pubDate>
            <description><![CDATA[<h1 id="딕셔너리란">딕셔너리란?</h1>
<p>🔑 딕셔너리는 Key와 Value를 한 쌍으로 갖는 자료형이다. 예를 들어 Key가 &quot;baseball&quot;이라면 Value는 &quot;야구&quot;가 될 것이다.</p>
<p>🔥 딕셔너리는 리스트나 튜플처럼 순차적으로 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다.
baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것이다.</p>
<h1 id="딕셔너리는-어떻게-만들까">딕셔너리는 어떻게 만들까?</h1>
<p>🔴다음은 기본 딕셔너리의 모습이다.</p>
<pre><code>{Key1:Value1, Key2:Value2, Key3:Value3, ...}</code></pre><p>♤ Key와 Value의 쌍 여러 개가 {}로 둘러싸여 있다. 각각의 요소는 Key : Value 형태로 이루어져 있고 쉼표(,)로 구분되어 있다.
♠ Key에는 변하지 않는 값을 사용하고, Value에는 변하는 값과 변하지 않는 값 모두 사용할 수 있다.</p>
<p>🟠 딕셔너리의 예</p>
<pre><code>dic = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}</code></pre><p>🟡 다음 예는 Key로 정수 값 1, Value로 문자열 &#39;hi&#39;를 사용한 예이다.</p>
<pre><code>a = {1: &#39;hi&#39;}</code></pre><p>🟢 또한 다음 예처럼 Value에 리스트도 넣을 수 있다.</p>
<pre><code>a = {&#39;a&#39; : [1, 2, 3]}</code></pre><h1 id="딕셔너리-쌍-추가-삭제하기">딕셔너리 쌍 추가, 삭제하기</h1>
<h3 id="🔴-딕셔너리-쌍-추가하기">🔴 딕셔너리 쌍 추가하기</h3>
<pre><code>a = {1: &#39;a&#39;}
a[2] = &#39;b&#39;
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/9ee8252f-1ca0-4486-9df8-d9e021f07973/image.png" alt="">
{1: &#39;a&#39;} 딕셔너리에 a[2] = &#39;b&#39;와 같이 입력하면 딕셔너리 a에 Key와 Value가 각각 2와 &#39;b&#39;인 2:&#39;b&#39;라는 딕셔너리 쌍이 추가된다.</p>
<h3 id="🟠-딕셔너리-요소-삭제하기">🟠 딕셔너리 요소 삭제하기</h3>
<pre><code>a = {1: &#39;a&#39;, 2:&#39;b&#39;, &#39;name&#39;:&#39;pey&#39;, 3:[1, 2, 3]}
del a[1]
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/c122df85-907e-448b-b327-5af1a04c9ae9/image.png" alt="">
del 함수를 사용해서 del a[key]처럼 입력하면 지정한 Key에 해당하는 {key:value}쌍이 삭제된다.</p>
<h1 id="딕셔너리를-사용하는-방법">딕셔너리를 사용하는 방법</h1>
<h3 id="🔴-딕셔너리에서-key-사용해-value-얻기">🔴 딕셔너리에서 Key 사용해 Value 얻기</h3>
<pre><code>a = {&#39;pey&#39;: 10, &#39;julliet&#39;: 99, 1:&#39;a&#39;, 2:&#39;b&#39;}
print(a[&#39;pey&#39;])
print(a[&#39;julliet&#39;])
print(a[1])
print(a[2])</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/b702ee52-48ab-42c4-af41-64279747a875/image.png" alt="">
리스트나 튜플, 문자열은 요솟값을 얻고자 할 때 인덱싱이나 슬라이싱 기법 중 하나를 사용했다. 하지만 딕셔너리는 단 한 가지 방법뿐이다. 바로 Key를 사용해서 Value를 구하는 방법이다. 
위 예에서 &#39;pey&#39;라는 Key의 Value를 얻기 위해 a[&#39;pey&#39;]를 사용한 것처럼 어떤 Key의 Value를 얻기 위해서는 <strong>딕셔너리변수이름[Key]</strong>를 사용한다.</p>
<h3 id="🟠-딕셔너리-만들-때-주의할-사항">🟠 딕셔너리 만들 때 주의할 사항</h3>
<p>🌝 먼저 딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점을 주의해야 한다.</p>
<p>🌞 또 한 가지 주의해야 할 사항은 Key에 리스트는 쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key로 쓸 수 있느냐 없느냐는 Key가 변하는 값인지 변하지 않는 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 
따라서 <strong>딕셔너리의 Key 값으로 리스트를 사용할 수 없음</strong>은 당연하다. 단 Value에는 변하는 값이든 변하지 않는 값이든 상관없이 아무 값이나 넣을 수 있다.</p>
<h1 id="딕셔너리-관련-함수들">딕셔너리 관련 함수들</h1>
<h3 id="🔴-key-리스트-만들기keys">🔴 Key 리스트 만들기(keys)</h3>
<p>▷ a.keys()는 딕셔너리의 a의 key만을 모아서 dict_keys 객체를 돌려준다.</p>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(a.keys())</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/14fe229a-6076-4115-97c4-879a29a3e514/image.png" alt="">
▶ dict_keys 객체를 리스트로 변환하려면 다음과 같이 하면 된다.</p>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(list(a.keys()))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/9616a07d-10ab-452b-adea-1fc0150cf84e/image.png" alt=""></p>
<h3 id="🟠-value-리스트-만들기values">🟠 Value 리스트 만들기(values)</h3>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(a.values())</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/eebd1f15-c53d-4e01-bb47-b1ab63de283e/image.png" alt="">
key를 얻는 것과 마찬가지 방법으로 Value만 얻고 싶다면 values 함수를 사용하면 된다. values 함수를 호출하면 dict_values 객체를 돌려준다.</p>
<h3 id="🟡-key-value-쌍-얻기items">🟡 Key, Value 쌍 얻기(items)</h3>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(a.items())</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/f9b80745-47bf-4a5c-8c72-b50cbcc82e40/image.png" alt="">
items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려준다. dict_values 객체와 dict_items 객체 역시 dict_keys 객체와 마찬가지로 리스트를 사용하는 것과 동일하게 사용할 수 있다.</p>
<h3 id="🟢-keyvalue-쌍-모두-지우기clear">🟢 Key:Value 쌍 모두 지우기(clear)</h3>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
a.clear()
print(a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/25b113e5-78ae-4eaa-b44c-c38b32002a91/image.png" alt="">
clear 함수는 딕셔너리 안의 모든 요소를 삭제한다. 빈 리스트를[], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현한다.</p>
<h3 id="🔵-key로-value얻기get">🔵 Key로 Value얻기(get)</h3>
<p>📌 get(x) 함수는 x라는 Key에 대응되는 Value를 돌려준다. 앞에서 살펴보았듯이 a.get(&#39;name&#39;)은 a[&#39;name&#39;]을 사용했을 때와 동일한 결괏값을 돌려받는다.
다만 존재하지 않는 키로 값을 가져오려고 할 경우 a[&#39;name&#39;]은 Key 오류를 발생시키고 a.get(&#39;name&#39;)은 None을 돌려준다는 차이가 있다.</p>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(a.get(&#39;name&#39;))
print(a.get(&#39;phone&#39;))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/b90aced4-94a0-4c38-a7c0-a4b24cca0837/image.png" alt="">
❗ 또한, 딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, &#39;디폴트 값&#39;)을 사용하면 편리하다.</p>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(a.get(&#39;foo&#39;,&#39;bar&#39;))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/3d1804ba-5d74-41d0-a016-7aac861396a8/image.png" alt="">
🔑 a 딕셔너리에는 &#39;foo&#39;에 해당하는 값이 없다. 따라서 디폴트 값인 &#39;bar&#39;를 돌려준다.</p>
<h3 id="🟣-해당-key가-딕셔너리-안에-있는지-조사하기in">🟣 해당 Key가 딕셔너리 안에 있는지 조사하기(in)</h3>
<pre><code>a = {&#39;name&#39;:&#39;pey&#39;, &#39;phone&#39;:&#39;01234567&#39;, &#39;birth&#39;:&#39;1224&#39;}
print(&#39;name&#39; in a)
print(&#39;email&#39; in a)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/0bb89b49-145b-4415-9ade-49f93cd237c6/image.png" alt="">
&#39;name&#39; 문자열은 a 딕셔너리의 Key 중 하나이다. 따라서 &#39;name&#39; in a를 호출하면 참(True)을 돌려준다. 반대로 &#39;email&#39;은 a 딕셔너리 안에 존재하지 않는 Key이므로 거짓(False)을 돌려준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[튜플 자료형]]></title>
            <link>https://velog.io/@dla-tngus/%ED%8A%9C%ED%94%8C-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@dla-tngus/%ED%8A%9C%ED%94%8C-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Thu, 28 Jan 2021 07:15:04 GMT</pubDate>
            <description><![CDATA[<h1 id="튜플은-어떻게-만들까">튜플은 어떻게 만들까?</h1>
<p>튜플(tuple)은 몇 가지 점을 제외하곤 리스트와 거의 비슷하며 리스트와 다른 점은 다음과 같다.
⏺ 리스트는 []으로 둘러싸지만 튜플은 ()으로 둘러싼다.
⏺ 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.</p>
<pre><code>t1 = ()
t2 = (1,)
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = (&#39;a&#39;, &#39;b&#39;, (&#39;ab&#39;, &#39;cd&#39;))</code></pre><p>튜플은 리스트와 모습은 거의 비슷하지만 튜플에서는 리스트와 다른 2가지 차이점을 찾아볼 수 있다. t2 = (1,)처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를 반드시 붙여야 한다는 것과 t4 = 1, 2, 3처럼 괄호()를 생략해도 무방하다는 점이다.</p>
<p>튜플과 리스트의 가장 큰 차이는 값을 변화시킬수 있는가 여부이다. 즉 리스트의 항목 값은 변화가 가능하고 튜플의 항목 값은 변화가 불가능하다. 튜플은 요소의 삭제나 변경이 불가능하다.</p>
<h1 id="튜플-인덱싱과-슬라이싱--연산">튜플 인덱싱과 슬라이싱 &amp; 연산</h1>
<h3 id="🧡-인덱싱하기">🧡 인덱싱하기</h3>
<pre><code>t1 = (1, 2, &#39;a&#39;, &#39;b&#39;)
print(t1[0])
print(t1[3])</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/3004edc7-cca8-48e5-80b6-3d642b877587/image.png" alt="">
문자열, 리스트와 마찬가지로 t1[0], t1[3]처럼 인덱싱이 가능하다.</p>
<h3 id="💛-슬라이싱하기">💛 슬라이싱하기</h3>
<pre><code>t1 = (1, 2, &#39;a&#39;, &#39;b&#39;)
print(t1[1:])</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/1d20df6a-42d1-4d5d-95ad-a28aabf19461/image.png" alt="">
t1[1]부터 튜플의 마지막 요소까지 슬라이싱하는 예이다.</p>
<h3 id="💚-튜플-더하기">💚 튜플 더하기</h3>
<pre><code>t1 = (1, 2, &#39;a&#39;, &#39;b&#39;)
t2 = (3, 4)
print(t1 + t2)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/27e9f7cb-1835-4bd7-a22e-4721a189a00b/image.png" alt=""></p>
<h3 id="💙-튜플-곱하기">💙 튜플 곱하기</h3>
<pre><code>t2 = (3, 4)
print(t2*3)</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/9c5b4f42-d992-4034-bb6d-9e1418b91728/image.png" alt=""></p>
<h3 id="💜-튜플-길이-구하기">💜 튜플 길이 구하기</h3>
<pre><code>t1 = (1, 2, &#39;a&#39;, &#39;b&#39;)
print(len(t1))</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/be369589-ceff-4497-9113-8134db32e49c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스택과 큐 연습문제]]></title>
            <link>https://velog.io/@dla-tngus/%EC%8A%A4%ED%83%9D%EA%B3%BC-%ED%81%90-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@dla-tngus/%EC%8A%A4%ED%83%9D%EA%B3%BC-%ED%81%90-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Wed, 27 Jan 2021 09:59:52 GMT</pubDate>
            <description><![CDATA[<p>📌코딩인터뷰 완전분석 - 면접문제 - 스택과 큐 part 문제풀이 (파이썬 사용)</p>
<p><strong>3.2 스택 Min :</strong> 기본적인 push와 pop 기능이 구현된 스택에서 최솟값을 반환하는 min 함수를 추가하려고 한다. 어떻게 설계할 수 있겠는가? push, pop, min 연산은 모두 O(1) 시간에 동작해야 한다.</p>
<pre><code>class Stack:
    #생성자
    def __init__(self):
        self.container = list()
        self.min_container = list()

    def push(self, data):
        self.container.append(data)

        # 최소값 갱신
        if not self.min_container or data &lt; self.min_container[-1]:
            self.min_container.append(data)

    def pop(self):
        pop_data = self.container.pop()

        # 삭제되는 데이터가 최소값이라면 최소값을 갱신
        if pop_data == self.min_container[-1]:
            self.min_container.pop()

        return pop_data

    # min함수
    def min(self):
        if not self.min_container:
            return None

        return self.min_container[-1]

stack1 = Stack()
stack1.push(5)
stack1.push(7)
stack1.push(4)
stack1.push(1)
stack1.push(9)

print(stack1.min_container)
print(stack1.min())</code></pre><p><img src="https://images.velog.io/images/dla-tngus/post/02cd3f77-90a6-4150-a94a-6c490df1fb36/image.png" alt=""></p>
<p><strong>3.5 스택 정렬:</strong> 가장 작은 값이 위로 오도록 스택을 정렬하는 프로그램을 작성하라. 추가적으로 하나 정도의 스택은 사용해도 괜찮지만, 스택에 보관된 요소를 배열 등의 다른 자료구조로 복사할 수는 없다. 스택은 push, pop, peek, isEmpty의 네 가지 연산을 제공해야 한다.</p>
<pre><code>class Stack:
    def __init__(self):
        self.container = list()

    def push(self, data):
        self.container.append(data)

    def pop(self):
        if not self.isEmpty():
            return self.container.pop(-1)
        else:
            print(&quot;Stack underflow&quot;)
            exit()

    def peek(self):
        if not self.isEmpty():
            return self.container[-1]
        else:
            print(&quot;underflow&quot;)
            exit()

    def isEmpty(self):
        if len(self.container)==0:
            return True
        return False

class Forsort:

    def __init__(self):
        self.item = Stack()
        self.item = [7, 10, 5, 9, 8]

    def sorting(self):
        stack_b = Stack()
        while self.item.isEmpty() != True:
            tmp = self.item.pop()
            while stack_b.isEmpty() != True and stack_b.peek() &gt; tmp :
                self.item.push(stack_b.pop())
            stack_b.push(tmp)

        while stack_b.isEmpty() != True:
            self.item.push(stack_b.pop())

        return self.item

sort1 = Forsort()
print(sort1.sorting())</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[HTML 개념정리 하]]></title>
            <link>https://velog.io/@dla-tngus/HTML-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%ED%95%98</link>
            <guid>https://velog.io/@dla-tngus/HTML-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%ED%95%98</guid>
            <pubDate>Tue, 26 Jan 2021 06:48:33 GMT</pubDate>
            <description><![CDATA[<h1 id="표-table">표 Table</h1>
<p>🎃 table : 데이터를 담은 표를 만들 때 사용</p>
<h3 id="기본-구조">기본 구조</h3>
<pre><code>&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt; 테이블 헤더 &lt;/th&gt;
        &lt;td&gt; 테이블 데이터 &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;</code></pre><p>예시</p>
<pre><code>&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt; ID &lt;/th&gt;
            &lt;th&gt; 이름 &lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt; 0001 &lt;/td&gt;
            &lt;td&gt; 임수현 &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
    &lt;tfoot&gt;
    ~
    &lt;/tfoot&gt;
&lt;/table&gt;</code></pre><h3 id="심화">심화</h3>
<p>🔴 scope : 가로의 header인지 세로의 header인지 알려주는 attribute
🟡 rowspan, colspan : 가로나 세로로 칸을 확장할 때 사용하는 attribute</p>
<pre><code>&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;&lt;/th&gt;
            &lt;th scope = &quot;col&quot;&gt; 월 &lt;/th&gt;
            &lt;th scope = &quot;col&quot;&gt; 화 &lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;th scope = &quot;row&quot;&gt; 1교시 &lt;/th&gt;
            &lt;td rowspan = &quot;2&quot;&gt; 수학 &lt;/td&gt;
            &lt;td&gt; 말하기 &amp;amp; 쓰기 &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;th colspan = &quot;3&quot; scope = &quot;row&quot;&gt; 점심시간 &lt;/th&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;</code></pre><h1 id="미디어-파일-media">미디어 파일 Media</h1>
<p>📌 미디어 파일에는 audio, video, iframe 등이 있다.</p>
<pre><code>&lt;audio src = &quot;#&quot; loop autoplay&gt;&lt;/audio&gt;
&lt;audio src = &quot;#&quot; controls&gt;&lt;/audio&gt;</code></pre><pre><code>&lt;audio controls&gt;
    # 사용자의 브라우저가 어떤 오디오 파일을 지원하는지 모르기 때문에 이렇게 쓰면 유용하다
    &lt;source src = &quot;#&quot; type = &quot;audio/wav&quot;/&gt;
    &lt;source src = &quot;#&quot; type = &quot;audio/mpeg&quot;/&gt;
    &lt;source src = &quot;#&quot; type = &quot;audio/ogg&quot;/&gt;
&lt;/audio&gt;</code></pre><p>🟡 audio와 video 태그의 사용법은 동일하다
🟣 iframe은 보통 유튜브나 트위터내에 있는 embed 공유를 통해 긁어온다</p>
<h1 id="기타-etc">기타 Etc</h1>
<p>🔴 abbr(abbreviation) : 약자를 설명해주기 위해 사용</p>
<pre><code>&lt;p&gt;
너는 &lt;abbr title = &quot;자연스러운 만남 추구&quot;&gt; 자만추 &lt;/abbr&gt;니?
&lt;/p&gt;</code></pre><p>🟠 address : 연락처를 나타내기 위해 사용(물리적 주소, url, email주소, 전화번호, SNS 등)</p>
<pre><code>&lt;address&gt;
    &lt;h1&gt;
        홍길동
    &lt;/h1&gt;
    &lt;a href=&quot;#&quot;&gt; url로 이동 &lt;/a&gt;
&lt;/address&gt;</code></pre><p>🟡 pre(preformatted text) : 있는 그대로 화면에 보여준다</p>
<pre><code>&lt;pre&gt;
    ㅇㅏㄴㅕㅎㅏㅅㅔㅇ
    ㄴ  ㅇ        ㅛ
&lt;/pre&gt;</code></pre><p>🟢 code : 코드일부를 그대로 표시하고자 할 때 주로 사용</p>
<h1 id="doctype--document-structure">Doctype &amp; Document Structure</h1>
<p>🔑 Document Type Declration(=DTD 선언, 문서 형식 선언)</p>
<pre><code>&lt;!DOCTYPE html&gt;
    &lt;html&gt;
        &lt;head&gt;
        &lt;!--웹 문서에 관한 메타 데이터--&gt;
        &lt;/head&gt;
        &lt;body&gt;
        &lt;!--웹 문서에 들어갈 내용--&gt;
        &lt;/body&gt;
    &lt;/html&gt;</code></pre><h1 id="title-link-style--script">Title, Link, Style &amp; Script</h1>
<h3 id="🔴-title-태그">🔴 Title 태그</h3>
<p>타이틀 태그는 검색 최적화에 영향을 미친다</p>
<p>타이틀 태그 tip : 키워드 단순 나열을 비추, 페이지마다 그에 맞게 변경, 무엇에 관한 내용인지 센스있게!</p>
<pre><code>&lt;title&gt;문서의 대제목&lt;/title&gt;</code></pre><h3 id="🟠-link-태그">🟠 Link 태그</h3>
<p>CSS 스타일시트를 첨부하는 태그, link:css 치고 tab 눌러서 사용 가능</p>
<pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;</code></pre><h3 id="🟡-style-태그">🟡 Style 태그</h3>
<p>HTML 문서내에 CSS 코드를 작성할 때 사용</p>
<pre><code>&lt;style&gt; CSS코드 &lt;/style&gt;</code></pre><h3 id="🟢-script-태그">🟢 Script 태그</h3>
<p>HTML 문서 내에 JavaScript 파일을 첨부할 때 사용, script:src 치고 tab 눌러서 사용
📌 script 태그는 body 내에서도 가장 마지막에 작성하는 것이 좋다</p>
<pre><code>&lt;script src=&quot;경로&quot;&gt;&lt;/script&gt;
&lt;script&gt; 자바스크립트 코드 &lt;/script&gt;</code></pre><h1 id="meta">Meta</h1>
<p>name = &quot;메타 데이터 종류&quot;
content = &quot;메타 데이터 값&quot;</p>
<pre><code>&lt;meta name = &quot;viewport&quot; content = &quot;width=device_width, initial-scale = 1.0&quot;&gt;
&lt;meta name = &quot;keywords&quot; content = &quot;홍길동, 프로그래머, 프론트엔드&quot;&gt;</code></pre>]]></description>
        </item>
    </channel>
</rss>