<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hb-developer.log</title>
        <link>https://velog.io/</link>
        <description>배우면 바뀐다</description>
        <lastBuildDate>Mon, 26 Jul 2021 11:03:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hb-developer.log</title>
            <url>https://images.velog.io/images/hb-developer/profile/691cbd91-ab5d-4fc4-8924-eb1a084ef974/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hb-developer.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hb-developer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[배열]]></title>
            <link>https://velog.io/@hb-developer/%EB%B0%B0%EC%97%B4-zrh63uz0</link>
            <guid>https://velog.io/@hb-developer/%EB%B0%B0%EC%97%B4-zrh63uz0</guid>
            <pubDate>Mon, 26 Jul 2021 11:03:45 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 내용은 책 <strong>모던 자바스크립트 Deep Dive</strong> 의 내용을 참조했습니다.</p>
</blockquote>
<p>배열 이란 여러 개의 값을 순차적으로 나열한 자료구조다.</p>
<h3 id="배열-과-객체-🎈">배열 과 객체 🎈</h3>
<p>배열도 사실 객체다.
객체는 키와 값으로 이루어져 있다.</p>
<p>배열은 값만 가지고 있지만, 엄밀히 말하면 인덱스라는 키가 자동적으로 부여된다.
즉 배열은 순서를 가지고 있는 객체다.</p>
<h3 id="자바스크립트의-배열🎈">자바스크립트의 배열🎈</h3>
<p>자료구조에서 말하는 배열은 동일한 크기의 메모리 공간이 
빈틈없이 연속적으로 나열된 자료구조를 말한다.</p>
<p>이러한 배열을 <code>밀집 배열(dense array)</code> 이라고 부른다.</p>
<p>자바스크립트의 배열은 연속적이지 않을<code>수</code> 있다.
이러한 배열을 <code>희소 배열(sparse array)</code> 이라고 부른다.</p>
<h3 id="length-프로퍼티🎈">length 프로퍼티🎈</h3>
<p>length 를 임의로 설정할때 벌어지는 일이다.</p>
<p>length 를 임의로 줄일때</p>
<pre><code class="language-js">const arr = [1, 2, 3, 4, 5];

// 현재 length 프로퍼티 값인 5보다 작은 숫자 값 3을 length 프로퍼티에 할당
arr.length = 3;

// 배열의 길이가 5에서 3으로 줄어든다.
console.log(arr); // [1, 2, 3]</code></pre>
<p>length 를 임의로 늘릴때</p>
<pre><code class="language-js">const arr = [1];

// 현재 length 프로퍼티 값인 1보다 큰 숫자 값 3을 length 프로퍼티에 할당
arr.length = 3;

// length 프로퍼티 값은 변경되지만 실제로 배열의 길이가 늘어나지는 않는다.
console.log(arr.length); // 3
console.log(arr); // [1, empty × 2]</code></pre>
<p>실질적으로 값은 1개지만 length 는 3개로 표시된다.
즉 희소 배열 의 length 는 배열의 값보다 무조건 크다.</p>
<h3 id="희소-배열🎈">희소 배열🎈</h3>
<p>일반적인 배열은 자바스크립트 엔진이 최적화를 한다.
하지만 희소 배열은 성능 적으로도 좋지 않고 배열의 이념과도 멀기 때문에 (<code>연속적인 값의 나열</code>)
희소 배열의 사용은 지양 해야 한다.</p>
<h2 id="생성자-함수">생성자 함수</h2>
<h3 id="arrayfrom🎈">Array.from🎈</h3>
<p>Array.from 메서드는 유사 배열 객체 또는 이터러블 객체를 인수로 전달받아 배열로 변환하여 반환한다.</p>
<pre><code class="language-js">// 유사 배열 객체를 변환하여 배열을 생성한다.
Array.from({ length: 2, 0: &#39;a&#39;, 1: &#39;b&#39; }); // -&gt; [&#39;a&#39;, &#39;b&#39;]

// 이터러블을 변환하여 배열을 생성한다. 문자열은 이터러블이다.
Array.from(&#39;Hello&#39;); // -&gt; [&#39;H&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;]</code></pre>
<h3 id="배열의-추가🎈">배열의 추가🎈</h3>
<p>존재하지 않는 인덱스를 사용해 값을 할당하면 새로운 요소가 추가된다.
이때 length 보다 큰값을 할당하면 중간은 비게 되고 그 즉시 희소 배열이 된다.</p>
<pre><code class="language-js">const arr = [0];

// 배열 요소의 추가
arr[1] = 1;

console.log(arr); // [0, 1]
console.log(arr.length); // 2

arr[100] = 100; 

console.log(arr); // [0, 1, empty × 98, 100] &lt;- 희소 배열
console.log(arr.length); // 101 </code></pre>
<p>인덱스는 요소의 위치를 나타내기 때문에 반드시 0이상의 정수를 사용해야 한다.
그렇지 않으면 요소가 아니라 프로퍼티가 생성된다.</p>
<pre><code class="language-js">const arr = [];

// 배열 요소의 추가
arr[0] = 1;
arr[&#39;1&#39;] = 2;

// 프로퍼티 추가
arr[&#39;foo&#39;] = 3;
arr.bar = 4;
arr[1.1] = 5;
arr[-1] = 6;

console.log(arr); // [1, 2, foo: 3, bar: 4, &#39;1.1&#39;: 5, &#39;-1&#39;: 6]

// 프로퍼티는 length에 영향을 주지 않는다.
console.log(arr.length); // 2</code></pre>
<h2 id="메서드-🎁">메서드 🎁</h2>
<p>배열에는 원본에 영향을 주는 메서드와
새롭게 반환하는 메서드가 존재한다.</p>
<h3 id="arrayprototypeindexof-✔"><code>Array.prototype.indexOf</code> ✔</h3>
<ul>
<li>인수로 전달한 값을 처음 발견된 요소의 인덱스를 반환한다.</li>
<li>만약 없으면 -1을 반환한다.</li>
</ul>
<blockquote>
<p>비슷한 메서드로는 <code>array.prototype.includes</code> 가 있다.
<code>indexOf</code> 는 -1 을 조건으로 비교 해야 하지만 
<code>includes</code> 는 존재 자체를 비교 할수 있어서 가독성에 유리하다.</p>
</blockquote>
<h3 id="pop-push--unshift-shift-✔">pop push , unshift shift ✔</h3>
<p><code>LiFo (last in First out)</code> 마지막으로 들어온게 첫번째로 나간다.
<code>push</code> 로 집어넣고 <code>pop</code> 으로 빼낸다</p>
<p><code>FiFo (First In First Out)</code> 처음 들어온게 첫번째로 나간다.
<code>push</code> 로 집어넣고 <code>shift</code> 로 빼낸다.</p>
<h3 id="arrayprototypeconcat-✔">Array.prototype.concat ✔</h3>
<p>배열을 합쳐서 새로운 배열로 반환한다. 즉 원본에 영향을 주지 않는다.</p>
<h3 id="-spread-✔">... spread ✔</h3>
<pre><code class="language-js">let result = [1, 2].concat([3, 4]);
console.log(result); // [1, 2, 3, 4]

// concat 메서드는 ES6의 스프레드 문법으로 대체할 수 있다.
result = [...[1, 2], ...[3, 4]];
console.log(result); // [1, 2, 3, 4]</code></pre>
<p>spread 문법은 원본에 영향을 주지 않으면서 일관성 있게 사용하기 좋다.</p>
<h3 id="arrayprototypesplice-✔">Array.prototype.splice ✔</h3>
<p><code>splice(start,deletecount,itmes)</code>
어디서부터 , 몇개를 지우고 , 무엇을 추가 할지 인자를 받는다.
이때 원본을 직접 변경하며 지운 요소들을 따로 반환 한다.</p>
<pre><code class="language-js">const arr = [1, 2, 3, 4];

// 원본 배열의 인덱스 1부터 2개의 요소를 제거하고 그 자리에 새로운 요소 20, 30을 삽입한다.
const result = arr.splice(1, 2, 20, 30);

// 제거한 요소가 배열로 반환된다.
console.log(result); // [2, 3]
// splice 메서드는 원본 배열을 직접 변경한다.
console.log(arr); // [1, 20, 30, 4]</code></pre>
<h3 id="arrayprototypeslice-✔">Array.prototype.slice ✔</h3>
<p><code>slice(start , end)</code>
어디서부터 , ~전까지 복사후 새로운 배열로 반환한다. 원본 배열을 변경하지 않는다.</p>
<h3 id="arrayprototypejoin-✔">Array.prototype.join ✔</h3>
<p>배열의 모든 요소들을 연결한다.
기본값은 콤마다.
예를들어</p>
<pre><code class="language-js">const elements = [&#39;Fire&#39;, &#39;Air&#39;, &#39;Water&#39;]</code></pre>
<p>이것을 인자 없이 사용하면 요소마다 콤마가 있는 한가지 문자열이 된다. 
만약 콤마 없이 한가지 문자열로 붙이려면 (&#39;&#39;) 인자를 넣어준다.</p>
<pre><code class="language-js">console.log(elements.join());
// expected output: &quot;Fire,Air,Water&quot;

console.log(elements.join(&#39;&#39;));
// expected output: &quot;FireAirWater&quot;

console.log(elements.join(&#39;-&#39;));
// expected output: &quot;Fire-Air-Water&quot;</code></pre>
<h3 id="arrayprototypefill-✔">Array.prototype.fill ✔</h3>
<p>전달 받은 인자를 사용하고자 하는 배열의 요소로 전부 채운다. Array 생성자 함수랑 조합이 좋다
const a = Array(50).fill(0) // 0 50개</p>
<h3 id="arrayprototypeflat-✔">Array.prototype.flat ✔</h3>
<p>중첩배열의 평탄화를 몇번 할지 정한다. 기본값은 1이고 1번 배열을 벗긴다는 뜻이다.</p>
<h2 id="고차함수-메서드-🎁">고차함수 메서드 🎁</h2>
<h3 id="arrayprototypesort-✔">Array.prototype.sort ✔</h3>
<p>원본을 직접 변경하며 오름차순으로 정렬한다.</p>
<h3 id="arrayprototypeforeach-✔">Array.prototype.forEach ✔</h3>
<p>for문 과 거의 동일하지만 forEach는 콜백함수를 받아서 수행한다.
for문 과의 차이점은 3가지가 있다.</p>
<ul>
<li>반환값이 없다. 반환값은 항상 undefined 다. </li>
<li>break continue 를 사용할수 없다. 즉 모든 요소를 빠짐없이 순회한다.</li>
<li>성능이 좋지않다. 하지만 가독성이 좋기때문에
퍼포먼스 가 필요한게 아니면 forEach 사용을 권장한다</li>
</ul>
<h3 id="arrayprototypemap-✔">Array.prototype.map ✔</h3>
<p>forEach 와 거의 동일하다.
배열의 모든 요소를 순회 하면서 인수로 전달받은 콜백함수를 반복 호출한다.
차이점은 1대1로 콜백함수로 매핑한뒤 새로운 배열을 반환한다.</p>
<h3 id="arrayprototypefilter-✔">Array.prototype.filter ✔</h3>
<p>콜백 함수의 반환값이 true 인 요소로만 구성된 새로운 배열을 반환한다.</p>
<h3 id="arrayprototypereduce-✔">Array.prototype.reduce ✔</h3>
<p>모든 요소를 순회하며 인수로 전달받은 콜백 함수를 반복 호출한다.
그리고 나서 하나의 결과값을 만들어 반환한다.</p>
<h3 id="arrayprototypesome-✔">Array.prototype.some ✔</h3>
<p>콜백 함수의 반환값이 단 하나라도 참이면 true 모두 거짓이면 false 를 반환한다.</p>
<h3 id="arrayprototypeevery-✔">Array.prototype.every ✔</h3>
<p>콜백 함수의 반환값이 모두 참이면 true, 단 한 번이라도 거짓이면 false 를 반환한다.</p>
<h3 id="arrayprototypefind-✔">Array.prototype.find ✔</h3>
<p>콜백 함수의 반환값이 true인 첫번째 요소를 반환한다.
만약 요소가 없으면 undefined 를 반환한다.</p>
<h3 id="arrayprototypefindindex-✔">Array.prototype.findIndex ✔</h3>
<p>콜백 함수의 반환값이 true인 첫번째 요소의 인덱스 를 반환한다.
만약 요소가 없으면 -1 를 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FLEXBOX FROGGY]]></title>
            <link>https://velog.io/@hb-developer/FLEXBOX-FROGGY</link>
            <guid>https://velog.io/@hb-developer/FLEXBOX-FROGGY</guid>
            <pubDate>Mon, 28 Jun 2021 09:33:55 GMT</pubDate>
            <description><![CDATA[<p>CSS FLEX 를 익히는 게임을 찾았다.</p>
<p><a href="https://flexboxfroggy.com/#ko">https://flexboxfroggy.com/#ko</a></p>
<p><img src="https://images.velog.io/images/hb-developer/post/4ebe3149-32ca-4d16-8b27-4e922bdc4104/a.PNG" alt=""></p>
<p>24단계 까지 패스하면 합격</p>
<p>개구리가 춤을 춘다.</p>
<p><img src="https://images.velog.io/images/hb-developer/post/12067cc2-f691-430f-aab9-b4bd0c0d43c5/b.PNG" alt=""></p>
<p>1~24 단계 까지 있으며 난이도는 쉬운편</p>
<p>1번정도 가볍게 연습하기 좋은것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 프로토타입]]></title>
            <link>https://velog.io/@hb-developer/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@hb-developer/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85</guid>
            <pubDate>Wed, 09 Jun 2021 10:27:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 내용은 책 <strong>모던 자바스크립트 Deep Dive</strong> 의 내용을 참조했습니다.</p>
</blockquote>
<h1 id="프로토타입">프로토타입</h1>
<p>자바스크립트에서 객체는 부모 역할을 하는 객체의 프로퍼티나 메서드를 상속받는다
이렇게 상속해주는 부모 객체를 <strong>프로토타입객체</strong> 혹은 <strong>프로토타입</strong> 이라고 한다.</p>
<h3 id="필요성">필요성</h3>
<p>프로토타입이 필요한 이유를 알아보자.</p>
<pre><code class="language-js">// 생성자 함수
function Circle(radius) {
  this.radius = radius;
  this.getArea = function () {
    // Math.PI는 원주율을 나타내는 상수다.
    return Math.PI * this.radius ** 2;
  };
}

// 반지름이 1인 인스턴스 생성
const circle1 = new Circle(1);
// 반지름이 2인 인스턴스 생성
const circle2 = new Circle(2);

// Circle 생성자 함수는 인스턴스를 생성할 때마다 동일한 동작을 하는
// getArea 메서드를 중복 생성하고 모든 인스턴스가 중복 소유한다.
// getArea 메서드는 하나만 생성하여 모든 인스턴스가 공유해서 사용하는 것이 바람직하다.
console.log(circle1.getArea === circle2.getArea); // false

console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172</code></pre>
<p>생성자 함수는 쉽게 객체를 찍어낼수 있다.</p>
<p>문제는 객체안에 메서드가 동일함에도 불구하고 각각의 객체를 생성한다.</p>
<p>중복된 코드를 따로 생성하면 메모리가 낭비되고 유지보수도 어려워진다.</p>
<p>이때 프로토타입을 기반으로 상속하면 불필요한 중복을 없앨수 있다.</p>
<pre><code class="language-js">// 생성자 함수
function Circle(radius) {
  this.radius = radius;
}

// Circle 생성자 함수가 생성한 모든 인스턴스가 getArea 메서드를
// 공유해서 사용할 수 있도록 프로토타입에 추가한다.
// 프로토타입은 Circle 생성자 함수의 prototype 프로퍼티에 바인딩되어 있다.
Circle.prototype.getArea = function () {
  return Math.PI * this.radius ** 2;
};

// 인스턴스 생성
const circle1 = new Circle(1);
const circle2 = new Circle(2);

// Circle 생성자 함수가 생성한 모든 인스턴스는 부모 객체의 역할을 하는
// 프로토타입 Circle.prototype으로부터 getArea 메서드를 상속받는다.
// 즉, Circle 생성자 함수가 생성하는 모든 인스턴스는 하나의 getArea 메서드를 공유한다.
console.log(circle1.getArea === circle2.getArea); // true

console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172</code></pre>
<h3 id="프로토타입-체인">프로토타입 체인</h3>
<p>프로토타입은 서로를 순환참조 하는걸 방지하기 위해
단방향 링크드 리스트로 구성되있다.</p>
<p><img src="https://images.velog.io/images/hb-developer/post/4e15638f-9691-4b01-93f6-c3edabe1c4fe/1.jpg" alt="" title="https://subscription.packtpub.com/book/web_development/9781849693127/6/ch06lvl1sec45/prototype-chaining"></p>
<p>A 라는 객체에 프로퍼티를 접근할때 만약 존재하지 않으면 
A 에서 먼저 검색한뒤 B --&gt; C 순으로 올라간다.
그렇게 쭉 올라가다 보면 Object.prototype 이 나온다.</p>
<p>즉 <strong>Object.prototype</strong> 은 모든 프로토타입의 종점역 이다.</p>
<h3 id="프로토타입-객체">프로토타입 객체</h3>
<p>모든객체는 <strong>[[prototype]]</strong> 이라는 내부객체를 가지는데 이것은 null 혹은 객체를 참조한다.
여기서 참조대상이 프로토타입 이다.</p>
<p>그렇다면 <strong>[[prototype]]</strong> 에 접근하려면 어떻게 해야할까?
<strong>[[prototype]]</strong> 은 숨김프로퍼티 라서 직접 참조는 불가능하다.
따라서 _<em>proto_</em> 를 사용해서 간접적으로 접근한다.</p>
<h3 id="_proto_-접근자-프로퍼티">_<em>proto_</em> 접근자 프로퍼티</h3>
<pre><code class="language-js">const obj = {};
const parent = { x: 1 };

// getter 함수인 get __proto__가 호출되어 obj 객체의 프로토타입을 취득
obj.__proto__;
// setter함수인 set __proto__가 호출되어 obj 객체의 프로토타입을 교체
obj.__proto__ = parent;

console.log(obj.x); // 1</code></pre>
<p>_<em>proto_</em> 접근자는 프로토타입을 get 하거나 set 할수있다.</p>
<blockquote>
<p>_<em>proto_</em> 접근자는 <strong>Object.prototype</strong> 로부터 상속 받은 프로퍼티다.
즉 모든객체는 _<em>proto_</em> 를 <strong>거의</strong> 모든객체에서 사용할수있다.
<br>🧨 <strong>Object.create()</strong> 함수는 객체를 만드는 함수다.
인자 안에 계승할 프로토타입을 넣어줄수 있는데 일반적인 객체를 넣어주면 프로토타입의 종점인
<strong>Object.prototype</strong> 를 상속 받는다. 하지만 null 을 넣어주면 자기 자신이 프로토타입의 종점인
객체가 생성된다. 즉 _<em>proto_</em> 접근자 포함 <strong>Object.prototype</strong> 의 모든 프로퍼티를 상속받지 않는 객체가 생성된다.</p>
</blockquote>
<p>즉 _<em>proto_</em> 는 <strong>[[Prototype]]</strong> 의 getter setter 함수라고 할수있다.</p>
<p>현재 모던한 자바스크립트에서는 어떨까?
_<em>proto_</em> 접근자는 사실 ES5까지는 비표준 접근자였다.</p>
<p>ES6 부터 공식으로 호환성을 위해 표준화를 했지만 추천하지도 권장하지도 않는다.
따라서 프로토타입을 불러오거나 설정 하려면 다음과 같은 메서드를 사용한다</p>
<ul>
<li><strong>Object.getPrototypeOf(obj)</strong> – <code>obj의 [[Prototype]]을 반환합니다.</code></li>
<li><strong>Object.setPrototypeOf(obj, proto)</strong> – <code>obj의 [[Prototype]]이 proto가 되도록 설정합니다.</code></li>
<li><strong>Object.create(proto, [descriptors])</strong> – <code>[[Prototype]]이 proto를 참조하는 빈 객체를 만듭니다. 이때 프로퍼티 설명자를 추가로 넘길 수 있습니다.</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로퍼티와 생성자함수]]></title>
            <link>https://velog.io/@hb-developer/%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EC%99%80-%EC%83%9D%EC%84%B1%EC%9E%90%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hb-developer/%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EC%99%80-%EC%83%9D%EC%84%B1%EC%9E%90%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 02 Jun 2021 11:01:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 내용은 책 <strong>모던 자바스크립트 Deep Dive</strong> 의 내용을 참조했습니다.</p>
</blockquote>
<h1 id="프로퍼티">프로퍼티</h1>
<p>자바스크립트 엔진은 프로퍼티를 만들때 <code>프로퍼티 어트리뷰트</code>를 기본값으로 자동 정의한다.</p>
<h3 id="데이터-프로퍼티">데이터 프로퍼티</h3>
<p>데이터 프로퍼티는 키와 값으로 이루어진 흔히 아는 프로퍼티다.
프로퍼티 안에는 다음과 같은 속성이 있다.</p>
<table>
<thead>
<tr>
<th>프로퍼티 어트리뷰트</th>
<th>프로퍼티 디스크립터</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>[[value]]</td>
<td>value</td>
<td>프로퍼티의 키값</td>
</tr>
<tr>
<td>[[Writable]]</td>
<td>writable</td>
<td>불리언 값, value값을 바꿀수 있게한다.</td>
</tr>
<tr>
<td>[[Enumerable]]</td>
<td>enumerable</td>
<td>불리언 값, 프로퍼티의 열거 가능여부를 나타낸다</td>
</tr>
<tr>
<td>[[Configurable]]</td>
<td>configurable</td>
<td>불리언 값, 프로퍼티의 재정의 가능 여부를 나타낸다</td>
</tr>
</tbody></table>
<p>만약 프로퍼티의 속성을 확인하려면 ?
<code>Object.getOwnPropertyDescriptor(오브젝트,프로퍼티 키)</code> 를 사용</p>
<pre><code class="language-js">const person = {
  name: &#39;Lee&#39;
};

// 프로퍼티 디스크립터 객체를 반환함
console.log(Object.getOwnPropertyDescriptor(person,&#39;name&#39;));
// {value: &quot;Lee&quot;, writable: true, enumerable: true, configurable: true}</code></pre>
<p>프로퍼티를 처음 생성할때 writable, enumerable,  configurable 모두 <code>true</code>로 설정된다.</p>
<h3 id="접근자-프로퍼티">접근자 프로퍼티</h3>
<table>
<thead>
<tr>
<th>프로퍼티 어트리뷰트</th>
<th>프로퍼티 디스크립터</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>[[Get]]</td>
<td>get</td>
<td>getter 함수를 호출하고 프로퍼티값을 읽는다</td>
</tr>
<tr>
<td>[[Set]]</td>
<td>set</td>
<td>setter 함수를 호출하고 프로퍼티 값을 설정후 저장한다.</td>
</tr>
<tr>
<td>[[Enumerable]]</td>
<td>enumerable</td>
<td>불리언 값, 프로퍼티의 열거 가능여부를 나타낸다</td>
</tr>
<tr>
<td>[[Configurable]]</td>
<td>configurable</td>
<td>불리언 값, 프로퍼티의 재정의 가능 여부를 나타낸다</td>
</tr>
</tbody></table>
<p><code>Object.getOwnPropertyDescriptor(오브젝트,프로퍼티 키)</code>에서 
get 과 set 이면 접근자 프로퍼티 , value 와 writable 이면 데이터 프로퍼티</p>
<h2 id="프로퍼티-정의">프로퍼티 정의</h2>
<p>그럼 프로퍼티는 어떻게 정의할까?</p>
<p><code>Object.defineProperty</code> 를 사용한다.
인수 (객체,프로퍼티 키 , 디스크립터 객체) 를 받고 정의를 하면된다.</p>
<pre><code class="language-js">const person = {
  name: &#39;kim&#39;
}
console.log(Object.getOwnPropertyDescriptor(person,&#39;name&#39;));
//{ value: &#39;kim&#39;, writable: true, enumerable: true, configurable: true }

Object.defineProperty(person,&#39;name&#39;,{
  value: &#39;kim&#39;,
   writable: false,
    enumerable: false,
     configurable: true 
})

console.log(Object.getOwnPropertyDescriptor(person,&#39;name&#39;));
//{value: &#39;kim&#39;,writable: false,enumerable: false,configurable: true}</code></pre>
<p>한번에 정의하려면 <code>Object.defineProperties</code></p>
<h3 id="객체-변경-방지">객체 변경 방지</h3>
<p>위와 같이 데이터프로퍼티 직접 정의할수 있지만.</p>
<p>객체안의 모든 프로퍼티값을, 또 재정의 자체를 막아버리는 메서드도 존재한다.</p>
<table>
<thead>
<tr>
<th align="center">구분</th>
<th align="center">메서드</th>
<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">Object.preventExtensions</td>
<td align="center">X</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">객체 밀봉</td>
<td align="center">Object.seal</td>
<td align="center">X</td>
<td align="center">X</td>
<td align="center">O</td>
<td align="center">O</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">객체 동결</td>
<td align="center">Object.freeze</td>
<td align="center">X</td>
<td align="center">X</td>
<td align="center">O</td>
<td align="center">X</td>
<td align="center">X</td>
</tr>
</tbody></table>
<p>프리벤트 익스텐션을 사용하면 프로퍼티 동적추가 , Object.defineProperty 가 금지된다.</p>
<p>아래로 내려갈수록 강도가 세지며 freeze 까지 내려가면 읽기만 가능한 객체가 된다.</p>
<p>객체에 위의 메서드가 사용 됬는지 확인하려면
<code>isExtensible</code> <code>isSealed</code> <code>isFrozen</code> 를 사용한다.</p>
<blockquote>
<p>🧨객체 변경 방지는 얕은 변경만 된다. 객체 안의 객체까지 효과를 줄 수 없기 때문에
재귀적 함수 호출로 깊은 변경을 이용해야 한다.</p>
</blockquote>
<h1 id="생성자-함수">생성자 함수</h1>
<p>객체를 만드는 방법은 2가지가 있다.</p>
<p><code>객체리터럴</code> - const a = { }
<code>생성자 함수</code> - csont b = new Object();</p>
<p>리터럴 방식은 간단하지만 프로퍼티 값과 메서드를 계속 적어줘야 한다.</p>
<p>동일한 코드는 항상 배제해야 하이 때문에 쉽게 만들수 있는 생성자함수(템플릿)를 사용한다.</p>
<pre><code class="language-js">// 생성자 함수
function Circle(radius) {
  // 생성자 함수 내부의 this는 생성자 함수가 생성할 인스턴스를 가리킨다.
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
}

// 인스턴스의 생성
const circle1 = new Circle(5);  // 반지름이 5인 Circle 객체를 생성
const circle2 = new Circle(10); // 반지름이 10인 Circle 객체를 생성

console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20</code></pre>
<blockquote>
<p>🔨여기서 this 란? 자기 참조 변수를 뜻한다.
  또 호출 방식에 따라 바인딩 되는 값이 다르다.</p>
</blockquote>
<table>
<thead>
<tr>
<th align="center">함수 호출 방식</th>
<th align="center">this가 가르키는 값</th>
</tr>
</thead>
<tbody><tr>
<td align="center">일반 함수로 호출</td>
<td align="center">전역 객체</td>
</tr>
<tr>
<td align="center">메서드로 호출</td>
<td align="center">메서드를 호출한 객체</td>
</tr>
<tr>
<td align="center">생성자 함수로 호출</td>
<td align="center">생성자 함수가 만들 인스턴스</td>
</tr>
</tbody></table>
<p>생성자 함수를 사용하면 다음과 같은 일이 벌어진다.</p>
<ol>
<li><p><code>인스턴스 생성과 this 바인딩</code></p>
<ul>
<li>빈 객체(인스턴스)를 만들고 this 값을 바인딩한다.</li>
</ul>
</li>
<li><p><code>인스턴스 초기화</code></p>
<ul>
<li>인수로 받은 값과 프로퍼티를 인스턴스에 할당한다.</li>
</ul>
</li>
<li><p><code>인스턴스 반환</code></p>
<ul>
<li>인스턴스를 반환한다.</li>
</ul>
</li>
</ol>
<blockquote>
<p>🧨생성자 함수는 자동으로 return이 되기때문에 return 문을 <strong>생략</strong> 해야된다.
리턴문 뒤에 원시값을 넣으면 무시가 되지만
리턴뒤에 새로운 객체를 명시하면 명시한 객체가 리턴된다.</p>
</blockquote>
<h3 id="call-과-construct">[[call]] 과 [[construct]]</h3>
<p>함수 와 객체의 차이점은 뭘까?
함수는 <strong>호출 가능한 객체</strong> 이고 객체는 <strong>호출 불가능한 객체</strong>다.</p>
<p>따라서 모든 함수는 내부 메서드로 call을 가지고있다.
그렇다면 construct 는 뭐지?</p>
<p>함수앞에 new 를 붙이면 생성자 함수가 되곤 했다. 하지만 정확히 구분하자면 다음과 같다.</p>
<p><strong>constructor</strong> - <code>함수 선언문</code> , <code>함수 표현식</code> , <code>클래스</code>
*<em>non-constructor *</em>- <code>축약형 메서드</code> , <code>화살표 함수</code></p>
<p>콜론과 펑션을 생략한 <strong>축약형 메서드</strong> 나 <strong>화살표 함수</strong>를 생성자함수로 호출하게 되면 오류가 발생한다.</p>
<pre><code class="language-js">// 일반 함수 정의: 함수 선언문, 함수 표현식
function foo() {}
const bar = function () {};
// 프로퍼티 x의 값으로 할당된 것은 일반 함수로 정의된 함수다. 이는 메서드로 인정하지 않는다.
const baz = {
  x: function () {}
};

// 일반 함수로 정의된 함수만이 constructor이다.
new foo();   // -&gt; foo {}
new bar();   // -&gt; bar {}
new baz.x(); // -&gt; x {}

// 화살표 함수 정의
const arrow = () =&gt; {};

new arrow(); // TypeError: arrow is not a constructor

// 메서드 정의: ES6의 메서드 축약 표현만을 메서드로 인정한다.
const obj = {
  x() {}
};

new obj.x(); // TypeError: obj.x is not a constructor</code></pre>
<p>new 를 붙이느냐 마느냐에 따라 생성자가 되기도 일반함수가 되기도 한다.
그렇다면 <strong>정의된 함수</strong>만 보고  ** 생성자함수**로 사용될 예정인지 아닌지를 어떻게 구분할수있을까?</p>
<p>개발자들은 생성자 함수에는 <strong>파스칼케이스</strong> 컨벤션을 사용하기로 한다.
<strong>대문자</strong>로 시작하는 함수들은 생성자 함수라고 약속 한것</p>
<p>그럼에도 실수가 발생한다면? 이때
new.target 을 사용하면 new 연산자로 호출됬는지 아닌지를 감지할수 있다.</p>
<pre><code class="language-js">// 생성자 함수
function Circle(radius) {
  // 이 함수가 new 연산자와 함께 호출되지 않았다면 new.target은 undefined다.
  if (!new.target) {
    // new 연산자와 함께 생성자 함수를 재귀 호출하여 생성된 인스턴스를 반환한다.
    return new Circle(radius);
  }

  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
}

// new 연산자 없이 생성자 함수를 호출하여도 new.target을 통해 생성자 함수로서 호출된다.
const circle = Circle(5);
console.log(circle.getDiameter());</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 원시값과 객체]]></title>
            <link>https://velog.io/@hb-developer/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@hb-developer/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Sat, 29 May 2021 11:37:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 내용은 책 <strong>모던 자바스크립트 Deep Dive</strong> 의 내용을 참조했습니다.</p>
</blockquote>
<h2 id="원시-값과-객체">원시 값과 객체</h2>
<p>자바스크립트에는 7개의 데이터 타입이 있다.</p>
<ul>
<li>원시타입 - 문자,숫자,불리언,null,undefined,심볼 </li>
<li>객체 - 객체,배열,함수 등등</li>
</ul>
<p>데이터 타입을 왜 나눈것일까?</p>
<p>이유를 알기 위해서는 먼저 두 타입의 차이점을 확인해야한다.
<img src="https://images.velog.io/images/hb-developer/post/68d8667e-46a2-43c5-9881-d0fcd50d0730/a.png" alt="" title="https://weicomes.tistory.com/133"></p>
<h3 id="immutabel">immutabel</h3>
<p>원시값은 변경이 불가능한 값이다.</p>
<p>변경이 불가능하다는 것은 읽기전용 값이란 뜻이고 
데이터의 신뢰성을 보장한다는 뜻이다.</p>
<p>그렇다면 흔히 변수에 값을 바꾼다는것 무슨뜻일까?</p>
<pre><code class="language-js">let x = 5 ;
x = 8 ;
console.log(x) // 8</code></pre>
<p>변수는 데이터를 담는 그릇이다.</p>
<p>5 라는 숫자 자체는 원시값이기 때문에 변경할수 없다
따라서 8 이라는 값을 메모리에 새로 하나 만들고 주소값만 바꿔서 연결한다.</p>
<h3 id="값에-의한-전달">값에 의한 전달</h3>
<p><img src="https://images.velog.io/images/hb-developer/post/e24cd0bf-d632-4c64-9335-a34dd2d1379d/b.PNG" alt="" title="https://medium.com/swlh/advanced-concepts-in-javascript-pass-by-reference-vs-pass-by-value-8a7e571f2804"></p>
<pre><code class="language-js">let x = 5 ;
let y = x ;
console.log(x,y);  // 5 5

y = 7 ;
console.log(x,y);  // 5 7</code></pre>
<p>메모리 x 를 만들고 5를 담는다.
메모리 y 를 만들고 x의 값 5를 담는다.</p>
<p>x 와 y 는 서로다른 메모리기 때문에 한쪽값을 변경해도 다른쪽은 변화가 없다.</p>
<p>이것을 값의 의한 전달 영어로는 passed by value 라고 부른다.</p>
<h3 id="참조에-의한-전달">참조에 의한 전달</h3>
<p>원시값은 메모리가 매우 적은편에 비해 객체는 그크기가 매우 클수있고
일정하지도 않다. 따라서 객체를 변경하고 관리할때마다 새로 만들지 않고
변경이 가능하게끔 설계가 됬다.</p>
<p>문제는 새롭게 만들지 않고 메모리 자체의 값을 만지기 때문에 부작용이 있다는 것이다.</p>
<pre><code class="language-js">let user1 = {
  age : 20
};

let x = user1;
console.log(x);     //20

x.age = 5;
console.log(x);     // 5
console.log(user1); // 5</code></pre>
<p>원시값을 할당한 변수는 메모리주소를 따라가서 원시값 자체를 가져오지만.
객체를 할당한 변수는 메모리주소를 따라가서 참조값을 가져온다.</p>
<p>즉 객체 하나를 여럿이서 나눠쓰고 한쪽을 바꾸면 모두가 바뀐다 😦</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 타입 과 연산자]]></title>
            <link>https://velog.io/@hb-developer/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EA%B3%BC-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@hb-developer/%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EA%B3%BC-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Thu, 27 May 2021 09:34:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 내용은 책 <strong>모던 자바스크립트 Deep Dive</strong> 의 내용을 참조했습니다.</p>
</blockquote>
<h1 id="데이터-타입">데이터 타입</h1>
<p>자바스크립트의 모든 값은 데이터 타입을 가진다.</p>
<p><code>원시타입</code> - <code>숫자</code> <code>문자</code> <code>불리언</code> <code>undefined</code> <code>null</code> <code>심벌</code>
<code>객체타입</code> - <code>객체(객체,함수,배열)</code></p>
<h3 id="숫자-타입">숫자 타입</h3>
<p>자바스크립트는 <code>배정밀도 64비트 부동소수점 형식</code> 을 따르며
모든 수를 실수로 처리한다. 정수 로 표현된숫자도 사실 실수다.</p>
<pre><code class="language-js">1 = 1.0 //true</code></pre>
<p>특별한 값으로는 +Infinity , -Infinity , NaN 이 있다.</p>
<h3 id="문자열-타입">문자열 타입</h3>
<p>자바스크립트의 문자열 특징은 원시 타입이고 불변하다. (자세한 내용은 다음 포스트에)</p>
<h4 id="템플릿">템플릿</h4>
<p>일반적인 문자열에서는 줄바꿈이 되지 않는다.
따라서 공백 이나 줄바꿈을 위해선 (백슬래쉬) 로 시작하는 <code>이스케이프 시퀀스</code> 를 사용해야한다.</p>
<h4 id="라인피드와-캐리지리턴">라인피드와 캐리지리턴</h4>
<p><code>캐리지리턴</code>(\r)은 커서를 맨앞으로 
<code>라인피드</code> (\n)는 그상태 그대로 종이만 올리기</p>
<p>이걸 합치면 CRLF 엔터 + 커서를 맨앞으로 라는 뜻이다</p>
<p>이것이 현대의 운영체제 로 넘어온뒤 각기 다른 개행 방식을 쓰며
자바스크립트에서는 캐리지리턴, 라인피드 동일하게 개행을 의미한다.
일반적으로는 (\n) 라인피드 를 사용한다.</p>
<h3 id="undefined-타입">undefined 타입</h3>
<p>자바스크립트 에서는 변수를 선언하면 undefined 가 할당된다.
메모리에는 보통 쓰레기값이 존재하는데 undefined 로 초기화 하고 공간을 확보한다.</p>
<h4 id="선언-과-정의">선언 과 정의</h4>
<p>보통의 프로그래밍 언어는 선언 과 정의를 따로 둔다.</p>
<p>C언어 에서는 식별자에게 존재를 알리는게 <code>선언</code> 이고 메모리에 연결시키는걸 <code>정의</code>라 한다.</p>
<p>하지만 자바스크립트는 선언과 동시에 <code>undefined</code> 가 자동으로 할당되기 때문에 구분이 모호하다.
ECMAScript 에서는 <code>변수</code>를 선언한다. <code>함수</code>를 정의한다 라고 표시한다.</p>
<h3 id="심볼-타입">심볼 타입</h3>
<p>ES6 에 등장한 타입 이며 변경 불가능한 원시 타입의 값이다.
Symbol 함수로 생성하며 외부에 노출되지 않고 중복되지도 않는다.</p>
<h2 id="데이터-타입의-필요성">데이터 타입의 필요성</h2>
<p>데이터 타입이 필요한 이유는 여러가지가 있다.</p>
<ul>
<li>데이터를 얼마나 확보할지를 정해야한다.
데이터를 생성할때 얼만큼 생성해서 할당할지 효율적인 판단이 필요하다.</li>
<li>값을 읽어야 한다.
변수에는 메모리값의 주소가 있는데 가장 최상단 메모리 셀의 주소만 들어있다.
이때 데이터 타입을 참고해서 얼마만큼 읽을지를 판단한다. 만약 8바이트 데이터를
7셀 만큼 읽었다면 값은 훼손된다.</li>
<li>값을 사용할때 필요하다.
예를들어 0100 0001 을 숫자로 해석하면 65고 문자로 해석하면 &#39;A&#39; 다.<br>즉 값을 사용할때도 데이터 타입을 참고한다.</li>
</ul>
<h1 id="연산자">연산자</h1>
<p>피연산자 : 연산의 대상(값으로 평가될수 있어야함)</p>
<h3 id="부수효과">부수효과</h3>
<p>부수효과 란 피연산자의 값이 바뀌는것을 의미한다.
이항 산술 연산자 처럼 +, - , *  , / , % 를 해도 할당없이 <code>계산만</code> 하면
<code>부수효과가 없다</code>고 말한다.</p>
<p>무언가를 <code>할당</code> 하면 변수의 값이 변하므로 <code>부수효과가 있다</code> 라고 한다.</p>
<p>그럼 <code>비교연산자는</code> ?
무언가를 비교하고 불린값을 리턴하기 때문에 <code>부수효과가 없다</code> 라고 한다.</p>
<p>즉
부수 효과가 있는것은 값이 바뀌는것을 의미하고
부수 효과가 없는것은 새로운 값을 리턴한다.
(<code>할당연산자</code> <code>증++ 감-- 연산자</code> <code>delete 연산자</code>)</p>
<h3 id="쉼표-연산자">쉼표 연산자</h3>
<p>왼쪽부터 차례로 평가하고 마지막 피연산자 를 평가하면 해당 값을 반환한다.</p>
<pre><code class="language-js">var x ,y ,z;
x=1 , y=2 , z =5   //5</code></pre>
<h3 id="typeof-연산자">typeof 연산자</h3>
<p>데이터 타입을 알아내는 연산자다.</p>
<p>함수는 function 을 반환하고 
나머지 객체는 object를 반환한다.</p>
<p>문제는 null 을 typeof 연산자 로 평가하게 되면 null 이 아니라 object 가 나온다.
이것은 자바스크립트의 첫번째 버그이고 호환성을 위해 고치고 있지 않다.
null 인지를 체크하려면 ===연산자를 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[변수와 표현식]]></title>
            <link>https://velog.io/@hb-developer/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-5prb46wk</link>
            <guid>https://velog.io/@hb-developer/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-5prb46wk</guid>
            <pubDate>Wed, 26 May 2021 07:47:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 내용은 책 <strong>모던 자바스크립트 Deep Dive</strong> 의 내용을 참조했습니다.</p>
</blockquote>
<h2 id="변수">변수</h2>
<h3 id="변수가-필요한-이유">변수가 필요한 이유</h3>
<p>변수는 하나의 값을 저장하기 위해 메모리 를 초기화 하고 식별할수 있는 역할을 한다.</p>
<h3 id="식별자">식별자</h3>
<p>변수를 식별자(identifier) 라고도 부르며 무언가를 식별할수 있는 고유의 이름을 뜻한다</p>
<p>식별자는 어떠한 메모리의 값 을 기억하는게 아니라 주소를 기억한다</p>
<p><code>식별자</code> -&gt; <code>메모리주소</code> -&gt; <code>메모리값</code></p>
<p>자바스크립트에서는 함수도 값이기 때문에 <code>변수</code> <code>함수</code> <code>클래스</code> 모두 식별자라고 부른다.</p>
<h3 id="선언">선언</h3>
<p>변수를 선언하면 실행컨텍스트에 등록이 된다.</p>
<ol>
<li>변수 이름을 엔진에 알린다.</li>
<li>메모리 공간을 확보하고 undefined 를 할당한다.</li>
</ol>
<h3 id="호이스팅">호이스팅</h3>
<p>변수 함수 클래스 같은 모든 식별자들은 <code>런타임</code> 전에 실행된다.
가장 상단으로 올려서 실행하는 행위를 호이스팅(hoisting) 이라고 한다.</p>
<h3 id="값의-할당">값의 할당</h3>
<p><code>var score = 80;</code>
선언과 할당을 동시에 하는 코드는 사실 아래와 같은 코드다</p>
<pre><code class="language-js">var score;
score = 80;</code></pre>
<p>즉 런타임 전에 score 에 <code>undefined</code> 가 할당이 되고
런타임 때 위에서부터 한줄씩, 차례가 되었을때 80이할당 된다.</p>
<h3 id="값의-재할당">값의 재할당</h3>
<pre><code class="language-js">var score = 80;
score = 90 ;</code></pre>
<p>위와같은 코드가  선언되었을때 undefined , 80 , 90
총 3번이 할당이 되는데.. 메모리에선 하나의 메모리를 지우고 다시 쓰는게 아니라
<code>할당이 될때마다</code> 새 메모리에 값을 할당하고 연결한다. </p>
<p>연결이 끊겨버린 값들은 자바스크립트 자체 엔진 <code>가비지 콜렉터</code> 에서 자동으로 삭제한다.</p>
<p>C언어 에서는 malloc() , free() 같은 함수로 개발자가 직접 메모리 직접 관리할수 있지만
자바스크립트는 자동으로 한다. </p>
<p>이렇게 스스로 컨트롤 하는 언어를 <code>매니지드 언어</code>, 아닌 언어를 <code>언매니지드 언어</code> 라고 한다.</p>
<h3 id="식별자-네이밍-규칙">식별자 네이밍 규칙</h3>
<p>식별자에서는 다음과 같은 규칙이 있다.</p>
<ul>
<li>$(달러사인), _(언더바), 특수문자를 제외한 문자 ,숫자를 쓸수 있으며</li>
<li>시작시 에는 위에서 숫자뺀 나머지를 사용할수 있다.</li>
<li>예약어는 사용 불가</li>
</ul>
<h3 id="네이밍-컨벤션">네이밍 컨벤션</h3>
<p><code>변수</code> <code>함수</code> 에는 카멜케이스
<code>생성자 함수</code> <code>클래스</code> 에는 파스칼케이스를 사용한다.</p>
<h2 id="표현식과-문">표현식과 문</h2>
<p><code>값</code> 이란 <code>식</code>이 <code>평가</code>되어 생성된 결과를 말한다.</p>
<pre><code class="language-js">var sum;
sum = 10 + 20; </code></pre>
<p>10 + 20(식) 이 평가 되어서 30이란 값이 나온다.</p>
<h3 id="리터럴">리터럴</h3>
<p><strong>사람이 이해할수 있는 문자 또는 약속된 기호를 사용해 값을 만드는 표기법이다.</strong></p>
<p>예를들어 &#39;hello&#39; 는 문자 리터럴이다. 숫자 5 는 정수리터럴이다.</p>
<p>자바스크립트에는 많은 리터럴들이 있고 리터럴은 런타임때 값으로 평가되어 반환된다.</p>
<h3 id="표현식">표현식</h3>
<p><strong>값으로 평가될수 있는 문 이다.</strong></p>
<p>개발자 도구에서 값을 반환하는것은 표현식인 문이고
undefined 를 반환하는것은 표현식이 아닌 문이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 컴포넌트]]></title>
            <link>https://velog.io/@hb-developer/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@hb-developer/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Tue, 25 May 2021 05:52:59 GMT</pubDate>
            <description><![CDATA[<h1 id="react-component">React Component</h1>
<h3 id="reactcreateelement">React.createElement</h3>
<p>React.createElement() 는 리액트에서 제공하는 함수다.
JSX 라는 쉬운 문법이 존재하지만 그 원리는 React.createElement 에 있으므로</p>
<p>이 함수를 배울 필요가 있다.</p>
<p>React.createElement 에는 3가지 인자가 들어간다
Type / props / ...children</p>
<p><code>Type</code> 
<code>태그 이름 문자열</code> | <code>리액트 컴포넌트</code> | <code>React.Fragment</code></p>
<p><code>props</code>
<code>리액트 컴포넌트에 넣어주는 데이터 객체</code></p>
<p><code>...children</code>
<code>내용 혹은 자식 요소</code></p>
<p>type에 html 태그를 문자열로 넣어주고 자식요소가 있으면 ...children 에 넣어준다.</p>
<pre><code class="language-jsx">React.createElement(&#39;div&#39;,null,&#39;안녕하세요&#39;)</code></pre>
<p>다만 내용이 조금만 복잡해져도 React.createElement() 안에 또 React.createElement()
를 써야 되기 때문에 JSX 로 쉽게 표현을 해준다.</p>
<h3 id="state">state</h3>
<p><code>state</code> - 컴포넌트 내부에 존재하는 데이터로 상태를 의미한다.</p>
<p>선언방법</p>
<ul>
<li>state 는 constructor 함수 안에다 this.state 를 선언 하는 방법이 있고,</li>
<li>컴포넌트 내용에 바로 선언하는 방법이 있다. state ={}</li>
</ul>
<blockquote>
<p>state 는 직접 변경하지 않고 setState() 함수를 사용한다.
  이유는 직접 변경을 하면 리액트에서 인식하지 못하고 render가 동작하지 않기때문에 화면이     바뀌지 않는다. setState를 사용 하고 자동으로 최적화 까지 하는 리액트의 방식에 어긋난다.</p>
</blockquote>
<p>제어방법</p>
<ul>
<li>새로운 객체로 할당<pre><code class="language-jsx">click = (() =&gt; {
this.setState({
  count : this.state.count +1
})
})</code></pre>
</li>
<li>변수에 넣고 리턴</li>
</ul>
<pre><code class="language-jsx"> click = (()=&gt;{
  this.setState((pre)=&gt;{
    const newState = {count:pre.count +1}
    return newState
  })
})</code></pre>
<h3 id="props">props</h3>
<p><code>props</code> - 컴포넌트 외부에서 컴포넌트에게 전달해주는 데이터.</p>
<p>추가방법</p>
<ul>
<li>컴포넌트 옆에 추가<ul>
<li>인라인 방식으로 직접 삽입 하거나</li>
<li>위에 함수로 빼서 불러온다.<br></li>
</ul>
</li>
<li>기본값 프롭스<ul>
<li>컴포넌트.defaultProps={} 를 사용한다 (클래스,함수)<ul>
<li>static defaultProps={} 를 사용한다 (클래스)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="eventhandling">EventHandling</h3>
<ul>
<li>카멜케이스로만 사용한다.</li>
<li>이벤트에 연결된 자바스크립트 코드는 함수다.</li>
<li>실제 DOM 요소에만 사용 가능하다<ul>
<li>컴포넌트에 사용하면 프롭스로 전달된다.</li>
</ul>
</li>
</ul>
<p>보통 인라인 요소에 직접 작성하기보다는 따로 빼서 작성하는데
2가지 방법이 있다.</p>
<ul>
<li>메서드로 함수를 만든다음, 생성자 함수를 만들고 바인드 함수로 연결하는 방법<pre><code class="language-jsx">this.click =this.click.bind(this)</code></pre>
</li>
<li>생성자 함수 없이 메서드를 화살표 함수로 사용 하는 방법</li>
</ul>
<h3 id="라이프사이클">라이프사이클</h3>
<p>라이프 사이클은 컴포넌트가 생성된후 소멸할때까지의 삶을 의미한다.</p>
<p>16.3 이전까지는 아래와 같은 형태를 띤다.</p>
<p><img src="https://images.velog.io/images/hb-developer/post/2c4b779f-c6d2-4c35-9569-cd7737d39013/a.png" alt="" title="https://niceman.tistory.com/58"> </p>
<p><code>초기화</code> - <code>마운팅</code> - (if props | states 가 업데이트될경우) <code>업데이트</code> - <code>언마운팅</code></p>
<p>16.3 이후의 라이프 사이클</p>
<ul>
<li><p>생성자
ComponentWillMount -&gt; getDerivedstateFromProps</p>
</li>
<li><p>업데이트
componentWillReceiveProps -&gt; getDerivedStateFromProps
componentWillUpdate -&gt; getSnapshotBeforeUpdate
<img src="https://images.velog.io/images/hb-developer/post/6810d809-ff2d-41cf-969d-3f5caaeac339/b.PNG" alt="" title="https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/"></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[재귀함수]]></title>
            <link>https://velog.io/@hb-developer/%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hb-developer/%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 06 May 2021 00:18:39 GMT</pubDate>
            <description><![CDATA[<p>컴퓨터 과학에서 재귀란 자기 자신을 계속 호출하는 것을 의미한다.</p>
<p>제곱근을 구하는 함수는 보통 for문을 사용한다.</p>
<pre><code class="language-js">function pow(x,n) {
  let result = 1;
  for (let i = 0; i &lt; n; i++) {
    result *= x
  }
return result;
}

console.log(pow(2,3));   // 8 </code></pre>
<p>하지만 재귀함수를 사용하면 다음과 같이 구현할수 있다.</p>
<pre><code class="language-js">function pow(x,n){
  if (n==1) {
    return x;
  }
  else {
    return x*pow(x,n-1)
  }
}
console.log(pow(2,3));   //8</code></pre>
<p>삼항 연산자를 사용하면 더 간결하게 가능</p>
<pre><code class="language-js">function pow(x,n){
 return (n==1) ? x : x * pow(x,n-1)
}
console.log(pow(2,3));</code></pre>
<h3 id="장점">장점</h3>
<p>그럼 재귀함수는 왜 사용하는걸까?</p>
<p>우선 코드가 짧다.</p>
<p>코드가 짧기때문에 유지보수가 좋아진다.</p>
<p>또 재귀적 순회가 가능한데 하위의 깊은 구간에도 쉽게 접근할수 있다.
for문으로도 접근할순 있지만 매우 지저분해지기때문에 권장하지 않는다.</p>
<h3 id="단점">단점</h3>
<p>재귀 함수에도 단점이 있다.</p>
<p>재귀함수를 실행할때마다 실행컨텍스트에 저장되기때문에 메모리에 부담이 간다..
자바스크립트 엔진은 1만개 부터  10만개 이하 까지 엔진에 따라 제한을 둔다</p>
<p><code>tail calls optimization</code> 라는 최적화를 하기도 하지만 간단한 경우에만 지원한다</p>
<h3 id="구조">구조</h3>
<pre><code class="language-js">              if n==1  = x
             /
pow(x, n) =
             \
              else     = x * pow(x, n - 1)</code></pre>
<h4 id="재귀의-베이스">재귀의 베이스</h4>
<p>재귀함수에서 가장 안쪽인 if n==1 부분을 <code>재귀의 베이스</code>라고 부른다. 
여기서부터 중첩됬던 실행컨텍스트를 하나씩 지우면서 외부로 리턴한다</p>
<h4 id="재귀-깊이">재귀 깊이</h4>
<p>중첩호출의 갯수를 재귀 깊이라고 한다. 여기서는 재귀 깊이는 n이다</p>
<h4 id="재귀-단계">재귀 단계</h4>
<p>x * pow(x, n - 1) 자기 자신을 호출할때를<code>재귀 단계</code> 라고 부른다.</p>
<blockquote>
<p>출처 <a href="https://ko.javascript.info/recursion#ref-1035">https://ko.javascript.info/recursion#ref-1035</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP 메서드]]></title>
            <link>https://velog.io/@hb-developer/HTTP-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@hb-developer/HTTP-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Tue, 04 May 2021 13:12:41 GMT</pubDate>
            <description><![CDATA[<h1 id="api-uri">API URI</h1>
<p>API URI 를 설계하기 위해서 가장 중요한것은 <code>자원</code> 그 자체에 초점을 둬야합니다.</p>
<ul>
<li>회원 목록 조회</li>
<li>회원 조회</li>
<li>회원 등록</li>
<li>회원 수정</li>
<li>회원 삭제</li>
</ul>
<p>여기서 리소스는 <code>회원</code> 입니다. 행위는 포함하지 않습니다.</p>
<p>게임에서 미네랄을 캐라 는 미네랄 만 리소스인것 처럼</p>
<p>API URI를 설계를 할때도 회원 그 자체가 리소스 여야합니다.</p>
<p>동사는 HTTP 메서드에서 담당하죠</p>
<h2 id="http-메서드">HTTP 메서드</h2>
<p>메소드는 다음과 같습니다.</p>
<p>주요 메서드</p>
<ul>
<li><code>GET</code>: 리소스 조회<ul>
<li>서버에 전달하고 싶은데이터는 query 통해서 전달</li>
<li>메세지 바디를 통해서도 가능하지만 권장하진 않음</li>
</ul>
</li>
</ul>
<ul>
<li><p><code>POST</code>: 요청 데이터 처리, 주로 등록에 사용</p>
<ul>
<li>메시지 바디를 통해 서버로 요청 데이터 전달 (클라이언트와 서버가 약속후 서버가 처리)</li>
<li>단순히 값 하나를 변경할때만 사용하지않고 서버에 큰변화를 줄때도 post 를 사용</li>
<li>다른 메서드로 처리하기 애매한것은 모드 POST 로 처리</li>
</ul>
</li>
<li><p><code>PUT</code>: 리소스를 대체, 해당 리소스가 없으면 생성</p>
<ul>
<li>리소스를 덮음,리소스의 위치를 정확히 식별</li>
</ul>
</li>
<li><p><code>PATCH</code>: 리소스 부분 변경</p>
</li>
<li><p><code>DELETE</code>: 리소스 삭제</p>
</li>
</ul>
<p>기타 메서드</p>
<ul>
<li>HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환</li>
<li>OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)</li>
</ul>
<p>거의 사용 안함</p>
<ul>
<li>CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정</li>
<li>TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행</li>
</ul>
<h2 id="http-메서드의-속성">HTTP 메서드의 속성</h2>
<p>HTTP 메서드의 속성에는 다음과 같은 특징이 있습니다.</p>
<ul>
<li>안전(Safe Methods)</li>
<li>멱등(Idempotent Methods)</li>
<li>캐시가능(Cacheable Methods)</li>
</ul>
<h3 id="안전">안전</h3>
<p>호출해도 리소스에 변경이 안될경우 예) GET 리소스 조회</p>
<h3 id="멱등">멱등</h3>
<p>1번호출하든 100 번 호출하든 결과가 같을때
예) GET ,PUT ,DELTE 
<code>POST</code> 두번 호출하면 2번결제가 된다. 즉 멱등성이 없다.</p>
<p>멱등은 재반복이 가능한지를 판단하는 기준이 됩니다.</p>
<h3 id="캐시가능">캐시가능</h3>
<p>이론상 GET HEAD POST PATCH 는 캐시가 가능하지만
POST 와 PATCH는 구현이 힘들기 때문에 <code>GET</code>과 <code>HEAD</code> 만 사용합니다.</p>
<p><img src="https://images.velog.io/images/hb-developer/post/619af633-23a3-447a-a11e-9473a1b33c43/1.jpg" alt="" title="출처 위키디피아"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP 기본]]></title>
            <link>https://velog.io/@hb-developer/HTTP-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@hb-developer/HTTP-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Mon, 03 May 2021 12:38:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 게시글은 인프런 김영한 님의 <a href="https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/questions">모든 개발자를 위한 HTTP 웹 기본 지식</a> 을 기반으로 작성되었습니다.</p>
</blockquote>
<h1 id="http">HTTP</h1>
<p>HTTP란 (HyperText Transfer Protocol)의 약어이자 W3 에서 정보를 주고받을수 있는 통신 규약 입니다. 
처음에는 HTML 을 주고받는데 사용되었지만, 현재에는 이미지,영상,JSON,XML,서버간의 데이터 등
사실상 모든곳에서 HTTP를 사용하고 있습니다.</p>
<h2 id="http의-역사">HTTP의 역사</h2>
<ul>
<li>HTTP/0.9 1991년: GET 메서드만 지원, HTTP 헤더X</li>
<li>HTTP/1.0 1996년: 메서드, 헤더 추가</li>
<li>HTTP/1.1 1997년: 가장 많이 사용, 우리에게 가장 중요한 버전</li>
<li>RFC2068 (1997) -&gt; RFC2616 (1999) -&gt; RFC7230~7235 (2014)</li>
<li>HTTP/2 2015년: 성능 개선</li>
<li>HTTP/3 진행중: TCP 대신에 UDP 사용, 성능 개선</li>
</ul>
<p>HTTP1.1은 무려 15년동안 릴리즈 되었기때문에 극도로 안정되었고 거의 모든기능이 들어가있기 때문에 현재 가장 많이 사용하는 버전입니다. 현재 버전은 <code>RFC7230~7235(2014)</code></p>
<p>HTTP는 다음과 같은 <code>특징</code>이 있습니다.</p>
<ul>
<li><p>클라이언트 서버 구조</p>
</li>
<li><p>무상태 프로토콜(스테이스리스), 비연결성</p>
</li>
<li><p>HTTP 메시지</p>
</li>
<li><p>단순함, 확장 가능</p>
</li>
</ul>
<h2 id="클라이언트-서버-구조">클라이언트 서버 구조</h2>
<p>현재에는 익숙한 클라이언트,서버 구조가 과거에는 개념조차 모호했습니다. 하지만</p>
<p>HTTP 에서 클라이언트는 UI 에 집중을 하고 서버는 응답과 처리에 집중을 하게됩니다.</p>
<h2 id="stateful-stateless무상태-프로토콜">Stateful, Stateless(무상태 프로토콜)</h2>
<p>Stateless 이란 무상태 프로토콜을 의미하고 다음과 같은  특징이 있습니다.</p>
<ul>
<li>서버가 클라이언트의 상태를 보존X</li>
<li>장점: 서버 확장성 높음(스케일 아웃)</li>
<li>단점: 클라이언트가 추가 데이터 전송</li>
</ul>
<p>Stateless 는 한번에 받아서 처리하기때문에 중간에 점원이 바뀌어도 상관이 없습니다.
서버1이 마비가 될때 서버 2로 넘겨도 처리가 가능하죠 그렇기 때문에 무한적 수평확장이 가능합니다. 대부분 Stateless 를 최우선적으로 사용합니다.</p>
<p>반면 Stateful 은 데이터를 유지하지만 점원이 바뀌면 처음부터 다시 해야합니다.
즉 서버가 마비되면 처음부터 다시해야 합니다.</p>
<p>따라서 Stateful 은 보통 로그인을 서버에 유지 할때 사용하며
로그인과 같이 필요한경우에만 사용 합니다.</p>
<h2 id="비연결성">비연결성</h2>
<p>HTTP 는 다음과 같은 특징이 있습니다.</p>
<ul>
<li>HTTP는 기본이 연결을 유지하지 않는 모델
일반적으로 초 단위의 이하의 빠른 속도로 응답</li>
<li>1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이
하로 매우 작음</li>
<li>예) 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않는다.</li>
<li>서버 자원을 매우 효율적으로 사용할 수 있음</li>
</ul>
<p>요약을 하자면 TCP/IP 로 연결후 3way handshake 을 할텐데 데이터를 주고 받으면 연결을 끊습니다. 
그렇게 되면 많은 사용자가 이용해도 리소스를 다시 확보해서 사용하기 때문에 자원관리가 효율적입니다.</p>
<p>하지만 다음과 같은 한계점이 있습니다.</p>
<ul>
<li>추후작업을 할때 tcp/ip 를 또 연결해야함 </li>
<li>HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등등 수 많은 자원이 함께 다운로드</li>
</ul>
<p>무언가 할때마다 또 (html,css,js,image) 을 받을때마다 끊고 연결을 반복합니다.</p>
<p>그래서 최근에는 <code>HTTP 지속 연결(Persistent Connections)</code> 을 통해
모든 자원을 받은뒤 연결을 끊습니다.</p>
<p>HTTP/2, HTTP/3(udp)를 사용해서 최적화를 하기도 합니다.</p>
<h1 id="http-메세지">HTTP 메세지</h1>
<p>HTTP 는 다음과 같은 구조를 가지고 있습니다.
<img src="https://images.velog.io/images/hb-developer/post/80a7f556-49c2-4ef8-96c1-6ec93c4b6e76/2.PNG" alt=""></p>
<h2 id="start-line">start-line</h2>
<h3 id="요청">요청</h3>
<p>start-line = request-line
request-line = <code>method</code> SP(공백) <code>request-target</code> SP <code>HTTP-version</code> CRLF(엔터)
 (<code>메서드</code> , <code>타겟</code> , <code>HTTP 버전</code> 순으로 들어간다)</p>
<h3 id="http-메서드">HTTP 메서드</h3>
<p> 메서드의 종류는 다음과 같습니다.
 )GET, POST, PUT, DELETE</p>
<ul>
<li>GET: 리소스 조회</li>
<li>POST: 요청 내역 처리</li>
</ul>
<h3 id="타겟">타겟</h3>
<ul>
<li>absolute-path[ ?query ] (절대경로 [?쿼리])</li>
<li>절대경로= &quot;/&quot; 로 시작하는 경로</li>
</ul>
<h3 id="http-버전">HTTP 버전</h3>
<p>HTTP Version  EX) HTTP/1.1</p>
<h2 id="응답">응답</h2>
<p>start-line =  status-line
status-line = <code>HTTP-version</code> SP <code>status-code</code> SP <code>reason-phrase</code> CRLF</p>
<ul>
<li>HTTP 버전</li>
<li>HTTP 상태 코드: 요청 성공, 실패를 나타냄<ul>
<li>200: 성공</li>
<li>400: 클라이언트 요청 오류</li>
<li>500: 서버 내부 오류</li>
</ul>
</li>
<li>이유 문구: 사람이 이해할 수 있는 짧은 상태 코드 설명 글</li>
</ul>
<h2 id="http-header">HTTP Header</h2>
<p>헤더구조
header-field = <code>field-name</code> &quot;:&quot; OWS <code>field-value</code> OWS (OWS:띄어쓰기 허용)</p>
<p>헤더에는 HTTP 전송에 필요한 모든 부가정보가 들어있습니다.</p>
<ul>
<li>예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 
서버 애플리케이션 정보, 캐시 관리 정보...</li>
</ul>
<h2 id="http-body">HTTP BODY</h2>
<p>실제 HTML 데이터</p>
<ul>
<li>HTML 문서, 이미지, 영상, JSON 등등</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 기본지식]]></title>
            <link>https://velog.io/@hb-developer/%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D</link>
            <guid>https://velog.io/@hb-developer/%EC%9B%B9-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D</guid>
            <pubDate>Sun, 02 May 2021 12:09:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>본 게시글은 인프런 김영한 님의 <a href="https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/questions">모든 개발자를 위한 HTTP 웹 기본 지식</a> 을 기반으로 작성되었습니다.</p>
</blockquote>
<h1 id="인터넷-네트워크">인터넷 네트워크</h1>
<h2 id="ip란">ip란?</h2>
<p>인터넷 프로토콜(IP, Internet Protocol)은 인터넷에서 정보를 주고 받을때 사용하는 <code>규약</code>입니다.</p>
<p>인터넷 프로토콜은 다음과 같은 일을합니다.</p>
<ul>
<li>지정한 ip 주소에 데이터를 <code>전달</code></li>
<li><code>패킷</code> 이라는 통신 단위로 데이터 전달</li>
</ul>
<h3 id="ip의-한계">ip의 한계</h3>
<p>ip에는 <code>출발 ip</code> <code>도착 ip</code>로 구성되어 있지만 다음과 같은 문제점이 있습니다.</p>
<p><code>첫번째</code>  <code>비연결성</code>(connectionlessness) </p>
<ul>
<li>상대 서버가 꺼졌거나 주소가 바뀌었어도 그저 송신만 한다.</li>
</ul>
<p><code>두번째</code> <code>비신뢰성</code>(unreliability)</p>
<ul>
<li>늦게보낸 데이터가 먼저 도착할수 있다</li>
<li>패킷이 소실되어도 알아차리지 못한다.</li>
</ul>
<p><code>세번째</code> <code>프로그램 구분</code></p>
<ul>
<li>같은 ip로 여러가지의 데이터들이 들어갔을때 (게임,유튜브,음악) 구분할수 없다.</li>
</ul>
<h2 id="tcpudp">TCP/UDP</h2>
<p>이를 보완하기 위해 나온것이 TCP/UDP 입니다.
<img src="https://images.velog.io/images/hb-developer/post/b7632d47-45ea-47c7-a558-7800515a6130/1.PNG" alt=""></p>
<p>인터넷 프로토콜은 4단계로 이루어져 있습니다.(위에서 부터 아래로 출력)</p>
<p>TCP/UDP 를 만들고 IP로 감싸서 내보냅니다.</p>
<h3 id="tcp">TCP</h3>
<p>TCP(Transmission Control Protocol) </p>
<p>TCP 의 장점은 IP 의 문제였던 <code>연결지향</code>,<code>데이터 전달보증</code>, <code>순서 보장</code> 을 하게됩니다.</p>
<h3 id="연결지향---3way-handshake">연결지향 - 3way handshake</h3>
<p>SYN:접속요청
ACK:요청수락</p>
<ol>
<li>먼저 상대 서버로 SYN 을 보냅니다.</li>
<li>상대서버는 SYN + ACK 을 보내옵니다.</li>
<li>다시 상대 서버로 ACK 을 보냅니다.</li>
<li>데이터전송</li>
</ol>
<p>이렇게 하면 클라이언트와 서버가 서로 믿을수 있게 되므로 신뢰할수 프로토콜이 됩니다.</p>
<blockquote>
<p>최근엔  3번때 ACK와 데이터 전송을 같이 보내기도 합니다.</p>
</blockquote>
<h3 id="데이터-전달보증">데이터 전달보증</h3>
<p>TCP 에서는 데이터가 성공적으로 전송이 되면 상대도 신호를 보내옵니다.</p>
<h3 id="순서보장">순서보장</h3>
<p>패킷 1,2,3,4 를 순서대로 보냈을때 1,3,2,4 순으로 도착하게 된다면
3,2,4 를 삭제하고 2부터 재요청을 하게됩니다.</p>
<blockquote>
<p>서버최적화에 따라 내부에서 재조합을 하기도 합니다.</p>
</blockquote>
<h2 id="udp">UDP</h2>
<p>UDP(User Datagram Protocol) 는 IP와 거의 동일합니다.</p>
<p>ip에 포트,체크섬 만 포함된 최소한의 통신입니다.
<code>3way handshake  x</code> <code>데이터 전달보증 x</code> <code>순서보장</code> 이 되지않습니다.
그렇기 때문에 속도가빠르고 단순한 형태입니다.<code>(최소한의 백지 상태)</code>
따라서 본인이 최적화를 원한다면 애플리케이션에서 기능을 확장해볼수 있습니다.</p>
<blockquote>
<p>빠르고 단순하기때문에 HTTP3 에서는 UDP 로 전송을 하며
아직 표준안이 정해지진 않았지만 최근 각광받고 있는 프로토콜입니다.</p>
</blockquote>
<h2 id="port">Port</h2>
<p>ip는 1개인데 들어오는 데이터는 많습니다. 예를들어 게임하고 음악을 들으며 
유튜브를 볼수있죠 그럴때 사용하는게 포트입니다. 같은 ip 내에서 데이터를 구분해줍니다.</p>
<ul>
<li>0 ~ 65535 할당 가능</li>
<li>0 ~ 1023: 잘 알려진 포트, 사용하지 않는 것이 좋음</li>
<li>FTP - 20, 21</li>
<li>TELNET - 23</li>
<li>HTTP - 80</li>
<li>HTTPS - 443</li>
</ul>
<h2 id="dns">DNS</h2>
<p>IP는 외우기도 어렵고 자주 바뀝니다.</p>
<p>그래서 DNS(Domain Name System) 라는것을 사용해 영문/한글 주소로 사이트를 이용할수있습니다.</p>
<h1 id="uri">URI</h1>
<p><code>URI(Uniform Resource Identifier)</code>란 리소스를 식별하는 방법 입니다.
여기서 <code>Locator(위치)</code> 를 찾으면 URL <code>Name(이름)</code> 으로찾으면 URN 입니다.</p>
<p>즉 <code>URI</code> 는 가장 큰 개념이고 그아래 <code>URL(위치)</code> <code>URN(이름)</code> 으로 구분됩니다.</p>
<h2 id="url">URL</h2>
<p>URL 분석법
scheme://[userinfo@]host[:port][/path][?query][#fragment]
<a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a></p>
<h3 id="scheme">scheme</h3>
<p><code>https</code>
주로 프로토콜을 사용합니다.
http , https , ftp등등
http 는 포트 <code>80</code>  https는 포트<code>443</code> 을 주로 사용하기때문에 생략이 가능합니다.</p>
<h3 id="userinfo">userinfo</h3>
<ul>
<li>URL 에 사용자 정보를 포함해서 인증하는데 거의 사용하지 않습니다.</li>
</ul>
<h3 id="host">host</h3>
<p><code>www.google.com</code></p>
<ul>
<li>도메인명 또는 ip주소를 입력합니다.</li>
</ul>
<h3 id="port-1">port</h3>
<p><code>443</code></p>
<ul>
<li>접속 포트이며 생략이 가능합니다.(http==80 ,https==443 )</li>
</ul>
<h3 id="path">path</h3>
<p><code>search</code></p>
<ul>
<li>리스트경로 , 계층적 구조</li>
</ul>
<h3 id="query">query</h3>
<p><code>?q=hello&amp;hl=ko</code></p>
<ul>
<li>key=value 형태입니다. ?로 시작하며 &amp;로 추가가 가능합니다. </li>
<li>보통 <code>query parameter</code>, <code>query string</code> 라고도 불립니다.</li>
</ul>
<h3 id="fragment">fragment</h3>
<p>잘 사용하는편은 아님</p>
<ul>
<li>html 내부 북마크 등에 사용</li>
<li>서버에 전송하는 정보x</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 클래스 - 2]]></title>
            <link>https://velog.io/@hb-developer/200428</link>
            <guid>https://velog.io/@hb-developer/200428</guid>
            <pubDate>Wed, 28 Apr 2021 14:03:02 GMT</pubDate>
            <description><![CDATA[<h1 id="getter-setter">getter setter</h1>
<p>private 속성을 가진 클래스에서 인스턴스를 만들면 </p>
<p>인스턴스 <code>전체</code>에는 접근할수 있지만 인스턴스의 <code>속성</code>에는 접근할수 없습니다.</p>
<pre><code class="language-ts">class Person {
  constructor(private name:string,private age : number) {}
}
const user1 = new Person(&quot;Tim&quot;,20);
console.log(user1);        //  { name: &#39;Tim&#39;, age: 20 }
console.log(user1.name);  // 오류 &#39;name&#39; 속성은 private이며 &#39;Person&#39; 클래스 내에서만 액세스할 수 있습니다.</code></pre>
<p>이때 게터와 세터를 사용하면 private 을 유지하면서도 접근이 가능합니다.</p>
<p><code>get</code> -  인수가 없는 함수로, 프로퍼티를 읽을 때 동작함
<code>set</code> – 인수가 하나인 함수로, 프로퍼티에 값을 쓸 때 호출됨</p>
<p>get 의 <code>name</code> 과 private <code>name</code> 이 중복되므로 한쪽을 바꿔야 하는데</p>
<p>개발자 사이에서는 암묵적으로 속성값을<code>_이름</code> 으로 바꿔줍니다.</p>
<pre><code class="language-ts">class Person {
  constructor(private _name:string,private age : number) {}    // _name

  get name():string{
    return this._name
  }
}
const user1 = new Person(&quot;Tim&quot;,20);
const a = user1.name
console.log(a);              // Tim</code></pre>
<p>set은 프로퍼티에 값을 입력할때 사용</p>
<pre><code class="language-ts">class Person {
  constructor(private _name:string,private age : number) {}

  set name(value:string){
    this._name = value
  }
}
const user1 = new Person(&quot;Tim&quot;,20);

user1.name= &quot;Elon&quot;
console.log(user1);        // { _name: &#39;Elon&#39;, age: 20 }</code></pre>
<h2 id="readonly">readonly</h2>
<p>readonly 를 사용하면 public 이라 할지라도 외부에서 바꿀수 없습니다.</p>
<pre><code class="language-ts">class Person {
public readonly name:string = &quot;Tim&quot;
}

const user1 = new Person()
user1.name = &quot;hello&quot;            //   오류</code></pre>
<p>선언시 혹은 생성자 내부에서만 변경이 가능합니다.</p>
<pre><code class="language-ts">class Person {
  readonly name:string = &quot;Tim&quot;
   constructor(name:string){          
    this.name = name;             
}
  }
  const user1 = new Person(&quot;hello&quot;)
  console.log(user1.name);              // hello</code></pre>
<h2 id="index-signatures-in-class">Index Signatures in class</h2>
<p>인터페이스 <code>Index Signatures</code> 와 마찬가지로 정해진 형식없이 마음껏 추가할수 있는 방법입니다</p>
<pre><code class="language-ts">class Person{
  [index:string]:&#39;A&#39;|&#39;B&#39;|&#39;C&#39;
}
const a = new Person
a.Alice = &quot;A&quot;
a.Mark = &quot;B&quot;
a.Tim = &quot;C&quot; 
console.log(a);    // { Alice: &#39;A&#39;, Mark: &#39;B&#39;, Tim: &#39;C&#39; }</code></pre>
<h2 id="static">static</h2>
<p>클래스의 속성이나 함수를 호출하려면 <code>new 연산자</code>를 사용해
인스턴스를 만든뒤 인스턴스에서 불러왔습니다.</p>
<p>하지만 <code>static</code> 을 사용하면 클래스 자체에서 불러올수 있습니다.</p>
<pre><code class="language-ts">class Person {
static Country:string = &quot;Korea&quot;
}
console.log(Person.Country);   // Korea</code></pre>
<p>함수에도 사용 가능</p>
<pre><code class="language-ts">class Person {
 static hello(){
    console.log(&quot;안녕하세요&quot;);
  }
}
Person.hello();  // 안녕하세요</code></pre>
<p> private 일땐 외부에서 접근할수 없지만 내부에선 사용이 가능합니다.</p>
<pre><code class="language-ts">class Person {
private static Country:string = &quot;Korea&quot;
 static hello(){
    console.log(&quot;안녕하세요 &quot; + Person.Country);
  }
}
Person.hello();        // 안녕하세요 korea</code></pre>
<p>정적 스태틱은 인스턴스 끼리 공유를 합니다.
따라서 함수를 통해 스태틱 속성을 바꾸면 다른 인스턴스에도 영향을 미칩니다.</p>
<pre><code class="language-ts">class Person {
 static Country:string = &quot;Korea&quot;
  hello(){
    console.log(&quot;안녕하세요 &quot; + Person.Country);
  }
  change(){
    Person.Country = &quot;USA&quot;
  }
}
const user1 = new Person;
const user2 = new Person;

user2.hello();          // 안녕하세요 Korea
user1.change();         // user1 의 함수를 실행
user2.hello();          // 안녕하세요 USA  </code></pre>
<h2 id="abstract">abstract</h2>
<p><code>abstract</code> 란 추상 클래스를 만들때 사용합니다.
<code>abstract class</code>를 완벽하게 구현하지 않고 만든다음 자식 클래스에서 제대로 구현합니다.</p>
<pre><code class="language-ts">abstract class Person{
protected  abstract name:string ;
 abstract hello():void;
}</code></pre>
<p>혹시라도 abstract가 붙지않는 속성과 메서드가 있으면 그부분은 구현해야 합니다.</p>
<p>그후 상속을 이용해 자식클래스에서 모두 구현합니다.</p>
<pre><code class="language-ts">abstract class Person{
protected  abstract name:string ;
 abstract hello():void;
}

class User extends Person {
  protected name: string=&quot;Tim&quot;     // protected 는 자식클래스에서 접근 가능
  hello(): void {
    console.log(&quot;안녕하세요 &quot; + this.name);
  }
}
const a = new User()
a.hello()                     // 안녕하세요 Tim</code></pre>
<p>즉 abstract는 완벽하지않게 구현해도 오류가 발생하지 않고</p>
<p>자식클래스에서 상속받아 활용하기위해 만듭니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 클래스 - 1]]></title>
            <link>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85</guid>
            <pubDate>Tue, 27 Apr 2021 06:00:06 GMT</pubDate>
            <description><![CDATA[<h1 id="클래스">클래스</h1>
<p>ES6와 마찬가지로 타입스크립트에서도 클래스를 지원합니다.</p>
<pre><code class="language-ts">class Person {
  name;
  constructor(name: string){
     this.name = name;
  }
}
const user1 = new Person(&quot;Tim&quot;)
console.log(user1.name);        //Tim</code></pre>
<p>클래스는 생성자함수 없이 사용 할수도 있습니다.</p>
<pre><code class="language-ts">class Person {
name:string =&quot;Tim&quot;
age:number;        // 오류 발생
}

const user1 = new Person();
user1.age= 5;</code></pre>
<p>클래스 안에는 값을 할당해야합니다.</p>
<p>하지만 클래스 내부에는 이름만 외부에 값을 선언하고 싶을때에는</p>
<p>tsconfig 에서 strict 모드를 끄거나 :앞에 !표를 붙여줍니다. <code>age!:number;</code> </p>
<pre><code class="language-ts">class Person {
name:string =&quot;Tim&quot;
age!:number;
}

const user1 = new Person();
user1.age= 5;

console.log(user1); //  { name: &#39;Tim&#39;, age: 5 }</code></pre>
<h2 id="접근제한자">접근제한자</h2>
<p>타입스크립트는 접근제한자 기능을 지원합니다.</p>
<table>
<thead>
<tr>
<th>접근 가능성</th>
<th align="center">public</th>
<th align="center">protected</th>
<th align="center">private</th>
</tr>
</thead>
<tbody><tr>
<td>클래스 내부</td>
<td align="center">◯</td>
<td align="center">◯</td>
<td align="center">◯</td>
</tr>
<tr>
<td>자식 클래스 내부</td>
<td align="center">◯</td>
<td align="center">◯</td>
<td align="center">✕</td>
</tr>
<tr>
<td>클래스 인스턴스</td>
<td align="center">◯</td>
<td align="center">✕</td>
<td align="center">✕</td>
</tr>
</tbody></table>
<h3 id="public">public</h3>
<p>모든 클래스안의 속성들은 기본이 public 입니다. 외부에서 접근할수 있고 기본적으로 생략이 가능합니다.</p>
<pre><code class="language-ts">class Person {
public name:string =&quot;Tim&quot;        // === name:string =&quot;Tim&quot;
public age!:number;              // === age!:number;
}

const user1 = new Person();
user1.age= 5;</code></pre>
<h3 id="private">private</h3>
<p>private 을 사용하면 클래스 안에서만 접근이 가능합니다.</p>
<p><code>encapsulation</code>(캡슐화) 즉 수정되거나 보여서 안되는 값들을 보호하게 됩니다.</p>
<h2 id="생성자-함수-접근제한자">생성자 함수 접근제한자</h2>
<p>보통의 클래스 구조는 이러한 형태를 뜁니다.</p>
<pre><code class="language-ts">class Person {
  name: string;
  age:number;
  constructor(name:string,age:number) {
    this.name = name
    this.age = age;
  }
}</code></pre>
<p>위에서 선언을 하면 생성자 함수에서 초기화 하는 방식으로 말이죠</p>
<p>하지만 접근제한자를 생성자 함수의 매개변수로 사용하면 속성선언과 초기화를 암묵적으로 수행할수 있습니다.</p>
<pre><code class="language-ts">class Person {

  constructor(public name:string,public age:number) {
  }
}</code></pre>
<p>public 과 private 동일하게 사용할순 있지만 private을 사용하면 외부에선 접근이 불가능합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 인터페이스]]></title>
            <link>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-tnsk260u</link>
            <guid>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-tnsk260u</guid>
            <pubDate>Mon, 26 Apr 2021 13:24:56 GMT</pubDate>
            <description><![CDATA[<h1 id="인터페이스란">인터페이스란?</h1>
<p>인터페이스는 사용자가 정의한 타입의 모음 입니다.</p>
<p>타입스크립트 에서만 사용하는 하나의 타입약속 이기 때문에</p>
<p>실제 자바스크립트에선 사용되지 않습니다. (컴파일 시에 지워버림)</p>
<pre><code class="language-ts">interface user1 {
  name: string;
}</code></pre>
<h2 id="optional-property">optional property</h2>
<p>변수에 인터페이스 타입을 지정할때</p>
<p>해당 변수에는 인터페이스의 값들이 모두 존재 해야 합니다.</p>
<pre><code class="language-ts">interface user1 {
  name: string;
  age: number;
}

const p1:user1 = {        // 오류 발생 age 값이 없음
  name : &quot;Elon&quot;,                 

}</code></pre>
<p>인자를 넘겨도 되고 안넘겨도 될때에는 <code>?:</code> 형식으로 명시합니다.</p>
<pre><code class="language-ts">interface user1 {
  name: string;
  age?: number;            // ?:
}
const p1:user1 = {        // 오류 없음
  name : &quot;Elon&quot;,                  
}</code></pre>
<h2 id="indexable-type">indexable type</h2>
<p>인터페이스를 사용할땐 속성값이 동일해야 합니다.</p>
<p>만약 구조를 추가해서 사용 하고 싶을때는 <code>indexable type</code> 을 사용할수 있습니다.</p>
<pre><code class="language-ts">interface Foo{
  name: string;
  [index :string]:string 
}
const a : Foo = {
  name: &#39;Elon&#39;,
  hi:&quot;hi&quot;,
  hello:&quot;hello&quot;
}
</code></pre>
<p><code>[indexName : indexer type ] :return type</code> 형식으로 선언합니다.</p>
<p>name 과 같이 직접 표기한 것은 똑같이 명시 해야하지만 
인덱서블 타입은 추가를 원할때 사용 하기 때문에 옵셔널 타입이라고 볼수 있습니다.</p>
<p>다만 인덱서 타입은 <code>string</code> 과 <code>number</code> 두가지만 사용 할수 있으며 
선언된 즉시 인터페이스 안의 <code>값들은 모두</code> 인덱서 타입의 <code>서브타입</code>이 되야 합니다.</p>
<pre><code class="language-ts">interface Foo{
  name: number;                  //오류발생 &quot;number 는 string 에 할당이 불가능합니다&quot; (서브타입 x)
  [index :string]:string 
}</code></pre>
<p>따라서 보통의경우 인덱서블의 리턴타입을 늘리거나 <code>any</code> 를 사용합니다.</p>
<pre><code class="language-ts">interface Foo{
  name: number;
  [index :string]:any            // 오류 없음
}</code></pre>
<h2 id="인터페이스-함수">인터페이스 함수</h2>
<p>함수의 타입도 인터페이스를 사용할수 있습니다.</p>
<pre><code class="language-ts">interface Inum {
  (num1:number,num2:number):number
}

const sum : Inum = function(x,y){
  return x+y
} </code></pre>
<p>이때 <code>sum : Inum</code> 을 선언하면 함수 매개변수에는 굳이 타입을 지정하지 않아도 됩니다.</p>
<h2 id="extends---readonly">extends  , readonly</h2>
<p><code>extends</code> 를 사용하면 상속을 받을수 있습니다.</p>
<pre><code class="language-ts">interface IPerson {
  name: string
  readonly age?:number,
}

interface Iaddres extends IPerson{
  address:string
}

const user1: Iaddres = {
  name:&quot;Elon&quot;,
  age:20,
  address:&quot;USA&quot;
}</code></pre>
<p>만약 인터페이스 속성에 readonly 가 있으면 바꿀수 없습니다.</p>
<pre><code class="language-ts">user1.age=&quot;25&quot; //오류
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 tsconfig - 2]]></title>
            <link>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-9s5qt4vz</link>
            <guid>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-9s5qt4vz</guid>
            <pubDate>Sat, 24 Apr 2021 13:21:21 GMT</pubDate>
            <description><![CDATA[<h1 id="최상위-속성">최상위 속성</h1>
<p>타입스크립트 에는 9가지의 최상위 속성이 있습니다</p>
<ul>
<li>compilerOptions (tsc --init 시 자동생성)</li>
</ul>
<ul>
<li>compileOnSave</li>
<li>extends</li>
<li>files</li>
<li>include</li>
<li>exclude</li>
<li>references</li>
<li>ts-node</li>
<li>typeAcquisition</li>
</ul>
<h3 id="extends">extends</h3>
<p>tsconfig 에 존재하는 옵션을 상속 받습니다.</p>
<pre><code class="language-ts">&quot;extends&quot;: &quot;./base.json&quot;   </code></pre>
<p>예를들어 tsconfig 의 strict 의 옵션이 주석 처리 되있다고 가정했을때
/base.json 을 상속받고 그에 해당하는 옵션들을 동작합니다.</p>
<p>하지만 주석이 아닌 서로 상응하는 옵션이 있다면 tsconfig 의 옵션을 우선합니다.</p>
<h3 id="files">files</h3>
<p>기본적으로 <code>files</code> 와 <code>include</code> 를 사용하지 않고 <code>tsc</code>명령어를 사용하면
프로젝트의 모든 파일들이 컴파일 됩니다. </p>
<p>만약 특정 파일만 컴파일 하길 원한다면 <code>files</code>와<code>include</code> 를 사용하면 됩니다.</p>
<pre><code class="language-ts">&quot;files&quot;: [],</code></pre>
<p> 배열안에 경로를 string 형식으로 입력합니다.</p>
<h3 id="include">include</h3>
<pre><code class="language-ts"> &quot;include&quot;: [],</code></pre>
<p><code>files</code> 와 마찬가지로 특정 컴파일을 할때 사용합니다.</p>
<p>단  <code>include</code> 된 파일을 <code>exclude</code>하게되면 그 파일은 컴파일 되지 않습니다.</p>
<p> include 와 exclude 는 글롭 패턴을 지원합니다.</p>
<ul>
<li>* 0개 이상의 문자와 매칭 (디렉토리 구분 기호 제외)</li>
<li>? 한 문자와 매칭 (디렉토리 구분 기호 제외)</li>
<li>**/ 반복적으로 모든 하위 디렉토리와 매칭</li>
</ul>
<h3 id="exclude">exclude</h3>
<pre><code class="language-ts"> &quot;exclude&quot;: [],</code></pre>
<p> <code>exclude</code> 는 컴파일 파일을 제외할때 사용합니다.</p>
<p> 단 files 는 제외할수 없습니다.</p>
<h2 id="definitely-typed">Definitely Typed</h2>
<p> 자바스크립트는 타입스크립트와 달리 타입이 없습니다.</p>
<p> 만약 자바스크립트의 라이브러리를 타입스크립트로 가져오려면 어떻게 해야할까요?</p>
<pre><code> npm i react  // 추가 타입라이브러리 필요</code></pre><p> 리액트를 타입스크립트에서 사용하려면 타입 선언 모듈을 가져와야 합니다.</p>
<p>먼저 타입 선언모듈을 제공하는지 체크 해야되는데 명령어는 아래와 같습니다.</p>
<p> <code>npm info @types/모듈이름</code>  모듈검색</p>
<p> <code>npm i -D @types/모듈이름</code>  모듈설치</p>
<pre><code> npm i -D @types/react</code></pre><p>node_modules/@types/react 안에 d.ts 파일 생성됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트]]></title>
            <link>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@hb-developer/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Fri, 23 Apr 2021 12:45:18 GMT</pubDate>
            <description><![CDATA[<p>타입스크립트는 기본적으로 타입 추론을 제공합니다.</p>
<p>타입에 대해 명시하지 않으면 TS 자체적으로 판단하고 명시하죠</p>
<p>하지만 추론이란 어디서 부터 어디까지를 기준으로 두는것인지 애매하기 때문에</p>
<p><code>tsconfig.json</code> 파일에서 설정할수 있도록 만들었습니다.
<img src="https://images.velog.io/images/hb-developer/post/ef357e45-d72a-48c5-bd4b-6dd5dd0bbac6/%ED%99%94%EB%A9%B4%20%EC%BA%A1%EC%B2%98%202021-04-23%20203704.png" alt=""><center>(많은 설정들이 보인다)</center>
<br></p>
<h1 id="tsconfigjson">tsconfig.json</h1>
<p>협업을 하면 구현자 와 사용자가 있을겁니다.</p>
<p>만약 구현자가 함수를 추론위주로 구현하면 사용자가 의도치않게 다른타입의 인자를 넣을수 있습니다.</p>
<p>따라서 그런 일을 방지하고자  tsconfig.json 에는 구현자에게 오류를 알려주는 여러 옵션들이 존재합니다.</p>
<blockquote>
<p>아래 옵션들은 기본적으로 <code>true</code>로 설정되있습니다. </p>
</blockquote>
<h2 id="noimplicitany">noImplicitAny</h2>
<p><code>any 타입으로 암시한 표현식과 선언에 오류를 발생시킵니다.</code></p>
<p>매개변수에 타입을 명시하지 않은 경우입니다.</p>
<p>a 는 현재 any 라는 타입을 추론하고 있습니다.</p>
<p><code>&quot;noImplicitAny&quot;: true</code> 로 정했을 경우</p>
<pre><code class="language-ts">function num(a) {
  return a * 30
}
console.log(num(2));       // 60
console.log(&quot;hello&quot;);     // error</code></pre>
<p>컴파일 단계에서 오류가 발생합니다. </p>
<p>즉 <code>noImplicitAny</code> 옵션을 켰을때 타입스크립트는 사용자에게
&quot;any 면 직접 any를 명시하거나 다른타입을 명시해!&quot; 라고 오류를 출력하는겁니다.</p>
<pre><code class="language-ts">function num(a:number) {
  return a * 30
}

console.log(num(2));    //60
console.log(&quot;hello&quot;);   // 오류     </code></pre>
<h2 id="strictnullchecks">strictNullChecks</h2>
<p>타입을 명시했다고 가정합시다</p>
<p>매개변수에는 타입을 명시했지만 리턴값에는 명시하지 않았습니다.</p>
<p>그러면 타입스크립트는 자동적으로 number | undefined 두가지를 리턴합니다.
왜냐하면 null 과 undefined은 모든 타입의 하위 타입 이기 때문이죠</p>
<pre><code class="language-ts">function num(a:number){    //function num(a: number): number | undefined
  if(a&gt;0){ 
  return  a * 30;
  }
}
console.log(num(2));
console.log(num(-5)+5);      // NAN 인데 오류 출력을 안함</code></pre>
<p>그런데 문제가 있습니다. a 에 음수를 집어넣으면 undefined 이 return 되고 
여기에 5를 더하기 때문에 NAN 을 반환합니다.</p>
<p>리턴값에 넘버 하나만 명시하면 어떻게 될까요? </p>
<pre><code class="language-ts">function num(a:number):number{    
  if(a&gt;0){ 
  return  a * 30;
  }
}
console.log(num(-5)+5);      // NAN 인데 오류 출력을 안함</code></pre>
<p>리턴값을 number 만 명시해도 타입스크립트는 undefined 를 number 안에 포함시키기 때문에
오류 출력을 하지 않습니다. </p>
<p>이럴땐 <code>strictNullChecks</code> 를 <code>true</code> 로 설정하면 
모든 타입에 null 과 undefined 제거가 되고 오류를 발생 시킵니다.</p>
<h1 id="타입-시스템">타입 시스템</h1>
<p>프로그램 언어는 여러가지 타입시스템이 있습니다.</p>
<ul>
<li>structural type system </li>
<li>nominal type system </li>
<li>duck typing</li>
</ul>
<h3 id="structural-type-system">structural type system</h3>
<p><code>구조적 자료형 체계</code>라고도 불리는 <code>structural type system</code>은</p>
<p>타입스크립트의 자료형 체계이기도 합니다. 이름이 달라도 구조가 같으면 서로 같은것으로 판단합니다. ex)<code>(OCaml Go TypeScript Scala)</code></p>
<h3 id="nominal-type-system">nominal type system</h3>
<p><code>명목적 자료형 체계</code>라고 불리는 <code>nominal type system</code>은</p>
<p>상속과 같은 선언을 하지 않으면 구조가 일치해도 다른 타입이라고 판단합니다.</p>
<p>대표적으로는 <code>C++, C#, Java, 오브젝티브-C, Delphi, Swift, Rust</code> 등이 있습니다.</p>
<h3 id="duck-typing">duck typing</h3>
<p>duck typing은 structural type system 과 거의 비슷하지만
duck typing 은 <code>동적 언어</code>에서 structural type system 는 <code>정적 언어</code>라는 차이가 있습니다.</p>
<h1 id="타입호환성">타입호환성</h1>
<p>타입스크립트는 큰 타입에 작은 타입을 할당할수 있습니다. 여기서 작은 타입은 <code>서브타입</code> 이라고 합니다.</p>
<pre><code class="language-ts">let subtype : 1 =1;
let supertype :number=subtype
subtype = supertype  //오류 발생</code></pre>
<p><code>supertype : number</code> ,<code>subtype : 1</code> 입니다.  넘버란 타입에 1은 할당이 가능합니다.
하지만 숫자 1에 number 란 타입은 할당이 불가능하죠</p>
<pre><code class="language-ts">let subtype :[number, number] = [1,2]
let supertype:number[] = subtype
subtype = supertype; // 오류 발생</code></pre>
<p>마찬가지로 튜플은 배열의 서브 타입입니다. 배열에는 튜플을 할당할수 있지만 반대는 불가능합니다.</p>
<p>이번에는 <code>any</code> 를 살펴보겠습니다.</p>
<p>any 어떠한 것도 받을수 있는 타입입니다. 따라서 가장 상위타입이죠
any 는 어떠한것도 받을수 있지만 반대로도 가능합니다.</p>
<pre><code class="language-ts">let subtype : number =1;
let supertype:any = subtype;
subtype = supertype            //오류 없음</code></pre>
<p>any 는 특별한 타입이기 때문에 1이란 타입에 any를 할당하는것도 가능합니다 😨</p>
<p>any 같은 특별한 경우를 제외하면 대부분의 슈퍼타입은 서브타입에 할당이 불가능합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript 시작]]></title>
            <link>https://velog.io/@hb-developer/TypeScript</link>
            <guid>https://velog.io/@hb-developer/TypeScript</guid>
            <pubDate>Thu, 22 Apr 2021 13:58:59 GMT</pubDate>
            <description><![CDATA[<p>JavaScript 는 <code>약타입</code> 언어입니다. 형 변환이 자유롭기때문에 의도하지않은 오류가 발생하고</p>
<p>또 컴파일 이후에 오류를 체크할수 있습니다.</p>
<p>하지만 TypeScript 는 미리 타입을 지정해줌으로써 코딩중에도 쉽게 오류를 발견할수 있습니다.</p>
<h2 id="타입">타입</h2>
<p>타입스크립트 에는 총 13가지의 타입이 있습니다.</p>
<ul>
<li>불린: Boolean</li>
<li>숫자: Number</li>
<li>문자열: String</li>
<li>배열: Array</li>
<li>튜플: Tuple</li>
<li>열거형: Enum</li>
<li>모든 타입: Any</li>
<li>알 수 없는 타입: Unknown</li>
<li>객체: Object</li>
<li>Null과 Undefined</li>
<li>Void</li>
<li>Never</li>
</ul>
<h3 id="타입선언">타입선언</h3>
<p>자바스크립트와 다르게 타입스크립트에서는 타입 명시를 해줘야 합니다.</p>
<pre><code class="language-ts">let str: string = &#39;hi&#39;;</code></pre>
<p>변수에 <code>: type</code> 타입을 표기 해주는것을 영어로 타입명시(Type Annotation) 라고합니다.</p>
<p>명시를 하지 않았을땐 어떻게 될까요 ?</p>
<pre><code class="language-ts">let str= &#39;hi&#39;;</code></pre>
<p>사실 명시를 하지 않는다고 해서 오류가 발생하진 않습니다.</p>
<p>타입스크립트 는 자체적으로 <code>타입추론</code> 기능을 제공하기때문에 str 에는 string 타입이 명시됩니다.</p>
<h3 id="배열">배열</h3>
<p>잡탕과 같았던 JS배열과 달리 TS 에서 배열은 좀더 세밀한 명시가 가능합니다.</p>
<p>예를들어 아래와 같이 타입을 명시한뒤 배열을 만들수 있습니다. </p>
<pre><code class="language-ts">let fruits: string[] = [&#39;딸기&#39;,&#39;바나나&#39;,&#39;참외&#39;] 
let fruits: Array&lt;string&gt; = [&#39;딸기&#39;,&#39;바나나&#39;,&#39;참외&#39;] </code></pre>
<pre><code class="language-ts">let num: Array&lt;number&gt; = [1,2,3,4,5] 
let num:number[]=[1,2,3,4,5]; </code></pre>
<p>2가지 이상의 다중타입도 선언할수 있습니다.</p>
<pre><code class="language-ts">let num : Array&lt;string|number&gt; =[&#39;딸기&#39;,1,&#39;참외&#39;,2]
let num : (string | number)[] = [&#39;딸기&#39;,1,&#39;참외&#39;,2]</code></pre>
<p>만약 자바스크립트와 같은 배열을 만드려면 <code>any</code> 타입을 명시합니다.</p>
<pre><code class="language-ts">let arr: any = [&#39;a&#39;, 2, true,{},[],(function(){})];</code></pre>
<h3 id="튜플">튜플</h3>
<p>TS에서 배열은 같은 <code>종류</code>만 담는 배열 이였다면 튜플은 <code>길이</code>가 정해져 있는 배열입니다</p>
<pre><code class="language-ts"> let arr :[string,number,string]= [&#39;A&#39;,1,&#39;B&#39;];</code></pre>
<p> 튜플은 타입에 명시되있는 종류의 수만큼 배열의 길이가 정해집니다.
 또한 인덱스에 명시되있는 타입만 담을수 있죠</p>
<p> 만약 임의로 무언가를 추가하고 싶으면 push 나 splice를 사용할수 있습니다.</p>
<pre><code class="language-ts"> let arr :[string,number,string]= [&#39;A&#39;,1,&#39;B&#39;];
arr.push(&#39;hello&#39;);
console.log(arr);          //[ &#39;A&#39;, 1, &#39;B&#39;, 3 ]</code></pre>
<pre><code class="language-ts"> let arr :[string,number,string]= [&#39;A&#39;,1,&#39;B&#39;];
arr.splice(3,0,&#39;hello&#39;);
console.log(arr);        //[ &#39;A&#39;, 1, &#39;B&#39;, &#39;hello&#39; ]
</code></pre>
<p> 다만 고정 인덱스가 변경된것이 아니기 때문에 3번인덱스를 출력할땐 오류가 발생합니다.</p>
<pre><code class="language-ts">let arr :[string,number,string]= [&#39;A&#39;,1,&#39;B&#39;];
arr.push(&#39;hello&#39;);
console.log(arr);
console.log(arr[3]); // 컴파일 오류 </code></pre>
<h2 id="열거">열거</h2>
<p><code>이넘(Enum)</code>은 숫자 값을 가지는 문자열의 집합입니다.
week 이라는 enum 을 선언하고 요일을 넣으면 순서에 따라 <code>1씩</code> 증가하는 값을 가집니다.</p>
<pre><code class="language-ts">enum week {
  sun, //0
  mon, //1
  tue, //2
  whe, //3
  thu, //4
  fri, //5
  sat, //6
 }</code></pre>
<p>만약 임의로 숫자를 바꾸면 그 뒤의 숫자부터 다시 1씩 증가합니다.</p>
<pre><code class="language-ts">enum week {
  mon,   //0
  tue,   //1
  whe=10,//10
  thu,   //11
  fri,   //12
  sat=50,//50
  sun    //51
}</code></pre>
<h2 id="unknown">unknown</h2>
<p>unknown에는 어떠한 값도 넣을수 있지만 그값을 any를 제외한 나머지 타입에는 재할당 할수 없습니다.</p>
<pre><code class="language-ts">let a:unknown = &#39;hello&#39;;
let b:any;
let c:number;
b = a ;        // 성공
c = a ;       // 오류</code></pre>
<p>unknown 을 다시 대입하려는 타입과 <code>동일</code>한 <code>타입</code>으로 지정하면 대입할수 있는데 <code>as</code>를 사용하면 됩니다.</p>
<pre><code class="language-ts">let a:unknown = &#39;hello&#39;;
let b:any;
let c:number;

c = a as number;    // 할당성공 하지만 a 자체는 여전히 unknown이다</code></pre>
<h2 id="void">void</h2>
<p>void 는 어떠한 타입도 없는 빈 타입 입니다.</p>
<pre><code class="language-ts">let warn = function () :void {
  console.log(&quot;Error&quot;);        // 보통 함수에 쓰임
}</code></pre>
<p>void 를 선언 하는 이유는 반환된 값을 어떠한 곳에도 사용 하지 않겠다는 일종의 선언입니다.</p>
<pre><code class="language-ts">let a:null ;
let b:undefined ;
let c:void;
c =a;            // 오류 발생   void 에 null 할당불가
c =b;           // void 에 undefined 는 할당 가능</code></pre>
<p>void 는 대부분 리턴값이 없는 함수에 명시합니다.</p>
<h2 id="never">never</h2>
<p>never 에는 어떠한 값도 존재 할수 없습니다 보통 끝나지 않는 함수에 명시합니다.</p>
<pre><code class="language-ts">function hi(): never { 
  console.log(&quot;hello&quot;); // 끝나는 함수 이기 때문에 오류
}</code></pre>
<pre><code class="language-ts">function neverEnd(): never {
  while(true){

  }                 // 성공
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[SCSS - 2]]></title>
            <link>https://velog.io/@hb-developer/SCSS-2</link>
            <guid>https://velog.io/@hb-developer/SCSS-2</guid>
            <pubDate>Wed, 21 Apr 2021 09:02:05 GMT</pubDate>
            <description><![CDATA[<h2 id="반복문">반복문</h2>
<p>4번 반복 합니다. 
<code>@for $i from 1 to 5</code> {<br> }</p>
<pre><code class="language-scss"> @for $i from 1 to 5 {     1부터 5전까지
    .container{
        color:red;
    }
 }</code></pre>
<pre><code class="language-css"> .container {color: red;} 
 .container {color: red;}
 .container {color: red;}
 .container {color: red;}       //4개 출력</code></pre>
<p> 순전히 이렇게 사용하는건 뭔가 비효율적 입니다.</p>
<p> 그래서 보통 인접 형제의 순서를 나열할때 유용합니다. </p>
<p>자바스크립트에서의 보간은 <code>${}</code> 지만 SCSS 에서는 <code>#{}</code> 을 써줍니다</p>
<pre><code class="language-scss">scss
@for $i from 1 to 5 {
    .box:nth-child(#{$i}){
        width : 50px * $i;
    }
}</code></pre>
<pre><code class="language-css">css
.box:nth-child(1) {width: 50px;}

.box:nth-child(2) {width: 100px;}

.box:nth-child(3) {width: 150px;}

.box:nth-child(4) {width: 200px;}</code></pre>
<h2 id="함수">함수</h2>
<pre><code class="language-scss"> @function raito(para) {body}</code></pre>
<p> 대부분의 모니터 비율은 16:9 입니다.
 이를 함수로 구현해 간단하게 대입 해보겠습니다.</p>
<pre><code class="language-scss"> @function raito($width) {
  @return  $width * (9/16)
}

.box{
  $width:1920px;               // 원하는값 입력
  width: $width;
  height:raito($width);
}</code></pre>
<p> 결과</p>
<pre><code class="language-css"> .box {
  width: 1920px;
  height: 1080px;
}</code></pre>
<h2 id="내장-색상-함수">내장 색상 함수</h2>
<table>
<thead>
<tr>
<th align="center">함수</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>mix(color1,color2)</code></td>
<td align="center">2개의 색을 합칩니다.</td>
</tr>
<tr>
<td align="center"><code>lighten(color,1~100)</code></td>
<td align="center">색상을 더 밝게합니다.</td>
</tr>
<tr>
<td align="center"><code>darken(color,1~100)</code></td>
<td align="center">색상을 어둡게 만듭니다.</td>
</tr>
<tr>
<td align="center"><code>saturate(color,1~100)</code></td>
<td align="center">채도를 올립니다.</td>
</tr>
<tr>
<td align="center"><code>desaturate(color,1~100)</code></td>
<td align="center">채도를 내립니다.</td>
</tr>
<tr>
<td align="center"><code>grayscale(color)</code></td>
<td align="center">회색으로 바꿉니다.</td>
</tr>
<tr>
<td align="center"><code>invert(color)</code></td>
<td align="center">색을 반전 시킵니다.</td>
</tr>
<tr>
<td align="center"><code>rgb(color,0~1)</code></td>
<td align="center">색을 불투명하게 만듭니다.</td>
</tr>
</tbody></table>
<h2 id="가져오기">가져오기</h2>
<p>VSC 기준으로 SCSS 파일은 다른 SCSS 파일을 손쉽게 가져올수 있습니다.
자바스크립트와 달리 export 할 필요 없이 import 만 해도 되죠
<code>@import url(&#39;./tset.scss&#39;);</code> 다만 좀더 간략하게 <code>@import &#39;./tset&#39;;</code> 로 표현할수도 있습니다.한번에 가져올때는 <code>@import &#39;./test&#39;,&#39;./tset2&#39;;</code>  , 콤마를 씁니다.</p>
<h2 id="데이터">데이터</h2>
<p>SCSS 에서의 데이터 종류 입니다.</p>
<table>
<thead>
<tr>
<th>데이터</th>
<th>설명</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td>Numbers</td>
<td>숫자</td>
<td>1, .82, 20px, 2em…</td>
</tr>
<tr>
<td>Strings</td>
<td>문자</td>
<td>bold, relative, &quot;/images/a.png&quot;, &quot;dotum&quot;</td>
</tr>
<tr>
<td>Colors</td>
<td>색상 표현</td>
<td>red, blue, #FFFF00, rgba(255,0,0,.5)</td>
</tr>
<tr>
<td>Booleans</td>
<td>논리</td>
<td>true, false</td>
</tr>
<tr>
<td>Nulls</td>
<td>아무것도 없음</td>
<td>null</td>
</tr>
<tr>
<td>Lists</td>
<td>공백이나 ,로 구분된 값의 목록</td>
<td>(apple, orange, banana), apple orange</td>
</tr>
<tr>
<td>Maps</td>
<td>Lists와 유사하나 값이 Key: Value 형태</td>
<td>(apple: a, orange: o, banana: b)</td>
</tr>
</tbody></table>
<h2 id="each">@each</h2>
<p>@each 는 반복문과 유사한 형태입니다. 다만 서로다른 형태로 반환하죠
<code>@each $var in list {}</code>
리스트를 사용해 아래와 같이 표현할수 있습니다. 배열처럼 순서대로 생성합니다.</p>
<pre><code class="language-scss">$list: orange,red,blue;
@each $col in $list {
    .box{
      color:$col
    }
}</code></pre>
<pre><code class="language-css">.box {
  color: orange;
}

.box {
  color: red;
}

.box {
  color: blue;
}</code></pre>
<p>map은 객체와 유사한 형태입니다. 키와 값을 가지고 있죠
자바스크립트와 다른점은 <code>{}</code> 중괄호가 아닌 <code>()</code> 소괄호를 사용합니다.</p>
<p>map은 <code>키</code>와 <code>값</code>을 가지고 있기때문에 변수를 두개 선언합니다</p>
<pre><code class="language-scss">@each $key ,$value in $map {}</code></pre>
<p>변수가 2개이기 때문에 원하는곳에 추가로 사용할수 있습니다.</p>
<pre><code class="language-scss">SCSS
$map:(
  o:orange,
  r:red,
  b:blue
);
@each $key ,$value in $map {
    .box-#{$key}{
      color: $value
    }
}</code></pre>
<pre><code class="language-css">CSS
.box-o {
  color: orange;
}

.box-r {
  color: red;
}

.box-b {
  color: blue;
}
</code></pre>
<p>보간법을 이용해서 서로다른 클래스에 적용할수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SCSS -1]]></title>
            <link>https://velog.io/@hb-developer/SCSS</link>
            <guid>https://velog.io/@hb-developer/SCSS</guid>
            <pubDate>Tue, 20 Apr 2021 12:45:08 GMT</pubDate>
            <description><![CDATA[<h1 id="scss-😀">SCSS 😀</h1>
<p>SCSS 는 CSS 를 좀더 쉽게 작성시켜주는 전처리기(Compiler) 입니다.</p>
<p>가장 눈에 뛰는 이점은 중첩을 간소화 시켜줍니다.</p>
<pre><code class="language-css">.conatiner {

}
.conatiner .inner{

}

.conatiner .inner .menu {

}

.conatiner .inner .menu .main-menu{

}</code></pre>
<p>CSS는 하위 요소를 늘릴때마다 상위 요소를 전부 적어줘야 합니다.
하지만 SCSS 는 프로그래밍 언어 처럼 중첩을 지원합니다.</p>
<pre><code class="language-scss">.conatiner{
  .inner{
    .menu{
      .main-menu{

      }
    }
  }
}</code></pre>
<h2 id="선택자">선택자</h2>
<p><strong>자식선택자</strong>
&gt; 꺽쇠 기호를 써줍니다. </p>
<pre><code class="language-scss">.conatiner{                        //.conatiner &gt; .inner { }
  &gt;.inner{}}</code></pre>
<p><strong>일치선택자</strong>
&amp; 엠퍼센드 기호를 써줍니다.</p>
<pre><code class="language-scss">//scss
.list {
  li {
    &amp;:last-child {
      margin-right: 0;
    }
  }
}</code></pre>
<pre><code class="language-css">.list li:last-child {
  margin-right: 0;
}</code></pre>
<p>혹은 상위 선택자를 참조 할수도 있습니다.</p>
<pre><code class="language-scss">.fs {
  &amp;-small { font-size: 12px; }
  &amp;-medium { font-size: 14px; }
  &amp;-large { font-size: 16px; }
}</code></pre>
<pre><code class="language-css">.fs-small {
  font-size: 12px;
}
.fs-medium {
  font-size: 14px;
}
.fs-large {
  font-size: 16px;
}</code></pre>
<h2 id="중첩속성">중첩속성</h2>
<p><code>margin : {};</code> 는 <code>margin-</code> 로 바뀝니다</p>
<pre><code class="language-css">body {
  margin:{
    top:20px;
    right: 30px;
    bottom: 40px;
    left: 10px;
  };
}</code></pre>
<pre><code class="language-css">body {
  margin-top: 20px;
  margin-right: 30px;
  margin-bottom: 40px;
  margin-left: 10px;
}</code></pre>
<h2 id="변수">변수</h2>
<p>SCSS 에서는 변수를 선언하고 지정할수 있습니다.</p>
<pre><code class="language-scss">body {
 top:100px;
 .item{
   width:100px;
   height: 100px;
 } 
}</code></pre>
<p><code>$</code> 달러 사인으로 <code>size:100px;</code> 를 선언하고 $size 를 입력하면 동일하게 출력됩니다.</p>
<pre><code class="language-scss">$size:100px;
body {
 top:$size;
 .item{
   width:$size;
   height: $size;
 } 
}</code></pre>
<p>다만 <code>선언된 곳</code>에 따라 변수사용이 가능합니다.
블록 안에 선언되면 그 블록에서만, 전역 공간에서 선언되면 css 전체에서 사용이 가능합니다.</p>
<h2 id="산술연산">산술연산</h2>
<p>아래 산술연산을 해보겠습니다.</p>
<pre><code class="language-scss">SCSS
box {
 width: 50px + 20px;
 height: 40px - 20px;
 margin-top: 50px*2;
 margin-bottom: 40px / 2;
 margin-left: 20px % 6 ;
}</code></pre>
<pre><code class="language-css">CSS
box {
  width: 70px;
  height: 20px;
  margin-top: 100px;
  margin-bottom: 40px/2;      // 계산안됨
  margin-left: 2px;
}</code></pre>
<p>다만 문제가 있습니다.</p>
<p>css 에서는 <code>/ 기호</code>를 단축 기호로 인식 하기 때문에 아래와 같은 방법을 사용해야 합니다.</p>
<p><code>1. 변수 선언하기</code> 변수를 선언하고 나누기 기호를 사용한다. ex) <code>$size / 2</code>
<code>2.괄호를 사용한다</code> <code>(40px / 2) == 20px</code></p>
<blockquote>
<p>! 산술연산은 같은 단위끼리 계산해야합니다.
만약 다른 단위 끼리 계산하려면 <code>calc()</code> 함수를 이용해야합니다.</p>
</blockquote>
<h2 id="mixin-include">@mixin @include</h2>
<p>@mixin 을 이용하면 속성값의 모음을 변수처럼 사용할수 있습니다.</p>
<pre><code class="language-scss">SCSS
@mixin size {           // size 선언
  height: 100px;
  width: 100px;
  color:green
}

.container{
  @include size;            //size 대입
  .item{
    @include size;
  }
}
</code></pre>
<pre><code class="language-css">CSS
.container {
  height: 100px;
  width: 100px;
  color: green;
}
.container .item {
  height: 100px;
  width: 100px;
  color: green;
}</code></pre>
<p>만약 .container 는 <code>100px</code> 으로 item은 <code>50px</code> 로 바꾸려면 어떻게 해야할까요?
<code>@mixin</code> 는 선언할때 인수를 받을수 있습니다.</p>
<pre><code class="language-scss">SCSS
@mixin size($sz) {
  height: $sz;
  width: $sz;
  color:green;
}

.container{
  @include size(100);
  .item{
    @include size(50);
  }
}</code></pre>
<pre><code class="language-css">.container {
  height: 100;
  width: 100;
  color: green;
}
.container .item {
  height: 50;
  width: 50;
  color: green;
}</code></pre>
<blockquote>
<p>만약 일일히 인수값을 대입하는게 번거로울때는 매개변수에 기본값을 설정해줄수 있습니다. <code>@mixin size($sz:100px)</code> 기본값 그대로 사용하고싶을떈  <code>@include size</code> 그대로 사용할수 있죠로 사용할수 있죠</p>
</blockquote>
<p>참고자료 : <a href="https://heropy.blog/2018/01/31/sass/">https://heropy.blog/2018/01/31/sass/</a></p>
]]></description>
        </item>
    </channel>
</rss>