<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyeok-jin.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요</description>
        <lastBuildDate>Wed, 22 Sep 2021 20:59:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyeok-jin.log</title>
            <url>https://images.velog.io/images/hyeok-jin/profile/1d41056d-7641-47da-8cd7-18834bf4caff/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyeok-jin.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyeok-jin" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Docker] 시작하기 with WSL2]]></title>
            <link>https://velog.io/@hyeok-jin/Docker-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-with-WSL2</link>
            <guid>https://velog.io/@hyeok-jin/Docker-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-with-WSL2</guid>
            <pubDate>Wed, 22 Sep 2021 20:59:32 GMT</pubDate>
            <description><![CDATA[<p>wsl2 ubuntu 20.04 설치</p>
<ol>
<li><p>이전 버전의 docker 가 설치 되있으면 삭제</p>
<pre><code>$ sudo apt-get remove docker docker-engine docker.io containerd runc</code></pre></li>
<li><p>apt 패키지 업데이트</p>
<pre><code>$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release</code></pre><ul>
<li>apt-get update : 시스템(리눅스) 안의 apt 패키지 리스트를 최신상태로 업데이트</li>
<li>apt-transport-https : 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 한다.</li>
<li>ca-certificates : certificate authority 에서 발행되는 디지털 서명. SSL 인증서의 PEM 파일이 포함되어 있어 SSL 기반 앱이 SSL 연결이 되어있는지 확인할 수 있다.</li>
<li>curl : Client URL, 서버와 통신할 수 있는 커맨드 명령어 툴이다</li>
<li>gnupg : GNU Privacy Guard, 데이터를 암호화 하고, 전자 서명을 만들 수 있는 암호화 도구</li>
<li>lsb-release : 리눅스 배포판을 식별하는 간단한 도구</li>
</ul>
</li>
<li><p>Docker 공식 GPG Key 추가</p>
<pre><code>$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</code></pre><ul>
<li>curl 옵션<ul>
<li>추가값이 필요하지 않은 옵션의 경우 붙여서 쓸 수 있다</li>
<li>-f : http 헤더의 Content-Type 을 multipart/form-data 로 보낸다</li>
<li>-s : 진행과정/에러를 보여주지 않는다</li>
<li>-S : -s 옵션과 같이 사용시 에러발생인경우만 표시</li>
<li>-L : 301/302 응답시 자동 리다이랙트 허용</li>
</ul>
<ol start="4">
<li>도커 엔진 설치<pre><code>$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io</code></pre></li>
</ol>
</li>
</ul>
</li>
<li><p>도커 시작하기</p>
<pre><code>$ sudo service docker</code></pre><ul>
<li>wsl 은 systemctl 명령어가 없고 대신 service 를 통해 실행이 가능하다.</li>
</ul>
</li>
</ol>
<p>출처: <a href="https://docs.docker.com/engine/install/ubuntu/">https://docs.docker.com/engine/install/ubuntu/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 문자열 메소드]]></title>
            <link>https://velog.io/@hyeok-jin/JavaScript-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C</link>
            <guid>https://velog.io/@hyeok-jin/JavaScript-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C</guid>
            <pubDate>Mon, 16 Aug 2021 12:36:47 GMT</pubDate>
            <description><![CDATA[<ul>
<li>str.toUpperCase() / str.toLowerCase() : 대문자로 치환 / 소문자로 치환<pre><code>let desc = &quot;Hi guys. Nice to meet you.&quot;
desc.toUpperCase()
desc.toLowerCase()</code></pre></li>
<li>str.indexOf(text)<ul>
<li>text 가 있으면 해당 위치를 반환.</li>
<li>없으면 -1 을 반환<blockquote>
<p>if문을 쓸때 주의!!
없으면 -1 반환 첫번째 문자에 걸리면 0을 반환하는 걸 기억!!</p>
</blockquote>
</li>
</ul>
</li>
<li>str.slice(n, m)<ul>
<li>n 부터 m 까지 문자열 반환<pre><code>let desc = &quot;abcdefg&quot;
desc.slice(2) // &quot;cdefg&quot; 2부터 끝까지
desc.slice(0, 4) // &quot;abcd&quot; desc[0] 부터 desc[4] 직전까지
desc.slice(2, -2) // &quot;cde&quot; desc[2] 부터 desc[-2] 직전까지</code></pre></li>
</ul>
</li>
<li>str.substring(n, m)<ul>
<li>n 과 m 사이의 문자열 반환</li>
<li>n, m 바꿔도 됨</li>
<li>음수는 0 으로 인식</li>
</ul>
</li>
<li>str.substr(n, m)<ul>
<li>n 부터 m 개의 문자열 반환</li>
</ul>
</li>
<li>str.trim()<ul>
<li>앞 뒤 공백 제거</li>
</ul>
</li>
<li>str.repeat(n)<ul>
<li>n 번 반복</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 숫자, 수학 methode(Number, Math)]]></title>
            <link>https://velog.io/@hyeok-jin/JavaScript-%EC%88%AB%EC%9E%90-%EC%88%98%ED%95%99-methodeNumber-Math</link>
            <guid>https://velog.io/@hyeok-jin/JavaScript-%EC%88%AB%EC%9E%90-%EC%88%98%ED%95%99-methodeNumber-Math</guid>
            <pubDate>Mon, 16 Aug 2021 10:48:37 GMT</pubDate>
            <description><![CDATA[<ul>
<li>toString()<ul>
<li>숫자를 문자열로 변환</li>
<li>괄호 안에 숫자가 주어지면 해당 진법으로 변환<pre><code>let num = 10
</code></pre></li>
</ul>
</li>
</ul>
<p>num.toString() // &quot;10&quot;
num.toString(2) // &quot;1010&quot;</p>
<p>let num2 = 255
num2.toString(16) // &quot;ff&quot;</p>
<pre><code>
- Math.PI
  - 원주율값 3.14...
- Math.ceil() : 올림
- Math.floor() : 내림
- Math.round() : 반올림
- Math.random() : 0-1 사이의 랜덤 숫자
- Math.max() / Math.min() : 최대 / 최소
- Math.abs() : 절대값
- Math.pow(n, m) : 제곱
- Math.sqrt() : 제곱근


- toFixed() : 괄호 안의 정수만큼 소숫점을 표현한 **&quot;문자열&quot;** 을 반환</code></pre><p>let userRate = 30.1234
userRate.toFixed(2) // &quot;30.12&quot;
userRate.toFixed(0) // &quot;30&quot;
userRate.toFixed(6) // &quot;30.123400&quot;</p>
<pre><code>
- isNaN() : NaN 임을 판단하기 위해서는 이 함수를 사용해야만함.</code></pre><p>let x = Number(&#39;x&#39;) // NaN</p>
<p>x == NaN // false
x === NaN // false
NaN == NaN // false</p>
<p>isNaN(x) // true
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 심볼(Symbol)]]></title>
            <link>https://velog.io/@hyeok-jin/JavaScript-%EC%8B%AC%EB%B3%BCSymbol</link>
            <guid>https://velog.io/@hyeok-jin/JavaScript-%EC%8B%AC%EB%B3%BCSymbol</guid>
            <pubDate>Mon, 19 Jul 2021 09:36:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>심볼은 유일한 식별자</p>
</blockquote>
<pre><code>const a = Symbol(&#39;id&#39;); // new를 붙이지 않는다!
// symbol 생성시 &#39;id&#39;같이 설명을 문자열로 전달 가능.
// 생성에는 아무런 영향이 없다
const b = Symbol(&#39;id&#39;);

console.log(a); // Symbol(id)
console.log(b); // Symbol(id)

console.log(a === b); // false</code></pre><blockquote>
<p>심볼은 이전 포스팅에서 언급된 Object.keys(), Object.values(), Object.entries(), for...in문 등으로 출력되지 않는다.</p>
</blockquote>
<pre><code>const id = Symbol(&#39;id&#39;);
const user = {
  name : &#39;Mike&#39;,
  age : 30,
  [id] : &#39;myid&#39;
}

console.log(Object.keys(user)); // [&#39;name&#39;, &#39;age&#39;]
console.log(Object.values(user)); // [&#39;Mike&#39;, 30]
for(let a in user) { // name, age
  console.log(user[a]);
}</code></pre><blockquote>
<p>심볼은 특정 객체에 원본 객체를 건드리지 않는 선에서 값을 추가하고 싶을때 유용하게 사용가능하다</p>
</blockquote>
<ul>
<li><p>유일성을 보장받고,</p>
</li>
<li><p>일반적인 순회 출력 옵션에서 출력이 되지 않기 때문</p>
</li>
<li><p>Symbol.for() : 전역 심볼</p>
<pre><code>const a = Symbol.for(&#39;id&#39;);
const b = Symbol.for(&#39;id&#39;);

console.log(a === b); // true
console.log(Symbol.keyFor(a)); // &quot;id&quot;</code></pre><ul>
<li>가끔 전역 변수 처럼 이름이 같으면, 같은 객체를 가르켜야하는 경우가 있음. 이럴 때 사용</li>
<li>없으면 만들고, 있으면 가져오기 때문에 <strong>하나</strong>의 심볼임을 보장 받음</li>
<li>Symbol.keyFor()을 쓰면 심볼의 이름을 알 수 있다<ul>
<li>일반적임 심볼은 description을 쓰면 알 수 있다.<pre><code>const id = Symbol(&#39;id 입니다&#39;);
console.log(id.description); // &quot;id 입니다&quot;</code></pre></li>
</ul>
</li>
</ul>
</li>
<li><p>숨겨진 Symbol key 보는 법</p>
<ul>
<li>Object.getOwnPropertySymbols() : 객체의 심볼 출력</li>
<li>Reflect.ownKeys() : 객체의 심볼을 포함한 키값 출력</li>
</ul>
</li>
<li><p>사용 예제</p>
<pre><code>// 다른 개발자가 만들어 놓은 객체
const user = {
name : &#39;Mike&#39;,
age : 30,
};
</code></pre></li>
</ul>
<p>// 내가 작업
// user.showName = function() {};
const showName = Symbol(&#39;show name&#39;);
user[showName] = function() {
  console.log(&#39;my code. result: &#39;, this.name);
};</p>
<p>user<a href="">showName</a>; // 추가한 함수 실행. 결과 : Mike</p>
<p>// 객체가 선언된 부분과 매우 거리가 멀어 내가 작업할때 인지하기 어렵다고 가정
// 내가 객체에 값을 추가 했어도 여기에 영향이 안가게 하고 싶을 때 심볼 사용
// 다른 개발자가 만들어 놓은 객체에 대한 loop문
for(let key in user) {
  console.log(<code>His ${key} is ${user[key]}.</code>)
}</p>
<p>```</p>
<p>출처 : <a href="https://www.youtube.com/watch?v=E9uCNn6BaGQ">https://www.youtube.com/watch?v=E9uCNn6BaGQ</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 계산된 프로퍼티(Computed property), 객체 메소드(Object methods)]]></title>
            <link>https://velog.io/@hyeok-jin/JavaScript-%EA%B3%84%EC%82%B0%EB%90%9C-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0Computed-property-%EA%B0%9D%EC%B2%B4-%EB%A9%94%EC%86%8C%EB%93%9CObject-methods</link>
            <guid>https://velog.io/@hyeok-jin/JavaScript-%EA%B3%84%EC%82%B0%EB%90%9C-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0Computed-property-%EA%B0%9D%EC%B2%B4-%EB%A9%94%EC%86%8C%EB%93%9CObject-methods</guid>
            <pubDate>Mon, 19 Jul 2021 08:49:08 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>계산된 프로퍼티(Compited property)
[] 를 이용해서 객체의 변수명에 미리 계산된 변수를 넣는 것이 가능하다.
[1 + 4] 혹은 [&#39;안녕&#39; + &#39;하세요&#39;] 와 같이 식 자체가 들어가는 것도 가능.</p>
<pre><code>let a = &#39;age&#39;;
const user = {
  name : &#39;Mike&#39;,
  [a] : 30 // age : 30 과 같은 의미
}</code></pre></li>
<li><p>객체 메소드(Object methods)</p>
<ul>
<li><p>Object.assign() : 객체 복사
<code>const newUser = Object.assign({}, user)</code>
user라는 객체를 빈 객체( {} )에 복사</p>
<p><code>const newUser = Object.assign({gender : &#39;male&#39;}, user)</code>
user라는 객체를 {gender : &#39;male&#39;}에 더해서 복사
만약 키값이 중복되는 경우 user 객체의 값으로 덮어씌움.</p>
<p><code>Object.assign(user, info1, info2)</code> 과 같이 여러 개를 합쳐서 복사 가능</p>
</li>
<li><p>Object.keys() : 키 배열 반환</p>
</li>
<li><p>Object.values() : 값 배열 반환</p>
</li>
<li><p>Object.entries() : 키, 값 둘 다 배열로 반환</p>
</li>
<li><p>Object.fromEntries() : 키, 값 쌍으로 묶인 배열을 넣으면 객체로 반환</p>
</li>
</ul>
</li>
</ul>
<p>출처 : <a href="https://www.youtube.com/watch?v=6NZpyA64ZUU">https://www.youtube.com/watch?v=6NZpyA64ZUU</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 생성자 함수]]></title>
            <link>https://velog.io/@hyeok-jin/JavaScript-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hyeok-jin/JavaScript-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 19 Jul 2021 08:25:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>생성자란?
  OOP(객체 지향 프로그래밍)에서 객체 생성 시 호출되는 객체의 초기화를 담담하는 서브 루틴</p>
</blockquote>
<blockquote>
<p>사용 이유?
  여러 개의 객체를 생성할 때 일일이 생성하는 것 보다 잘 초기화 되어있는 생성자를 통해 생성하면 캡슐화 및 코드의 재활용성이 높아진다</p>
</blockquote>
<blockquote>
<p>자바스크립트에서의 생성자
  별도의 생성자가 있는 것은 아니지만, 일종의 흉내내기 인듯 하다.
아무 함수에다 new 를 붙여서 변수에 할당해주면 생성자의 역할을 한다.</p>
</blockquote>
<pre><code>function Item(title, price) {
  // this = {};

  this.title = title;
  this.price = price;
  this.showPrice = () =&gt; {
    console.log(`가격은 ${price}원 입니다.`)
  }

  // return this;
}

const item1 = new Item(&#39;인형&#39;, 3000);
const item2 = new Item(&#39;가방&#39;, 5000);
const item3 = new Item(&#39;지갑&#39;, 9000);

console.log(item1, item2, item3);

item3.showPrice();</code></pre><p>new 를 통해 생성하면 생성자는 암묵적으로 <code>this = {}</code>를 통해 빈 객체를 할당하고, <code>return this;</code>로 객체를 반환해준다.</p>
<blockquote>
<p>new 없이 그냥 함수를 할당하면 에러가 나지는 않으나, 반환하는 값이 없으니깐 undefined 가 되겠지요?</p>
</blockquote>
<p>정리 : OOP 를 쓰고있다면 캡슐화!!</p>
<p>출처 : <a href="https://youtu.be/8hrSkOihmBI">https://youtu.be/8hrSkOihmBI</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 변수, 호이스팅, TDZ(Temporal Dead Zone)]]></title>
            <link>https://velog.io/@hyeok-jin/JavaScript-%EB%B3%80%EC%88%98-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-TDZTemporal-Dead-Zone</link>
            <guid>https://velog.io/@hyeok-jin/JavaScript-%EB%B3%80%EC%88%98-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-TDZTemporal-Dead-Zone</guid>
            <pubDate>Mon, 19 Jul 2021 06:47:45 GMT</pubDate>
            <description><![CDATA[<p>변수는 var, let, const 3 가지가 있다.</p>
<ul>
<li><p>var, let</p>
<ul>
<li>var는 선언한 후에 다시 선언이 가능.<pre><code>var name = &#39;Mike&#39;;
console.log(name); // Mike
</code></pre></li>
</ul>
<p>var name = &#39;Jane&#39;;
console.log(name); // Jane</p>
<pre><code>* var는 선언하기 전에 사용할 수 있다. (호이스팅)
그러나 name 이라는 변수만 호이스팅 되고, 값 할당은 호이스팅 안됨.</code></pre><p>console.log(name);
var name = &#39;Mike&#39;;</p>
<pre><code>&gt; 호이스팅이란? 
스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동

* let은 실제로는 호이스팅이 되지만, 호이스팅 되지 않는것처럼 동작.   이유는 TDZ 때문</code></pre><p>let age = 30;
function showAge() {
  console.log(age);
  let age = 20; // 함수 스코프 안에서 호이스팅 일어나,
  // console.log 가 찍히기 전에 변수 선언만 된 것처럼 작동.
  // =&gt; 오류가 발생한다.
  // 만약, 함수 안에서 age선언이 없었다면 함수 밖에서 선언된
  // age 값을 참조해 오류가 발생하지 않는다.
}</p>
<pre><code>&gt; TDZ(Temporal Dead Zone)이란?
변수가 할당을 받기 전에 사용하지 못하는 것.
TDZ 는 스코프 단위로 발생</code></pre></li>
<li><p>const</p>
<ul>
<li>선언하면서 할당까지 해주어야 한다.</li>
<li>이후 할당된 값의 변경이 불가능</li>
</ul>
</li>
<li><p>스코프</p>
<ul>
<li>var 는 함수 스코프</li>
<li>let, const 는 블록 스코프<blockquote>
<p>함수 스코프는 함수안에서 선언된 변수만 지역변수로 취급
  블록 스코프는 함수 + 블록(if문, while문, for문 등...)에서 선언된 변수 모두를 지역변수로 취급</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p>결론 : c++ 에서 하는것처럼 변수 선언하면 문제될 것이 없다.</p>
<p>출처 : <a href="https://www.youtube.com/watch?v=ocGc-AmWSnQ">https://www.youtube.com/watch?v=ocGc-AmWSnQ</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘] 안정 정렬(Stable Sort)과 불안정 정렬(Unstable Sort)]]></title>
            <link>https://velog.io/@hyeok-jin/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%ACStable-Sort%EA%B3%BC-%EB%B6%88%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%ACUnstable-Sort</link>
            <guid>https://velog.io/@hyeok-jin/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%ACStable-Sort%EA%B3%BC-%EB%B6%88%EC%95%88%EC%A0%95-%EC%A0%95%EB%A0%ACUnstable-Sort</guid>
            <pubDate>Thu, 15 Jul 2021 05:47:00 GMT</pubDate>
            <description><![CDATA[<p>정렬의 안정적 특성?</p>
<blockquote>
<p> 정렬되지 않은 상태에서 같은 키값을 가지는 원소의 순서가 정렬 후에도 같은 같은 순서를 유지하느냐</p>
</blockquote>
<p>이러한 특성에 따라 정렬은 <strong>안정 정렬</strong>, <strong>불안정 정렬</strong> 두 가지로 구분 가능.</p>
<p>다음과 같은 순서로 카드가 있을 때,
<img src="https://images.velog.io/images/hyeok-jin/post/2767e77d-2c2c-4e92-a4b8-87205f48ab3d/before_sort.png" alt=""></p>
<p>안정 정렬의 경우는 원래의 순서가 보장되며,
<strong>하트4와 스페이드4의 순서가 유지</strong>된다.
<img src="https://images.velog.io/images/hyeok-jin/post/347bab50-4bc0-469f-9b17-8593f18fc3bf/stable_sort.png" alt="">
비안정 정렬의 경우는 원래의 순서가 보장되지 않으며,
원래의 순서대로 될 수도 있지만, 다음과 같이 바뀔 수도 있다.
<strong>하트4와 스페이드4의 순서가 바뀜</strong>
<img src="https://images.velog.io/images/hyeok-jin/post/0717f86a-aeac-4ba0-a97f-b9060adb22cd/unstable_sort.png" alt=""></p>
<p>출처: <a href="https://godgod732.tistory.com/10">https://godgod732.tistory.com/10</a></p>
]]></description>
        </item>
    </channel>
</rss>