<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>zerovodka.log</title>
        <link>https://velog.io/</link>
        <description>Break Limit</description>
        <lastBuildDate>Thu, 02 Jan 2025 06:13:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>zerovodka.log</title>
            <url>https://velog.velcdn.com/images/zerovo_dka/profile/0e1e77d0-ab8b-4436-8695-3f10f8ee43b1/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. zerovodka.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/zerovo_dka" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[010-****-1234 or 07:08 / to be continued...... 과 같은 표현 하고 싶을 때]]></title>
            <link>https://velog.io/@zerovo_dka/010-1234-or-0708-to-be-continued......-%EA%B3%BC-%EA%B0%99%EC%9D%80-%ED%91%9C%ED%98%84-%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C</link>
            <guid>https://velog.io/@zerovo_dka/010-1234-or-0708-to-be-continued......-%EA%B3%BC-%EA%B0%99%EC%9D%80-%ED%91%9C%ED%98%84-%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C</guid>
            <pubDate>Thu, 02 Jan 2025 06:13:12 GMT</pubDate>
            <description><![CDATA[<pre><code>padStart</code></pre><p>문자열이 주어진 길이에 도달할 때까지 원하는 문자열로 채움</p>
<pre><code class="language-const">
console.log(str1.padStart(2, &#39;0&#39;));
// Expected output: &quot;05&quot;

const fullNumber = &#39;2034399002125581&#39;;
const last4Digits = fullNumber.slice(-4);
const maskedNumber = last4Digits.padStart(fullNumber.length, &#39;*&#39;);

console.log(maskedNumber);
// Expected output: &quot;************5581&quot;</code></pre>
<pre><code>padEnd</code></pre><p>문자열을 원하는 문자열로 채워서 원하는 길이에 도달하도록 함</p>
<pre><code>const str1 = &#39;Breaded Mushrooms&#39;;

console.log(str1.padEnd(25, &#39;.&#39;));
// Expected output: &quot;Breaded Mushrooms........&quot;

const str2 = &#39;200&#39;;

console.log(str2.padEnd(5));
// Expected output: &quot;200  &quot;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[숫자 소수점을 조건 없이 제거하고 싶을 때 - trunc]]></title>
            <link>https://velog.io/@zerovo_dka/%EC%88%AB%EC%9E%90-%EC%86%8C%EC%88%98%EC%A0%90%EC%9D%84-%EC%A1%B0%EA%B1%B4-%EC%97%86%EC%9D%B4-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C-trunc</link>
            <guid>https://velog.io/@zerovo_dka/%EC%88%AB%EC%9E%90-%EC%86%8C%EC%88%98%EC%A0%90%EC%9D%84-%EC%A1%B0%EA%B1%B4-%EC%97%86%EC%9D%B4-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C-trunc</guid>
            <pubDate>Sun, 29 Dec 2024 14:31:08 GMT</pubDate>
            <description><![CDATA[<p>보통 올림 / 내림을 써서 소수점을 버리곤 하는데, 조건 없이 소수점을 제거해주는 유용한 정적 메서드</p>
<pre><code>Math.trunc() 정적 메서드는 숫자의 소수 부분을 제거한 숫자의 정수 부분을 반환합니다.</code></pre><pre><code>console.log(Math.trunc(13.37));
// Expected output: 13

console.log(Math.trunc(42.84));
// Expected output: 42

console.log(Math.trunc(0.123));
// Expected output: 0

console.log(Math.trunc(-0.123));
// Expected output: -0</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[WIL - Bungle 프로젝트]]></title>
            <link>https://velog.io/@zerovo_dka/WIL-Bungle-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@zerovo_dka/WIL-Bungle-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Sun, 17 Jul 2022 16:49:07 GMT</pubDate>
            <description><![CDATA[<p> 이번 프로젝트 MVP 발표를 진행한 후에 회고하는 시간을 갖고자 늦은 시간에 컴퓨터 앞에 앉았습니다. 👨‍💻</p>
<p>이번 프로젝트에서 MVP 기간 동안 제가 맡은 역할은 간략하게 다음과 같습니다.</p>
<blockquote>
<ul>
<li>실시간 채팅 기능</li>
</ul>
</blockquote>
<p>해당 기능을 구현하기위해서는 Websocket에 대한 이해가 필요했고, Spring Boot와의 협업을 위해 StompJS 사용이 필수였습니다.</p>
<p>먼저 실시간 프로젝트를 진행할 때에 라이브러리를 사용하자는 의견도 있었지만,
밑바닥부터 하나씩 구현을 해보아야 Websocket에 대한 이해가 생길 것이라 판단하여 라이브러리는 최대한 쓰지 않기로 하였습니다.</p>
<p><a href="https://stomp-js.github.io/stomp-websocket/codo/extra/docs-src/Usage.md.html">가장 많이 참고한 사이트입니다.</a></p>
<p>위 사이트를 천천히 읽어보면 StompJS 어떻게 사용해야하며, 백엔드와 협업 시 어떻게 데이터를 송신해야하는지 알 수 있습니다.</p>
<hr>
<p>이렇게 MVP 발표를 마치었고, 그에 대한 피드백은 다음과 같았습니다.</p>
<blockquote>
<p><strong>1. 개발을 하면서 테스트를 할 수 있는 환경이 모바일  환경이 되면 개발 속도에 긍정적인 영향을 줄 수 있을 것 같습니다.</strong></p>
</blockquote>
<blockquote>
<p><strong>2. useSelector의 비동기 처리를 setTimeout을 적용하는 것은 구현이 잘 못되어있다 라는 생각이 듭니다. 딜레이를 준다는 것은 뷰를 나타내는 것이 부자연스럽습니다. 이걸 개선할  수 있는 다른 방법을 찾는데 시간을 줄일 수 있는 방법을 생각해야 할 것 같습니다.</strong></p>
</blockquote>
<blockquote>
<p><strong>3. 현재 전략보다 더 빠르거나 더 정확하게 해결 할 수 있는 방법을 찾았으면 좋겠습니다. 질문방이나 기술 멘토님을 좀 더 활용했으면 좋겠습니다.</strong></p>
</blockquote>
<blockquote>
<p>전반적으로 느꼈을 때 혼자서 문제를 해결하기 위해서 고민했던 것 같습니다. 팀원 분들 중에서 본인 스스로 해결 하는게 실력이 느는거 아닐까?라는 생각을 가지고 계신 것 같지만, 
<strong>시간이 짧으니 지금보다 조금 더 주변의 전문성이 있는 분들, 아니면 비슷한 고민을 가진 분들과 이야기를 더 많이 해서 도움을 받는 게 좋은 것 같습니다.</strong> 
혼자서 모든 문제를 해결하려고 하지 않았으면 좋겠습니다. 해결방법이 불편하거나 이게 맞나? 싶은 게 있으면 기술 멘토님께 질문을 가지는 시간을 가졌으면 좋겠습니다. 그러면 개발 속도가 좀 더 빨라질 것 같습니다.</p>
</blockquote>
<p>이렇게 멘토링을 받았습니다.</p>
<h3 id="1번-멘토링">1번 멘토링</h3>
<ul>
<li>저희 프로젝트 Bungle이 모바일 웹앱 버전을 타겟하였기 때문에, 모바일 환경 테스트가 매우 중요한 부분입니다.
현재는 자체 localhost:3000을 모바일로 접속하여 뷰적인 부분이나 브라우저에 따른 호환성 테스트를 해보고 있습니다.
추가적으로 mTworks라는 툴을 찾았는데, 금액이 너무 비싸 적용이 어려울 것으로 판단했습니다.
추후에 https 환경을 구축하게되면, firebase 배포를 통해 하나씩 테스트를 해볼 생각입니다.</li>
</ul>
<h3 id="2번-멘토링">2번 멘토링</h3>
<ul>
<li><p>현재 slice 파일에서 useSelector()로 데이터를 받아와 처리를 하고있는 부분이 있는데, useSelector()함수가 비동기처리가 되다보니, 데이터를 못받아오는 경우가 있어서 useEffect() 내부적으로 setTimeout()을 사용하여 억지 동기처리를 주었습니다.</p>
</li>
<li><p>이 부분은 저희도 체감하고 있는 부분인데, 좀 더 다른 분들과 멘토님들에게 자문을 구하여 대체방안을 강구하고있는 부분입니다.</p>
</li>
</ul>
<h3 id="3번-멘토링">3번 멘토링</h3>
<ul>
<li>3번 멘토링 내용은 2번 멘토링의 연장선으로 생각했습니다.
멘토님들이 보았을 때에 저희 프론트 팀원들이 자체적으로 방법을 강구하려고 했던 부분을 눈치채신 것 같습니다.
저희는 그게 맞다고 생각했고, 이게 저희의 공부방식이자 작업방식이라 생각했지만, 멘토링을 받고나니, 시간적 제약이 있다보니 멘토님들의 멘토링을 받아들여 진행해야겠다고 생각했습니다.</li>
</ul>
<hr>
<h3 id="mvp-발표-후-느낀-점">MVP 발표 후 느낀 점</h3>
<p>프로젝트 시작하고 3주동안 최선을 다했기 때문에 후회는 없습니다.
앞으로 3주동안 추가적인 기능과 뷰들을 작업하게 될텐데 3주 뒤에도 오늘같이 후회가 없다고 쓸 수 있으면 좋겠습니다.</p>
<blockquote>
<p>추후 개발 기능</p>
</blockquote>
<ul>
<li>GPS - Kakao map API 활용한 지도 페이지</li>
<li>문자 채팅 추가적인 예외처리 사항과 디테일 기능들</li>
<li>전체적인 CSS 수정</li>
<li>QR코드</li>
<li>화상 채팅 기능</li>
<li>소셜 로그인</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 문자열 내림차순으로 배치하기
]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 03 Jun 2022 16:22:18 GMT</pubDate>
            <description><![CDATA[<h1 id="문자열-내림차순으로-배치하기">문자열 내림차순으로 배치하기</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12917">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.</li>
<li>s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.</li>
</ul>
<p>그저 내림차순으로 정렬이다
그럼 문자열<code>s</code>를 배열로 바꿔준 후, <code>sort().reverse()</code> 하면?? 내림차순 아닌가🤔</p>
<blockquote>
<p>제한 사항</p>
</blockquote>
<ul>
<li>str은 길이 1 이상인 문자열입니다.</li>
</ul>
<pre><code class="language-javascript">입출력 예

s            return
&quot;Zbcdefg&quot;    &quot;gfedcbZ&quot;</code></pre>
<p>이게 문제 보고 나서 <code>ASCII CODE</code> 생각이 났다
<img src="https://velog.velcdn.com/images/zerovo_dka/post/653aa3d9-27b7-4a95-9fcc-f9c84fa74b3d/image.png" alt="">
여기서 보면 대문자가 소문자보다 아스키 코드값이 작은걸 알 수 있다.</p>
<p>그래서 배열에서 오름차순으로 정렬하면 대문자가 소문자보다 먼저 출력된다 （￣︶￣）↗　</p>
<p>그럼 문제를 풀어보자 😃</p>
<ol>
<li><p>입력받은 문자열을 <code>split</code>함수로 쪼개준 후</p>
</li>
<li><p><code>sort</code> 로 오름차순 정렬해준 후</p>
</li>
<li><p><code>reverse</code> 로 역으로 순서를 바꾼 후</p>
</li>
<li><p>출력값이 문자열이어야 하므로 배열을 문자열로 리턴해주는 <code>join</code>을 사용하자</p>
</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(s) {
    let str = s.split(&#39;&#39;).sort().reverse().join(&#39;&#39;);

    return str
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL - ES?? / ES6??]]></title>
            <link>https://velog.io/@zerovo_dka/WIL-ES-ES6</link>
            <guid>https://velog.io/@zerovo_dka/WIL-ES-ES6</guid>
            <pubDate>Sun, 22 May 2022 11:11:50 GMT</pubDate>
            <description><![CDATA[<h1 id="ecma-script-">ECMA Script ??</h1>
<p>자바스크립트 버전을 보면 뒤에 붙은 ES가 뭘까... 하는 생각을 하게 되었다🤔</p>
<p>그래서 공부했다 !!! (╯°□°）╯︵ ┻━┻
가보자 자바스크립트와 ES!! ☝</p>
<h1 id="ecma-script가-생겨난-배경📖">ECMA Script가 생겨난 배경📖</h1>
<p>자바스크립트가 1990년대 Netscape사의 Brendan Eich에 의해 개발되었다</p>
<p>그런데 이 자바스크립트가 완전 흥행해버렸네???</p>
<p>이걸 본 MS가 Jscript라는 언어를 만들어 IE에 탑재해버린다 ㅋㅋㅋㅋㅋㅋ</p>
<p>그런데 개발자 입장에서 두 언어가 너무 달라 힘들었고, 두 회사는 이에 대한 표준을 만들어야겠다!!! 라고 생각했다고 한다 🤦‍♂️</p>
<p>그래서 이 표준을 위해 자바스크립트를 ECMA(European Computer Manufactures Association)라는 정보와 통신시스템의 비영리 표준 기구에 제출했단다</p>
<p>그 후 표준에 대한 작업을 ECMA-262라는 이름으로 96년 11월 시작해서
97년 6월에 채택되게 된다.
<img src="https://velog.velcdn.com/images/zerovo_dka/post/6cdff32a-1f64-4130-8092-ae02ac5f2f50/image.png" alt=""></p>
<p>ECMA가 다루는 표준(출처 : 위키)</p>
<hr>
<h1 id="javascript--ecma-script-🤔">Javascript // ECMA Script ??🤔</h1>
<p>전자는 언어 // 후자는 규격 표준 즉, 스펙을 뜻한다</p>
<hr>
<h1 id="es31999">ES3(1999)</h1>
<p>우리가 흔히 말하는 자바스크립트</p>
<ul>
<li>함수 단위의 스코프, 호이스팅, 모듈화 미지원, 프로토타입, 클로저 등등</li>
<li>대부분의 브라우저에서 지원</li>
<li>IE8까지 크로스브라우징하는 환경이면 ES3를 쓰고 있다고 생각하면 됨</li>
</ul>
<h1 id="es52009">ES5(2009)</h1>
<ul>
<li>4버전은 급변하는 내용을 담고 있었는지 거절됨</li>
<li>점진적 개선을 위해 ES5가 나옴</li>
<li>기본적으로 IE9부터 본격적 지원하지만 ES5-shim을 사용하면 하위 버전에서
도 특정 기능들을 지원</li>
</ul>
<h3 id="추가된-내용">&lt;추가된 내용&gt;</h3>
<ul>
<li><p>배열과 관련한 새로운 메서드들이 생김</p>
</li>
<li><p>forEach, map, filter, reduce, some, every
===&gt; 개발자가 반복 횟수나 조건을 잘못 입력하는 등의 실수를 줄여줌</p>
</li>
<li><p>object에 대한 getter / setter 지원</p>
</li>
<li><p>자바스크립트 strict 모드 지원(더욱 세심한 문법 검사 지원)</p>
</li>
<li><p>JSON 지원(과거엔 XML 사용 =&gt; JSON이 부상하자 지원)</p>
</li>
<li><p>bind() 메서드 생김(this를 강제로 bind 시켜주는 메서드)</p>
</li>
</ul>
<h1 id="es-2015es6">ES 2015(ES6)</h1>
<ul>
<li>원래 이름이 ES6였는데, 끝자리인 6과 2016을 연관짓는 습성때문에
2016년에 나온것으로 착각해서인지 ES2015로 바꾼 듯함</li>
</ul>
<h3 id="추가된-내용-1">&lt;추가된 내용&gt;</h3>
<ul>
<li><p>let, const 키워드 추가
기존의 변수는 함수 스코프를 가진 var 키워드를 이용하여 선언
때문에 블록 스코프를 가진 let / const 키워드를 추가
기존에 상수형 키워드가 없어 CONST_TEST와 같이 대문자로 상수를
표시하다 ES6부터 const 키워드로 값의 변경을 통제</p>
</li>
<li><p>arrow 문법 지원
익숙해지면 편하고 간결해진 코드를 작성할 수 있다.
this를 바인딩 하지 않는다(this는 해당 scope의 this와 같다)</p>
</li>
</ul>
<blockquote>
<p>여기서 this를 바인딩 하지 않는다?? <a href="https://usefultoknow.tistory.com/entry/ECMA-SCript%EB%9E%80-ES%EB%9E%80">무슨 뜻이야🤨</a></p>
</blockquote>
<ul>
<li>literator / generator 추가</li>
<li>module import / export 추가</li>
<li>Promise 도입(Callback Hell을 해결해 줄 기법 추가)</li>
<li>Default, Rest 파라미터</li>
<li>해체 할당, Spread 연산자</li>
<li>템플릿 리터럴</li>
<li>호이스팅이 사라진 것 같은 효과</li>
<li>함수 단위 스코프에서 블록 단위 스코프로 변경</li>
</ul>
<h3 id="es6-화살표-함수">ES6 화살표 함수</h3>
<p>이렇게 쓸 수 있게 되었다!</p>
<pre><code class="language-javascript">var plus = function example (a,b) { return a+b; }

let plus = (a,b) =&gt; {return a+b}</code></pre>
<hr>
<h1 id="회고🙄">회고🙄</h1>
<p>이번주는 </p>
<ul>
<li>알고리즘 문제들을 하나씩 풀어보며 Javascript 문법들을 공부하고, </li>
<li>중간에 쿠키 / 캐시 / 세션에 대해 공부해서 발표도 해보고(항해톡),</li>
<li>Javascript의 언어로서의 특성들과 작동 방식 및 역사도 공부해보았다</li>
</ul>
<p>이번 한 주도 열심히 달려왔던 것 같다.</p>
<p>돌아올 내일부터도 또 열심히 달려보자🏃‍♂️🏃‍♂️🏃‍♂️</p>
<h3 id="이번주-배운-내용들">이번주 배운 내용들</h3>
<ul>
<li>Javascript 기초 문법(알고리즘 문제)</li>
<li><a href="https://velog.io/@zerovo_dka/WIL-JWT-API">쿠키 / 캐시 / 세션</a></li>
<li><a href="https://velog.io/@zerovo_dka/Javascript-%EC%9E%90%EB%A3%8C%ED%98%95-%ED%8A%B9%EC%84%B1">Javascript - 자료형 / 특성</a></li>
<li><a href="https://velog.io/@zerovo_dka/Javascript-%EA%B0%9D%EC%B2%B4-%EB%B6%88%EB%B3%80%EC%84%B1">Javascript - 객체 / 불변성</a></li>
<li><a href="https://velog.io/@zerovo_dka/Javascript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-TDZ">Javascript - 호이스팅 / TDZ</a></li>
<li>React 기초 맛보기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript - 복습]]></title>
            <link>https://velog.io/@zerovo_dka/Javascript-%EB%B3%B5%EC%8A%B5</link>
            <guid>https://velog.io/@zerovo_dka/Javascript-%EB%B3%B5%EC%8A%B5</guid>
            <pubDate>Sat, 21 May 2022 05:04:18 GMT</pubDate>
            <description><![CDATA[<h1 id="아래의-코드를-보고-생각해보자-☝">아래의 코드를 보고 생각해보자!! ☝</h1>
<h4 id="1-콘솔에-찍힐-b-값을-예상해보고">1. 콘솔에 찍힐 b 값을 예상해보고,</h4>
<h4 id="2-어디에서-선언된-b가-몇번째-라인에서-호출한-consolelog에-찍혔는지-왜-그런지-설명해보세요">2. 어디에서 선언된 “b”가 몇번째 라인에서 호출한 console.log에 찍혔는지, 왜 그런지 설명해보세요.</h4>
<h4 id="3-주석을-풀어보고-오류가-난다면-왜-오류가-나는-지-설명하고-오류를-수정해보세요">3. 주석을 풀어보고 오류가 난다면 왜 오류가 나는 지 설명하고 오류를 수정해보세요.</h4>
<pre><code class="language-javascript">let b = 1;

function hi () {

    const a = 1;

    let b = 100;

    b++;

    console.log(a,b);

}

//console.log(a);

console.log(b);

hi();

console.log(b);</code></pre>
<h2 id="답변">&lt;답변&gt;</h2>
<h4 id="1-콘솔에-찍힐-b-값을-예상해보고-1">1. 콘솔에 찍힐 b 값을 예상해보고,</h4>
<h4 id="2-어디에서-선언된-b가-몇번째-라인에서-호출한-consolelog에-찍혔는지-왜-그런지-설명해보세요-1">2. 어디에서 선언된 “b”가 몇번째 라인에서 호출한 console.log에 찍혔는지, 왜 그런지 설명해보세요.</h4>
<ul>
<li>첫번째 <code>console.log(b)</code>의 값은 <code>1</code>로 예상한다
왜냐하면 전역 변수로 지정되어있는 첫째줄 <code>let b = 1</code> 때문이다.
<code>function hi()</code>안의 <code>let b = 100</code>은 함수 내에 지역 변수로 설정되어있기 때문에 함수 밖에는 영향을 끼치지 못한다.</li>
<li>두번째 <code>console.log(b)</code>의 값 또한 <code>1</code>로 예상한다.
이유는 첫뻔째와 같다.</li>
</ul>
<h4 id="3-주석을-풀어보고-오류가-난다면-왜-오류가-나는-지-설명하고-오류를-수정해보세요-1">3. 주석을 풀어보고 오류가 난다면 왜 오류가 나는 지 설명하고 오류를 수정해보세요.</h4>
<pre><code class="language-javascript">let b = 1;

function hi() {
  const a = 1;

  let b = 100;

  b++;

  console.log(a, b);
}

console.log(a);

console.log(b);

hi();

console.log(b);

//ReferenceError: a is not defined
</code></pre>
<ul>
<li><p><code>console.log(a)</code>의 주석을 풀었더니 <code>ReferenceError: a is not defined</code>가 출력됐다.</p>
</li>
<li><p><code>a</code>가 선언된 지점은 <code>hi()</code>함수 내에 지역변수로 설정이 되어있는데, <code>global context</code>에서 <code>a</code>를 호출하였고, 여기서 <span style="color:hotpink"><code>const</code>변수의 호이스팅이 일어나게된다.</span></p>
</li>
<li><p><code>const</code>변수의 호이스팅은 <code>선언 &amp;&amp; 초기화 &amp;&amp; 할당</code>이 동시에 이루어져야 하는데, 여기서는 선언만 되어있고 초기화 및 값이 할당되어있지 않기  때문에 <code>Reference Error</code>가 출력되는 것이다. </p>
</li>
</ul>
<pre><code class="language-javascript">let b = 1;

function hi() {
  const a = 1;

  let b = 100;

  b++;

  console.log(a, b);
  console.log(a);        // 전역 변수 a 호출
}

console.log(b);

hi();

console.log(b);
</code></pre>
<p>이렇게 <code>a</code>를 호출하는 부분을 <code>hi()</code>안에 넣어주면 된다 😃</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript - 호이스팅 / TDZ]]></title>
            <link>https://velog.io/@zerovo_dka/Javascript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-TDZ</link>
            <guid>https://velog.io/@zerovo_dka/Javascript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-TDZ</guid>
            <pubDate>Sat, 21 May 2022 04:47:11 GMT</pubDate>
            <description><![CDATA[<p>호이스팅과 TDZ를 알기 전 먼저 <span style="color:hotpink">스코프에 대해 알아야 한다.</span>😃</p>
<ul>
<li><p>자바스크립트는 코트의 영역을 스코프로 나누어 관리한다.</p>
</li>
<li><p>스코프는 단방향으로 연결되는 체인을 형성하며, 이 스코프 체인을 통해 상위 스코프로 이동하면서 식별자를 검색한다.</p>
</li>
<li><p>클로저와 밀접한 관계를 갖기 때문에 꼭 알아두어야하는 개념</p>
</li>
</ul>
<h1 id="스코프scope💘">스코프(Scope)💘</h1>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/dda2f9fc-a203-457b-88c5-ad189536b0c0/image.png" alt=""></p>
<h3 id="식별자의-유효-범위">식별자의 유효 범위</h3>
<p>모든 식별자는 자신이 선언된 위치에 의하여 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.</p>
<h3 id="네임스페이스">네임스페이스</h3>
<p>한 스코프 내에서는 식별자가 유일해야 하지만, 다른 스코프에는 동명의 식별자를 사용할 수 있음.</p>
<h3 id="span-stylecolorhotpink식별자-결정identifier-resolutionspan"><span style="color:hotpink">식별자 결정(identifier resolution)</span></h3>
<p>자바스크립트 엔진은 스코프를 통해서 어떤 변수를 참조할 것인지 결정함.</p>
<h2 id="스코프의-종류">스코프의 종류</h2>
<h3 id="1-전역-스코프global-scope">1. 전역 스코프(global scope)</h3>
<p><span style="background-color:blue">전역은 코드의 가장 바깥 영역</span>으로, 여기서 선언된 변수는 전역 변수가 됨.</p>
<p>전역 변수는 어디서든 참조 가능</p>
<h3 id="2-지역-스코프local-scope">2. 지역 스코프(local scope)</h3>
<p><span style="background-color:blue">지역은 함수 코드의 내부 영역</span>으로, 여기서 선언된 변수는 지역 변수가 됨.</p>
<p>지역 변수는 자신의 지역 스코프 및 하위 지역 스코프에서 참조 가능</p>
<h3 id="span-stylecolorhotpink3-함수-레벨-스코프-vs-블록-레벨-스코프span"><span style="color:hotpink">3. 함수 레벨 스코프 VS 블록 레벨 스코프</span></h3>
<p>지역 스코프는 함수에 의해서 생성되는가, 코드 블록에 의해서 생성되는가에 따라 레벨이 나뉨.</p>
<h4 id="블록-레벨-스코프">블록 레벨 스코프</h4>
<ul>
<li><p><code>if</code>, <code>for</code>, <code>while</code>, <code>try/catch</code> 등 코드 블록이 지역 스코프 생성 </p>
</li>
<li><p><code>let</code>, <code>const</code> 키워드로 선언된 변수는 모든 코드 블록을 지역 스코프로 인정함.</p>
</li>
</ul>
<h4 id="함수-레벨-스코프">함수 레벨 스코프</h4>
<ul>
<li><p>함수가 지역 스코프 생성</p>
</li>
<li><p><code>var</code> 키워드로 선언된 변수는 오직 &#39;함수&#39;만을 지역 스코프로 인정함.</p>
</li>
</ul>
<h3 id="4-렉시컬-스코프--정적-스코프--lexical-scope-">4. 렉시컬 스코프 ( 정적 스코프 / lexical scope )</h3>
<ul>
<li><p>자바스크립트에서는 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정됨.</p>
</li>
<li><p>즉, 함수를 어디서 호출했는지가 아니라 <span style="color:yellow">&#39;어디에 정의했는지&#39;에 따라서 상위 스코프가 결정됨.</span></p>
</li>
<li><p>함수의 상위 스코프는 함수 정의가 실행될 때 정적으로 결정되며, 함수 정의가 실행되어 생성된 함수 객체는 상위 스코프를 기억함. 
⇒ 클로저와 깊은 연관</p>
</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수를 말한다. </li>
<li>간단히 말하면 클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수다</li>
</ul>
<h2 id="스코프-체인scope-chain">스코프 체인(Scope Chain)</h2>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/1edd9cd0-631c-4d1a-a7ec-50bdca3bb4a4/image.png" alt="">
<img src="https://velog.velcdn.com/images/zerovo_dka/post/2c2b7c1b-d914-48f0-8514-b770c9fe3bab/image.gif" alt="">
<img src="https://velog.velcdn.com/images/zerovo_dka/post/ef341ca2-9d29-4bf0-b7c1-9604a113ac82/image.gif" alt=""></p>
<p>스코프는 함수의 중첩에 의해 계층적 구조를 가진다.</p>
<ul>
<li>외부 함수(outer function)</li>
<li>중첩 함수(nested function)</li>
</ul>
<p>변수를 참조할 때, 자바스크립트 엔진은 스코프 체인을 통해 
<span style="background-color:blue">변수를 참조하는 코드의 스코프 =&gt;&gt;&gt; 상위 스코프로 이동</span>
선언된 변수를 검색한다.</p>
<h3 id="변수-은닉화variable-shadowing💨💨">변수 은닉화(variable shadowing)💨💨</h3>
<ul>
<li>여러 스코프에서 동일한 식별자를 선언한 경우, 무조건 스코프 체인 상에서 가장 먼저 검색된 식별자에만 접근 가능</li>
</ul>
<p>스코프 체인은 <code>outerEnvironmentReference</code>와 밀접한 관계를 가짐.</p>
<hr>
<h1 id="tdz-temporal-dead-zone🍟">TDZ( Temporal Dead Zone)🍟</h1>
<p>일시적으로 죽은 공간이라는 뜻</p>
<p>무슨 의미일까?? 🤔</p>
<ul>
<li><span style="color:hotpink">스코프의 시작 지점부터 초기화 시작 지점까지의 구간</span></li>
</ul>
<pre><code class="language-javascript">let a = 1;
{
  console.log(foo);
  let a = 2;
}</code></pre>
<p>간단히 여기서 <code>중괄호</code> 안의 구역을 TDZ라고 한다</p>
<ul>
<li><code>var</code>은 TDZ의 영향을 안받는다</li>
<li><code>let</code>, <code>const</code>는 TDZ의 영향을 받고 이 떄문에 <code>Reference Error</code>가 출력되는 것이다.</li>
</ul>
<hr>
<h1 id="호이스팅🌮">호이스팅🌮</h1>
<ul>
<li><p><span style="color:hotpink">호이스팅</span>은 코드를 실행하기 전 변수선언/함수선언을 해당 스코프의 최상단으로 끌어올리는 것이 아니다.</p>
</li>
<li><p><span style="color:hotpink">호이스팅</span>은 코드가 실행하기 전 변수선언/함수선언이 <span style="color:red">해당 스코프의 최상단으로 끌어 올려진 것 같은 현상을 말한다.</span></p>
</li>
<li><p><span style="color:hotpink">자바스크립트 엔진</span>은 코드를 실행하기 전 실행 가능한 코드를 형상화하고 구분하는 과정( 실행 컨텍스트를 위한 과정 )을 거친다.</p>
</li>
<li><p><span style="color:hotpink">자바스크립트 엔진</span>은 코드를 실행하기 전 실행 컨텍스트를 위한과정에서 모든 선언(var, let, const, function, class)을 스코프에 등록한다.</p>
</li>
<li><p><span style="color:hotpink">실행 컨텍스트</span>는 실행 가능한 코드가 실행되기 위해 필요한 환경을 의미하고 실행되기전 이러한 실행 컨텍스트 과정(코드를 구분하는 과정)을 거친다.</p>
</li>
</ul>
<h2 id="변수-호이스팅-var-let-const-키워드🍿">변수 호이스팅 (var, let, const 키워드)🍿</h2>
<ul>
<li><p>자바스크립트의 모든 선언에는 <span style="color:hotpink">호이스팅</span>이 일어난다.</p>
</li>
<li><p>하지만 <code>let</code>, <code>const</code>, <code>class</code>를 이용한 선언문을 호이스팅이 발생하지 않는 것처럼 동작한다.</p>
</li>
</ul>
<h3 id="이런-이유가-무엇일까🤔">이런 이유가 무엇일까??🤔</h3>
<p>이는 <code>var</code>, <code>let</code>, <code>const</code>의 호이스팅 단계가 다르기 때문이다（￣︶￣）↗　</p>
<h4 id="1단계-선언-단계declaration-phase📕">1단계: 선언 단계(Declaration phase)📕</h4>
<ul>
<li>변수를 실행 컨텍스트의 변수 객체에 등록한다.</li>
<li>이 변수 객체는 스코프가 참조하는 대상이 된다.<h4 id="2단계-초기화-단계initialization-phase📗">2단계: 초기화 단계(Initialization phase)📗</h4>
</li>
<li>변수 객체에 등록된 변수를 위한 공간을 메모리에 확보한다.</li>
<li>이 단계에서 변수는 undefined로 초기화 된다.<h4 id="3단계-할당-단계assignment-phase📘">3단계: 할당 단계(Assignment phase)📘</h4>
</li>
<li>undefined로 초기화된 변수에 실제 값을 할당한다.</li>
</ul>
<h4 id="var의-호이스팅-단계📕📗--📘"><code>var</code>의 호이스팅 단계📕📗 =&gt; 📘</h4>
<ol>
<li>선언 &amp;&amp; 초기화</li>
<li>할당</li>
</ol>
<h4 id="let의-호이스팅-단계📕--📗--📘"><code>let</code>의 호이스팅 단계📕 =&gt; 📗 =&gt; 📘</h4>
<ol>
<li>선언</li>
<li>초기화</li>
<li>할당</li>
</ol>
<h4 id="const의-호이스팅-단계📕📗📘"><code>const</code>의 호이스팅 단계📕📗📘</h4>
<ol>
<li>선언 &amp;&amp; 초기화 &amp;&amp; 할당</li>
</ol>
<h4 id="무슨-의미인지-아래-코드를-보고-이해해보자">무슨 의미인지 아래 코드를 보고 이해해보자!!</h4>
<pre><code class="language-javascript">var a = 1;
{
  console.log(a);
  var a = 2;
}

// 1출력</code></pre>
<p><code>var</code>는 호이스팅 시 선언 &amp;&amp; 초기화가 동시에 발생하여 출력 이후 지정된 변수는 undefined로 초기화 되고 전역변수로 선언된 1이 출력된다</p>
<pre><code class="language-javascript">let a = 1;
{
  console.log(a);
  let a = 2;            //TDZ에 갇힘
}

// Reference Error(참조 에러)</code></pre>
<p><code>let</code>은 호이스팅 시 선언이 이루어진 후, 할당라인에서 초기화 =&gt; 할당으로 진행되기 때문에 선언은 됐지만 참조가 되지 않아 <code>Referenc Error</code>가 출력된다</p>
<pre><code class="language-javascript">const a = 1;
{
  console.log(a);
  const a = 2;        //TDZ에 갇힘
}

// Reference Error(참조 에러)</code></pre>
<p><code>const</code>는 호이스팅 시 선언 &amp;&amp; 초기화 &amp;&amp; 할당이 동시에 이루어져야 하는데 선언만 호이스팅되어 <code>Reference Erorr</code>가 출력된다.</p>
<p>또한 <code>const</code>는 재할당이 되지 않는다</p>
<hr>
<h2 id="함수-표현식과-함수-선언문의-호이스팅🥚">함수 표현식과 함수 선언문의 호이스팅🥚</h2>
<p>자바스크립트에서 함수를 선언하는 방법은 2가지가 있다.</p>
<ul>
<li><p>함수 표현식</p>
<pre><code class="language-javascript">var add = function (x, y) {
  return x + y;
}</code></pre>
</li>
<li><p>함수 선언문</p>
<pre><code class="language-javascript">function add(x, y) {
  return x + y;
}</code></pre>
</li>
</ul>
<p>그런데 자바스크립트 Guru로 알려진 더글러스 크락포드는 함수 생성에 있어서 <span style="color:hotpink">함수 표현식만을 사용할 것을 권하고 있단다!!（￣︶￣）↗</span></p>
<p>그 이유가 뭘까?? 🤔</p>
<ul>
<li>그 이유는 함수 표현식과 함수 선언문의 호이스팅 차이 때문이라고 한다!!</li>
</ul>
<h3 id="함수-선언문의-호이스팅">함수 선언문의 호이스팅</h3>
<pre><code class="language-javascript">console.log(add(2, 3));    // 5 출력

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

console.log(add(3, 4));    // 7 출력</code></pre>
<p>보다시피 함수가 선언되기 전에 함수를 호출해도 Error가 출력되지 않는다.</p>
<p>즉, 함수가 자신이 위치한 코드에 상관없이 <span style="color:hotpink">함수 선언문 형태로 정의한 함수의 유효 범위는 코드의 맨 처음부터 시작</span>한다는 것을 확인할 수 있다.</p>
<h3 id="함수-표현식의-호이스팅">함수 표현식의 호이스팅</h3>
<pre><code class="language-javascript">console.log(add(2, 3));  // error

// 함수 표현식 형태로 add() 함수 정의
var add = function (x, y) {
    return x + y;
}

console.log(add(3, 4));  // 7</code></pre>
<p>함수 표현식으로 함수를 나타내면, 함수가 선언되기 전에 호출하게되면 Error가 발생한다.</p>
<p>즉 더글러스는 함수 선언문으로 코드 작성 시 함수 선언문이 코드의 구조를 엉성하게 만들 수 있다는 점을 지적해 함수 표현식만을 사용하기를 권장한다</p>
<hr>
<h1 id="실행-컨텍스트🍞">실행 컨텍스트🍞</h1>
<ul>
<li><p>자바스크립트 엔진이 코드를 실행하기 위해선 코드에 대한 정보들이 필요하다. </p>
</li>
<li><p>코드에 선언된 <code>변수</code>와 <code>함수</code>, <code>스코프</code>, <code>this</code>, <code>arguments</code> 등을 묶어, 코드가 실행되는 위치를 설명한다는 뜻의 <code>Execution Context</code>라고 부릅니다.</p>
</li>
<li><p>자바스크립트 엔진은 <code>Execution Context</code>를 <code>객체</code>로 관리하며 코드를 Execution Context 내에서 실행합니다.</p>
</li>
</ul>
<h2 id="execution-context의-종류">Execution Context의 종류</h2>
<h3 id="1-global-execution-context">1. Global Execution Context</h3>
<ul>
<li>코드를 실행하며 <span style="color:hotpink">단 한 개만 정의</span>되는 <code>전역 Context</code>입니다. </li>
<li><code>global object</code>를 생성하며 <code>this</code> 값에 <code>global object</code>를 <code>참조</code>합니다. </li>
<li><code>전역 실행 컨텍스트</code>는 <span style="color:red">Call Stack에 가장 먼저 추가되며 앱이 종료 될 때 삭제된다.</span></li>
</ul>
<h3 id="2-functional-execution-context">2. Functional Execution Context</h3>
<ul>
<li>함수가 <span style="color:hotpink">실행 될 때 마다 정의</span>되는 <code>Context</code>입니다. </li>
<li>전역 실행 컨텍스트가 단 한 번만 정의되는 것과 달리, 함수 실행 컨텍스트는 <span style="color:hotpink">매 실행시마다 정의되며 함수 실행이 종료(return)되면 Call Stack에서 제거된다.</span></li>
</ul>
<h3 id="3-eval-context❌">3. Eval Context❌</h3>
<ul>
<li><code>eval 함수</code>로 실행한 코드의 <code>Context</code>이다. </li>
<li>보안상 취약한 점이 있어 비권장 함수이다.</li>
</ul>
<h2 id="execution-context의-관리-callstack-👮♂️">Execution Context의 관리: CallStack 👮‍♂️</h2>
<ul>
<li><p><code>JS 엔진</code>은 생성된 <code>Context</code>를 관리하는 목적의 <code>Call Stack(호출스택)</code>을 갖고 있다</p>
</li>
<li><p><code>JS</code>는 <code>단일 스레드 형식</code>이기 때문에 런타임에 <span style="color:hotpink">단 하나의 Call Stack이 존재한다</span></p>
</li>
<li><p><code>JS 엔진</code>은 전역 범위의 코드를 실행하며 <code>Global Execution Context</code>를 생성해 <code>stack</code>에 <code>push</code>한다.</p>
</li>
<li><p><span style="color:hotpink">함수가 실행 또는 종료 될 때마다</span> <code>Global Execution Context</code>의 위로 <code>Functional Execution Context stack</code>을 <code>push(추가)</code>, <code>pop(제거)</code>한다.</p>
</li>
</ul>
<p>아래 gif 파일이 이해에 도움이 될 것 이다 （￣︶￣）↗　</p>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/40064766-5a18-4b14-b28a-9db0dfb0be9f/image.gif" alt=""></p>
<hr>
<h1 id="공부하면서-느낀-점😃">공부하면서 느낀 점😃</h1>
<p>이론적인 배경이 거의 없는 상태에서 코딩을 하다 보면 머릿속으로 생각한 것 처럼 코드를 짜도 출력이 안되거나 오류가 발생하는 경우가 허다했다</p>
<p>그런 부분들을 조금이나마 이해하게되었고, 앞으로 코드 리뷰나 코드 해석을 할 때에 보다 구체적으로 실행 알고리즘이나 오류 발생 원인을 파악할 수 있을 것 같다.</p>
<p>역시 새로운 것을 배우는 건 항상 새롭고 재미있다（￣︶￣）↗　</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript - 객체 / 불변성]]></title>
            <link>https://velog.io/@zerovo_dka/Javascript-%EA%B0%9D%EC%B2%B4-%EB%B6%88%EB%B3%80%EC%84%B1</link>
            <guid>https://velog.io/@zerovo_dka/Javascript-%EA%B0%9D%EC%B2%B4-%EB%B6%88%EB%B3%80%EC%84%B1</guid>
            <pubDate>Fri, 20 May 2022 14:41:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/3fd3f811-bf32-4a43-b0a6-b412d914c9b0/image.png" alt=""></p>
<h1 id="데이터의-두-가지-타입🤞">데이터의 두 가지 타입🤞</h1>
<ul>
<li>원시 자료형(primitive type)과 참조 자료형(reference type)이 있다.</li>
<li>원시 자료형이 할당될 때에는 <code>변수에 값(value)</code> 자체가 담긴다.</li>
<li>참조 자료형이 할당될 때는 <code>보관함의 주소(reference)</code>가 담긴다.</li>
</ul>
<hr>
<h1 id="👩🎓기본형-데이터-primitive-data-type--원시타입">👩‍🎓기본형 데이터 (Primitive data type) = 원시타입</h1>
<ul>
<li>객체가 아니면서 method를 가지지 않는 6가지의 타입이 있다.</li>
<li>원시 자료형은 모두 “하나”의 정보, 즉, 데이터를 담고 있다.</li>
<li>string, number, bigint, boolean, undefined, symbol, (null은 원시 타입과 거의 같게 사용되지만 엄밀히 따지면 객체이다. 빈 참조를 나타내는 데 자주 사용된다.)</li>
<li><code>number</code> : 3.141592</li>
<li><code>string</code> : ‘zerovodka’</li>
<li><code>boolean</code> : true &amp; false</li>
<li><code>undefined</code> : 변수가 정의되지 않았거나 값이 없다.</li>
<li><code>null</code> : 의도적으로 비어있음을 표현하기 위해 null 이라는 것이 들어있다.</li>
<li><code>symbol</code></li>
</ul>
<hr>
<h1 id="🤵참조형-데이터-reference-data-type--참조타입">🤵참조형 데이터 (Reference data type) = 참조타입</h1>
<ul>
<li>자바스크립트에선 원시 자료형이 아닌 모든 것은 참조 자료형이다.</li>
<li>참조형은 원시형 데이터의 집합이다.</li>
<li>배열([])과 객체({}), 함수(function(){})가 대표적이다.</li>
<li>참조 자료형은 기존에 고정된 크기의 보관함이 아니다.</li>
<li>참조 자료형을 변수에 할당할 때는 변수에 값이 아닌 주소를 저장한다.</li>
<li>동적으로 크기가 변하는 데이터를 보관하기위해 변수가 아닌 다른곳에 데이터를 저장하고 변수에는 그 주소만 할당한다.</li>
<li><code>배열</code> – Array : [0,1,2,3,4]</li>
<li><code>객체</code> – Object {name : “zerovodka”, age : 28}</li>
<li><code>정규표현식(RegExp)</code></li>
<li>*&lt;ES6에서 추가된 것들&gt;**</li>
<li><code>Map</code></li>
<li><code>Set</code></li>
<li><code>WeakMap</code></li>
<li><code>WeakSet</code></li>
</ul>
<blockquote>
<p>즉, 변수에는 하나의 값 혹은 주소만 저장할 수 있다.</p>
</blockquote>
<p>두 타입의 가장 대표적인 차이로는 기본형에는 바로 값을 그대로 할당한다는 것이고 참조형에는 값이 저장된 주소값을 할당(참조)한다는 것이다.（￣︶￣）↗　</p>
<hr>
<h1 id="불변성🤔">불변성??🤔</h1>
<p>아니 자바스크립트에서 데이터의 불변성이라는게 있다는데 그게 뭘까???</p>
<p>불변성을 이해하려면 자바스크립트에서 데이터를 저장하는 방식을 알아야 한다고 한다 </p>
<p>그럼 알아볼까요?!☝</p>
<h2 id="기본형-데이터-변수를-선언합니다🙂">기본형 데이터 변수를 선언합니다🙂</h2>
<pre><code class="language-javascript">let a = &#39;abc&#39;</code></pre>
<p><code>a</code>라는 변수를 선언하고 <code>abc</code>라는 데이터 값을 할당했다.</p>
<p>그럼 자바스크립트 엔진은 메모리에 <code>a</code>라는 식별자를 가진 빈 공간을 만들고 주소를 할당한다.
그리고 할당한 주소에 <code>&#39;abc&#39;</code>라는 값을 저장한다</p>
<p>*<em>즉, <code>a</code>라는 식별자를 가진 메모리 공간에 <code>&#39;abc&#39;</code>라는 데이터 값이 아닌 데이터 값의 메모리 주소값을 할당한다는 것이다 （￣︶￣）↗　*</em></p>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/9e0cb3fa-78ee-4b22-9333-12bf6e2ac25d/image.png" alt=""></p>
<h2 id="그럼-변수의-값을-변경해볼까요😀">그럼 변수의 값을 변경해볼까요?😀</h2>
<pre><code class="language-javascript">let a = &#39;abc&#39;
a = &#39;bbb&#39;</code></pre>
<p>선언해 둔 <code>a</code> 라는 변수에 <code>&#39;bbb&#39;</code>를 할당했다.</p>
<p>그럼 메모리에서 <code>&#39;bbb&#39;</code>라는 데이터를 찾고 없으면, 공간을 하나 더 만들어 <code>&#39;bbb&#39;</code>를 저장한다</p>
<p>그리고 그 주소를 <code>a</code>에 저장한다.
<img src="https://velog.velcdn.com/images/zerovo_dka/post/55c6387c-ee78-4277-9f18-c3a721df2ba0/image.png" alt=""></p>
<p>즉, <code>a</code>의 값을 변경했더라도 <strong>그 값을 변경한게 아니라 데이터 주소 값이 변경된 것이다</strong> （￣︶￣）↗　</p>
<p>이처럼 한 번 만든 값을 변경할 수 없는 것이 불변성이다~!!🙂</p>
<blockquote>
<p>하지만 가변성이 있는 데이터가 있다!!</p>
</blockquote>
<hr>
<p>위에 설명했던 두 타입 중에</p>
<ul>
<li>기본형 타입 =&gt; <strong>불변성</strong>을 띠는 데이터</li>
<li>참조형 타입 =&gt; <strong>가변성</strong>을 띠는 데이터</li>
</ul>
<h2 id="참조형-데이터-변수를-선업합니다🙂">참조형 데이터 변수를 선업합니다🙂</h2>
<pre><code class="language-javascript">let obj ={
        a = 1,
          b = &#39;abc&#39;
}</code></pre>
<p>메모리에 <code>obj</code>라는 식별자를 가진 빈 공간을 마련하고, 주소를 할당한다.</p>
<p>그리고 그 주소에 여러개의 프로퍼티로 이루어진 데이터 그룹을 저장하기 위해 별도의 공간을 마련하고 그 영역의 주소를 저장한다</p>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/012f3fc2-5a7e-4d1a-b97f-46b43129cbc6/image.png" alt=""></p>
<h2 id="프로퍼티의-값을-변경해볼까요😀">프로퍼티의 값을 변경해볼까요?😀</h2>
<pre><code class="language-javascript">let obj ={
        a = 1,
          b = &#39;abc&#39;
}

obj.a = 2</code></pre>
<p><code>obj</code>의 <code>a</code> 프로퍼티에 2를 할당하면 <code>obj</code>가 바라보고 있는 주소 b3030이 변경되는게 아닌 기존의 내부값만 바뀐다 （￣︶￣）↗　</p>
<p>바로 이 부분 때문에 참조형 데이터는 가변값이라고 하는 것이다.</p>
<p>💥참고로, 참조형 데이터 자체를 변경할 경우는 불변값이고 그 내부의 프로퍼티를 변경할 때만 가변성이 성립된다.</p>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/e89d3a20-3051-4741-b659-19fab92e9259/image.png" alt=""></p>
<hr>
<h1 id="불변-객체를-만드는-방법">불변 객체를 만드는 방법</h1>
<p>자바스크립트에서 불변 객체를 만드는 방법은 2가지가 있다 （￣︶￣）↗</p>
<blockquote>
<ul>
<li>const</li>
</ul>
</blockquote>
<ul>
<li>Object.freeze()</li>
</ul>
<h2 id="const">Const</h2>
<ul>
<li><p>ES6 버전부터 <code>let</code>과 <code>const</code>를 지원하게 되었다</p>
</li>
<li><p><code>const</code> 키워드는 변수를 상수로 선언할 수 있다, 일반적으로 상수로 선언된 변수는 값을 바꾸지 못하는 것으로 알려져 있다.</p>
</li>
</ul>
<h3 id="그렇다면-상수로-선언한-객체는-불변-객체일까🤔">그렇다면 상수로 선언한 객체는 불변 객체일까??🤔</h3>
<pre><code class="language-javascript">const test = {};
test.name = &quot;seowoo&quot;;

console.log(test);  // {&quot;seowoo&quot;}</code></pre>
<p>ES6에서의 <code>const</code>는 <span style="color: hotpink">할당된 값이 상수가 되는 것이 아닌 
바인딩된 값이 상수</span>가 되는, 즉 test변수가 상수가 되기 때문에 
const 키워드로 선언된 test변수에는 <span style="color: red">객체 재할당은 불가능하지만 객체의 속성은 변경 가능하다.</span></p>
<p>==&gt; 때문에 비록 재할당은 불가능하지만 객체의 속성을 변경함으로 인해 변수에 바인딩된 객체의 내용까지 변경이 되기 때문에 불변객체라고 하기는 힘들다.  </p>
<h2 id="objectfreeze">Object.freeze()</h2>
<p>자바스크립트에서 기본적으로 제공하는 메소드인 Object.freeze() 메소드이다. 공식 문서에서는 <span style="color: hotpink">&quot;객체를 동결하기 위한 메소드&quot;</span> 라고 적혀있다.</p>
<pre><code class="language-javascript">let test = {
    name : &#39;Choi&#39;
}

Object.freeze(test);</code></pre>
<p>test 변수에 key value를 가진 객체를 바인딩 후 Object.freeze(test)를 사용해 바인딩된 변수를 동결 객체로 만들었다. 때문에 test <span style="color: red">객체는 객체의 속성을 변경하는 시도는 불가능</span>하다.</p>
<pre><code class="language-javascript">test.name = &#39;Kim&#39;;
console.log(test) // {name: &#39;Choi&#39;}</code></pre>
<p>그러나 <span style="color: yellow">Object.freeze()는 동결된 객체를 반환하지만 객체의 재할당은 가능하다.</span> </p>
<pre><code class="language-javascript">test = {
    age : 28
};
console.log(test); // {age: 28}</code></pre>
<p>==&gt; 때문에 Object.freeze()도 불변 객체라고 할 수는 없을 것 같다.</p>
<h2 id="그럼-결국-어떻게-불변객체를-만들어😣">그럼 결국 어떻게 불변객체를 만들어??😣</h2>
<p><code>const</code>와 <code>Object.freeze()</code>를 조합하여 만들 수 있다. 
(const의 재할당불가 + Object.freeze()의 객체속성 변경불가)</p>
<pre><code class="language-javascript">const test = {
    &#39;name&#39; : &#39;jung&#39;
};

Object.freeze(test);</code></pre>
<p>먼저 <code>const</code>키워드로 바인딩 된 변수를 상수화 시킨 다음, </p>
<p><code>Object.freeze()</code>로 해당 변수를 동결 객체를 만들면</p>
<p>객체의 재할당과 객체의 속성 둘 다 변경불가능한 불변 객체가 된다.</p>
<hr>
<h1 id="얕은-복사--깊은-복사">얕은 복사 / 깊은 복사</h1>
<ul>
<li><p>얕은 복사는 <span style="color:hotpink">객체의 참조값(주소 값)을 복사</span>하고, </p>
</li>
<li><p>깊은 복사는 <span style="color:red">객체의 실제 값을 복사</span>합니다.</p>
</li>
</ul>
<p>🔅먼저 이 설명을 듣기 전에 위의 자바스크립트의 두가지 타입을 다시 보고 오는 것을 추천드립니다🔅</p>
<h2 id="깊은-복사">&lt;깊은 복사&gt;</h2>
<ul>
<li>기본값(원시값)을 복사할 때 그 값은 또 다른 독립적인 메모리 공간에 할당하기 때문에, <span style="color:hotpink">복사를 하고 값을 수정해도 기존 원시값을 저장한 변수에는 영향을 끼치지 않습니다.</span> </li>
<li>이처럼 <strong>실제 값을 복사하는 것을 깊은 복사</strong>라고 합니다. </li>
<li>하지만 이것은 자료형을 깊은 복사한 것입니다.</li>
</ul>
<p>이게 무슨 말인지 아래 코드들을 보면서 이해해나가시면 됩니다.</p>
<pre><code class="language-javascript">const a = &#39;a&#39;;
let b = &#39;b&#39;;
b = &#39;c&#39;;

console.log(a); // &#39;a&#39;;
console.log(b); // &#39;c&#39;;

// 기존 값에 영향을 끼치지 않는다.</code></pre>
<h2 id="얕은-복사">&lt;얕은 복사&gt;</h2>
<ul>
<li>참조값을 복사할 때는 변수가 객체의 참조를 가리키고 있기 때문에 복사된 변수 또한 객체가 저장된 메모리 공간의 참조를 가리키고 있습니다. </li>
<li>그래서 <span style="color:hotpink">복사를 하고 객체를 수정하면 두 변수는 똑같은 참조를 가리키고 있기 때문에 기존 객체를 저장한 변수에 영향을 끼칩니다.</span> </li>
<li>이처럼 객체의 참조값(주소값)을 복사하는 것을 얕은 복사라고 합니다.  </li>
</ul>
<pre><code class="language-javascript">const a = {
    one: 1,
    two: 2,
};

let b = a;

b.one = 3;

console.log(a); // { one: 3, two: 2 } 출력
console.log(b); // { one: 3, two: 2 } 출력

// 기존 값에 영향을 끼친다.</code></pre>
<p>깊은 복사가 뭔지는 알겠는데 얕은 복사를 해버리면 원본 객체가 수정이 되니 당황스러울 수 있을 것 같은데, 보통 복사를 하는 이유는 원본을 수정하는 것 보다는 사본을 떠서 작업을 하고 싶어 한다고 생각한다.</p>
<p>그럼 각각의 복사들을 하는 방법을 알고 있으면 좋을 것 같았다.</p>
<p>각각의 복사를 할 수 있는 방법들에 대해 알아보자（￣︶￣）↗　</p>
<hr>
<h2 id="얕은-복사shallow-copy-방법">&lt;얕은 복사(Shallow Copy) 방법&gt;</h2>
<blockquote>
</blockquote>
<ul>
<li>얕은 복사란 객체를 복사할 때 기존 값과 복사된 값이 같은 참조를 가리키고 있는 것을 말합니다.</li>
<li>객체 안에 객체가 있을 경우 한 개의 객체라도 기존 변수의 객체를 참조하고 있다면 이를 얕은 복사라고 합니다.</li>
</ul>
<h3 id="arrayprototypeslice">Array.prototype.slice()</h3>
<ul>
<li>얕은 복사 방법의 대표적인 예입니다.😃  </li>
<li>start부터 end 인덱스까지 기존 배열에서 추출하여 새로운 배열을 리턴하는 메소드 입니다. </li>
<li>만약 start와 end를 설정하지 않는다면, 기존 배열을 전체 얕은 복사합니다. </li>
</ul>
<pre><code class="language-javascript">const original = [&#39;a&#39;,2,true,4,&quot;hi&quot;];
const copy = original.slice();

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true

copy.push(10);

console.log(JSON.stringify(original) === JSON.stringify(copy)); // false

console.log(original); // [ &#39;a&#39;, 2, true, 4, &#39;hi&#39; ]
console.log(copy); // [ &#39;a&#39;, 2, true, 4, &#39;hi&#39;, 10 ]</code></pre>
<p>==&gt; 기존 배열에는 영향을 끼치지 않아서 깊은 복사로 보일 수 있지만, 원시값을 저장한 1차원 배열일 뿐입니다.</p>
<ul>
<li><span style="color:hotpink">원시값은 기본적으로 깊은 복사입니다.</span></li>
<li>Slice() 메소드는 기본적으로 얕은 복사를 수행합니다. </li>
</ul>
<pre><code class="language-javascript">const original = [
    [1, 1, 1, 1],
    [0, 0, 0, 0],
    [2, 2, 2, 2],
    [3, 3, 3, 3],
];

const copy = original.slice();

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true

// 복사된 배열에만 변경과 추가.
copy[0][0] = 99;
copy[2].push(98);

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true

console.log(original);
// [ [ 99, 1, 1, 1 ], [ 0, 0, 0, 0 ], [ 2, 2, 2, 2, 98 ], [ 3, 3, 3, 3 ] ]출력

console.log(copy);
// [ [ 99, 1, 1, 1 ], [ 0, 0, 0, 0 ], [ 2, 2, 2, 2, 98 ], [ 3, 3, 3, 3 ] ]출력</code></pre>
<blockquote>
<p>만약 1차원 배열이 아닌 중첩 구조를 갖는 2차원 배열이면 얕은 복사를 수행하게 됩니다.  </p>
</blockquote>
<pre><code class="language-javascript">const original = [
    {
        a: 1,
        b: 2,
    },
    true,
];

const copy = original.slice();

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true

// 복사된 배열에만 변경.
copy[0].a = 99;
copy[1] = false;

console.log(JSON.stringify(original) === JSON.stringify(copy)); // false

console.log(original);
// [ { a: 99, b: 2 }, true ]

console.log(copy);
// [ { a: 99, b: 2 }, false ]</code></pre>
<blockquote>
<p>배열 안에 객체를 수정하고자 할 경우 얕은 복사를 수행하는 것을 볼 수 있습니다. 
하지만 원시값은 기본적으로 깊은 복사라 기존 변수에 있는 값과는 다른 값을 도출하는 것을 볼 수 있습니다.</p>
</blockquote>
<h3 id="objectassign">Object.assign()</h3>
<blockquote>
<p>Object.assign(생성할 객체, 복사할 객체)</p>
</blockquote>
<p>메소드의 첫 번째 인자로 빈 객체를 넣어주고 두 번째 인자로 복사할 객체를 넣어주면 됩니다. （￣︶￣）↗　</p>
<pre><code class="language-javascript">const object = {
    a: &quot;a&quot;,
    number: {
        one: 1,
        two: 2,
    },
};

const copy = Object.assign({}, object);

copy.number.one = 3;

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // true</code></pre>
<p>복사된 객체 <code>copy</code> 자체는 기존 <code>object</code>와 다른 객체지만 그 안에 들어가 있는 값은 기존 <code>object</code>안의 값과 같은 참조 값을 가리키고 있습니다. </p>
<h3 id="spread-연산자-전개-연산자">Spread 연산자 (전개 연산자)</h3>
<pre><code class="language-javascript">const object = {
    a: &quot;a&quot;,
    number: {
        one: 1,
        two: 2,
    },
};

const copy = {...object}

copy.number.one = 3;

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // true</code></pre>
<h2 id="깊은-복사deep-copy-방법">&lt;깊은 복사(Deep Copy) 방법&gt;</h2>
<blockquote>
<p>깊은 복사된 객체는 객체 안에 객체가 있을 경우에도 원본과의 참조가 완전히 끊어진 객체를 말합니다.</p>
</blockquote>
<h3 id="jsonparse--jsonstringify">JSON.parse &amp;&amp; JSON.stringify</h3>
<ul>
<li><p><code>JSON.stringify()</code>는 객체를 json 문자열로 변환하는데 이 과정에서 <span style="color:hotpink">원본 객체와의 참조가 모두 끊어집니다.</span></p>
</li>
<li><p>객체를 json 문자열로 변환 후, <code>JSON.parse()</code>를 이용해 다시 원래 객체(자바스크립트 객체)로 만들어줍니다.</p>
</li>
<li><p>이 방법이 가장 간단하고 쉽지만 다른 방법에 비해 느리다는 것과 객체가 function일 경우,  undefined로 처리한다는 것이 단점입니다.</p>
</li>
</ul>
<pre><code class="language-javascript">const object = {
    a: &quot;a&quot;,
    number: {
        one: 1,
        two: 2,
    },
    arr: [1, 2, [3, 4]],
};

const copy = JSON.parse(JSON.stringify(object));

copy.number.one = 3;
copy.arr[2].push(5);

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false

console.log(object); // { a: &#39;a&#39;, number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: &#39;a&#39;, number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }</code></pre>
<h3 id="재귀-함수를-구현한-복사">재귀 함수를 구현한 복사</h3>
<ul>
<li>복잡하다는 것이 단점입니다.</li>
</ul>
<pre><code class="language-javascript">const object = {
    a: &quot;a&quot;,
    number: {
        one: 1,
        two: 2,
    },
    arr: [1, 2, [3, 4]],
};

function deepCopy(object) {
    if (object === null || typeof object !== &quot;object&quot;) {
        return object;
    }

// 객체인지 배열인지 판단
    const copy = Array.isArray(object) ? [] : {};
    for (let key of Object.keys(object)) {
        copy[key] = deepCopy(object[key]);
    }
    return copy;
}

const copy = deepCopy(object);

copy.number.one = 3;
copy.arr[2].push(5);

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false

console.log(object); // { a: &#39;a&#39;, number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: &#39;a&#39;, number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }</code></pre>
<h3 id="lodash-라이브러리-사용">Lodash 라이브러리 사용</h3>
<p> 라이브러리를 사용하면 더 쉽고 안전하게 깊은 복사를 할 수 있습니다. 
 설치를 해야 한다는 점과 일반적인 개발에는 효율적이겠지만, 코딩 테스트에는 사용할 수 없다는 것이 단점입니다.</p>
<pre><code class="language-javascript">const deepCopy = require(&quot;lodash.clonedeep&quot;)
const object = {
    a: &quot;a&quot;,
    number: {
        one: 1,
        two: 2,
    },
    arr: [1, 2, [3, 4]],
};

const copy = deepCopy(object);

copy.number.one = 3;
copy.arr[2].push(5);

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false

console.log(object); // { a: &#39;a&#39;, number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: &#39;a&#39;, number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }</code></pre>
<hr>
<h1 id="공부하면서-느낀-점">공부하면서 느낀 점</h1>
<p>단순히 코딩 공부를 위해 Javascript 문법 공부만 했지, 이렇게 이론적으로 공부를 해보니 코딩 해석 부분에서 도움이 많이 될 것 같다.</p>
<p>꾸준히 공부해나가야겠다.😁 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript - 자료형 / 특성]]></title>
            <link>https://velog.io/@zerovo_dka/Javascript-%EC%9E%90%EB%A3%8C%ED%98%95-%ED%8A%B9%EC%84%B1</link>
            <guid>https://velog.io/@zerovo_dka/Javascript-%EC%9E%90%EB%A3%8C%ED%98%95-%ED%8A%B9%EC%84%B1</guid>
            <pubDate>Fri, 20 May 2022 09:49:10 GMT</pubDate>
            <description><![CDATA[<h1 id="느슨한-타입의-동적인-언어☝">느슨한 타입의 동적인 언어☝</h1>
<p>(Loosely typed dynamic language)</p>
<blockquote>
<ul>
<li>자바스크립트에서 변수를 선언할 때 필요한 예약어는 let, const이다.(var도 있긴한데 지양한다.) </li>
</ul>
</blockquote>
<ul>
<li>하나의 변수에 모든 타입의 데이터를 넣을 수 있다.</li>
</ul>
<hr>
<h1 id="형변환🤞">형변환🤞</h1>
<h2 id="자바스크립트의-형변환은-2가지-이다">자바스크립트의 형변환은 2가지 이다</h2>
<h3 id="1-암시적변환">1. 암시적변환</h3>
<ul>
<li>암시적 변환이란 자바스크립트 엔진이 <strong>필요에 따라 자동으로 데이터타입을 변환</strong>시키는 것이다.</li>
</ul>
<h4 id="1-산술-연산자">1) 산술 연산자</h4>
<p>더하기(+) 연산자는 숫자보다 문자열이 우선시 되기때문에, 숫자형이 문자형을 만나면 문자형으로 변환하여 연산된다. (문자 &gt; 숫자)</p>
<pre><code class="language-javascript">// 더하기(+)
number + number // number
number + string // string
string + string // string
string + boolean // string
number + boolean // number
50 + 50; //100
100 + “점”; //”100점”
“100” + “점”; //”100점”
“10” + false; //”100&quot;
99 + true; //100</code></pre>
<p>다른 연산자(-,*,/,%)는 숫자형이 문자형보다 우선시되기 때문에 더하기와 같은 문자형으로의 변환이 일어나지 않는다. (문자 &lt; 숫자)</p>
<pre><code class="language-javascript">//다른 연산자(-,*,/,%)
string * number // number
string * string // number
number * number // number
string * boolean //number
number * boolean //number
“2” * false; //0
2 * true; //2</code></pre>
<h4 id="2-동치-비교">2) 동치 비교</h4>
<p>아래의 예제는 <code>엄격하지 않은 동치(==)</code> 비교이며, 아래의 결과값은 좌우항 변환 할 경우 모두 ‘0 == 0 이기때문에’ <code>true</code> 이다.</p>
<pre><code class="language-javascript">null == undefined
“0” == 0
0 == false
“0” == false</code></pre>
<p>여기서 유의해야 할 점은 위의 비교는 엄격하지 않은 동치 비교일 경우이기 때문에, 두 값을 비교할 때 데이터타입을 변환하지 않는 <strong><code>엄격한 동치(===) 비교와 혼동되지 않도록 한다.</code></strong></p>
<hr>
<h3 id="2-명시적변환">2. 명시적변환</h3>
<ul>
<li>명시적변환이란 개발자가 의도를 가지고 데이터타입을 변환시키는 것이다.</li>
<li>타입을 변경하는 기본적인 방법은 <code>Object(), Number(), String(), Boolean()</code> 와 같은 함수를 이용하는데 new 연산자가 없다면 사용한 함수는 타입을 변환하는 함수로써 사용된다.</li>
</ul>
<pre><code class="language-javascript">let trans = 100; //Number
Object(trans); //100
console.log(typeof trans); //Number
String(trans); //”100&quot;
console.log(typeof trans); //String
Boolean(trans); //true
console.log(typeof trans); //Bolean</code></pre>
<h4 id="1-a-type-→-number-type">1) A Type → Number Type</h4>
<ul>
<li>다른 자료형을 숫자타입으로 변형하는 방법은 아래와 같다.</li>
</ul>
<blockquote>
<p><strong>Number()</strong></p>
</blockquote>
<ul>
<li>Number()는 정수형과 실수형의 숫자로 변환한다.</li>
</ul>
<pre><code class="language-javascript">Number(“12345”); //12345
Number(“2”*2); //4</code></pre>
<blockquote>
<p><strong>parseInt()</strong></p>
</blockquote>
<ul>
<li>parseInt()는 정수형의 숫자로 변환한다. </li>
<li>만약 문자열이 <code>숫자 0</code> 으로 시작하면 8진수로 인식하고(구형브라우저 O, 신형브라우저X), <code>0x, 0X</code> 로 시작한다면 해당 문자열을 16진수 숫자로 인식한다. </li>
<li>또한 앞부분 빈 공백을 두고 나오는 문자는 모두 무시되어 NaN을 반환한다.</li>
</ul>
<pre><code class="language-javascript">parseInt(“27”) //27
parseInt(0033); //27
parseInt(0x1b); //27
parseInt(“ 2”); //2
parseInt(“ 2ㅎ”); //2
parseInt(“ ㅎ2”); //NaN</code></pre>
<blockquote>
<p><strong>parseFloat()</strong></p>
</blockquote>
<ul>
<li>parseFloat()는 부동 소수점의 숫자로 변환한다. </li>
<li>parseInt()와는 달리 parseFloat()는 항상 10진수를 사용하며 parseFloat() 또한 앞부분 빈 공백을 두고 나오는 문자는 모두 무시되어 NaN을 반환한다.</li>
</ul>
<pre><code class="language-javascript">parseFloat(“!123”); //NaN
parseFloat(“123.123456”); //123.123456
parseInt(“123.123456”); //123
parseFloat(“ 123.123456”); //123.123456
parseFloat(“ a123.123456”); //NaN</code></pre>
<h4 id="2-a-type-→-string-type">2) A Type → String Type</h4>
<ul>
<li>다른 자료형을 문자타입으로 변형하는 방법은 아래와 같다.</li>
</ul>
<blockquote>
<p><strong>String()</strong></p>
</blockquote>
<pre><code class="language-javascript">String(123); //”123&quot;
String(123.456); //”123.456&quot;</code></pre>
<blockquote>
<p><strong>toString()</strong></p>
</blockquote>
<ul>
<li>toString()는 인자로 기수를 선택할 수 있다. 인자를 전달하지 않으면 10진수로 변환한다.</li>
</ul>
<pre><code class="language-javascript">let trans = 100;
trans.toString(); //”100&quot;
trans.toString(2); //”1100100&quot;
trans.toString(8); //”144&quot;
let boolT = true;
let boolF = false;
boolT.toString(); //”true”
boolF.toString(); //”false”</code></pre>
<blockquote>
<p><strong>toFixed()</strong></p>
</blockquote>
<ul>
<li>toFixed()의 인자를 넣으면 인자값만큼 반올림하여 소수점을 표현하며 소수점을 넘치는 값이 인자로 들어오면 <code>0</code>으로 길이를 맞춘 문자열을 반환한다.</li>
</ul>
<pre><code class="language-javascript">let trans = 123.456789;
let roundOff = 99.987654;
trans.toFixed(); //”123&quot;
trans.toFixed(0); //”123&quot;
trans.toFixed(2); //”123.46&quot;
trans.toFixed(8); //”123.45678900&quot;
roundOff.toFixed(2); //”99.99&quot;
roundOff.toFixed(0); //”100&quot;</code></pre>
<h4 id="3-a-type-→-boolean-type">3) A Type → Boolean Type</h4>
<ul>
<li>다른 자료형을 불린타입으로 변형하는 방법은 아래와 같다.</li>
</ul>
<blockquote>
<p><strong>Boolean()</strong></p>
</blockquote>
<pre><code class="language-javascript">Boolean(100); //true
Boolean(“1”); //true
Boolean(true); //true
Boolean(Object); //true
Boolean([]); //true
Boolean(0); //false
Boolean(NaN); //false
Boolean(null); //false
Boolean(undefined); //false
Boolean( ); //false</code></pre>
<hr>
<h1 id="loosely-typed-dynamic-language의-문제점과-보완점🤔">Loosely typed dynamic language의 문제점과 보완점??🤔</h1>
<p>암시적 형변환으로 인해 원치 않은 형변환이 발생할 수 있을 것 같다.</p>
<p>그렇기 때문에 명시적 형변환을 통해 원하는 형변환만 진행을 해줄 수 있도록 하고,</p>
<p>엄격하지 않은 동치 비교(==) 보다는 데이터 타입까지 비교하는 엄격한 동치 비교(===)를 지향하면 어느 정도 보완될 것 같다.</p>
<hr>
<h1 id="undefined-vs-null-❌">undefined vs Null ❌</h1>
<p><code>undefined</code>은 변수를 선언하고 값을 할당하지 않은 상태, <code>null</code>은 변수를 선언하고 빈 값을 할당한 상태(빈 객체)이다. 즉, <code>undefined</code>는 자료형이 없는 상태이다.
따라서 typeof를 통해 자료형을 확인해보면 <code>null</code>은 object로, <code>undefined</code>는 undefined가 출력되는 것을 확인할 수 있다.</p>
<pre><code class="language-javascript">typeof null // &#39;object&#39;
typeof undefined // &#39;undefined&#39;
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true</code></pre>
<p>여기서 동치 비교( == / === )  차이를 알 수 있다.（￣︶￣）↗　</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 하샤드 수]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%ED%95%98%EC%83%A4%EB%93%9C-%EC%88%98</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%ED%95%98%EC%83%A4%EB%93%9C-%EC%88%98</guid>
            <pubDate>Thu, 19 May 2022 02:58:38 GMT</pubDate>
            <description><![CDATA[<h1 id="하샤드-수">하샤드 수</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12947">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. </li>
<li>예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. </li>
<li>자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.</li>
</ul>
<p>또 나왔다 이상한 생각 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 🤣🤣</p>
<blockquote>
<p>제한 조건</p>
</blockquote>
<ul>
<li>x는 1 이상, 10000 이하인 정수입니다.</li>
</ul>
<pre><code>입출력 예

arr        return
10        true
12        true
11        false
13        false

입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.</code></pre><p>입력된 양의 정수 x의 각 자리 숫자들의 합으로 x가 나누어 떨어지면?
==&gt; 하샤드 수</p>
<p>오케이 풀어보자</p>
<ol>
<li><p>먼저 입력 받은 양의 정수 x를 split() 함수를 이용해 각 자리수들로 이루어진 배열로 만들고</p>
</li>
<li><p>각 숫자들의 합을 받을 변수 sum을 선언해준다</p>
</li>
<li><p>배열을 for 문을 통해 돌려주고</p>
</li>
<li><p>string 값으로 배열에 저장되어있으니 parseInt()해준 후, sum에 하나씩 더해준다</p>
</li>
<li><p>그 후 sum으로 x 값을 나누고</p>
</li>
<li><p>나누어지면 true / 아니면 false 반환</p>
</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(x) {
    let arr =  (x + &#39;&#39;).split(&#39;&#39;)
    let sum = 0
    for(let i = 0; i &lt; arr.length; i++){
        sum += parseInt(arr[i])
    }
    if(x % sum === 0){
        return true
    }else{
        return false
    }
}</code></pre>
<p>역시 제목은 생소하지만 알고리즘은 생소하지 않은 문제였다 🤔</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 콜라츠 추측]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%BD%9C%EB%9D%BC%EC%B8%A0-%EC%B6%94%EC%B8%A1</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%BD%9C%EB%9D%BC%EC%B8%A0-%EC%B6%94%EC%B8%A1</guid>
            <pubDate>Thu, 19 May 2022 02:36:53 GMT</pubDate>
            <description><![CDATA[<h1 id="콜라츠-추측">콜라츠 추측</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12943">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.<blockquote>
<blockquote>
<p>1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.</p>
</blockquote>
</blockquote>
</li>
</ul>
<hr>
<ul>
<li>결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.</li>
</ul>
<hr>
<ul>
<li>예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. </li>
<li>위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. </li>
<li>단, 작업을 <strong>500번</strong>을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.</li>
</ul>
<p>이런 생각을 대체 왜 하는건지에 대해 팀원들과 생각을 나눠봤는데, 결론이 나지 않아 그냥 문제를 풀었다 🤦‍♂️</p>
<p>500번 반복해도 1이 안되면 -1 반환하는 것 주의하자 ☝</p>
<blockquote>
<p>제한 사항</p>
</blockquote>
<ul>
<li>입력된 수, num은 1 이상 8000000 미만인 정수입니다.</li>
</ul>
<pre><code>입출력 예

n            result
6            8
16            4
626331        -1


입출력 예 #1
문제의 설명과 같습니다.

입출력 예 #2
16 -&gt; 8 -&gt; 4 -&gt; 2 -&gt; 1 이되어 총 4번만에 1이 됩니다.

입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야합니다.</code></pre><p>알고리즘 자체는 쉬운 편이다😀</p>
<p>어떻게 풀까??</p>
<ol>
<li><p>먼저 짝수 / 홀수를 나누어야 하므로 조건문을 통해 나누어주고</p>
</li>
<li><p>전체 진행 횟수를 담아줄 count 변수를 만들어주면 편할 것 같았다</p>
</li>
<li><p>그리고 조건문을 계속 반복해야 하므로 반복문을 돌리고</p>
</li>
<li><p>반복문의 조건을 500 미만으로 잡으면 500회라는 제한조건을 따를 수 있다. 
（￣︶￣）↗　</p>
</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(num) {
    let count = 0
    for(let i = 0; i &lt; 500; i++){
        if(num % 2 === 0 &amp;&amp; num !== 1){
            num = num / 2
            count++
        }else if(num % 2 === 1 &amp;&amp; num !== 1){
            num = (num * 3) + 1
            count++
        }
    }
    if(count &gt;= 500){
        return -1
    }else{
        return count
    }

}</code></pre>
<p>처음 보는 콜라츠 어쩌구가 나와서 좀 당황했었는데, 앞으로는 그럴 필요 없을 것 같다. 제목이 거창하면 알고리즘이 쉬운 문제가 많은 것 같다 🤔</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 제일 작은 수 제거하기]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%A0%9C%EC%9D%BC-%EC%9E%91%EC%9D%80-%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%A0%9C%EC%9D%BC-%EC%9E%91%EC%9D%80-%EC%88%98-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 19 May 2022 02:20:51 GMT</pubDate>
            <description><![CDATA[<h1 id="제일-작은-수-제거하기">제일 작은 수 제거하기</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12935">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. </li>
<li>단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요.</li>
<li>예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.</li>
</ul>
<blockquote>
<p>제한 조건</p>
</blockquote>
<ul>
<li>arr은 길이 1 이상인 배열입니다.</li>
<li>인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.</li>
</ul>
<pre><code>입출력 예

arr            return
[4,3,2,1]    [4,3,2]
[10]        [-1]</code></pre><ol>
<li><p>문제, 제한조건, 입출력예에서 보면 길이가 1인 배열 arr이 입력되면 빈 배열이 리턴될 것이고 그럴 경우엔 [-1]을 반환해야 한다는 것</p>
</li>
<li><p>내림차순하라는 조건은 없다는 것</p>
</li>
</ol>
<p>유념해서 풀어보자 😁</p>
<h2 id="배열-인덱스들-중-최대--최소-구하는-법">&lt;배열 인덱스들 중 최대 / 최소 구하는 법&gt;</h2>
<p>배열 안의 인덱스 값들 중 최소값 / 최대값을 구하는 방법을 알아보자
최대 / 최소라 하면 바로 생각나는 바로 그것 !! <strong>☜(ﾟヮﾟ☜)</strong></p>
<pre><code class="language-javascript">Math.min() / Math.max()</code></pre>
<p>하지만 이 함수들을 배열에 바로 갖다 쓰게되면 </p>
<pre><code class="language-javascript">let arr = [1, 2, 3]
console.log(Math.min(arr))

//NaN 출력</code></pre>
<p>Not a Number가 출력된다.
왜냐하면 Math.min() / Math.max()는 배열이 아닌 고유한 변수를 기대하고 있는데, 배열을 넣으니 이미 첫번째 조건 입력 변수가 고유한 변수가 아니다에서 알고리즘이 끝나버리는 것이다.</p>
<p>그럼 이 배열을 숫자형식으로 바꿀 순 없을까???🤔</p>
<pre><code class="language-javascript">let arr = [1, 2, 3]
console.log(Math.min(...arr))

// 1 출력</code></pre>
<pre><code class="language-javascript">Math.min(...arr)
= Math.min(1, 2, 3)</code></pre>
<p>이렇게 표현할 수 있다.
이 구문은 ES6 / ES2016의 destructing 할당 구문이라고 한다
 destructing 할당 구문은 배열 또는 개체에서 데이터를 추출하여 별도의 변수로 만들 수 있는 JavaScript 식이다. （￣︶￣）↗　</p>
<p>그럼 문제를 풀어보자 😀</p>
<ol>
<li>위에서 배운 배열에서 최소값 구하는 방법으로 최소값을 구하고</li>
<li>최소값의 인덱스를 indexOf()를 이용하여 구한 후,</li>
<li>splice() 함수를 이용하여 해당 최소값의 인덱스를 제거해주면</li>
<li>답이 뙇👍</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(arr) {
    const min = Math.min(...arr)
    arr.splice(arr.indexOf(min), 1)
    return arr.length &lt; 1 ? [-1] : arr
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 정수 제곱근 판별]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%A0%95%EC%88%98-%EC%A0%9C%EA%B3%B1%EA%B7%BC-%ED%8C%90%EB%B3%84</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%A0%95%EC%88%98-%EC%A0%9C%EA%B3%B1%EA%B7%BC-%ED%8C%90%EB%B3%84</guid>
            <pubDate>Thu, 19 May 2022 01:42:42 GMT</pubDate>
            <description><![CDATA[<h2 id="정수-제곱근-판별">정수 제곱근 판별</h2>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12934">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.</li>
<li>n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.</li>
</ul>
<blockquote>
<p>제한 사항</p>
</blockquote>
<ul>
<li>n은 1이상, 50000000000000 이하인 양의 정수입니다.</li>
</ul>
<pre><code>입출력 예

n        return
121        144
3        -1


입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.</code></pre><p>정수인지 아닌지 판별하는 함수 isInteger()를 활용하면 좋을 것 같다.
또한 isInteger()는 Number()객체의 내장함수로 아래와 같이 써야 한다.
（￣︶￣）↗　</p>
<pre><code class="language-javascript">bool a = Number.isInteger(n)

//n 값이 정수면 true 아니면 false를 리턴하는 함수이다</code></pre>
<p>또한 제곱근 / 제곱을 구하는 Math 객체 내장 함수가 있다.</p>
<pre><code class="language-javascript">Math.sqrt(x)
//x의 제곱근을 반환한다

Math.pow(x, f)
//x의 f제곱을 반환한다

Math.sqrt(x) === Math.pow(x, 1/2)</code></pre>
<p>난 Math.pow()를 더 선호하기 때문에 이를 이용하려고 한다 😁</p>
<ol>
<li>먼저 입력받은 양의정수 n의 제곱근 값이 정수인지 판별해서</li>
<li>정수면 (제곱근 값 + 1)의 거듭제곱 값을 구하고</li>
<li>정수가 아니라면 -1을 리턴하자  (●&#39;◡&#39;●)</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(n) {
    return Number.isInteger(Math.pow(n, 1/2)) == true ? Math.pow((Math.pow(n,1/2) + 1), 2) : -1
}</code></pre>
<h2 id="추가-풀이-완성-코드">&lt;추가 풀이 완성 코드&gt;</h2>
<p>한줄로 긴 게 좀 신경쓰여서 풀어 써 보았다 🙂</p>
<pre><code class="language-javascript">function solution(n) {
    if(Number.isInteger(Math.pow(n, 1/2)) == true){
        return Math.pow((Math.pow(n, 1/2) + 1), 2)
    }else {
        return -1
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 자연수 뒤집어 배열로 만들기]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%9E%90%EC%97%B0%EC%88%98-%EB%92%A4%EC%A7%91%EC%96%B4-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%9E%90%EC%97%B0%EC%88%98-%EB%92%A4%EC%A7%91%EC%96%B4-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 19 May 2022 01:24:51 GMT</pubDate>
            <description><![CDATA[<h1 id="자연수-뒤집어-배열로-만들기">자연수 뒤집어 배열로 만들기</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12932">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. </li>
<li>예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.</li>
</ul>
<blockquote>
<p>제한 조건</p>
</blockquote>
<ul>
<li>n은 10,000,000,000이하인 자연수입니다.</li>
</ul>
<pre><code>입출력 예

n        return
12345    [5,4,3,2,1]</code></pre><p>무난한 문제다 🙂
입력받은 자연수를 배열화하여 뒤집은 배열을 출력해주면 된다（￣︶￣）↗　</p>
<ol>
<li>split() 함수를 이용해 입력받은 자연수 n을 배열화 해준 후</li>
<li>reverse() 함수를 통해 배열의 순서를 뒤집는다</li>
<li>뒤집은 배열을 반복문을 통해</li>
<li>새로운 배열에 넣어줍니다 👍</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(n) {
    let answer = []
    let a = (n + &#39;&#39;).split(&#39;&#39;).reverse()
    for(let i = 0; i &lt; a.length; i++){
        answer[i] = parseInt(a[i])
    }
    return answer
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 자릿수 더하기]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 19 May 2022 01:15:58 GMT</pubDate>
            <description><![CDATA[<h1 id="자릿수-더하기">자릿수 더하기</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12931">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.</li>
<li>예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.</li>
</ul>
<blockquote>
<p>제한사항</p>
</blockquote>
<ul>
<li>N의 범위 : 100,000,000 이하의 자연수</li>
</ul>
<pre><code>입출력 예

N        answer
123        6
987        24


입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.</code></pre><p>무난한 문제다 🙂</p>
<ol>
<li>먼저 입력된 자연수 N을 split() 함수를 이용하여 배열로 쪼개준 후</li>
<li>반복문으로 각 인덱스 값들을 더해주는데</li>
<li>배열로 쪼갤 때 인덱스 값들이 string type 이므로</li>
<li>parseInt()를 이용해 정수로 변환해준 후 더해주자 （￣︶￣）↗　</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(n){
    let str = (n + &#39;&#39;).split(&#39;&#39;)
    let answer = 0
    for(let i = 0; i &lt; str.length; i++){
        answer += parseInt(str[i])
    }
    return answer
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 이상한 문자 만들기]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%9D%B4%EC%83%81%ED%95%9C-%EB%AC%B8%EC%9E%90-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%9D%B4%EC%83%81%ED%95%9C-%EB%AC%B8%EC%9E%90-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 18 May 2022 15:53:04 GMT</pubDate>
            <description><![CDATA[<h1 id="이상한-문자-만들기">이상한 문자 만들기</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12930">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>문자열 s는 한 개 이상의 단어로 구성되어 있습니다. </li>
<li>각 단어는 하나 이상의 공백문자로 구분되어 있습니다. </li>
<li>각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.</li>
</ul>
<blockquote>
<p>제한 사항</p>
</blockquote>
<ul>
<li>문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.</li>
<li>첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.</li>
</ul>
<p>단어별로 인덱스를 파악하라는 것은 배열화 하여 이중배열 처리를 해라라는 뜻으로 해석했다  🙂</p>
<pre><code>입출력 예

s                    return
&quot;try hello world&quot;    &quot;TrY HeLlO WoRlD&quot;</code></pre><p>단어 하나하나를 배열로 보면 위 제한사항이 이해된다 😀</p>
<p>어떻게 풀까?</p>
<ol>
<li>먼저 입력된 문자열을 split() 함수를 통해 쪼개어 인덱스 값들이 단어인 배열을 만든다.</li>
<li>그 후 map() 함수를 이용하여 각 단어들을 다시 split()함수를 사용하여 쪼개어 이중 배열을 만든다.</li>
<li>각 배열의 인덱스 값들을 % 연산자를 통해 짝/홀수를 판별하고</li>
<li>조건문을 통해 짝수는 toUpperCase() / 홀수는 toLowerCase()를 적용한 후</li>
<li>join() 함수를 통해 각 내부 배열들을 합쳐 String 값으로 리턴한 후</li>
<li>다시 join 함수를 통해 바깥 큰 배열을 합쳐 String 값으로 반환하면?</li>
<li>답이 뙇👍</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(s) {
    return s
        .split(&quot; &quot;)
        .map(x =&gt; x.split(&#39;&#39;)
            .map((e, index) =&gt; index % 2 === 0 ? e.toUpperCase() : e.toLowerCase())
                .join(&#39;&#39;))
        .join(&#39; &#39;)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 완주하지 못한 선수]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98</guid>
            <pubDate>Tue, 17 May 2022 00:39:57 GMT</pubDate>
            <description><![CDATA[<h1 id="완주하지-못한-선수">완주하지 못한 선수</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/42576">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>수많은 마라톤 선수들이 마라톤에 참여하였습니다. </li>
<li>단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.</li>
<li>마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, </li>
<li>완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.</li>
</ul>
<p>단 한명이라고 엄청 강조하네요??🤔</p>
<blockquote>
<p>제한사항</p>
</blockquote>
<ul>
<li>마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.</li>
<li>completion의 길이는 participant의 길이보다 1 작습니다.</li>
<li>참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.</li>
<li>참가자 중에는 동명이인이 있을 수 있습니다.</li>
</ul>
<p>동명이인 이라는 키워드 중요할 것 같다. 😗
<img src="https://velog.velcdn.com/images/zerovo_dka/post/f9b18ffb-2a94-4949-bdea-a9d7cb5030d8/image.png" alt=""></p>
<pre><code class="language-javascript">입출력 예 설명

예제 #1
&quot;leo&quot;는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
&quot;vinko&quot;는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
&quot;mislav&quot;는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에
한명은 완주하지 못했습니다.</code></pre>
<p>예제 #3을 어떻게 뽑아내는지가 중요할 것으로 보인다.</p>
<p>그럼 어떻게 풀면 좋을까??🤔</p>
<ol>
<li>두 배열을 정렬해서 반복문을 통해 하나씩 점검한 다음 같은 index값의 element가 다를 경우 출력해주면 완주하지 못한 사람이 나올 것 같다.</li>
<li>다른 방법은 생각해내지 못했다 🤣🤣</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(participant, completion) {
    participant.sort()
    completion.sort()

    for(let i = 0; i &lt; participant.length; i++){
        if(participant[i] !== completion[i]){
            return participant[i]
        }
    }
}</code></pre>
<p>생각보다 되게 간단히 풀리는 문제였다.
다만 뭔가 다른 방법이 없을까.. 하고 다른 분들의 풀이를 찾아보는데</p>
<h2 id="추가-코드">&lt;추가 코드&gt;</h2>
<pre><code class="language-javascript">function solution(participant, completion) {
const map = new Map()
    for(let i = 0; i &lt; participant.length; i++){
        let a = participant[i],
            b = completion[i]

        map.set(a, (map.get(a) || 0) + 1)
        map.set(b, (map.get(b) || 0) - 1)
    }

    for(let [key, value] of map){
        if(value &gt; 0){
            return key
        }
    }
    return 
}</code></pre>
<p>처음 보고 무슨  소리지 했다 
근데 이 코드가 가독성이 좋다는 댓글이 있어 꼭 이해하고 넘어가야겠다 싶었고
자바스크립트에서 자주 쓰는 Hash Table 개념이 들어가있다고 했다.</p>
<p>그래서 map 함수와 Hash Table에 대해 공부해보았다.</p>
<h3 id="map-함수--hash-table">&lt;Map 함수 / Hash Table&gt;</h3>
<p>Map() JS 내장 객체는 새로운 배열을 만드는 함수들을 갖고있는 객체이다.</p>
<pre><code class="language-javascript">map.set(a, (map.get(a) || 0) + 1)
map.set(b, (map.get(b) || 0) - 1)</code></pre>
<p>이 코드로 설명을 하자면,</p>
<blockquote>
<p>map.set(key값, value값) </p>
</blockquote>
<ul>
<li>{key : value, key1 : value1 ....}</li>
<li>이러한 형태의 Hash Table을 만드는 함수이다</li>
</ul>
<blockquote>
<p>map.get(key값)</p>
</blockquote>
<ul>
<li>입력된 key값이 해당 Hash Table에 존재할 경우 True</li>
<li>없을 경우 False를 반환하는 함수이다</li>
</ul>
<p>이 배경 지식들을 바탕으로, 풀이를 해보면</p>
<ol>
<li>a라는 key 값을 넣어주는데, value 값으로 (map.get(a) || 0) + 1이 들어간다</li>
<li>(map.get(a) || 0) + 1 여기에서 a라는 값은 아직 key값으로 대입되기 전 이기 때문에 map.get(a)는 false가 return되어 0이 반환되고 +1이 되어 value 값으로 1이 대입되는 것이다.<blockquote>
<ul>
<li>map.get(key) || 0     ==&gt; map.get이 false 면 0을</li>
</ul>
</blockquote>
<ul>
<li>map.get(key) &amp;&amp; 0 ==&gt; map.get이 true 면 0을</li>
</ul>
</li>
</ol>
<p>이 내용을 콘솔창에 찍어보면 이렇게 나온다 （￣︶￣）↗　</p>
<p><img src="https://velog.velcdn.com/images/zerovo_dka/post/51b5c203-1ee3-48e7-9f5d-b2f7d6bb090d/image.png" alt=""></p>
<p>마지막 undefined =&gt; -1은 completion 배열이 participant 배열보다 길이가 1 작기때문에 출력된 값이다.</p>
<p>즉 여기서 이 값들을 통해 Hash Table의 value 값이 0보다 큰 경우</p>
<pre><code class="language-javascript">for(let [key, value] of map){
        if(value &gt; 0){
            return key
        }
    }</code></pre>
<p>를 출력하면 탈락자의 key값이 return되게 되는것이다.</p>
<p>코드 하나로 몇시간을 보냈는지 모르겠다 🙂</p>
<p>하지만 이런게 싫다면 개발자 어떻게 해 ¯_(ツ)_/¯</p>
<p>즐겨~😁</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 수박수박수박수박수박수?]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98%EB%B0%95%EC%88%98</guid>
            <pubDate>Mon, 16 May 2022 13:59:19 GMT</pubDate>
            <description><![CDATA[<h1 id="수박수박수박수박수박수">수박수박수박수박수박수?</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12922">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<p>여기 공간에 글 쓰는건 처음인 것 같은데 제목이 참 정신이 없다 😣</p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>길이가 n이고, &quot;수박수박수박수....&quot;와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. </li>
<li>예를들어 n이 4이면 &quot;수박수박&quot;을 리턴하고 3이라면 &quot;수박수&quot;를 리턴하면 됩니다.</li>
</ul>
<p>&#39;수박&#39; 이라는 String이 반복되고, 짝수/홀수를 구분해야겠네 🤔</p>
<blockquote>
<p>제한 조건</p>
</blockquote>
<ul>
<li>n은 길이 10,000이하인 자연수입니다.</li>
</ul>
<pre><code>입출력 예

n    return
3    &quot;수박수&quot;
4    &quot;수박수박&quot;</code></pre><p>홀수일 땐 &#39;수&#39;를 따로 더해주고 짝수일 땐 &#39;수박&#39; 반복 해주면 될듯한데??
repeat() 함수 쓰면 좋겠구나!!（￣︶￣）↗　</p>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(n) {
    let a = new Array(n)

    if(n % 2 === 0){
        a = &#39;수박&#39;.repeat(n/2)
    }else{
        a = &#39;수&#39;+&#39;박수&#39;.repeat(n/2)
    }
    return a
}</code></pre>
<p>아주 쉬운 문제였다. 😁</p>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12922/solution_groups?language=javascript">프로그래머스에 어마어마한 코드가 있던데 보러가실래요??</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 서울에서 김서방 찾기]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EC%84%9C%EC%9A%B8%EC%97%90%EC%84%9C-%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Mon, 16 May 2022 13:47:26 GMT</pubDate>
            <description><![CDATA[<h1 id="서울에서-김서방-찾기">서울에서 김서방 찾기</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12919">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>String형 배열 seoul의 element중 &quot;Kim&quot;의 위치 x를 찾아, &quot;김서방은 x에 있다&quot;는 String을 반환하는 함수, solution을 완성하세요. </li>
<li>seoul에 &quot;Kim&quot;은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.</li>
</ul>
<p>배열에서 x가 위치라는 것을 보니 index 값을 갖고 오는게 키포인트구나 😀</p>
<blockquote>
<p>제한 사항</p>
</blockquote>
<ul>
<li>seoul은 길이 1 이상, 1000 이하인 배열입니다.</li>
<li>seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.</li>
<li>&quot;Kim&quot;은 반드시 seoul 안에 포함되어 있습니다.</li>
</ul>
<pre><code>입출력 예

seoul                return
[&quot;Jane&quot;, &quot;Kim&quot;]        &quot;김서방은 1에 있다&quot;</code></pre><p>간단한 문제로 확인된다 (❁´◡`❁)</p>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(seoul) {
    let position = seoul.indexOf(&#39;Kim&#39;)

    return `김서방은 ${position}에 있다`
}
</code></pre>
<blockquote>
<p>indexOf(찾고자 하는 String , 검색 시작 위치)</p>
</blockquote>
<ul>
<li>찾고자 하는 String 값의 index 값을 반환한다.</li>
</ul>
<p>오죽 배열에서 index 값을 많이쓰면 이런 내장함수가 있을까 🤣😁</p>
<p>덕분에 좋은 내장함수 하나 알고갑니다~(～￣▽￣)～</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm - 문자열 다루기 기본]]></title>
            <link>https://velog.io/@zerovo_dka/Algorithm-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%8B%A4%EB%A3%A8%EA%B8%B0-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@zerovo_dka/Algorithm-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%8B%A4%EB%A3%A8%EA%B8%B0-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Mon, 16 May 2022 13:39:53 GMT</pubDate>
            <description><![CDATA[<h1 id="문자열-다루기-기본">문자열 다루기 기본</h1>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12918">&lt;프로그래머스 문제를 기반으로 합니다&gt;</a></p>
<blockquote>
<p>문제 설명</p>
</blockquote>
<ul>
<li>문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. </li>
<li>예를 들어 s가 &quot;a234&quot;이면 False를 리턴하고 &quot;1234&quot;라면 True를 리턴하면 됩니다.</li>
</ul>
<p>입력값 s의 구성 문자가 숫자로만 이루어져 있는지 파악하는 문제다!!
딱 보자마자 생각난 건 정규표현식 이었다 🙂</p>
<blockquote>
<p>제한 사항</p>
</blockquote>
<ul>
<li>s는 길이 1 이상, 길이 8 이하인 문자열입니다.</li>
</ul>
<pre><code class="language-javascript">입출력 예
s        return
&quot;a234&quot;    false
&quot;1234&quot;    true</code></pre>
<p>어떻게 푸는게 좋을까?? 🙄</p>
<ol>
<li>정규표현식을 찾아서 검사하는 내장 함수를 찾아보자!!</li>
<li>Number(), parseInt() 같은 문자열 =&gt; 숫자 변환 함수를 사용하여 나오는 출력값을 어떻게 비교하면  되지 않을까?? ¯_(ツ)_/¯</li>
</ol>
<h2 id="풀이-완성-코드">&lt;풀이 완성 코드&gt;</h2>
<pre><code class="language-javascript">function solution(s) {
    return (s.length === 4 || s.length === 6) &amp;&amp; /^[0-9]+$/.test(s)
}</code></pre>
<p>정규표현식을 이용한 풀이이다.
정규표현식에 쓰인 의미들을 간단히 살펴보자!! 😁</p>
<blockquote>
</blockquote>
<ul>
<li>점검 하고자 하는 것 들 : /[0-9]/ /[a-z]/ /[A-Z]/ ...</li>
<li>^ : 정규 표현식 시작을 뜻함</li>
<li>$ : 정규 표현식 끝을 뜻함</li>
<li>+ : 반복해서 체크해라라는 명령</li>
</ul>
<blockquote>
<p>test() 메서드</p>
</blockquote>
<ul>
<li>주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환합니다.</li>
</ul>
<p>굉장히 유요한 메서드와 정규표현식에 대해 공부할 수 있었던 코드였다.
<a href="https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=jeongju02&amp;logNo=221517177533">&lt;많이 사용하는 정규표현식 궁금하지?????&gt;</a></p>
<h2 id="추가-풀이-완성-코드">&lt;추가 풀이 완성 코드&gt;</h2>
<p>이게 Number()랑 parseInt() 가지고 노는 코드이다
좀 어려웠다 🤣</p>
<pre><code class="language-javascript">function solution(s) {
    answer = (s.length === 4 || s.length === 6) &amp;&amp; Number(s) === parseInt(s)
}</code></pre>
<p>이 코드의 중요한 점은 NaN 이다.</p>
<p>문자가 포함된 String 값을 Number() / parseInt() 하게 되면, 모두 NaN을 반환한다.</p>
<p>그 떄 NaN은 특이하게 아래와 같이 리턴한다.</p>
<pre><code class="language-javascript">NaN === NaN  // false</code></pre>
<p>그렇기에 s 값에 문자가 포함된 String 값이 입력되면 &amp;&amp; 후자의 코드에서 무조건 false 값이 반환되므로, 문자가 들어간 String을 구별해낼 수 있게 되는 것이다. （￣︶￣）↗　</p>
<p><a href="https://ryublock.tistory.com/43">&lt;undefined / NaN / Null&gt; 궁금하지!!??</a></p>
]]></description>
        </item>
    </channel>
</rss>