<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>__bw95__.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 22 Mar 2023 07:52:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>__bw95__.log</title>
            <url>https://velog.velcdn.com/images/__bw95__/profile/b806f1d6-1230-43cd-af50-bd1079b17248/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. __bw95__.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/__bw95__" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[javascript ES6 함수의 추가 기능]]></title>
            <link>https://velog.io/@__bw95__/javascript-ES6-%ED%95%A8%EC%88%98%EC%9D%98-%EC%B6%94%EA%B0%80-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@__bw95__/javascript-ES6-%ED%95%A8%EC%88%98%EC%9D%98-%EC%B6%94%EA%B0%80-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Wed, 22 Mar 2023 07:52:45 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-es6-함수의-추가-기능">💡 ES6 함수의 추가 기능</h1>
<h3 id="✔-함수의-구분">✔ 함수의 구분</h3>
<ul>
<li>ES6 이전의 모든 함수는 일반 함수로서 호출할 수 있는 것은 물론 생성자 함수로서 호출할 수 있다</li>
<li>일반적으로 메서드라고 부르던 객체에 바인딩된 함수 역시 <code>callable</code> 이며, <code>constructor</code> 이다</li>
<li>객체에 바인딩된 함수가 <code>constructor</code>라는 것은 <code>protytype</code> 프로퍼티를 가지며, 프로토타입 객체도 생성한다는 것을 의미하기 때문에 성능 면에서도 문제가 있다</li>
<li>이를 해결하기 위해 <code>npn-constructor</code>인 ES6의 메서드와 화살표 함수가 등장했다</li>
</ul>
<hr>
<h3 id="✔-메서드">✔ 메서드</h3>
<ul>
<li>ES6 사양에서 메서드는 메서드 축약 표현으로 정의된 함수만을 의미한다</li>
<li>ES6 사양에서 메서드는 인스턴스를 생성할 수 없는 <code>non-contructor</code>다. 따라서 생성자 함수로 호출할 수 없다</li>
<li>ES6 메서드는 자신을 바인딩한 객체를 가리키는 내부 슬롯 <code>[[HomeObject]]</code>를 갖는다</li>
<li>ES6 메서드가 아닌 함수는 내부 슬롯 <code>[[HomeObject]]</code>를 갖지 않기 때문에 <code>super</code>키워드를 사용할 수 없다</li>
</ul>
<hr>
<h3 id="✔-화살표-함수">✔ 화살표 함수</h3>
<ul>
<li>기존의 함수 정의 방식보다 간략하며 내부 동작도 기존 함수보다 간략하다</li>
<li>콜백 함수 내부에서 <code>this</code>가 전역 객체를 가리키는 문제를 해결하기 위한 대안으로 유용하다</li>
</ul>
<h4 id="1-화살표-함수-정의">1. 화살표 함수 정의</h4>
<ol>
<li><p>함수 정의</p>
<ul>
<li>함수 선언문으로 정의할 수 없고 함수 표현식으로 정의해야 한다</li>
</ul>
</li>
<li><p>매개변수 선언</p>
<ul>
<li>소괄호 안에 매개변수를 선언한다</li>
<li>매개변수가 한 개인 경우 소괄호를 생략할 수 있고, 없다면 생락햘 수 없다</li>
</ul>
</li>
<li><p>함수 몸체 정의</p>
<ul>
<li>함수 몸체가 하나의 문으로 구성된다면 중괄호를 생략할 수 있디</li>
<li>이때 함수 몸체 내부의 문이 값으로 평가될 수 있는 표현식인 문이라면 암묵적으로 반환된다</li>
<li>생략과 함께 객체 리터럴을 반환하는 경우 객체 리터럴을 소괄호로 감싸 주어야 한다</li>
</ul>
</li>
</ol>
<h4 id="2-화살표-함수와-일반-함수의-차이">2. 화살표 함수와 일반 함수의 차이</h4>
<ul>
<li>화살표 함수는 인스턴스를 생성할 수 없는 <code>non-cunstructor</code>다</li>
<li>중복된 매개변수 이름을 선언할 수 없다</li>
<li>화살표 함수는 함수 자체의 <code>this</code>, <code>arguments</code>, <code>super</code>, <code>new.target</code> 바인딩을 갖지 않는다</li>
</ul>
<h4 id="3-this">3. this</h4>
<ul>
<li><code>this</code> 바인딩은 함수의 호출 방식, 즉 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다. 주의할 것은 일반 함수로서 호출되는 콜백 함수의 경우다</li>
<li>고차 함수의 인수로 전달되어 고차 함수 내부에서 호출되는 콜백 함수도 중첩 함수라고 할 수 있다<blockquote>
<pre><code>class Prefixer {
constructor(prefix) {
  this.prefix = prefix;
}
</code></pre></blockquote>
add(arr) {
  // add 메서드는 인수로 전달된 배열 arr을 순화하며 배열의 모든 요소에 prefix를 추가한다
  return arr.map(function (item){<pre><code>return this.prefix + item; // TypeError</code></pre>  });
}
}<blockquote>
</blockquote>
const prefixer = new Prefixer(&quot;-webkit-&quot;);
console.log(prefixer.add([&#39;transition&#39;, &#39;user-select&#39;]));<blockquote>
<p>```</p>
</blockquote>
</li>
<li>위 예시에서 <code>Array.prototype.map</code> 메서드가 콜백 함수를 일반 함수로서 호출하기 때문에 <code>this</code>가 전역 객체를 가리키게 된다</li>
<li>그런데 클래스 내부의 모든 코드에는 <code>strict mode</code>가 암묵적으로 적용되고, 이 경우 <code>this</code> 에는 <code>undefined</code>가 바인딩된다</li>
</ul>
<h4 id="4-super">4. super</h4>
<ul>
<li>화살표 함수는 함수 자체의 <code>super</code> 바인딩을 갖지 않는다</li>
<li>따라서 화살표 함수 내부에서 <code>super</code>를 참조하면 상위 스코프의 <code>super</code>를 참조한다</li>
</ul>
<h4 id="5-arguments">5. arguments</h4>
<ul>
<li>화살표 함수는 함수 자체의 <code>arguments</code> 바인딩을 갖지 않는다</li>
<li>따라서 화살표 함수 내부에서 <code>arguments</code>를 참조하면 상위 스코프의 <code>arguments</code>를 참조한다</li>
</ul>
<h3 id="✔-rest-파라미터">✔ Rest 파라미터</h3>
<h4 id="1-기본-문법">1. 기본 문법</h4>
<ul>
<li><code>Rest</code> 파라미터는 함수에 전달된 인수들의 목록을 배열로 전달받는다<blockquote>
<pre><code>function foo(param, ...rest) {
console.log(param); // 1
console.log(rest); // [2, 3, 4, 5]
}
</code></pre></blockquote>
foo(1, 2, 3, 4, 5);<blockquote>
<p>```</p>
</blockquote>
</li>
<li><code>Rest</code> 파라미터는 먼저 선언된 매개변수에 할당된 인수를 제외한 나머지 인수들로 구성된 배열이 할당된다</li>
</ul>
<h4 id="2-rest-파라미터와-arguments-객체">2. Rest 파라미터와 arguments 객체</h4>
<ul>
<li><code>arguments</code> 객체는 함수 호출 시 전달된 인수들의 정보를 담고 잇는 순회 가능한 유바 배열 객체이며, 함수 내부에서 지역 변수처럼 사용할 수 있다</li>
<li>하지만 <code>arguments</code> 객체는 유사 배열 객체이므로 배열 메서드를 사용하기 번거로웠다. ES6의 <code>Rest</code> 파라미터는 배열로 직접 전달받을 수 있기 때문에 유용하다</li>
<li>특히, 화살표 함수에서는 반드시 <code>Rest</code> 파라미터를 사용해야 한다</li>
</ul>
<h3 id="✔-매개변수-기본값">✔ 매개변수 기본값</h3>
<ul>
<li>자바스크립트 엔진은 매개변수의 개수와 인수의 개수를 체크하지 않는다</li>
<li>인수가 전달되지 않은 매개변수의 값은 <code>undefined</code>다<blockquote>
<pre><code>function sum(a = 0, b = 0) {
return a + b;
}
</code></pre></blockquote>
console.log(sum(1)); // 1<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript Class]]></title>
            <link>https://velog.io/@__bw95__/javascript-Class</link>
            <guid>https://velog.io/@__bw95__/javascript-Class</guid>
            <pubDate>Wed, 15 Mar 2023 04:30:26 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-클래스">💡 클래스</h1>
<h3 id="✔-클래스는-프로토타입의-문법적-설탕인가">✔ 클래스는 프로토타입의 문법적 설탕인가?</h3>
<ul>
<li>클래스를 프로토타입 기반 객체 생성 패턴의 단순한 문법적 설탕이라고 보기보다는 새로운 객체 생성 메커니즘으로 보는 것이 좀 더 합당하다</li>
</ul>
<hr>
<h3 id="✔-클래스-정의">✔ 클래스 정의</h3>
<ul>
<li><p>클래스는 <code>class</code> 키워드를 사용하여 정의한다</p>
<blockquote>
<pre><code>const Person = class {};  // 익명 클래스 표현식
const Person = class MyClass{}; // 가명 클래스 표현식</code></pre></blockquote>
</li>
<li><p>클래스를 표현식으로 정의할 수 있다는 것은 클래스가 값으로 사용할 수 있는 일급 객체라는 것을 의미하고, 다음과 같은 특징을 갖는다</p>
<ul>
<li>무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다</li>
<li>변수나 자료구조에 저장할 수 있다</li>
<li>함수의 매개변수에게 전달할 수 있다</li>
<li>함수의 반환값으로 사용할 수 있다</li>
</ul>
</li>
</ul>
<hr>
<h3 id="✔-클래스-호이스팅">✔ 클래스 호이스팅</h3>
<ul>
<li>클래스는 함수로 평가된다</li>
<li>클래스 선언문은 마치 호이스팅이 발생하지 않는 것처럼 보이나 그렇지 않다<blockquote>
<pre><code>const Person = &#39;&#39;;
</code></pre></blockquote>
{
// 호이스팅이 발생하지 않는다면 &#39;&#39;이 출력되어야 한다.
console.log(Person); 
// ReferenceError: Cannot access &#39;Person&#39; before initialization<blockquote>
</blockquote>
// 클래스 선언문
class Person {};
}<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-인스턴스-생성">✔ 인스턴스 생성</h3>
<ul>
<li>클래스는 생성자 함수이며 new 연산자와 함께 호출되어 인스턴스를 생성한다<blockquote>
<pre><code>class Person {}
</code></pre></blockquote>
// 인스턴스 생성
const me = new Person();
console.log(me); // Person {}<blockquote>
</blockquote>
class Person {}<blockquote>
</blockquote>
// 클래스를 new 연산자 없이 호출하면 타입 에러가 발생한다
const me = Person();
// TypeError: Class constructor Foo cannot be invoked without &#39;new&#39;<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h3 id="✔-메서드">✔ 메서드</h3>
<ul>
<li>클래스 몸체에는 0개 이상의 메서드만 선언할 수 있다</li>
<li>클래스 몸체에서 정의할 수 있는 메서드는 constructor(생성자), 프로토타입 메서드, 정적 메서드의 세 가지가 있다</li>
</ul>
<h4 id="1-constructor">1. constructor</h4>
<ul>
<li><code>constructor</code>는 인스턴스를 생성하고 초기화하기 위한 특수한 메서드이며, 이름을 변경할 수 없다<blockquote>
<pre><code>class Person {
// 생성자
constructor(name) {
  // 인스턴스 생성 및 초기화
  this.name = name;
}
}</code></pre></blockquote>
</li>
<li>클래스는 평가되어 함수 객체가 된다</li>
<li>모든 함수 객체가 가지고 있는 <code>prototype</code> 프로퍼티가 가리키는 프로토타입 객체의 <code>constructor</code> 프로퍼티는 클래스 자신을 가리키고 있다<br></li>
<li>클래스가 생성한 인스턴스의 내부를 들여다보면 수퍼 클래스의 <code>constructor</code> 내부에서 <code>this</code>에 추가한 프로퍼티가 인스턴스의 프로퍼티로 추가된 것을 확인할 수 있다</li>
<li>즉, <code>constructor</code> 내부의 <code>this</code>는 생성자 함수와 마찬가지로 클래스가 생성한 인스턴스를 가리킨다<br></li>
<li>그런데 클래스가 평가되어 생성된 함수 객체나 인스턴스 어디에도 <code>constructor</code> 메서드를 확인할 수 없다</li>
<li>이는 <code>constructor</code>가 단순한 메서드가 아니라는 것을 의마한다</li>
<li><code>constructor</code>는 메서드로 해석되는 것이 아니라 클래스가 평가되어 생성한 함수 객체코드의 일부가 된다</li>
<li>즉, 클래스 정의가 평가되면 <code>constructor</code>의 기술된 동작을 하는 함수 객체가 된다<ul>
<li><code>constructor</code>는 클래스 내에 최대 한 개만 존재할 수 있다.</li>
<li><code>constructor</code>는 생략할 수 있다. 생략하면 빈 <code>constructor</code>가 암묵적으로 정의된다.</li>
<li>인스턴스를 초기화하려면 <code>constructor</code>를 생략해서는 안된다.</li>
<li><code>constructor</code>는 별도의 반환문을 갖지 않아야 한다. 암묵적으로 <code>this</code>, 즉 인스턴스를 반환하기 때문이다.</li>
</ul>
</li>
</ul>
<h4 id="2-프토로타입-메서드">2. 프토로타입 메서드</h4>
<ul>
<li>생성자 함수를 사용하여 프로토타입 메서드를 생성하기 위해서는 명시적으로 프로토타입에 메서드를 추가해야 한다</li>
<li>하지만 클래스 몸체에서 정의한 메서드는 기본적으로 프로토타입 메서드가 된다<blockquote>
<pre><code>class Person {
constructor(name) {
  this.name = name;
}
</code></pre></blockquote>
sayHi() {
  console.log(<code>Hi, ${this.name}</code>)
}
}<blockquote>
</blockquote>
const me = new Person(&quot;Lee&quot;);
me.sayHi(); // Hi, Lee<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="3-정적-메서드">3. 정적 메서드</h4>
<ul>
<li>정적 메서드는 인스턴스를 생성하지 않아도 호출할 수 있는 메서드를 말한다</li>
<li>생성자 함수의 경우 정적 메서드를 생성하기 위해서 명시적으로 생성자 함수에 메서드를 추가해야한다</li>
<li>하지만 클래스에서는 메서드에 <code>static</code> 키워드를 붙이면 적적 메서드(클래스 메서드)가 된다<blockquote>
<pre><code>class Person {
constructor(name) {
  this.name = name;
}
</code></pre></blockquote>
static sayHi() {
  console.log(&quot;Hi&quot;)
}
}<blockquote>
</blockquote>
Person.sayHi(); // Hi<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="4-정적-메서드와-프로토타입-메서드의-차이">4. 정적 메서드와 프로토타입 메서드의 차이</h4>
<ul>
<li>정적 메서드와 프로토타입 메서드는 속해 있는 프로토타입 체인이 다르다</li>
<li>정적 메서드는 클래스로 호출하고, 프로토타입 메서드는 인스턴스로 호출한다</li>
<li>정적 메서드는 인스턴스 프로퍼티를 참조할 수 없지만 프로토타입 메서드는 인스턴스 프로퍼티를 참조할 수 있다</li>
</ul>
<h4 id="5-클래스에서-정의한-메서드의-특징">5. 클래스에서 정의한 메서드의 특징</h4>
<ol>
<li><code>function</code> 키워드를 생략한 메서드 축약 표현을 사용한다</li>
<li>객체 리터럴과는 다르게 클래스에 메서드를 정의할 때는 콤마가 필요 없다</li>
<li>암묵적으로 <code>strict mode</code>로 실행된다</li>
<li><code>for...in</code> 문이나 <code>Object.keys</code> 메서드 등으로 열거할 수 없다. 즉, 프로퍼티의 열거 기능 여부를 나타내며, 불리언 값을 갖는 프로퍼티 어트리뷰트 <code>[[Ebumerable]]</code>의 값이 <code>false</code>다</li>
<li>내부 메서드 <code>[[Construct]]</code>를 갖지 않는 <code>non-constructor</code>다. 따라서 <code>new</code> 연산자와 함께 호출할 수 없다</li>
</ol>
<h3 id="✔-클래스의-인스턴스-생성-과정">✔ 클래스의 인스턴스 생성 과정</h3>
<ul>
<li><code>new</code> 연산자와 함께 클래스를 호출하면 생성자 함수와 마찬가지로 클래스의 내부 메서드[[Constructor]]가 호출된다</li>
</ul>
<h4 id="1-인스턴스-생성과-this-바인딩">1. 인스턴스 생성과 this 바인딩</h4>
<ul>
<li><code>new</code> 연산자와 함께 클래스를 호출하면 <code>constructor</code> 내부 코드가 실행되기에 앞서 암묵저긍로 빈 객체가 생성된다</li>
<li>이 빈 객체가 바로 클래스가 생성한 인스턴스다</li>
<li>이때 클래스가 생성한 인스턴스의 프로토타입으로 클래스의 <code>prototype</code> 프로퍼티가 가리키는 객체가 설정된다, 그리고 인스턴스는 <code>this</code>에 바인딩된다</li>
</ul>
<h4 id="2-인스턴스-초기화">2. 인스턴스 초기화</h4>
<ul>
<li><code>constructor</code>의 내부 코드가 실행되어 <code>this</code>에 바인딩되어 있는 인스턴스를 초기화한ㄷ</li>
<li>즉, 인스턴스에 프로퍼티를 추가하고 <code>constructor</code>가 인수로 전달받은 초기값으로 인스턴스의 프로퍼티 값을 초기화한다</li>
<li>만약 <code>custructor</code>가 생략되었다면 이 과정도 생략된다</li>
</ul>
<h4 id="3-인스턴스-반환">3. 인스턴스 반환</h4>
<ul>
<li>클래스의 모든 처리가 끝나면 완성된 인스턴스가 바인딩된 <code>this</code>가 암묵적으로 반환된다</li>
</ul>
<hr>
<h3 id="✔-프로퍼티">✔ 프로퍼티</h3>
<h4 id="1-인스턴스-프로퍼티">1. 인스턴스 프로퍼티</h4>
<ul>
<li>인스턴스 프로퍼티는 <code>constructor</code> 내부에서 정의해야 한다<blockquote>
<pre><code>class Person {
constructor(name) {
  // 인스턴스 프로퍼티
  this.name = name;
}
}
</code></pre></blockquote>
const me = new Person(&quot;Lee&quot;);
console.log(me); // Person {name: &quot;Lee&quot;}<blockquote>
<p>```</p>
</blockquote>
</li>
<li><code>constructor</code> 내부 코드가 실행되기 이전에 이미 <code>this</code>에는 빈 객체(인스턴스)가 바인딩되어 있다</li>
<li>생성자 함수에서 인스턴스의 프로퍼티를 정의하는 것과 마찬가지로 <code>constructor</code> 내부에서 <code>this</code>에 인스턴스 프로퍼티를 추가한다</li>
<li>이로써 인스턴스에 프로퍼티가 추가되어 인스터스를 초기화한다</li>
</ul>
<h4 id="2-접근자-프로퍼티">2. 접근자 프로퍼티</h4>
<ul>
<li>접근자 프로퍼티는 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티다</li>
<li><code>getter</code>, <code>setter</code> 함수로 구성되어 있다<blockquote>
<pre><code>class Person {
</code></pre></blockquote>
constructor(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}
// fullName은 접근자 함수로 구성된 접근자 프로퍼티다
// getter 함수
get fullName() {
  return <code>${this.firstName} ${this.lastName}</code>
}<blockquote>
</blockquote>
// setter 함수
set fullName(name) {
  [this.firstName, this.lastName] = name.split(&quot; &quot;);
}
}<blockquote>
</blockquote>
const me = new Person(&quot;bw&quot;, &quot;Lee&quot;);<blockquote>
</blockquote>
// 데이터 프로퍼티를 통한 프로퍼티 값의 참조
console.log(me.firstName); // &#39;bw Lee&#39;<blockquote>
</blockquote>
// 접근자 프로퍼티를 통한 프로퍼티 값의 저장
// fullName에 값을 저장하면 setter 함수가 호출된다.
me.fullName = &quot;Heegun Lee&quot;;
console.log(me); // {firstName: &quot;Heegun&quot;, lastName: &quot;Lee&quot;}<blockquote>
</blockquote>
// 접근자 프로퍼티를 통한 프로퍼티 값의 참조
// fullName에 접근하면 getter 함수가 호출된다.
console.log(me.fullName); // &#39;Heegun Lee&#39;<blockquote>
</blockquote>
// fullName은 접근자 프로퍼티다
// 접근자 프로퍼티는 get, set, enumerable, configurable 프로퍼티 어트리뷰트를 갖는다
console.log(Object.getOwnPropertyDescriptor(Person.prototype, &#39;fullName&#39;));
// {get: f, set: f, enumerable: false, configurable: true}<blockquote>
<p>```</p>
</blockquote>
</li>
<li><code>setter</code>는 무엇인가를 프로퍼티에 할당해야 할 때 사용하므로 반드시 매개변수가 있어야한다</li>
</ul>
<h4 id="3-클래스필드-정의-제안">3. 클래스필드 정의 제안</h4>
<ul>
<li>클래스 필드는 클래스 기반 객체지향 언어에서 클래스가 생성할 인스턴스의 프로퍼티를 가리키는 용어다</li>
<li>자바스크립트에서 클래스가 생성할 인스턴스의 프로퍼티는 <code>constructor</code> 내부에서 <code>this</code>에 프로퍼티를 추가해야 한다고 위에서 기술하였다</li>
<li>클래스 몸체에서 클래스필드를 정의하는 경우 <code>this</code>에 클래스 필드를 바인딩해서는 안된다</li>
<li><code>this</code>는 <code>constructor</code>와 메서드 내에서만 유효하다<blockquote>
<pre><code>class Person {
name = &quot;Lee&quot;;
</code></pre></blockquote>
constructor() {
  console.log(name); // ReferenceError
  // 클래스 필드를 참조할 경우 this를 사용해야 한다.
}
}<blockquote>
</blockquote>
const me = new Person();
console.log(me); // Person {name: &quot;Lee&quot;}<blockquote>
<p>```</p>
</blockquote>
</li>
<li>인스턴스를 생성할 때 클래스 필드를 초기화할 필요가 있다면(외부의 초기값으로 초기화) <code>constructor</code> 밖에서 클래스 필드를 정의할 필요가 없다</li>
</ul>
<h4 id="4-private-필드-정의-제안">4. private 필드 정의 제안</h4>
<ul>
<li>자바스크립트는 접근 제한자를 지원하지 않기 때문에 인스턴스 프로퍼티는 언제나 <code>public</code>이다</li>
<li>그러나 <code>private</code> 필드를 정의할 수 있는 새로운 표준 사양이 제안되어 있다<blockquote>
<pre><code>class Person {
#name = &quot;&quot;;
</code></pre></blockquote>
constructor(name) {
  // private 필드 참조
  this.#name = name;
}
}<blockquote>
</blockquote>
const me = new Person(&quot;Lee&quot;);<blockquote>
</blockquote>
// private 필드 #name은 클래스 외부에서 참조할 수 없다.
console.log(me.#name); // SyntaxError<blockquote>
<p>```</p>
</blockquote>
</li>
<li><code>private</code> 필드의 선두에는 <code>#</code> 을 붙여준다, 참조할 때도 마찬가지다</li>
<li><code>private</code> 필드는 클래스 내부에서만 참조할 수 있다</li>
<li>하지만 접근자 프로퍼티를 통해 간접적으로 접근하는 방법은 유효하다</li>
</ul>
<hr>
<h3 id="✔-상속에-의한-클래스-확장">✔ 상속에 의한 클래스 확장</h3>
<h4 id="1-클래스-상속과-생성자-함수-상속">1. 클래스 상속과 생성자 함수 상속</h4>
<ul>
<li>프로토타입 기반 상속은 프로토타입 체인을 통해 다른 객체의 자산을 상속받는 것이지만, 상속에 의한 클래스 확장은 기존 클래스를 상속받아 새로은 클래스를 확장하여 정의하는 것이다</li>
</ul>
<h4 id="2-extends-키워드">2. extends 키워드</h4>
<ul>
<li>상속을 통해 클래스를 확장하려면 <code>extends</code> 키워드를 사용하여 상속받을 클래스를 정의한다</li>
<li>상속을 통해 확장된 클래스를 <strong>서브 클래스, 파생 클래스, 자식 클래스</strong>라 부르며, 상속된 클래스를 <strong>수퍼 클래스, 베이스 클래스, 부모 클래스</strong>라고 부른다</li>
</ul>
<h4 id="3-동적-상속">3. 동적 상속</h4>
<ul>
<li><code>extends</code> 키워드는 클래스뿐만 아니라 생성자 함수를 상속받아 클래스를 확장할 수도 있다</li>
<li>단, <code>extends</code> 키워드 앞에는 반드시 클래스가 와야한다<blockquote>
<pre><code>// 생성자 함수
function Base(a) {
this.a = a;
}
</code></pre></blockquote>
// 생성자 함수를 상속받는 서브클래스
class Derived extends Base {}<blockquote>
</blockquote>
const derived = new Drived(1);
console.log(derived); // Derived {a: 1}<blockquote>
<p>```</p>
</blockquote>
</li>
<li><code>exnteds</code> 키워드 다음에는 클래스 뿐만이 아니라 <code>[[Construct]]</code> 내부 메서드를 갖는 함수 객체로 평과될 수 있는 모든 표현식을 사용할 수 있다</li>
</ul>
<h4 id="4-서브클래스의-constructor">4. 서브클래스의 constructor</h4>
<ul>
<li>클래스에서 <code>constructor</code>를 생략하면 비어있는 <code>constructor</code>가 암묵적으로 정의된다</li>
<li>서브클래스에서 <code>constructor</code>를 생략하면 다음과 같은 <code>constructor</code>가 암묵적으로 정의된다<pre><code>constructor(...args) { super(...args); }</code></pre></li>
</ul>
<h4 id="5-super-키워드">5. super 키워드</h4>
<ul>
<li><code>super</code> 키워드는 함수처럼 호출할 수도 있고 식별자처럼 참조할 수 있는 특수한 키워드다</li>
<li><code>super</code>를 호출하면 수퍼클래스의 <code>constructor</code>를 호출한다</li>
<li><code>super</code>를 참조하면 수퍼클래스의 메서드를 호출할 수 있다</li>
</ul>
<ol>
<li><code>super</code> 호출<ul>
<li><code>super</code>를 호출하면 수퍼클래스의 <code>constructor</code>를 호출한다<blockquote>
<pre><code>class Base(a) {
constructor(a) {
 this.a = a;
}
}
</code></pre></blockquote>
class Derived extends Base {
// 다음과 같이 암묵적으로 constructor가 정의된다.
// constructor(...args) { super(...args); }
}<blockquote>
</blockquote>
const derived = new Drived(1);
console.log(derived); // Derived {a: 1}<blockquote>
<p>``` </p>
</blockquote>
</li>
</ul>
</li>
</ol>
<ul>
<li><code>new</code> 연산자와 함께 <code>Drived</code> 클래스를 호출하면서 전달한 인수<code>1</code>은 <code>Drived</code> 클래스의  <code>Constructor</code>에 전달되고 <code>super</code> 호출을 통해 <code>Base</code> 클래스의 <code>constructor</code>에 전달된다</li>
<li><code>super</code>를 호출할 때 주의할 사항은 다음과 같다<ol>
<li>서브클래스에서 <code>constructor</code>를 생략하지 않는 경우 서브클래스의 <code>constructor</code>에서는 반드시 super를 호출해야 한다</li>
<li>서브클래스의 <code>constructor</code>에서 <code>super</code>를 호출하기 전에는 this를 참조할 수 없다</li>
<li>super는 반드시 서브클래스의 <code>constructor</code>에서만 호출한다. 서브클래스가 아닌 클래스의 <code>constructor</code>나 함수에서 <code>super</code>를 호출하면 에러가 발생한다</li>
</ol>
</li>
</ul>
<ol start="2">
<li><code>super</code> 참조<ul>
<li>메서드 내에서 <code>super</code>를 참조하면 수퍼클래스의 메서드를 호출할 수 있다<blockquote>
<pre><code>class Base {
constructor(name) {
 this.name = name;
}

sayHi() {
 return `Hi, ${this.name}`
}
}
</code></pre></blockquote>
// 서브클래스
class Derived extends Base {
sayHi() {
 // super.sayHi는 수퍼클래스의 프로토타입 메서드를 가리킨다
 return <code>${super.sayHi()}. how are you donig?</code>
}
}<blockquote>
</blockquote>
const derived = new Derived(&quot;Lee&quot;);
console.log(derived.sayHi()); // Hi, Lee. how are you doing?<blockquote>
<p>```</p>
</blockquote>
</li>
<li>위 상황에서 서브클래스의 <code>this</code>는 인스턴스를 가리킨다</li>
<li>우리가 원하는 것은 <code>Base.prototype</code>에 존재하는 <code>sayHi</code> 메서드이기 때문에 <code>this</code>를 사용하면 안된다</li>
</ul>
</li>
</ol>
<h4 id="6-상속-클래스의-인스턴스-생성-과정">6. 상속 클래스의 인스턴스 생성 과정</h4>
<ol>
<li><p>서브클래스의 <code>super</code> 호출</p>
<ul>
<li>자바스크립트 엔진은 클래스를 평가할 때 수퍼클래스와 서브클래스를 구분하기 위해 <code>base</code> 또는 <code>derived</code>를 값으로 갖는 내부 슬롯 <code>[[ConstructorKind]]</code>를 갖는다</li>
<li>이를 통해 서브클래스로 구분된 클래스는 자신이 직접 인스턴스를 생성하지 않고 수퍼클래스에게 인스턴스 생성을 위임한다</li>
<li>이것이 바로 서브클래스의 <code>constructor</code>에서 반드시 <code>super</code>를 호출해야 하는 이유다</li>
<li>서브클래스의 <code>constructor</code> 내부에 <code>super</code> 호출이 없으면 에러가 발생한다</li>
</ul>
</li>
<li><p>수퍼클래스의 인스턴스 생성과 <code>this</code> 바인딩</p>
<ul>
<li>수퍼클래스의 <code>constructor</code> 내부의 코드가 실행되기 이전에 암묵적으로 빈 객체를 생성한다. 이 빈 객체가 바로 클래스가 생성한 인스턴스다. 그리고 이 인스턴스는 <code>this</code>에 바인딩된다</li>
<li>따라서 수퍼클래스 <code>constructor</code> 내부의 <code>this</code>는 인스턴스를 가리킨다</li>
</ul>
</li>
<li><p>수퍼클래스의 인스턴스 초기화</p>
<ul>
<li>수퍼클래스의 <code>constructor</code>가 실행되어 <code>this</code>에 바인딩되어 있는 인스턴스를 초기화한다</li>
</ul>
</li>
<li><p>서브클래스 <code>constructor</code>로의 복기와 <code>this</code> 바인딩</p>
<ul>
<li>super의 호출이 종료되고 제어 흐름이 서브클래스 <code>constructor</code>로 돌아온다. 이때 <code>super</code>가 반환한 인스턴스가 <code>this</code>에 바인딩된다.</li>
<li>서브클래스는 별도의 인스턴스를 생성하지 않고 <code>super</code>가 반환한 인스턴스를 <code>this</code>에 바인딩하여 그대로 사용한다.</li>
<li>따라서, <code>super</code>가 호출되지 않으면 서브클래스 <code>constructor</code>에서 <code>this</code>가 생성되지 않는다.</li>
</ul>
</li>
<li><p>서브클래스의 인스턴스 초기화</p>
<ul>
<li><code>super</code> 호춣 이후, 서브클래스의 <code>constructor</code>에 기술되어 있는 인스턴스 초기화가 실행된다</li>
<li><code>this</code>에 바인딩되어 있는 인스턴스에 프로퍼티를 추가한다</li>
</ul>
</li>
<li><p>인스턴스 반환 </p>
<ul>
<li>완성된 인스턴스가 바인딩된 <code>this</code>가 반환된다</li>
</ul>
</li>
</ol>
<hr>
<h4 id="7-표준-빌트인-생성자-함수-확장">7. 표준 빌트인 생성자 함수 확장</h4>
<ul>
<li><code>extends</code> 키워드 다음에는 <code>[[Construct]]</code> 내부 메서드를 갖는 함수 객체로 평가될 수 있는 모든 표현식을 사용할 수 있다</li>
<li>주의할 것은 새로운 배열을 반환하는 메서드가 서브클래스의 인스턴스를 반환한다느 것이다</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript this]]></title>
            <link>https://velog.io/@__bw95__/javascript-this</link>
            <guid>https://velog.io/@__bw95__/javascript-this</guid>
            <pubDate>Wed, 15 Feb 2023 09:38:11 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-this">💡 this</h1>
<h3 id="✔-this-키워드">✔ this 키워드</h3>
<ul>
<li><code>this</code>는 자신이 속한 객체 또는 자신이 생성할  인스턴스를 가리키는 자기 참조 변수이다</li>
<li><code>this</code>를 통해 자신이  속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조 할 수 있다</li>
<li><code>this</code>가 가리키는 값, 즉 <code>this</code>바인딩은 함수 호출 방식에 의해 동적으로 결정된다</li>
</ul>
<blockquote>
<pre><code>// 전역에서 this는 전역 객체 window를 가리킨다.
console.log(this); // window
</code></pre></blockquote>
<p>// 일반 함수 내부에서 this는 전역 객체 window를 가리킨다.
function square(number) {
  console.log(this); // window
  return number*number;
}</p>
<blockquote>
</blockquote>
<p>//메서드 내부에서 this는 메서드를 호출한 객체를 가리킨다.
const person = {
  name: &quot;Lee&quot;,
  getName() {
    console.log(this); // {name: &quot;Lee&quot;, getName: ƒ}
    return this.name;
  }
};
console.log(person.getName()); // Lee</p>
<blockquote>
</blockquote>
<p>// 생성자 함수 내부에서 this는 생성자 함수가 생성할 인스턴스를 가리킨다.
function Person(name) {
  this.name = name;
  console.log(this); // Person {name: &quot;Lee&quot;}
};
const me = new Person(&quot;Lee&quot;)</p>
<blockquote>
<pre><code></code></pre></blockquote>
<hr>
<h3 id="✔-함수-호출-방식과-this-바인딩">✔ 함수 호출 방식과 this 바인딩</h3>
<ul>
<li><code>this</code> 바인딩은 함수 호출 방식, 즉 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다</li>
</ul>
<h4 id="1-일반-함수-호출">1. 일반 함수 호출</h4>
<ul>
<li>기본적으로 this에는 전역 객체가 바인딩된다</li>
<li>전역 함수는 물론이고 중첩 함수를 일반 함수로 호출하면 함수 내부의 this에는 전역 객체가 바인딩된다</li>
<li>하지만 this는 객체의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수이므로 객체를 생성하지 않는 일반 함수에서 this는 의미가 없다</li>
<li>그리고 strict mode가 적용된 일반 함수 내부의 this에는 undefined가 바인딩된다</li>
</ul>
<blockquote>
<pre><code>var value = 1;
</code></pre></blockquote>
<p>const obj = {
  value: 100,
  foo() {
    console.log(&quot;foo&#39;s this&quot;, this); // {value: 100, foo: ƒ}
    setTimeout(function() {
      console.log(&quot;callback&#39;s this&quot;, this); // window
      console.log(&quot;callback&#39;s this.value&quot;, this.value); // 1
    }, 1000)
  }
}</p>
<blockquote>
<pre><code></code></pre></blockquote>
<h4 id="2-메서드-호출">2. 메서드 호출</h4>
<ul>
<li>메서드 내부의 <code>this</code>에는 메서드를 호출한 객체, 즉 메서드를 호춣할 때 메서드 이름 앞의 마침표 연산자 앞에 기술한 객체가 바인딩된다</li>
</ul>
<blockquote>
<pre><code>function Person(name) {
  this.name = name;
}
</code></pre></blockquote>
<p>Person.prototype.getName = function() {
  return this.name;
}</p>
<blockquote>
</blockquote>
<p>const me = new Person(&quot;Kim&quot;);
console.log(me.getName()); // Kim</p>
<blockquote>
</blockquote>
<p>Person.prototype.name = &quot;LEE&quot;
console.log(Person.prototype.getName()); // LEE</p>
<blockquote>
<pre><code></code></pre></blockquote>
<h4 id="3-생성자-함수-호출">3. 생성자 함수 호출</h4>
<ul>
<li>생성자 함수 내부의 <code>this</code>에는 생성자 함수가 생성할 인스턴스가 바인딩된다</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 빌트인 객체]]></title>
            <link>https://velog.io/@__bw95__/javascript-%EB%B9%8C%ED%8A%B8%EC%9D%B8-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@__bw95__/javascript-%EB%B9%8C%ED%8A%B8%EC%9D%B8-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Wed, 08 Feb 2023 04:15:34 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-빌트인-객체">💡 빌트인 객체</h1>
<h3 id="✔-자바스크립트-객체의-분류">✔ 자바스크립트 객체의 분류</h3>
<ol>
<li>표준 빌트인 객체<ul>
<li>ECMAScript 사양에 정의된 객체를 말하며 애플리케이션 전역의 공통 기능을 제공한다</li>
<li>자바스크립트 실행 환경에 관계없이 언제나 사용할 수 있다</li>
<li>전역 객체의 프로퍼티로서 제공된다</li>
</ul>
</li>
<li>호스트 객체<ul>
<li>ECMAScript 사양에 정의되어 있지 않지만 자바스크립트 실행 환경에서 추가로 제공하는 객체를 말한다</li>
<li>브라우저 환경에서는 DOM, BOM, Canvas, XMLHttpRequest, fetch 등과 같은 클라이언트 사이드 웹 API를 호스트 객체로 제공한다</li>
<li>Node.js 환경에서는 Node.js 고유의 API를 호스트 객체로 사용한다</li>
</ul>
</li>
<li>사용자 정의 객체<ul>
<li>기본 제공되는 객체가 아닌 사용자가 직접 정의한 객체를 말한다</li>
</ul>
</li>
</ol>
<h3 id="✔-표준-빌트인-객체">✔ 표준 빌트인 객체</h3>
<ul>
<li><code>Object</code> <code>String</code> <code>Number</code> <code>Boolean</code> <code>Symbol</code> <code>Date</code> <code>Math</code> <code>RegExp</code> <code>Array</code> <code>Map/Set</code> <code>WeakMap/WeakSet</code> <code>Function</code> <code>Promise</code> <code>Reflect</code> <code>Proxy</code> <code>JSON</code> <code>Error</code> 등 자바스크립트는 40여 개의 표준 빌트인 객체를 제공한다</li>
<li>이 중에서 <code>Math</code> <code>Reflect</code> <code>JSON</code>을 제외한 표준 빌트인 객체는 모두 인스턴스를 생성할 수 있는 생성자 함수 객체다</li>
</ul>
<blockquote>
<pre><code>const numObj = new Number(1.5);
</code></pre></blockquote>
<p>//프로토타입 메서드?
//모든 인스턴스가 상속을 통해 사용할 수 있다.
console.log(numObj.toFixed()); // 2</p>
<blockquote>
</blockquote>
<p>//정적 메서드?
//인스턴스를 생성하지 않아도 생성자 함수를 통해 사용할 수 있다.
console.log(Number.isInteger(0.5)); // false</p>
<blockquote>
<pre><code></code></pre></blockquote>
<hr>
<h3 id="✔-원시값과-래퍼-객체">✔ 원시값과 래퍼 객체</h3>
<pre><code>const str = &quot;hello&quot;;

str.name = &quot;Lee&quot;
//래퍼 객체가 암묵적으로 생성되고, [[StringData]] 슬롯에 hello가 할당된다.
//name 프로퍼티가 동적 생성되며, 값으로 Sangjo가 할당된다
//그리고 str은 다시 [[StringData]] 슬롯의 문자열로 돌아간다.

console.log(str.name); // undefined
//위에서 생성되었던 래퍼 객체는 이미 가비지 컬렉션의 대상이 되어 사라졌다.
//이번에 생성된 래퍼 객체는 이전의 래퍼 객체와 다르다. 따라서 name 프로퍼티가 존재하지 않는다.</code></pre><hr>
<h3 id="✔-전역-객체">✔ 전역 객체</h3>
<ul>
<li>코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이며, 어떤 객체에도 속하지 않은 최상위 객체다</li>
<li>브라우저 환경에서는 <code>window</code>, Node.js 환경에서는 <code>global</code>이 전역 객체를 가리킨다</li>
<li>전역 객체의 특징<ol>
<li>개발자가 의도적으로 생성할 수 없다(전역 객체를 생성할 수 있는 생성자 함수가 없다)</li>
<li>전역 객체의 프로퍼티를 참조할 때 <code>window</code> 또는 <code>global</code>을 생략할 수 있다</li>
<li>전역 객체는 모든 표준 빌트인 객체를 프로퍼티로 가지고 있다</li>
<li>자바스크립트 실행 환경에 따라 추가적인 프로퍼티와 메서드를 갖는다(호스트 객체)</li>
<li>var 키워드로 선언한 전역 변수와 암묵적 전역, 그리고 전역 함수는 전역 객체의 프로퍼티다</li>
<li>브라우저 환경의 모든 자바스크립트 코드는 전역 객체 <code>window</code>를 공유한다</li>
</ol>
</li>
</ul>
<h4 id="1-빌트인-전역-프로퍼티">1. 빌트인 전역 프로퍼티</h4>
<ul>
<li>빌트인 전역 프로퍼티는 전역 객체의 프로퍼티를 의미한고, 주로 애플리케이션 전역에서 사용하는 값을 제공한다</li>
</ul>
<ol>
<li>Infinity<ul>
<li><code>Infinity</code> 프로퍼티는 무한대를 나타내는 숫자값 <code>Infinity</code>를 갖는다<blockquote>
<pre><code>console.log(3/0); // Infinity
console.log(-3/0); // -Infinity
console.log(typeof Infinity); // number</code></pre></blockquote>
</li>
</ul>
</li>
<li>NaN
<code>NaN</code> 프로퍼티는 숫자가 아님을 나타내는 숫자값 <code>NaN</code>을 갖는다<blockquote>
<pre><code>console.log(window.NaN); // NaN
</code></pre></blockquote>
console.log(Number(&quot;str&quot;)); // NaN
console.log(1 * &quot;str&quot;); // NaN
console.log(typeof NaN); // number<blockquote>
<p>```</p>
</blockquote>
</li>
<li>undefined<ul>
<li><code>undefined</code> 프로퍼티는 원시 타입 <code>undefined</code>를 값으로 갖는다<blockquote>
<pre><code>console.log(window.undefined); // undefined
</code></pre></blockquote>
var foo;
console.log(foo); // undefined
console.log(typeof undefined); // undefined<blockquote>
<pre><code></code></pre></blockquote>
<h4 id="2-빌트인-전역-함수">2. 빌트인 전역 함수</h4>
</li>
</ul>
</li>
</ol>
<ul>
<li>빌트인 전역 함수는 애플리케이션 전역에서 호출할 수 있는 빌트인 함수로서 전역 객체의 메서드다</li>
</ul>
<ol>
<li><p>eval</p>
<ul>
<li><p><code>eval</code> 함수는 자바스크립트 코드를 나타내는 문자열을 인수로 전달받는다</p>
<blockquote>
<pre><code>const x = 1;
</code></pre></blockquote>
<p>function foo() {
eval(&quot;var x = 2;&quot;);
console.log(x) // 2
}</p>
<blockquote>
</blockquote>
<p>foo()
console.log(x) // 1</p>
<blockquote>
<pre><code></code></pre></blockquote>
</li>
<li><p><code>eval</code> 함수를 통해 사용자로부터 입력받은 콘텐츠를 수행하는 것은 보안에 매우 취약하다</p>
</li>
<li><p>또한 <code>eval</code> 함수를 통해 실행되는 코드는 자바스크립트 엔진에 의해 최적화가 수행되지 않으므로 일반적인 코드 실행에 비해 처리 속도가 느리다</p>
</li>
<li><p>따라서 <code>eval</code> 함수의 사용은 금지해야 한다</p>
</li>
</ul>
</li>
<li><p>isFinite</p>
<ul>
<li>전달받은 인수가 유한수이면 <code>true</code>를, 무한수이면 <code>false</code>를 반환한다</li>
</ul>
</li>
<li><p>isNaN</p>
<ul>
<li>전달받은 인수가 <code>NaN</code>인지 검사하여 결과를 불리언 타입으로 반환한다</li>
</ul>
</li>
<li><p>parseFloat</p>
<ul>
<li>전달받은 문자열 인수를 부동 소수점 숫자, 즉 실수로 해석하여 반환한다\</li>
</ul>
</li>
<li><p>parseInt</p>
<ul>
<li>전달받은 문자열 인수를 정수로 해석하여 반환한다</li>
<li>전달받은 인수가 문자열이 아니면 문자열로 변환한 다음 정수로 해석하여 반환한다</li>
</ul>
</li>
<li><p>encodeURI / decodeURI</p>
<ul>
<li><code>encodeURI</code> 함수는 완전한 URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩한다</li>
<li><code>decodeURI</code> 함수는 인코딩된 URI를 문자열로 전달받아 이스케이프 처리 이전으로 디코딩한다.</li>
</ul>
</li>
</ol>
<h4 id="3-암묵적-전역">3. 암묵적 전역</h4>
<blockquote>
<pre><code>var x = 10; // 전역 변수
</code></pre></blockquote>
<p>function foo() {
  // 선언하지 않은 식별자에 값을 할당
  y = 20; // window.y = 20;
}
foo();</p>
<blockquote>
</blockquote>
<p>// 선언하지 않은 식별자 y를 전역에서 참조할 수 있다
console.log(x + y); // 30</p>
<blockquote>
<pre><code></code></pre></blockquote>
<ul>
<li>식별자 y는 선언된 전역 변수처럼 동작하는데, 이는 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티가 되기 때문이다</li>
<li>이러한 현상을 암묵적 전역이라 한다</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript strict mode]]></title>
            <link>https://velog.io/@__bw95__/javascript-strict-mode</link>
            <guid>https://velog.io/@__bw95__/javascript-strict-mode</guid>
            <pubDate>Sat, 28 Jan 2023 11:40:07 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-strict-mode">💡 strict mode</h1>
<h3 id="✔-strict-mode란">✔ strict mode란?</h3>
<blockquote>
<pre><code>function foo() {
  x = 10;
}
foo();
</code></pre></blockquote>
<p>console.log(x); // 10</p>
<blockquote>
<pre><code></code></pre></blockquote>
<ul>
<li>자바스크립트 엔진은 foo 함수의 스코프에서부터 출발하여 전역 스코프까지 x를 찾게 된다</li>
<li>어디에도 없는 x 변수로 인해 에러가 발생할 것 같지만 자바스크립트 엔진은 암묵적으로 전역 객체에 x 프로퍼티를 동적 생성한다</li>
<li>이때 전역 객체의 x 프로퍼티는 마치 전역 변수처럼 사용할 수 있고, 이러한 현상을 암묵적 전역이라 한다</li>
<li>strict mode는 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생시킨다</li>
</ul>
<h3 id="✔-strict-mode의-적용">✔ strict mode의 적용</h3>
<ul>
<li>strict mode를 적용하려면 전역의 선두, 혹은 함수 몸체의 선두에 <code>&#39;use strict&#39;;</code>를 추가한다</li>
</ul>
<hr>
<h3 id="✔-전역에-strict-mode를-적용하는-것은-피하자">✔ 전역에 strict mode를 적용하는 것은 피하자</h3>
<ul>
<li>전역에 적용한 strict mode는 스크립트 단위로 적용된다</li>
<li>strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있다</li>
<li>특히, 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode인 경우도 있기 때문에 전역에 strict mode를 사용하는 것은 바람직하지 않다</li>
</ul>
<hr>
<h3 id="✔-함수-단위로-strict-mode를-적용하는-것도-피하자">✔ 함수 단위로 strict mode를 적용하는 것도 피하자</h3>
<ul>
<li>어떤 함수는 strict mode를 적용하고, 어떤 함수는 적용하지 않는 것도 바람직하지 않다 또한 일일히 적용하는 것이 번거롭기도 하다.<blockquote>
<pre><code>(function() {
var let = 10; // non-strict mode에서는 에러가 발생하지 않음
function foo() {
  &#39;use strict&#39;;
  let = 20 // syntaxError
}
foo();
};)()</code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="strict-mode가-발생시키는-에러">strict mode가 발생시키는 에러</h3>
<ul>
<li>strict mode를 적용했을 때 에러가 발생하는 대표적인 사례</li>
</ul>
<h4 id="1-암묵적-전역">1. 암묵적 전역</h4>
<ul>
<li>선언하지 않은 변수를 참조하면 ReferenceError가 발생한다<blockquote>
<pre><code>(function () {
&#39;use strict&#39;;
</code></pre></blockquote>
x = 10;
console.log(x); // ReferenceError
})()<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="2-변수-함수-매개변수의-삭제">2. 변수, 함수, 매개변수의 삭제</h4>
<ul>
<li>delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생한다<blockquote>
<pre><code>(function () {
&#39;use strict&#39;;

x = 10;
delete x; // SyntaxError
})()</code></pre></blockquote>
</li>
</ul>
<h4 id="3-매개변수-이름의-중복">3. 매개변수 이름의 중복</h4>
<ul>
<li>중복된 매개변수 이름을 사용하면 SyntaxError가 발생한다<blockquote>
<pre><code>(function () {
&#39;use strict&#39;;

// SyntaxError
function foo(x, x) {
  return x + x;
}
console.log(foo(1, 2));
})()</code></pre></blockquote>
</li>
</ul>
<h4 id="4-with문의-사용">4. with문의 사용</h4>
<ul>
<li>with 문을 사용하면 SyntaxError가 발생한다</li>
<li>with 문은 전달된 객체를 스코프 체인에 추가한다</li>
<li>with문은 동일한 객체의 프로퍼티를 반복해서 사용할 때 객체 이름을 생략할 수 있어서 코드가 간단해지는 효과가 있지만, 성능과 가독성이 나빠지는 문제가 있다<blockquote>
<pre><code>(function () {
&#39;use strict&#39;;

// SyntaxError
with({x: 1}) {
  console.log(x);
}
})()</code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-strict-mode-적용에-의한-변화">✔ strict mode 적용에 의한 변화</h3>
<h4 id="1-일반-함수의-this">1. 일반 함수의 this</h4>
<ul>
<li>strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다</li>
<li>생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다, 이때 에러는 발생하지 않는다</li>
</ul>
<h4 id="2-arguments-객체">2. arguments 객체</h4>
<ul>
<li>strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다</li>
<li>초기값을 유지하는 듯 하다.<blockquote>
<pre><code>function foo(a) {
&#39;use strict&#39;;

a = 2;
console.log(arguments); // {0: 1, length: 1}
}
</code></pre></blockquote>
foo(1);<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 프로토타입]]></title>
            <link>https://velog.io/@__bw95__/javascript-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@__bw95__/javascript-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85</guid>
            <pubDate>Tue, 24 Jan 2023 10:52:18 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-프로토-타입">💡 프로토 타입</h1>
<ul>
<li>JavaScript는 객체 기반의 프로그래밍 언어이며, JavaScript를 이루고 있는 거의 <strong>모든 것</strong>이 객체다</li>
</ul>
<h3 id="✔-객체지향-프로그래밍">✔ 객체지향 프로그래밍</h3>
<ul>
<li>객체(Object)의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임이다</li>
<li>특징이나 성징을 나타내는 속성(Property)을 가지고 있고, 이를 통해 실체를 인식하거나 구별할 수 있다</li>
<li>&quot;이름&quot;과 &quot;주소&quot;라는 속성을 갖는 person이라는 객체를 JavaScript로 표현하면 다음과 같다<blockquote>
<pre><code>// 이름과 주소 속성을 갖는 객체
const person = {
name: &#39;Lee&#39;,
address: &#39;Suwon&#39;
};
</code></pre></blockquote>
console.log(person); // {name: &quot;Lee&quot;, address: &quot;Suwon&quot;}<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-상속과-프로토타입">✔ 상속과 프로토타입</h3>
<ul>
<li>상속은 어떤 객채의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말한다</li>
<li>JavaScript는 프로토타입을 기반으로 상속을 구현하여 불필요한 중복을 제거한다</li>
</ul>
<blockquote>
<pre><code>// 생성자 함수
function Circle(radius) {
  this.radius = radius;
  this.getArea = function () {
    // Math.PI는 원주율을 나타내는 상수다
    return Math.PI * this.radius ** 2;
  };
}
</code></pre></blockquote>
<p>// 반지름이 1인 인스턴스 생성
const circle1 = new Circle(1);
// 반지름이 2인 인스턴스 생성
const circle2 = new Circle(2);</p>
<blockquote>
</blockquote>
<p>// Circle 생성자 함수는 인스턴스를 생성할 때마다 동일한 동작을 하는
// getArea 메서드를 중복 생성하고 모든 인스턴스가 중복 소유한다
// getArea 메서드는 하나만 생성하여 모든 인스턴스가 공유해서 사용하는 것이 바람직하다
console.log(circle1.getArea === circle2.getArea); // false</p>
<blockquote>
</blockquote>
<p>console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172</p>
<blockquote>
<pre><code></code></pre></blockquote>
<ul>
<li>위 예제의 생성자 함수에는 문제가 있다</li>
<li>Circle 생성자 함수는 인스턴스를 생성할 때마다 getArea 메서드를 중복 생성하고 모든 인스턴스가 중복 소유한다</li>
<li>상속을 통해 불필요한 중복을 제거할때, JavaScript는 프로토타입(Prototype)을 기반으로 상속을 구현한다</li>
</ul>
<blockquote>
<pre><code>// 생성자 함수
function Circle(radius) {
  this.radius = radius;
}
</code></pre></blockquote>
<p>// Circle 생성자 함수가 생성한 모든 인스턴스가 getArea 메서드를
// 공유해서 사용할 수 있도록 프로토타입에 추가한다.
// 프로토타입은 Circle 생성자 함수의 prototype 프로퍼티에 바인딩되어 있다.
Circle.prototype.getArea = function () {
  return Math.PI * this.radius ** 2;
};</p>
<blockquote>
</blockquote>
<p>// 인스턴스 생성
const circle1 = new Circle(1);
const circle2 = new Circle(2);</p>
<blockquote>
</blockquote>
<p>// Circle 생성자 함수가 생성한 모든 인스턴스는 부모 객체의 역할을 하는
// 프로토타입 Circle.prototype으로부터 getArea 메서드를 상속받는다.
// 즉, Circle 생성자 함수가 생성하는 모든 인스턴스는 하나의 getArea 메서드를 공유한다.
console.log(circle1.getArea === circle2.getArea); // true</p>
<blockquote>
</blockquote>
<p>console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172</p>
<blockquote>
<pre><code></code></pre></blockquote>
<ul>
<li>Circle 생성자 함수가 생성한 모든 인스턴스는 상위 객체 역할을 하는 Circle.prototype의 모든 프로퍼티와 메소드를 상속받는다</li>
<li>자신의 상태를 나타내는 radius 프로토타입만 개별적으로 소유하고 내용이 동일한 메소드는 상&gt;속을 통해 공유하여 사용하는 것이다</li>
</ul>
<hr>
<h3 id="✔-프로토타입-객체">✔ 프로토타입 객체</h3>
<ul>
<li>모든 객체는 [[Prototype]] 이라는 내부 슬롯을 가지며, 내부 슬롯의 값은 프로토타입의 참조다</li>
<li>[[Prototype]]에 저장되는 프로토타입은 객체 생성 방식에 따라 결정된다<img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/deepdive-19-3.png?raw=true" alt="객체와 프로토타입과 생성자 함수는 서로 연결되어 있다">

</li>
</ul>
<h4 id="1-proto-접근자-프로퍼티">1. <strong>proto</strong> 접근자 프로퍼티</h4>
<ul>
<li><p>모든 객체는 _<em>proto_</em> 접근자 프로퍼티를 통해 자신의 프로토타입, 즉[[Prototype]] 내부 슬롯에 간접적으로 접근할 수 있다</p>
<img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/proto-%EC%A0%91%EA%B7%BC%EC%9E%90.png?raw=true" alt="크롬 브라우저 콘솔에서 출력한 객체의 프로퍼티">

<ol>
<li>__proto__는 접근자 프로퍼티다<ul>
<li>접근자 프로퍼티는 자체적인 값<code>[[Value]]</code>을 갖지 않고, 접근자 함수<code>[[Get]]</code>, <code>[[Set]]</code> 프로퍼티 어트리뷰드로 구성된 프로퍼티이다</li>
</ul>
</li>
<li>_<em>proto_</em> 접근자 프로퍼티는 상속을 통해 사용된다<ul>
<li>_<em>proto_</em> 접근자 프로퍼티는 객체가 직접 소유하는 프로퍼티가 아니라 Object.prototype의 프로퍼티이다</li>
</ul>
</li>
<li>_<em>proto_</em> 접근자 프로퍼티를 통해 프로토타입에 접근하는 이유<ul>
<li>[[Prototype]] 내부 슬롯의 값에 접근할때 접근자 프로퍼티를 사용하는 이유는 상호 참조에 의해 프로토 타입 체인이 생성되는 것을 방지하기 위해서다</li>
</ul>
</li>
<li>_<em>proto_</em> 접근자 프로퍼티를 코드 내에서 직접 사용하는 것은 권장하지 않는다</li>
</ol>
</li>
</ul>
<h4 id="2-함수-객체의-prototype-프로퍼티">2. 함수 객체의 prototype 프로퍼티</h4>
<ul>
<li><p>함수 객체만이 소유하는 prototype 프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킨다</p>
<blockquote>
<pre><code>// 함수 객체는 prototype 프로퍼티를 소유한다
(function () {}).hasOwnProperty(&#39;prototype&#39;); // true
</code></pre></blockquote>
<p>// 일반 객체는 prototype 프로퍼티를 소유하지 않는다
({}).hasOwnProperty(&#39;prototype&#39;); // false</p>
<blockquote>
<pre><code></code></pre></blockquote>
</li>
<li><p>생성자 함수로서 호출할 수 없는 함수,즉 non-constructor인 화살표 함수와 ES6 축약 표현으로 정의한 메서드는 prototype 프로퍼티를 소유하지 않으며 프로토타입도 생성하지 않는다</p>
<blockquote>
<pre><code>// 화살표 함수는 non-constructor다
const Person = name =&gt; {
this.name = name;
};
</code></pre></blockquote>
<p>// non-constructor는 prototype 프로퍼티를 소유하지 않는다
console.log(Person.hasOwnProperty(&#39;prototype&#39;)); // false</p>
<blockquote>
</blockquote>
<p>// non-constructor는 프로토타입을 생성하지 않는다
console.log(Person.prototype); // undefined</p>
<blockquote>
</blockquote>
<p>// ES6의 메서드 축약 표현으로 정의한 메서드는 non-constructor다
const obj = {
foo(){}
};</p>
<blockquote>
</blockquote>
<p>// non-constructor는 prototype 프로퍼티를 소유하지 않는다
console.log(obj.foo.hasOwnProperty(&#39;prototype&#39;)); // false</p>
<blockquote>
</blockquote>
<p>// non-constructor는 프로토타입을 생성하지 않는다
console.log(obj.foo.prototype); // undefined</p>
<blockquote>
<p>```</p>
</blockquote>
</li>
<li><p>모든 객체가 가지고 있는(Object.prototype으로부터 상속받은) _<em>proto_</em> 접근자 프로퍼티와 함수 객체만이 가지고 있는 prototype 프로퍼티는 결국 동일한 프로토타입을 가리킨다. 하지만 이들 프로퍼티를 사용하는 주체가 다르다.</p>
</li>
</ul>
<img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/deepdive-19-7.jpeg?raw=true" alt="__proto__ 접근자 프로퍼티">

<h4 id="3-프로토타입의-constructor-프로퍼티와-생성자-함수">3. 프로토타입의 constructor 프로퍼티와 생성자 함수</h4>
<ul>
<li>constructor 프로퍼티는 prototype 프로퍼티로 자신을 참조하고 있는 모든 생성자 함수(인스턴스를 생성한 생성자 함수)를 가리키고, 이 연결은 함수 객체가 생성될 때 이뤄진다<blockquote>
<pre><code>// 생성자 함수
function Person(name) {
this.name = name;
}
</code></pre></blockquote>
const me = new Person(&#39;Lee&#39;);<blockquote>
</blockquote>
// me 객체의 생성자 함수는 Person이다.
console.log(me.constructor === Person); // true<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/deepdive-19-8.png?raw=true" alt="프로포타입의 constructor 프로퍼티">

<ul>
<li>me 객체에는 constructor 프로퍼티가 없지만, me 객체의 프로토타입인 Person.prototype에는 constructor 프로퍼티가 있다</li>
<li>따라서 me 객체는 프로토타입인 Person.prototype의 constructor 프로퍼티를 상속받아 사용할 수 있다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 함수와 일급 객체]]></title>
            <link>https://velog.io/@__bw95__/javascript-%ED%95%A8%EC%88%98%EC%99%80-%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@__bw95__/javascript-%ED%95%A8%EC%88%98%EC%99%80-%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Tue, 24 Jan 2023 10:48:39 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-함수와-일급-객체">💡 함수와 일급 객체</h1>
<h3 id="✔-일급-객체">✔ 일급 객체</h3>
<ul>
<li>다음과 같은 조건을 만족하는 객체를 <strong>일급 객체</strong>라고 한다<ol>
<li>무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다</li>
<li>변수나 자료구조에 저장할 수 있다</li>
<li>함수의 매개변수에 전달할 수 있다</li>
<li>함수의 반환값으로 사용할 수 있다</li>
</ol>
</li>
<li>javaScript의 함수는 다음 예제와 같이 위의 조건을 모두 만족하므로 일급 객체다<blockquote>
<pre><code>// 1. 함수는 무명의 리터럴로 생성할 수 있다
// 2. 함수는 변수에 저장할 수 있다
// 런타임에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수가 할당된다
const increase = function (num) {
return ++num;
};
</code></pre></blockquote>
const decrease = function (num) {
return --num;
};<blockquote>
</blockquote>
// 2. 함수는 객체에 저장할 수 있다
const auxs = { increase, decrease };<blockquote>
</blockquote>
// 3. 함수의 매개변수에 전달할 수 있다
// 4. 함수의 반환값으로 사용할 수 있다
function makeCounter(aux) {
let num = 0;<blockquote>
</blockquote>
return function () {
  num = aux(num);
  return num;
};
}<blockquote>
</blockquote>
// 3. 함수는 매개변수에게 함수를 전달할 수 있다.
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2<blockquote>
</blockquote>
// 3. 함수는 매개변수에게 함수를 전달할 수 있다.
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-함수-객체의-프로퍼티">✔ 함수 객체의 프로퍼티</h3>
<ul>
<li>함수도 프로퍼티를 가질 수 있다<ol>
<li>arguments</li>
<li>caller</li>
<li>length</li>
<li>name</li>
<li>prototype</li>
</ol>
</li>
</ul>
<blockquote>
<pre><code>function square(number) {
  return number * number;
}
console.dir(square);</code></pre></blockquote>
<img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/function-property.jpeg?raw=true" alt="함수 객체의 프로퍼티">

<h4 id="1-arguments-프로퍼티">1. arguments 프로퍼티</h4>
<ul>
<li>arguments 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체이다</li>
<li>함수 내부에서 지역 변수처럼 사용되며, 외부에서는 참조가 불가능하다</li>
<li>javaScript의 함수는 매개변수와 인수의 개수가 일치하는지 확인하지 않고, 에러도 발생하지 않는다</li>
</ul>
<blockquote>
<pre><code>function multiply(x, y) {
  console.log(arguments);
  return x * y;
}
</code></pre></blockquote>
<p>console.log(multiply());         //NaN
console.log(multiply(1));        //NaN
console.log(multiply(1, 2));     //2
console.log(multiply(1, 2, 3));  //2</p>
<blockquote>
<pre><code></code></pre></blockquote>
<ul>
<li>선언된 매개변수의 개수보다 인수를 적게 전달했을 경우, 전달되지 않은 매개변수는 <code>undefined</code>로 초기화된 상태를 유지한다</li>
<li>더 많은 인수를 전달한 경우에는 무시된다</li>
<li><strong>다만,</strong> 버려지는것은 아니고, 암묵적으로 arguments 객체의 프로퍼티로 보관된다 </li>
</ul>
<h4 id="2-caller-프로퍼티">2. caller 프로퍼티</h4>
<ul>
<li>ECMAScript 사양에 포함되지 않은 비표준 프로퍼티로, 함수 객체의 caller 프로퍼티는 함수 자신을 호출한 함수를 가리킨다</li>
</ul>
<h4 id="3-length-프로퍼티">3. length 프로퍼티</h4>
<ul>
<li>함수 객체의 length 프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 가리킨다<blockquote>
<pre><code>function foo() {}
console.log(foo.length); // 0
</code></pre></blockquote>
function bar(x) {}
console.log(bar.length); // 1<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="4-name-프로퍼티">4. name 프로퍼티</h4>
<ul>
<li>함수의 이름을 나타낸다</li>
<li>ES6에 정식 표준이 되었고, ES5에서는 다르게 동작하므로 주의해아한다</li>
</ul>
<h4 id="5-proto-접근자-프로퍼티">5. <strong>proto</strong> 접근자 프로퍼티</h4>
<ul>
<li>모든 객체는 [[Protytype]]라는 내부 슬롯을 갖는다</li>
<li>[[Protytype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티이다</li>
<li>[[Protytype]] 내부 슬롯에 직접 접근할 수 없으며, _<em>proto_</em> 접근자 프로퍼티를 통해 간접적으로 접근 할 수 있다<blockquote>
<pre><code>const obj = { a: 1 };
</code></pre></blockquote>
// 객체 리터럴 방식으로 생성한 객체의 프로토타입 객체는 Object.prototype이다
console.log(obj.<strong>proto</strong> === Object.prototype); // true<blockquote>
</blockquote>
// 객체 리터럴 방식으로 생성한 객체는 프로토타입 객체인 Object.prototype의 프로퍼티를 상속받는다
// hasOwnProperty 메서드는 Object.prototype의 메서드다
console.log(obj.hasOwnProperty(&#39;a&#39;));   // true
console.log(obj.hasOwnProperty(&#39;<strong>proto</strong>&#39;); // false<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="6-prototype-프로퍼티">6. prototype 프로퍼티</h4>
<ul>
<li>생성자 함수로 호출할 수 있는 함수 객체, 즉 constructor만이 소유하는 프로퍼티이다</li>
<li>일반 객체와 생성자 함수로 호출할 수 없는 non-constructor에는 prototype 프로퍼티가 없다<blockquote>
<pre><code>// 함수 객체는 prototype 프로퍼티를 소유한다
(fuction () {}).hasOwnProperty(&#39;prototype&#39;); // true
</code></pre></blockquote>
// 일반 객체는 prototype 프로퍼티를 소유하지 않는다
({}).hasOwnProperty(&#39;prototype&#39;); // false<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 생성자 함수에 의한 객체 생성]]></title>
            <link>https://velog.io/@__bw95__/javascript-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98%EC%97%90-%EC%9D%98%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@__bw95__/javascript-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98%EC%97%90-%EC%9D%98%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Wed, 18 Jan 2023 04:02:24 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-생성자-함수에-의한-객체-셍성">💡 생성자 함수에 의한 객체 셍성</h1>
<h3 id="✔-object-생성자-함수">✔ Object 생성자 함수</h3>
<ul>
<li><code>new</code> 연산자와 함께 Object 생성자 함수를 호출하면 빈 객체를 생성하여 반환한다</li>
<li>빈 객체를 생성한 이후 프로퍼티 또는 메서드를 추가하여 객체를 완성할 수 있다</li>
<li><strong>하지만</strong> 리터럴로 생성하는 것이 더 간편하기 때문에 유용하게 사용하지는 않는다<blockquote>
<pre><code>// 빈 객체의 생성
const person = new Object();
</code></pre></blockquote>
// 프로퍼티 추가
person.name = &#39;Lee&#39;;
person.sayHello = function () {
console.log(&#39;Hi! My name is &#39; + this.name);
};<blockquote>
</blockquote>
console.log(person); // {name: &quot;Lee&quot;, sayHello: f}
person.sayHello(); // Hi! My name is Lee<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-생성자-함수">✔ 생성자 함수</h3>
<h4 id="1-객체-리터럴에-의한-객체-생성-방식의-문제점">1. 객체 리터럴에 의한 객체 생성 방식의 문제점</h4>
<ul>
<li>객체 리터럴에 의한 생성 방식은 직관적이고 간편하다</li>
<li><strong>하지만</strong> 리터럴에 의한 생성 방식은 단 하나의 객체만 생성한다</li>
</ul>
<h4 id="2-생성자-함수에-의한-객체-생성-방식의-장점">2. 생성자 함수에 의한 객체 생성 방식의 장점</h4>
<ul>
<li>생성자 함수를 사용하여 프로퍼티 구조가 동일한 객체 여러개를 간편하게 생성할 수 있다</li>
</ul>
<h4 id="3-생성자-함수의-인스턴스-생성-과정">3. 생성자 함수의 인스턴스 생성 과정</h4>
<ol>
<li>인스턴스 생성과 this 바인딩<ul>
<li>암묵적으로 빈 객체가 생성된다</li>
<li>이 빈 객체가 생성자 함수가 생성한 인스턴스이다</li>
</ul>
</li>
<li>인스턴스 초기화<ul>
<li>생성자 함수에 기술되어 있는 코드가 한 줄씩 실행되어 this에 바인딩되어 있는 인스턴스를 초기화한다<blockquote>
<pre><code>function Circle(radius) {
// 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다
</code></pre></blockquote>
// 2. this에 바인딩되어 있는 인스턴스를 초기화한다
this.radius = radius;
this.getDiameter = function () {
 return 2 + this.radius;
};
}<blockquote>
<p>```</p>
</blockquote>
</li>
</ul>
</li>
<li>인스턴스 반환<ul>
<li>생성자 함수 내부의 모든 처리가 끝나면 완성된 인스턴스가 바인딩한 this가 암묵적으로 변환된다</li>
</ul>
</li>
</ol>
<h4 id="4-내부-메서드-call--construct">4. 내부 메서드 [[Call]] &amp; [[Construct]]</h4>
<ul>
<li>함수는 객체이므로 일반 객체와 동일하게 동작할 수 있다</li>
<li>다만 일반 객체는 호출할 수 없지만 함수는 호출할 수 있다</li>
<li>함수가 일반 함수로서 호출되면 함수 객체의 내부 메서도 Call이 호출되고 new 연산자와 함께 생성자 함수로서 호출되면 내부 메서드 Construct가 호출된다</li>
</ul>
<h4 id="5-constructor와-non-constructor의-구분">5. constructor와 non-constructor의 구분</h4>
<ul>
<li>constructor : 함수 선언문, 함수 표현식, 클래스</li>
<li>non-constructor : 메서드, 화살표 함수</li>
</ul>
<h4 id="6-new-연산자">6. new 연산자</h4>
<ul>
<li>일반 함수와 생성자 함수에 특별한 형식적 차이는 없다</li>
<li>new 연산자와 함께 함수를 호출하면 해당 함수는 생성자 함수로 동작한다</li>
<li><strong>즉, 함수 객체의 내부 메서드 Call이 호출되는 것이 아니라 Construct가 호출된다</strong></li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 프로퍼티 어트리뷰트]]></title>
            <link>https://velog.io/@__bw95__/javascript-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EC%96%B4%ED%8A%B8%EB%A6%AC%EB%B7%B0%ED%8A%B8</link>
            <guid>https://velog.io/@__bw95__/javascript-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EC%96%B4%ED%8A%B8%EB%A6%AC%EB%B7%B0%ED%8A%B8</guid>
            <pubDate>Mon, 16 Jan 2023 05:15:33 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-프로퍼티-어트리뷰트">💡 프로퍼티 어트리뷰트</h1>
<h3 id="✔-내부-슬롯과-내부-메서드">✔ 내부 슬롯과 내부 메서드</h3>
<ul>
<li>내부 슬롯과 메서드는 JS 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티와 의사 메서드다</li>
<li>ECMAScript 사양에 등장하는 이중 대괄호([[...]])로 감싼 이름들이 내부 슬롯과 내부 메서드이다</li>
</ul>
<hr>
<h3 id="✔-프로퍼티-어트리뷰트와-프로퍼티-디스크립터-객체">✔ 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체</h3>
<ul>
<li>JS 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의한다</li>
<li>프로퍼티의 상태란 프로퍼티의 값, 값의 갱신 가능 여부, 열거 가능 여부, 재정의 가능 여부를 말한다</li>
<li>프로퍼티 어트리뷰트에 직접 접근할 수는 없지만, Onject.getOwnPropertyDescriptor 메서드를 사용하여 간접적으로 확인할 수 있다<blockquote>
<pre><code>const person = {
name: &#39;Lee&#39; 
};
</code></pre></blockquote>
person.age = 100;<blockquote>
</blockquote>
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
  name: {value: &quot;Lee&quot;, writable: true, enumerable: true, configurable: true}
  age: {value: 100, writable: true, enumerable: true, configurable: true}
}</li>
<li>/<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-데이터-프로퍼티와-접근자-프로퍼티">✔ 데이터 프로퍼티와 접근자 프로퍼티</h3>
<h4 id="1-데이터-프로퍼티-data-property">1. 데이터 프로퍼티 (Data Property)</h4>
<ul>
<li>키와 값으로 구성된 일반적인 프로퍼티이다</li>
<li><img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/data-property.png?raw=true" alt="데이터 프로퍼티 표">

</li>
</ul>
<h4 id="2-접근자-프로퍼티-accessor-property">2. 접근자 프로퍼티 (Accessor Property)</h4>
<ul>
<li>자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는 접근자 함수로 구성된 프로퍼티다</li>
<li><img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/accessor-property.png?raw=true" alt="접근자 프로퍼티 표">

</li>
</ul>
<blockquote>
<pre><code>const person = {
 // 데이터 프로퍼티
 firstName: &quot;bw&quot;,
 lastName: &quot;Lee&quot;,

 // getter 함수 (접근자 프로퍼티)
 get fullName() {
   return `${this.firstName} ${this.lastName}`; 
 },
 // setter 함수  
 set fullName(name) {
   // 배열 디스트럭처럼 할당
   [this.firstName, this.lastName] = name.split(&#39; &#39;);
 }
};
</code></pre></blockquote>
<p>// 데이터 프로퍼티를 통한 프로퍼티 값의 참조
console.log(person.firstName + &#39; &#39; + person.lastName); // bw Lee</p>
<blockquote>
</blockquote>
<p>// 접근자 프로퍼티를 통한 프로퍼티 값의 참조
// 접근자 프로퍼티 fullName에 값을 저장하면 setter 함수가 호출된다
person.fullName = &quot;Heegun Lee&quot;;
console.log(person); //{firstName: &quot;Heegun&quot;, lastName: &quot;Lee&quot;}</p>
<blockquote>
</blockquote>
<p>// 접근자 프로퍼티를 통한 프로퍼티 값의 참조
// 접근자 프로퍼티 fullName에 접근하면 getter 함수가 호출된다.
console.log(person.fullName); // Heegun Lee</p>
<blockquote>
</blockquote>
<p>// firstName은 데이터 프로퍼티다
// 데이터 프로퍼티는 [[Value]], [[Writable]], [[Enumerable]], [[Configurable]] 프로퍼티 어트리뷰트를 갖는다
let descriptor = Object.getOwnPropertyDescriptor(person, &#39;firstName&#39;);
console.log(descriptor);
// {value: &quot;Lee&quot;, writable : true, enumerable : true, configurable: true}</p>
<blockquote>
</blockquote>
<p>// fullName은 접근자 프로퍼티다
// 접근자 프로퍼티는 [[Get]], [[Set]], [[Enumerable]], [[Configurable]] 프로퍼티 어트리뷰트를 갖는다
descriptor = Object.getOwnPropertyDescriptor(person, &#39;fullName&#39;)
console.log(descriptor);
// {get: f, set: f, enumerable: true, configurable: true}</p>
<blockquote>
<pre><code></code></pre></blockquote>
<hr>
<h3 id="✔-프로퍼티-정의">✔ 프로퍼티 정의</h3>
<ul>
<li><code>Object.defineProperty</code> 메서드를 사용하면 프로퍼티의 어트리뷰트를 정의할 수 있다 </li>
<li>디스크럽터 객채의 프로퍼티를 누락시키면 undefined, false가 기본값이다</li>
<li><code>Enumerable</code>의 값이 false인 경우, 해당 프로퍼티는 열거할 수 없다</li>
<li><code>Writeable</code>의 값이 false인 경우, 해당 프로퍼티의 <code>[[Value]]</code>의 값을 변경할 수 없다</li>
<li><code>Configurable</code>의 값이 false인 경우, 해당 프로퍼티를 삭제 또는 재정의 할 수 없다</li>
<li><img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/property-descriptor-default.png?raw=true" alt="프로퍼티 디스크립터 기본값 표">

</li>
</ul>
<blockquote>
<pre><code>const person = {};
</code></pre></blockquote>
<p>// 데이터 프로퍼티 정의
Object.defineProperty(person, &#39;firstName&#39;, {
  value: &#39;Ungmo&#39;,
  writable: true,
  enumerable: true,
  configurable: true
});</p>
<blockquote>
</blockquote>
<p>// 디스크럽터 객채의 프로퍼티를 누락시키면 undefined, false가 기본값이다
Object.defineProperty(person, &#39;lastName&#39;, {
  value: &#39;Lee&#39;
})</p>
<blockquote>
<pre><code></code></pre></blockquote>
<hr>
<h3 id="✔-객체-변경-방지">✔ 객체 변경 방지</h3>
<ul>
<li>객체는 변경 가능한 값이므로 재할당 없이 직접 변경할 수 있다</li>
</ul>
<h4 id="1-객체-확장-금지">1. 객체 확장 금지</h4>
<ul>
<li>Object.preventExtensions 메서드는 객체의 확장을 금지한다</li>
<li><strong>확장이 금지된 객체는 프로퍼티 추가가 금지된다</strong><blockquote>
<pre><code>const person = { name : &#39;Lee&#39;};
</code></pre></blockquote>
// person 객체는 확장이 금지된 객체가 아니다
console.log(Object.isExtensible(person)); // true<blockquote>
</blockquote>
// person 객체의 확장을 금지하여 프로퍼티 추가를 금지한다
Object.preventExtensions(person);<blockquote>
</blockquote>
// person 객체는 확장이 금지된 객체다
console.log(Object.isExtensible(person)); // false<blockquote>
</blockquote>
// 프로퍼티 추가가 금지된다
person.age = 20; // 무시. strict mode에서는 에러
console.log(person); // {name : &quot;Lee&quot;}<blockquote>
</blockquote>
// 프로퍼티 추가는 금지되지만 삭제는 가능하다
delete person.name;
console.log(person); // {}<blockquote>
</blockquote>
// 프로퍼티 정의에 의한 프로퍼티 추가도 금지된다
Object.defineProperty(person, &#39;age&#39;, {value:20});
// TypeError: Cannot define property age, object is not extensible<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="2-객체-밀봉">2. 객체 밀봉</h4>
<ul>
<li>Object.seal 메서드는 객체를 밀봉한다</li>
<li><strong>밀봉된 객체는 읽기와 쓰기만 가능하다</strong><blockquote>
<pre><code>const person = {name: &#39;Lee&#39;};
</code></pre></blockquote>
// person 객체는 밀봉된 객체가 아니다
console.log(Object.isSealed(person)); // false<blockquote>
</blockquote>
// person 객체를 밀봉하여 프로퍼티 추가, 삭제, 재정의를 금지한다
Object.seal(person);<blockquote>
</blockquote>
// person 객체는 밀봉된 객체다
console.log(Object.isSealed(person)); // true<blockquote>
</blockquote>
// 밀봉된 객체는 configurable이 false이다
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
name: {value: &quot;Lee&quot;, writable: true, enumerable: true, configurable: false},
}</li>
<li>/<blockquote>
</blockquote>
// 프로퍼티 추가가 금지된다
person.age = 20; // 무시. strict mode에서는 에러
console.log(person); // {name: &quot;Lee&quot;}<blockquote>
</blockquote>
// 프로퍼티 삭제가 금지된다
delete.person.name; // 무시. strict mode에서는 에러
console.log(person); // {name: &quot;Lee&quot;}<blockquote>
</blockquote>
// 프로퍼티 값 갱신은 가능하다.
person.name = &quot;Kim&quot;;
console.log(person); // {name : &quot;Kim&quot;}<blockquote>
</blockquote>
// 프로퍼티 어트리뷰트 재정의가 금지된다.
Object.defineProperty(person, &#39;name&#39;, {configurable : true});
// TypeError: Cannot redefine property: name<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="3-객체-동결">3. 객체 동결</h4>
<ul>
<li>Object.freeze 메서드는 객체를 동결한다</li>
<li><strong>동결된 객체는 읽기만 가능하다</strong><blockquote>
<pre><code>const person = {name: &#39;Lee&#39;};
</code></pre></blockquote>
// person 객체는 동결된 객체가 아니다
console.log(Object.isFrozen(person)); // false<blockquote>
</blockquote>
// person 객체를 동결하여 프로퍼티 추가, 삭제, 재정의, 쓰기를 금지한다
Object.freeze(person);<blockquote>
</blockquote>
// person 객체는 동결된 객체다
console.log(Object.isFrozen(person)); // true<blockquote>
</blockquote>
// 동결된 객체는 writable과 configurable이 false이다
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
name: {value: &quot;Lee&quot;, writable: false, enumerable: true, configurable: false},
}</li>
<li>/<blockquote>
</blockquote>
// 프로퍼티 추가가 금지된다
person.age = 20; // 무시. strict mode에서는 에러
console.log(person); // {name: &quot;Lee&quot;}<blockquote>
</blockquote>
// 프로퍼티 삭제가 금지된다
delete.person.name; // 무시. strict mode에서는 에러
console.log(person); // {name: &quot;Lee&quot;}<blockquote>
</blockquote>
// 프로퍼티 값 갱신은 가능하다.
person.name = &quot;Kim&quot;;
console.log(person); // {name : &quot;Kim&quot;}<blockquote>
</blockquote>
// 프로퍼티 어트리뷰트 재정의가 금지된다.
Object.defineProperty(person, &#39;name&#39;, {configurable : true});
// TypeError: Cannot redefine property: name<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="4-불변-객체">4. 불변 객체</h4>
<ul>
<li>지금까지 살펴본 변경 방지 메서드들은 얕은 변경 방지로 직속 프로퍼티만 변경이 방지되고, 중첩 객체까지는 영향을 주지는 못한다</li>
<li>Object.freeze 메서드로 객체를 동결하여도 중첩 객체까지 동결할 수 없다</li>
<li>객체의 중첩 객체까지 불변 객체로 구현하려면 객채를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야 한다</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript let과 const]]></title>
            <link>https://velog.io/@__bw95__/javascript-let%EA%B3%BC-const-84pi9mdi</link>
            <guid>https://velog.io/@__bw95__/javascript-let%EA%B3%BC-const-84pi9mdi</guid>
            <pubDate>Mon, 16 Jan 2023 05:07:37 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-let과-var의-차이">💡 let과 var의 차이</h1>
<h3 id="✔-var-키워드의-문제점">✔ var 키워드의 문제점</h3>
<h4 id="1-변수-중복-선언-허용">1. 변수 중복 선언 허용</h4>
<ul>
<li>var 키워드로 선언한 변수는 중복 선언이 가능하다<blockquote>
<pre><code>var x = 1;
var y = 1;
</code></pre></blockquote>
// var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용한다.
// 초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
var x = 100;
// 초기화문이 없는 변수 선언문은 무시된다.
var y;<blockquote>
</blockquote>
console.log(x); // 100
console.log(y); // 1<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="2-함수-레벨-스코프">2. 함수 레벨 스코프</h4>
<ul>
<li>var 키워드로 선언한 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정한다</li>
<li>따라서, 함수 외부에서 var 키워드로 선언한 변수는 코트 블록 내에서 선언해도 모두 전역 변수가 된다<blockquote>
<pre><code>var i = 10;
</code></pre></blockquote>
// for문에서 선언한 i는 전역 변수이고, 이미 선언된 전역 변수 i가 있으므로 중복 선언된다.
for (var i = 0; i &lt; 5; i++){
console.log(i); // 0 1 2 3 4
}<blockquote>
</blockquote>
// 의도치 않게 i 변수의 값이 변경되었다.
console.log(i); // 5<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="3-변수-호이스팅">3. 변수 호이스팅</h4>
<ul>
<li>var 키워드로 변수를 선언하면 변수 호이스팅에 의해, 변수 선언문이 스코프의 선두로 끌어 올라간 것처럼 동작한다<blockquote>
<pre><code>// 이 시점에는 변수 호이스팅에 의해 이미 foo 변수가 선언되었다
// 변수 foo는 undefined로 초기화된다
console.log(foo);
</code></pre></blockquote>
// 변수에 값을 할당
foo = 1;<blockquote>
</blockquote>
console.log(foo); // 1<blockquote>
</blockquote>
// 변수 선언은 런타임 이전에 JS 엔진에 의해 암묵적으로 실행된다
var foo;<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-let-키워드">✔ let 키워드</h3>
<ul>
<li>var 키워드의 단점을 보완하기 위해 ES6에서 새로운 변수 선언 키워드인 let과 const가 도입되었다</li>
</ul>
<h4 id="1-변수-중복-선언-금지">1. 변수 중복 선언 금지</h4>
<ul>
<li>let 키워드로 같은 이름의 변수를 중복되게 선언하면 에러가 발생한다</li>
</ul>
<h4 id="2-블록-레벨-스코프">2. 블록 레벨 스코프</h4>
<ul>
<li>let 키워드로 선언한 변수는 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다<blockquote>
<pre><code>let foo = 1; // 전역 변수
</code></pre></blockquote>
if (true) {
let foo = 2; // 지역 변수
let bar = 3; // 지역 변수
}<blockquote>
</blockquote>
console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="3-변수-호이스팅-1">3. 변수 호이스팅</h4>
<ul>
<li>var 키워드와는 달리 변수 호이스팅이 발생하지 않는 것처럼 동작한다<blockquote>
<pre><code>console.log(foo); // ReferenceError
let foo;</code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-const-키워드">✔ const 키워드</h3>
<ul>
<li>보통 상수를 선언하기 위해 사용된다</li>
</ul>
<h4 id="1-선언과-초기화">1. 선언과 초기화</h4>
<ul>
<li>const 키워드로 선언한 변수는 <strong>반드시</strong> 선언과 동시에 초기화하여야 한다</li>
</ul>
<h4 id="2-재할당-금지">2. 재할당 금지</h4>
<ul>
<li>const 키워드로 선언한 변수는 <strong>재할당이 금지</strong>된다</li>
</ul>
<h4 id="3-상수">3. 상수</h4>
<ul>
<li>재할당이 금지된 특징을 이용해 const 키워드로 상수를 표현하는데 사용하기도 한다<blockquote>
<pre><code>// 세율을 의미하는 0.1은 변경할 수 없는 상수로서 사용될 값이다
// 변수 이름을 대문자로 선언해 상수임을 명확히 나타낸다
const TAX_RATE = 0.1;
</code></pre></blockquote>
// 세전 가격
let preTaxPrice = 100;<blockquote>
</blockquote>
// 세후 가격
let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE);<blockquote>
</blockquote>
console.log(afterTaxPrice); //110<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<h4 id="const-키워드와-객체">const 키워드와 객체</h4>
<ul>
<li>const 키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다</li>
<li>const 키워드는 재할당을 금지할 뿐, &quot;불변&quot;을 의미하지는 않는다</li>
<li>새로운 값을 재할당하는 것은 불가능하지만, Property의 동적 생성, 삭제, 변경을 통해 객체를 변경하는 것은 가능하다<blockquote>
<pre><code>const person = {
name : &#39;Lee&#39;
};
</code></pre></blockquote>
// 객체는 변경 가능한 값이다. 따라서 재할당 없이 변경이 가능하다.
person.name = &#39;Jo&#39;;<blockquote>
</blockquote>
console.log(person); // {name : &#39;Jo&#39;}<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 연산자]]></title>
            <link>https://velog.io/@__bw95__/javascript-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@__bw95__/javascript-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Tue, 10 Jan 2023 10:11:12 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-연산자">💡 연산자</h1>
<h3 id="✔-산술-연산자">✔ 산술 연산자</h3>
<ul>
<li>산술 연산자는 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자값을 만든다</li>
<li>산술 연산자는 피연산자의 개수에 따라 이항 산술 연산자와 단항 산술 연산자로 구분할 수 있다</li>
</ul>
<hr>
<h4 id="1-이항-산술-연산자">1. 이항 산술 연산자</h4>
<ul>
<li>이항 산술 연산자는 2개의 피연산자를 산술 연산하여 숫자 값을 만든다</li>
<li><img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/%EC%9D%B4%ED%95%AD%EC%82%B0%EC%88%A0%EC%97%B0%EC%82%B0%EC%9E%90.png?raw=true" alt="이항산술연산자">
</li>
</ul>
<hr>
<h4 id="2-단항-산술-연산자">2. 단항 산술 연산자</h4>
<ul>
<li>단항 산술 연산자는 1개의 피연산자를 산술 연산하여 숫자 값을 만든다</li>
<li>증가/감소 연산자는 위치에 의미가 있다</li>
<li><img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/%EB%8B%A8%ED%95%AD%EC%82%B0%EC%88%A0%EC%97%B0%EC%82%B0%EC%9E%90.png?raw=true" alt="단항산술연산자">
</li>
</ul>
<hr>
<h4 id="3-문자열-연결-연산자">3. 문자열 연결 연산자</h4>
<ul>
<li>&#39;+&#39; 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다<blockquote>
<pre><code>/// 문자열 연결 연산자
&#39;1&#39; + 2; // &#39;12&#39;
1 + &#39;2&#39;; // &#39;12&#39;
</code></pre></blockquote>
// 산술 연산자
1 + 2; // 3<blockquote>
</blockquote>
// true는 1로, false는 0으로 변환된다
// null도 0으로 변환된다
1 + true; // 2<blockquote>
</blockquote>
// undefined는 숫자로 변한되지 않는다</li>
<li>undefined; // NaN
1 + undefined; // NaN<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 데이터 타입]]></title>
            <link>https://velog.io/@__bw95__/javascript-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@__bw95__/javascript-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Tue, 10 Jan 2023 10:05:55 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-데이터-타입">💡 데이터 타입</h1>
<ul>
<li>테이터 타입은 값의 종류를 말한다</li>
<li>JavaScript는 7개의 데이터 타입을 제공한다<ul>
<li>원시 타입<ol>
<li>숫자 타입</li>
<li>문자열 타입</li>
<li>Boolean 타입</li>
<li>undefined 타입</li>
<li>null 타입</li>
<li>심벌 타입</li>
</ol>
</li>
<li>객체 타입</li>
</ul>
</li>
</ul>
<hr>
<h3 id="✔-숫자-타입">✔ 숫자 타입</h3>
<ul>
<li>다른 언어와는 다르게 JavaScript는 하나의 숫자 타입만 존재한다</li>
<li>숫자 타입은 모두 실수로 처리된다</li>
<li>추가적으로 세가지 특별한 값도 표현할 수 있다<ol>
<li><code>Infinity</code> : 양의 무한대</li>
<li><code>-Infinity</code> : 음의 무한대</li>
<li><code>NaN</code> : 산술 연산 불가(Not a Number)<blockquote>
<pre><code>// 모두 숫자 타입이다
var integer = 10;   // 정수
var double = 10.12;   // 실수
</code></pre></blockquote>
var bin = 0b1011;   // 2진수
var oct = 0o307;    // 8진수
var hex = 0x1AB;    // 16진수   <blockquote>
<pre><code></code></pre></blockquote>
</li>
</ol>
</li>
</ul>
<hr>
<h3 id="✔-문자열-타입">✔ 문자열 타입</h3>
<ul>
<li>문자열 타입은 텍스트 데이터를 나타내는 데 사용한다</li>
<li>문자열은 작은따옴표(&#39;&#39;), 큰따옴표(&quot;&quot;), 백틱(``)으로 텍스트를 감싼다</li>
</ul>
<hr>
<h4 id="1-멀티라인-문자열">1. 멀티라인 문자열</h4>
<ul>
<li>템플릿 리터럴은 일반 문자열과 비슷해 보이지만 따옴표 대신 백틱을 사용해 표현한다</li>
<li>일반 문자열 내에서는 줄바꿈이 허용되지 않는다</li>
<li>따라서 일반 문자열 내에서 줄바꿈 등의 공백을 표현하려면 백슬래시로 시작하는 이스케이프 시퀀스를 사용해야 한다</li>
<li>백틱을 사용하면 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이 허용되며, 모든 공백도 허용된다</li>
</ul>
<img src="https://github.com/lbw3973/TIL/blob/main/JavaScript/img/escape-sequence.png?raw=true" alt="escape-sequence">

<hr>
<h4 id="2-표현식-삽입">2. 표현식 삽입</h4>
<ul>
<li><p>문자열은 문자열 연산자 + 를 사용하여 연결할 수 있다</p>
<blockquote>
<pre><code>var first = &#39;bw&#39;;
var last = &#39;Lee&#39;;
</code></pre></blockquote>
<p>console.log(&#39;My name is &#39; + first + &#39; &#39; + last) .. My name is bw Lee</p>
<blockquote>
<pre><code></code></pre></blockquote>
</li>
<li><p>표현식을 삽입하려면 ${}으로 표현식을 감싸면 되고, 이때 표현식의 결과가 문자열이 아니더라도 문자열로 강제 변환된다</p>
<blockquote>
<pre><code>var first = &#39;bw&#39;;
var last = &#39;Lee&#39;;
</code></pre></blockquote>
<p>console.log(<code>My name is ${first} $(last)</code>) .. My name is bw Lee</p>
<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-boolean-타입">✔ Boolean 타입</h3>
<ul>
<li><code>Boolean</code> 타입은 참, 거짓을 나타내는 <code>true</code>와 <code>false</code> 뿐이다<blockquote>
<pre><code>var boo = true;
console.log(boo) // true
</code></pre></blockquote>
boo = false;
console.log(boo) // false<blockquote>
<pre><code></code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-undefined-타입">✔ undefined 타입</h3>
<ul>
<li><code>undefined</code> 타입의 값은 <code>undefined</code>가 유일하다</li>
<li>변수 선언에 의해 확보된 메모리 공간을 처음 할당이 될때까지 빈상태로 두지 않고 JavaScript 엔진이 <code>undefined</code>로 초기화한다</li>
</ul>
<hr>
<h3 id="✔-null-타입">✔ null 타입</h3>
<ul>
<li><code>null</code> 타입의 값은 <code>null</code>이 유일하다</li>
<li><code>null</code>은 변수에 값이 없다는 것을 의도적으로 명시한다</li>
</ul>
<hr>
<h3 id="✔-symbol-타입">✔ Symbol 타입</h3>
<ul>
<li>변경 불가능한 원시 타입의 값이고, 다른 값과 중복되지 않는 유일무이한 값이다</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 표현식 & 문]]></title>
            <link>https://velog.io/@__bw95__/javascript-%ED%91%9C%ED%98%84%EC%8B%9D-%EB%AC%B8</link>
            <guid>https://velog.io/@__bw95__/javascript-%ED%91%9C%ED%98%84%EC%8B%9D-%EB%AC%B8</guid>
            <pubDate>Tue, 10 Jan 2023 10:03:49 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-표현식과-문">💡 표현식과 문</h1>
<h3 id="✔-값">✔ 값</h3>
<ul>
<li>값은 식이 평가되어 생성된 결과를 말한다</li>
</ul>
<hr>
<h3 id="✔-리터럴">✔ 리터럴</h3>
<ul>
<li>사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법이다</li>
<li>대표적인 리터럴<ol>
<li>정수 리터럴 : <code>100</code></li>
<li>부동소수점 리터럴 : <code>10.5</code></li>
<li>2진수 리터럴 : <code>0b00011011</code></li>
<li>16진수 리터럴 : <code>0x33</code></li>
<li>문자열 리터럴 : <code>Hello</code>, <code>&quot;World&quot;</code></li>
<li>Boolean 리터럴 : <code>true</code>, <code>false</code></li>
<li>객체 리터럴 : <code>{name: &#39;Lee&#39;, age: &#39;29&#39;}</code></li>
<li>함수 리터럴 : <code>function () {}</code></li>
<li>정규 표현식 리터럴 : <code>/[A-Z]+/g</code></li>
</ol>
</li>
<li>등등....</li>
</ul>
<hr>
<h3 id="✔-문">✔ 문</h3>
<ul>
<li>문은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다<blockquote>
<pre><code>// 변수 선언문
var x;
// 할당문
x = 5;
// 함수 선언문
function foo () {}
// 조건문
if (x &gt; 1) { console.log(x); }
// 반복문
for (var i = 0; i &lt; 2; i++) { console.log(i); }</code></pre></blockquote>
</li>
</ul>
<hr>
<h3 id="✔-세미콜론">✔ 세미콜론</h3>
<ul>
<li>세미콜론(;)은 문의 종료를 나타낸다</li>
<li>JavaScript에서는 생략이 가능하다 (세미콜론 자동 삽입 기능(ASI)) </li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 변수]]></title>
            <link>https://velog.io/@__bw95__/javascript-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@__bw95__/javascript-%EB%B3%80%EC%88%98</guid>
            <pubDate>Tue, 03 Jan 2023 12:48:22 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-변수">💡 변수</h1>
<h2 id="⬛-변수란">⬛ 변수란?</h2>
<ul>
<li>하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다</li>
</ul>
<h3 id="✔-변수에-여러-개의-값을-저장하는-방법">✔ 변수에 여러 개의 값을 저장하는 방법</h3>
<ul>
<li>변수는 하나의 값을 저장하기 위한 메커니즘이다</li>
<li>여러 개의 값을 저장하려면 여러 개의 변수를 사용해야 한다</li>
<li>단, 배열이나 객체 같은 자료구조를 사용하면 관련이 있는 여러 개의 값을 그룹화해서 하나의 값처럼 사용 할 수 있다</li>
</ul>
<blockquote>
<pre><code>// 변수는 하나의 값을 저장하기 위한 수단이다
var userId = 1;
var userName = &#39;Lee&#39;;

// 객체나 배열 같은 자료구조를 사용하면 여러 개의 값을 하나로 그룹화해서 하나의 값처럼 사용&gt;할 수 있다
var user = { id: 1, name: &#39;Lee&#39;};

var users = [
 {id: 1, name: &#39;Lee&#39;},
 {id: 2, name: &#39;Kim&#39;}
];</code></pre></blockquote>
<pre><code>
---

### ✔ 변수 선언
- 변수를 사용하기 위해선 선언이 필요하다
- var, let, const 같은 키워드를 사용한다

&gt;```
&gt;var name; // 변수 선언
&gt;```

---

### ✔ 변수 선언의 실행 시점

&gt;```
&gt;console.log(name);
&gt;
&gt;var name;</code></pre><ul>
<li>위의 보기에서 변수가 선언되기 전 log함수가 사용되고 있으므로 Error가 발생할 것 같지만, 그렇지 않다</li>
<li>JavaScript에서 변수의 선언은 <strong>순차적인 런타임이 아니고 그 이전에 먼저 실행</strong>된다</li>
<li>이것은 JavaScript만의 특징이다</li>
</ul>
<hr>
<h3 id="✔-값의-할당">✔ 값의 할당</h3>
<ul>
<li>변수에 값을 할당할 때에는 할당 연산자 &#39;=&#39;를 사용한다</li>
</ul>
<blockquote>
<pre><code>var name = &#39;Lee&#39;;</code></pre></blockquote>
<ul>
<li>변수 선언과 할당을 위와같이 하나의 문으로 단축할 수도 있고, 분리할 수도 있다</li>
</ul>
<hr>
<h3 id="✔-식별자-네이밍-규칙">✔ 식별자 네이밍 규칙</h3>
<ul>
<li>식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다</li>
<li>단, 식별자는 특수문자를 제외한 문자, 언더스코어(_), 달러 기호($)로 시작해야 한다. 숫자로 시작하는 것은 허용되지 않는다</li>
<li>예약어는 식별자로 사용할 수 없다<ul>
<li>예약어란, 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어를 말한다</li>
</ul>
</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS Flex]]></title>
            <link>https://velog.io/@__bw95__/CSS-Flex</link>
            <guid>https://velog.io/@__bw95__/CSS-Flex</guid>
            <pubDate>Tue, 03 Jan 2023 12:42:41 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-css-layout">💡 CSS Layout</h1>
<h2 id="⬛-css-flex">⬛ CSS Flex</h2>
<ul>
<li>1차원 레이아웃 구조를 위한 속성이다</li>
<li>Fexible box라고 부르기도 한다</li>
<li>정렬을 할 요소들의 부모요소의 display 속성에 flex라는 값을 넣어주어야 한다</li>
<li>Container와 Items, 2개의 개념으로 나뉜다</li>
</ul>
<h3 id="✔-flex-container-의-속성들">✔ Flex Container 의 속성들</h3>
<h4 id="1-display">1. display</h4>
<ul>
<li>display 속성으로 Flex Container를 정의한다<ol>
<li><code>flex</code> : Block형식의 Flex Container를 정의</li>
<li><code>inline-flex</code> : inline형식의 Flex Container를 정의</li>
</ol>
</li>
</ul>
<h4 id="2-flex-flow">2. flex-flow</h4>
<ul>
<li>Flex Items의 main 축을 설정하고 줄바꿈도 설정한다.</li>
<li>단축 속성이다.<ol>
<li><code>flex-direction</code> : items의 주 축을 설정 <strong>(default : row)</strong><ul>
<li><strong><code>row</code></strong> : items를 좌-&gt;우, 수평으로 표시 </li>
<li><code>row-reverse</code> : row를 역방향으로 표시</li>
<li><code>col</code> : items를 상-&gt;하, 수직으로 표시</li>
<li><code>col-reverse</code> : col을 역방향으로 표시</li>
</ul>
</li>
<li><code>flex-wrap</code>: items의 줄바꿈을 설정 <strong>(default : nowrap)</strong><ul>
<li><code>nowrap</code> : items를 줄바꿈 하지 않음, 한 줄에 표시</li>
<li><code>wrap</code> : items를 여러줄로 표시</li>
<li><code>wrap-reverse</code> : <code>wrap</code>의 역방향으로 표시</li>
</ul>
</li>
</ol>
</li>
</ul>
<h4 id="3-justify-content">3. justify-content</h4>
<ul>
<li>main축의 정렬 방법을 설정한다 <strong>(default : flex-start)</strong><ol>
<li><strong><code>flex-start</code></strong> : items를 container의 시작점에서 부터 정렬</li>
<li><code>flex-end</code> : items를 container의 끝에서 부터 정렬</li>
<li><code>center</code> : items를 container의 가운데 정렬</li>
<li><code>space-between</code> : 첫 item과 마지막 item은 container의 양쪽에 배치되고, 사이에 있는 나머지 items는 모두 간격이 일정하게 정렬</li>
<li><code>space-around</code> : items를 모두 동일한 여백으로 정렬</li>
</ol>
</li>
</ul>
<h4 id="4-align-content">4. align-content</h4>
<ul>
<li>교차축의 정렬 방법을 설정 <strong>(default : stretch)</strong></li>
<li>items가 여러 줄 이상이여야 사용 가능하다. (<code>flex-wrap</code>이 <code>nowrap</code>이면 사용 불가)</li>
<li><code>justify-content</code> 속성과 비슷하다<ol>
<li><strong><code>stretch</code></strong> : Container의 교차 축을 채우기 위해 items의 width가 늘어난다</li>
<li><code>flex-start</code> : items를 Container의 시작점에서 부터 정렬</li>
<li><code>flex-end</code> : items를 Container의 끝에서 부터 정렬</li>
<li><code>center</code> : items를 Contatiner의 가운데 정렬</li>
<li><code>space-between</code> : 첫 item과 마지막 item은 container의 위아래에 배치되고, 사이에 있는 나머지 items는 모두 간격이 일정하게 정렬</li>
<li><code>space-around</code> : itmes를 모두 동일한 여백으로 정렬</li>
</ol>
</li>
</ul>
<h4 id="5-align-items">5. align-items</h4>
<ul>
<li>교차축의 정렬 방법을 설정 (items가 한 줄 일때) <strong>(default : stretch)</strong></li>
<li><strong><code>flex-wrap</code>이 기본값(<code>stretch</code>) 일때만 사용 가능</strong><ol>
<li><strong><code>stretch</code></strong> : Container의 교차 축을 채우기 위해 items를 늘린다</li>
<li><code>flex-start</code> : align-content와 동일</li>
<li><code>flex-end</code> : align-content와 동일</li>
<li><code>center</code> : align-content와 동일</li>
<li><code>baseline</code> : 문자의 기준선에 정렬</li>
</ol>
</li>
</ul>
<hr>
<h3 id="✔-flex-items-의-속성들">✔ Flex Items 의 속성들</h3>
<h4 id="1-order-default--0">1. order <strong>(default : 0)</strong></h4>
<ul>
<li>items의 순서를 설정한다</li>
<li>items에 숫자를 지정하면, 숫자가 클수록 순서가 뒤로 가게된다</li>
<li>음수도 설정할 수 있다</li>
</ul>
<h4 id="2-flex">2. flex</h4>
<ul>
<li>item의 너비(증가, 감소, 기본)를 설정하는 단축 속성</li>
<li><code>flex-grow</code>, <code>flex-shrink</code>, <code>flex-basis</code>의 단축 속성이다<ol>
<li><code>flex-grow</code> <strong>(defualt : 0)</strong><ul>
<li>증가 너비 비율</li>
<li>숫자가 크면 클수록 증가하는 너비가 커진다</li>
<li>Item이 가변 너비가 아니거나, 0이면 효과가 없다</li>
</ul>
</li>
<li><code>flex-shrink</code> <strong>(defualt : 1)</strong><ul>
<li>감소 너비 비율</li>
<li>숫자가 작을수록 감소하는 너비가 커진다</li>
<li>Item이 가변 너비가 아니거나, 0이면 효과가 없다</li>
</ul>
</li>
<li><code>flex-basis</code> <strong>(defualt : auto)</strong><ul>
<li>item의 기본 너비를 설정</li>
<li>값이 <code>auto</code>라면 <code>width</code>, <code>height</code> 등의 속성으로 item의 너비를 설정 할 수 있다</li>
<li>값이 <code>단위</code>면 item의 너비를 설정 할 수 없다</li>
</ul>
</li>
</ol>
</li>
</ul>
<blockquote>
<pre><code> .item {
  flex: 1 2 100px; // 증가너비 감소너비 기본너비
  flex: 1 2;       // 증가너비 감소너비
  flex: 1 100px;   // 증가너비 기본너비
 }</code></pre></blockquote>
<p> ```</p>
<ul>
<li><code>flex-grow</code>를 제외한 개별 속성은 생략할 수 있다</li>
<li><code>flex: 1</code>와 <code>flex-grow: 1;</code>은 동일하다</li>
<li>증가너비 다음 단위를 사용하면 감소너비가 생략되고 기본너비가 설정된다</li>
<li>기본너비를 생략하면 <strong><code>기본값</code>이 설정되는 것이 아닌, 0이 적용</strong>된다 </li>
</ul>
<h4 id="3-align-self">3. align-self</h4>
<ul>
<li>align items를 개별적으로 지정하는 속성 <strong>(default : auto)</strong></li>
<li>일부 item만 정렬 방법을 변경하려고 할 때 사용<ol>
<li><strong><code>auto</code></strong> : Container의 <code>align-items</code>속성을 상속</li>
<li><code>stretch</code> : Container의 교차축을 기준으로 item을 늘림</li>
<li><code>flex-start</code> : Line의 시작점으로 정렬</li>
<li><code>flex-end</code> : Line의 끝점으로 정렬</li>
<li><code>center</code> : 가운데 정렬</li>
<li><code>baseline</code> : 문자의 기준선에 정렬  </li>
</ol>
<hr>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS style 상속 & 선택자 우선순위]]></title>
            <link>https://velog.io/@__bw95__/CSS-style-%EC%83%81%EC%86%8D-%EC%84%A0%ED%83%9D%EC%9E%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</link>
            <guid>https://velog.io/@__bw95__/CSS-style-%EC%83%81%EC%86%8D-%EC%84%A0%ED%83%9D%EC%9E%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</guid>
            <pubDate>Tue, 27 Dec 2022 10:48:18 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-css-style-상속--선택자-우선순위">💡 CSS style 상속 &amp; 선택자 우선순위</h1>
<h2 id="⬛-css-style-상속">⬛ CSS Style 상속</h2>
<ul>
<li>부모(조상)요소의 속성이 하위요소까지 영향을 받는것을 뜻함</li>
</ul>
<h3 id="✔-상속되는-css의-속성들">✔ 상속되는 CSS의 속성들..</h3>
<ul>
<li>모두 <strong>글자/문자 관련 속성들</strong>이다</li>
<li><strong>모든</strong> <strong>글자/문자 관련 속성들</strong>은 아니다</li>
<li>예시<ol>
<li><code>font-style</code> : 글자 스타일</li>
<li><code>font-weight</code> : 글자 두께</li>
<li><code>font-size</code> : 글자 크기</li>
<li><code>line-height</code> : 줄 높이</li>
<li><code>font-family</code> : 폰트(서체)</li>
<li><code>color</code> : 글자 색상</li>
<li><code>text-align</code> : 글자 정렬</li>
</ol>
</li>
</ul>
<hr>
<h3 id="강제-상속">강제 상속</h3>
<ul>
<li>inherit : 부모의 속성 값을 상속한다</li>
</ul>
<pre><code>.parent {
  width: 300px;
  height : 200px;
  background-color: red;
}
.child {
  width: 100px;
  height: inherit;
  background-color: orange;
}</code></pre><hr>
<h2 id="⬛-선택자-우선순위">⬛ 선택자 우선순위</h2>
<ul>
<li>같은 요소가 여러 선언의 대상이 된 경우, 어떤 선언이 CSS 속성을 <strong>우선 적용할지 결정하는 방법</strong></li>
</ul>
<pre><code>&lt;div 
  id=&quot;color_yellow&quot; 
  class=&quot;color_green&quot; 
  style=&quot;color: pink&quot;&gt;
  Hello World!
&lt;/div&gt;</code></pre><pre><code>div {
  color: red !important;
}
#color_yellow {
  color: yellow;
}
.color_green {
  color: green;
}
div {
  color: blue;
}
* {
  color: darkblue;
}
body {
  color: violet;
}</code></pre><ul>
<li>우선순위</li>
</ul>
<ol>
<li>!important</li>
<li>inline 선언</li>
<li>id 선택자</li>
<li>class 선택자</li>
<li>tag 선택자</li>
<li>전체선택자</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS 기초 및 선택자]]></title>
            <link>https://velog.io/@__bw95__/CSS-%EA%B8%B0%EC%B4%88-%EB%B0%8F-%EC%84%A0%ED%83%9D%EC%9E%90</link>
            <guid>https://velog.io/@__bw95__/CSS-%EA%B8%B0%EC%B4%88-%EB%B0%8F-%EC%84%A0%ED%83%9D%EC%9E%90</guid>
            <pubDate>Sun, 25 Dec 2022 10:45:30 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-css">💡 CSS</h1>
<ul>
<li>웹 문서의 전반적인 스타일을 미리 저장해 둔 Style Sheet이다</li>
<li>HTML로 작성된 문서의 표현되는 방법을 정해준다</li>
</ul>
<h3 id="✔-기본-문법">✔ 기본 문법</h3>
<ul>
<li>스타일을 적용할 대상</li>
<li>선택자 {속성: 값;}</li>
</ul>
<blockquote>
</blockquote>
<pre><code>div {
  color: red;
  padding: 10px;
}</code></pre><hr>
<h2 id="⬛-선언-방식">⬛ 선언 방식</h2>
<h3 id="✔-내장-방식">✔ 내장 방식</h3>
<ul>
<li><code>&lt;style&gt;&lt;/style&gt;</code> 내용으로 스타일을 작성하는 방식</li>
</ul>
<blockquote>
</blockquote>
<pre><code>&lt;style&gt;
  div {
  color: red;
  padding: 10px;
}
&lt;/style&gt;</code></pre><h3 id="✔인라인-방식">✔인라인 방식</h3>
<ul>
<li>요소의 <strong>style</strong> 속성에 직접 작성하는 방식</li>
<li>선택자가 없다</li>
</ul>
<blockquote>
</blockquote>
<pre><code>&lt;div style=&quot;color: red; padding: 10px;&quot;&gt;&lt;/div&gt;</code></pre><h3 id="✔-링크-방식">✔ 링크 방식</h3>
<ul>
<li>외부 CSS파일을 가져와서 연결하는 방식</li>
</ul>
<blockquote>
</blockquote>
<pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;./main.css&quot;&gt;</code></pre><h3 id="✔-import-방식">✔ import 방식</h3>
<ul>
<li>CSS의 @import 규직으로 CSS파일 안에서 다른 CSS파일을 가져와 연결하는 방식</li>
</ul>
<blockquote>
</blockquote>
<pre><code>@import url(&quot;./box.css&quot;);</code></pre><hr>
<h1 id="💡-선택자-selector">💡 선택자 (Selector)</h1>
<h2 id="⬛-기본-선택자">⬛ 기본 선택자</h2>
<h3 id="✔-전체-선택자">✔ 전체 선택자</h3>
<ul>
<li>*(asterisk) : 모든 요소를 선택</li>
</ul>
<blockquote>
</blockquote>
<pre><code>* {
  color: red;
}</code></pre><h3 id="✔-태그-선택자">✔ 태그 선택자</h3>
<ul>
<li>태그의 이름으로 요소를 선택하는 선택자</li>
</ul>
<blockquote>
</blockquote>
<pre><code>li {
  color: red;
}</code></pre><h3 id="✔-클래스-선택자">✔ 클래스 선택자</h3>
<ul>
<li>HTML 파일 내, class속성의 값으로 선택하는 선택자</li>
<li>클래스 선택자를 의미하는 &quot;.&quot;을 class이름 앞에 붙혀준다</li>
</ul>
<blockquote>
</blockquote>
<pre><code>.class_value {
  color: red;
}</code></pre><h3 id="✔-아이디-선택자">✔ 아이디 선택자</h3>
<ul>
<li>HTML 파일 내, id속성의 값으로 선택하는 선택자</li>
<li>아이디 선택자를 의미하는 &quot;#&quot;을 id이름 앞에 붙혀준다</li>
</ul>
<blockquote>
</blockquote>
<pre><code>#id_value{
  color: red;
}</code></pre><hr>
<h2 id="⬛-복합-선택자">⬛ 복합 선택자</h2>
<ul>
<li>기본 선택자를 조합하여 선택하는 선택자</li>
</ul>
<h3 id="✔-일치-선택자-basic-combinator">✔ 일치 선택자 (Basic Combinator)</h3>
<ul>
<li>선택자 A,B를 동시에 만족하는 요소를 선택하는 구조</li>
</ul>
<blockquote>
</blockquote>
<p>EX) class의 값이 &quot;value&quot;인 span tag내의 요소</p>
<pre><code>span.value {
  color: red;
}</code></pre><h3 id="✔-자식-선택자-child-combinator">✔ 자식 선택자 (Child Combinator)</h3>
<ul>
<li>선택자 A의 자식요소 B를 선택하는 구조</li>
<li>&quot;&gt;&quot;가 선택자의 기호이다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) class의 값이 &quot;value&quot;인 ul의 자식요소</p>
<pre><code>ul &gt; .value{
  color: red;
}</code></pre><h3 id="✔-하위후손-선택자-descendant-combinator">✔ 하위(후손) 선택자 (Descendant Combinator)</h3>
<ul>
<li>선택자 A의 하위요소 B를 선택하는 구조</li>
<li>&quot;띄어쓰기&quot;가 선택자의 기호이다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) class의 값이 &quot;value&quot;인 div의 하위요소</p>
<pre><code>div .value {
  color: red;
}</code></pre><h3 id="✔-인접-형제-선택자-adjacent-sibling-combinator">✔ 인접 형제 선택자 (Adjacent Sibling Combinator)</h3>
<ul>
<li>선택자 A의 <strong>다음</strong> 형제요소 B를 선택하는 구조</li>
<li>&quot;+&quot;가 선택자의 기호이다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) class의 값이 &quot;value&quot;인 요소의 바로 다음 div 요소 &#39;하나&#39;</p>
<pre><code>.value + div {
  color: red;
}</code></pre><h3 id="✔-일반-형제-선택자-general-sibling-combinator">✔ 일반 형제 선택자 (General Sibling Combinator)</h3>
<ul>
<li>선택자 A의 <strong>다음</strong> 형제요소를 <strong>모두</strong> 선택하는 구조</li>
<li>&quot;~&quot;가 선택자의 기호이다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) class의 값이 &quot;value&quot;인 요소의 다음 div 요소 &#39;모두&#39;</p>
<pre><code>.value ~ div {
  color: red;
}</code></pre><hr>
<h2 id="⬛-가상-클래스-선택자---동작-관련-pseudo-classes">⬛ 가상 클래스 선택자 - 동작 관련 (Pseudo-Classes)</h2>
<ul>
<li>각 요소들의 상태에 따른 선택이 이루어지는 선택자를 의미한다</li>
</ul>
<h3 id="✔-hover">✔ :hover</h3>
<ul>
<li>마우스 커서를 올렸을 때 동작한다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) A tag위에 마우스를 올리면 빨간색으로 변경</p>
<pre><code>A:hover{
  color: red;
}</code></pre><h3 id="✔-active">✔ :active</h3>
<ul>
<li>요소에 마우스 클릭을 하고 있는 동안 동작한다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) A tag를 클릭하고 있는 동안 빨간색으로 변경</p>
<pre><code>A:active {
  color: red;
}</code></pre><h3 id="✔-focus">✔ :focus</h3>
<ul>
<li>요소가 포커스되면 선택</li>
<li>포커스가 가능한 요소에서만 동작한다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) input tag가 포커스되면 backgrount color를 빨간색으로 변경</p>
<pre><code>input:focus {
  background-color: red;
}</code></pre><hr>
<h2 id="⬛-가상-클래스-선택자---특정-요소-선택-관련">⬛ 가상 클래스 선택자 - 특정 요소 선택 관련</h2>
<h3 id="✔-first-child">✔ :first-child</h3>
<ul>
<li>선택자의 형제 요소 중 첫째라면 선택</li>
</ul>
<blockquote>
</blockquote>
<p>EX) Class A의 자식 요소 중, 첫번째 요소가 span이라면 color 변경</p>
<pre><code>.A span:first-child {
  color: red;
}</code></pre><h3 id="✔-last-child">✔ :last-child</h3>
<ul>
<li>선택자의 형제 요소 중 마지막이라면 선택</li>
</ul>
<blockquote>
</blockquote>
<p>EX) Class A의 자식 요소 중, 마지막 요소가 span이라면 color 변경</p>
<pre><code>.A span:last-child {
  color: red;
}</code></pre><h3 id="✔-nth-childn">✔ :nth-child(n)</h3>
<ul>
<li>선택자의 형제 요소 중 n번째라면 선택</li>
<li>상수를 사용해도 되지만 2n, 2n+1, n+3 등의 방식으로 사용할 수 있다<ul>
<li>위와 같이 사용할 때, n은 0부터 시작한다</li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<p>EX1) Class A의 자식 요소 중, 3번째 요소가 span이라면 color 변경</p>
<pre><code>.A span:nth-child(3) {
  color: red;
}</code></pre><blockquote>
</blockquote>
<p>EX2) Class A의 자식 요소 중, 3번째 요소의 color 변경</p>
<pre><code>.A *:nth-child(3) {
  color: red;
}</code></pre><blockquote>
</blockquote>
<p>EX3) Class A의 자식 요소 중, (2 x n) 번째 요소의 color 변경</p>
<pre><code>.A *:nth-child(2n) {
  color: red;
}</code></pre><h3 id="✔-notx">✔ :not(X)</h3>
<ul>
<li>부정선택자</li>
<li>선택자 X가 아닌 다른 요소들을 선택</li>
</ul>
<blockquote>
</blockquote>
<p>EX) Class A의 자식 요소 중, span을 제외한 요소들의 color 변경</p>
<pre><code>.A *:not(span) {
  color: red;
}</code></pre><hr>
<h2 id="⬛-가장-요소-선택자">⬛ 가장 요소 선택자</h2>
<ul>
<li>콜론(&quot;:&quot;) 2개를 사용한다</li>
<li>반드시 Content 라는 속성을 사용하여야 한다</li>
</ul>
<h3 id="✔-before">✔ ::before</h3>
<ul>
<li>선택자 요소 내부의 <strong>앞에</strong> 내용(Content)을 삽입</li>
<li>가상의 인라인 요소를 만들어 삽입한다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) Class A 내부의 앞에 &quot;앞&quot;이라는 텍스트를 출력</p>
<pre><code>.A::before {
  content: &quot;앞&quot;;
}</code></pre><h3 id="✔-after">✔ ::after</h3>
<ul>
<li>선택자 요소 내부의 <strong>뒤에</strong> 내용(Content)을 삽입</li>
<li>가상의 인라인 요소를 만들어 삽입한다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) Class A 내부의 뒤에 &quot;뒤&quot;이라는 텍스트를 출력</p>
<pre><code>.A::before {
  content: &quot;뒤&quot;;
}</code></pre><hr>
<h2 id="⬛-속성-선택자-attribute">⬛ 속성 선택자 (Attribute)</h2>
<ul>
<li>대괄호를 포함하여 사용</li>
</ul>
<h3 id="✔-disabled">✔ disabled</h3>
<ul>
<li>비활성화가 되어있는 속성들을 선택</li>
</ul>
<blockquote>
</blockquote>
<p>EX) 비활성화 되어있는 속성들의 color를 변경</p>
<pre><code>[disabled] {
  color: red;
}</code></pre><h3 id="✔-type">✔ type</h3>
<ul>
<li>type 속성을 가지고 있는 속성들을 선택</li>
<li>type의 value를 특정하여 선택 할 수도 있다</li>
</ul>
<blockquote>
</blockquote>
<p>EX) type의 값이 &quot;value&quot;인 것들의 color를 변경</p>
<pre><code>[type=&quot;value&quot;] {
  color: red;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[HTML 전역 속성]]></title>
            <link>https://velog.io/@__bw95__/HTML-%EC%A0%84%EC%97%AD-%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@__bw95__/HTML-%EC%A0%84%EC%97%AD-%EC%86%8D%EC%84%B1</guid>
            <pubDate>Tue, 20 Dec 2022 05:46:46 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-html-전역-속성">💡 HTML 전역 속성</h1>
<ul>
<li>전역 특성(Global attributes)은 모든 HTML에서 공통으로 사용할 수 있는 특성이다. </li>
<li>일부 요소에는 아무런 효과도 없을 수 있다.</li>
<li>전역 특성은 모든 HTML 요소에 지정할 수 있으며, 심지어 표준에 명시되지 않은 요소에도 지정할 수 있다.</li>
</ul>
<h2 id="title">title</h2>
<ul>
<li>요소의 정보나 설명을 지정</li>
<li>요소에 마우스 커서를 올리면 <code>title</code> 속성에 들어간 텍스트가 보임<blockquote>
<p><code>&lt;a href=&quot;https://www.naver.com&quot; title=&quot;네이버로 이동&quot;&gt;네이버&lt;/a&gt;</code>
<a href="https://www.naver.com" title="네이버로 이동">네이버</a></p>
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTcCMrW4oXQcNZtuxUa0c2q3ipCvWpZKHNzWA&usqp=CAU" alt="네이버로 이동">
</blockquote>
</li>
</ul>
<h2 id="style">style</h2>
<ul>
<li>스타일은 별도의 파일에 정의하는 것으로 권장됨</li>
<li>요소에 적용할 스타일(CSS)을 지정</li>
</ul>
<h2 id="class">class</h2>
<ul>
<li><p>요소를 지칭하는 <ins><strong>중복</strong></ins> 가능한 이름</p>
</li>
<li><p>CSS 또는 JavaScript로 제어하기 위한 Tag</p>
</li>
<li><p>대소문자를 구분하지 않음</p>
</li>
<li><p>하나의 요소가 여러 클래스를 가질 수 있음, 공백으로 구분</p>
<ul>
<li>class=&quot;VE Log&quot; -&gt; VE와 Log, 2개 클래스를 가진 Tag</li>
</ul>
<blockquote>
<p><code>&lt;span&gt;요소&lt;/span&gt;를 지칭하는 &lt;span class=&quot;red&quot;&gt;중복&lt;/span&gt; 가능한 이름</code>
<code>CSS</code> 👇
.red {
 color: red;
}
&lt;&lt;출력&gt;&gt;
<span>요소</span>를 지칭하는 <span class="red"><style>.red{color:red;}</style>중복</span> 가능한 이름</p>
</blockquote>
</li>
</ul>
<h2 id="id">id</h2>
<ul>
<li>요소를 지칭하는 <ins><strong>고유</strong></ins>한 이름</li>
<li>하나의 요소에 하나의 이름만 사용 가능</li>
<li>CSS에서 제어 할때는 class를 제어하는 것과 비슷함<blockquote>
<p><code>&lt;span id=&quot;blue&quot;&gt;요소&lt;/span&gt;를 지칭하는 &lt;span class=&quot;red&quot;&gt;중복&lt;/span&gt; 가능한 이름</code>
<code>CSS</code> 👇
.red {
 color: red;
}
#abc {
 color: blue;
}
&lt;&lt;출력&gt;&gt;
<span id=blue><style>#blue{color:blue;}</style>요소</span>를 지칭하는 <span class="red"><style>.red{color:red;}</style>고유</span>한 이름</p>
</blockquote>
</li>
</ul>
<h2 id="data">data</h2>
<ul>
<li>요소에 <ins><strong>데이터</strong></ins>를 지정</li>
<li><code>data-{사용자 지정}</code> 형태로 사용 </li>
<li>HTML에서 body Tag가 만들어지기 전, 호출되므로 <code>defer</code> 라는 속성을 추가<blockquote>
<p><code>&lt;HTML&gt;</code>
<code>&lt;head&gt;</code>
<code>&lt;script defer src=&quot;main.js&quot;&gt;&lt;/script&gt;</code>
<code>&lt;/head&gt;</code>
<code>&lt;body&gt;</code>
<code>&lt;div data-wepsite=&quot;naver&quot;&gt;네이버&lt;/div&gt;</code>
<code>&lt;div data-wepsite=&quot;google&quot;&gt;구글&lt;/div&gt;</code>
<code>&lt;/body&gt;</code></p>
</blockquote>
<code>&lt;JavaScript&gt;</code>
<code>const els = document.querySelectorAll(&#39;div&#39;)</code>
<code>els.forEach(el =&gt; {console.log(el.dataset.fruitName)})</code><blockquote>
<p>&lt;출력&gt;
naver
google</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML Semantic Tags]]></title>
            <link>https://velog.io/@__bw95__/HTML-Semantic-Tags</link>
            <guid>https://velog.io/@__bw95__/HTML-Semantic-Tags</guid>
            <pubDate>Mon, 19 Dec 2022 15:57:10 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-semantic-tag">💡 Semantic Tag?</h1>
<ul>
<li>컴퓨터가 정보를 읽고, 이해, 가공하여 새로운 정보를 만들어 낼 수 있도록 만든 지능형 웹</li>
</ul>
<h3 id="layout-tag">Layout Tag</h3>
<h4 id="header"><code>&lt;header&gt;</code></h4>
<ul>
<li>일반적으로 웹 페이지의 가장 윗부분에 위치함</li>
<li>웹 페이지의 제목이나, 상단바 혹은 검색창 등이 포함됨.<h4 id="nav"><code>&lt;nav&gt;</code></h4>
</li>
<li>navigation의 약자로, 사이트의 탭을 포함하고 있음</li>
<li><code>&lt;nav&gt;</code> tag안에 list tag들을 넣어 사용<h4 id="main"><code>&lt;main&gt;</code></h4>
</li>
<li>사이트의 메인 콘텐츠를 포함<h4 id="section"><code>&lt;section&gt;</code></h4>
</li>
<li>웹 페이지의 섹션을 나타내는 Tag</li>
<li>페이지를 Part별로 나누기 위해서도 사용됨<h4 id="aside"><code>&lt;aside&gt;</code></h4>
</li>
<li>본문이 끝나고 추가 내용을 포함하는 Tag</li>
<li>광고 등이 들어가기도 함<h4 id="footer"><code>&lt;footer&gt;</code></h4>
</li>
<li>보통 페이지의 가장 하단부에 위치</li>
<li>CopyRight 및 라이센스 등이 포함됨</li>
</ul>
<h3 id="👉-예시">👉 예시</h3>
<blockquote>
<pre><code>&lt;!DOCTYPE html&gt;</code></pre></blockquote>
<html lang="ko">
    <head>
        <meta charset="utf-8">
        <title>FastCampus</title> // 페이지 제목
    </head>
    <body>
        <header>
            <h1>Megabyte School</h1> // 사이트 제목
            <h2>HTML</h2> // 사이트 부제목
            <nav>
                <ul>
                    <li>HTML 이란?</li>     // 메뉴1
                    <li>HTML Tags</li>     // 메뉴2
                    <li>Semantic Tags</li> // 메뉴3
                </ul>
            </nav>
        </header>
        <main>
            <p>HTML 설명</p> // 본문 내용
        </main>
        <aside>
            광고..등등
        </aside>
        <footer>
            <p>LICENSE</p>
        </footer>
    </body>
</html>

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8">
        <title>FastCampus</title>
    </head>
    <body>
        <header>
            <h1>Megabyte School</h1>
            <h2>HTML</h2>
            <nav>
                <ul>
                    <li>HTML 이란?</li>     
                    <li>HTML Tags</li>    
                    <li>Semantic Tags</li>
                </ul>
            </nav>
        </header>
        <main>
            <p>HTML 설명</p>
        </main>
        <aside>
            광고..등등
        </aside>
        <footer>
            <p>LICENSE</p>
        </footer>
    </body>
</html>]]></description>
        </item>
        <item>
            <title><![CDATA[HTML 기초 및 Tag]]></title>
            <link>https://velog.io/@__bw95__/HTML-basicTags</link>
            <guid>https://velog.io/@__bw95__/HTML-basicTags</guid>
            <pubDate>Mon, 19 Dec 2022 10:54:07 GMT</pubDate>
            <description><![CDATA[<h1 id="💡-html이란">💡 HTML이란..</h1>
<ul>
<li>Hyper Text Markup Language</li>
<li>웹 문서를 만들기 위하여 사용하는 기본적인 웹 언어의 한 종류이고, 하이퍼텍스트를 작성하기 위해 개발됨</li>
</ul>
<h1 id="🧾-html의-구조">🧾 HTML의 구조</h1>
<ul>
<li>EX)<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;오늘의 날씨&lt;/h1&gt;
&lt;p&gt;많이 추워지니 따듯하게 입으세요!&lt;/p&gt;
&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="doctype">!DOCTYPE</h3>
</li>
<li>문서 형식을 정의</li>
<li><code>HTML5</code>는 현재 HTML의 최신 규격</li>
<li><code>!DOCTYPE HTML</code>은 <code>HTML5</code>를 표현</li>
</ul>
<h3 id="lang">lang</h3>
<ul>
<li>웹문서의 전체 또는 일부에 관련 언어를 지정하는 속성</li>
</ul>
<h3 id="기본-구조">기본 구조</h3>
<ul>
<li><code>&lt;html&gt;</code> Tag는 <code>&lt;head&gt;</code>와 <code>&lt;body&gt;</code>로 구성 </li>
<li><code>&lt;head&gt;</code><ul>
<li>HTML의 속성이 포함되어있는 Tag, 제목이나 정보등이 들어있음</li>
</ul>
</li>
<li><code>&lt;body&gt;</code><ul>
<li>HTML의 구조를 담고있는 Tag</li>
<li>표현할 웹 페이지의 레이아웃이 포함되어 있음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="head-관련-tag">head 관련 Tag</h2>
<h4 id="meta"><code>&lt;meta&gt;</code></h4>
<ul>
<li>웹 페이지의 부가 정보들을 표기하는 Tag<h4 id="title"><code>&lt;title&gt;</code></h4>
</li>
<li>웹 페이지의 제목을 설정하는 Tag<h4 id="link"><code>&lt;link&gt;</code></h4>
</li>
<li>다른 파일들과 연결을 하는 Tag</li>
<li>대표적으로 <strong>CSS</strong>, <strong>파비콘</strong> 등이 있음</li>
</ul>
<hr>
<h2 id="텍스트-관련-tag">텍스트 관련 Tag</h2>
<h4 id="h16"><code>&lt;h[1~6]&gt;</code></h4>
<ul>
<li>제목 관련 Tag</li>
<li>보통 <code>&lt;h1&gt;</code> 부터 <code>&lt;h6&gt;</code> 순으로 중요도를 표현</li>
</ul>
<pre><code>&lt;h1&gt;제목1&lt;h1&gt;
&lt;h2&gt;제목2&lt;h2&gt;
&lt;h3&gt;제목3&lt;h3&gt;
&lt;h4&gt;제목4&lt;h4&gt;
&lt;h5&gt;제목5&lt;h5&gt;
&lt;h6&gt;제목6&lt;h6&gt;</code></pre><h4 id="p"><code>&lt;p&gt;</code></h4>
<ul>
<li>문단을 표현하는 Tag</li>
<li><code>&lt;p&gt;</code> Tag 안에서는 줄바꿈을 하여도 하나의 문단으로 인식<pre><code>&lt;p&gt;P 태그 안에서는
줄바꿈을 하여도 하나의 문단으로
인식한다.&lt;/p&gt;</code></pre><h4 id="b"><code>&lt;b&gt;</code></h4>
</li>
<li><strong>굵은 글씨 효과를 주는 Tag</strong></li>
</ul>
<h4 id="ins"><code>&lt;ins&gt;</code></h4>
<ul>
<li><ins>밑줄 효과를 주는 Tag</ins><h4 id="del"><code>&lt;del&gt;</code></h4>
</li>
<li><del>취소선</del> 효과를 주는 Tag<h4 id="br"><code>&lt;br&gt;</code></h4>
</li>
<li>문단 내의 줄바꿈 Tag</li>
</ul>
<hr>
<h2 id="목록-관련-tag">목록 관련 Tag</h2>
<h4 id="ul"><code>&lt;ul&gt;</code></h4>
<ul>
<li>Unordered list, 순서가 <strong>없는</strong> 목록</li>
</ul>
<blockquote>
<pre><code>&lt;ul&gt;
 &lt;li&gt;1번&lt;/li&gt;
 &lt;li&gt;2번&lt;/li&gt;
&lt;/ul&gt;
&lt;&lt;출력&gt;&gt;</code></pre></blockquote>
<ul>
<li>1번</li>
<li>2번</li>
</ul>
<h4 id="ol"><code>&lt;ol&gt;</code></h4>
<ul>
<li>Ordered list, 순서가 <strong>있는</strong> 목록</li>
</ul>
<blockquote>
<pre><code>&lt;ol&gt;
 &lt;li&gt;1번&lt;/li&gt;
 &lt;li&gt;2번&lt;/li&gt;
&lt;/ol&gt;</code></pre></blockquote>
<ol>
  <li>1번</li>
  <li>2번</li>
</ol>

<h4 id="li"><code>&lt;li&gt;</code></h4>
<ul>
<li>list item, 항목 Tag</li>
</ul>
<hr>
<h2 id="링크-관련-tag">링크 관련 Tag</h2>
<h4 id="a"><code>&lt;a&gt;</code></h4>
<ul>
<li>Anchor, 하이퍼링크 Tag
<code>&lt;a href=&quot;https://www.google.co.kr&quot;&gt;구글&lt;/a&gt;</code> <a href="https://www.google.co.kr">구글</a><h4 id="img"><code>&lt;img&gt;</code></h4>
</li>
<li>image Tag
<code>&lt;img src=&quot;https://www.google.com/favicon.ico&quot; alt=구글 로고&quot;&gt;</code><img src="https://www.google.com/favicon.ico" alt="구글 로고">
#### `<svg>`</li>
<li>SVG 형식의 그래픽 Tag</li>
<li>별도의 파일 없이 HTML 안에서 코딩으로 넣을 수도 있음</li>
</ul>
<hr>
<h2 id="테이블-관련-tag">테이블 관련 Tag</h2>
<h4 id="table"><code>&lt;table&gt;</code></h4>
<ul>
<li>테이블을 만드는 Tag<h4 id="tr"><code>&lt;tr&gt;</code></h4>
</li>
<li>Table row, 테이블의 행을 뜻하는 Tag<h4 id="td"><code>&lt;td&gt;</code></h4>
</li>
<li>Table data, 테이블의 내용, 즉 셀을 표현<blockquote>
<pre><code></code></pre></blockquote>
<table>
　　<tr>
　　　　<td>A</td>
　　　　<td>B</td>
　　　　<td>C</td>
　　</tr>
　　<tr>
　　　　<td>D</td>
　　　　<td>E</td>
　　　　<td>F</td>
　　</tr>
</table>
>```
<table>
　　<tr>
　　　　<td>A</td>
　　　　<td>B</td>
　　　　<td>C</td>
　　</tr>
　　<tr>
　　　　<td>D</td>
　　　　<td>E</td>
　　　　<td>F</td>
　　</tr>
</table>

</li>
</ul>
<h4 id="th"><code>&lt;th&gt;</code></h4>
<ul>
<li>Table heading, 테이블의 행</li>
<li>Default로 가운데 정렬이고 굵은 글씨로 표시됨<blockquote>
<pre><code></code></pre></blockquote>
<table>
　　<tr>
　　　　<th>A</th>
　　　　<th>B</th>
　　　　<th>C</th>
　　</tr>
　　<tr>
　　　　<td>a</td>
　　　　<td>b</td>
　　　　<td>c</td>
　　</tr>
</table>
>```
<table>
　　<tr>
　　　　<th>A</th>
　　　　<th>B</th>
　　　　<th>C</th>
　　</tr>
　　<tr>
　　　　<td>a</td>
　　　　<td>b</td>
　　　　<td>c</td>
　　</tr>
</table>







</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>