<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hsw9724.log</title>
        <link>https://velog.io/</link>
        <description>👨‍🍳요리사의 "쿠킹" 스토리가 아닌 "코딩" 스토리💻</description>
        <lastBuildDate>Wed, 11 Jan 2023 04:33:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hsw9724.log</title>
            <url>https://images.velog.io/images/-hsw9724/profile/36f09480-21b6-4f86-b8c7-60a9ebf02b97/IMG_0802.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hsw9724.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/-hsw9724" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CORS]]></title>
            <link>https://velog.io/@-hsw9724/CORS</link>
            <guid>https://velog.io/@-hsw9724/CORS</guid>
            <pubDate>Wed, 11 Jan 2023 04:33:03 GMT</pubDate>
            <description><![CDATA[<pre><code>웹프라우저는 HTTP요청에 대해서 어떤 요청을 하느냐에 따라 각기다른 특징을 가지고 있다.
1. &lt; img &gt; , &lt; video &gt; , &lt; script &gt; , &lt; link &gt; 태그 =&gt; 기본적으로 cross-origin 정책을 지원한다.
2. XMLHTTP request, Fetch API =&gt; 기본적으로 same-origin 정책을 지원한다.
 * 여기서 말하는 cross-origin, same-origin을 잘 이해해야 한다.</code></pre><h3 id="cors-란--cross-origin-resource-sharing--교차출처-리소스-공유-정책-">CORS 란?  Cross-Origin-Resource-Sharing ( 교차출처 리소스 공유 정책 )</h3>
<ol>
<li><h4 id="origin---protocol--host--port를-묶어-놓은것">Origin - Protocol , Host , Port를 묶어 놓은것</h4>
<img src="https://velog.velcdn.com/images/-hsw9724/post/16a8170d-8f0b-4716-b159-48388002e83b/image.png" alt=""></li>
</ol>
<ol start="2">
<li><h4 id="sop-same-origin-policy---동일-출처-정책">SOP (Same-Origin-Policy) - 동일 출처 정책</h4>
</li>
</ol>
<ul>
<li>동일한 출처에만 리소스를 공유할 수 있다.</li>
<li>동일 출처 정책이 없을시 해커한테 CSRF나 XSS등의 방법으로 개인정보를 탈취 당할 수 있다.</li>
<li>같은 출처의 기준<ul>
<li>두 URL의 구성요소중 Origin만 같은면 된다.</li>
</ul>
</li>
<li>출처비교와 차단은 브라우저에서 한다. (server x)
```</li>
<li>Origin 이 달라 전부다 차단하면 다른 출처의 리소스는 어떻게 사용 가능한가?<ul>
<li>그래서 몇가지 예외 조항을 두고 다른 출처의 리소스 요청이라도 이 조항에 해당하면 허용하기로 했는데, 
그중 하나가 &#39;CORS&#39; 정책을 지킨 리소스 요청이다. &#39;CORS&#39;는 error가 아닌 해결책이다.<pre><code></code></pre></li>
</ul>
</li>
</ul>
<ol start="3">
<li><h4 id="cors-기본-동작">CORS 기본 동작</h4>
<ol>
<li>client에서 HTTP요청의 헤더에 Origin을 담는다.</li>
<li>server는 응답헤더에 Access-Control-Allow-Origin을 담아 client에 보낸다.</li>
<li>client에서 자신이 보냈던 요청의 Origin과 서버에서 보낸 Access-Control-Allow-Origin을 비교</li>
</ol>
<p> ** 즉 server에서 Access-Control-Allow-Origin에 허용할 출처를 기재하여 client에 응답하면 해결된다.(Test용으로 Proxy를 사용하기도 한다.)</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTPS 흐름]]></title>
            <link>https://velog.io/@-hsw9724/HTTPS-%ED%9D%90%EB%A6%84</link>
            <guid>https://velog.io/@-hsw9724/HTTPS-%ED%9D%90%EB%A6%84</guid>
            <pubDate>Mon, 09 Jan 2023 15:16:22 GMT</pubDate>
            <description><![CDATA[<h3 id="hppts-란-컴퓨터-네트워크를-통한-보안-통신">hppts 란? 컴퓨터 네트워크를 통한 보안 통신</h3>
<pre><code>- https 에서 프로토콜은 SSL/TLS 로 암호화 된다.
- https 프로토콜을 사용하기 위해서는 인증기관(CA)으로부터 SSL을 발급받아야한다.
*TLS- 넷스케이프는 IEFT 에 SSL 프로토콜 제어권을 넘겼고 이후에 TLS버전이 출시됨</code></pre><h3 id="--ssl-인증서--">- SSL 인증서 -</h3>
<ul>
<li>인증서 발급 과정 및 원리<ol>
<li>서버의 public key 와 private key 를 생성한다.  </li>
<li>1에서 발급받은 public key와 각종 정보를 CA에 넘긴다.</li>
<li>2에서 받은 정보로 SSL인증서를 발급한다.</li>
<li>3에서 만든 인증서를 암호화 하기위해 CA의 public key 와 private key를 생성하고 CA의 private key 로 암호화 한다.</li>
<li>4에서 암호화된 SSL인증서를 서버에 전달한다.</li>
</ol>
</li>
</ul>
<h3 id="--ssl-handshake--">- SSL handshake -</h3>
<pre><code>- handshake란 서버와 클라이언트가 통신을 연결할때 서로 악수(협상)를 통한 정보를 주고받고, 신뢰 할 수 있는 서버인지, 통신할때 암호화는 어떻게 할지 등등 정하는 과정이다.
- 서버와 클라이언트가 주고받을 데이터의 암호화 알고리즘 결정 및 암호화를 위한 동일한 대칭키 얻기가 주 목적이다.</code></pre><ul>
<li>SSL handshake 동작 원리 및 과정<ol>
<li>client에서 server로 연결시도 (Client hello)<ul>
<li>client에서 통신하고 싶은 서버로 연결을 시도하는 Packet을 보낸다.</li>
<li>Packet - pack + bucket 합성어로 내부에는 Data, Version, Protocol, Header Checksum, Session id 등이 있다.</li>
</ul>
</li>
</ol>
</li>
</ul>
<pre><code>   2. server에서 client로 응답 (server hello)
    - client에서 받은 packet에 대해 서버가 응답한다. 
    - certificate packet(server의 SSL인증서 내용이 포함되어있다)도 보낸다.    

3. client에서 server의 SSL인증서 검증
    ```
    SSL인증서 검증 방법
     - client는 인증서를 발급한 인증기관의 public key를 구하고 CA의 public key를 사용하여 SSL 인증서를 복호화 한다. 복호화가 성공하면 인증서 검증완료.
    구하는 방법
     - client는 browser 또는 android에 CA의 리스트와 public key를 가지고 있다. 그래서 매번 CA에 요청이 아닌 list에서 확인해본다. 하지만 없으면 외부 인터넷을 통해 인증기관의 정보와 public key를 확보한다.
    ```

4. client에서 server로 대칭키(private key)전달
    - 이제 client에서는 server와 안전하게 데이터를 주고받기위해 데이터를 암호화 해야한다.
    - client는 암호화하기위한 대칭키를 생성하고 보안없이 서버로 옮기면 위험하기 때문에 server의 public key로 암호화 하여 넘긴다.

5. server/client SSL hand shake 끝
    - server는 client에서 전달받은 암호화된 대칭키를 server의 private key로 복호화 한다.
    - 이제 server와 client에 동일한 대칭를 가지고 있으니 통신준비가 완료된다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Functional component 와 Class component]]></title>
            <link>https://velog.io/@-hsw9724/Functional-component-%EC%99%80-Class-component</link>
            <guid>https://velog.io/@-hsw9724/Functional-component-%EC%99%80-Class-component</guid>
            <pubDate>Sun, 08 Jan 2023 07:47:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h4 id="과거에는-class-component가-더많은-기능을-제공하여-많이-사용-했지만-2019년-v168-부터-함수형-컴포넌트에-리액트-hook을-지원해-주어-현재는-공식-문서에서-함수형-컴포넌트와-hook을-함께-사용할-것을-권장하고-있다-오늘은-무엇이-더-좋다-혹은-어떻게-사용한다가-아닌-사용하면서-몰랐었던-부분에-대해서-정리-할-것이다">과거에는 class component가 더많은 기능을 제공하여 많이 사용 했지만, 2019년 v16.8 부터 함수형 컴포넌트에 리액트 hook을 지원해 주어 현재는 공식 문서에서 함수형 컴포넌트와 hook을 함께 사용할 것을 권장하고 있다. 오늘은 무엇이 더 좋다 혹은 어떻게 사용한다가 아닌 사용하면서 몰랐었던 부분에 대해서 정리 할 것이다.</h4>
</blockquote>
<h3 id="렌더링-된-후-props-의-불변성">렌더링 된 후 props 의 불변성</h3>
<p> class component 와 Functional component 두가지 코드를 준비해 보았다.</p>
<pre><code class="language-js">// functional component
function ProfilePageFunc(props) {
  const showMessage = () =&gt; {
    alert(&#39;Followed &#39; + props.user);
  };

  const handleClick = () =&gt; {
    setTimeout(showMessage, 3000);
  };

  return (
    &lt;button onClick={handleClick}&gt;Follow&lt;/button&gt;
  );
}</code></pre>
<pre><code class="language-js">// class component
class ProfilePageClass extends React.Component {
  showMessage = () =&gt; {
    alert(&#39;Followed &#39; + this.props.user);
  };

  handleClick = () =&gt; {
    setTimeout(this.showMessage, 3000);
  };

  render() {
    return &lt;button onClick={this.handleClick}&gt;Follow&lt;/button&gt;;
  }
}</code></pre>
<p>  같은 기능을 두가지 방법으로 표현한 코드입니다. 하지만 두 코드를 실행시키면 미묘한 차이를 발견할 수 있다.</p>
<pre><code class="language-js">function Test() {
  const [userName , setUserName] = useState(&#39;Soon&#39;)

  return(
    &lt;div&gt;
      &lt;label&gt;
        &lt;select value={userName} onChange={e =&gt; setUserName(e.target.value)}
              &lt;option value=&#39;Soon&#39;&gt;Soon&lt;/option&gt;
          &lt;option value=&#39;Harry&#39;&gt;Harry&lt;/option&gt;
          &lt;option value=&#39;Hwang&#39;&gt;Hwang&lt;/option&gt;
      &lt;/label&gt;
        &lt;p&gt;
           &lt;ProfilePageFunction user={userName} /&gt;
           &lt;b&gt; (function)&lt;/b&gt;
        &lt;/p&gt;
        &lt;p&gt;
           &lt;ProfilePageClass user={userName} /&gt;
           &lt;b&gt; (class)&lt;/b&gt;
        &lt;/p&gt;
     &lt;/div&gt;
    )
}

</code></pre>
<p> 한번 순서에 맞게 따라해보자.</p>
<ol>
<li>Follow 버튼을 누른다.</li>
<li>3초가 지나기전에 선택한 profile 이름을 변경한다.</li>
</ol>
<h4 id="functional-component-는-follow-버튼을-누른-시점에-선택되어있는-username을-알림창에-띄어준다-하지만-class-component-는-알림창을-띄우기-전에-변경한-값으로-변경이-된다-react-에서-props는-불변값인데-왜-이렇게-작동을-하는-것일까-이것은-this는-변경가능하며-조작이-가능하기때문이다">functional component 는 Follow 버튼을 누른 시점에 선택되어있는 userName을 알림창에 띄어준다. 하지만 class component 는 알림창을 띄우기 전에 변경한 값으로 변경이 된다. React 에서 props는 불변값인데 왜 이렇게 작동을 하는 것일까? 이것은 this는 변경가능하며 조작이 가능하기때문이다.</h4>
<h4 id="this가-변경가능하고-조작이-가능하다-라는-특징은-this-가-클래스에-존재하는-목적이기도-하다-리액트는-시간이-지남에-따라-변경하기-때문에-render나-라이프-사이클-메소드를-호출할때-업데이트-된-값을-가져올-수-있다-따라서-요청이-진행되고-있는-상황에서-class-component가-다시-렌더링-된다면-thisprops도-바뀌게-되는-것이다">&quot;this가 변경가능하고 조작이 가능하다.&quot; 라는 특징은 this 가 클래스에 존재하는 목적이기도 하다. 리액트는 시간이 지남에 따라 변경하기 때문에 render나 라이프 사이클 메소드를 호출할때 업데이트 된 값을 가져올 수 있다. 따라서 요청이 진행되고 있는 상황에서 Class component가 다시 렌더링 된다면 this.props도 바뀌게 되는 것이다.</h4>
<h4 id="위와같은-경우는-이벤트-헨들러와-props-state를-가진-render의-종속성을-timeout을-사용하며-그-종속관계를-끊어버려-올바른-props를-잃게-만든-것이다">위와같은 경우는 이벤트 헨들러와 props, state를 가진 render의 종속성을 timeout을 사용하며 그 종속관계를 끊어버려 올바른 props를 잃게 만든 것이다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux-saga  VS  React-query]]></title>
            <link>https://velog.io/@-hsw9724/Redux-saga-VS-React-query-z75pntfg</link>
            <guid>https://velog.io/@-hsw9724/Redux-saga-VS-React-query-z75pntfg</guid>
            <pubDate>Wed, 04 Jan 2023 14:26:33 GMT</pubDate>
            <description><![CDATA[<pre><code>Redux를 사용하며 구조가 복잡하고 간단한 api에도 많은 공수가 들어가 불편함을 느꼈었다. 
그래서 다른 라이브러리를 찾던중 React-query를 발견 하였고 새로운 프로젝트에 적용했다. 
어떤 부분이 Redux 보다 React-query가 매력적이었던 부분을 정리해 보자. </code></pre><h2 id="api-요청에-대한-상태관리">api 요청에 대한 상태관리</h2>
<ul>
<li><p>Redux</p>
<ul>
<li>redux는 상태관리 라이브러리다. 비동기처리목적이 아니기 때문에 redux-saga ,redux-thunk 등 미들웨어를 사용해야한다.</li>
<li>비동기 처리시 상태관리(isLoading, error, success)상황을 관리해야한다.</li>
</ul>
</li>
<li><p>React-query</p>
<ul>
<li>상태관리를 기본옵션으로 제공한다.(<a href="https://react-query-v3.tanstack.com/reference/useQuery">https://react-query-v3.tanstack.com/reference/useQuery</a>)</li>
</ul>
</li>
</ul>
<h2 id="구조">구조</h2>
<ul>
<li>Redux<ul>
<li>api 추가시 마다 Action , reducer , saga 를 구현해야한다.</li>
<li>saga에서 다른 saga에 dependency가 있고 이 구조가 복잡해지면 error를 찾기위해 연관되어 있는 saga를 찾아봐야한다.</li>
</ul>
</li>
<li>React-query<ul>
<li>각 api가 Query로 구성이되고 서로의 dependency는 사용하는 component 내에서 혹은 custom hooks에서 전달받고 갱신된다.</li>
<li>query key를 통해 직관적인 관리가 가능하다.</li>
</ul>
</li>
</ul>
<h2 id="csr--ssr-관리">CSR , SSR 관리</h2>
<ul>
<li>Redux + Redux-saga<ul>
<li>CSR , SSR 을 전부 Redux로 관리하여 직관적이지 않다.</li>
</ul>
</li>
<li>Recoil + React-query<ul>
<li>CSR은 Recoil로 SSR은 React-query로 관리하여 직관적이다.</li>
</ul>
</li>
</ul>
<h2 id="error-핸들링">Error 핸들링</h2>
<ul>
<li>Redux<ul>
<li>error 발생시 상태관리(isLoading, error, success)하는곳에서 error를 저장하고 갱신으로 인한 re-render가 되고 onError 실행</li>
</ul>
</li>
<li>React-query<ul>
<li>error 발생시 바로  onError실행</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Server"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Server</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Server</guid>
            <pubDate>Sat, 14 Nov 2020 10:51:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/512c1957-8442-447c-abf5-91780b07ec77/js.png" alt=""></p>
<h3 id="web-architecture">web Architecture</h3>
<h2 id=""><img src="https://images.velog.io/images/-hsw9724/post/b10a58b1-7ea5-4f97-918f-343f2bd0add8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.14.34.png" alt=""></h2>
<p>크게 보면 이런 구조이다.</p>
<h3 id="서버-조작을-위한-용어">서버 조작을 위한 용어</h3>
<ul>
<li>Browser</li>
<li>Server</li>
<li>API</li>
<li>HTTP</li>
<li>Ajax</li>
<li>CORS</li>
<li>XSS</li>
</ul>
<h2 id="1-browser--server">1. Browser &amp; Server</h2>
<ul>
<li>Browser - 사용자가 선택한 자원(html, js, css)을 서버에 요청하고 브라우저에 표시한다.</li>
<li>Server - 자원을 제공하는 주체 
<img src="https://images.velog.io/images/-hsw9724/post/22042558-3e8a-4c07-b057-ada8c251e959/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.19.34.png" alt=""></li>
</ul>
<h2 id="2-api--http">2. API &amp; HTTP</h2>
<ul>
<li><p>API - client 에게 Data Base의 리소스를 보여주는 interface(사물과 인간간의 의사소통이 가능하도록 만들어진 매개체)  ex) 메뉴판</p>
</li>
<li><p>HPPT - 클라이언트와 서버가 통신하기위해 HTTP라는 규약, 규칙을 지켜서 통신을 하는것.
<img src="https://images.velog.io/images/-hsw9724/post/ac58aa22-3fc7-414c-bdbe-dbbd96c99f3c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.26.21.png" alt=""> </p>
<ul>
<li><p>HTTP 작동방식 - 요청(request)과 응답(response)의 형태로 이루어져 있다.</p>
</li>
<li><p>구성 - Header 와 Body 로 구성되어 있다. </p>
<ul>
<li>Header - 어디에 보내는 요청인가(origin) , 컨텐츠 타입은 무엇인가(content-type) , 어떤 클라이언트를 보냈는가 (user-agent)... <a href="https://www.zerocho.com/category/HTTP/post/5b3ba2d0b3dabd001b53b9db">참고</a></li>
</ul>
</li>
<li><p>속성 - stateless , connectionless</p>
<ul>
<li>stateless </li>
<li>HTTP의 각 요청은 독립적이다 .
<img src="https://images.velog.io/images/-hsw9724/post/e3d14737-589d-40b1-9876-e00e036e3024/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.50.31.png" alt=""></li>
<li>HTTP 매 요청은 독립적이기 때문에 state라는 것이 없다.<img src="https://images.velog.io/images/-hsw9724/post/2bf964b8-7fda-42c0-8053-34619dd018ed/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.50.48.png" alt=""></li>
<li>connectionless </li>
<li>한번에 요청에는 한번의 응답을 한다.<img src="https://images.velog.io/images/-hsw9724/post/801630c3-acb9-4b8e-909d-134c15baee59/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.52.33.png" alt="">
-응답이후에는 연결이 끊기기 때문에, 더이상 응답을 할 수 없다.<img src="https://images.velog.io/images/-hsw9724/post/426f08a1-83cf-404c-9ee4-73f98fa6f764/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.52.50.png" alt=""></li>
</ul>
</li>
<li><p>Method</p>
<ul>
<li>GET - 서버에 자원을 요청.</li>
<li>POST - 서버에 자원을 생성.</li>
<li>PUT - 서버의 자원을 수정.</li>
<li>DELETE - 서버의 자원을 제거.
<img src="https://images.velog.io/images/-hsw9724/post/b00ba6ce-e89c-415a-b518-7eeddf4f45ab/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.56.27.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="3-ajax">3. Ajax<img src="https://images.velog.io/images/-hsw9724/post/0e30531a-068c-44d5-9da9-bfaa89226bae/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.17.06.png" alt=""></h2>
<ul>
<li><p>form 태그로 정보를 서버에 전송하면 페이지가 전체가  <code>Reloading</code> 된다. 즉, 페이지 전환시 불필요한 모든 부분까지 전부 로딩하는 것이다.</p>
</li>
<li><p>그래서 원하는 부분만 로딩할수 있게 서버와 자유롭게 통신할 수 있는 XRH(XMLHttpReqeust) 과 페이지 깜빡 없이 seamless 하게 작동하는 JavaScript와 DOM을 이용하는 Ajax가 탄생한다.</p>
</li>
</ul>
<h3 id="서버에서-데이터를-가져오는-방법">서버에서 데이터를 가져오는 방법</h3>
<ul>
<li>XMLHttpRequest</li>
<li>jQuery Ajax</li>
<li>fetch</li>
</ul>
<h4 id="xmlhttprequest">XMLHttpRequest</h4>
<blockquote>
<pre><code class="language-js">function reqListener () {
  console.log(this.responseText);
}
var oReq = new XMLHttpRequest();
oReq.addEventListener(&quot;load&quot;, reqListener);
oReq.open(&quot;GET&quot;, &quot;http://www.example.org/example.txt&quot;);
oReq.send();</code></pre>
</blockquote>
<h4 id="jquery-ajax">jQuery Ajax</h4>
<blockquote>
<pre><code class="language-js">$.ajax({
  url: &#39;http://example.com&#39;,
  method: &#39;GET&#39;,
  dataType: &#39;json&#39;
})
  .done(function(json) {
    console.log(json)
  })
  .fail(function(xhr, status, errorThrown) {
  })
  .always(function(xhr, status) {
    console.log(&#39;요청완료&#39;)
  });</code></pre>
</blockquote>
<h4 id="fetch">fetch</h4>
<blockquote>
<pre><code class="language-js">  fetch(&#39;http://example.com&#39;)
  .then(res =&gt; res.json())
  .then(data =&gt; {
    console.log(data);
  })
  .catch(err=&gt;{
    console.error(err)    
  });</code></pre>
</blockquote>
<h2 id="4cors">4.CORS</h2>
<p><img src="https://images.velog.io/images/-hsw9724/post/49d55bc4-6ada-4234-866a-26e3e58f7e6b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.36.27.png" alt=""></p>
<ul>
<li><p>cors는 브라우저가 리소스로드를 허용해야하는 원본이 아닌 다른 원본을 서버가 나타낼 수 있도록 하는 HTTP 헤더기반 메커니즘으로 API를 사용하는 웹 어플리케이션은 자신의 출처와 동일한 리소스만 불러올수 있으며, 다른 출처의 리소스를 불러오려면 그 출처에서 올바른 CORS 헤더를 포함한 응답을 반환해야 한다.</p>
</li>
<li><p>서버의 위치를 찾아가기 위해서는 기본으로 Protocol , Host , :80 , : 443(위에 보이진 않지만 Host 뒤에 붙어 있음.) 가 필요하다.</p>
</li>
</ul>
<h2 id="5xss">5.XSS</h2>
<ul>
<li>xss란 보안이 약한 웹 어플리케이션에 대한 웹기반 공격으로 클라이언트(사용자)를 대상으로 한다.
<img src="https://images.velog.io/images/-hsw9724/post/0401f4cf-fef0-4dfe-b9d7-3ba0f0b97fbf/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.46.52.png" alt=""></li>
</ul>
<p>xss 공격에 취약한 웹사이트를 탐색 후 xss공격을 위한 스크립트를 포함한 url 을 사용자에게 노출시킨다. 사용자가 해당 url을 클릭할 경우 취약한 웹사이트의 서버에 스크립트가 포함된 url을 통해 request를 전송하고 웹서버에서는 해당 스크립트를 포함한 response를 전송한다.</p>
<h4 id="xss-위험성">XSS 위험성</h4>
<ul>
<li>쿠키정보 및 센션 ID 획득</li>
<li>시스템 관리자 권한 획득</li>
<li>악성코드 다운로드 </li>
<li>거짓페이지 노출</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"fetch"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9fetch</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9fetch</guid>
            <pubDate>Wed, 11 Nov 2020 12:10:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/0fab7155-874e-4065-bad6-b37919af2af5/js.png" alt=""></p>
<h2 id="fetch-api">fetch API</h2>
<h3 id="--비동기-요청의-가장-대표적인-사례의-예는-네트워크-요청이-있다-다양한-네트워크-요청중-url을-요청하는-경우가-가장-흔한다-이를-가능하게-해주는-api가-바로-fetch-api-이다-주로-포털-사이트에-실시간으로-변하는-정보-날씨--주식-등의-정보를-url로-받아오는-역할을-한다">- 비동기 요청의 가장 대표적인 사례의 예는 네트워크 요청이 있다. 다양한 네트워크 요청중 URL을 요청하는 경우가 가장 흔한다. 이를 가능하게 해주는 API가 바로 fetch API 이다. 주로 포털 사이트에 실시간으로 변하는 정보, 날씨 , 주식 등의 정보를 URL로 받아오는 역할을 한다.</h3>
<h4 id="✓-fetch-를-사용하여-url-가져오기">✓ fetch 를 사용하여 URL 가져오기</h4>
<blockquote>
<pre><code class="language-js">fetch(&#39;http://example.com/movies.json&#39;)
  .then(response =&gt; response.json())
  .then(data =&gt; console.log(data));</code></pre>
</blockquote>
<h4 id="fetch는-네트워크-에서-json-으로-가져와-사용할수-있게해준다-fetch는-불러들이는-경우-취득할-리소스를-반드시-인수로-지정해야한다-또한-fetch는-promise-로-리턴한다">fetch는 네트워크 에서 JSON 으로 가져와 사용할수 있게해준다. fetch()는 불러들이는 경우, 취득할 리소스를 반드시 인수로 지정해야한다. 또한 fetch는 Promise 로 리턴한다.</h4>
<h4 id="✓실질적인-예시">✓실질적인 예시</h4>
<blockquote>
<pre><code class="language-js">var newsURL = &#39;http://localhost:5000/data/latestNews&#39;;
var weatherURL = &#39;http://localhost:5000/data/weather&#39;;
function getNewsAndWeather() {
  let obj = {};
  return fetch(newsURL)
  .then(response =&gt; response.json())
  .then(data =&gt; {
      obj[&#39;news&#39;] = data.data;
      return fetch(weatherURL);
    })
    .then((response)=&gt; response.json())
    .then(data =&gt; {
      obj[&#39;weather&#39;] = data;
      return obj;
    })  
}</code></pre>
</blockquote>
<h4 id="url을-통해서-가져온-결과값은-아래와-같다">URL을 통해서 가져온 결과값은 아래와 같다.</h4>
<blockquote>
<pre><code class="language-js">const obj = {
            news: [
              {
                row_id: 2,
                title: &#39;2021년 경제 성장률 전망 밝아&#39;,
                source: &#39;A신문&#39;,
                timestamp: &#39;2020/12/30&#39;,
              },
              {
                row_id: 3,
                title: &#39;코로나19 증가추세 대폭 하락해&#39;,
                source: &#39;BBC&#39;,
                timestamp: &#39;2020/12/29&#39;,
              },
              {
                row_id: 4,
                title: &#39;코드스테이츠 취업연계 파트너사 xxx건 돌파&#39;,
                source: &#39;스타트업 뉴스&#39;,
                timestamp: &#39;2020/12/31&#39;,
              },
            ],
            weather: { status: &#39;sunny&#39;, tempature: &#39;28&#39;, finedust: &#39;good&#39; },
          };</code></pre>
</blockquote>
<h4 id="또한-promise로-리턴을-받기때문에-promiseall-과-asyncawait-으로-표현할수-있다">또한 promise로 리턴을 받기때문에 Promise.all 과 async/await 으로 표현할수 있다.</h4>
<h3 id="✓-promise">✓ Promise</h3>
<blockquote>
<pre><code class="language-js">function getNewsAndWeatherAll() {
  return Promise.all([
    fetch(newsURL).then(response =&gt; response.json()), 
    fetch(weatherURL).then(response =&gt; response.json())
  ])
    .then((data) =&gt;{ 
    return {news: data[0].data, weather : data[1]};
  })
}</code></pre>
</blockquote>
<h3 id="✓-asyncawait">✓ async/await</h3>
<blockquote>
<pre><code class="language-js">async function getNewsAndWeatherAsync() {![](https://images.velog.io/images/-hsw9724/post/9aa63714-e102-4ec0-9f86-1d395f4a1372/js.png)
  let news = await fetch(newsURL).then(response =&gt; response.json())
  let weather = await fetch(weatherURL).then(response =&gt; response.json())
  return {news: news.data, weather : weather};
}</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"비동기"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9%EB%B9%84%EB%8F%99%EA%B8%B0</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9%EB%B9%84%EB%8F%99%EA%B8%B0</guid>
            <pubDate>Tue, 10 Nov 2020 16:00:58 GMT</pubDate>
            <description><![CDATA[<h2 id="동기-vs-비동기">동기 vs 비동기</h2>
<h3 id="동기-client-가-server에-요청하면-server가-요청을-처리할때-까지-client가-기다린다-이후-처리가-되면-일을-마자한다">동기: client 가 server에 요청하면 server가 요청을 처리할때 까지 client가 기다린다. 이후 처리가 되면 일을 마자한다.</h3>
<p><img src="https://images.velog.io/images/-hsw9724/post/d1ea85aa-ff77-45b7-8e30-9aa57762d5fa/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.28.10.png" alt=""></p>
<h3 id="비동기--client-가-server에-요청하면-server가-요청을-처리한다그리고client는-처리가-끝나지-않아도-다른일을-계속한다">비동기:  client 가 server에 요청하면 server가 요청을 처리한다.그리고client는 처리가 끝나지 않아도 다른일을 계속한다.</h3>
<p><img src="https://images.velog.io/images/-hsw9724/post/d432f799-6696-4df6-9d9d-ec0b7c37d0c0/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-11%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.28.44.png" alt=""></p>
<h3 id="1callback---어떤-함수에-인자로-쓰이는-함수">1.callback - 어떤 함수에 인자로 쓰이는 함수</h3>
<blockquote>
<pre><code class="language-js">const getDataFromFile = function (filePath, callback) {
  fs.readFile(filePath,&#39;utf8&#39;,(err, data)=&gt;{
    if(err){
      callback(err,null);
    }else{
      callback(err,data);
    }
  }) 
};</code></pre>
</blockquote>
<p>✓ <code>fs.readFile(filename[,option],callback)</code> 이 메소드는 파일을 읽는 메소드로 node.js의 내장모듈이다.  <a href="https://nodejs.org/dist/latest-v14.x/docs/api/fs.html#fs_fs_readfile_path_options_callback">참고</a>
✓ 콜백함수를 사용하다보면 callback hell 이 오는데 이를 방지하고자 promise를 사용한다.</p>
<h3 id="2promise---promise-는-3가지-기능이-있다">2.promise - promise 는 3가지 기능이 있다.</h3>
<h4 id="--대기pending--이행하거나-거부되지-않는-상태">- 대기(pending) : 이행하거나 거부되지 않는 상태</h4>
<h4 id="--이행fulfilled--연산이-성공적으로-완료됨">- 이행(fulfilled) : 연산이 성공적으로 완료됨</h4>
<h4 id="--거부rejected--연산이-실패됨">- 거부(rejected) : 연산이 실패됨</h4>
<h4 id="✓-promise-method">✓ promise Method</h4>
<ol>
<li><code>Promise.all(iterable)</code> - .all 메소드는 여러 프로미스의 결과를 모을때 유용합니다.</li>
<li><code>Promise.reject()</code> - 주어진 이유로 거부하는 Promise 객체를 반환됩니다.</li>
<li><code>Promise.resolve()</code> - 주언진 값으로 이행하는 Promise 객체를 반환합니다.</li>
</ol>
<h4 id="✓-prototype">✓ prototype</h4>
<ol>
<li><code>promise.prototype.catch()</code> - 에러를 잡아 반환한다.</li>
<li><code>promise.prototype.then()</code> - 성공적으로 값을 받아 반환한다.</li>
<li><code>promise.prototype.finally()</code> - 마지막으로 실행할 값을 받아 반환한다.</li>
</ol>
<blockquote>
<pre><code class="language-js">const getDataFromFilePromise = filePath =&gt; {
  return new Promise((resolve,reject) =&gt;{//resolve,reject를 매개변수로 사용한다. 
    fs.readFile(filePath, &#39;utf8&#39;,(err, data)=&gt;{
      if(err){
        reject(err);// 에러시 reject함수의 에러값 반환
      }else{
        resolve(data);// 성공시 resolve함수의 데이터값 반환
      }
  })
  }) 
};</code></pre>
</blockquote>
<p>✓ .then 사용하기</p>
<blockquote>
<pre><code class="language-js">const user1Path = path.join(__dirname, &#39;files/user1.json&#39;);
const user2Path = path.join(__dirname, &#39;files/user2.json&#39;);
const readAllUsersChaining = () =&gt; {
  return getDataFromFilePromise(user1Path)
  .then(user1=&gt;{//.then으로 연결되어 정상적인 값이 user1에 user1path값이 들어 있다.
    return getDataFromFilePromise(user2Path)
    .then(user2=&gt;{//.then으로 연결되어 정상적인 값이 user2에 user2path값이 들어 있다.
      return JSON.parse(`[${user1},${user2}]`)//문자열을 객체화 시켜준다.
    })
  })
}</code></pre>
</blockquote>
<p>✓ .all 사용하기</p>
<blockquote>
<pre><code class="language-js">const user1Path = path.join(__dirname, &#39;files/user1.json&#39;);
const user2Path = path.join(__dirname, &#39;files/user2.json&#39;);
const readAllUsers = () =&gt; {
  return Promise.all([getDataFromFilePromise(user1Path),getDataFromFilePromise(user2Path)])
  .then(([user1,user2])=&gt;{
    return JSON.parse(`[${user1},${user2}]`)
  })
}</code></pre>
</blockquote>
<h3 id="3-async--await---callback-함수와-promise-의-단점을-보완하고-개발자가-읽기-좋은-코드로-작성하게-도와준다암시적으로-promise를-사용하여-결과를-반환한다">3. async &amp; await - callback 함수와 promise 의 단점을 보완하고 개발자가 읽기 좋은 코드로 작성하게 도와준다.(암시적으로 promise를 사용하여 결과를 반환한다.</h3>
<blockquote>
<pre><code class="language-js">const user1Path = path.join(__dirname, &#39;files/user1.json&#39;);
const user2Path = path.join(__dirname, &#39;files/user2.json&#39;);
const readAllUsersAsyncAwait = async() =&gt; { //함수 앞에 async 를 붙여줘야한다.
  let user1 = await getDataFromFilePromise(user1Path)//await 을 붙여주어 promise의 값을 가져온다.
  let user2 = await getDataFromFilePromise(user2Path)
  returnJSON.parse(`[${user1},${user2}]`)
}</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Inheritance"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Inheritance</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Inheritance</guid>
            <pubDate>Wed, 28 Oct 2020 12:30:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/0fab7155-874e-4065-bad6-b37919af2af5/js.png" alt=""></p>
<h2 id="inheritance상속">Inheritance(상속)</h2>
<blockquote>
<pre><code class="language-js">var Human = function(name){
    this.name = name;//프로퍼티
}
Human.prototype.sleep = function(){//메소드 생성
    console.log(&#39;졸려&#39;);
}
var harry = new Human(&#39;harry&#39;);//인스턴스 생성
harry.sleep()//졸려</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">harry.__proto__ === Human.prototype //true;</code></pre>
</blockquote>
<p>✓harry 에 Human을 상속한 것이다. 그래서 harry 는 Human의 method 를 사용할수 있다.</p>
<h3 id="좀더-자세한-코드로-상속의-예를-보자">좀더 자세한 코드로 상속의 예를 보자.</h3>
<h3 id="class-가-생기기-이전">Class 가 생기기 이전</h3>
<blockquote>
<pre><code class="language-js">var Human = function(name){
    this.name = name;//프로퍼티
}
Human.prototype.sleep = function(){//메소드
  console.log(&#39;졸려&#39;);
}
var harry = new Human(&#39;harry&#39;);//인스턴스
//자식클래스생성
function Student(name){
  Human.call(this,name);
}
Student.prototype = new Human();
Student.prototype.constructor = Student;
Student.prototype.wake = function(){
  alert(&#39;일어나&#39;);
}
var banini = new Student(&#39;banini&#39;);
banini.sleep(); //졸려
banini.wake();// 일어나</code></pre>
</blockquote>
<h4 id="✓-3가지를-꼭-해줘야한다">✓ 3가지를 꼭!!!! 해줘야한다!!!!</h4>
<ul>
<li>상속해주기</li>
<li>자식 클래스의 this 값 맞춰주기</li>
<li>부모 클래스의 this 값 맞춰주기</li>
</ul>
<h4 id="--상속-해주기">- 상속 해주기</h4>
<blockquote>
<pre><code class="language-js"> Student.prototype = Object.create(Human.prototype);</code></pre>
</blockquote>
<h4 id="--자식-클래스의-객체-방향-맞춰주기">- 자식 클래스의 객체 방향 맞춰주기</h4>
<blockquote>
<pre><code class="language-js"> Student.prototype.constructor = Student;</code></pre>
</blockquote>
<h4 id="--부모-클래스의-객체-방향-맞춰주기">- 부모 클래스의 객체 방향 맞춰주기</h4>
<blockquote>
<pre><code class="language-js"> Human.call(this,name);//call 대신 apply도 가능 </code></pre>
</blockquote>
<h3 id="class-사용">Class 사용</h3>
<blockquote>
<pre><code class="language-js">class Human{
    constructor(name){
      this.name = name;
    }
  sleep(){
   console.log(&#39;졸려&#39;);
  }
}
var harry = new Human(&#39;harry&#39;);
class Student extends Human {
  constructor(name){
    super(name);
  }
  wake(){
  alert(&#39;일어나&#39;);
  }
}
var banini = new Student(&#39;banini&#39;);
banini.sleep();
banini.wake();</code></pre>
</blockquote>
<h4 id="✓-2가지를-꼭-해줘야한다">✓ 2가지를 꼭!!!! 해줘야한다!!!!</h4>
<ul>
<li><p>상속해주기</p>
</li>
<li><p>부모 클래스의 this 값 맞춰주기</p>
<h4 id="--상속-해주기-1">- 상속 해주기</h4>
<blockquote>
<pre><code class="language-js">class Student extends Human </code></pre>
</blockquote>
<h4 id="--부모-클래스의-객체-방향-맞춰주기-1">- 부모 클래스의 객체 방향 맞춰주기</h4>
<blockquote>
<p>```js
super(name)</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Object Oriented Programming(OOP)"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Object-Oriented-ProgrammingOOP</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Object-Oriented-ProgrammingOOP</guid>
            <pubDate>Wed, 28 Oct 2020 07:32:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/3e07b442-8d48-4837-8002-5b8f4e17b055/js.png" alt=""></p>
<h3 id="언어의--3가지-type">언어의  3가지 Type</h3>
<ul>
<li><p>Machine Languages </p>
<ul>
<li>0과 1로 이루어진 언어</li>
<li>사람이 읽기 힘들다</li>
</ul>
</li>
<li><p>Assembly  Languages</p>
<ul>
<li>기계어와 일대일 대응이 되는 저급언어</li>
<li>cpu에 따라 지원하는 operation(조작)이 다르다.</li>
<li>cpu 특성에 따르다 보니 여러가지 환경에서 사용할 수 없다.</li>
</ul>
</li>
<li><p>High-level Languages</p>
<ul>
<li>사람이 이해하기 쉽게 작성한 프로그래밍 언어이다</li>
<li>컴파일러나 인터프리터(둘다 번역기의 일종)에 의해 저급 프로그래밍 언어로 번역되어 실행된다.</li>
<li>여러가지 환경에서 사용이 가능하다.</li>
<li>절차 지향적 언어와 객체 지향적 언어가 존재한다.<ul>
<li>절차 지향적 언어 - 모든것을 순차적으로 진행하는 것</li>
<li>객체 지향적 언어 - 모든것을 객체로 사용하는 것</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="object-oriented-programmingoop-즉-객체지향프로그램의-4가지-특성">Object Oriented Programming(OOP) 즉, 객체지향프로그램의 4가지 특성</h2>
<h3 id="--우선-4가지의-특성을-말하기전-class-와-object-에-대해서-알아보자">- 우선 4가지의 특성을 말하기전 Class 와 Object 에 대해서 알아보자</h3>
<ul>
<li><p>class : 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다. 쉽게 붕어빵 틀이라고 생각해보자.(추상적이다)</p>
</li>
<li><p>object : class가 구체적인 실체인 instance가 되었을때 객체라고 한다. </p>
</li>
</ul>
<h3 id="1-encapsulation캡슐화정보은닉재사용">1. Encapsulation(캡슐화)(정보은닉)(재사용)</h3>
<ul>
<li>특정 객체가 독립적으로 역할을 수행하기 위해 필요한 데이터와 기능을 하나로 묶은 것이다. </li>
<li>변수와 함수같이 분산되어 있는 애들을 재활용 하기 힘들다. 하지만 캡슐화를 하면 재활용하기 쉬워진다.</li>
</ul>
<h3 id="2-inheritance상속재사용--확장">2. Inheritance(상속)(재사용 + 확장)</h3>
<ul>
<li>라이브러리를 통해서 남이 짜놓은 소스코드를 가져와 사용할수 있다. 하지만 의도에 맞게 수정하게 되면 다른 라이브러리가 되어 작동하지 않거나 불필요한 코드의 수정작업이 필요하다. 그렇기에 Inheritance 를 사용한다.
✓ 부모클래스의 속성과 기능을 그대로 가져와 사용할수 있고 필요에 따라 기능을 변경할경우 자식클래스의 해당 기능만 수정해주면 된다.</li>
</ul>
<h3 id="3-abstrction추상화모델링">3. Abstrction(추상화)(모델링)</h3>
<ul>
<li>추상화란 필요로 하는 정보만 표현해줌으로써 공통의 속성이나 기능을 묶어서 이름을 붙이는 것이다. 
ex) 전화기 - 우리는 번호를 누르고 말을하면되지만 그 안에서는 다양한 기능들이 실행되고있다.</li>
</ul>
<h3 id="4polymorphism다형성사용편의">4.Polymorphism(다형성)(사용편의)</h3>
<ul>
<li>오버라이딩과 오버로딩이 여기에 해당된다. 오버라이딩은 부모클래스의 메소드와 같은 시그니처(이름,인자)로 메소드를 재정의 하는 것을 말하고 오버로딩은 메소드의 이름만 같고 시그니처가 다른 것을 말한다.</li>
</ul>
<ul>
<li>클래스 중에 부모 자식 관계로 엮이지 않았다면 각각의 클래스 안에서 변수 명이나 메소드 명이 다른 클래스에 선언된 이름과 같아도 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Binary Search Tree"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Binary-Search-Tree</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Binary-Search-Tree</guid>
            <pubDate>Tue, 27 Oct 2020 15:59:56 GMT</pubDate>
            <description><![CDATA[<h3 id="binary-search-tree--tree의-종류중-하나-이진탐색트리는-최대-2개의-자식만-갖는다">Binary Search Tree : Tree의 종류중 하나, 이진탐색트리는 최대 2개의 자식만 갖는다.</h3>
<ul>
<li>이방법은 노드의 값이 정렬방법에 따라 순서가 존재하는데, 노드 왼쪽 서브트리에는 노드값보다 작은 값이, 오른쪽에는 노드값 보다 큰 값이 온다.</li>
</ul>
<p><img src="https://images.velog.io/images/-hsw9724/post/8875bc78-3817-48df-9789-a0b3f817e829/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-28%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.16.16.png" alt=""></p>
<h3 id="순회">순회</h3>
<p>그래프의 경우 비선형 구조이기 때문에 모든 노드를 탐색하기 위해 특별한 방법을 사용한다. 탐색 순서를 정하는 방법에 따라 DFS(Depth First Search), BFS(Breadth Firts Search)의 두 가지 방법이 있다. 트리또한 그래프의 일종이기 때문에 두가지 방법을 사용할수 있다.</p>
<h3 id="탐색-방법">탐색 방법</h3>
<ul>
<li>전위 순회(Preorder Traversal) : 부모 -&gt; 좌 -&gt; 우</li>
<li>중위 순회(Inorder Traversal): 좌 -&gt; 부모 -&gt; 우</li>
<li>후위 순회(Postorder Traversal): 좌 -&gt; 우 -&gt; 부모</li>
</ul>
<p><img src="https://images.velog.io/images/-hsw9724/post/85861a83-4084-4ea8-8fe7-192972253256/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-28%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.54.57.png" alt=""></p>
<h3 id="순회결과">순회결과</h3>
<ul>
<li>전위 순회 : 6 4 2 5 9 8 11 10 13</li>
<li>중위 순회 : 2 4 5 6 8 9 10 11 13</li>
<li>후위 순회 : 2 5 4 8 10 13 11 9 6</li>
</ul>
<h3 id="method">Method</h3>
<ul>
<li>insert(value) - 이진 탐색 트리에 노드를 추가합니다.</li>
<li>contains(value) - 이진 탐색 트리에 해당 노드가 존재하는지 여부를 반환합니다.</li>
<li>inorder(callback) - 이진 탐색 트리를 중위순회 합니다.</li>
</ul>
<blockquote>
<pre><code class="language-js">  insert(value) {
    let newnode = new BinarySearchTreeNode(value);
      if(this.value &gt; value){
        if(this.left === null){
          this.left = newnode
        }else{
          return this.left.insert(value)
        }
      }
      else if(this.value &lt; value){
        if(this.right === null){
          this.right = newnode
        }else{
          return this.right.insert(value)
        }
    }
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">  contains(value) {
  if(this.value === value){
    return true;
  }else if(this.value &lt; value){
    if(this.right === null){
      return false;
    }else if(this.right.contains(value)){
      return true;
    }
  }else if(this.value &gt; value){
    if(this.left === null){
      return false;
    }else if(this.left.contains(value)){
      return true;
    }
  }
  return false;
}</code></pre>
</blockquote>
<blockquote>
<p>```js
inorder(callback) {//중위순회 왼 루트 오른쪽 
 if(this.left !== null){
   this.left.inorder(callback)
 }
 callback(this.value)
 if(this.right !== null){
   this.right.inorder(callback)
 }
}</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Tree"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Tree</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Tree</guid>
            <pubDate>Tue, 27 Oct 2020 14:15:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/b1cc9453-0f6f-4a28-94de-421ddfc0639e/js.png" alt="">## Tree : 노드로 구성된 계층적 자료구조이다. 최상위 노드를 만들고, 노드에 child를 추가하고 그 child 에 child를 추가하는 형식
<img src="https://images.velog.io/images/-hsw9724/post/b2a793ed-c94b-4fac-b060-a9780033e43b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.18.57.png" alt=""></p>
<h4 id="--root--최상위-노드">- root : 최상위 노드</h4>
<h4 id="--depth--다른-노드에-접근하기-위한-거리">- depth : 다른 노드에 접근하기 위한 거리</h4>
<h4 id="--silbling--같은-부모를-가지면서-같은-depth에-존재하는-노드들">- silbling : 같은 부모를 가지면서 같은 depth에 존재하는 노드들</h4>
<h4 id="--edge--노드와-노드를-연결하는-선">- edge : 노드와 노드를 연결하는 선</h4>
<h4 id="--leaf--자식이-없는-노드">- leaf : 자식이 없는 노드</h4>
<h4 id="--height--부모노드에서-자식노드-사이의-edge개수">- height : 부모노드에서 자식노드 사이의 edge개수</h4>
<p><img src="https://images.velog.io/images/-hsw9724/post/560b24c9-b0f8-4fc3-8d8f-e68bbd835c62/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.07.08.png" alt=""></p>
<h4 id="✓-method">✓ Method</h4>
<ul>
<li>insertNode(value) - 트리에 노드를 추가합니다.</li>
<li>contains(value) - 트리에 해당 노드가 존재하는지 여부를 반환합니다.<h4 id="✓-사용">✓ 사용</h4>
<blockquote>
<pre><code class="language-js">insertNode(value) {
let tree = new TreeNode(value)
this.children.push(tree)
}</code></pre>
</blockquote>
</li>
</ul>
<blockquote>
<p>```js
contains(value) {
  if(this.value === value){
    return true
  }else{
    for(let el of this.children){
      if(el.contains(value)){
        return true;
      }
    }
    return false;
  }
}</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Graph"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Graph</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Graph</guid>
            <pubDate>Tue, 27 Oct 2020 12:49:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/f77fd6fb-d09f-42d8-82a6-b8ecc03e9f54/js.png" alt="">## Graph : 노드 그리고 노드와 노드를 연결하는 edge의 구성</p>
<p><img src="https://images.velog.io/images/-hsw9724/post/ea1fe969-b338-4fae-9a27-030ae9d23fb0/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.22.02.png" alt=""></p>
<h4 id="✓tip-그래프는-무방향undirected과-방향directed-일수있다-무방향은-연결된-노드가-대칭-즉-서로를-가리킨다고-볼수-있고-방향은-노드의-비대칭-즉-한쪽에서만-가리킨다고-볼수있다">✓tip 그래프는 무방향(undirected)과 방향(directed) 일수있다. &quot;무방향&quot;은 연결된 노드가 대칭, 즉 서로를 가리킨다고 볼수 있고 &quot;방향&quot;은 노드의 비대칭, 즉 한쪽에서만 가리킨다고 볼수있다.</h4>
<h3 id="how-to-search-graph">How to search &quot;graph&quot;</h3>
<h4 id="--dfsdepth-first-search--깊이-우선-검색">- DFS(Depth-First search)  깊이 우선 검색</h4>
<h4 id="--bfsbreadth-first-search-넓이-우선-검색">- BFS(Breadth-First search) 넓이 우선 검색</h4>
<p><img src="https://images.velog.io/images/-hsw9724/post/5342cc76-ba0b-4278-8be3-4c2d998e8f8c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.34.30.png" alt=""></p>
<h3 id="how-to-use-searching-skill">How to use searching skill</h3>
<h4 id="--stack-이나-queue-에-들어갔다가-빼주면서-출력-그리고-연결된-노드를-넣어준다">- Stack 이나 Queue 에 들어갔다가 빼주면서 출력 그리고 연결된 노드를 넣어준다</h4>
<h4 id="--dfs-는-주로-stack-으로-사용하고-bfs-는-queue-에서-사용한다">- DFS 는 주로 Stack 으로 사용하고, BFS 는 Queue 에서 사용한다.</h4>
<p>✓Reference - <a href="https://www.youtube.com/watch?v=_hxFgg7TLZQ">https://www.youtube.com/watch?v=_hxFgg7TLZQ</a></p>
<h3 id="인접-행렬과-인접-리스트">인접 행렬과 인접 리스트</h3>
<h4 id="--인접-리스트-정점을-노드의-키로-사용하며-해당-노드의-이웃들을-리스트에-저장한다">- 인접 리스트: 정점을 노드의 키로 사용하며 해당 노드의 이웃들을 리스트에 저장한다.</h4>
<p><img src="https://images.velog.io/images/-hsw9724/post/1866103c-f492-4957-94ae-892a1e9a191b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.47.01.png" alt=""></p>
<h4 id="--인접-행렬--행렬의-각-항목이-두-정점-간에-연결을-나타내는-vv-행렬이다">- 인접 행렬 : 행렬의 각 항목이 두 정점 간에 연결을 나타내는 V*V 행렬이다.</h4>
<p><img src="https://images.velog.io/images/-hsw9724/post/29729a7a-6416-4a4e-a496-1b596cbaeadb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.48.51.png" alt=""></p>
<h3 id="진입-차수와-진출-차수">진입 차수와 진출 차수</h3>
<h4 id="-한-정점에-도착하는-edge수">-한 정점에 도착하는 edge수</h4>
<h4 id="-한-정점에서-출발하는-edge-수">-한 정점에서 출발하는 edge 수</h4>
<p> 둘을 더하면 <code>차수</code> 가 된다.</p>
<h4 id="✓-method">✓ Method</h4>
<ul>
<li>addNode(node) - 그래프에 노드를 추가합니다.</li>
<li>addEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선을 추가합니다.</li>
<li>removeNode(node) - 그래프에서 노드를 삭제합니다.</li>
<li>removeEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선을 삭제합니다.</li>
<li>hasEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선 존재 여부를 반환합니다.</li>
<li>contains(node) - 그래프에 해당 노드가 존재하는지 여부를 반환합니다.</li>
</ul>
<h4 id="✓-사용">✓ 사용</h4>
<blockquote>
<pre><code class="language-js">addNode(node) {
    this.nodes[node] = this.nodes[node] || [];
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">contains(node) {
    return this.nodes.hasOwnProperty(node);
}</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">removeNode(node) {
  for (let key of this.nodes[node]) {
    this.removeEdge(node, key)
  }
  delete this.nodes[node]
}</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">hasEdge(fromNode, toNode) {
  for (let key of this.nodes[fromNode]) {
    if (key === toNode) {
      return true;
    }
  }
  return false;
}</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">addEdge(fromNode, toNode) {
  this.nodes[fromNode].push(toNode)
  this.nodes[toNode].push(fromNode)
}</code></pre>
</blockquote>
<blockquote>
<p>```js
removeEdge(fromNode, toNode) {
  let from = this.nodes[fromNode]
  let to = this.nodes[toNode]
  from.splice(from.indexOf(toNode), 1)
  to.splice(to.indexOf(fromNode), 1)
}</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Hash Table"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Hash-Table</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Hash-Table</guid>
            <pubDate>Sun, 25 Oct 2020 16:00:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/499c6748-deca-47a3-ad42-013c16ffe37f/js.png" alt="">## Hash Table : 키, 값 쌍을 저장하고 있는 자료구조
<img src="https://images.velog.io/images/-hsw9724/post/7af1f736-11db-4c6c-a1ba-9c3f8d162948/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.16.42.png" alt=""></p>
<ul>
<li>값이 들어오면 <code>hash function</code> 을 거쳐 <code>storage</code>에 있는 <code>bucket</code> 에 객체와 비슷한 형태로 <code>key 와 value</code>(tuples) 로 저장이 된다. 그래서 key 를 입력 하게 되면 value 가 출력 되는 형태이다.</li>
<li>hash table 은 미리 storage 의 사이즈를 정해서 값을 받는다. 그렇다면 많은 양이 들어오면 어떻게 해야하는가?
✓ storage 에 75% 가 차면 2배로 늘리고 25% 만 차지하면 반으로 나눠준다. 이렇게 메모리를 효율적으로 사용한다.<ul>
<li>정보를 입력하면 바로 출력되고 빠르기까지 한 hashtable 단점은?
✓해쉬 충돌 - 배열과 달리 자료구조가 정렬되어 있지 않다. 즉, 메모리 공간에서 주소에 순차적으로 값을 부여하지 않고, 렌덤하게 값을 부여하게 된다. 그래서 같은 buket 에 여러개의 tuple 이 존재 할수 있다. 이것을 해쉬 충돌이라고 한다.</li>
</ul>
</li>
</ul>
<h4 id="✓-method">✓ Method</h4>
<ul>
<li><p>insert(key, value) - 주어진 키와 값을 저장합니다. 이미 해당 키가 저장되어 있다면 값을 덮어씌웁니다.</p>
</li>
<li><p>retrieve(key) - 주어진 키에 해당하는 값을 반환합니다. 없다면 undefined를 반환합니다.</p>
</li>
<li><p>remove(key) - 주어진 키에 해당하는 값을 삭제하고 값을 반환합니다. 없다면 undefined를 반환합니다.</p>
</li>
<li><p>_resize(newLimit) - 해시 테이블의 스토리지 배열을 newLimit으로 리사이징하는 함수입니다. 리사이징 후 저장되어 있던 값을 전부 다시 해싱을 해주어야 합니다. 구현 후 HashTable 내부에서 사용하시면 됩니다.</p>
</li>
</ul>
<h4 id="✓-사용">✓ 사용</h4>
<blockquote>
<pre><code class="language-js">insert(key, value) {
    const index = hashFunction(key, this._limit);
    let buket = this._storage.get(index) 
    if(buket === undefined){
      buket = {}
    }
    buket[key]=value
    this._storage.set(index, buket)
    this._size++
    if(this._size &gt; this._limit*0.75){
      this._resize(this._limit*2)
    }
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js"> retrieve(key) {
    const index = hashFunction(key, this._limit);
    let buket = this._storage.get(index)
    if(buket===undefined){
      return undefined
    }
    return buket[key]
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">  remove(key) {
    const index = hashFunction(key, this._limit);
    let buket = this._storage.get(index)
    let result = buket[key]
    delete buket[key]
    this._size--
    if(this._size &lt; this._limit*0.25){
      this._resize(this._limit/2)
    }
    return result;
  }</code></pre>
</blockquote>
<blockquote>
<p>```js
  _resize(newLimit) {
    let old = this._storage
    this._size = 0
    this._limit = newLimit
    this._storage = LimitedArray(newLimit)
    old.each((buket)=&gt;{
      for(let key in buket){
        this.insert(key , buket[key])
      }
    })
    return this._storage
  }</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Linked list"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Linked-listHash-Table</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Linked-listHash-Table</guid>
            <pubDate>Sun, 25 Oct 2020 15:37:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/9aa98639-0965-49a4-b517-5d46fb84589f/js.png" alt="">## Linked list :노드의 연결로 이루어진 자료구조
<img src="https://images.velog.io/images/-hsw9724/post/27eb1595-fb05-4ed0-814c-1de31f6dfc09/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.48.07.png" alt=""></p>
<h3 id="노드에-다음번-노드의-주소를-가지고-있는-형태이다">노드에 다음번 노드의 주소를 가지고 있는 형태이다.</h3>
<ul>
<li>linked list 는 배열과 비교했을때 특정 데이터를 검색하는 시간이 오래 소유된다. index 를 통해서 찾는 배열과 달리 하나 하나  찾아봐야 하기 때문이다.
<img src="https://images.velog.io/images/-hsw9724/post/9578148a-e833-4635-b843-2bbfc26f9471/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.53.29.png" alt="">
✓ 노드 추가<img src="https://images.velog.io/images/-hsw9724/post/4df3cd51-2b09-469a-ba04-37585857ee53/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.53.45.png" alt="">
✓ 노드 삭제</li>
</ul>
<ul>
<li>두 자료를 보면 다음 요소의 주소를 알기 때문에 배열보다 요소를 추가하거나 삭제하기 쉽다. 하지만 다음요소의 주소만 알기 때문에 전에 있던 요소를 알수 없다.</li>
</ul>
<p><img src="https://images.velog.io/images/-hsw9724/post/a9bc4a1f-198f-4410-9c9b-c947cf20b6e8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.58.32.png" alt=""></p>
<ul>
<li>이와 같이 <code>단인 연결 리스트</code>와 <code>이중 연결 리스트</code>로 존재한다.
  linked list는 다음 요소의 정보만 가지고 있기 때문에 탐색이 불가능 한데, 이러한 단점을 보완할수 있는게 <code>이중 연결 리스트</code>다.</li>
</ul>
<h4 id="✓method">✓Method</h4>
<ul>
<li>addToTail(value) - 주어진 값을 연결 리스트의 끝에 추가합니다.</li>
<li>remove(value) - 주어진 값을 찾아서 연결을 해제(삭제)합니다</li>
<li>getNodeAt(index) - 주어진 인덱스의 노드를 찾아서 반환합니다. 값이 아니라 노드를 반환해야 하는 것에 주의하세요. 해당 인덱스에 노드가 없다면 undefined를 반환합니다.</li>
<li>contains(value) - 연결리스트에 주어진 값을 가지는 노드의 존재 여부를 반환합니다.</li>
<li>indexOf(value) - 주어진 값의 인덱스를 반환합니다. 없을 경우 -1을 반환합니다.</li>
</ul>
<h4 id="✓-사용">✓ 사용</h4>
<blockquote>
<pre><code class="language-js">  addToTail(value) {
    let node = new Node(value);
    if(!this.head){
      this.head = node;
      this.tail = node;
    }
    this.tail.next = node;
    this.tail = node;
    this._size ++
  } </code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">  remove(value) {
    let find = this.head
    while(find) {
      if(find.value === value){
        find.value = find.next.value
        find.next = find.next.next
        this._size --
      }
      find = find.next
    }
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">  getNodeAt(index) {
    let count = 0;
    let find = this.head
    while(find){
      if(count === index){
        return find
      }
      find = find.next
      count++
    }
    return undefined
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js"> contains(value) {
    let find = this.head
    while (find){
      if(find.value === value){
        return true;
      }
      find = find.next
    }
    return false;
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">  indexOf(value) {
    let count = 0;
    let find = this.head
    while(find){
      if(find.value === value ){
        return count 
      }
      find = find.next
      count++
    }
    return -1
  }</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">  size() {
    if(this._size &lt; 1){
      return 
    }
    return this._size
  }</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Stack , Queue"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Stack-Queue</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Stack-Queue</guid>
            <pubDate>Thu, 22 Oct 2020 06:36:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/a24494e9-4c8f-4bd8-ad68-d744157d52b7/js.png" alt="">## stack - 쌓여 있는 접시 (Last in First out)
<img src="https://images.velog.io/images/-hsw9724/post/65bd60cd-dda6-4b45-bc15-e9676cf8aef3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.38.38.png" alt=""></p>
<h3 id="stack-은-나중에-들어온-것이-먼저-나간다">Stack 은 나중에 들어온 것이 먼저 나간다.</h3>
<h4 id="✓-method">✓ Method</h4>
<ul>
<li>push(element) : stack의 맨 뒤에 값을 추가해준다.</li>
<li>pop() : stack의 맨 <code>뒤의 값</code>을 삭제해준다.</li>
<li>peek() : stack의 맨 <code>뒤의 값</code>을 리턴해준다.</li>
<li>size() : stack 에 들어있는 데이터의 총수를 리턴해준다.</li>
<li>isEmpty() : stack 이 비었으면 &#39;1&#39; , 그렇지 않으면 &#39;0&#39; 으로 리턴해준다.</li>
</ul>
<h4 id="✓-사용">✓ 사용</h4>
<blockquote>
<pre><code class="language-js">class Stack {
  constructor() {
    this.storage = {};
    this.top = 0;
  }
  size() {
    return Object.keys(this.storage).length 
  }
  push(element) {
    this.storage[this.top] = element
    this.top++
    return element
  }
  pop() {
    if(this.top &lt; 1){
      return;
    }
    this.top--
    let result = this.storage[this.top]
    delete this.storage[this.top]
    return result
  }
}
module.exports = Stack;</code></pre>
</blockquote>
<h2 id="queue---계산을-기다리는-사람들-first-in-first-out">Queue - 계산을 기다리는 사람들 (first in first out)</h2>
<p><img src="https://images.velog.io/images/-hsw9724/post/94b33c88-4779-4818-b8d7-41adf64dea1a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.30.02.png" alt=""></p>
<h3 id="queue-는-처음-들어온-것이-먼저-나간다">Queue 는 처음 들어온 것이 먼저 나간다.</h3>
<h4 id="✓-method-1">✓ Method</h4>
<ul>
<li>enqueue(element) : queue의 맨 뒤에 값을 추가해준다.</li>
<li>dequeue() : queue 맨 <code>앞의 값</code>을 삭제해준다.</li>
<li>peek() : queue 맨 <code>앞의 값</code>을 리턴해준다.</li>
<li>size() : queue 에 들어있는 데이터의 총수를 리턴해준다.</li>
<li>isEmpty() : queue 이 비었으면 &#39;1&#39; , 그렇지 않으면 &#39;0&#39; 으로 리턴해준다.</li>
</ul>
<h4 id="✓-사용-1">✓ 사용</h4>
<blockquote>
<pre><code class="language-js">class Queue {
  constructor() {
    this.storage = {};
    this.rear = 0;
    this.first = 0;
  }
  size() { 
    return Object.keys(this.storage).length}
  enqueue(element) {
   this.rear ++
   this.storage[this.rear] = element
   return element
  }
  dequeue() {
    if(this.rear &lt;1){
      return;
    }
    this.first++
    let result = this.storage[this.first]
    delete this.storage[this.first]
    return result
  }
}
module.exports = Queue;</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Data Structure Intro"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Data-Structure-Intro</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9Data-Structure-Intro</guid>
            <pubDate>Thu, 22 Oct 2020 06:05:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/ef1e8215-cdbb-4972-b4f5-11daa9137da0/js.png" alt="">## DATA : 문자,숫자,소리,그림,단어 등의 형태로된 의미 단위</p>
<h3 id="컴퓨터-언어--컴퓨터는-0-과-1-만-이해할-수-있다-그래서-complierlike-번역기-가-등장한다">컴퓨터 언어 : 컴퓨터는 &#39;0&#39; 과 &#39;1&#39; 만 이해할 수 있다. 그래서 complier(like 번역기) 가 등장한다.</h3>
<h4 id="--데이터-타입--컴퓨터에-0과-1-로-지정되어-있는-데이터를-인간이-사용하는-데이터들의-종류로-해석한-것">- 데이터 타입 : 컴퓨터에 0과 1 로 지정되어 있는 데이터를 인간이 사용하는 데이터들의 종류로 해석한 것</h4>
<ul>
<li><p>원시 타입(primitive type)</p>
<ul>
<li>정수, 실수</li>
<li>문자</li>
<li>논리(참, 거짓)</li>
</ul>
</li>
<li><p>사용자 타입(custom type)</p>
<ul>
<li>구조체, 클래스 등</li>
</ul>
</li>
</ul>
<h4 id="--자료구조data-structure">- 자료구조(Data Structure)</h4>
<ul>
<li>데이터 타입 vs 자료구조 <ul>
<li>데이터 타입 : 하나의 데이터를 어떻게 해석할 지 정의 한 것</li>
<li>자료구조 : 여러 데이터의 묶음을 어떻게 저장하고 사용할지 정의 한 것 ex) Array, Tree, Stack</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"bind"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9bind</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9bind</guid>
            <pubDate>Tue, 20 Oct 2020 15:57:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/f9517022-1765-4372-8adc-dfd2bccd7639/js.png" alt="">## bind : .call과 유사하게 this 및 인자를 바인딩 하나 당장 실행하지 않고 바인딩된 함수를 리턴</p>
<blockquote>
<pre><code class="language-js">fun.bind(this 값 , 인자1,인자2,...)</code></pre>
</blockquote>
<h3 id="bind-의-유용한-사용-예시">bind 의 유용한 사용 예시</h3>
<h3 id="case1-이벤트-핸들러">case1: 이벤트 핸들러</h3>
<blockquote>
<pre><code class="language-js"></code></pre>
</blockquote>
<div id = "target"></div>

<blockquote>
<pre><code class="language-js">let target = document.querySelector(&#39;#target&#39;)
let users = [&#39;김코딩&#39; , &#39;박해커&#39; , &#39;최초보&#39;]</code></pre>
</blockquote>
<hr>
<p>users.forEach(function(user){
let btn = document.createElement(&#39;button&#39;)
btn.textContent = user
btn.onclick = handleClick
});</p>
<hr>
<p>function handleClick(){
  console.log(this)
}</p>
<p>🚫위와 같이 코드를 작성하면, 동적으로 생성되는 각각의 버튼을 클릭하면 button 엘리먼트 자체가 콘솔에 표시될 것입니다. 이 때 bind를 이용해 출력하고 싶은 값을 this로 넘기거나, 혹은 인자로 보낼 수 있습니다.</p>
<h4 id="solution-1">solution 1</h4>
<blockquote>
<pre><code class="language-js">let target = document.querySelector(&#39;#target&#39;)
let users = [&#39;김코딩&#39;, &#39;박해커&#39;, &#39;최초보&#39;]</code></pre>
</blockquote>
<hr>
<p>users.forEach(function(user) {
  let btn = document.createElement(&#39;button&#39;)
  btn.textContent = user
  btn.onclick = handleClick.bind(user) // 이렇게 바꿔볼 수 있습니다.
  target.appendChild(btn)
});</p>
<hr>
<p>function handleClick() {
  console.log(this)
}</p>
<h4 id="solution-2">solution 2</h4>
<blockquote>
<pre><code class="language-js">let target = document.querySelector(&#39;#target&#39;)
let users = [&#39;김코딩&#39;, &#39;박해커&#39;, &#39;최초보&#39;]</code></pre>
</blockquote>
<hr>
<p>users.forEach(function(user) {
  let btn = document.createElement(&#39;button&#39;)
  btn.textContent = user
  btn.onclick = handleClick.bind(null, user) // 굳이 this를 이용하지 않더라도 인자로 넘길 수도 있습니다.
  target.appendChild(btn)
});</p>
<hr>
<p>function handleClick(user) {
  console.log(user)
}</p>
<h3 id="case2-settimeout-이-함수는-명시적으로-항상-window객체를-this-바인딩하는-특징이-있다">case2: setTimeout (이 함수는 명시적으로 항상 window객체를 this 바인딩하는 특징이 있다.)</h3>
<blockquote>
<pre><code class="language-js">class Rectangle {
  constructor(width, height) {
    this.width = width
    this.height = height
  }
  getArea() {
    return this.width * this.height
  }
  printArea() {
    console.log(&#39;사각형의 넓이는 &#39; + this.getArea() + &#39; 입니다&#39;)
  }
  printSync() {
    // 즉시 사각형의 넓이를 콘솔에 표시합니다
    this.printArea()
  }
  printAsync() {
    // 1초 후 사각형의 넓이를 콘솔에 표시합니다
    setTimeout(this.printArea, 2000)
  }
}</code></pre>
</blockquote>
<hr>
<p>let box = new Rectangle(40, 20)
box.printSync() // &#39;사각형의 넓이는 800 입니다&#39;
box.printAsync() // 에러 발생!</p>
<h4 id="solution-1-1">solution 1</h4>
<blockquote>
<pre><code class="language-js">prinAsync(){
  setTimeout(this.printArea.bind(this),2000)
}</code></pre>
</blockquote>
<h4 id="solution-2-1">solution 2</h4>
<blockquote>
<pre><code class="language-js">printAsync(){
  setTimeout(() =&gt; {
    this.printArea()
  },2000)
}</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"call,apply"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9callapply</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9callapply</guid>
            <pubDate>Tue, 20 Oct 2020 15:26:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/ee8257ba-9469-4958-9c2f-28674a186649/js.png" alt="">### 메소드를 사용한 함수의 실행을 보자.</p>
<blockquote>
<pre><code class="language-js">function foo(){
  return &#39;bar&#39;
}
foo()//&#39;bar&#39;
foo.call()//&#39;bar&#39;
foo.apply()//&#39;bar&#39;</code></pre>
</blockquote>
<p>✓ .call, .apply 호출은 명시적으로 this 를 지정하고 싶을때 사용! this는 인자의 첫번째 값이 된다.</p>
<h3 id="예제-apply-을-이용해-배열인자를-풀어서-넘기기">예제 .apply 을 이용해 배열인자를 풀어서 넘기기</h3>
<blockquote>
<pre><code class="language-js">Math.max.apply (null ,[5,4,3,2,1]) //5 
//apply 는 숫자들의 집합으로 만들어 준다.</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">Math.max.call (null , ...[5,4,3,2,1])//5
//call 은 들어온 그대로를 사용한다. ...을 이용하여 배열을 벗겨준다.</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">Math.max(...[5,4,3,2,1])//5</code></pre>
</blockquote>
<h3 id="예제-call-prototype-을-빌려-실행하기">예제 .call Prototype 을 빌려 실행하기</h3>
<blockquote>
<pre><code class="language-js">let allDivs = document.querySelectorAll(&#39;div&#39;);// Nodelist 라는 유사배열
  [].map.call(allDivs, function(el){ // 유사배열이라 map을 사용할수 없었지만, call을 통해 Array Prototype 으로 map 메소드를 빌려 this 를 넘겨 map을 사용.
    return el.className
  })</code></pre>
</blockquote>
<h3 id="객체-지향에서의-call-apply-사용-예제">객체 지향에서의 call, apply 사용 예제</h3>
<blockquote>
<p>```js
function Product(name, price){
  this.name = name
  this.price = price
}
function Food(name,price){
  Product.apply(this, name, price)//인자가 많을시 product.apply(this, argument)
  this.category = &#39;food&#39;
}
let cheese = newFood(&#39;feta&#39;,5000) //cheese 는 Product 이면서 Food</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"this"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9this</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A85%EB%B6%84%EC%BD%94%EB%94%A9this</guid>
            <pubDate>Tue, 20 Oct 2020 12:31:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/6d3479ba-0405-4a21-b9e3-552cfe562127/js.png" alt="">## this : 함수 실행시 호출 방법에 결정되는 특별한 객체 &quot;함수 실행시 결정&quot;</p>
<h3 id="함수실행의-5가지-방법">함수실행의 5가지 방법</h3>
<h4 id="1-global---정확히는-실행은-아님-전역에서-this를-참조-할-때를-의미">1. Global - 정확히는 실행은 아님. 전역에서 this를 참조 할 때를 의미</h4>
<p><code>console.log(this)</code></p>
<h4 id="2-function-호출">2. function 호출</h4>
<p><code>foo()</code></p>
<h4 id="3-method-호출">3. Method 호출</h4>
<p><code>obj.foo()</code></p>
<h4 id="4-new-키워드를-이용한-생산자-호출">4. new 키워드를 이용한 생산자 호출</h4>
<p><code>new foo()</code></p>
<h4 id="5-call-또는-apply-호출">5. .call 또는 .apply 호출</h4>
<p><code>foo.call()</code> , <code>foo.apply</code></p>
<h3 id="함수실행에-따른-this-binding-패턴">함수실행에 따른 this binding 패턴</h3>
<table>
<thead>
<tr>
<th align="center">패턴</th>
<th align="center">바인딩 객체</th>
<th align="center">내용</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Method 호출</td>
<td align="center">부모객체(실행시점 온점 왼쪽)</td>
<td align="center">하나의 객체에 값과 연관된 메소드를 묶어서 사용할떄 주로 사용</td>
</tr>
<tr>
<td align="center">new 키워드를 이용한 생산자 호출</td>
<td align="center">새롭게 생성된 인스턴스 객체</td>
<td align="center">객체지향 프로그램에서 주로 사용</td>
</tr>
<tr>
<td align="center">call 또는 apply호출</td>
<td align="center">첫번째 인자로 전달된 객체</td>
<td align="center">this 값을 특정 할 때 사용, 특히 apply 의 경우 배열의 엘리먼트를 풀어서 인자로 넘기고자 할때 유용</td>
</tr>
</tbody></table>
<h3 id="method-호출--객체메소드-와-같이-객체-내에-메소드를-호출하는-방법">Method 호출 : 객체.메소드() 와 같이 객체 내에 메소드를 호출하는 방법</h3>
<blockquote>
<pre><code class="language-js">let counter1 ={
  value: 0,
  increase:functon(){
    this.value++//메소드 호출시 this 는 counter1을 가리킴
  },
  decrease: function(){
    this.value--
  },
  getValue: function(){
    return this.value
  }
}
counter1.increase()
counter1.increase()
counter1.increase()
counter1.decrease()
counter1.getValue() // 2</code></pre>
</blockquote>
<p>여러개의 카운터를 만들려면??</p>
<blockquote>
<pre><code class="language-js">function makeCounter(){
  return{
    value: 0,
    increase:functon(){
      this.value++// 메소드 호출을 할 경우, this는 makeCounter 함수가 리턴하는 익명의 객체
    },
    decrease: function(){
      this.value--
    },
    getValue: function(){
      return this.value
    }
  }
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() //1
let counter2 = makeCounter()
counter2.increase()
counter2.increase()
counter2.increase()
counter2.increase()
counter2.getValue() //4</code></pre>
</blockquote>
<h3 id="생산자-호출-객체메소드와-같이-객체-내에-메소드를-호출하는-방법과-비슷하지만-new-키워드를-이용하는-점이-다르다">생산자 호출 :객체.메소드()와 같이 객체 내에 메소드를 호출하는 방법과 비슷하지만 new 키워드를 이용하는 점이 다르다.</h3>
<blockquote>
<pre><code class="language-js">class Counter {
  constructor() {
    this.value = 0; // 생성자 호출을 할 경우, this는 new 키워드로 생성한 Counter의 인스턴스입니다
  }
  increase() {
    this.value++
  }
  decrease() {
    this.value--
  }
  getValue() {
    return this.value
  }
}
let counter1 = new Counter() // 생성자 호출
counter1.increase()
counter1.getValue() // 1</code></pre>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[하루5분코딩"Arrow Function"]]></title>
            <link>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A8%EC%BD%94%EB%94%A95%EB%B6%84Arrow-Function</link>
            <guid>https://velog.io/@-hsw9724/%ED%95%98%EB%A3%A8%EC%BD%94%EB%94%A95%EB%B6%84Arrow-Function</guid>
            <pubDate>Tue, 20 Oct 2020 11:37:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/-hsw9724/post/5f03af0b-af46-4cb5-9921-ff5edce8878b/js.png" alt="">## Arrow Function : 함수표현식의 축약</p>
<h4 id="-함수-표현식-">-함수 표현식-</h4>
<blockquote>
<pre><code class="language-js">const add = function(x, y){
  return x + y
}</code></pre>
</blockquote>
<h4 id="-arrowfunction-">-ArrowFunction-</h4>
<blockquote>
<pre><code class="language-js">const add = (x, y) =&gt; {
  return x + y
}</code></pre>
</blockquote>
<p>‼️ call,apply,bind 사용 불가</p>
<p>✓ 즉, &quot;function&quot; 대신 &quot;=&gt;&quot;를 사용하는 것이다.</p>
<h3 id="tip-함수안에--return--만-존재할-경우-생략이-가능-하다-but-중괄호-도-같이-생략해야한다">tip. 함수안에  return  만 존재할 경우 생략이 가능 하다 But! 중괄호{} 도 같이 생략해야한다.</h3>
<h4 id="ex">ex)</h4>
<blockquote>
<pre><code class="language-js">const add = (x , y) =&gt; x + y //정상 작동</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">const add = (x , y) =&gt; (x + y) //정상 작동 (소괄호()사용가능)</code></pre>
</blockquote>
<blockquote>
<pre><code class="language-js">const add = (x , y) =&gt; {x + y}//undefined</code></pre>
</blockquote>
<p>tip. 함수안에 표현식이 두줄이상일 경우 return 과 중괄호로 표현해주는 것이 좋다.</p>
<h3 id="arrow-function-사용--closure">Arrow Function 사용 : closure</h3>
<h4 id="-함수-표현식--1">-함수 표현식-</h4>
<blockquote>
<pre><code class="language-js">const adder = function(x){
  return function(y){
    return x + y
  }
}
adder(5)(7)//12</code></pre>
</blockquote>
<h4 id="-arrow-function-">-Arrow Function-</h4>
<blockquote>
<pre><code class="language-js">const adder = (x) =&gt; {
  return(y) =&gt; {
     return x + y
   }
 }
 adder(5)(7)//12</code></pre>
</blockquote>
<h4 id="축약-return-과-를-같이-없애주고-파라미터가-1개일때--도-없애준다">축약 return 과 {}를 같이 없애주고 파라미터가 1개일때 () 도 없애준다.</h4>
<blockquote>
<pre><code class="language-js">const adder = x =&gt; {
  return y =&gt; x + y 
}</code></pre>
</blockquote>
<h4 id="남은-리턴도-생략">남은 리턴도 생략</h4>
<blockquote>
<p>```js
const adder = x =&gt; y =&gt; x + y</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>