<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>rami_tae.log</title>
        <link>https://velog.io/</link>
        <description>개발자가 되기 위해 공부하고 있습니다!
T-story위주로 사용합니다.</description>
        <lastBuildDate>Mon, 25 Nov 2019 15:54:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>rami_tae.log</title>
            <url>https://images.velog.io/profiles/rami_tae/thumbnails/1573910798.226.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. rami_tae.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/rami_tae" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[191125(월) N-Queens]]></title>
            <link>https://velog.io/@rami_tae/2019-11-26-0011-%EC%9E%91%EC%84%B1%EB%90%A8-t2k3em3b0b</link>
            <guid>https://velog.io/@rami_tae/2019-11-26-0011-%EC%9E%91%EC%84%B1%EB%90%A8-t2k3em3b0b</guid>
            <pubDate>Mon, 25 Nov 2019 15:54:57 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-n-queens">[CODESTATES im16] N-Queens</h1>
<p>숫자 오름차순 순서로 수도코드를 짰음.</p>
<p>정리하다 보니 더 나은 방법이 떠올랐기 때문에 현재로써는 n queens가 가장 효율적임.(n rooks도 그 방법으로 할 예정)</p>
<h1 id="1-findnrookssolution">1. findNRooksSolution()</h1>
<p><strong>: returns a single solution to the n-rooks problem</strong></p>
<p><img src="https://images.velog.io/post-images/rami_tae/d867f2e0-0f9b-11ea-b088-53d1f3f38e50/25-3.-N-Queens-1.png" alt="25-3. N Queens - 1.png"></p>
<h1 id="2-countnrookssolutions">2. countNRooksSolutions()</h1>
<p><strong>: returns a count of the total number of solutions to the n-rooks problem</strong></p>
<p><img src="https://images.velog.io/post-images/rami_tae/dab209f0-0f9b-11ea-b088-53d1f3f38e50/25-3.-N-Queens-2.png" alt="25-3. N Queens - 2.png"></p>
<h1 id="3-findnqueenssolution">3. findNQueensSolution()</h1>
<p><strong>: returns a single solution to the n-queens problem</strong></p>
<h1 id="4-countnqueenssolutions">4. countNQueensSolutions()</h1>
<p><strong>: returns a count of the total number of solutions to the n-queens problem</strong></p>
<p><img src="https://images.velog.io/post-images/rami_tae/dd5c6970-0f9b-11ea-b088-53d1f3f38e50/25-3.-N-Queens-34.png" alt="25-3. N Queens - 3,4.png"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191122(금) 2. Inheritance & Polymorphism]]></title>
            <link>https://velog.io/@rami_tae/191122%EA%B8%88-2.-Inheritance-Polymorphism-rak3a8u6js</link>
            <guid>https://velog.io/@rami_tae/191122%EA%B8%88-2.-Inheritance-Polymorphism-rak3a8u6js</guid>
            <pubDate>Fri, 22 Nov 2019 14:32:37 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-sprint-office-hour">[CODESTATES im16] Sprint Office Hour</h1>
<h1 id="1-inheritance--polymorphism">1. Inheritance &amp; Polymorphism</h1>
<ul>
<li>Inheritance(상속): 상위 객체의 특징을 하위 객체에게 넘겨주는 것</li>
<li>Polymorphism(다형성): 동일한 조작방법으로 동작을 시키지만, 작동 결과는 다른 것</li>
</ul>
<h1 id="2-prototype">2. Prototype</h1>
<h2 id="2-1-prototype-object">2-1. Prototype Object</h2>
<ul>
<li>prototype 객체:<ul>
<li>constructor에 의해 생성될 각각의 인스턴스에게 공유. 프로퍼티를 제공하기 위해 사용</li>
<li><code>함수.prototype</code>, <code>객체.__proto__</code>(dunder proto)로 접근 가능하다.</li>
</ul>
</li>
<li>dunder proto덕분에 프로토타입 체이닝이 가능해짐</li>
</ul>
<p>프로토타입 객체가 뭔지.</p>
<p>프로토타입 </p>
<p>프로토타입 체이닝, 왜 가능해지는지</p>
<h2 id="2-2-prototype-chaining">2-2. Prototype chaining</h2>
<p>scope chaining처럼, 메서드 혹은 속성을 찾지 못했을 경우 상위 프로토 타입을 참조하는 것.</p>
<h1 id="3-subclassing-patterns">3. Subclassing patterns</h1>
<h2 id="3-1-functional-subclassing">3-1. Functional Subclassing</h2>
<pre><code class="language-js">var car = function (loc) {
    var obj = { loc: loc };
    obj.move = function () {obj,loc++ };
    return obj;
}

var Van = function (loc) {
    //super class의 instance에 이 subclass만의 method를 할당.
    var obj = Car(loc);
    obj.grab = function () { ... };
    return obj;
}

var Cop = function (loc) {
    var obj = Car(loc);
    obj.cal = function () { ... };
    return obj;
}</code></pre>
<p>쓸모없는 메모리 소모가 많아짐. &gt; 각 function마다 함수들을 다 만들기 때문이다.</p>
<h2 id="3-2-pseudoclassical-subclassing">3-2. Pseudoclassical Subclassing</h2>
<p>ES6에서 class가 생기기 전에 subclass를 구현하기 위해 만들었던 방법</p>
<p><img src="https://images.velog.io/post-images/rami_tae/e16032e0-0d34-11ea-8598-ed49189994cc/22.-pseboclassical.png" alt="22. pseboclassical.png"></p>
<h2 id="3-3-es6-class-subclassing">3-3. ES6 class Subclassing</h2>
<p><img src="https://images.velog.io/post-images/rami_tae/e37668b0-0d34-11ea-a7f3-97069332b44c/22.-ES6-class.png" alt="22. ES6 class.png"></p>
<h1 id="3-subclass-dance-party">3. Subclass Dance party</h1>
<p>line up: 반드시 상속을 이용하여 구현해야 함.</p>
<p>hint: 무조건 그대로 사용하기보다는 필요하다면 자식클래스에서 메서드 확장을 통해 </p>
<h1 id="4-qna">4. QnA</h1>
<h2 id="q1">Q1.</h2>
<p>화살표 함수와 무명함수는 this바인딩이 다르기 때문에 사용되는 부분이 다르다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191120(수) 3. Understanding Prototype Chain]]></title>
            <link>https://velog.io/@rami_tae/191120%EC%88%98-3.-Understanding-Prototype-Chain</link>
            <guid>https://velog.io/@rami_tae/191120%EC%88%98-3.-Understanding-Prototype-Chain</guid>
            <pubDate>Wed, 20 Nov 2019 15:29:29 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-understanding-prototype-chain">[CODESTATES im16] Understanding Prototype Chain</h1>
<h1 id="1-자바스크립트">1. 자바스크립트?</h1>
<p>prototype기반의 언어.</p>
<p>ES5까지는 class가 없었음. &gt; sudo-classical</p>
<p>ES6부터 calss 지원(하지만 그렇다고 해서 JS가 프로토타입 기반의 언어인 것은 변하지 않았음.)</p>
<h1 id="2-prototype-상속">2. prototype 상속</h1>
<h2 id="2-1-__proto__-프로토타입을-확인할-수-있다">2-1. <code>__proto__</code>: 프로토타입을 확인할 수 있다.</h2>
<pre><code class="language-js">function Human(name) {
    this.name = name;
}
let steve = new Human(&#39;steve&#39;);
steve.__proto__ === Human.prototype; //true</code></pre>
<h2 id="q1-아래-코드가-실행되는-이유는">Q1. 아래 코드가 실행되는 이유는?</h2>
<pre><code class="language-js">var Human = function(name) {
    this.name = name;
}
Human.prototype.sleep = function() {};

var steve = new Human(&#39;steve&#39;);
steve.toString(); // [object Object]</code></pre>
<blockquote>
<p><code>Human.__proto__</code>에는 <code>toString()</code>이 없음. 하지만 <code>Human</code>의 기본형인 <code>Object</code>에는 <code>toString()</code>이 존재함. (모든 객체는 <code>Object</code>를 상속받음)</p>
<pre><code class="language-js">steve.__proto__.__proto__ === Object.__proto__; //true</code></pre>
</blockquote>
<h2 id="2-2-js에서-상속-구현하기">2-2. JS에서 상속 구현하기</h2>
<h3 id="1-__proto__에-prototype대입-상속이-아님">1) <code>.__proto__</code>에 <code>.prototype</code>대입: 상속이 아님</h3>
<pre><code class="language-js">var Human = function(name) {
    this.name = name;
}
Human.prototype.sleep = function() {
    console.log(&#39;zzz&#39;);
}

var Student = function() {}
Student.prototype.learn = function() {
    console.log(&#39;배우는 중...&#39;);
}

var student1 = new Student();
student1.__proto__ = Human.prototype; //Error는 안생기지만 이렇게 쓰지 않는 것이 좋다.</code></pre>
<p><code>__proto__</code>프로퍼티는 참조의 용도로만 사용해야 한다. (변형하지 않아야 함)</p>
<p>그리고 위와 같이 쓰면 <code>student1</code>변수 하나만의 prototype만 변하는 것이기 때문에 <code>Student</code>에 <strong>할당한 것이 아니다</strong>.</p>
<h3 id="2-prototype에--prototype-대입-상속이-아님">2) <code>.prototype</code>에  <code>.prototype</code> 대입: 상속이 아님</h3>
<pre><code class="language-js">var Human = function(name) {
    this.name = name;
}
Human.prototype.sleep = function() {
    console.log(&#39;zzz&#39;);
}

var Student = function() {}
Student.prototype.learn = function() {
    console.log(&#39;배우는 중...&#39;);
}


var student1 = new Student();</code></pre>
<p>위와 같이 쓰는건 MyArray.prototype이 Array.prototype을 참조하는것이 되어버려서 <strong>할당이 아니다</strong>.</p>
<h3 id="3objectcreate사용">3)<code>Object.create()</code>사용</h3>
<pre><code class="language-js">var Human = function(name) {
    this.name = name;
}
Human.prototype.sleep = function() {
    console.log(&#39;zzz&#39;);
}

var Student = function(name) {
    Human.call(this, name); //혹은 apply 사용
    //현재 Student의 prototype에 constructor가 없는 상태이다.
    //그렇기 때문에 Human의 constructor를 받아와야 한다.
    //Human의 constructor는 Student의 상태를 모르기 때문에 call이나 apply를 사용해서 현재의 this를 넣어줘야 한다.
}

Student.prototype = Object.create(Human.prototype);
Student.prototype.constructor = Student;
Student.prototype.learn = function() {
    console.log(&#39;배우는 중...&#39;);
}

var student1 = new Student(&#39;first&#39;);
student1.learn(); //배우는 중...
student1.sleep(); //zzz</code></pre>
<hr>
<h1 id="참고">참고</h1>
<blockquote>
<p>CodeStates Immersive Course</p>
<p>YOU DON&#39;T KNOW JS(this와 객체 프로토타입, 비동기와 성능) - 카일 심슨 [한빛미디어]</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191120(수) 2. Start Inheritance patterns]]></title>
            <link>https://velog.io/@rami_tae/2019-11-21-0011-%EC%9E%91%EC%84%B1%EB%90%A8-n4k37fx9vv</link>
            <guid>https://velog.io/@rami_tae/2019-11-21-0011-%EC%9E%91%EC%84%B1%EB%90%A8-n4k37fx9vv</guid>
            <pubDate>Wed, 20 Nov 2019 15:28:21 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-start-inheritance-patterns">[CODESTATES im16] Start Inheritance patterns</h1>
<h1 id="1-prototype">1. Prototype</h1>
<p>자바스크립트는 Java, C++과 같은 클래스 기반 객체지향 프로그램이 아니고 프로토타입기반의 객체지향 언어이기 때문에 프로토타입이 매우 중요하다.</p>
<p>ES5까지는 class가 없었음. &gt; class구현을 위해 sudo-classical 등장</p>
<p>ES6부터 calss를 지원하기는 하지만 모양만 class같은것 뿐이지 다른 언어의 class들과는 작동 방식이 다르다.(JS는 prototype기반의 언어이기 때문에!)</p>
<hr>
<ul>
<li>자바스크립트의 모든 객체는 [[Prototype]]이라는 인터널 슬롯(internal slot)를 가진다. [Prototype]]의 값은 null 또는 객체이며 상속을 구현하는데 사용된다. [[Prototype]] 객체의 데이터 프로퍼티는 get 액세스를 위해 상속되어 자식 객체의 프로퍼티처럼 사용할 수 있다. 하지만 set 액세스는 허용되지 않는다.</li>
<li>[[Prototype]]의 값은 Prototype(프로토타입) 객체이며 <a href="https://tc39.github.io/ecma262/#sec-object.prototype.__proto__"><code>__proto__</code></a> accessor property로 접근할 수 있다. <code>__proto__</code> 프로퍼티에 접근하면 내부적으로 <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf">Object.getPrototypeOf</a>가 호출되어 프로토타입 객체를 반환한다.</li>
</ul>
<h2 id="1-2-prototype-vs-prototype-프로퍼티">1-2. [[Prototype]] vs prototype 프로퍼티</h2>
<p>prototype 프로퍼티는 프로토타입 객체를 가리키는 [[Prototype]] 인터널 슬롯은 다르다. prototype 프로퍼티와 [[Prototype]]은 모두 프로토타입 객체를 가리키지만 관점의 차이가 있다.</p>
<ul>
<li>[[Prototype]]<ul>
<li>함수를 포함한 모든 객체가 가지고 있는 인터널 슬롯</li>
<li><code>__proto__</code>로 접근이 가능하며 객체의 입장에서 자신의 부모 역할을 하는 프로토타입 객체를 가리키며 함수 객체의 경우 <code>Function.prototype</code>를 가리킨다.</li>
</ul>
</li>
<li>prototype 프로퍼티<ul>
<li>함수 객체만 가지고 있는 프로퍼티이다.</li>
<li>함수 객체가 생성자로 사용될 때 이 함수를 통해 생성될 객체의 부모 역할을 하는 객체(프로토타입 객체)를 가리킨다.</li>
</ul>
</li>
</ul>
<h1 id="2-constructor-프로퍼티">2. constructor 프로퍼티</h1>
<p>프로토타입 객체는 constructor 프로퍼티를 갖는다. 인스턴스의 프로토타입을 만든 <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object"><code>Object</code></a> 함수의 참조를 반환한다.</p>
<p><img src="https://images.velog.io/post-images/rami_tae/3d51d360-0baa-11ea-b3c1-2181edd472e0/20-2.-constructor.png" alt="20-2. constructor.png"></p>
<hr>
<h1 id="참고">참고</h1>
<blockquote>
<p>YOU DON&#39;T KNOW JS(this와 객체 프로토타입, 비동기와 성능) - 카일 심슨 [한빛미디어]</p>
<p><a href="https://poiemaweb.com/js-prototype">[Poiemaweb] 프로토타입</a></p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor">[MDN] Object.prototype.constructor</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191120(수) 1. Solution9-10, ES6기능]]></title>
            <link>https://velog.io/@rami_tae/191120%EC%88%98-1.-Solution9-10-ES6%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@rami_tae/191120%EC%88%98-1.-Solution9-10-ES6%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Wed, 20 Nov 2019 15:26:30 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-solution9-10-es6-기능">[CODESTATES im16] Solution9-10, ES6 기능</h1>
<h1 id="1-solution9-10">1. Solution9-10</h1>
<h2 id="1-1-deep-copy--shallow-copy">1-1. Deep copy &amp; Shallow copy</h2>
<h3 id="1-deep-copy">1) Deep copy</h3>
<ul>
<li>원시 타입(primitive type)</li>
<li><strong>String, Boolean, Number</strong> 등 구조가 비교적 단순한 타입</li>
<li>복사가 일어날 때 독립적이고 새로운 메모리 공간을 확보하여 값을 저장.</li>
</ul>
<h3 id="2-shallow-copy">2) Shallow copy</h3>
<p>참조타입이 독립적인 값을 저장하지 않는 이유: 비효율을 방지하기 위해서</p>
<ul>
<li>참조 타입(reference type)</li>
<li><strong>Object, Array, Function</strong> 등 구조가 비교적 복잡한 타입</li>
<li>복사가 일어날 때, 메모리 어딘가에 객체 그 자체가 아닌 객체의 <strong>위치 값</strong>을 저장</li>
</ul>
<h1 id="2-es6-기능개인적으로-알아봄">2. ES6 기능(개인적으로 알아봄)</h1>
<h2 id="2-1-es6-추가된-원시타입-symbol">2-1. ES6: 추가된 원시타입 <code>symbol</code></h2>
<blockquote>
<p><a href="https://poiemaweb.com/es6-symbol">[Poiemaweb] 7번째 타입 심볼(symbol)</a></p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol">[MDN] Symbol</a></p>
</blockquote>
<p>변경 불가능한 원시 타입!</p>
<p>주로 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키(property key)를 만들기 위해 사용함.</p>
<h2 id="2-2-es6-계산된-프로퍼티명computed-property-names">2-2. ES6: 계산된 프로퍼티명(Computed Property Names)</h2>
<blockquote>
<p>YOU DON&#39;T KONW JS (this와 객체 프로토타입, 비동기와 성능) - 카일 심슨 [한빛미디어] 70p</p>
</blockquote>
<p>ES6부터 계산된 프로퍼티명(Computed Property Names)이라는 기능이 추가되었으며 Symbol에서 많이 사용할 수 있을 것!</p>
<pre><code class="language-js">var prefix = &quot;foo&quot;;
var myObject = {
    //prefix + &quot;bar&quot;: &quot;hello&quot;,
    //위와 같이 사용하면 예상하지 못한 &#39;+&#39;라며 SyntaxError가 뜬다.
    [prefix + &quot;bar&quot;]: &quot;hello&quot;,
    //하지만 위와 같이 []로 계산식을 묶어주면 Error가 뜨지 않는다!!!
    [prefix + &quot;baz&quot;]: &quot;world&quot;
};

myObject[&quot;foobar&quot;]; //hello
myObject[&quot;foobaz&quot;]; //world</code></pre>
<p>이제 object의 key값을 넣을 때 에도 계산을 할 수 있다!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191119(화) TIL-2. Check Point 9-10]]></title>
            <link>https://velog.io/@rami_tae/191119%ED%99%94-TIL-2.-Check-Point-9-10-54k35w9tw8</link>
            <guid>https://velog.io/@rami_tae/191119%ED%99%94-TIL-2.-Check-Point-9-10-54k35w9tw8</guid>
            <pubDate>Tue, 19 Nov 2019 13:30:11 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-check-point-9-10">[CODESTATES im16] Check Point 9-10</h1>
<h1 id="1-checkpoint-9">1. Checkpoint 9</h1>
<h2 id="q7-after-the-following-code-runs-what-will-be-the-value-of-myarray">Q7. After the following code runs, what will be the value of myArray?</h2>
<pre><code class="language-js">var myArray = [2, 3, 4, 5];
function doStuff(arr) {
  arr = [ ];
}

doStuff(myArray);</code></pre>
<p>예상: []</p>
<p>정답: [2, 3, 4, 5]</p>
<p><img src="https://images.velog.io/post-images/rami_tae/9b418860-0ad0-11ea-a8ce-ef03b25ab2dc/19-2.-9-Q7.png" alt="19-2. 9-Q7.png"></p>
<h2 id="q9-after-the-following-code-runs-what-will-be-the-value-of-player">Q9. After the following code runs, what will be the value of player?</h2>
<pre><code class="language-js">var player = { score: 3 };

function doStuff(obj) {
  obj = {};
}

player = doStuff(player);</code></pre>
<p>예상: {score:3}</p>
<p>정답: undefined</p>
<blockquote>
<p>Q8은 []로 안바꼈으면서 Q9는 왜 undefined인지 모르겠다.</p>
<p>왜냐?? object는 array와는 다르냐????? array도 object기반인데 왜?</p>
<hr>
<p><strong>191120(수) 추가</strong>
doStuff의 return값이 명시되어 있지 않기 때문에 <code>undefined</code>가 return된다.
그래서 위 코드를 거치게 되면 player의 값이 <code>undefined</code>가 됨.</p>
</blockquote>
<h2 id="q10-after-the-following-code-runs-what-will-be-the-value-of-example">Q10. After the following code runs, what will be the value of example?</h2>
<pre><code class="language-js">var obj = { 
  inner: { x: 10 }
};
var example = obj.inner;
obj.inner   = undefined;</code></pre>
<p>예상, 정답: { x: 10 }</p>
<p><img src="https://images.velog.io/post-images/rami_tae/a126c790-0ad0-11ea-afb5-17be3a4c91ce/19-2.-9-Q10.png" alt="19-2. 9-Q10.png"></p>
<hr>
<h1 id="2-checkpoint-10">2. Checkpoint 10</h1>
<h2 id="q1--after-the-following-code-runs-what-will-be-the-value-of-result">Q1.  After the following code runs, what will be the value of result?</h2>
<pre><code class="language-js">var x = 10;

function f () {
  x = x + 1;
  return x;
}

function add (x, y) { return x + y; }

var result = add(x, f());</code></pre>
<p>예상, 정답: 21</p>
<p><img src="https://images.velog.io/post-images/rami_tae/a57f9a60-0ad0-11ea-afb5-17be3a4c91ce/19-2.-10-Q1.png" alt="19-2. 10-Q1.png"></p>
<h2 id="q4-after-the-following-code-runs-what-will-be-the-value-of-result">Q4. After the following code runs, what will be the value of result?</h2>
<pre><code class="language-js">var x = 10;

function f () {
  x = x + 1;
  return x;
}

var obj = {
  func: f,
  g: f(),
  h: x,
};

obj.func();
var result = obj.g;</code></pre>
<p>예상: 12</p>
<p>정답: 11</p>
<p><img src="https://images.velog.io/post-images/rami_tae/a884c410-0ad0-11ea-afb5-17be3a4c91ce/19-2.-10-Q4.png" alt="19-2. 10-Q4.png"></p>
<h2 id="q8-after-the-following-code-runs-what-will-be-the-value-of-result">Q8. After the following code runs, what will be the value of result?</h2>
<pre><code class="language-js">var x = 10;

var obj = {
  y: x,
  z: obj.y + 1
};

var result = obj.z;</code></pre>
<p>예상: 11</p>
<p>정답: Throws an error</p>
<p><img src="https://images.velog.io/post-images/rami_tae/ada3f420-0ad0-11ea-afb5-17be3a4c91ce/19-2.-10-Q8.png" alt="19-2. 10-Q8.png"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191119(화) TIL-1. Time Complexity 2]]></title>
            <link>https://velog.io/@rami_tae/191119%ED%99%94-TIL-1.-Time-Complexity-2-v4k35vax8h</link>
            <guid>https://velog.io/@rami_tae/191119%ED%99%94-TIL-1.-Time-Complexity-2-v4k35vax8h</guid>
            <pubDate>Tue, 19 Nov 2019 13:02:40 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-time-complexity-2">[CODESTATES im16] Time Complexity 2</h1>
<h1 id="1-time-complexity-2">1. Time Complexity 2</h1>
<h2 id="1-1-o1-constant-time">1-1. O(1): constant time</h2>
<p>입력데이터의 크기와 상관 없이 언제나 일정한 시간이 걸리는 알고리즘</p>
<pre><code class="language-js">F(n) {
    return (n[0] === 0) ? true : false;
}</code></pre>
<h2 id="1-2-on-linear-time">1-2. O(n): linear time</h2>
<p>입력데이터의 크기와 비례해서 시간이 증가하는 알고리즘</p>
<pre><code class="language-js">function F(n) {
    for (let i = 0; i &lt; n.length; i++) {
        conosole.log(i);
    }
}</code></pre>
<h2 id="1-3-on2-quadratic-time">1-3. O(n^2): quadratic time</h2>
<pre><code class="language-js">function F(n) {
    for (let i = 0; i &lt; n.length; i++) {
        for (let j = 0; j &lt; n.length; j++) {
            console.log(i + j);
        }
    }
}</code></pre>
<p><img src="https://images.velog.io/post-images/rami_tae/d0871020-0acc-11ea-a8ce-ef03b25ab2dc/19-1.-On2.png" alt="19-1. O(n^2).png"></p>
<h2 id="1-4-onm">1-4. O(nm)</h2>
<pre><code class="language-js">function F(n, m) {
    for (let i = 0; i &lt; n.length; i++) {
        for (let j = 0; j &lt; m.length; j++) {
            console.log(i + j);
        }
    }
}</code></pre>
<p><img src="https://images.velog.io/post-images/rami_tae/d415dc30-0acc-11ea-bcdf-290e699fb861/19-1.-Onm.png" alt="19-1. O(nm).png"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191118(월) TIL-2. Time Complexity]]></title>
            <link>https://velog.io/@rami_tae/191118%EC%9B%94-TIL-2.-Time-Complexity-qyk34ffacc</link>
            <guid>https://velog.io/@rami_tae/191118%EC%9B%94-TIL-2.-Time-Complexity-qyk34ffacc</guid>
            <pubDate>Mon, 18 Nov 2019 12:50:45 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-time-complexity">[CODESTATES im16] Time Complexity</h1>
<p><strong>Compleity Analysis</strong></p>
<p>알고리즘을 실행하는 것에 있어 시간과 공간을 얼마나 차지하는지 나타내는 지표</p>
<p>시간과 공간의 복잡도: 그 알고리즘의 효율을 나타냄</p>
<h1 id="1-시간복잡도">1. 시간복잡도</h1>
<p><img src="https://images.velog.io/post-images/rami_tae/ef2beda0-0a01-11ea-802f-db3e08f4c6c6/18-1.-%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84.png" alt="18-1. 시간복잡도.png"></p>
<p>&lt;- 효율적  ------------------------------------------------  비효율적 -&gt;</p>
<p>시간복잡도를 알 수 있으면 알고리즘의 실행시간이 얼마나 걸릴지 예상해 볼 수 있다.</p>
<h1 id="2-자료구조별-시간복잡도">2. 자료구조별 시간복잡도</h1>
<p>해시테이블 추가: O(1)</p>
<p>Binary Search: O(log n)</p>
<p>Linked List: O(n)</p>
<p>재귀함수: O(c^n)</p>
<h2 id="2-1-array">2-1. Array</h2>
<p>메모리가 정해져있는 배열이라고 가정함.(JS는 아님)</p>
<ul>
<li>Lookup (position): 정해져 있는 자리에 저장되어 있는 데이터를 바로 불러오는 것이기 때문에 O(1)</li>
<li>Assign: Lookup과 마찬가지로 정해져 있는 자리에 있는 값을 변경하면 되는 것이기 때문에 O(1)</li>
<li>Insert: insert하고 싶은 자리에 insert를 하기 전에 그 자리의 index와 같거나 큰 index를 가진 값들은 다 뒤로 한 칸 씩 물러나야 하기 때문에 O(n)</li>
<li>Remove: Insert와 비슷하게 삭제하고 싶은 자리의 데이터를 삭제하고 그 자리의 index보다 큰 값을 가진 index의 데이터들을 다 한 칸씩 앞으로 당겨야 하기 때문에 O(1)</li>
<li>Find(value): 처음부터 원하는 값을 찾을 때 까지 하나씩 비교해나가야 하기 때문에 O(n)</li>
</ul>
<h2 id="2-2-linked-list">2-2. Linked List</h2>
<ul>
<li><p>Lookup: 바로 접근을 하지 못하기 때문에 헤드에서부터 원하는 수만큼 next를 타고 들어가야 한다. 그래서 O(n)</p>
</li>
<li><p>Find, Assign: Lookup과 같이 원하는 값을 찾을 때 까지 next를 타고 찾아야 하기 때문에 O(n)</p>
</li>
<li><p>Insert (추가하고 싶은 자리의 앞에 해당하는 node의 주소를 알고 있을 경우)</p>
<p>​    : 바로 추가할 수 있기 때문에 O(1)</p>
</li>
<li><p>Remove</p>
<ul>
<li>head, tail:  가장 앞, 뒤의 node를 지워버리면 되기 때문에 O(1)</li>
<li>middle: 지우고자 하는 node의 바로 앞에 있는 node를 알 수 없기 때문에 그 node는 head에서부터 찾아나가야 한다. &gt; O(n)</li>
</ul>
</li>
</ul>
<h3 id="1-doubly-linked-lists">1) Doubly-Linked Lists</h3>
<p>node가 next node를 가리키는것 뿐만 아니라 pre node도 가리킴.</p>
<ul>
<li>Lookup, Find, Assign: O(n)</li>
<li>Insert: O(1)</li>
<li>Remove: 지우고자 하는 node의 다음node뿐만 아니라 이전node까지 알 수 있기 때문에 Insert와 같이 O(1)</li>
</ul>
<h2 id="2-3-tree">2-3. Tree</h2>
<h3 id="1-basic-tree">1) Basic Tree</h3>
<ul>
<li>find: 일반 tree의 경우 모든 child를 찾아야 하기 때문에 O(n)의 시간복잡도를 가진다.</li>
</ul>
<h3 id="2-binary-search-tree">2) Binary Search Tree</h3>
<ul>
<li><p>find:</p>
<ul>
<li>입력 데이터의 분포가 고른 편이다: <ul>
<li>모든 노드가 일정한 규칙을 가지고 데이터가 저장되기 때문에 <strong>O(log n)</strong></li>
</ul>
</li>
<li>입력 데이터의 분포가 고르지 않다:<ul>
<li>root보다 작은 수의 값만 입력될 경우 linked list와 다를 것이 없기 때문에 <strong>O(n)</strong></li>
</ul>
</li>
<li>해결 방법<ul>
<li>추가할 때 마다 밸런스를 확인하고 그걸 맞춰가면 <strong>O(log n)</strong></li>
<li>이진트리 root깊이가 2이상 차이가 날 경우 트리를 비틀어서 밸런스를 맞추면 됨.</li>
</ul>
</li>
</ul>
</li>
<li><p>array를 사용하지 않고 BST를 사용할 경우 그 이유는?</p>
<ul>
<li>array는 메모리에서 연속적인 블락을 차지</li>
<li>BST의 경우 구성 시 Linked List를 쓰기도 하는 등 메모리 사용을 효율적으로 할 수 있음.</li>
</ul>
</li>
</ul>
<h2 id="2-4-hash-table">2-4. Hash Table</h2>
<ul>
<li>추가: O(1) 해시 테이블은 for나 while등의 루프를 도는 자료구조가 아니기 때문에 constante한 시간 복잡도를 가진다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[191118(월) TIL-1. Checkpoint5&6, Sprint Office Hour]]></title>
            <link>https://velog.io/@rami_tae/191118%EC%9B%94-TIL-1.-Checkpoint56-Sprint-Office-Hour</link>
            <guid>https://velog.io/@rami_tae/191118%EC%9B%94-TIL-1.-Checkpoint56-Sprint-Office-Hour</guid>
            <pubDate>Mon, 18 Nov 2019 12:49:20 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-checkpoint56-sprint-office-hour">[CODESTATES im16] Checkpoint5&amp;6, Sprint Office Hour</h1>
<h1 id="1-checkpoint-5--6">1. Checkpoint 5 &amp; 6</h1>
<h2 id="1-1bind">1-1.<code>bind()</code></h2>
<p><code>call()</code>, <code>apply()</code>와 <code>bind()</code>의 차이.</p>
<p>=&gt; <code>bind()</code>는 함수를 실행하지 않고 <code>this</code> 바인딩만 한 뒤, 함수를 반환한다. : <strong>함수를 실행하지 않음!</strong></p>
<p>바인드에도 우선순위가 있나요? =&gt; 예, 있습니다. 레퍼런스로 올리겠음.</p>
<blockquote>
<p><a href="http://jeonghwan-kim.github.io/2017/10/22/js-context-binding.html">JS this 바인딩 우선순위</a></p>
</blockquote>
<h2 id="1-2-5-q9">1-2. 5-Q9</h2>
<pre><code class="language-js">var name = &quot;Window&quot;;
var alice = {
  name: &quot;Alice&quot;,
  sayHi: function() {
    alert(this.name + &quot; says hi&quot;);
  }
};
var bob = { name: &quot;Bob&quot; };


alice.sayHi.bind(bob);

setTimeout(alice.sayHi(), 1000);</code></pre>
<blockquote>
<p><code>bind()</code>는 일시적이다.</p>
</blockquote>
<h2 id="1-3-비동기와-동기함수의-차이">1-3. 비동기와 동기함수의 차이</h2>
<p><code>setTimeout</code>은 비동기 함수: 백그라운드에서 기다리다가 콜백함수를 실행</p>
<p><code>Callback Queue</code>는 <code>Call Stack</code>이 비워진 후 실행된다.</p>
<blockquote>
<p><a href="https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/">자바스크립트 비동기 처리와 콜백 함수</a></p>
</blockquote>
<hr>
<h1 id="2-sprint-office-hour">2. Sprint Office Hour</h1>
<p>알아보기: 참조타입, 원시타입 비교</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191117(일) TIL-1. Pseudo Code(Data Structure)]]></title>
            <link>https://velog.io/@rami_tae/191117%EC%9D%BC-1.-Pseudo-CodeData-Structure-vfk334hyeo</link>
            <guid>https://velog.io/@rami_tae/191117%EC%9D%BC-1.-Pseudo-CodeData-Structure-vfk334hyeo</guid>
            <pubDate>Sun, 17 Nov 2019 14:56:54 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-data-structures-pseudo-code">[CODESTATES im16] Data Structure&#39;s Pseudo Code</h1>
<h1 id="1-linked-list">1. Linked List</h1>
<p><img src="https://images.velog.io/post-images/rami_tae/6c519fe0-094a-11ea-a5cd-753c060559cc/17-1.-LinkedList.png" alt="17-1. LinkedList.png"></p>
<blockquote>
<p><strong>191119(화) 추가</strong>
removeHead에서 다른 곳에서 참조하는 것이 없는 node는 GC(Garbage Collector)가 처리해 준다.</p>
</blockquote>
<h1 id="2-tree">2. Tree</h1>
<ul>
<li><p><code>Tree</code> 클래스</p>
<ul>
<li><code>node</code> : 데이터 저장</li>
<li><code>child</code> : array</li>
</ul>
</li>
<li><p><code>.addChild(value)</code> : tree에 값이 <code>value</code> 인 자식 <code>node</code> 추가.</p>
<ol>
<li>값이 <code>value</code> 인 새로운 <code>Tree</code> 생성.</li>
<li><code>this.child</code>에 새 <code>Tree</code>를  <code>push</code>.</li>
</ol>
</li>
<li><p><code>contains(target)</code> : <code>target</code>이 tree에 존재하는지 확인.</p>
</li>
</ul>
<p>타이핑하다가 손으로 하는 게 더 빠를 것 같아 손으로 썼음.</p>
<p><img src="https://images.velog.io/post-images/rami_tae/71a39fc0-094a-11ea-9aae-a58a86bb0520/17-1.-Tree.png" alt="17-1. Tree.png"></p>
<blockquote>
<p><strong>191118(월) 추가</strong>
constains함수의 child탐색의 경우
2.의 2)부분을 저렇게 하면 안된다.
저걸 쓸 때는 이상한걸 못느꼈는데 코드를 짜려고 보니 말도 안돼서 그부분은 갈아엎었다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191115~16(금, 토) TIL-1. Advanced Data Structure]]></title>
            <link>https://velog.io/@rami_tae/19111516%EA%B8%88-%ED%86%A0-1.-Advanced-Data-Structure-ktk31n9q85</link>
            <guid>https://velog.io/@rami_tae/19111516%EA%B8%88-%ED%86%A0-1.-Advanced-Data-Structure-ktk31n9q85</guid>
            <pubDate>Sat, 16 Nov 2019 14:08:56 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-advanced-data-structure">[CODESTATES im16] Advanced Data Structure</h1>
<h1 id="1-linked-list">1. Linked List</h1>
<p><img src="https://images.velog.io/post-images/rami_tae/43b18080-087a-11ea-938a-4d31de06455c/linked-list.png" alt="linked list.png"></p>
<ul>
<li><p><code>node</code>: 데이터와 다음 링크를 저장하는 변수를 저장하는 <code>object</code> 를 뜻함</p>
</li>
<li><p><code>head</code>: 첫번째 노드를 가리키는 변수</p>
</li>
<li><p><code>tail</code>: 마지막 노드</p>
</li>
<li><p><code>insert()</code>: 리스트에 데이터를 저장</p>
<ul>
<li>원하는 위치에 데이터를 저장할 수 있다.</li>
</ul>
</li>
<li><p><code>remove()</code>: 리스트의 데이터를 삭제</p>
<ul>
<li>원하는 위치에 있는 데이터를 삭제할 수 있다.</li>
</ul>
</li>
</ul>
<hr>
<h1 id="2-graph">2. Graph</h1>
<ul>
<li>Alice, Bell, Chris와 같은 사람들(파란 원): <strong>정점(vertex), node</strong></li>
<li>사람들 사이의 연락망(빨간 선): <strong>간선(edge)</strong></li>
</ul>
<p><em>무방향 그래프: 간선의 방향이 없는 그래프</em></p>
<p><img src="https://images.velog.io/post-images/rami_tae/46b857e0-087a-11ea-aed1-a58f1cf19f2d/graph.png" alt="graph.png"></p>
<ul>
<li>Bell이 Finn에게 연락할 수 있는 방법<ol>
<li>Bell - Chris - Dominic - Eli - Finn</li>
<li>Bell - Chris - Eli - Finn</li>
<li>Bell - Alice - Dominic - Eli - Finn</li>
<li>Bell - Alice - Dominic - Chris - Eli - Finn</li>
</ol>
</li>
</ul>
<p><em>방향 그래프: 간선의 방향이 있는 그래프</em></p>
<p><img src="https://images.velog.io/post-images/rami_tae/4af00e20-087a-11ea-938a-4d31de06455c/directed-graph.png" alt="directed graph.png"></p>
<ul>
<li>Bell이 Finn에게 연락할 수 있는 방법<ol>
<li>Bell - Chris - Eli - Finn</li>
<li>Bell - Alice - Dominic - Chris - Eli - Finn</li>
</ol>
</li>
</ul>
<blockquote>
<p><strong>방향그래프가 무방향그래프보다 구현이 더 간단하다.</strong></p>
<ul>
<li>무방향그래프는 방향이 지정되어있지 않기 때문에 양방향의 edge의 정보를 모두 저장해줘야 한다.</li>
</ul>
</blockquote>
<ul>
<li><code>node</code>: { Alice, Bell, Chris, Dominic, Eli, Finn } 총 6개의 node</li>
<li><code>edge</code>: { &lt;Alice, Bell&gt;, &lt;Alice, Dominic&gt;, &lt;Bell, Chris&gt;, &lt;Chris, Dominic&gt;, &lt;Chris, Eli&gt;, &lt;Dominic, Eli&gt;, &lt;Eli, Finn&gt; } 총 7개의 edge</li>
<li><code>Graph</code>: 그래프</li>
<li><code>node</code>와 관련된 method<ul>
<li><code>addNode()</code>: 그래프에 노드 추가</li>
<li><code>contains()</code>: 그래프의 노드에 전달인자가 존재하는지 확인</li>
<li><code>removeNode()</code>: 노드 삭제</li>
</ul>
</li>
<li><code>edge</code>와 관련된 method<ul>
<li><code>addEdge()</code>: 그래프에 edge추가</li>
<li><code>hasEdge()</code>: 그래프의 노드에 전달인자와 같은 edge가 있는지 확인</li>
<li><code>removeEdge()</code>: edge 삭제</li>
</ul>
</li>
</ul>
<hr>
<h1 id="3-tree">3. Tree</h1>
<p><strong>계층적 관계(Hierarchical Relationship)를 표현하는 자료구조</strong></p>
<p><img src="https://images.velog.io/post-images/rami_tae/51546860-087a-11ea-aed1-a58f1cf19f2d/tree.png" alt="tree.png"></p>
<p>그래프의 종류 중 하나. <em>node의 수 = edge의 수 + 1</em> 의 특징을 갖는 그래프이며 가지를 늘려가며 뻗어나기기 때문에 Tree 라는 이름이 붙었다.</p>
<blockquote>
<p>HTML의 DOM이 대표적인 tree구조이다!</p>
</blockquote>
<p>위 그림에서 A는 B, C, D라는 자식을 가지고 있다.</p>
<p>마찬가지로 B는 E, F를 C는 G를 D는 H, I, J를 자식으로 가지고 있다.</p>
<p>이렇게 보면 js Object의 prototype과 비슷한 것 같다는 생각이 든다.</p>
<ul>
<li><code>root node</code>(최상위 노드): 트리 구조에서 최상위에 존재하는 노드.<ul>
<li>위 그림에서는 A</li>
</ul>
</li>
<li><code>terminal node</code>(단말 노드) or <code>leaf node</code>(잎사귀 노드): 아래로 다른 노드가 연결되어 있지 않은 노드.<ul>
<li>위 그림에서는 E, F, G, H, I, J</li>
</ul>
</li>
<li><code>internal node</code>(내부 노드): 단말 노드를 제외한 모든 노드.<ul>
<li>위 그림에서는 B, C, D</li>
</ul>
</li>
</ul>
<ul>
<li><code>tree</code>클래스: <code>node</code>(데이터)와 <code>child</code>들을 저장할 Object가 필요하다.</li>
<li><code>addChild()</code>: tree에 자식<code>node</code>추가.</li>
<li><code>contains()</code>: 전달인자가 tree에 존재하는지 확인.</li>
</ul>
<hr>
<h1 id="4-binary-search-tree">4. Binary Search Tree</h1>
<h2 id="4-1--binary-tree이진-트리">4-1.  Binary Tree(이진 트리)</h2>
<ul>
<li>루트 노드를 중심으로 두 개의 서브트리로 나눠진다.</li>
<li>나눠진 두 서브 트리도 모두 이진 트리여야 한다.</li>
</ul>
<p>트리는 <code>level</code>, <code>height</code>, <code>Sub Tree</code>(서브 트리)를 가지고 있다.</p>
<ul>
<li><code>level</code>: 트리의 깊이. root의 <code>level</code>은 0이다.</li>
<li><code>height</code>: 트리의 높이. 트리의 <code>level</code>이 0부터 시작하기 때문에 <code>height</code>와 트리의 최대 <code>level</code>은 같다.</li>
<li><code>Sub Tree</code>: 큰 트리에 속하는 작은 트리</li>
</ul>
<p><em>Binary Tree(이진 트리)</em></p>
<p><img src="https://images.velog.io/post-images/rami_tae/58e50da0-087a-11ea-938a-4d31de06455c/BinaryTree-0.png" alt="BinaryTree-0.png"></p>
<p>위와 같은 트리도 이진 트리다.</p>
<blockquote>
<p>노드가 위치할 수 있는 곳에 노드가 존재하지 않는다면, 공집합(empty set) 노드가 존재하는 것으로 간주하기 때문!</p>
</blockquote>
<p><em>Full Binary Tree(포화 이진 트리)</em></p>
<p><img src="https://images.velog.io/post-images/rami_tae/5ac454f0-087a-11ea-8d4b-110a8a114eee/BinaryTree-1.png" alt="BinaryTree-1.png"></p>
<p><strong>Full Binary Tree(포화 이진 트리)</strong></p>
<ul>
<li>모든 레벨이 가득 차 있는 트리를 포화 이진 트리라고 한다.</li>
</ul>
<p><em>Complete Binary Tree(완전 이진 트리)</em></p>
<p><img src="https://images.velog.io/post-images/rami_tae/5d338030-087a-11ea-b502-33f596f4a7a7/BinaryTree-2.png" alt="BinaryTree-2.png"></p>
<p><strong>Complete Binary Tree(완전 이진 트리)</strong></p>
<ul>
<li>포화 이진 트리처럼 모든 레벨이 꽉 찬 상태는 아니지만, 빈 틈 없이 노드가 채워진 이진 트리.</li>
</ul>
<h2 id="4-2-binary-search-tree이진-탐색-트리">4-2. Binary Search Tree(이진 탐색 트리)</h2>
<p><img src="https://images.velog.io/post-images/rami_tae/61748540-087a-11ea-938a-4d31de06455c/BinarySearchTree.png" alt="BinarySearchTree.png"></p>
<p>이진 탐색 트리는 이진 트리와는 조금 다르다.</p>
<p>모양은 같지만 이진 트리와는 달리 데이터 삽입 시 전처리 과정을 거친다.</p>
<ul>
<li>이진 탐색 트리는 <code>root node</code> 기준으로 그보다 작은 수는 <code>left</code>에, 큰 수는 <code>right</code>에 저장된다. <em>편의상 <code>root node</code>를 <code>root</code>라고 하겠다.</em><ul>
<li>위의 그림에서 &#39;9&#39;의 경우를 살펴보자.<ul>
<li><code>root</code>의 값은 10이다. &#39;9&#39;는 &#39;10&#39;보다 작기 때문에 <code>left</code>에 저장되기 위해 <code>root.left</code>를 살펴본다.</li>
<li>하지만 <code>root.left</code>에는 &#39;8&#39;이라는 노드가 이미 존재한다. 그러므로 &#39;8&#39;과 &#39;9&#39;를 비교한다. &#39;9&#39;는 &#39;8&#39;보다 크기 때문에 &#39;8&#39;에 해당하는 노드의 <code>right</code>에 저장된다.</li>
<li><code>root.left.right</code>에 &#39;9&#39;가 저장된다.</li>
</ul>
</li>
<li>&#39;4&#39;의 경우를 살펴보자.<ul>
<li><code>root</code>의 값 &#39;10&#39;. &#39;4&#39; &lt; &#39;10&#39; =&gt; <code>left</code>를 향한다.</li>
<li><code>root.left</code>에 노드 존재. <code>root.left</code>와 &#39;4&#39;를 비교한다. &#39;4&#39; &lt; &#39;8&#39; =&gt; <code>root.left</code>의 <code>left</code>로!</li>
<li>이럴수가 <code>root.left.left</code>에도 노드가 있다! 당황하지 말고 다시 해당 노드와 &#39;4&#39;를 비교해 보자. &#39;4&#39; &gt; &#39;3&#39; =&gt; <code>root.left.left</code>의 <code>right</code>로!</li>
<li><code>root.left.left.right</code>에 &#39;4&#39;가 저장된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><code>tree</code>클래스<ul>
<li><code>node</code>: 데이터</li>
<li><code>left</code>: <code>node</code>보다 작은 값을 저장할 object</li>
<li><code>fight</code>: <code>node</code>보다 큰 값을 저장할 object</li>
</ul>
</li>
<li><code>insert(value)</code>: <code>value</code>값을 저장한다. 저장 과정은 위를 참고.</li>
<li><code>contains(value)</code>: <code>value</code>값이 <code>tree</code>에 포함되어있는지 확인한다.</li>
<li><code>depthFirstLog()</code>: 깊이 우선 탐색(DFS)을 한 결과를 array형태로 출력한다.</li>
</ul>
<h2 id="4-3-dfsdepth-first-search">4-3. DFS(Depth First Search)</h2>
<p>DFS는 Depth First Search로 말 그대로 깊이 우선 탐색을 뜻한다.</p>
<p><img src="https://images.velog.io/post-images/rami_tae/69f5f320-087a-11ea-938a-4d31de06455c/DFS.png" alt="DFS.png"></p>
<p>이진트리에서는 노드에 적혀 있는 숫자의 오름차순으로 탐색 한다.</p>
<hr>
<h1 id="5-hash-table">5. Hash Table</h1>
<p><img src="https://images.velog.io/post-images/rami_tae/0fdf1c10-0913-11ea-bba5-27daf000bedd/HashTable.png" alt="HashTable.png"></p>
<p>Hash Table: 크기가 크거나 숫자가 아닌 데이터를 저장하기 좋은 데이터 구조.</p>
<p>key들(숫자가 아니어도 상관 없음)은 hash function을 거치면 특정한 숫자가 된다. 여기서 A키는 언제 어디서 hash function을 거치더라도 같은 숫자를 출력한다.</p>
<p>hash function을 거친 key의 특정 숫자를 저장소의 사이즈만큼 나머지 연산을 한 결과값에 해당하는 index에 데이터를 저장한다.</p>
<p>여기서 데이터는 linked list의 형식으로 저장된다.</p>
<ul>
<li><code>storage</code>: 크기가 변하지 않는 저장소이다. index마다 개별의 linked list가 존재한다.<ul>
<li>편의상 <code>storage</code>의 크기는 n이라고 하겠다.</li>
</ul>
</li>
<li><code>hash function(key)</code>: <code>key</code>값을 입력하면 hash 알고리즘의 결과를 출력한다. 출력값은 반드시 숫자형이어야 하며 같은 <code>key</code>값을 입력했을 때 출력값도 동일해야 한다.<ul>
<li>출력값이 골고루 나올수록 좋은 <code>hash function</code>이다.</li>
</ul>
</li>
<li><code>insert(key, value)</code>: <code>storage( hash function(key)%n )</code>에 <code>value</code>를 저장한다. (linked list 형식)</li>
<li><code>retrieve(key)</code>: <code>key</code>값을 기준으로 해당하는 <code>value</code>를 찾는다.</li>
<li><code>remove(key)</code>: <code>key</code>값을 기준으로 해당하는 <code>value</code>를 삭제한다.</li>
</ul>
<hr>
<h1 id="참고">참고</h1>
<blockquote>
<p>윤성우의 열혈 자료구조 - 윤성우 [ORANGE MEDIA]</p>
<p><a href="https://visualgo.net/ko">[VISUALGO]</a></p>
<p><a href="https://ko.khanacademy.org/computing/computer-science/algorithms/graph-representation/a/describing-graphs">[Khan Academy: 그래프 설명하기]</a></p>
<p><a href="https://youtu.be/Vi0hauJemxA">[자료구조 알고리즘] 해쉬테이블(Hash Table)에 대해 알아보고 구현하기 - 엔지니어대한민국(YouTube)</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191115(금) TIL-1. Check Point4]]></title>
            <link>https://velog.io/@rami_tae/191115%EA%B8%88-1.-Check-Point4</link>
            <guid>https://velog.io/@rami_tae/191115%EA%B8%88-1.-Check-Point4</guid>
            <pubDate>Sat, 16 Nov 2019 14:05:46 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-check-point4-문제풀이">[CODESTATES im16] Check Point4 문제풀이</h1>
<h1 id="q1-코드-실행-후-result-값">Q1. 코드 실행 후 result 값?</h1>
<pre><code class="language-js">var obj1 = { x: 10 };

var obj2 = Object.create(obj1);

var result = obj2.x;</code></pre>
<p>[ o ] 10</p>
<p>[  ] 20</p>
<p>[  ] 30</p>
<p>[  ] undefined</p>
<blockquote>
<pre><code class="language-js">console.log(obj1 === obj2.__proto__); //true</code></pre>
<p>Object.create(obj1); 의 리턴값은 <code>.__proto__</code>가 obj1을 가르키는 빈 객체</p>
</blockquote>
<h1 id="q6-코드-실행-후-result-값">Q6. 코드 실행 후 result 값?</h1>
<pre><code class="language-js">var obj1 = { x: 10 };

var obj2 = Object.create(obj1);

obj2.x += 10;
obj1.x = 15;

var result = obj2.x;</code></pre>
<p>[  ] 10</p>
<p>[ o ] 20</p>
<p>[  ] 25</p>
<p>[  ] 30</p>
<p>[  ] undefined</p>
<blockquote>
<p><code>obj2.x</code> += 10; 의 경우 <code>obj2.x</code> = <code>obj1.x</code> + 10 과 같기 때문에 이전까지 비어있던 <code>obj2</code>에 <code>obj2.x: 20</code>라는 속성이 생김</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191114(목) TIL-3. Basic Data Structure]]></title>
            <link>https://velog.io/@rami_tae/191114%EB%AA%A9-3.-Basic-Data-Structure-i2k31n66l0</link>
            <guid>https://velog.io/@rami_tae/191114%EB%AA%A9-3.-Basic-Data-Structure-i2k31n66l0</guid>
            <pubDate>Sat, 16 Nov 2019 14:04:17 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-basic-data-structure">[CODESTATES im16] Basic Data Structure</h1>
<h1 id="1-stack">1. Stack</h1>
<p><strong>상자를 쌓듯이, 먼저 들어간 것이 나중에 나온다. FILO(First-In, Last-Out)</strong></p>
<p>아래는 stack의 전반적인 진행을 그림으로 표현한 것이다.</p>
<p><img src="https://images.velog.io/post-images/rami_tae/e10ef3e0-0879-11ea-8eb3-a57280cb94c7/stack-1.png" alt="stack-1.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/e1969a70-0879-11ea-9c53-a7de0c1afb05/stack-2.png" alt="stack-2.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/e23af0c0-0879-11ea-8d4b-110a8a114eee/stack-3.png" alt="stack-3.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/e33b22b0-0879-11ea-9c53-a7de0c1afb05/stack-4.png" alt="stack-4.png"></p>
<hr>
<h2 id="1-1-property">1-1. Property</h2>
<ul>
<li><code>top</code>: 요소를 삽입/ 삭제하는 위치(index)</li>
<li><code>maxSize</code>: 저장소의 최대 크기</li>
<li><code>stackArray</code>: 저장소</li>
</ul>
<h2 id="1-2-method">1-2. Method</h2>
<ul>
<li><code>push()</code>: 새 요소를 마지막에 추가한다. 반환값 없음.</li>
<li><code>pop()</code>: 마지막 요소를 삭제한다. 삭제한 요소 출력.</li>
<li><code>empty()</code>: 저장소가 비어있는지 확인한다. 비어있으면 true, 아니면 false</li>
<li><code>size()</code>: 저장되어 있는 데이터가 몇 개 인지 반환한다.</li>
</ul>
<hr>
<h2 id="1-2-pseudo-code">1-2. Pseudo Code</h2>
<ul>
<li><p><code>top</code>은 0으로 초기화</p>
</li>
<li><p><code>push()</code></p>
<ol>
<li><code>stackArray</code>를 확인한다.<ol>
<li><code>stackArray</code>가 가득 차 있다 &gt; <code>Overflow</code>출력 후 method 나가기</li>
<li><code>stackArray</code>가 가득 차 있지 않다 &gt; 다음으로 진행</li>
</ol>
</li>
<li><code>top</code> 의 위치에 해당 요소를 삽입한다.</li>
<li><code>top</code>값을 1 증가시킨다.</li>
</ol>
</li>
<li><p><code>pop()</code></p>
<ol>
<li><code>stackArray</code>를 확인한다.<ol>
<li><code>stackArray</code>가 비어있다 &gt; <code>Underflow</code>출력 후 method 나가기</li>
<li><code>stackArray</code>가 비어있지 않다 &gt; 다음으로 진행</li>
</ol>
</li>
<li><code>top</code>의 위치에 있는 요소를 method 내부 변수에 저장하고 삭제한다.</li>
<li><code>top</code>값을 1 감소시킨다</li>
<li>삭제된 요소(method의 내부 변수에 저장했던 요소)를 반환 후 method를 나간다.</li>
</ol>
</li>
<li><p><code>empty()</code></p>
<ol>
<li><code>stackArray</code>의 0번째 index부터 <code>top</code>까지의 <code>for</code>문을 만든다<ol>
<li><code>stackArray(i)</code>가 존재하면 <code>false</code>를 반환한다.</li>
<li><code>for</code>문을 진행한다</li>
</ol>
</li>
<li><code>true</code>를 반환한다.</li>
</ol>
</li>
<li><p><code>size()</code></p>
<ul>
<li><code>empty()</code>와 유사하게 작성하면 된다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="--사용-예">- 사용 예</h2>
<ul>
<li>뒤로가기 버튼</li>
<li>콜스택</li>
</ul>
<hr>
<hr>
<hr>
<h1 id="2-queue">2. Queue</h1>
<p><strong>줄을 섰을 때 먼저 기다린 사람이 먼저 나가는 것과 같은 선입선출 구조. 먼저 들어간 것이 먼저 나온다. FIFO(First-In, First-Out)</strong></p>
<p>아래는 queue의 전반적인 진행을 그림으로 표현한 것이다.</p>
<p><img src="https://images.velog.io/post-images/rami_tae/eb0f87b0-0879-11ea-8eb3-a57280cb94c7/queue-1.png" alt="queue-1.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/ebb53d90-0879-11ea-8eb3-a57280cb94c7/queue-2.png" alt="queue-2.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/ec6839e0-0879-11ea-8eb3-a57280cb94c7/queue-3.png" alt="queue-3.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/ed321990-0879-11ea-8eb3-a57280cb94c7/queue-4.png" alt="queue-4.png"></p>
<hr>
<h2 id="2-1-property">2-1. Property</h2>
<ul>
<li><code>front</code>: 가장 오래된 요소의 index</li>
<li><code>rear</code>: 새로운 요소가 들어갈 index === 가장 최근 요소 index의 + 1</li>
<li><code>queueArray</code>: 저장소</li>
</ul>
<h2 id="2-2-method">2-2. Method</h2>
<ul>
<li><code>push()</code>: 새 요소를 추가한다. 반환값 없음.</li>
<li><code>pop()</code>: 가장 오래된 요소를 삭제한다. 삭제한 요소 출력.</li>
<li><code>empty()</code>: 저장소가 비어있는지 확인한다. 비어있으면 true, 아니면 false</li>
<li><code>size()</code>: 저장되어 있는 데이터가 몇 개 인지 반환한다.</li>
</ul>
<hr>
<h2 id="2-3-pseudo-code">2-3. Pseudo Code</h2>
<ul>
<li><p><code>front</code>와 <code>rear</code>는 0으로 초기화.</p>
</li>
<li><p><code>push()</code></p>
<ol>
<li><code>queueArray</code>를 확인한다.<ol>
<li><code>queueArray</code>가 가득 차 있다 &gt; <code>Overflow</code>출력 후 method 나가기</li>
<li><code>queueArray</code>가 가득 차 있지 않다 &gt; 다음으로 진행</li>
</ol>
</li>
<li><code>rear</code> 의 위치에 해당 요소를 삽입한다.</li>
<li><code>rear</code>값을 1 증가시킨다.</li>
</ol>
</li>
<li><p><code>pop()</code></p>
<ol>
<li><code>queueArray</code>를 확인한다.<ol>
<li><code>queueArray</code>가 비어있다 &gt; <code>Underflow</code>출력 후 method 나가기</li>
<li><code>queueArray</code>가 비어있지 않다 &gt; 다음으로 진행</li>
</ol>
</li>
<li><code>front</code>의 위치에 있는 요소를 method 내부 변수에 저장하고 삭제한다.</li>
<li><code>front</code>값을 1 증가시킨다</li>
<li>삭제된 요소(method의 내부 변수에 저장했던 요소)를 반환 후 method를 나간다.</li>
</ol>
</li>
<li><p><code>empty()</code></p>
<ol>
<li><code>queueArray</code>의 0번째 index부터 <code>queueArray</code>의 크기까지의 <code>for</code>문을 만든다<ol>
<li><code>queueArray(i)</code>가 존재하면 <code>false</code>를 반환한다.</li>
<li><code>for</code>문을 진행한다</li>
</ol>
</li>
<li><code>true</code>를 반환한다.</li>
</ol>
</li>
<li><p><code>size()</code></p>
<ul>
<li><code>empty()</code>와 유사하게 작성하면 된다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="--사용-예-1">- 사용 예</h2>
<ul>
<li>프린터</li>
<li>콘서트 티켓팅 대기열</li>
</ul>
<hr>
<h1 id="참고">참고</h1>
<blockquote>
<p>윤성우의 열혈 자료구조 - 윤성우 [ORANGE MEDIA]</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191114(목) TIL-2. JS에서의 OOP]]></title>
            <link>https://velog.io/@rami_tae/191114%EB%AA%A9-2.-JS%EC%97%90%EC%84%9C%EC%9D%98-OOP-6ok31n10dx</link>
            <guid>https://velog.io/@rami_tae/191114%EB%AA%A9-2.-JS%EC%97%90%EC%84%9C%EC%9D%98-OOP-6ok31n10dx</guid>
            <pubDate>Sat, 16 Nov 2019 14:02:38 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-js에서의-oop">[CODESTATES im16] JS에서의 OOP</h1>
<ul>
<li><p>자료구조?</p>
<ul>
<li>데이터를 어떻게 효율적으로 조직, 관리, 저장할 것인지</li>
<li>데이터 값의 모임, 또는 데이터 간의 관계, 데이터에 적용할 수 있는 함수</li>
</ul>
</li>
<li><p>수도 코드(Pseudo Code)?</p>
<ul>
<li>프로그램을 작성할 때 프로그램이 작동하는 논리를 표현하기 위한 콬드</li>
<li>특정 언어의 문법에 따라 쓰인 것이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드</li>
</ul>
</li>
</ul>
<h1 id="1-procedural-language-object-otiented-language">1. Procedural Language, Object-Otiented language</h1>
<h2 id="1-1-절차지향-언어procedural-language">1-1. 절차지향 언어(Procedural Language)</h2>
<p><img src="https://images.velog.io/post-images/rami_tae/513e8be0-0879-11ea-b502-33f596f4a7a7/%EC%A0%88%EC%B0%A8%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4-1.png" alt="절차지향 언어-1.png"></p>
<p><img src="https://images.velog.io/post-images/rami_tae/52e6e4b0-0879-11ea-b502-33f596f4a7a7/%EC%A0%88%EC%B0%A8%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4-2.png" alt="절차지향 언어-2.png"></p>
<ul>
<li>프로그램 안에 있는 것들의 관계를 설정하는 언어.</li>
</ul>
<h2 id="1-2-객체지향-언어object-otiented-language">1-2. 객체지향 언어(Object-Otiented Language)</h2>
<p><img src="https://images.velog.io/post-images/rami_tae/564d4130-0879-11ea-8d4b-110a8a114eee/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4.png" alt="객체지향 언어.png"></p>
<ul>
<li>프로그램을 유지하는 모든 것이 오브젝트로 이루어지도록 만들어진 언어.<ul>
<li>컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 객체들의 모임으로 파악하고자 하는 것.</li>
</ul>
</li>
<li>유연하고 변경이 용이함.</li>
<li>배우기 쉽고, 개발과 보수가 간편하고, 보다 직관적인 코드 분성을 가능하게 함.</li>
</ul>
<h3 id="1-객체-object-란">1) 객체 Object 란?</h3>
<ul>
<li>데이터와 기능을 논리적으로 묶어 놓은 것.</li>
<li>컨테이너<ul>
<li>컨테이너의 내용물은 시간이 지나면서 바뀔 수 있지만, 내용물이 바뀐다고 컨테이너가 바뀌는 건 아님. =&gt; 여전히 같은 객체</li>
<li>재사용성이 높음</li>
</ul>
</li>
</ul>
<h3 id="2-oop">2) OOP?</h3>
<ul>
<li><p>인간이 사물을 이해하는 방식을 반영하도록 설계됨.</p>
</li>
<li><p>Class를 기반으로 동일한 특성과 기능을 가진 instance 객체를 생성한다.</p>
<ul>
<li>예  
<img src="https://images.velog.io/post-images/rami_tae/9ace7c70-0879-11ea-a8f2-151f45643f3b/oop%EC%84%A4%EB%AA%85-table.png" alt="oop설명 table.png"></li>
<li>인스턴스(instance): 클래스를 기반으로 생성한 객체</li>
</ul>
</li>
</ul>
<hr>
<h1 id="2-oop-basic-concepts">2. OOP Basic Concepts</h1>
<h2 id="2-1-encapsulation-캡슐화">2-1. Encapsulation 캡슐화</h2>
<ul>
<li>속성들을 쌓아서 모아두는 것.</li>
<li>Reduce complexity + increase reusability</li>
</ul>
<h2 id="2-2-inheritance-상속">2-2. Inheritance 상속</h2>
<ul>
<li>새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능.</li>
<li>자식 클래스는 부모의 속성을 상속받는다.</li>
<li>Reduce complexity + isolate impact of change</li>
</ul>
<h2 id="2-3-abstraction-추상화">2-3. Abstraction 추상화</h2>
<ul>
<li>불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것.</li>
<li>추상화: 복잡한 상태이더라도 사용자의 사용은 간편하다.</li>
<li>Eliminate redundant code</li>
</ul>
<h2 id="2-4-polymorphism-다형성">2-4. Polymorphism 다형성</h2>
<ul>
<li>어떤 한 요소에 여러 개념을 넣어 놓는 것.<ul>
<li>일반적으로 <a href="https://ko.wikipedia.org/w/index.php?title=%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9&amp;action=edit&amp;redlink=1">오버라이딩</a>(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 <a href="https://ko.wikipedia.org/w/index.php?title=%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9&amp;action=edit&amp;redlink=1">오버로딩</a>(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미함.</li>
</ul>
</li>
<li>여러 형태이다.</li>
<li>Refactor ugly switch/case statements</li>
</ul>
<hr>
<h1 id="3-js에서-object-생성하기">3. JS에서 Object 생성하기</h1>
<h2 id="3-1-functional">3-1. Functional</h2>
<pre><code class="language-js">var Car = function() {
  var someInstance = {};
  someInstance.position = 0;
  someInstance.move = function() {
    this.position += 1;
  }
  return someInstance;
};

var car1 = Car();
var car2 = Car();
car1.move();
console.log(car1); // {position: 1, move: ƒ}
console.log(car2); // {position: 0, move: ƒ}</code></pre>
<p><img src="https://images.velog.io/post-images/rami_tae/aeb87290-0879-11ea-8d4b-110a8a114eee/Functional%EB%B0%A9%EC%8B%9D.png" alt="Functional방식.png"></p>
<h2 id="3-2functional-shared">3-2.Functional Shared</h2>
<p><img src="https://images.velog.io/post-images/rami_tae/b11f1250-0879-11ea-8d4b-110a8a114eee/Functional-Shared-%EB%B0%A9%EC%8B%9D.png" alt="Functional Shared 방식.png"></p>
<h2 id="3-3-prototypal-preudoclassical">3-3. Prototypal, Preudoclassical</h2>
<h3 id="1-prototypal는-와-같다">1) Prototypal는 {}와 같다.</h3>
<pre><code class="language-js">const obj1 = Object.create(Object.prototype);
const obj2 = {};</code></pre>
<h3 id="1-prototypal-preudoclassical-비교">1) Prototypal, Preudoclassical 비교</h3>
<pre><code class="language-js">// Preudoclassical
const Car = function (color) {
    this.color = color;
}

const car1 = new Car(&#39;red&#39;); //생성자가 실행됨
const car2 = Object.create(Object.prototype); //생성자가 실행 안됨: Object의 prototype만 가져오는 것.</code></pre>
<pre><code class="language-js">const Car = function (color) {
    this.color = color;
}

Car.prototype = {
    getColor() {
        return this.color;
    }
}

const ToyCar = function() {};

ToyCar.prototype = Object.create(Car.prototype);

const LegoCar = new ToyCar();</code></pre>
<ul>
<li>object.create로 할 수 있는 것: 생성자의 확장.(상위클래스의 method가 하위클래스에 복사됨)</li>
</ul>
<p><strong>더 알아보기: prototype chain</strong></p>
<hr>
<h1 id="4-js에서의-prototype">4. JS에서의 Prototype</h1>
<hr>
<h1 id="참고">참고</h1>
<blockquote>
<ol>
<li>CodeStates Immersive Course</li>
<li>러닝 자바스크립트 - 이선 브라운 [한빛미디어]</li>
<li>YOU DON&#39;T KNOW JS(this와 객체 프로토타입, 비동기와 성능) - 카일 심슨 [한빛미디어]</li>
<li>wikipedia<a href="https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D#%EA%B8%B0%EB%B3%B8_%EA%B5%AC%EC%84%B1_%EC%9A%94%EC%86%8C">[객체 지향 프로그래밍]</a></li>
<li><a href="%5Bhttps://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67%5D(https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67)">[Javascript ] 프로토타입 이해하기</a></li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[191114(목) TIL-1. Check Point3, Sprint Riview]]></title>
            <link>https://velog.io/@rami_tae/191114%EB%AA%A9-1.-Check-Point3-Sprint-Riview</link>
            <guid>https://velog.io/@rami_tae/191114%EB%AA%A9-1.-Check-Point3-Sprint-Riview</guid>
            <pubDate>Sat, 16 Nov 2019 13:58:41 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-check-point3-문제풀이-sprint-review">[CODESTATES im16] Check Point3 문제풀이, Sprint Review</h1>
<h1 id="1-check-point3-문제풀이">1. Check Point3 문제풀이</h1>
<p><em>[ o ] : 정답</em></p>
<p><em>[ x ] : 내가 선택한 답 = 틀림</em></p>
<h2 id="q1-this-키워드">Q1. &#39;this&#39; 키워드</h2>
<p>[ ] The function that is currently being invoked.</p>
<p>[ o ] An object that the invoked function points to when executing.</p>
<p>[ ] A variable used for lexical scope lookup.</p>
<blockquote>
<ol>
<li><p>this: 함수가 아님</p>
</li>
<li><p>호출된 함수가 실행할 때 가리키는 특정 객체입니다.</p>
</li>
<li><p>정적 스코프 lookup에 사용되는 변수가 아닙니다.</p>
</li>
</ol>
<p>lexical scope: static scope(선언될 때 저장되는 스코프)</p>
<p>[lexical scope] <a href="https://stackoverflow.com/questions/1047454/what-is-lexical-scope">https://stackoverflow.com/questions/1047454/what-is-lexical-scope</a></p>
</blockquote>
<h2 id="q2-코드-실행-후-result">Q2. 코드 실행 후 result?</h2>
<pre><code class="language-js">var x = 10;
var strangeAdd = function (y) {
  var x = 20;
  return this.x + y
};

result = strangeAdd(10);</code></pre>
<p>[ ] 10</p>
<p>[ o ] 20</p>
<p>[ ] 30</p>
<p>[ ] NaN</p>
<blockquote>
<p>this가 정의된 곳과는 무관하게 실행되는 지점이 글로벌영역이기 때문에 result 의 this는 window이다. 그렇기 때문에 window.x를 불러오기에 답이 20이 된다.</p>
</blockquote>
<h2 id="q3-내-프로그램에서-this-키워드의-의미-결정-방식">Q3. 내 프로그램에서 &#39;this&#39; 키워드의 의미 결정 방식?</h2>
<p>[ x ] Look to the function in which it is defined — that’s what the context is bound to.</p>
<p>[ o ] Look to where the function is called at call time to determine how it is called and evaluate from there.</p>
<blockquote>
<ol>
<li>함수가 정의되어있는 문맥이 아닌 실행 방식에 따라 결정됨.</li>
<li>this는 함수가 실행될 때 실행되는 방식에 따라 결정됨.</li>
</ol>
</blockquote>
<h2 id="q4-this에-적용되는-다섯가지-패턴">Q4. &#39;this&#39;에 적용되는 다섯가지 패턴?</h2>
<ol>
<li>global this: window</li>
<li>function 호출: window</li>
<li>method 호출: 부모 object (function의 부모는 window이기 때문에 사실상 2와 3은 같음)</li>
<li>new 연산자로 생성된 function영역의 this: 새로 생성된 객체(Construction Mode)</li>
<li><code>.call()</code>이나 <code>.allpy()</code>호출: 첫번째 인자로 명시된 객체</li>
</ol>
<h2 id="q5-코드-실행-후-콘솔">Q5. 코드 실행 후 콘솔?</h2>
<pre><code class="language-js">function foo(){
  console.log(this);
}

foo();</code></pre>
<p>[ ] foo</p>
<p>[ ] console</p>
<p>[ ] A reference error will be thrown.</p>
<p>[ o ] Window or the global object.</p>
<blockquote>
<p>this: free function invocation</p>
<p>전역에서 foo를 불렀기 이 this는 window가 된다.</p>
</blockquote>
<h2 id="q6-코드를-실행-후-콘솔">Q6. 코드를 실행 후 콘솔?</h2>
<pre><code class="language-js">var obj = {
  foo: function(){
    console.log(this);
  }
}

obj.foo();</code></pre>
<p>[ x ] foo</p>
<p>[ ]  console</p>
<p>[ o ] obj</p>
<p>[ ] window or the global object.</p>
<blockquote>
<p>여기서의 this: 부모 객체</p>
<p>(닷노케이션 기준 왼쪽의 객체가 this가 된다고 보면 됨.)</p>
</blockquote>
<h2 id="q7-코드-실행-후-콘솔">Q7. 코드 실행 후 콘솔?</h2>
<pre><code class="language-js">var obj = {
  foo: function(){
    console.log(this);
  }
}

var fn = obj.foo;
fn();</code></pre>
<p>[ x ] foo</p>
<p>[ ] console</p>
<p>[ ] obj</p>
<p>[ o ] Window or the global object.</p>
<blockquote>
<p>free function invocation : this = window</p>
<p>fn이 function() { console.log(this); }가 되는것이기 때문에 이 this가 free function invocation이 됨.</p>
<p>obj.foo()의 경우에는 함수를 불러오는 것이 아니니 method invocation이다.</p>
<p><code>var fn = obj.foo</code> 의 위치가 중요한게 아니고 <code>fn()</code>의 <strong>실행 시점</strong>이 중요함.</p>
<p><strong>this에서는 실행 위치가 중요함</strong></p>
</blockquote>
<h2 id="q8-코드-실행-후-콘솔">Q8. 코드 실행 후 콘솔?</h2>
<pre><code class="language-js">var obj = {
  foo: function(){
    console.log(this);
  }
}

var obj2 = {
  foo: obj.foo
}

obj.foo.call(obj2);</code></pre>
<p>[ x ] foo</p>
<p>[ ] console</p>
<p>[ o ] obj2</p>
<p>[ ] window or the global object.</p>
<blockquote>
<p><code>.call()</code>이나 <code>.apply()</code>의 경우 실행시점에서 this의 값이 정해지는 것이 아니라 명시적으로 값을 정할 수 있다.</p>
</blockquote>
<h2 id="qna">QnA</h2>
<p><strong>Q. JS에서의 주소</strong></p>
<p><em>A. js에서는 주소 관리를 GC에서 하기 때문에 주소의 개념보다는 레퍼런스 참조의 개념으로 이해하는게 나을 것이다.</em></p>
<p><strong>Q. Arraw function</strong></p>
<p>A. </p>
<pre><code class="language-js">// function scope를 발생시키지 않음
const fn = () =&gt; {
}

// function scope 발생
const fn2 = function () {  
}</code></pre>
<hr>
<hr>
<h1 id="2-sprint-review">2. Sprint Review</h1>
<h2 id="2-1-js--runtimenode">2-1. JS- runtime(node)</h2>
<p>JS runtime: JS가 실행되는 환경(js가 실행되는 환경에 따라 조금씩 다름)</p>
<p>내가 하려고 하는 것이 실행되지 않으면 실행하고자 하는 환경에서 지원이 되는지를 확인해야 함.</p>
<p>대표적인 환경: node vs browser</p>
<p>​    version이 존재함.</p>
<h2 id="2-2-nvm-node-version-manager">2-2. nvm: node version manager</h2>
<p>필요한 이유: 버전에 따라 실행되는 코드가 </p>
<p>node관리매니저가 많은데도 nvm을 사용하는 이유: 가장 편리하기 때문</p>
<p>$nvm install &gt; 다운</p>
<p>$nvm ls &gt; 여러 노드 버전이 뜸</p>
<p>$nvm use &gt; 바로 버전이 변경됨</p>
<p>use로 node의 버전을 바꾸더라도 터미널 종료 후 다시 켜면 default버전으로 변경됨.</p>
<p>​    =&gt; 쭉 변경해서 사용하고 싶다면 default를 변경해야함</p>
<p>최신버전을 사용하지 않고 LTS(longterm support)를 사용하는 이유: LTS가 안전화된 버전이기 때문이다.</p>
<p>​    =&gt; 하위호환성이 뛰어나다.</p>
<h2 id="2-3-gitflow">2-3. *gitflow</h2>
<p>remote: 내 컴퓨터가 아닌 곳</p>
<p>​    github</p>
<p>local:</p>
<ul>
<li>$git remote -v =&gt; origin<ul>
<li>clone 받아 온 repo를 기본적으로 오리진이라고 잡음.</li>
</ul>
</li>
<li>$git remote add pair <pair-URL><ul>
<li>remote환경에 pair의 URL 추가</li>
</ul>
</li>
<li>$git push origin master<ul>
<li>origin: remote 이름</li>
<li>$git push 1 master 식으로 해당 remote환경에 push 가능<ul>
<li>github repository의 설정에서 권한을 주어야 push 가능</li>
</ul>
</li>
</ul>
</li>
<li>$git pull remote pair(remote 이름) master<ul>
<li>repo의 기본 권한이 read이기 때문에 별다른 권한이 없어도 읽어올 수 있다.</li>
</ul>
</li>
</ul>
<p>3명이서 pair프로그래밍을 진행할 때</p>
<ul>
<li>항상 나는 내 remote에 올리고 다른 사람들이 그걸 받아오는 형식으로 진행해야 함.</li>
</ul>
<h2 id="2-4-linting">2-4. linting</h2>
<ul>
<li><p>lint: 코드 룰()</p>
<ul>
<li>따르지 않으면 오류를 냄(prettier처럼 강제로 바꿔주지는 않음)</li>
</ul>
</li>
<li><p>prettier: 코드 형식, 모양(같은 문법을 어떻게 보여줄지의 형식)</p>
<ul>
<li>오류를 내지는 않고 자동으로 그 모양으로 바꿔줌</li>
</ul>
</li>
</ul>
<p>=&gt; 같이 연결해서 쓴다면 저장할 때 원하는 방식으로 코드가 저장이 된다.(lint대로 prettir가 고쳐줌)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[191113(수) TIL-2. this(Pre코스 복습)]]></title>
            <link>https://velog.io/@rami_tae/191113%EC%88%98-2.-thisPre%EC%BD%94%EC%8A%A4-%EB%B3%B5%EC%8A%B5-s3k31mvu6z</link>
            <guid>https://velog.io/@rami_tae/191113%EC%88%98-2.-thisPre%EC%BD%94%EC%8A%A4-%EB%B3%B5%EC%8A%B5-s3k31mvu6z</guid>
            <pubDate>Sat, 16 Nov 2019 13:56:01 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-this-pre-course-복습">[CODESTATES im16] this (Pre Course 복습)</h1>
<p><strong>&#39;this&#39; keyword</strong></p>
<ul>
<li>모든 함수 scope 내에서 자동으로 설정되는 특수한 식별자</li>
<li>execution context의 구성 요소 중 하나로, 함수가 실행되는 동안 이용할 수 있다.</li>
</ul>
<h2 id="--this의-종류">- this의 종류</h2>
<p><em>외워둬야 함</em></p>
<p><img src="https://images.velog.io/post-images/rami_tae/c1652330-0878-11ea-b502-33f596f4a7a7/this%EC%9D%98-%EC%A2%85%EB%A5%98.png" alt="this의 종류.png"></p>
<hr>
<h2 id="1-global-this">1. global this</h2>
<p><strong>: window</strong></p>
<pre><code class="language-js">this //=&gt; Window {...}</code></pre>
<hr>
<h2 id="2-function-invocation호출">2. function invocation(호출)</h2>
<p><strong>: window</strong></p>
<pre><code class="language-js">function foo() {
    console.log(this);
}
foo() //=&gt; Window {...}</code></pre>
<hr>
<h2 id="3-method-invocation">3. method invocation</h2>
<p><strong>: 부모 object</strong></p>
<pre><code class="language-js">var obj = {
    fn: function() { console.log(this); }
}
obj.fn() //=&gt; {fn: f}</code></pre>
<ul>
<li><pre><code class="language-js">var obj2 = {
    hello: {
        fn: function() { console.log(this); }
    }
}
obj.hello.fn() //=&gt; {fn: f}
//method invocation의 this: 바로 자기 위의 부모만 가져옴</code></pre>
</li>
</ul>
<p><em>3, 4는 사실상 같은 의미</em></p>
<hr>
<h2 id="4-construction-modenew-연산자로-생성된-function-영역의-this">4. construction mode(new 연산자로 생성된 function 영역의 this)</h2>
<p><strong>: 새로 생성된 객체</strong></p>
<pre><code class="language-js">function Car(brand, name, color) {
    this.brand = brand;
    this.name = name;
    this.color = color;
}
Car.prototype.drive = function() {
    console.log(this.name + &#39;가 운전을 시작합니다&#39;);
}
let myCar = new Car(&#39;chrysler&#39;, &#39;300c&#39;, &#39;black&#39;);
myCar.color; //&#39;black&#39;
myCar.drive; //&#39;300c가 운전을 시작합니다&#39;</code></pre>
<hr>
<h2 id="5-call-or-apply-invocation">5. <code>.call()</code> or <code>.apply()</code> invocation</h2>
<p><strong>: <code>.call()</code>, <code>.apply()</code>의 첫번째 인자로 명시된 객체</strong></p>
<pre><code class="language-js">function identify() {
    return this.name.toUpperCase();
}
function speak() {
    var greeting = &quot;Hello, I&#39;m &quot; + identify.call(this);
    console.log(greeting);
}
var me = { name: &quot;Rami&quot; };
var you = { name: &quot;Reader&quot; };

identify.call( me ); // RAMI
identify.call( you ); // READER
speak.call( me ); // Hello, I&#39;m RAMI
speak.call( you ; // Hello, I&#39;m READER</code></pre>
<h3 id="1-call과-apply의-차이">1) <code>.call()</code>과 <code>.apply()</code>의 차이</h3>
<pre><code class="language-js">var add = functrion (x, y) {
    this.val = x, y;
}
var obj = {
    val: 0
};

add.apply(obj, [2, 8]);
console.log(obj.val); // 10
add.call(obj, 2, 8);
console.log(obj.val); // 10</code></pre>
<h3 id="-apply를-사용하는-이유">* <code>.apply()</code>를 사용하는 이유</h3>
<pre><code class="language-js">var arr = [2, 10, 1, 0, 4];
Math.max(2, 10, 1, 0, 4); // 10
Math.max.apply(null, arr); //10</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[191113(수) TIL-1. Sprint Office Hour]]></title>
            <link>https://velog.io/@rami_tae/191113%EC%88%98-1.-Sprint-Office-Hour-snk31mplw3</link>
            <guid>https://velog.io/@rami_tae/191113%EC%88%98-1.-Sprint-Office-Hour-snk31mplw3</guid>
            <pubDate>Sat, 16 Nov 2019 13:54:11 GMT</pubDate>
            <description><![CDATA[<h1 id="codestates-im16-sprint-office-hour">[CODESTATES im16] Sprint Office Hour</h1>
<h2 id="1-qna">1. QnA</h2>
<p><strong>Q. 함수선언부에 있는 변수는 파라미터고 함수호출할때 넣는값을 아규먼트인가요?</strong> </p>
<p><em>A. 네.</em></p>
<p><strong>Q. 크롬의 개발자 도구를 사용하지 않고 간단히 콘솔창을 실행할 수 있는 프로그램?</strong></p>
<p><em>A. runjs</em></p>
<p><strong>Q. 클로저 설명(외부의 context에 접근할 수 있는 함수를 클로저라고 함)에서 변수라고 쓰지 않고 context라고 사용하는 이유?</strong></p>
<p><em>A. context: 변수는 좁은 의미이기 때문에</em></p>
<ul>
<li><p>커링: 함수 하나가 n개의 인자를 받는 대신, n개의 함수를 만들어 각각 인자를 받게 하는 방법. </p>
</li>
<li><p>클로저 단점: 변수가 참조되고 있으면 계속 그 메모리를 유지하게 되어서, 필요하지 않을 때 참조를 끊어줘야 합니다 </p>
</li>
</ul>
<hr>
<h2 id="2-깃">2. 깃</h2>
<h3 id="2-1-깃의-장점">2-1. 깃의 장점</h3>
<ol>
<li><h6 id="버전-관리가-편리하다">버전 관리가 편리하다</h6>
</li>
<li><h6 id="백업이-용이하다">백업이 용이하다</h6>
</li>
<li><h6 id="협업하기에-좋다">협업하기에 좋다</h6>
<ul>
<li>한 번 보면 좋을 URL: [github에서 설명한 github] <a href="https://youtu.be/w3jLJU7DT5E">https://youtu.be/w3jLJU7DT5E</a></li>
</ul>
</li>
</ol>
<h3 id="2-2-간단한-깃-워크플로우">2-2. 간단한 깃 워크플로우</h3>
<ul>
<li>각자 하나의 코드를 포크해오기</li>
</ul>
<p><img src="https://images.velog.io/post-images/rami_tae/142554b0-0878-11ea-9d49-9fd8475b855b/%EA%B9%83-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-1.png" alt="깃 워크플로우-1.png"></p>
<ul>
<li>페어의 원격 저장소와 내 로컬 저장소 연결</li>
</ul>
<p><img src="https://images.velog.io/post-images/rami_tae/16f0d0c0-0878-11ea-9c53-a7de0c1afb05/%EA%B9%83-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-2.png" alt="깃 워크플로우-2.png"></p>
<ul>
<li>코드를 push</li>
</ul>
<p><img src="https://images.velog.io/post-images/rami_tae/18fec930-0878-11ea-9c53-a7de0c1afb05/%EA%B9%83-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-3.png" alt="깃 워크플로우-3.png"></p>
<ul>
<li>코드를 pull</li>
</ul>
<p><img src="https://images.velog.io/post-images/rami_tae/1d44fe60-0878-11ea-9d49-9fd8475b855b/%EA%B9%83-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-4.png" alt="깃 워크플로우-4.png"></p>
<ul>
<li>레포지토리의 구조</li>
</ul>
<p><img src="https://images.velog.io/post-images/rami_tae/1f0c50e0-0878-11ea-9d49-9fd8475b855b/%EA%B9%83-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-5.png" alt="깃 워크플로우-5.png"></p>
<ul>
<li><p>더 공부해보기</p>
<ul>
<li><p>git init</p>
</li>
<li><p>branching에 대해 알아보기</p>
</li>
<li><p>자주 쓰이는 git 명령어</p>
<ul>
<li>merge, fetch, stesh ...</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-linting--testing">3. Linting &amp; Testing</h2>
<h3 id="3-1-linter">3-1. linter</h3>
<p>​    일관적 코딩을 위해.
​    읽기 좋은 코드 = 유지, 보수하기 좋은 코드</p>
<h3 id="3-2-tester">3-2. Tester</h3>
<p>​    작성한 코드가 제대로 동작하는지 자동화하여 테스트해주는 툴
​    mocha, jest, ...
​        =&gt; 프로젝트의 의도를 확인할 수 있음</p>
<h4 id="1-jest-사용">1) Jest 사용</h4>
<ul>
<li><p>test커맨드 지정</p>
</li>
<li><p>test명령어 만들기 &amp; 사용하기</p>
<pre><code>{ ...

&quot;test:recursion&quot;: &quot;jest recursion-review&quot;,

&quot;test:watch&quot;: &quot;jest --watch&quot;,
...}</code></pre><ul>
<li><h6 id="testrecursion-jest-recursion-review를-사용하는-방법">&quot;test:recursion&quot;: &quot;jest recursion-review&quot;를 사용하는 방법</h6>
<pre><code>1. $npm test recursion
2. $npm run test:recursion</code></pre></li>
<li><p>test:watch의 --watch : cli옵션 중 하나.</p>
</li>
</ul>
</li>
<li><p>toBe : ===
toEqual : ==</p>
</li>
</ul>
<h4 id="2-qna">2) QnA</h4>
<p><strong>Q. 글로벌에 Jest, 혹은 ESlint가 설치되어 있는지 확인하는 방법</strong></p>
<p>*A.</p>
<pre><code>$npm list -g --depth=0*</code></pre><p><strong>Q. global로 설치한 jest 언인스톨 하는 방법</strong></p>
<p>*A.</p>
<pre><code>$nom uninstall -g jest*</code></pre><hr>
<h2 id="4-tip">4. Tip</h2>
<ul>
<li><p>.eslintrc.js</p>
<ul>
<li>숨김파일: 터미널에서 ls로 볼 수 없음.</li>
<li>ls로 보고싶다면<ul>
<li>$ls -a</li>
</ul>
</li>
</ul>
</li>
<li><p>.eslintrc.json</p>
<ul>
<li>오류를 무시하는 방법: 마우스 갖다댔을 때 뜨는 부분에서 Quick Fix... 클릭 후 설정하면 됨.</li>
</ul>
</li>
<li><p>.gitignore</p>
<ul>
<li>git을 사용할 때 무시할 파일들을 정리해 둠.</li>
</ul>
</li>
<li><p><a href="https://www.ryadel.com/en/yarn-vs-npm-pnpm-2019/">yarn과 npm의 차이 in 2019</a></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>