<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_jihee.log</title>
        <link>https://velog.io/</link>
        <description>이름처럼 쉽게 개발 공부를 기록하자. 📝</description>
        <lastBuildDate>Tue, 10 Oct 2023 00:04:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_jihee.log</title>
            <url>https://images.velog.io/images/dev_jihee/profile/bdd7cd9f-9f8b-478c-a344-d6db378a6796/download.jpeg－1_（9）.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_jihee.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_jihee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[TIL 24 | Deep Dive 모던자바스크립트 스터디 - 44.  Rest API]]></title>
            <link>https://velog.io/@dev_jihee/TIL-24-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-44.-Rest-API</link>
            <guid>https://velog.io/@dev_jihee/TIL-24-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-44.-Rest-API</guid>
            <pubDate>Tue, 10 Oct 2023 00:04:35 GMT</pubDate>
            <description><![CDATA[<h2 id="441-rest-api의-구성">44.1 REST API의 구성</h2>
<p>HTTP를 기반으로 클라이언트가 서버의 리소스에 접근하는 방식을 규정한 아키텍쳐
RESTful : REST의 기본 원칙을 성실히 지킨 서비스 디자인
REST API : REST를 기반으로 서비스 API를 구현한 것</p>
<h3 id="구성-3요소">구성 3요소</h3>
<ul>
<li>자원 (resource) : 자원을 뜻함, URI(엔드포인트)로 표현</li>
<li>행위 (verb) : 자원에 대한 행위를 뜻함, HTTP 요청 메서드로 표현</li>
<li>표현 (representations) : 자원에 대한 행위의 구체적 내용, 페이로드로 표현</li>
</ul>
<h2 id="442-rest-api-설계-원칙">44.2 REST API 설계 원칙</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 5 | Deep Dive 모던자바스크립트 스터디 - 08장. 제어문]]></title>
            <link>https://velog.io/@dev_jihee/TIL-5-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-08%EC%9E%A5.-%EC%A0%9C%EC%96%B4%EB%AC%B8</link>
            <guid>https://velog.io/@dev_jihee/TIL-5-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-08%EC%9E%A5.-%EC%A0%9C%EC%96%B4%EB%AC%B8</guid>
            <pubDate>Wed, 16 Aug 2023 15:49:46 GMT</pubDate>
            <description><![CDATA[<p>제어문(control flow statement)은 조건에 따라 코드 블록을 실행(조건문)하거나 반복 실행(반복문)할 때 사용한다. 일반적으로 코드는 위에서 아래 방향으로 순차적으로 실행된다. 제어문을 사용하면 코드의 실행 흐름을 인위적으로 제어할 수 있다.</p>
<h2 id="81-블록문">8.1 블록문</h2>
<p>*<em>블록문(block statement/compound statement)은 0개 이상의 문을 중괄호로 묶은 것으로, 코드 블록 또는 블록이라고 부르기도 한다. *</em>자바스크립트는 블록문을 하나의 실행 단위로 취급한다. 블록문은 단독으로 사용할 수도 있으나 일반적으로 제어문이나 함수를 정의할 때 사용하는 것이 일반적이다.</p>
<pre><code class="language-javascript">// 블록문
{
  var foo = 10;
}

// 제어문
var x = 1;
if(x &lt; 10) {
    x++;
}

// 함수 선언문
function sum(a, b){
    return a + b;
}

// 블록문은 문을 종료를 의미하는 자체 종결성을 갖기 때문에 끝에 세미클론을 붙이지 않는다.</code></pre>
<h2 id="82-조건문">8.2 조건문</h2>
<p>조건문(conditional statement)은 주어진 조건식(conditional expression)의 평가 결과에 따라 코드 블록(블록문)의 실행을 결정한다. <strong>조건식은 불리언 값으로 평가될 수 있는 표현식</strong>이다.</p>
<h3 id="821-if--else-문">8.2.1 if ... else 문</h3>
<p>if ... else 문은 <strong>주어진 조건식(불리언 값으로 평가될 수 있는 표현식)의 평가 결과, 즉 논리적 참 또는 거짓에 따라 실행할 코드 블록을 결정</strong>한다. 조건식의 평가 결과가 true일 경우 if 문의 코드 블록이 실행되고, false일 경우 else 문의 코드 블록이 실행된다.</p>
<p>대부분의 if ... else 문은 삼항 조건 연산자로 바꿔 쓸 수 있다.</p>
<pre><code class="language-javascript">var x = 2;
var result;

if (x % 2) {
    result = &#39;홀수&#39;;
} else {
    result = &#39;짝수&#39;;
}

console.log(result); // 짝수

// 위 예제를 삼항 조건 연산자로 바꿔 쓸 수 있다.

var x = 2;

var result = x % 2 ? &#39;홀수&#39; : &#39;짝수&#39;;
// 2 % 2는 0이다. 이때 0은 false로 암묵적 강제 변환된다.
console.log(result); // 짝수

// 만약 경우의 수가 세 가지(&#39;양수&#39;, &#39;음수&#39;, &#39;영&#39;)이라면
var kind = num ? (num &gt; 0 ? &#39;양수&#39; : &#39;음수&#39;) : &#39;영&#39;;
console.log(kind); // 양수</code></pre>
<p>삼항 조건 연산자는 값으로 평가되는 표현식을 만든다. 따라서 삼항 조건 연산자 표현식은 값처럼 사용할 수 있기 때문에 변수에 할당할 수 있다. 하지만 if ... else 문은 표현식이 아닌 문이라 변수에 할당할 수 없다.</p>
<h3 id="822-switch문">8.2.2 switch문</h3>
<pre><code class="language-javascript"> switch (표현식) {
    case 표현식1:
        // switch문의 표현식과 표현식1이 일치하면 실행될 문;
        break;
    case 표현식2:
        // switch문의 표현식과 표현식2가 일치하면 실행될 문;
        break;
    default:
        // switch문의 표현식과 일치하는 case문이 없을 때 실행될 문;
}</code></pre>
<ul>
<li>주어진 표현식을 평가해 그 값과 일치하는 표현식을 갖는 case문으로 실행 흐름을 옮김</li>
<li>case문은 상황(case)을 의미하는 표현식을 지정하고 콜론으로 마치며, 그 뒤에 실행할 문들을 위치</li>
<li>switch문의 표현식과 일치하는 case문이 없다면 실행 순서는 default문으로 이동하며, default문은 선택 사항</li>
<li>switch문의 표현식은 불리언 값보다는 문자열이나 숫자 값인 경우가 많음</li>
<li>따라서 논리적 참, 거짓보다는 다양한 상황에 따라 실행할 코드 블록을 결정할 때 사용</li>
<li>if...else문으로 해결할 수 있다면 switch문보다 if...else문 권장, 조건식이 너무 많아서 switch문이 더 가독성이 좋다면 switch문 사용</li>
</ul>
<h2 id="83-반복문">8.3 반복문</h2>
<p>반복문(loop statement)은 조건식의 평가 결과가 참인 경우 코드 블록을 실행한다. 그 후 조건식을 다시 평가하여 여전히 참인 경우 코드 블록을 다시 실행한다. 이는 조건식이 거짓일 때까지 반복된다.</p>
<h3 id="831-for-문">8.3.1 for 문</h3>
<p><strong>for 문은 조건식이 거짓으로 평가될 때까지 코드 블록을 반복 실행한다</strong>. 가장 일반적으로 사용된다</p>
<pre><code class="language-javascript">for(변수 선언문 또는 할당문; 조건식; 증감식){
    조건식이 참인 경우 반복 실행될 문;
}

// for문 예제 
// 선언문의 변수 이름은 반복을 의미하는 iteration의 i를 일반적으로 사용한다.
for(var i = 0; i &lt; 2; i++){
    console.log(i);
}

0
1</code></pre>
<ul>
<li>for 문을 실행하면 가장 먼저 변수 선언문 var i = 0이 실행됩니다. 변수 선언문은 단 한 번만 실행된다.</li>
<li>변수 선언문의 실행이 종료되면 조건식이 실행된다.</li>
<li>조건식의 평가 결과 true이면 코드 블록을 실행시키고 코드 블록의 실행이 종료되면 증감식이 실행된 후 다시 조건식이 실행된다.</li>
<li>기억해야할 점은 증감식 실행이 종료되면 변수 선언문이 아니라 조건식이 실행된다.</li>
<li>조건식의 평가 결과 false면 for문을 종료한다.</li>
</ul>
<h3 id="832-while-문">8.3.2 while 문</h3>
<p><strong>while 문은 주어진 조건식의 평가 결과가 참이면 코드 블록을 계속해서 반복 실행한다.</strong> for 문은 반복 횟수가 명확할 때 주로 사용하고 while 문은 반복 횟수가 불명확할 때 주로 사용한다.</p>
<pre><code class="language-javascript">var count = 0;

while(count &lt; 3) {
  console.log(count); // 0 1 2
  count++;
}

// 조건식의 평가 결과가 언제나 참이면 무한 루프가 된다.
// 무한루프에서 탈출하기 위해서는 코드 블록 내에 if 문으로 탈출 조건을 만들고
// break 문으로 코드 블록을 탈출한다

var count = 0;

while(true) {
  console.log(count);
  count++;
  // count가 3이면 코드 블록을 탈출한다.
  if (count === 3) break;
} // 0 1 2</code></pre>
<h3 id="833-do--while-문">8.3.3 do ... while 문</h3>
<p><strong>do ... while 문은 코드 블록을 먼저 실행하고 조건식을 평가한다</strong>. 따라서 코드 블록은 무조건 한 번 이상 실행된다.</p>
<pre><code class="language-javascript">var count = 0;

do {
  console.log(count); // 0 1 2
  count++;
} while(count &lt; 3);</code></pre>
<h2 id="84-break-문">8.4 break 문</h2>
<p><strong>break 문은 레이블 문, 반복문(for, for...in, for...of, while, do...while) 또는 switch문의 코드 블록을 탈출한다.
위 문들의 코드 블록 외에 break 문을 사용하면 SyntaxError(문법 에러)가 발생한다.</strong>
레이블 문(label statement)이란 식별자가 붙은 문을 말한다. 프로그램의 실행 순서를 제어하는데 사용한다. 하지만 프로그램의 흐름이 복잡해져서 가독성이 나빠지고 오류를 발생시킬 가능성이 높기 때문에 권장되지 않는다.</p>
<pre><code class="language-javascript">// outer라는 식별자가 붙은 레이블 for문
outer: for(var i = 0; i &lt; 3; i++){
    for(var j = 0; j &lt; 3; j++){
    // i + j === 3이면 outer라는 식별자가 붙은 레이블 for문을 탈출한다.
     if(i + j === 3) break outer;
     console.log(`inner [${i}, ${j}]`);
    }
}

console.log(&#39;Done!&#39;);</code></pre>
<h2 id="85-continue-문">8.5 continue 문</h2>
<p>*<em>continue 문은 반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킨다.
*</em>
break 문처럼 반복문을 탈출하지는 않는다.</p>
<pre><code class="language-javascript">// continue 문을 사용하지 않으면 if 문 내에 코드를 작성해야 한다.
for (var i = 0; i &lt; string.length; i++){
    if(string[i] === search){
    count++;
    }
}

// continue 문을 사용하면 if 문 밖에 코드를 작성할 수 있다.
for (var i = 0; i &lt; string.length; i++){
    if(string[i] !== search) continue;
    count++;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 4 | Deep Dive 모던자바스크립트 스터디 - 07장. 연산자]]></title>
            <link>https://velog.io/@dev_jihee/TIL-4-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-07%EC%9E%A5.-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@dev_jihee/TIL-4-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-07%EC%9E%A5.-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Wed, 16 Aug 2023 15:02:00 GMT</pubDate>
            <description><![CDATA[<h1 id="07장-연산자">07장. 연산자</h1>
<pre><code class="language-javascript">// 산술 연산자 
5 * 4 // 20 

// 문자열 연결 연산자 
&#39;My name is &#39; + &#39;Lee&#39; // &#39;My name is Lee&#39; 

// 할당 연산자 
color = &#39;red&#39; // &#39;red&#39; 

// 비교 연산자 
3 &gt; 5 //  false 

// 논리 연산자 
true &amp;&amp; false // false 

// 타입 연산자 
typeof &#39;Hi&#39; // string</code></pre>
<ul>
<li>연산자(operator)는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다.</li>
<li>이때 연산의 대상을 피연산자(operand)라 한다. 피욘산자는 값으로 평가될 수 있는 표현식이어야 한다.</li>
<li>피연산자와 연산자의 조합으로 이뤄진 연산자 표현식도 값으로 평가될 수 있는 표현식이다.</li>
</ul>
<h2 id="71-산술-연산자">7.1 산술 연산자</h2>
<p>산술 연산자(arithmetic operator)는 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다. 산술 연산지 불가능한 경우, NaN을 반환한다.</p>
<h3 id="711-이항-산술-연산자">7.1.1 이항 산술 연산자</h3>
<ul>
<li>2개의 피연산자를 산술 연산하여 숫자값을 만듦</li>
<li>피연산자의 값을 변경하는 부수 효과는 없음</li>
<li>즉, 어떠한 산술 연산을 해도 피연산자의 값이 바뀌지 X → 언제나 새로운 값을 만듦</li>
</ul>
<table>
<thead>
<tr>
<th align="center">이항 산술 연산자</th>
<th align="center">의미</th>
<th align="center">부수 효과</th>
</tr>
</thead>
<tbody><tr>
<td align="center">+</td>
<td align="center">덧셈</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">-</td>
<td align="center">곱셈</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">*</td>
<td align="center">곱셈</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">/</td>
<td align="center">나눗셈</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">%</td>
<td align="center">나머지</td>
<td align="center">X</td>
</tr>
</tbody></table>
<pre><code class="language-javascript">5 + 2; // 7
5 - 2; // 3
5 * 2; // 10
5 / 2; // 2.5
5 % 2; // 1</code></pre>
<h3 id="712-단항-산술-연산자">7.1.2 단항 산술 연산자</h3>
<p>단항(unary) 산술 연산자는 1개의 피연산자를 산술 연산하여 숫자 값을 만든다.</p>
<table>
<thead>
<tr>
<th align="center">단항 산술 연산자</th>
<th align="center">의미</th>
<th align="center">부수 효과</th>
</tr>
</thead>
<tbody><tr>
<td align="center">++</td>
<td align="center">증가</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">--</td>
<td align="center">감소</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">+</td>
<td align="center">어떠한 효과도 없다. 음수를 양수로 반전하지도 않는다.</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">-</td>
<td align="center">양수를 음수로, 음수를 양수로 반전한 값을 반환한다.</td>
<td align="center">X</td>
</tr>
</tbody></table>
<p>주의할 점은 이항 산술 연산자와는 달리 <strong>증가/감소(++/--) 연산자는 피연산자의 값을 변경하는 부수 효과가 있다</strong>는 것이다.</p>
<pre><code class="language-javascript">var x = 5, result;

// 선할당 후증가(postfix increment operator)
result = x++;
console.log(result, x); // 5, 6

// 선증가 후할당(prefix increment operator)
result = ++x;
console.log(result, x); // 7, 7

// 선할당 후감소(postfix decrement operator)
result = x--;
console.log(result, x) // 7, 6

// 선감소 후할당(prefix decrement operator)
result = --x;
console.log(result, x) // 5, 5</code></pre>
<h3 id="713-문자열-연결-연산자">7.1.3 문자열 연결 연산자</h3>
<p>&#39;+&#39;연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.</p>
<pre><code class="language-javascript">// 문자열 연결 연산자
&#39;1&#39; + 2; // &#39;12&#39;
2 + &#39;1&#39; // &#39;21&#39;

// 산술 연산자
1 + 2 // 3

// true는 1로 타입 변환된다
1 + true; // 2

// false는 0으로 타입 변환된다.
1 + false; // 1

// null은 0으로 타입 변환된다.
1 + null; // 1

// undefined는 숫자로 타입 변환되지 않는다.
+undefined; // NaN
a + undefined; // NaN</code></pre>
<ul>
<li>&#39;+&#39; 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작</li>
<li>위의 예제와 같이 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환 되기도 함</li>
<li>이를 암묵적 타입 변환 또는 타입 강제 변환이라 함</li>
</ul>
<h2 id="72-할당-연산자">7.2 할당 연산자</h2>
<table>
<thead>
<tr>
<th align="center">할당 연산자</th>
<th align="center">예</th>
<th align="center">동일 표현</th>
<th align="center">부수 효과</th>
</tr>
</thead>
<tbody><tr>
<td align="center">=</td>
<td align="center">x = 5</td>
<td align="center">x = 5</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">+=</td>
<td align="center">x += 5</td>
<td align="center">x = x + 5</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">-=</td>
<td align="center">x -= 5</td>
<td align="center">x = x - 5</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">*=</td>
<td align="center">x *= 5</td>
<td align="center">x = x * 5</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">/=</td>
<td align="center">x /= 5</td>
<td align="center">x = x / 5</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">%=</td>
<td align="center">x %= 5</td>
<td align="center">x = x % 5</td>
<td align="center">O</td>
</tr>
</tbody></table>
<ul>
<li>우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당</li>
<li>좌항의 변수에 값을 할당하므로 변수 값이 변하는 부수 효과가 있음</li>
</ul>
<pre><code class="language-javascript">var x;
// 할당문은 표현식인 문이다.
console.log(x = 10); //10

// 이러한 특징을 황요해 여러 변수에 동일한 값을 연쇄 할당할 수 있습니다.
var a, b, c;
// 연쇄 할당. 오른쪽에서 왼쪽으로 진행
// c = 0 : 0으로 평가된다.
// b = 0 : 0으로 평가된다.
// a = 0 : 0으로 평가된다.
a = b = c = 0;

console.log(a, b, c); // 0 0 0</code></pre>
<p><strong>할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다.</strong></p>
<h2 id="73-비교-연산자">7.3 비교 연산자</h2>
<ul>
<li>비교 연산자는 좌항과 우항의 피연산자를 비교한 다음 그 결과를 불리언 값으로 반환</li>
<li>if문이나 for문과 같은 제어문의 조건식에서 주로 사용</li>
</ul>
<h3 id="731-동등일치-비교-연산자">7.3.1 동등/일치 비교 연산자</h3>
<table>
<thead>
<tr>
<th align="center">비교 연산자</th>
<th align="center">의미</th>
<th align="center">사례</th>
<th align="center">설명</th>
<th align="center">부수 효과</th>
</tr>
</thead>
<tbody><tr>
<td align="center">==</td>
<td align="center">동등 비교</td>
<td align="center">x == y</td>
<td align="center">x와 y의 값이 같음</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">===</td>
<td align="center">일치 비교</td>
<td align="center">x === y</td>
<td align="center">x와 y의 값과 타입이 같음</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">!=</td>
<td align="center">부동등 비교</td>
<td align="center">x != y</td>
<td align="center">x와 y의 값이 다름</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">!==</td>
<td align="center">불일치 비교</td>
<td align="center">x !== y</td>
<td align="center">x와 y의 값과 타입이 다름</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center"><strong>동등 비교(==) 연산자는 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다.</strong></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">#### 동등 비교(==) 연산자</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">```javascript</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">// 동등 비교</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">5 == 5; // -&gt; true</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<p>// 타입은 다르지만 암묵적 타입 변환을 통해 타입을 일치시키면 동등하다.
5 == &#39;5&#39;; // -&gt; true</p>
<p>// ⚠️ 동등 비교 연산자의 안티 패턴 예시
// 결과 예측이 어려움
&#39;0&#39; == &#39;&#39;; // -&gt; false
0 == &#39;&#39;;   // -&gt; true
0 == &#39;0&#39;;  // -&gt; true
false == &#39;false&#39;;   // -&gt; false
false == &#39;0&#39;;       // -&gt; true
false == null;      // -&gt; false
false == undefined; // -&gt; false</p>
<pre><code>* 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교
* 따라서 좌항과 우항의 피연산자가 타입은 다르더라도 암묵적 타입 변환 후 같은 값일 수 있다면 true 반환
* 이처럼 예측하기 어려운 결과를 만들어내므로 사용을 지양하는 것을 권장
#### 일치 비교(===) 연산자
```javascript
// 일치 비교
5 === 5; // -&gt; true

// 암묵적 타입 변환을 하지 않고 값을 비교한다.
// 즉, 값과 타입이 모두 같은 경우만 true를 반환한다.
5 === &#39;5&#39;; // -&gt; false</code></pre><ul>
<li>좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한해 true 반환</li>
<li>즉, 암묵적 타입 변환을 하지 않고 값을 비교하므로 값을 예측하기 쉬움</li>
<li>식별자의 주소를 비교</li>
</ul>
<h3 id="732-대소-관계-비교-연산자">7.3.2 대소 관계 비교 연산자</h3>
<table>
<thead>
<tr>
<th align="center">대소 관계</th>
<th align="center">비교 연산자</th>
<th align="center">예제    설명</th>
<th align="center">부수 효과</th>
</tr>
</thead>
<tbody><tr>
<td align="center">&gt;</td>
<td align="center">x &gt; y</td>
<td align="center">x가 y보다 크다</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">&lt;</td>
<td align="center">x &lt; y</td>
<td align="center">x가 y보다 작다</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">&gt;=</td>
<td align="center">x &gt;= y</td>
<td align="center">x가 y보다 크거나 같다</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">&lt;=</td>
<td align="center">x &lt;= y</td>
<td align="center">x가 y보다 작거나 같다</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">피연산자의 크기를 비교하여 불리언 값 반환</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<h2 id="74-삼항-조건-연산자">7.4 삼항 조건 연산자</h2>
<blockquote>
<p> 조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값</p>
</blockquote>
<ul>
<li>조건식의 평가 결과에 따라 반환할 값을 결정</li>
<li>조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 암묵적 타입 변환</li>
<li>if...else 문을 사용해도 삼항 조건 연산자 표현식과 유사하게 처리 가능</li>
<li>다만, 삼항 조건 연산자 표현식은 값처럼 사용할 수 있지만 if...else문은 값처럼 사용할 수 없음
　👉 삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문</li>
</ul>
<pre><code class="language-javascript">var x = 10;

// if ... else 문은 표현식이 아닌 문이다. 따라서 값처럼 사용할 수 없다.
var result = if (x % 2) { result = &#39;홀수&#39;; } else { result = &#39;짝수&#39;; };
// SyntaxError: Unexpected token if

var result = x % 2 ? &#39;홀수&#39; : &#39;짝수&#39;;
console.log(result) // 짝수</code></pre>
<p>삼항 조건 연산자 표현식은 if ...else 문과 비슷해 보이지만, 중요한 차이가 있다. <strong>삼항 조건 연산자 표현식은 값처럼 사용할 수 있지만 if ... else 문은 값처럼 사용할 수 없다</strong>.
<strong>조건에 따라 어떤 값을 결정해야 한다면 if ... else 문보다 삼항 조건 연산자 표현식을 사용하는 편이 유리하다.</strong></p>
<h2 id="75-논리-연산자">7.5 논리 연산자</h2>
<table>
<thead>
<tr>
<th align="center">논리 연산자</th>
<th align="center">의미</th>
<th>부수 효과</th>
</tr>
</thead>
<tbody><tr>
<td align="center"></td>
<td align="center"></td>
<td></td>
</tr>
<tr>
<td align="center">&amp;&amp;</td>
<td align="center">논리곱(AND)</td>
<td>X</td>
</tr>
<tr>
<td align="center">!</td>
<td align="center">부정(NOT)</td>
<td>X</td>
</tr>
<tr>
<td align="center">논리 연산자(logical operator)는 우항과 좌항의 피연산자(부정 논리 연산자의 경우 우항의 피연산자)를 논리 연산한다.</td>
<td align="center"></td>
<td></td>
</tr>
<tr>
<td align="center"><strong>논리 부정(!) 연산자는 언제나 불리언 값을 반환한다.</strong> 단,  피연산자가 반드시 불리언 값일 필요는 없다. 만약 피연산자가 불리언 값이 아니면 불리언 타입으로 암묵적 타입 변환된다.</td>
<td align="center"></td>
<td></td>
</tr>
</tbody></table>
<h2 id="76-쉼표-연산자">7.6 쉼표 연산자</h2>
<p>쉼표(,) 연산자는 왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환한다.</p>
<pre><code class="language-javascript">var x, y, z;
x = 1, y = 2, z = 3; // 3</code></pre>
<h2 id="77-그룹-연산자">7.7 그룹 연산자</h2>
<p>소괄호(&#39;()&#39;)로 피연산자를 감싸는 그룹 연산자는 자신의 피연산자인 표현식을 가장 먼저 평가한다. 따라서 그룹 연산자를 사용하면 연산자의 우선순위를 조절할 수 있다.</p>
<pre><code class="language-javascript">10 * 2 + 3 // 23

10 * (2 + 3) // 50</code></pre>
<h2 id="78-typeof-연산자">7.8 typeof 연산자</h2>
<p>typeof 연산자는 피연산자의 데이터 타입을 문자열로 반환한다.</p>
<pre><code class="language-javascript">typeof &#39;&#39; // &#39;string&#39;
typeof 1  // &#39;number&#39;
typeof NaN // &#39;number&#39;
typeof true // &#39;boolean&#39;
typeof undefined // &#39;undefined&#39;
typeof Symbol() // &#39;symbol&#39;
typeof null // &#39;object&#39;
typeof [] // &#39;object&#39;
typeof {} //&#39;object&#39;
typeof new Date() //&#39;object&#39;
typeof /test/gi // &#39;object&#39;
typeof function () {} // &#39;function&#39;</code></pre>
<p><strong>typeof 연산자로 null 값을 연산해보면 &quot;null&quot;이 아닌 &quot;object&quot;를 반환한다는 데 주의</strong>하자. 이것은 자바스크립트의 첫 번째 버전의 버그다. 하지만 기존 코드에 영향을 줄 수 있기 때문에 아직까지 수정되지 못하고 있다.</p>
<p>값이 null 타입인지 확인할 때는 typeof 연산자를 사용하지 말고 일치 연산자(===)를 사용하자.</p>
<pre><code class="language-javascript">var foo = null;

typeof foo === null; // false
foo === null; // true

// undeclared 식별자를 선언한 적이 없다.
typeof undeclared; // undefined</code></pre>
<p>또 하나 주의 해야할 것이 있다. 선언하지 않는 식별자를 typeof 연산자로 연산해 보면 ReferenceError가 발생하지 않고 undefined를 반환한다.</p>
<h2 id="79-지수-연산자">7.9 지수 연산자</h2>
<pre><code class="language-javascript">// ES7: 지수 연산자
2 ** 2;   // -&gt; 4
2 ** 2.5; // -&gt; 5.65685424949238
2 ** 0;   // -&gt; 1
2 ** -2;  // -&gt; 0.25


// 지수 연산자 도입 전
Math.pow(2, 2);   // -&gt; 4
Math.pow(2, 2.5); // -&gt; 5.65685424949238
Math.pow(2, 0);   // -&gt; 1
Math.pow(2, -2);  // -&gt; 0.25


// 음수에 지수 연산자 적용
-5 ** 2;
// SyntaxError: Unary operator used immediately before exponentiation expression.
// Parenthesis must be used to disambiguate operator precedence

(-5) ** 2; // -&gt; 25</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 3 | Deep Dive 모던자바스크립트 스터디 - 06장. 데이터 타입]]></title>
            <link>https://velog.io/@dev_jihee/TIL-3-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-06%EC%9E%A5.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@dev_jihee/TIL-3-Deep-Dive-%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-06%EC%9E%A5.-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Wed, 16 Aug 2023 07:12:16 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터-타입">데이터 타입</h2>
<ul>
<li>데이터 타입(data type, 타입)은 값의 종류를 말한다.</li>
<li>자바스크립트의 모든 값은 데이터 타입을 가지며, ES6 기준으로 7개의 데이터 타입 제공</li>
<li>7개의 데이터 타입은 <strong>원시 타입(primitive type)</strong>과 <strong>객체 타입(object/reference type)</strong>으로 분류</li>
</ul>
<h3 id="원시-타입-primitive-data-type">원시 타입 (primitive data type)</h3>
<ul>
<li>number</li>
<li>string</li>
<li>boolean</li>
<li>undefined</li>
<li>null</li>
<li>symbol (ES6에서 추가)<h3 id="객체-타입-objectreference-type">객체 타입 (object/reference type)</h3>
</li>
<li>object </li>
<li>자바스크립트는 객체기반 언어로, 위의 원시타입을 제외한 모든 값(배열, 객체, 함수 등)은 객체타입이다.</li>
</ul>
<h2 id="61-숫자-타입">6.1 숫자 타입</h2>
<pre><code class="language-javascript">// 모두 숫자 타입이다.
var integer = 10;    // 정수
var double = 10.12;  // 실수
var negative = -20;  // 음의 정수

var binary = 0b01000001; // 2진수
var octal = 0o101;       // 8진수
var hex = 0x41;          // 16진수

// 표기법만 다를 뿐 모두 같은 값이다.
console.log(binary); // 65
console.log(octal);  // 65
console.log(hex);    // 65
console.log(binary === octal); // true
console.log(octal === hex);    // true</code></pre>
<p>자바스크립트는 하나의 숫자 타입만 존재한다.
자바스크립트의 숫자 타입은 정수만을 위한 타입이 없고 모든 수를 실수로 처리한다고 했다. 이는 정수로 표시된다 해도 사실은 실수라는 것을 의미한다. 따라서 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있다.</p>
<pre><code class="language-javascript">// 숫자 타입의 세 가지 특별한 값
console.log(10 / 0); // Infinity
console.log(10 / -0); // -Infinity
console.log(1 * &#39;String&#39;); // NaN</code></pre>
<ul>
<li>숫자 타입은 추가적으로 세 가지 특별한 값도 표현할 수 있다.<ul>
<li>Infinity: 양의 무한대</li>
<li>-Infinity: 음의 무한대</li>
<li>NaN: 산술 연산 불가(not-a-number)</li>
</ul>
</li>
<li>자바스크립트는 대소문자를 구별하므로 NaN을 NAN, nan, Nan 등으로 표기 시 에러 발생</li>
</ul>
<h2 id="62-문자열-타입">6.2 문자열 타입</h2>
<pre><code class="language-javascript">// 문자열 타입
var string;
string = &#39;문자열&#39;; // 작은따옴표
string = &quot;문자열&quot;; // 큰따옴표
string = `문자열`; // 백틱 (ES6)

string = &#39;작은따옴표로 감싼 문자열 내의 &quot;큰따옴표&quot;는 문자열로 인식된다.&#39;;
string = &quot;큰따옴표로 감싼 문자열 내의 &#39;작은따옴표&#39;는 문자열로 인식된다.&quot;;</code></pre>
<ul>
<li>문자열 타입은 텍스트 데이터를 나타내는 데 사용하며, 0개 이상의 UTF-16의 집합으로 대부분의 문자 표현 가능하다.</li>
<li>작은따옴표(&#39;&#39;), 큰따옴표(&quot;&quot;), 또는 백틱(``)으로 텍스트를 감싼다.
　👉 키워드나 식별자 같은 토큰과 구분하기 위해서다.</li>
<li>따옴표로 문자열을 감싸지 않는다면 스페이스와 같은 공백 문자 포함 불가하다.</li>
<li>문자열은 원시 타입이며 불변성이 있으므로 문자열 생성 시 문자열을 변경할 수 없다.</li>
</ul>
<h2 id="63-템플릿-리터럴">6.3 템플릿 리터럴</h2>
<ul>
<li>ES6부터 도입된 새로운 문자열 표기법이 도입되었다.</li>
<li>멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능 제공한다.</li>
<li>런타임에 일반 문자열로 변환되어 처리된다.</li>
<li>일반적인 따옴표 대신 백틱(``)을 사용해 표현한다.</li>
</ul>
<h3 id="631-멀티라인-문자열">6.3.1 멀티라인 문자열</h3>
<ul>
<li>일반 문자열 내에서는 줄바꿈(개행)이 허용되지 않는다.</li>
<li>따라서 줄바꿈 등의 공백을 표현하려면 백슬래시()로 시작하는 이스케이프 시퀀스를 사용해야 한다.</li>
<li>템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄 바꿈이 허용되며, 모든 공백도 그대로 적용된다.</li>
</ul>
<h3 id="632-표현식-삽입">6.3.2 표현식 삽입</h3>
<pre><code class="language-javascript">var first = &#39;Ung-mo&#39;;
var last = &#39;Lee&#39;;

// ES5: 문자열 연산자를 이용한 기존의 문자열 연결 방식
console.log(&#39;My name is &#39; + first + &#39; &#39; + last + &#39;.&#39;); // My name is Ung-mo Lee.

// ES6: 템플릿 리터럴 내 표현식 삽입을 이용한 문자열 연결 방식
console.log(`My name is ${first} ${last}.`); // My name is Ung-mo Lee.


// 문자열로 강제 형변환되어 삽입됨
console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3</code></pre>
<ul>
<li>템플릿 리터럴 미사용 시 문자열 연산자 + 를 사용해 문자열 연결할 수 있다.</li>
<li>템플릿 리터럴 내에서는 표현식 삽입을 통해 간단히 문자열 삽입할 수 있다.</li>
<li>표현식을 삽입하려면 ${ }로 표현식을 감싸는데, 표현식의 평가 결과가 문자열이 아니더라도 문자열로 타입 강제 변환되어 삽입된다.</li>
<li>표현식 삽입은 반드시 템플릿 리터럴 내에서 사용해야 한다. (일반 문자열에서의 표현식 삽입은 문자열로 취급됨)</li>
</ul>
<h2 id="64-불리언-타입">6.4 불리언 타입</h2>
<pre><code class="language-javascript">var foo = true;
console.log(foo); // true

foo = false;
console.log(foo); // false</code></pre>
<p>불리언 타입의 값은 논리적 참, 거짓을 나타내는 true와 false뿐이다</p>
<h2 id="65-undefined-타입">6.5 undefined 타입</h2>
<ul>
<li>undefined 타입의 값은 undefined가 유일하다.z</li>
<li>var 키워드로 선언한 변수는 처음 할당이 이뤄질 때까지 쓰레기 값(garbage value)으로 내버려 두지 않고 undefined로 초기화한다.
　👉 따라서 변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 undefined 반환
　👉 즉, 변수 참조 시 undefined가 반환된다면 참조한 변수 초기화되지 않은 변수라는 것을 알아낼 수 있음</li>
<li>undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화하는 데 사용하는 값이다. 개발자가 의도적으로 변수에 할당하면 본래 취지와 어긋날뿐더러 혼란을 줄 수 있으므로 권장하지 않는다.
　 👉 변수에 값이 없다는 것을 명시하고 싶을 때는 undefined가 아닌 null 할당 권장</li>
</ul>
<pre><code class="language-javascript">var foo;
console.log(foo); // undefined</code></pre>
<h2 id="66-null-타입">6.6 null 타입</h2>
<ul>
<li>null 타입의 값은 null이 유일하며, 자바스크립트 엔진은 대소문자를 구별하므로 null은 Null, NULL과는 다르다.</li>
<li>프로그래밍 언어에서 null은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용한다.</li>
<li>변수에 null을 할당하는 것은 변수의 이전 참조 값을 더 이상 참조하지 않겠다는 것을 의미한다.
　👉 즉, 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것</li>
<li>함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.</li>
</ul>
<h2 id="67-심벌-타입">6.7 심벌 타입</h2>
<pre><code class="language-javascript">// 심벌 값 생성
var key = Symbol(&#39;key&#39;);
console.log(typeof key); // symbol

// 객체 생성
var obj = {};

// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
obj[key] = &#39;value&#39;;
console.log(obj[key]); // value</code></pre>
<ul>
<li>변경 불가능한 원시 타입의 값</li>
<li>다른 값과 중복되지 않는 유일무이한 값이다.</li>
<li>주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용 </li>
</ul>
<h2 id="68-객체-타입">6.8 객체 타입</h2>
<ul>
<li>자바스크립트는 객체 기반의 언어</li>
<li>지금까지 살펴본 6가지 데이터 타입 이외의 값은 모두 객체 타입</li>
</ul>
<h2 id="69-데이터-타입의-필요성">6.9 데이터 타입의 필요성</h2>
<p>값은 메모리에 저장하고 참조할 수 있어야 하는데, 메모리에 값을 저장할 때 먼저 확보해야 할 메모리 공간의 크기를 결정하기 위해.
즉, 메모리 공간을 적절히 낭비/손실 없이 저장하기 위해 필요하다.</p>
<h3 id="691-데이터-타입에-의한-메모리-공간의-확보와-참조">6.9.1 데이터 타입에 의한 메모리 공간의 확보와 참조</h3>
<ul>
<li>자바스크립트 엔진은 데이터 타입(값의 종류)에 따라 정해진 크기의 메모리 공간 확보</li>
<li>변수에 할당되는 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정됨</li>
</ul>
<h3 id="692-데이터-타입에-의한-값의-해석">6.9.2 데이터 타입에 의한 값의 해석</h3>
<ul>
<li>모든 값은 데이터 타입을 가지며, 메모리에 2진수(비트의 나열)로 저장됨</li>
<li>이때 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있음
　👉 ex. 메모리에 저장된 값 0100 0001을 숫자로 해석하면 65지만, 문자열로 해석하면 &#39;A&#39;</li>
</ul>
<h2 id="610-동적-타이핑">6.10 동적 타이핑</h2>
<h3 id="6101-동적-타입-언어와-정적-타입-언어">6.10.1 동적 타입 언어와 정적 타입 언어</h3>
<p><strong>정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.</strong></p>
<ul>
<li>JS는 동적 타입 언어이다.</li>
<li>JS의 변수는 선언이 아닌 할당할 때 타입이 결정 된다.(타입 추론)</li>
<li>그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. (동적 타이핑 / 동적 타입 언어)</li>
<li>JS는 개발자의 의도와는 상관없이 JS 엔진에 의해 타입이 자동으로 변환하기도 해서 주의해야 한다.<ul>
<li>변수는 필요한 경우에 한해 제한적으로 사용</li>
<li>변수의 유효 범위를 최대한 좁게 만들어 사용</li>
<li>전역변수는 지양한다.</li>
<li>변수 보다는 상수를 사용할 것</li>
<li>변수의 이름을 통해 변수의 목적과 의미를 파악하기 쉽게 작명할 것</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL 1 | JavaScript Deep Dive 스터디 - 04장. 변수]]></title>
            <link>https://velog.io/@dev_jihee/JavaScript-Compiler-or-Interpreter</link>
            <guid>https://velog.io/@dev_jihee/JavaScript-Compiler-or-Interpreter</guid>
            <pubDate>Mon, 14 Aug 2023 06:49:55 GMT</pubDate>
            <description><![CDATA[<h2 id="41-변수란-무엇인가-왜-필요한가">4.1 변수란 무엇인가? 왜 필요한가?</h2>
<h3 id="변수란">변수란?</h3>
<ul>
<li>변수란 프로그래밍 언어에서 <strong>데이터를 관리</strong>하기 위한 핵심 개념</li>
<li>컴퓨터는 CPU를 사용해 연산하고, 메모리를 사용해 데이터를 기억 </li>
<li>컴퓨터는 모든 데이터를 2진수로 처리한다.</li>
</ul>
<h3 id="메모리memory">메모리(memory)</h3>
<ul>
<li>데이터를 저장할 수 있는 메모리 셀(memory cell)의 집합체</li>
<li>메모리 셀 하나의 크기는 1바이트(8비트) 이며 컴퓨터는 1바이트 단위로 데이터를 저장하거나 읽어 들임</li>
<li>각 셀은 고유의 메모리 주소를 가지며, 메모리 주소는 메모리 공간의 위치를 나타낸다. (0부터 시작해 메모리의 크기만큼 정수로 표현된다.)</li>
<li>메모리에 저장되는 값은 2진수로 저장</li>
<li>자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다.</li>
</ul>
<h3 id="변수">변수</h3>
<ul>
<li>변수란 <strong>하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는, 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다</strong>.</li>
<li>변수는 프로그래밍 언어에서 값을 저장하고 참조하는 메커니즘으로, <strong>값의 위치를 가리키는 상징적인 이름</strong>이다. </li>
</ul>
<h2 id="42-식별자">4.2 식별자</h2>
<ul>
<li>어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말하며, 변수 이름을 식별자라고 하기도 한다.</li>
<li>식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺으며, 이 매핑 정보도 메모리에 저장되어야 한다.</li>
<li><strong>식별자는 값이 아니라 메모리 주소를 기억</strong>하고 있다. </li>
<li>변수 뿐만아니라 함수, 클래스 등 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자라고 한다. </li>
<li>식별자는 네이밍 규칙을 준수해야하며 선언(declaration)에 의해 자바스크립트 엔진에 식별자의 존재를 알린다. </li>
</ul>
<h2 id="43-변수-선언">4.3 변수 선언</h2>
<ul>
<li>변수를 생성하는 것을 말한다.</li>
<li>변수 선언에 의해 확보된 메모리 공간은 확보가 해제되기 전까지는 누구도 확보된 메모리 공간을 사용할 수 없도록 보호되므로 안전한게 사용할 수 있다.</li>
<li>*<em>변수를 사용하려면 반드시 선언이 필요하다.  *</em>변수를 선언할 때는 var, let, const 키워드를 사용한다. </li>
</ul>
<h3 id="자바스크립트-엔진은-변수-선언을-다음과-같은-2단계에-거쳐-수행한다">자바스크립트 엔진은 변수 선언을 다음과 같은 2단계에 거쳐 수행한다.</h3>
<ul>
<li><strong>선언단계</strong>: 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.</li>
<li><strong>초기화 단계</strong>: 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.</li>
</ul>
<h3 id="undefined">undefined</h3>
<ul>
<li>변수 선언에 의해 확보된 메모리 공간은 비어있지는 않고, 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화된다.</li>
<li>undefined는 자바스크립트에서 제공하는 원시 타입의 값</li>
<li>일반적으로 초기화(initialization)란 변수가 선언된 이후 최초로 값을 할당하는 것을 의미한다.</li>
<li>var 키워드로 선언한 변수는 undefined로 암묵적인 초기화 자동 수행한다.</li>
</ul>
<h3 id="변수의-사용">변수의 사용</h3>
<ul>
<li>변수를 사용하려면 반드시 선언 필요 (변수뿐만 아니라 모든 식별자 포함)</li>
<li>선언하지 않은 식별자에 접근하려면 ReferenceError (참조 에러) 발생</li>
<li>변수 이름을 비롯한 모든 식별자는 실행 컨텍스트에 등록됨
　👉 실행 컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
　👉 자바스크립트 엔진은 실행 컨텍스트를 통해 식별자와 스코프를 관리</li>
</ul>
<h2 id="44-변수-선언의-실행-시점과-변수-호이스팅">4.4. 변수 선언의 실행 시점과 변수 호이스팅</h2>
<pre><code class="language-javascript">console.log(score); // undefined
var score; // 변수 선언문</code></pre>
<p>자바스크립트 코드는 인터프리터에 의해 한 줄씩 순차적으로 실행되는데, 
변수 선언이 런타임(소스 코드가 한 줄씩 순차적으로 실행되는 시점)이 아니라 그 이전 단계에서 먼저 실행되기 때문에 console.log는 참조 에러가 아닌 undefined가 출력된다.
이처럼 <strong>변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅</strong>이라 한다. 
모든 선언문은 런타임 이전 단계에서 먼저 실행되기 때문!</p>
<h2 id="45-값의-할당">4.5 값의 할당</h2>
<pre><code class="language-javascript">console.log(score); // undefined

var score; // 변수 선언
score = 80; // 값의 할당

console.log(score); // 80

✨ 실행 순서 ✨

1. 런타임 이전에 score 선언 실행
2. 첫 번째 console undefined 출력
3. score에 80 값 할당
4. 두 번째 console 80 출력</code></pre>
<ul>
<li><strong>변수에 값을 할당(대입, 저장)할 때는 할당 연산자 &#39;=&#39; 를 사용한다.</strong> 할당 연산자는 우변의 값을 좌변의 변수에 할당한다.</li>
<li>이때, 변수 선언과 값을 할당을 하나의 문으로 단축 표현해도 자바스크립트 엔진은 <strong>변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행</strong></li>
<li>또한 변수의 선언과 값의 할당의 실행 시점이 상이함
　👉 <strong>변수 선언은 런타임 이전에 먼저 실행, 값의 할당은 런타임에 실행</strong></li>
</ul>
<h2 id="46-값의-재할당">4.6 값의 재할당</h2>
<p>재할당이란 이미 값이 할당되어 있는 변우세 새로운 값을 또다시 할당하는 것을 말한다.
만약 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수(constant)라한다.</p>
<h2 id="47-식별자-네이밍-규칙">4.7 식별자 네이밍 규칙</h2>
<ul>
<li>식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다. </li>
<li>단, 식별자는 특수문자를 제외한 문자, 언더스코어(_), 달러 기호($)로 시작해야 합니다. 숫자로 시작하는 것은 허용되지 않는다.</li>
<li>예약어는 식별자로 사용할 수 없다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML/CSS 과제 회고]]></title>
            <link>https://velog.io/@dev_jihee/d-bovddcsy</link>
            <guid>https://velog.io/@dev_jihee/d-bovddcsy</guid>
            <pubDate>Wed, 09 Aug 2023 05:11:36 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>HTML/CSS를 공부하면서 느낀점
평상시에 쓰지 않던 방식을 이번에 공부하며 작성하게 되어 좋았다.
우물안의 개구리였구나.. 다시 되돌아 보게 되었다.
알고 있는 부분이라 시간 낭비일까 고민했는데 괜한 걱정이였구나! 머쓱..</p>
</li>
<li><p>HTML/CSS 공부하면서 어려웠던 개념과 이유
세상에나 실무에서 쓰고 있어서 자신 만만했는데,
매일 내가 작성하던 방식이 아닌 디테일한 요구 명세서를 보고 작성하는게
평상시에 쓰지 않던 css와 마크업을 하게 되어 적지않게 충격을 받았다.</p>
</li>
<li><p>제로베이스 온라인 강의 중 가장 도움이 되었던 강의와 이유
html 장인의 핵심정리/프로젝트 강의가 가장 도움이 되었다.
실제 운영되고 있는 서비스를 하나하나 뜯어보면서 설명해줘서 더 기억에 남는 강의였다.</p>
</li>
<li><p>나만의 공부팁
과제를 피그마만 보고 나만의 방식으로 재코딩 해볼 예정이다.
다양한 방식으로 css, 마크업 하는게 중요하다는것을 이번에 절실하게 깨달았다!</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[IOS video - playsinline]]></title>
            <link>https://velog.io/@dev_jihee/IOS-video-playsinline</link>
            <guid>https://velog.io/@dev_jihee/IOS-video-playsinline</guid>
            <pubDate>Wed, 29 Mar 2023 00:40:07 GMT</pubDate>
            <description><![CDATA[<p>새로운 프로젝트 진행중에, 아이폰(ios)에서 video를 전체 화면 아닌 영상을 자동 재생하는 프로젝트가 있었는데 자동으로 전체화면 모드로 들어가는 현상이 발생했다.
구글 서치를 좀 해보니 IOS11버전 이후는 playsinline을 추가 해줘야 한다.</p>
<blockquote>
<p>playsinline 속성은 HTML 명세에 최근에 추가되었으며, WebKit은 기존의 webkit-playsinline 속성의 prefix를 제거하여 이 새로운 속성을 채택했습니다. </p>
</blockquote>
<h3 id="음소거-자동-재생">음소거 자동 재생</h3>
<p>모바일 브라우저에서 비디오를 인라인으로 재생하기 위해서는 다음 주요 속성을 추가해야 한다.
Android용 Chrome의 경우 처음 두 개만 필요하지만 Safari를 사용하는 경우 세개 모두 필요!</p>
<blockquote>
<ul>
<li>autoplay</li>
</ul>
</blockquote>
<ul>
<li>muted</li>
<li>playsinline</li>
</ul>
<ul>
<li>아이폰에서 <code>&lt;video playsinline&gt;</code> 요소는 이제 인라인으로 재생할 수 있으며, 재생이 시작될 때 자동으로 전체화면 모드로 들어가지 않는다.</li>
<li><code>&lt;video&gt;</code> 요소에 playsinline 속성이 없이 iPhone에서 재생하려면 전체 화면 모드가 계속 필요하다.</li>
<li>핀치 제스처로 전체 화면을 종료하면, <code>&lt;video&gt;</code> 요소는 playsinline 없이 인라인으로 계속 재생된다.</li>
</ul>
<pre><code class="language-html">&lt;video autoplay muted loop playsinline&gt;
    &lt;source src=&quot;./test.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS & SASS]]></title>
            <link>https://velog.io/@dev_jihee/CSS-SASS</link>
            <guid>https://velog.io/@dev_jihee/CSS-SASS</guid>
            <pubDate>Mon, 13 Mar 2023 15:30:19 GMT</pubDate>
            <description><![CDATA[<h1 id="css">CSS</h1>
<h2 id="css-가상클래스">CSS 가상클래스</h2>
<ul>
<li><p><strong>:not()</strong>- 특정 selector을 제외하고 스타일을 적용하고 싶은 경우 사용</p>
</li>
<li><p><strong>:nth-child()</strong>- 형제 요소 중에서 순서에 따라 n번째를 선택하여 스타일을 적용한다.</p>
</li>
<li><p><strong>:nth-of-type()</strong>- 같은 타입의 형제 요소 중에서 순서에 따라 n번째를 선택하여 스타일을 적용한다. (nth-child보다 좀 더 호환성이 보장된다.)</p>
</li>
</ul>
<ul>
<li><strong>:only-child</strong>- 지정 요소가 부모의 유일한 자식 요소인 경우, 다르게 말해서 부모의 자식 요소가 지정 요소 하나만 있는 경우에 적용이 된다.</li>
<li><strong>:only-of-type</strong>- 지정 요소가 부모의 자식 요소중 동일한 타입이 없는 경우, 부모의 자식 요소 중 다른 타입의 형제 요소들은 있어도 상관없다.
<img src="https://velog.velcdn.com/images/dev_jihee/post/77f23f05-98f1-4c31-8788-1fa33b10c33d/image.png" alt=""></li>
</ul>
<hr>
<h2 id="css-가상요소">CSS 가상요소</h2>
<ul>
<li><strong>first-letter</strong>- 블록레벨 요소의 첫 번째 줄 첫 번째 글자에 스타일을 적용합니다. 단, 다른 콘텐츠(이미지나 인라인테이블 등)가 선행되지 않는 경우에만 해당됩니다.
<img src="https://velog.velcdn.com/images/dev_jihee/post/b0f5eb4d-fe01-4872-a12b-dda555aee789/image.png" alt=""></li>
</ul>
<hr>
<h1 id="sass">SASS</h1>
<h2 id="extend-확장">extend 확장</h2>
<p>뜻 그대로 확장으로, 기본 내용에서 추가로 덧붙일때 사용한다.
<img src="https://velog.velcdn.com/images/dev_jihee/post/37a3187a-a614-4784-8bb3-05321c6a1a23/image.png" alt=""></p>
<p>사용법은 이미 존재하는 셀렉터를 @extend로 지정해주면 된다.
<strong>@extend는 CSS 미디어쿼리 내에서 실행되지 않는다.</strong>
그렇기에 반응형 작업할때는 사용하지 않는것이 좋다.
Sass Guideline 에서도 @extend는 사용을 권장하지 않는다.</p>
<p>선택자간의 <strong>연관성이 존재한다면 extend</strong>를 사용하고, <strong>연관성은 없지만 코드가 겹치는 선택자들이라면 mixin</strong>으로 소스코드의 중복을 없애기 위해 사용해야한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[About Git]]></title>
            <link>https://velog.io/@dev_jihee/About-Git</link>
            <guid>https://velog.io/@dev_jihee/About-Git</guid>
            <pubDate>Thu, 09 Mar 2023 15:08:20 GMT</pubDate>
            <description><![CDATA[<h2 id="git을-사용하는-이유">Git을 사용하는 이유</h2>
<h3 id="코드-관리-측면">코드 관리 측면</h3>
<ul>
<li>변경된 이력 확인</li>
<li>이전 이력으로 되돌리기</li>
<li>다른 기능의 버전 코드 유지</li>
<li>현재 최종이 어느 시점인지 표현할 수 있음</li>
</ul>
<h3 id="협업의-측면">협업의 측면</h3>
<ul>
<li>각 기능별로 분업 후 하나의 코드로 합칠 수 있음</li>
<li>같은 부분을 수정해 문제가 생기는 경우 안내</li>
<li>협업으로 인한 실수 예방</li>
<li>팀원 간의 커뮤니케이션 지원</li>
</ul>
<hr>
<h2 id="git-기반의-서비스">Git 기반의 서비스</h2>
<blockquote>
<p>프로젝트 소스코드 클라우드 호스팅 + 특색에 맞는 기능 제공!</p>
</blockquote>
<ol>
<li><p>Bitbucket (<a href="https://bitbucket.org">https://bitbucket.org</a>)
Atlassian의 제품들과 연계(Jira: <a href="https://www.atlassian.com/ko/software/jira">https://www.atlassian.com/ko/software/jira</a>)</p>
</li>
<li><p>GitLab(<a href="https://about.gitlab.com/">https://about.gitlab.com/</a>)
설치형 Git =&gt; 용량에 대한 비용 절감, 소스코드의 보안 좋음</p>
</li>
</ol>
<hr>
<h2 id="git-설치mac">Git 설치(MAC)</h2>
<h3 id="사전준비-homebrew-설치">사전준비. Homebrew 설치</h3>
<p><a href="https://brew.sh/index_ko">https://brew.sh/index_ko</a></p>
<h3 id="homebrew란">Homebrew란?</h3>
<p>Mac환경에서 제공하지 않는 유용한 패키지를 설치할 수 있도록 도와주는 패키지 관리자</p>
<ol>
<li>터미널 실행</li>
<li>brew install git 입력</li>
<li>git -version 입력 후 확인</li>
<li>Config 설정(User Name/ User Email 설정)</li>
<li>설치 완료</li>
</ol>
<hr>
<h2 id="사용자-설정-및-셋팅">사용자 설정 및 셋팅</h2>
<h3 id="git-사용자-설정">Git 사용자 설정</h3>
<p>로컬에서 사용할 Git 사용자 이메일과 이름을 설정
git config: Git에 관한 설정을 추가/변경/삭제하는 명령어
설정파일 - System 설정 파일/ Globla 설정 파일/ 로컬 설정파일</p>
<blockquote>
<p>System 설정 파일 : 모든 시스템 사용자에게 적용 (git config --system)
Global 설정 파일 : 한 사용자의 전치 Git Repository에 적용 (git config --global)
Local 설정 파일 : 하나의 Repository에만 적용 (git config --local)</p>
</blockquote>
<h3 id="global-git-사용자-설정">Global Git 사용자 설정</h3>
<blockquote>
<p>git config --global user.email &quot;<a href="mailto:abc@abc.com">abc@abc.com</a>&quot;
git config --global user.name &quot;Hong Gil-dong&quot;</p>
</blockquote>
<h3 id="설정-확인">설정 확인</h3>
<blockquote>
<p>git config --list</p>
</blockquote>
<h3 id="github-계정에-ssh-key-등록하기">Github 계정에 ssh key 등록하기</h3>
<ol>
<li>ssh key 만들기
<a href="https://bit.ly/368zxvR">https://bit.ly/368zxvR</a></li>
<li>Github 접속 후 오른쪽 상단 프로필 클릭 Setting-&gt;SSH and GPgKeys</li>
<li>New SSH Key 클릭해 Title과 복사한 Key 입력 후 Add SSH Key 클릭</li>
</ol>
<hr>
<h2 id="git-초기화-및-삭제">Git 초기화 및 삭제</h2>
<h3 id="git-초기화">Git 초기화</h3>
<p>명령어: git init
초기화 할 대상 폴더에서 명령어(git init)입력
Git 초기화 시 폴더 안에 숨김 폴더로 .git 폴더 생성 (Local Config등으로 구성)</p>
<h3 id="git-삭제">Git 삭제</h3>
<p>단순히 .git 폴더를 삭제
mac의 경우 폴더를 삭제하는 명령어 입력: rm -rf .git</p>
<hr>
<h2 id="gitignore란">.gitignore란?</h2>
<p>사용자가 git에 등록(커밋)되지 않길 원하는 파일 또는 폴더들의 목록을 저장
.gitignore에 등록된 파일(폴더)들은 커밋 시 자동으로 제외됨</p>
<h3 id="작성법">작성법</h3>
<ul>
<li>#은 주석의 역할</li>
<li>폴더 : /폴더명 (예: /docs)</li>
<li>파일 : 파일명.확장자 (예: test.txt)</li>
<li>폴더 안 파일: /폴더명/파일명.확장자 (예: /docs/test.txt)</li>
<li>폴더 안 특정 확장자 파일 전부 (예: /docs/*.text)</li>
<li>폴더 하위 모든 특정 확장자 파일 전부 (예: /docs/<em>*/</em>.txt)</li>
</ul>
<h3 id="gitignore-작성에-유용한-사이트">.gitignore 작성에 유용한 사이트</h3>
<p><a href="https://gitignore.io">https://gitignore.io</a></p>
<h3 id="기본-동작-원리">기본 동작 원리</h3>
<ul>
<li>Working Directory: 작업하는 파일이 있는 디렉토리</li>
<li>Staging Area: Git에 등록할(커밋)파일들이 올라가는 영역</li>
<li>Local Repository: 로컬 Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 영역</li>
<li>Remote Repository: Github등의 서비스를 통한 온라인 상의 저장소</li>
</ul>
<h3 id="기본-용어">기본 용어</h3>
<ul>
<li>orgin: 원격에 있는 코드</li>
<li>head: 내가 지금 작업하고 있는 로컬 브랜치</li>
<li>add: Working Directory에서 Staging Area로 등록하다</li>
<li>commit: Staging Area에 등록된 파일을 Local Storage로 등록</li>
<li>commit Message: commit시 함께 작성해 저장하는 메시지(메모)</li>
<li>push: Local Storage에서 변경된 파일들을 Remote Repository로 등록</li>
<li>fetch: Remote Repository의 변경사항을 Working Directory로 전달</li>
<li>merge: Local Repository의 변경사항을 Working Directory로 전달</li>
<li>Branch: 독립적으로 어떤 작업을 따로 진행하기 위한 가지</li>
<li>checkout: 사용할 다른 브랜치를 지정</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL - 모던 자바스크립트 Deep Dive]]></title>
            <link>https://velog.io/@dev_jihee/TIL-%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive</link>
            <guid>https://velog.io/@dev_jihee/TIL-%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive</guid>
            <pubDate>Thu, 10 Feb 2022 15:13:06 GMT</pubDate>
            <description><![CDATA[<h1 id="chpater5-표현식과-문">chpater5 표현식과 문</h1>
<h2 id="51-값">5.1 값</h2>
<ul>
<li>값: 식(표현식expression)이 평가evaluate되어 생성된 결과를 말한다.</li>
</ul>
<h2 id="52-리터럴">5.2 리터럴</h2>
<ul>
<li>리터럴은 사람이 이해할 수 있는 문자(아라비아 숫자, 알파벳, 한글 등) 또는 약속된 기호(&#39;&#39;, &quot;&quot;, ., [], {}, // 등)로 표기한 코드다.</li>
</ul>
<h2 id="53-표현식">5.3 표현식</h2>
<ul>
<li>표현식은 값으로 평가될 수 있는 문(statement)이다. 즉, 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.</li>
<li>값으로 평가되므로** 리터럴은 표현식이다**.</li>
<li>즉, <strong>값으로 평가될 수 있는 문은 모두 표현식이다.</strong></li>
</ul>
<h2 id="54-문">5.4 문</h2>
<ul>
<li>문(statement)은 프로그램을 구성하는 기본 단위이자 최소 실행 단위다.</li>
<li>토큰(tocken)이란 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 의미한다.<pre><code class="language-javascript">// 변수 선언문
var x;
</code></pre>
</li>
</ul>
<p>// 표현식 문(할당문)
x = 5;</p>
<p>// 함수 선언문
function foo () {}</p>
<p>// 조건문
if (x &gt; 1) { console.log(x); }</p>
<p>// 반복문
for (var i = 0; i &lt; 2; i++) { console.log(i); }</p>
<pre><code>
## 5.6 표현식인 문과 표현식이 아닌 문
* 표현식인 문과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다. 
```javascript
// 변수 선언문은 표현식이 아닌 문이다.
var x;

// 할당문은 그 자체가 표현식이지만 완전한 문이기도 하다. 즉, 할당문은 표현식인 문이다.
x = 100;

// 표현식인 문은 값처럼 사용할 수 있다
var foo = x = 100;
console.log(foo); // 100</code></pre><h1 id="chpater6-데이터-타입">chpater6 데이터 타입</h1>
<blockquote>
<ul>
<li>원시타입 : 숫자, 문자열, 불리언, undefined, null, symbol</li>
</ul>
</blockquote>
<ul>
<li>객체타임 : 객체, 함수, 배열 등</li>
</ul>
<h2 id="61-숫자-타입">6.1 숫자 타입</h2>
<pre><code class="language-javascript">// 모두 숫자 타입이다.
var integer = 10;    // 정수
var double = 10.12;  // 실수
var negative = -20;  // 음의 정수</code></pre>
<h2 id="62-문자열-타입">6.2 문자열 타입</h2>
<pre><code class="language-javascript">// 문자열 타입
var string;
string = &#39;문자열&#39;; // 작은따옴표
string = &quot;문자열&quot;; // 큰따옴표
string = `문자열`; // 백틱 (ES6)

string = &#39;작은따옴표로 감싼 문자열 내의 &quot;큰따옴표&quot;는 문자열로 인식된다.&#39;;
string = &quot;큰따옴표로 감싼 문자열 내의 &#39;작은따옴표&#39;는 문자열로 인식된다.&quot;;</code></pre>
<h2 id="63-템플릿-리터럴">6.3 템플릿 리터럴</h2>
<ul>
<li>ES6부터 도입된 새로운 문자여 표기법이다.</li>
<li>작은 따옴표 또는 큰 따옴표 같은 일반적인 따옴표 대신 백틱<code>(``)</code> 을 사용해 표현한다.</li>
</ul>
<h3 id="631-멀티라인-문자열">6.3.1 멀티라인 문자열</h3>
<ul>
<li>일반 문자열 내에서는 줄바꿈이 허용되지 않는다.</li>
</ul>
<blockquote>
<p>&#39; 따옴표 single quote
&quot; 쌍따옴표 double quote
\ 역슬래시 single backslash
\b 백스페이스 backspace 
\r 캐리지 리턴 carriage return 
\n 줄바꿈 newline
\s 스페이스 space
\t 수평탭 tab 
\v 수직탭 tab 
\f 폼피드 form feed 
\0 null</p>
</blockquote>
<pre><code class="language-javascript">var template = &#39;&lt;ul&gt;\n\t&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;\n&lt;/ul&gt;&#39;;

console.log(template);

🔻 출력 결과
/*
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
*/</code></pre>
<h3 id="632-표현식-삽입">6.3.2 표현식 삽입</h3>
<pre><code class="language-javascript">var first = &#39;Jihee&#39;;
var last = &#39;Lee&#39;;

console.log(&#39;My name is&#39; + first + &#39;&#39; + last +&#39;.&#39;); 👉 ES5 문자열 연결
console.log(`My name is ${first} ${last}.`}; 👉ES6 문자열 연결</code></pre>
<h2 id="65-undefined-타입">6.5 undefined 타입</h2>
<ul>
<li>값 할당 전의 가지는 초기값 
👉의도적으로 undefined를 할당하는 것은 취지에 어긋나기 때문에 그럴 때는 <strong>null을 사용</strong></li>
</ul>
<h2 id="67-심벌-타입">6.7 심벌 타입</h2>
<ul>
<li>변경 불가능한 원시 타입의 값</li>
<li>심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.</li>
</ul>
<h2 id="68-객체-타입">6.8 객체 타입</h2>
<ul>
<li>자바스크립트를 이루고 있는 거의 모든 것이 객체다.</li>
</ul>
<h2 id="69-데이터-타입의-필요성">6.9 데이터 타입의 필요성</h2>
<ul>
<li>값을 저장할 때 확보해야하는 <strong>메모리 공간의 크기</strong>를 결정하기 위해</li>
<li>값을 참조할 때 한 번 읽어 들어야 할 <strong>메모리 공간의 크기</strong>를 결정하기 위해</li>
<li>메모리에서 읽어 들인 *<em>2진수를 어떻게 해석 *</em>할지 결정하기 위해</li>
</ul>
<h2 id="610-동적-타이핑">6.10 동적 타이핑</h2>
<ul>
<li>C나 JAVA같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 <strong>데이터 타입을 사전에 선언</strong>해야한다.</li>
<li>정적 타입 언어는 변수의 타입을 변경할수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다.</li>
<li>정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.</li>
<li>자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 때 타입을 선언하지 않는다. 다만 var, let, const 키워드를 사용해 변수를 선언할 뿐이다.</li>
</ul>
<p>typeof연산자는 연산자 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다.</p>
<pre><code class="language-javascript">var foo;
console.log(typeof foo);  // undefined

foo = 3;
console.log(typeof foo);  // number

foo = &#39;Hello&#39;;
console.log(typeof foo);  // string

foo = true;
console.log(typeof foo);  // boolean

foo = null;
console.log(typeof foo);  // object -&gt; 암기할 수 밖에 없음

foo = Symbol(); // 심벌
console.log(typeof foo);  // symbol

foo = {}; // 객체
console.log(typeof foo);  // object

foo = []; // 배열
console.log(typeof foo);  // object

foo = function () {}; // 함수
console.log(typeof foo);  // function</code></pre>
<blockquote>
<p>자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
이러한 특징을 동적 타이핑이라고 하며,
자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입 언어라 한다.</p>
</blockquote>
<hr>
<h1 id="chpater7-연산자">chpater7 연산자</h1>
<ul>
<li>연산자: 피연산자와의 조합으로 표현식을 만듦<ul>
<li>피연산자는 그 자체로도 표현식.</li>
</ul>
</li>
<li>산술 연산자 (Arithmetic operator): 수학적 계산을 통해 새 값 만듦<ul>
<li>Ex) +,-,*,/,%, ++,--</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL - 모던 자바스크립트 Deep Dive]]></title>
            <link>https://velog.io/@dev_jihee/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive</link>
            <guid>https://velog.io/@dev_jihee/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive</guid>
            <pubDate>Wed, 09 Feb 2022 15:06:44 GMT</pubDate>
            <description><![CDATA[<h1 id="chpater4-변수">chpater4 변수</h1>
<h2 id="41-변수란">4.1 변수란?</h2>
<p>하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다. (값의 위치를 가리키는 상징적인 이름)</p>
<pre><code class="language-javascript">// 변수는 하나의 값을 저장한다.
var studentId = 1;
var studentName = &#39;Park&#39;;

// 배열이나 객체를 사용할 경우에는 그룹화해서 하나의 값처럼 사용할 수 있다.
var student = {id:1, name:&#39;Park&#39;};

var students = [
  {id:1, name:&#39;Park&#39;},
  {id:2, name:&#39;Kim&#39;}
 ];</code></pre>
<ul>
<li>저장된 값을 식별할 수 있는 고유한 이름 = <strong>변수이름</strong></li>
<li>그 변수에 저장된 값 = <strong>변수 값</strong></li>
<li>변수에 값을 저장하는 = <strong>할당</strong></li>
<li>변수에 저장된 값을 읽어 들이는 = <strong>참조</strong></li>
</ul>
<h2 id="42-식별자identifier">4.2 식별자(identifier)</h2>
<ul>
<li>변수 이름을 식별자라고도 한다. 식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다.</li>
<li>식별자는 값이 아니라 메모리 주소를 가지고 있다.</li>
<li>변수, 함수, 클래스 등의 이름과 같은 식별자는 네이밍 규칙을 준수해야 하며, 선언에 의해 자바스크립트 엔진에 존재를 알린다.</li>
</ul>
<h2 id="43-변수-선언">4.3 변수 선언</h2>
<ul>
<li>변수 사용을 위해서느 반드시 선언이 필요하다.</li>
<li>변수를 선언할 대는 var, let, const 키워드를 사용한다. </li>
<li>초기화란 변수가 선언된 이후 최초로 할당하는 것을 말한다.</li>
<li>var 키워드로 선언한 변수는 undefined로 암묵적인 초기화가 자동 수행된다.</li>
<li>var 키워드로 선언한 변수는 어떠한 값도 할당하지 않아도 undefined라는 값을 가진다.</li>
<li>선언하지 않은 식별자에 접근하면 ReferenceError(참조 에러)가 발생한다.</li>
<li>ReferenceError는 식별자를 통해 값을 참조하려 했지만 자바스크립트 엔진이 등록된 식별자를 찾을 수 없을 때 발생하는 에러다.</li>
</ul>
<h2 id="44-변순-선언의-실행-시점과-변수-호이스팅">4.4 변순 선언의 실행 시점과 변수 호이스팅</h2>
<pre><code class="language-javascript">console.log(score); // undefined

var score; // 변수 선언문</code></pre>
<blockquote>
<p>👉 console.log(score);가 실행되는 시점에는 아직 score 변수의 선언이 실행되지 않았으므로 undefined가 출력된다. </p>
</blockquote>
<blockquote>
<p><strong>⚠ 참조 에러(ReferenceError)가 아니라 undefined가 출력되는 이유는❓</strong>
변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 먼저 실행되기 때문이다.
이 처럼 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 <strong>변수 호이스팅</strong>이라한다.</p>
</blockquote>
<h2 id="45-값의-할당">4.5 값의 할당</h2>
<ul>
<li>변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.</li>
</ul>
<pre><code class="language-javascript">console.log(score); // undefined

var score; // 1 변수 선언
score = 80; // 2 값의 할당

console.log(score); // 80</code></pre>
<blockquote>
<p>1변수선언은 런타임 이전에 먼저 실행되고 2값의 할당은 런타임에 실행된다. 따라서 score 변수에 값을 할당하는 시점2에는 이미 변수 선언이 완료된 상태이며, 이미 undefined로 초기화되어 있다. 따라서 score 변수에 값을 할당하면 score 변수의 값은 undefined에서 새롭게 할당한 숫자 값 80으로 변경(재할당)된다.</p>
</blockquote>
<h2 id="46-값의-재할당">4.6 값의 재할당</h2>
<ul>
<li>값을 재할당할 수 ㅇ벗어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니랑 상수라 한다.</li>
<li>var 키워드로 선언한 변수는 값을 재할당할 수 있다.</li>
</ul>
<h2 id="47-식별자-네이밍-규칙">4.7 식별자 네이밍 규칙</h2>
<ul>
<li>식별자는 <strong>특수문자를 제외한 문자, 숫자, 언더스코어, 달러기호를 포함</strong>할 수 있다.</li>
<li>단, 식별자는 <strong>특수문자를 제외한 문자, 언더스코어, 달러기호로 시작</strong>해야하며 <strong>숫자로 시작하는 것은 허용하지 않는다</strong>.</li>
<li>예약어는 식별자로 사용할 수 없다.</li>
<li><strong>대소문자를 구별</strong>한다.<pre><code class="language-javascript">var first-name; // SyntaxError: - 특수문자 ❌ 
var 1st; // SyntaxError: 숫자로 시작 ❌ 
var this; // SyntaxError: 예약어 ❌ </code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[반응형 웹 vs 적응형 웹]]></title>
            <link>https://velog.io/@dev_jihee/%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-vs-%EC%A0%81%EC%9D%91%ED%98%95-%EC%9B%B9</link>
            <guid>https://velog.io/@dev_jihee/%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-vs-%EC%A0%81%EC%9D%91%ED%98%95-%EC%9B%B9</guid>
            <pubDate>Mon, 07 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[<h2 id="🧐-반응형-웹-vs-적응형-웹">🧐 반응형 웹 vs 적응형 웹</h2>
<p>근본적으로 웹사이트가 모바일 기기와 다양한 화면 크기에서 원활한 정보를 제공하여 더 나은 모바일 사용자 경험을 제공하기 위한 방법이다.
그러나, 적응형 웹과 반응형 웹은 사이트 설계부터 구동까지 많은 차이가 있다.</p>
<p>브라우저 가로길이가 변할 때,</p>
<p>어느 순간 툭 바뀐다? = 적응형.
이미지와 그리드가 실시간 변화한다? = 반응형.</p>
<p><img src="https://images.velog.io/images/dev_jihee/post/d85894e9-6ef7-4ab4-9645-7af151e6ea34/rwd-vs-adapt-example.gif" alt="">
위: 반응형, 아래: 적응형</p>
<h1 id="적응형-웹-adaptive-web">적응형 웹 (Adaptive Web)</h1>
<p><strong>서버나 클라이언트에서 웹에 접근한 기기를 체크해 그 기기에 맞는 템플릿을 제공하는 개념</strong>이다. 모바일의 경우 모바일용 템플릿을, 데스크톱의 경우 데스크톱용 템플릿을 제공하는 식이다. 따라서 기기별로 다른 템플릿을 제작해야 할 필요가 있다.</p>
<p>기존에 이미 데스크톱용 템플릿을 작성했다면, 바닥부터 재구축할 필요 없이 다른 기기용 템플릿만 따로 만들면 되어 편리하다. 또, <strong>사용자의 기기에 맞는 템플릿 및 CSS만 다운로드 하므로 데이터 낭비가 적고 로딩 속도가 빠르다</strong>.</p>
<p>다만, 각 기기별로 별로의 템플릿을 작성해야 하므로 개발이 복잡해진다.</p>
<h1 id="반응형-웹-responsive-web">반응형 웹 (Responsive Web)</h1>
<p>반응형 웹은** 미디어 쿼리를 사용해 기기 화면의 크기를 확인하고 유연한 이미지와 그리드를 활용**해 화면 크기 변화에 따라 페이지의 크기 및 레이아웃을 조절하는 기술을 말한다.</p>
<p><strong>하나의 템플릿만을 사용</strong>해 다양한 사용자와 기기에 대응할 수 있어 개발이 간편하다는 장점을 가진다. 다만, 사용자는 단 하나의 기기만으로 접속하지만 그 경우에도 모든 기기를 위한 CSS를 전부 다운로드 해야한다는 점에서 데이터를 낭비하고 로딩 시간을 늘리는 단점을 가진다.</p>
<p>또, 기존에 이미 운영 중이었던 데스크톱용 사이트가 있었다면 사이트를 재구축해야만 한다는 점에서 불편할 수 있다.</p>
<hr>
<p><img src="https://media.vlpt.us/images/wishtree/post/36caa281-3680-4a67-82e9-3df02e740be7/%EB%B0%98%EC%A0%81.png" alt=""></p>
<h2 id="반응형-웹과-적응형-웹의-특징-비교">반응형 웹과 적응형 웹의 특징 비교</h2>
<table>
  <tbody>
      <tr>
      <th>   </th>
      <th>반응형 웹</th>
      <th>적응형 웹</th>
     </tr>
    <tr>
      <td>기기 및 화면감지 방법 </td>
      <td>미디어 쿼리로 기기 감지</td>
      <td>서버 또는 브라우저에서 기기 감지</td>
    </tr>
    <tr> 
      <td> 템플릿</td>
      <td>하나의 템플릿으로 충분</td>
      <td>기기마다 다른 템플릿 필요</td>
    </tr>
    <tr>
      <td>콘텐츠</td>
      <td>모든 콘텐츠 다운로드 필요</td>
      <td>기기에 맞는 콘텐츠만 다운로드</td>
    </tr>
    <tr>
      <td>로딩 속도</td>
      <td>속도 느림</td>
      <td>속도 빠름</td>
    </tr>
    <tr>
      <td>기존 사이트 존재시</td>
      <td> 기존 사이트 변경 및 재구축 필요</td>
      <td> 기존 사이트 변경없이 구축 가능</td>
    </tr>
  </tbody>
</table>

<hr>
<blockquote>
<p>참고 urls
<a href="https://leonkong.cc/posts/responsive-adaptive.html">https://leonkong.cc/posts/responsive-adaptive.html</a>
<a href="https://jocoma.tistory.com/entry/%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-vs-%EC%A0%81%EC%9D%91%ED%98%95-%EC%9B%B9?category=935771">https://jocoma.tistory.com/entry/%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-vs-%EC%A0%81%EC%9D%91%ED%98%95-%EC%9B%B9?category=935771</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[처음 배우는 Git & GitHub]]></title>
            <link>https://velog.io/@dev_jihee/%EC%B2%98%EC%9D%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-Git-GitHub</link>
            <guid>https://velog.io/@dev_jihee/%EC%B2%98%EC%9D%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-Git-GitHub</guid>
            <pubDate>Sat, 05 Feb 2022 15:55:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>패스트캠퍼스 강의(프런트엔드 개발 올인원 - 처음 배우는 Git &amp; GitHub)를 듣고 요약한 글입니다.</p>
</blockquote>
<h1 id="소개">소개</h1>
<h2 id="왜-git과-github을-익혀야-하나요">왜 Git과 GitHub을 익혀야 하나요?</h2>
<p>팀 프로젝트에서 버전관리와 클라우드 저장소는 필수 불가결한 기술입니다.</p>
<p>버전 관리의 1등인 Git과 클라우드 저장소의 1등인 GitHub을 익히면 팀 프로젝트와 회사에서 효율적인 개발 협업을 할 수 있습니다.</p>
<hr>
<h1 id="환경-설정-버전-관리가-뭔가요">환경 설정: 버전 관리가 뭔가요</h1>
<h2 id="버전-관리-시스템-git">버전 관리 시스템: Git</h2>
<p>코딩할 때
단순히 crtl + z 를 눌러 이전 상태로 되돌리는 것이 아니라, 
<strong>원하는 시점마다 깃발을 꽂고</strong> (버전을 만들고) 
*<em>이들 간에 자유롭게 돌아다닐 수 있다. *</em></p>
<p>내가 만든 버전뿐 아니라 
동료가 만든 <strong>버전으로 이동</strong>할 수 있고, 
동료와 내 버전을 <strong>비교</strong>해서 
<strong>최신 본으로 코드를 업데이트</strong>할 수 있다.</p>
<hr>
<h1 id="gui">GUI</h1>
<h2 id="git을-사용하는-두-가지-방법">Git을 사용하는 두 가지 방법</h2>
<p><img src="https://images.velog.io/images/dev_jihee/post/4981753a-3f44-498e-9972-0a5fe633c339/image.png" alt=""></p>
<ol>
<li>CLI (Command Line Interface)</li>
<li>GUI (Graphic User Interface)</li>
</ol>
<h2 id="github에-코드를-올리는-과정">GitHub에 코드를 올리는 과정</h2>
<ol>
<li>내 컴퓨터 프로젝트 폴더에 &#39;여기에서 Git을 쓸 거다!&#39;라고 명령 (git init)</li>
<li>즐겁게 코딩</li>
<li>내가 변경한 파일 중 올리길 원하는 것만 선택 (git add)</li>
<li>선택한 파일들을 한 덩어리로 만들고 설명 적어주기 (git commit -m &quot;첫 페이지 제작&quot;)</li>
<li>GitHub 사이트에서 프로젝트 저장소 만들기</li>
<li>내 컴퓨터 프로젝트 폴더에 GitHub 저장소 주소 알려주기 (git remote add)</li>
<li>내 컴퓨터에 만들었던 덩어리 GitHub에 올리기 (git push)</li>
</ol>
<hr>
<h1 id="git-초기화와-로컬-저장소">Git 초기화와 로컬 저장소</h1>
<h2 id="이-폴더에서-git으로-버전관리를-하고-싶어">이 폴더에서 Git으로 버전관리를 하고 싶어!</h2>
<ol>
<li>원하는 폴더에서 Git 초기화를 하면 그때부터 가능 <strong>git init</strong></li>
<li>Git 초기화를 하면 .git이라는 숨겨진 폴더가 만들어진다. 이게 <strong>로컬 저장소</strong></li>
<li>로컬 저장소에 내가 만든 버전 정보, 원격 저장소 주소 등이 저장된다.</li>
<li>원격 저장소에서 내 컴퓨터로 코드를 받아오면 로컬 저장소가 자동으로 생긴다.</li>
</ol>
<h2 id="로컬-저장소-생성-실습">로컬 저장소 생성 실습</h2>
<ol>
<li>내컴퓨터에 Boxiting-cat 폴더 생성</li>
<li>Git Bash로 만든 폴더에 들어가기</li>
<li>git init으로 로컬 저장소 생성
<img src="https://images.velog.io/images/dev_jihee/post/b061dcef-fad0-43f4-8094-5a737f19f6b1/image.png" alt="">
<img src="https://images.velog.io/images/dev_jihee/post/6ab69e4d-f026-424a-9f98-59b7df40c7cb/image.png" alt=""></li>
</ol>
<p>git init 명령어를 입력하니 Git repository가 초기화 된 것을 확인할 수 있다.</p>
<h2 id="버전-생성-실습">버전 생성 실습</h2>
<ol>
<li><p>VS Code에서 README.md, index.html 파일 생성</p>
</li>
<li><p>원하는 파일만 선택하기</p>
<blockquote>
<p>git add README.md</p>
</blockquote>
</li>
<li><p>메세지를 달아 커밋으로 만들기</p>
<blockquote>
<p>git commit -m &quot;프로젝트 설명 파일 추가&quot;</p>
</blockquote>
</li>
<li><p>생성한 커밋 보기</p>
<blockquote>
<p>git log</p>
</blockquote>
</li>
</ol>
<h2 id="커밋-이모저모">커밋 이모저모</h2>
<ol>
<li>커밋은 &#39;의미 있는 변동사항&#39;을 묶어서 만든다.</li>
<li>버튼 클릭 버그를 고치는 데 5가지 파일을 수정했다면 그 5가지를 묶어서 하나의 커밋으로 만든다.</li>
<li>동료 개발자(혹은 미래의 나)가 &#39;버튼 클릭 버그&#39;를 고치는 데 어떤 파일을 수정했는지 손쉽게 파악 가능</li>
<li>커밋 메세지를 최대한 자세하게 적어주세요. 
나중에 후회하지 않습니다.</li>
</ol>
<h2 id="원격-저장소-github에서-만들고-커밋-푸시하기">원격 저장소 GitHub에서 만들고 커밋 푸시하기</h2>
<ol>
<li>GitHub에 로그인해서 Boxiting 저장소 생성</li>
<li>내 컴퓨터 boxiting-cat 폴더에 GitHub 저장소 주소 알려주기<blockquote>
<p>git remote add origin <a href="https://github.com/%EC%95%84%EC%9D%B4%EB%94%94/%EC%9D%B4%EB%A6%84(repo).git">https://github.com/아이디/이름(repo).git</a></p>
</blockquote>
</li>
<li>만든 커밋 푸시하기<blockquote>
<p>git push origin master</p>
</blockquote>
</li>
<li>GitHub 사이트에서 올라간 커밋 확인</li>
</ol>
<h2 id="원격-저장소를-내-컴퓨터에-받아오기-클론clone">원격 저장소를 내 컴퓨터에 받아오기: 클론(Clone)</h2>
<ol>
<li>내 컴퓨터에 boxiting-oct 폴더를 만들고 
GitHub의 Boxiting 저장소 받아오기</li>
</ol>
<blockquote>
<p>git clone <a href="https://github.com/%EC%95%84%EC%9D%B4%EB%94%94/%EC%9D%B4%EB%A6%84(repo).git">https://github.com/아이디/이름(repo).git</a></p>
</blockquote>
<ol start="2">
<li>app.js 파일 생성 후 add -&gt; commit -&gt; push</li>
<li>GitHub에서 새 커밋 확인하기</li>
</ol>
<p>Settings -&gt; Manage access에서 collaborator를 추가하면 해당 유저에게 푸시 권한을 줄 수 있다.</p>
<hr>
<h2 id="git에서의-커밋이란">Git에서의 커밋이란?</h2>
<ol>
<li><p>변경 사항의 모음(X) 하나의 최종 코드 모음(O)</p>
</li>
<li><p>기존 커밋과 비교해서 변경된 파일이 아니면 &#39;변경되지 않았다.&#39; 고만 저장해서 용량이 무겁지 않다.</p>
<ol>
<li>(고양이1 파일은 변경되지 않았으니까 3번째 버전에선 완전하게 저장 안하고 &#39;변경되지 않았다.&#39;고만 기록)</li>
<li>SVN은 바로 이전 커밋과의 변경사항만 저장</li>
<li>그래서 커밋당 용량은 더 가볍지만 한 버전을 보려면 맨 처음 커밋부터 계산해야한다-&gt; 속도 느림</li>
<li>Git은 바로 이전 커밋만 보면 된다. -&gt; 속도 빠름</li>
</ol>
<p><img src="https://images.velog.io/images/dev_jihee/post/242032fb-7841-4e6b-a924-1ec34b129b57/image.png" alt="">
<img src="https://images.velog.io/images/dev_jihee/post/816841f0-b3ed-4a41-93c3-1c467fd19c6b/image.png" alt="">
<img src="https://images.velog.io/images/dev_jihee/post/1c5dd901-b5eb-4011-8759-ad89308fb1be/image.png" alt="">
<img src="https://images.velog.io/images/dev_jihee/post/f9d7e566-7c41-4c59-9334-2e0329127866/image.png" alt="">
<img src="https://images.velog.io/images/dev_jihee/post/fd9b61e4-10b1-4a3c-a436-a6720bd4ad89/image.png" alt=""></p>
</li>
</ol>
<h2 id="요약">요약</h2>
<ol>
<li>Git으로 추적하는 파일의 4가지 상태
<img src="https://images.velog.io/images/dev_jihee/post/169602da-bb5a-4f44-86ce-7268a815fee6/image.png" alt=""></li>
<li>작업 공간 (Working directory)에 있는** 수정함, 추적 안됨** 파일을 스테이지로 올려 <strong>스테이지됨</strong>으로 변경한다.</li>
<li>커밋을 하면 <strong>수정 없음</strong> 상태로 돌아가서 다시 파일을 수정할 수 있다.</li>
</ol>
<hr>
<h2 id="평행세계-나누기---브랜치branch">평행세계 나누기 - 브랜치(Branch)</h2>
<h3 id="여러-줄로-커밋을-쌓는다">여러 줄로 커밋을 쌓는다?</h3>
<p>Q. 왜 같이 작업하려면 여러 줄로 커밋을 쌓아야 할까?
A. 한 줄에서 작업하면 충돌이 날 수 있다. 똑같은 코드를 동시에 수정할 가능성이 있다.</p>
<p>Q. 그럼 n줄로 쌓고 나중에 겹치나?
A. 그렇다. 그럼 충돌이 나더라도 합치는 시점에 명시적으로 충돌을 해결할 수 있다.</p>
<p>그래서 나온게 브랜치개념
<img src="https://images.velog.io/images/dev_jihee/post/28e50f54-a185-469c-8e6f-8aa58a903dff/image.png" alt="">
<img src="https://images.velog.io/images/dev_jihee/post/8612bd73-6308-4f4b-ba75-86a094b70faa/image.png" alt=""></p>
<h3 id="브랜치-만들기">브랜치 만들기</h3>
<p><strong>git branch cat</strong>
<img src="https://images.velog.io/images/dev_jihee/post/42ad996b-898d-4663-8f3d-b064d2d2998d/image.png" alt=""></p>
<h3 id="만든-브랜치로-이동하기">만든 브랜치로 이동하기</h3>
<p><strong>git checkout cat</strong>
<img src="https://images.velog.io/images/dev_jihee/post/37904bdc-e0e2-4fa7-a0a8-42c5a86418e3/image.png" alt=""></p>
<h3 id="cat-브랜치에-커밋을-추가하면">cat 브랜치에 커밋을 추가하면?</h3>
<p>master 브랜치는 아직 과거 커밋을,
cat 브랜치는 새 커밋을 가리킴
<img src="https://images.velog.io/images/dev_jihee/post/fe969504-1cdd-4934-aa6b-9edd5e9e30fc/image.png" alt=""></p>
<h3 id="master로-이동하고-oct브랜치-만들고-커밋">master로 이동하고, oct브랜치 만들고, 커밋</h3>
<p>master 브랜치의 최신 커밋(고양4)을 기점으로 oct브랜치, cat 브랜치가 나뉘어짐
<img src="https://images.velog.io/images/dev_jihee/post/6bf6f957-6581-4931-a329-ef09fe3ba20a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS 방법론]]></title>
            <link>https://velog.io/@dev_jihee/CSS-%EB%B0%A9%EB%B2%95%EB%A1%A0-xlb28rvl</link>
            <guid>https://velog.io/@dev_jihee/CSS-%EB%B0%A9%EB%B2%95%EB%A1%A0-xlb28rvl</guid>
            <pubDate>Fri, 28 Jan 2022 07:32:46 GMT</pubDate>
            <description><![CDATA[<h1 id="✔-css-방법론의-공통-지향점">✔ CSS 방법론의 공통 지향점</h1>
<ol>
<li>코드의 재사용</li>
<li>코드의 간결화</li>
<li>코드의 확장성</li>
<li>코드의 예측성(직관적인 클래스 네이밍)</li>
</ol>
<hr>
<h1 id="📝-bem-block-element-modifier">📝 BEM (Block Element Modifier)</h1>
<h2 id="작명-규칙">작명 규칙</h2>
<ul>
<li>개발, 디버깅, 유지보수를 위하여 CSS 선택자의 이름을 가능한 한 명확하게 만드는 것이 목표이다.</li>
<li>소문자, 숫자 만을 이용해서 작명한다.</li>
<li>여러단어의 조합은 하이픈(-)으로 연결하여 작명한다.</li>
<li>ID는 사용할 수 없고, 오직 class명만 사용할 수 있다</li>
</ul>
<h2 id="블록-block">블록 (Block)</h2>
<ul>
<li>Block은 재사용 할 수있는 기능적으로 독립적인 컴포넌트를 뜻한다. (하나만 떼서 사용할 수 있는 형태)</li>
<li>블록은 환경에 영향을 받지 않아야 한다.👉 즉, 여백이나 위치위치 값(margin, position) 를 설정하면 안된다.</li>
<li>블럭은 <span style="color: #e60000;">서로 중첩이 가능</span> (ex. head block안에 logo block)</li>
<li>형태(red, big)가 아닌 <span style="color: #e60000;">목적(menu, button)</span>에 맞게 작성한다.<pre><code>&lt;div class=&quot;header&quot;&gt;
&lt;div class=&quot;menu&quot;&gt;....&lt;/div&gt;
&lt;div class=&quot;search&quot;&gt;....&lt;/div&gt;
&lt;/div&gt;</code></pre></li>
</ul>
<p><img src="https://images.velog.io/images/dev_jihee/post/f10b5c51-7b54-494a-b230-43123438ff58/image.png" alt=""></p>
<h2 id="요소-element">요소 (Element)</h2>
<ul>
<li>엘리먼트는 블럭을 구성하는 단위 요소를 뜻하며, <span style="color: #e60000;">더블 언더바(__)</span>로 구분한다.</li>
<li>형태(red, big)가 아닌 <span style="color: #e60000;">목적(item, text, title)</span>에 맞게 결정해야 한다.</li>
<li>요소는 블록의 부분으로만 사용 할 수 있고, 다른 요소의 부분으로는 사용할 수 없다.</li>
<li>모든 블록에서 <span style="color: #e60000;">요소는 필수가 아닌 선택적으로 사용</span>한다. 즉 블록안에 요소가 없을 수도 있다.</li>
</ul>
<pre><code class="language-css">.header__logo { … }
.header__menu { … }
.header__search { … }
.header__login { … }

/* block 이름이나 element 이름이 길 경우 – 하이픈으로 연결한다. */
.block-name__element-name {}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/3cdd747d-5385-4c55-b23c-e569d63f85fe/image.png" alt=""></p>
<h2 id="수식어-modifier">수식어 (Modifier)</h2>
<ul>
<li>블록이나 요소의 <span style="color: #e60000;">모양(color, size..), 상태(disabled, checked..)를 정의</span>한다.</li>
<li>block__element — modifier, block — modifier 형태로 사용<span style="color: #e60000;">(더블 하이픈)</span></li>
<li>수식어의 <strong>블리언 타입</strong>과 <strong>키-벨류 타입</strong>이 있다.<ul>
<li>블리언 타입 : 수식어가 있으면 값이 true 라고 가정한다. (form__button — disabled)</li>
<li>키-벨류 타입 : 키, 벨류를 하이픈으로 연결하여 표시한다. (color-red, theme-ocean)</li>
</ul>
</li>
<li>수식어는 단독으로 사용할 수 없다. 즉 기본 블록과 요소에 추가하여 사용해야 한다.</li>
</ul>
<pre><code class="language-css">/*
탭 메뉴가 다른 영역에서 다른 스타일로 사용된다면,
메인 속성을 복사하여 추가 하거나, sass의 @extend를 활용하여 속성을 상속 받을 수 있다
*/

.header__navigation {
      background: #008cba;
      padding: 1px 0;
      margin: 2px 0;
}
.header__navigation‐‐secondary {
      @extend .header__navigation;
      background: #dfe0e0;
 }</code></pre>
<h2 id="혼합사용-mix">혼합사용 (Mix)</h2>
<ul>
<li>block1, block2__element 형태로 사용할 수 있다.</li>
<li>block2__element 에 여백이나 위치를 지정하고 block1은 독립적으로 유지할 수 있다.</li>
</ul>
<pre><code>&lt;div class=”header”&gt;
     &lt;div class=”search-form header__search-form”&gt;&lt;/div&gt; 
&lt;/div&gt;</code></pre><h2 id="bem-장단점">BEM 장단점</h2>
<h3 id="장점">장점</h3>
<ul>
<li><p><strong>재사용성과 직관적인 클래스(class)</strong>: BEM은 이해하기 쉽고, 직관적인 클래스 이름의 작명을 하기가 쉽다. 또한, Block 기반의 스타일로 Block을 다른 곳에 재사용하기 쉽다.</p>
</li>
<li><p><strong>클래스(class) 중복 방지</strong>: BEM은 Block 단위의 class name을 통해 CSS의 원치 않은 상속을 제한하며, 클래스 네임 중복을 방지합니다.</p>
</li>
</ul>
<h3 id="단점">단점</h3>
<ul>
<li><strong>네이밍 명명법의 한계:</strong>  BEM은 초기 Block의 네이밍은 간결하지만 안에 세부 요소로 들어갈수록 복잡한 명명법을 갖게 된다.이는 HTML내 복잡한 클래스(class)를 갖게 되며, 익숙치 않을 경우 괴이한 모습으로 비춰질 수 있다. </li>
</ul>
<hr>
<h1 id="📝-smacss-scalable-and-modular-architecture-for-css">📝 SMACSS (Scalable and Modular Architecture for CSS)</h1>
<ul>
<li>Class명을 통한 예측</li>
<li>재 사용</li>
<li>쉬운 유지보수</li>
<li>확장 가능</li>
</ul>
<ol>
<li><strong>Base</strong><ul>
<li>기본 스타일(Reset, Default .. )</li>
<li>기본 스타일에는 !important 사용할 필요가 없다.</li>
<li>Base에서는 어떤 클래스(class)나 ID 선택 자도 포함하지 않는다\<pre><code class="language-css">body,p,h1,h2,h3,h4,h5,h6,ul,ol,li,dl,dt,dd,table,th,td,form,fieldset,legend,input,
textarea,button,select{margin:0;padding:0}
body,input,textarea,select,button,table{font-size:14px;line-height:1.25}
body.s,.s input,.s textarea,.s select,.s button,.s table{font-family:helvetica}
body{position:relative;background-color:#fff;color:#000}
body.s{-ms-text-size-adjust:none;-webkit-text-size-adjust:none}
img,fieldset{border:0}
ul,ol{list-style:none}
table{border-collapse:collapse}
em,address{font-style:normal}
a{color:inherit;text-decoration:none}</code></pre>
</li>
</ul>
</li>
<li><strong>Layout</strong><ul>
<li>레이아웃과 관련된 스타일 정의</li>
<li>class명에 &#39;l-&#39; suffix(접미사)를 붙인다.<pre><code class="language-css">#content {
width: 80%;
float: left;
}
#aside {
width: 20%
}

</code></pre>
</li>
</ul>
</li>
</ol>
<p>.l-fixed #content {
  width: 600px;
  margin-right: 10px;
}
.l-fixed #aside {
  width: 200px
}</p>
<pre><code>3. **Module**
    * 모듈과 관련된 스타일 정의
    * 스타일 재사용을 위한 요소다
    * Block, Element, Module
    * 재사용을 위해 ID와 element 사용 금지(만약, element 셀렉터를 사용해야 한다면, .box &gt; span 처럼 child 셀렉터를 사용)
```html
&lt;div class=&quot;forder&quot;&gt;
    &lt;span&gt;Forder Name&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;box&quot;&gt;
...
&lt;/div&gt;
&lt;div class=&quot;basket&quot;&gt;
...
&lt;/div&gt;</code></pre><pre><code class="language-css">.folder &gt;span {
  padding-left: 20px;
  background: url(icon.png);
}</code></pre>
<ol start="4">
<li><strong>State</strong><ul>
<li>Hidden, expend, active, hover 등의 상태에서 사용을 나타내는 스타일 정의</li>
<li>Class명에 suffix “is-” 또는 “s-”를 붙여서 사용<pre><code class="language-html">&lt;div class=&quot;btn_area&quot;&gt;
&lt;a href=&quot;#&quot; class=&quot;btn btn_good is-active&quot;&gt;좋아요버튼&lt;/a&gt;
&lt;a href=&quot;#&quot; class=&quot;btn btn_bad&quot;&gt;나빠요버튼&lt;/a&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">.btn {
display: inline-block;
background:#ddd;
border-radius:4px;
}
.btn.is-active{
background:#43f837;
}
.btn.is-hidden {
display: none;
}</code></pre>
</li>
</ul>
</li>
<li><strong>Theme</strong><ul>
<li>사이트의 전반적인 look과 feel 제어</li>
<li>색이나 이미지를 불변하는 스타일과 분리 → 기존의 스타일을 재선언 할 수 있다.</li>
<li>적용 점위가 넓으면 &#39;theme-&#39; suffix를 붙인다.<pre><code class="language-css">.mod {
border: 1px solid;
}
</code></pre>
</li>
</ul>
</li>
</ol>
<p>.mod {
    border-color:blue
}</p>
<pre><code>
## ❗유의사항
* 파생된 선택자 사용 금지
* ID 사용 금지
* !important 사용 금지
* class명은 의미있게, 다른이가 이해할 수 있도록 선언

## SAMCSS 장단점
### 장점
* **범주화를 통한 패턴화:** 5개의 범주화(Base, Layout, Module, State, Theme)를 통해 알아보기 쉽고 재사용 가능한 컴포넌트를 작성할 수 있다.
* **모듈 및 요소의 상태 확인:** State 규칙을 통해 해당 요소의 상태까지 예측할 수 있으며,
이는 자바스크립트 훅을 추가하여 이벤트를 예측하기 쉽게할 수 있다.

### 단점
* 규칙에 대한 종속성
* 규칙으로 CSS 작성에 제한을 둘 수 있다.


-----

# 📝 OOCSS(Object Oriented CSS)
* Object Oriented CSS의 약자
* Nicole Sullivan에 의해 개발된 프레임워크
* CSS를 모듈 방식으로 코딩하여 중복을 최소화하는 기법

1. **표현과 구조의 분리(Separate structure and skin)**
표현은 시각적 속성(colors, fonts, shadows, gradients 등)을 얘기하며, 구조는 (width, height, padding, margin 등) 요소의 크기 및 위치를 말함. 

2. **컨테이너와 콘텐츠의 분리(Separation of Container and Content)**
컨테이너란 스타일의 적용 범위를 제한하는 범주이며, 내용물이란 컨테이너로 인해 제한된 스타일의 범주를 말한다.

## OOCSS 장단점
### 장점
* **확장성:** OOCSS를 사용하면 각 요소를 고려하지 않고 여러 요소를 자유롭게 혼합하고 다시 적용 할 수 있다. 따라서 한 프로젝트에서 다른 개발자로 프로젝트가 전달 될 때마다 CSS를 더 많이 쌓는 대신에, 프로젝트의 신규 사용자는 이전에 이미 추상화 한 것을 다시 사용할 수 있다.

* **재사용성과 속도:** CSS 파일은 웹 사이트가 복잡 해짐에 따라 기하 급수적으로 확장되는 경우가 있다. 특이성은 중요하지만 CSS 파일에는 필요한 것보다 더 많은 정보가 포함되는 경우가 많다.
OOCSS는 DRY(Don&#39;t Repeat Yourself)에 입각하여, CSS의 재사용성과 효율 및 속도를 향상시킬 수 있다.

### 단점
* **클래스(class)의 복잡화:** 클래스가 생성되는 방식에는 훨씬 더 많은 분리가 있기 때문에 모든 스타일 요소를 설명하기 위해 요소에 여러 클래스를 추가해야 할 수도 있다. 이는 마크업을 혼란스럽게 만들 수 있으며, OOCSS가 익숙치 않은 경우 혼동을 줄 수 있다.



&gt; [참고 url](https://medium.com/witinweb/css-%EB%B0%A9%EB%B2%95%EB%A1%A0-1-bem-block-element-modifier-1c03034e65a1)
[참고 url](https://wit.nts-corp.com/2015/04/16/3538)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[CSS Grid]]></title>
            <link>https://velog.io/@dev_jihee/CSS-Grid</link>
            <guid>https://velog.io/@dev_jihee/CSS-Grid</guid>
            <pubDate>Fri, 21 Jan 2022 14:44:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p> <a href="https://heropy.blog/2019/08/17/css-grid/">HEROPY</a>, [1분코딩] (<a href="https://studiomeal.com/archives/533">https://studiomeal.com/archives/533</a>) 을 참고하여 작성했습니다. </p>
</blockquote>
<p>Flex와 Grid의 큰 차이점은 Flex는 한 방향 레이아웃 시스템이고 (1차원)
Grid는 두 방향(가로-세로) 레이아웃 시스템 (2차원 행과 열)</p>
<blockquote>
<p>CSS Grid는 예전부터 핵(Hack)으로 불린 다양한 레이아웃 대체 방식들을 해결하기 위해 만들어진 특별한 CSS 모듈입니다.</p>
</blockquote>
<h1 id="grid-properties">Grid Properties</h1>
<h2 id="grid-container">Grid Container</h2>
<blockquote>
<p>부모 요소인 div.container를 Grid Container(그리드 컨테이너)라고 부르고,
자식 요소인 div.item들을 Grid Item(그리드 아이템)이라고 부릅니다.
<strong>“컨테이너가 Grid의 영향을 받는 전체 공간이고, 설정된 속성에 따라 각각의 아이템들이 어떤 형태로 배치되는 것”</strong>이라고 생각하시면 됩니다.</p>
</blockquote>
<table>
<thead>
<tr>
<th align="left">속성</th>
<th align="left">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">display</td>
<td align="left">그리드 컨테이너(Container)를 정의</td>
</tr>
<tr>
<td align="left">grid-template-rows</td>
<td align="left">명시적 행(Track)의 크기를 정의</td>
</tr>
<tr>
<td align="left">grid-template-columns</td>
<td align="left">명시적 열(Track)의 크기를 정의</td>
</tr>
<tr>
<td align="left">grid-template-areas</td>
<td align="left">영역(Area) 이름을 참조해 템플릿 생성</td>
</tr>
<tr>
<td align="left">grid-template</td>
<td align="left">grid-template-xxx의 단축 속성</td>
</tr>
<tr>
<td align="left">row-gap(grid-row-gap)</td>
<td align="left">행과 행 사이의 간격(Line)을 정의</td>
</tr>
<tr>
<td align="left">column-gap(grid-column-gap)</td>
<td align="left">열과 열 사이의 간격(Line)을 정의</td>
</tr>
<tr>
<td align="left">gap(grid-gap)</td>
<td align="left">xxx-gap의 단축 속성</td>
</tr>
<tr>
<td align="left">grid-auto-rows</td>
<td align="left">암시적인 행(Track)의 크기를 정의</td>
</tr>
<tr>
<td align="left">grid-auto-columns</td>
<td align="left">암시적인 열(Track)의 크기를 정의</td>
</tr>
<tr>
<td align="left">grid-auto-flow</td>
<td align="left">자동 배치 알고리즘 방식을 정의</td>
</tr>
<tr>
<td align="left">grid</td>
<td align="left">grid-template-xxx과 grid-auto-xxx의 단축 속성</td>
</tr>
<tr>
<td align="left">align-content</td>
<td align="left">그리드 콘텐츠(Grid Contents)를 수직(열 축) 정렬</td>
</tr>
<tr>
<td align="left">justify-content</td>
<td align="left">그리드 콘텐츠를 수평(행 축) 정렬</td>
</tr>
<tr>
<td align="left">place-content</td>
<td align="left">align-content와 justify-content의 단축 속성</td>
</tr>
<tr>
<td align="left">align-items</td>
<td align="left">그리드 아이템(Items)들을 수직(열 축) 정렬</td>
</tr>
<tr>
<td align="left">justify-items</td>
<td align="left">그리드 아이템들을 수평(행 축) 정렬</td>
</tr>
<tr>
<td align="left">place-items</td>
<td align="left">align-items와 justify-items의 단축 속성</td>
</tr>
</tbody></table>
<h3 id="display-grid">display: grid;</h3>
<p>Grid Container(컨테이너)를 정의합니다.
정의된 컨테이너의 자식 요소들은 자동으로 Grid Items(아이템)로 정의됩니다.</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="center">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">grid</td>
<td align="center">Block 특성의 Grid Container를 정의</td>
</tr>
<tr>
<td align="left">inline-grid</td>
<td align="center">Inline 특성의 Grid Container를 정의</td>
</tr>
</tbody></table>
<h3 id="grid-template-rows-grid-template-columns">grid-template-rows, grid-template-columns</h3>
<ul>
<li><strong>grid-template-rows</strong>는 행(row)의 배치</li>
<li><strong>grid-template-columns</strong>는 열(column)의 배치</li>
<li>fr(fraction, 공간 비율) 단위 사용 가능</li>
<li>repeat() 함수를 사용 가능</li>
</ul>
<pre><code class="language-css">// column을 200px, 200px, 500px
grid-template-columns: 200px 200px 500px;

// 1fr 1fr 1fr은 균일하게 1:1:1 비율인 3개의 column을 만든다.
grid-template-columns: 1fr 1fr 1fr;

// 고정크기와 가변크기를 섞어서 사용 가능
grid-template-columns: 100px 2fr 1fr;

.container {
  grid-template-rows: repeat(3, 100px);
  grid-template-columns: repeat(4, 1fr 2fr 3fr);
  /* grid-template-columns: 1fr 2fr 3fr 1fr 2fr 3fr 1fr 2fr 3fr 1fr 2fr 3fr; */
}</code></pre>
<h3 id="grid-template-areas">grid-template-areas</h3>
<p>지정된 그리드 영역 이름(grid-area)을 참조해 그리드 템플릿을 생성합니다.</p>
<blockquote>
<p>⚠<code>grid-area</code>는 Grid Container가 아닌 Grid Item에 적용하는 속성입니다.</p>
</blockquote>
<pre><code class="language-css">//.(마침표)를 사용하거나 명시적으로 none을 입력해 빈 영역을 정의
.container {
  display: grid;
  grid-template-rows: repeat(4, 100px);
  grid-template-columns: repeat(3, 1fr);
  grid-template-areas:
    &quot;header header header&quot;
    &quot;main . .&quot;
    &quot;main . aside&quot;
    &quot;footer footer footer&quot;;
}
header { grid-area: header; }
main   { grid-area: main;   }
aside  { grid-area: aside;  }
footer { grid-area: footer; }</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/6bbf5b7f-547a-417a-b83b-52eb625b51e5/image.png" alt=""></p>
<h3 id="grid-template">grid-template</h3>
<p><code>grid-template-rows</code>, <code>grid-template-columns</code> 그리고 <code>grid-template-areas</code>의 단축 속성입니다.</p>
<pre><code class="language-css">.container {
  grid-template:
    [1행시작선이름] &quot;AREAS&quot; 행너비 [1행끝선이름]
    [2행시작선이름] &quot;AREAS&quot; 행너비 [2행끝선이름]
    / &lt;grid-template-columns&gt;;
}</code></pre>
<pre><code class="language-css">.container {
  display: grid;
  grid-template:
    &quot;header header header&quot; 80px
    &quot;main main aside&quot; 350px
    &quot;footer footer footer&quot; 130px
    / 2fr 100px 1fr;
}
header { grid-area: header; }
main   { grid-area: main; }
aside  { grid-area: aside; }
footer { grid-area: footer; }</code></pre>
<p>위 예제의 컨테이너는 다음과 같이 해석할 수 있다.</p>
<pre><code class="language-css">.container {
  display: grid;
  grid-template-rows: 80px 350px 130px;
  grid-template-columns: 2fr 100px 1fr;
  grid-template-areas:
    &quot;header header header&quot;
    &quot;main main aside&quot;
    &quot;footer footer footer&quot;;
}</code></pre>
<h3 id="row-gap-column-gap-gap간격-만들기">row-gap, column-gap, gap(간격 만들기)</h3>
<h4 id="row-gapgrid-row-gap">row-gap(grid-row-gap)</h4>
<p>각 행과 행 사이의 간격(Gutter)을 지정</p>
<blockquote>
<p>더 명확하게는 그리드 선(Grid Line)의 크기를 지정한다고 표현할 수 있습니다.</p>
</blockquote>
<h4 id="column-gapgrid-column-gap">column-gap(grid-column-gap)</h4>
<p>각 열과 열 사이의 간격(Gutter)을 지정</p>
<h4 id="gapgrid-gap">gap(grid-gap)</h4>
<p>각 행과 행, 열과 열 사이의 간격(Gutter)을 지정</p>
<pre><code class="language-css">.container {
  gap: &lt;grid-row-gap&gt; &lt;grid-column-gap&gt;;
}</code></pre>
<pre><code class="language-css">.container {
  display: grid;
  grid-template-rows: repeat(2, 150px);
  grid-template-columns: repeat(3, 1fr);
  gap: 20px 10px;
}
/* 하나의 값으로 통일할 수 있습니다. */
.container {
  gap: 10px;  /* row-gap: 10px; + column-gap: 10px; */
}
/* 하나의 값만 적용하고자 한다면 다음과 같이 사용할 수 있습니다. */
.container {
  gap: 10px 0; /* row-gap */
  gap: 0 10px; /* column-gap */
}
</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/21d795ed-69d0-460c-a7ec-3de955af888c/image.png" alt=""></p>
<h3 id="grid-auto-rows-grid-auto-columns-그리드-형태를-자동으로-정의">grid-auto-rows, grid-auto-columns (그리드 형태를 자동으로 정의)</h3>
<h4 id="grid-auto-rows">grid-auto-rows</h4>
<p>암시적 행(Track)의 크기를 정의합니다.
아이템(Item)이 grid-template-rows로 정의한 명시적 행 외부에 배치되는 경우 암시적 행의 크기가 적용됩니다.</p>
<pre><code class="language-css">.container {
  width: 300px;
  height: 200px;
  display: grid;
  grid-template-rows: 100px 100px; /* 명시적 2개 행 정의 */
  grid-template-columns: 150px 150px; /* 명시적 2개 열 정의 */
  grid-auto-rows: 100px; /* 그 외(암시적) 행의 크기 정의 */
}
.item:nth-child(3) {
  grid-row: 3 / 4;
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/d23e123e-3fdd-4c3a-842d-ad2e1f8f23fd/image.png" alt=""></p>
<h4 id="grid-auto-columns">grid-auto-columns</h4>
<p>암시적 열(Track)의 크기를 정의합니다.
아이템(Item)이 grid-template-columns로 정의한 명시적 열 외부에 배치되는 경우 암시적 열의 크기가 적용됩니다.</p>
<pre><code class="language-css">.container {
  width: 300px;
  height: 200px;
  display: grid;
  grid-template-rows: 100px 100px;
  grid-template-columns: 150px 150px;
  grid-auto-rows: 100px;
  grid-auto-columns: 100px;
}
.item:nth-child(3) {
  grid-row: 3 / 4;
  grid-column: 3 / 4;
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/c3fe0cfa-a2fd-4d7f-b915-abf2da7cf54e/image.png" alt=""></p>
<h3 id="grid-auto-flow-자동-배치">grid-auto-flow (자동 배치)</h3>
<p>배치하지 않은 아이템(Item)을 어떤 방식의 ‘자동 배치 알고리즘’으로 처리할지 정의합니다.</p>
<blockquote>
<p>배치한 아이템은 grid-area(이하 개별 속성 포함)를 사용한 아이템을 의미합니다.</p>
</blockquote>
<ul>
<li>row: 각 행 축을 따라 차례로 배치</li>
<li>column: 각 열 축을 따라 차례로 배치    </li>
<li>row dense(dense): 각 행 축을 따라 차례로 배치, 빈 영역 메움!    </li>
<li>column dense각 열 축을 따라 차례로 배치, 빈 영역 메움!</li>
</ul>
<pre><code class="language-css">/* For column &amp; column dense */
.container {
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  grid-template-columns: repeat(3, 1fr);
  grid-auto-flow: column || column dense;
}
.item:nth-child(1) {
  grid-column: 2 / span 2;
}
.item:nth-child(2) {
  grid-column: span 2;
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/7345901a-3077-4290-8444-56fe990ecfa9/image.png" alt=""></p>
<h3 id="grid">grid</h3>
<p>grid-template-xxx과 grid-auto-xxx의 단축 속성입니다.</p>
<pre><code class="language-css">.container {
  grid: &lt;grid-template&gt;;
  grid: &lt;grid-template-rows&gt; / &lt;grid-auto-flow&gt; &lt;grid-auto-columns&gt;;
  grid: &lt;grid-auto-flow&gt; &lt;grid-auto-rows&gt; / &lt;grid-template-columns&gt;;
}</code></pre>
<h2 id="grid-items">Grid Items</h2>
<table>
<thead>
<tr>
<th align="left">속성</th>
<th align="left">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">grid-row-start</td>
<td align="left">그리드 아이템(Item)의 행 시작 위치 지정</td>
</tr>
<tr>
<td align="left">grid-row-end</td>
<td align="left">그리드 아이템의 행 끝 위치 지정</td>
</tr>
<tr>
<td align="left">grid-row</td>
<td align="left">grid-row-xxx의 단축 속성(행 시작/끝 위치)</td>
</tr>
<tr>
<td align="left">grid-column-start</td>
<td align="left">그리드 아이템의 열 시작 위치 지정</td>
</tr>
<tr>
<td align="left">grid-column-end</td>
<td align="left">그리드 아이템의 열 끝 위치 지정</td>
</tr>
<tr>
<td align="left">grid-column</td>
<td align="left">grid-column-xxx의 단축 속성(열 시작/끝 위치)</td>
</tr>
<tr>
<td align="left">grid-area</td>
<td align="left">영역(Area) 이름을 설정하거나, grid-row와 grid-column의 단축 속성</td>
</tr>
<tr>
<td align="left">align-self</td>
<td align="left">단일 그리드 아이템을 수직(열 축) 정렬</td>
</tr>
<tr>
<td align="left">justify-self</td>
<td align="left">단일 그리드 아이템을 수평(행 축) 정렬</td>
</tr>
<tr>
<td align="left">place-self</td>
<td align="left">align-self와 justify-self의 단축 속성</td>
</tr>
<tr>
<td align="left">order</td>
<td align="left">그리드 아이템의 배치 순서를 지정</td>
</tr>
<tr>
<td align="left">z-index</td>
<td align="left">그리드 아이템의 쌓이는 순서를 지정</td>
</tr>
</tbody></table>
<h3 id="grid-row-start-grid-row-end-grid-column-start-grid-column-end">grid-row-start, grid-row-end, grid-column-start, grid-column-end</h3>
<p>그리드 아이템(Item)을 배치하기 위해 그리드 선(Line)의 ‘시작 위치’와 ‘끝 위치’를 지정합니다.
‘숫자’를 지정하거나, ‘선 이름’을 지정하거나, span 키워드를 사용합니다.</p>
<pre><code class="language-css">.item:nth-child(1) {
  /* Row 1번에서 3번(1+2=3)까지 */
  grid-row-start: 1;
  grid-row-end: span 2;

  /* Column 2번에서 3번(2+1=3)까지 */
  grid-column-start: 2;
  /* grid-column-end: span 1; (생략) */
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/6505d69d-cd31-4fe3-a351-eb2aafb1fc89/image.png" alt="">
span 키워드를 ‘시작 위치’에 작성하고, ‘끝 위치’를 명시해서 확장할(-) 수도 있습니다.</p>
<pre><code class="language-css">.item:nth-child(1) {
  /* Column 3번에서 2번(3-1=2)까지 */
  /* grid-row-start: span 1; (생략) */
  grid-row-end: 3;

  /* Column 4번에서 2번(4-2=2)까지 */
  grid-column-start: span 2;
  grid-column-end: 4;
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/be2473a6-ce3c-4861-bb2f-3781228f3564/image.png" alt=""></p>
<h3 id="grid-row">grid-row</h3>
<p>grid-row-start과 grid-row-end의 단축 속성입니다.
각 속성을 /로 구분하는 것에 주의하세요.</p>
<pre><code class="language-css">.item {
  grid-row: &lt;grid-row-start&gt; / &lt;grid-row-end&gt;;
}

// 각 코드 블록 내 아이템(.item)들은 모두 같은 의미입니다.

.item {
  grid-row-start: 1;
  grid-row-end: 2;
}
.item {
  grid-row: 1 / 2;
}

------------------------
.item {
  grid-row-start: 2;
  grid-row-end: span 3;
}
.item {
  grid-row: 2 / span 3;
}
.item {
  grid-row: 2 / 5;
}
------------------------
.item {
  grid-row-start: span 3;
  grid-row-end: 4;
}
.item {
  grid-row: span 3 / 4;
}
.item {
  grid-row: 1 / 4;
}
------------------------
</code></pre>
<h3 id="grid-column">grid-column</h3>
<p>grid-column-start과 grid-column-end의 단축 속성입니다.
각 속성을 /로 구분하는 것에 주의하세요.</p>
<pre><code class="language-css">.item {
  grid-column: &lt;grid-column-start&gt; / &lt;grid-column-end&gt;;
}
------------------------
.item {
  grid-column-start: -1;
  grid-column-end: -3;
}
.item {
  grid-column: -1 / -3;
}
.item {
  /* Column -1번에서 -3번(-1-2=-3)까지 */
  grid-column: span 2 / -1;
}
------------------------
// 각 코드 블록 내 아이템(.item)들은 모두 같은 의미입니다.
// 음수 결과를 위해 span 키워드를 ‘시작 위치’에 작성함에 주의하세요!

.item {
  grid-column-start: 2;
  grid-column-end: -1;
}
.item {
  /* Column 2번에서 끝(-1번)까지 */
  grid-column: 2 / -1;
}</code></pre>
<h3 id="grid-area">grid-area</h3>
<p>grid-row-start, grid-column-start, grid-row-end 그리고 grid-column-end의 단축 속성입니다.
혹은 grid-template-areas가 참조할 영역(Area) 이름을 설정할 수도 있습니다.
영역 이름을 설정할 경우 grid-row와 grid-column 개념은 무시됩니다.</p>
<h3 id="align-self-개별-아이템-세로-정렬">align-self (개별 아이템 세로 정렬)</h3>
<p>해당 아이템을 세로(column축) 방향으로 정렬합니다. 아이템에 적용합니다.</p>
<pre><code class="language-css">.item {
    align-self: stretch;
    /* align-self: start; */
    /* align-self: center; */
    /* align-self: end; */
}</code></pre>
<h3 id="justify-self-개별-아이템-가로-정렬">justify-self (개별 아이템 가로 정렬)</h3>
<p>해당 아이템을 가로(row축) 방향으로 정렬합니다. 아이템에 적용합니다.</p>
<pre><code class="language-css">.item {
    justify-self: stretch;
    /* justify-self: start; */
    /* justify-self: center; */
    /* justify-self: end; */
}</code></pre>
<h3 id="place-self">place-self</h3>
<p>align-self와 justify-self를 같이 쓸 수 있는 단축 속성이예요.
align-self, justify-self의 순서로 작성하고, 하나의 값만 쓰면 두 속성 모두에 적용됩니다.</p>
<pre><code class="language-css">.item {
    place-self: start center;
}</code></pre>
<h3 id="order">order</h3>
<p>그리드 아이템이 자동 배치되는 순서를 변경할 수 있습니다.
숫자가 작을수록 앞서 배치됩니다.</p>
<h3 id="z-index">z-index</h3>
<p>z-index 속성을 이용해 아이템이 쌓이는 순서를 변경할 수 있습니다.</p>
<pre><code class="language-css">.item:nth-child(1) {
  grid-area: 1 / 1 / 2 / 3;
}
.item:nth-child(2) {
  grid-area: 1 / 2 / 3 / 3;
  z-index: 1;
}
.item:nth-child(3) {
  grid-area: 2 / 2 / 3 / 4;
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/466e605a-4e04-4f06-83d7-f593c7fab339/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS Flex]]></title>
            <link>https://velog.io/@dev_jihee/CSS-Flex</link>
            <guid>https://velog.io/@dev_jihee/CSS-Flex</guid>
            <pubDate>Thu, 20 Jan 2022 14:44:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p> <a href="https://heropy.blog/2018/11/24/css-flexible-box/">HEROPY</a>, [1분코딩] (<a href="https://studiomeal.com/archives/197">https://studiomeal.com/archives/197</a>) 을 참고하여 작성했습니다. </p>
</blockquote>
<p>📝FlexBox란?</p>
<blockquote>
<p>Flexible Box, Flexbox 라고 부르며 기존보다 세련된 레이아웃 배치 기능이다. 유연하게 속성들을 배치하여 레이아웃을 잡는 아주 유용한 기능이다.</p>
</blockquote>
<h1 id="flex-컨테이너에-적용하는-속성들">Flex 컨테이너에 적용하는 속성들</h1>
<p>Flex Container에 적용하기(부모)</p>
<table>
<thead>
<tr>
<th align="left">속성</th>
<th align="left">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">display</td>
<td align="left">Flex Container를 정의</td>
</tr>
<tr>
<td align="left">flex-flow</td>
<td align="left">flex-direction와 flex-wrap의 단축 속성</td>
</tr>
<tr>
<td align="left">flex-direction</td>
<td align="left">Flex Items의 주 축(main-axis)을 설정</td>
</tr>
<tr>
<td align="left">flex-wrap</td>
<td align="left">Flex Items의 여러 줄 묶음(줄 바꿈) 설정</td>
</tr>
<tr>
<td align="left">justify-content</td>
<td align="left">주 축(main-axis)의 정렬 방법을 설정</td>
</tr>
<tr>
<td align="left">align-content</td>
<td align="left">교차 축(cross-axis)의 정렬 방법을 설정(2줄 이상)</td>
</tr>
<tr>
<td align="left">align-items</td>
<td align="left">교차 축(cross-axis)에서 Items의 정렬 방법을 설정(1줄)</td>
</tr>
</tbody></table>
<h2 id="display-flex">display: flex;</h2>
<p>display 속성으로 Flex Container를 정의 할 수 있다.</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="center">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">flex</td>
<td align="center">Block 특성의 Flex Container를 정의</td>
</tr>
<tr>
<td align="left">inline-flex</td>
<td align="center">Inline 특성의 Flex Container를 정의</td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/57e98b85-3055-4820-8fba-a8f5afd67429/image.png" alt=""></td>
<td align="center"></td>
</tr>
</tbody></table>
<h2 id="flex-flow">flex-flow</h2>
<p>flex-direction과 flex-wrap을 한꺼번에 지정할 수 있는 단축 속성입니다.</p>
<pre><code class="language-css">.container {
    flex-flow: row wrap;
    /* 아래의 두 줄을 줄여 쓴 것 */
    /* flex-direction: row; */
    /* flex-wrap: wrap; */
}</code></pre>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">flex-direction</td>
<td align="left">Items의 주 축(main-axis)을 설정</td>
<td align="left">row</td>
</tr>
<tr>
<td align="left">flex-wrap</td>
<td align="left">Items의 여러 줄 묶음(줄 바꿈) 설정</td>
<td align="left">nowrap</td>
</tr>
</tbody></table>
<h2 id="flex-direction-배치-방향-설정">flex-direction (배치 방향 설정)</h2>
<p>Items의 주 축(main-axis)을 설정합니다.
아이템들이 배치되는 방향에 대한 속성입니다.</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">row</td>
<td align="left">Itmes를 수평축(왼쪽에서 오른쪽으로)으로 표시</td>
<td align="left">row</td>
</tr>
<tr>
<td align="left">row-reverse</td>
<td align="left">Items를 row의 반대 축으로 표시</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">column</td>
<td align="left">Items를 수직축(위에서 아래로)으로 표시</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">column-reverse</td>
<td align="left">Items를 column의 반대 축으로 표시</td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/24c50e4d-2814-462f-a989-2d287d002eec/image.png" alt=""></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<h2 id="flex-wrap줄넘김-처리-설정">flex-wrap(줄넘김 처리 설정)</h2>
<p>컨테이너가 더 이상 아이템들을 한 줄에 담을 여유 공간이 없을 때 아이템 줄바꿈을 어떻게 할지 결정하는 속성입니다.</p>
<pre><code class="language-css">.container {
    flex-wrap: nowrap;
    /* flex-wrap: wrap; */
    /* flex-wrap: wrap-reverse; */
}</code></pre>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">nowrap</td>
<td align="left">모든 Itmes를 여러 줄로 묶지 않음(한 줄에 표시)</td>
<td align="left">nowrap</td>
</tr>
<tr>
<td align="left">wrap</td>
<td align="left">Items를 여러 줄로 묶음</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">wrap-reverse</td>
<td align="left">Items를 wrap의 역 방향으로 여러 줄로 묶음</td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/68eb17b9-2564-4682-8c76-bc1fba2b5e01/image.png" alt=""></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<h2 id="justify-content메인축-방향-정렬">justify-content(메인축 방향 정렬)</h2>
<pre><code class="language-css">.container {
    justify-content: flex-start;
    /* justify-content: flex-end; */
    /* justify-content: center; */
    /* justify-content: space-between; */
    /* justify-content: space-around; */
    /* justify-content: space-evenly; */
}</code></pre>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">flex-start</td>
<td align="left">Items를 시작점(flex-start)으로 정렬</td>
<td align="left">flex-start</td>
</tr>
<tr>
<td align="left">flex-end</td>
<td align="left">Items를 끝점(flex-end)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">center</td>
<td align="left">Items를 가운데 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">space-between</td>
<td align="left">시작 Item은 시작점에, 마지막 Item은 끝점에 정렬되고 나머지 Items는 사이에 고르게 정렬됨</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">space-around</td>
<td align="left">Items를 균등한 여백을 포함하여 정렬</td>
<td align="left"></td>
</tr>
</tbody></table>
<p><img src="https://images.velog.io/images/dev_jihee/post/10fa94f3-f86b-4c2f-a081-c5a99823b27d/image.png" alt=""></p>
<h2 id="align-content-여러-행-정렬">align-content (여러 행 정렬)</h2>
<p>flex-wrap: wrap;이 설정된 상태에서, 아이템들의 행이 2줄 이상 되었을 때의 수직축 방향 정렬을 결정하는 속성입니다.
⚠ Items가 한 줄일 경우 <code>align-itmes</code> 속성을 사용!</p>
<pre><code class="language-css">.container {
    flex-wrap: wrap;
    align-content: stretch;
    /* align-content: flex-start; */
    /* align-content: flex-end; */
    /* align-content: center; */
    /* align-content: space-between; */
    /* align-content: space-around; */
    /* align-content: space-evenly; */
}</code></pre>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">stretch</td>
<td align="left">Container의 교차 축을 채우기 위해 Items를 늘림</td>
<td align="left">stretch</td>
</tr>
<tr>
<td align="left">flex-start</td>
<td align="left">Items를 시작점(flex-start)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">flex-end</td>
<td align="left">Items를 끝점(flex-end)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">center</td>
<td align="left">Items를 가운데 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">space-between</td>
<td align="left">시작 Item은 시작점에, 마지막 Item은 끝점에 정렬되고 나머지 Items는 사이에 고르게 정렬됨</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">space-around</td>
<td align="left">Items를 균등한 여백을 포함하여 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/f6b40404-ffd2-478e-9c44-8e4af79eeffe/image.png" alt=""></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<h2 id="align-items-수직축-방향-정렬">align-items (수직축 방향 정렬)</h2>
<p>수직축 방향으로 아이템을들 정렬하는 속성
Items가 한 줄일 경우 많이 사용합니다.</p>
<blockquote>
<p>⚠ 주의할 점은 <code>Items</code>가 <code>flex-wrap</code>을 통해 여러 줄(2줄 이상)일 경우에는 <code>align-content</code> 속성이 우선합니다.
따라서 <code>align-items</code>를 사용하려면 <code>align-content</code> 속성을 기본값(stretch)으로 설정해야 합니다.</p>
</blockquote>
<pre><code class="language-css">.container {
    align-items: stretch;
    /* align-items: flex-start; */
    /* align-items: flex-end; */
    /* align-items: center; */
    /* align-items: baseline; */
}</code></pre>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">stretch</td>
<td align="left">Container의 교차 축을 채우기 위해 Items를 늘림</td>
<td align="left">stretch</td>
</tr>
<tr>
<td align="left">flex-start</td>
<td align="left">Items를 시작점(flex-start)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">flex-end</td>
<td align="left">Items를 끝점(flex-end)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">center</td>
<td align="left">Items를 가운데 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">baseline</td>
<td align="left">Items를 문자 기준선에 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/3eca31b2-6251-4ca6-89c4-ff40f26f1820/image.png" alt=""></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<hr>
<h1 id="flex-아이템에-적용하는-속성들">Flex 아이템에 적용하는 속성들</h1>
<table>
<thead>
<tr>
<th align="left">속성</th>
<th align="left">의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">order</td>
<td align="left">Flex Item의 순서를 설정</td>
</tr>
<tr>
<td align="left">flex</td>
<td align="left">fflex-grow, flex-shrink, flex-basis의 단축 속성</td>
</tr>
<tr>
<td align="left">flex-grow</td>
<td align="left">Flex Item의 증가 너비 비율을 설정</td>
</tr>
<tr>
<td align="left">flex-shrink</td>
<td align="left">Flex Item의 감소 너비 비율을 설정</td>
</tr>
<tr>
<td align="left">justify-content</td>
<td align="left">주 축(main-axis)의 정렬 방법을 설정</td>
</tr>
<tr>
<td align="left">flex-basis</td>
<td align="left">Flex Item의 (공간 배분 전) 기본 너비 설정</td>
</tr>
<tr>
<td align="left">align-self</td>
<td align="left">교차 축(cross-axis)에서 Item의 정렬 방법을 설정)</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<h2 id="order-배치-순서">order (배치 순서)</h2>
<p>Item의 순서를 설정합니다.
Item에 숫자를 지정하고 숫자가 클수록 순서가 밀리고 음수가 허용됩니다.</p>
<blockquote>
<p>HTML 구조와 상관없이 순서를 변경할 수 있기 때문에 유용합니다.
단, &quot;시각적&quot; 순서일 뿐, HTML 자체 구조를 바꾸는 것은 아니므로
접근성 측면에서 사용에 주의해야한다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/dev_jihee/post/4fae8aa3-0fde-44a1-9976-fbc7d16b50da/image.png" alt=""></p>
<h2 id="flex-grow-유연하게-늘리기">flex-grow (유연하게 늘리기)</h2>
<p>Item의 증가 너비 비율을 설정합니다.
숫자가 크면 더 많은 너비를 가집니다.
Item이 가변 너비가 아니거나, 값이 0일 경우 효과가 없습니다.</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">숫자</td>
<td align="left">Item의 증가 너비 비율을 설정</td>
<td align="left">0</td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/f292aed0-e4a1-431e-a14a-b84162021bf1/image.png" alt=""></td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">예를 들어 Item이 3개이고 증가 너비가 각각 1, 2, 1이라면,</td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">첫 번째 Item은 총 너비의 25%(1/4)을,</td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">두 번째 Item은 총 너비의 50%(2/4)를,</td>
<td align="left"></td>
<td align="left"></td>
</tr>
<tr>
<td align="left">세 번째 Item은 총 너비의 25%(1/4)을 가지게 됩니다.</td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
<blockquote>
<p>Item이 두개 일때 두번째 Item은 고정 width값 주고 나머지 Item에 flex-grow: 1 주면 고정 width값을 가지고 있는 두번째 넓이 - 전체화면 = 첫번째 요소가 너비에 자동으로 맞게 설정된다.</p>
</blockquote>
<h2 id="flex-shrink-유연하게-줄이기">flex-shrink (유연하게 줄이기)</h2>
<p>Item이 감소하는 너비의 비율을 설정합니다.
숫자가 크면 더 많은 너비가 감소합니다.
Item이 가변 너비가 아니거나, 값이 0일 경우 효과가 없습니다.</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">숫자</td>
<td align="left">Item의 감소 너비 비율을 설정</td>
<td align="left">1</td>
</tr>
</tbody></table>
<p><img src="https://images.velog.io/images/dev_jihee/post/2256eb6b-850c-4b68-9886-31035ea83105/image.png" alt=""></p>
<h2 id="flex-basis-유연한-박스의-기본-영역">flex-basis (유연한 박스의 기본 영역)</h2>
<p>flex-basis는 Flex 아이템의 기본 크기를 설정합니다(flex-direction이 row일 때는 너비, column일 때는 높이).</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">auto</td>
<td align="left">가변 Item과 같은 너비</td>
<td align="left">auto</td>
</tr>
<tr>
<td align="left">단위</td>
<td align="left">px, em, cm 등 단위로 지정</td>
<td align="left"></td>
</tr>
</tbody></table>
<pre><code class="language-css">.item {
    flex-basis: auto; /* 기본값 */
    /* flex-basis: 0; */
    /* flex-basis: 50%; */
    /* flex-basis: 300px; */
    /* flex-basis: 10rem; */
    /* flex-basis: content; */
}</code></pre>
<p><img src="https://images.velog.io/images/dev_jihee/post/15714d43-c905-44ff-b3a6-f6b7da28d626/image.png" alt=""></p>
<h2 id="flex-단축-속성">flex (단축 속성)</h2>
<p>flex-grow, flex-shrink, flex-basis를 한 번에 쓸 수 있는 축약형 속성입니다.</p>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">flex-grow</td>
<td align="left">Item의 증가 너비 비율을 설정</td>
<td align="left">0</td>
</tr>
<tr>
<td align="left">flex-shrink</td>
<td align="left">Item의 감소 너비 비율을 설정</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">flex-basis</td>
<td align="left">Item의 (공간 배분 전) 기본 너비 설정</td>
<td align="left">auto</td>
</tr>
</tbody></table>
<blockquote>
<p>⚠ 주의할점
flex: 1;이면 flex-shrink와 flex-basis가 생략 되서 기본 값인 <code>flex: 1 1 auto;</code> 가 아니다. 
flex-basis의 기본값은 auto이지만 단축 속성인 flex에서 그 값을 생략할 경우 0이 적용이 되어
<code>flex: 1 1 0;</code>이 된다.</p>
</blockquote>
<pre><code class="language-css">flex: 증가너비 감소너비 기본너비;
.item {
  flex: 1 1 20px;  /* 증가너비 감소너비 기본너비 */
  flex: 1 1;  /* 증가너비 감소너비 */
  flex: 1 20px;  /* 증가너비 기본너비 (단위를 사용하면 flex-basis가 적용됩니다) */
}</code></pre>
<h2 id="align-self-수직축으로-아이템-정렬">align-self (수직축으로 아이템 정렬)</h2>
<table>
<thead>
<tr>
<th align="left">값</th>
<th align="left">의미</th>
<th align="left">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">auto</td>
<td align="left">Container의 align-items 속성을 상속받음</td>
<td align="left">auto</td>
</tr>
<tr>
<td align="left">stretch</td>
<td align="left">Container의 교차 축을 채우기 위해 Item을 늘림</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">flex-start</td>
<td align="left">Item을 각 줄의 시작점(flex-start)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">flex-end</td>
<td align="left">Item을 각 줄의 끝점(flex-end)으로 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">center</td>
<td align="left">Item을 가운데 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">baseline</td>
<td align="left">Item을 문자 기준선에 정렬</td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><img src="https://images.velog.io/images/dev_jihee/post/7e965b53-0f5a-4d67-9807-85953397f4aa/image.png" alt=""></td>
<td align="left"></td>
<td align="left"></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML 의미론]]></title>
            <link>https://velog.io/@dev_jihee/HTML-%EC%9D%98%EB%AF%B8%EB%A1%A0</link>
            <guid>https://velog.io/@dev_jihee/HTML-%EC%9D%98%EB%AF%B8%EB%A1%A0</guid>
            <pubDate>Wed, 12 Jan 2022 13:54:19 GMT</pubDate>
            <description><![CDATA[<h1 id="div-span-요소의-의미">div, span 요소의 의미</h1>
<p>div, span은 아무 의미가 없다.
div, span 요소를 많이 사용 한다는 것은 그만큼 HTML 태그를 의미 적절하게 사용하지 않다고 해석 할 수 있기 때문에 대체할 시멘틱 요소를 사용함으로써 사용 빈도를 줄이는 것이 좋다.</p>
<h2 id="div-요소를-대체할-만한-요소들">div 요소를 대체할 만한 요소들</h2>
<pre><code>h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, 
blockquote, pre, address ....

article, aside, nav, section, hgroup, 
header, footer, main, figure, figcaption, details,
summary, dialog, datalist...
UA{display: block}</code></pre><h2 id="span-요소를-대체할-만한-요소들">span 요소를 대체할 만한 요소들</h2>
<pre><code>a, em/strong, label, q, sub/sup, ins/del,
code, dfn, abbr, cite, kdb, ruby, samp, var, small,
b, u, i, s ...

data, time, mark, output, meter, progress
UA{display: inline|inline-block}</code></pre><hr>
<h1 id="sectioning">SECTIONING</h1>
<ul>
<li>hx, hgroup, header, footer → 섹셔닝은 아니지만 함께 쓰는 요소</li>
<li>article, aside, nav, section → 섹셔닝 요소</li>
</ul>
<h1 id="header-footer">header, footer</h1>
<ul>
<li>header: 도입부, 헤딩, 헤딩그룹, 목차, 검색, 로고</li>
<li>footer: 저자, 저작권, 연락처, 관련문서</li>
</ul>
<p>의미 범위: 섹셔닝 루트(body) 또는 섹셔닝 콘텐츠(article, aside, nav, section)
여러번 사용해도 된다.</p>
<p>** 반드시 필요한 요소는 아니지만 이런 의미일 때 div 대신 사용하길 권장 **</p>
<h1 id="section-article">section, article</h1>
<ul>
<li>section: 제목이 있는 ** 주제별 콘텐츠 그룹 ** 또는 응용 프로그램 영역.</li>
<li>article: 섹션 요소 중 <strong>독립적으로 배포 가능한 완결형 콘텐츠.</strong> 뉴스 기사, 블로그 본문, 사용자의 댓글 등.</li>
<li>용법 : <ul>
<li>중첩 허용 (section 안 section, article 안 article)</li>
<li><strong>h1~6</strong> 요소 사용을 <strong>강력하게 권장</strong>, </li>
<li><strong>header / footer</strong> 요소 사용하는 것은 <strong>선택사항</strong></li>
</ul>
</li>
</ul>
<h1 id="nav">nav</h1>
<ul>
<li>현재 사이트 또는 현재 페이지 일부를 링크하고 있는 주요 탐색 섹션.</li>
<li>빵부스러기 링크, 약관, 저작권 고지 같은 링크는 적절하지 않음.</li>
<li>용법 :  *<em>h1~6 *</em> 요소 요소를 포함하는 것을  *<em>강력하게 권장 *</em></li>
</ul>
<h1 id="aside">aside</h1>
<ul>
<li>페이지의 주된 내용과 관련이 약해서 구분할 필요가 있는 섹션</li>
<li>부수적인 콘텐츠, 관련기사, 광고 등의 내용을 포함할 수 있다</li>
<li>용법 :  *<em>h1~6 *</em> 요소 요소를 포함하는 것을  *<em>강력하게 권장 *</em>
aside도 섹셔닝 콘텐츠이기 때문에 헤딩 요소를 포함하는 것을 강력하게 권장
(ex:배너, 페이지바로가기 링크)</li>
</ul>
<h1 id="main">main</h1>
<ul>
<li>문서의 핵심 주제 또는 애플리케이션의 핵심 기능과 직접 관련있는 콘텐츠 영역을 의미.</li>
<li>페이지마다 반복되지 않는 내용을 포함하여야 한다.</li>
<li>섹셔닝 콘텐츠가 아니므로 h1~6, header, footer 요소의 범위와 관련없음.</li>
<li>하나의 페이지 안에서 하나의 main 요소만 표시 가능</li>
<li>섹셔닝 관련 요소(article, aside, nav, section, header, footer)의 자식이 될 수 없다.</li>
<li>body, div 요소를 제외한 다른 요소의 자손이 될 수 없다.</li>
</ul>
<h1 id="dialog">dialog</h1>
<ul>
<li>dialog 요소는 사용자와 <strong>상호 작용하는 응용 프로그램</strong>(대화상자)을 의미</li>
<li>open 속성을 추가하면 대화 상자가 활성화되고 사용자가 대화 상자를 통해 상호 작용할 수 있다.</li>
<li>보통 입력 양식과 콘트롤을 포함하고 있으며 닫기 기능을 제공한다.</li>
<li>키보드 초점이 요소 내부에서 순환하도록 처리하여야 한다.</li>
</ul>
<h1 id="figure-figcation">figure, figcation</h1>
<ul>
<li>문서의 주된 흐름을 위해 참조하는(부록으로 옮겨도 괜찮은) 독립적인 완결형 요소로서 이미지, 도표, 코드 등의 내용물과 설명(figcaption)을 포함한다.</li>
<li>선택적으로 처음 또는 마지막에 figcaption 요소를 자식 요소로 포함할 수 있고 또는 생략할 수 있다.</li>
<li>figure안에서 figcaption 요소가 선언 된다면 <strong>한 번만</strong> 선언할 수 있다.</li>
</ul>
<h1 id="mark">mark</h1>
<ul>
<li>독자의 주의를 끌기 위한 하이라이트.</li>
<li>현재 독자의 행위나 관심에 따라 강조한 것.</li>
<li>검색 결과 목록에서 사용자가 입력한 키워드.</li>
</ul>
<hr>
<h1 id="etc">etc</h1>
<h2 id="adress">adress</h2>
<ul>
<li>가까운 조상 article 또는 body 요소를 범위로 하는 관련 연락처 정보.</li>
<li>우편 정보를 의미하는 것이 아님에 유의(저작권 정보등이 적합)</li>
<li>흔히 footer 요소에 나타남.</li>
<li>p 요소의 자손이 될 수 없음</li>
</ul>
<p>(p의 요소는 프레이킹 콘텐츠만 담을 수 있는데 address는 프레이징이 아니라서 address안에 p가 올 수는 있지만 p가 address안에 들어갈 수는 없다!)</p>
<h2 id="ins-del">ins, del</h2>
<p>ins: 추가한 내용을 의미
del: 삭제한 내용을 의미</p>
<ul>
<li>콘텐츠 모델이 투명해서 어떤 요소라도 포함할 수 있음(자식요소를 무엇이든 담을 수 있다.)</li>
<li>여러 단락을 한번에 포함하는 것은 부적절하다.</li>
</ul>
<h2 id="progress">progress</h2>
<ul>
<li>계산 또는 사용자 과업의 진척도</li>
<li>원격 호스트의 응답을 기다려야 하는 경우도 있기 때문에 정확하지 않을 수 있다.</li>
<li>낡은 브라우저를 위해 value 값과 별도로 콘텐츠를 제공하는 것이 좋다.</li>
</ul>
<h2 id="b-i-s-u">b, i, s, u</h2>
<ul>
<li>b: 강조할 의도가 없는 볼드. strong 요소 고려</li>
<li>i: 현재 맥락과 다른 분위기. em 요소 고려</li>
<li>s: 정확하지 않거나 관련 없는. del 요소 고려</li>
<li>u: 오타, 중국 고유명사 등의 표기. ins 요소를 고려</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>