<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>_dodo_hee.log</title>
        <link>https://velog.io/</link>
        <description>무럭무럭 자라나는 도도 개발성장일기</description>
        <lastBuildDate>Mon, 04 Dec 2023 06:01:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>_dodo_hee.log</title>
            <url>https://images.velog.io/images/_dodo_hee/profile/c1a61ec1-9a7f-4e88-b1ff-21aece2b3877/47F6CE15-82FE-47FD-9377-0897482F56CF.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. _dodo_hee.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_dodo_hee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[자바스크립트 - 클로저]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%81%B4%EB%A1%9C%EC%A0%80</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%81%B4%EB%A1%9C%EC%A0%80</guid>
            <pubDate>Mon, 04 Dec 2023 06:01:12 GMT</pubDate>
            <description><![CDATA[<p>클로저에 대해서 아나요? 🔥🔥
클로저를 사용하면 뭐가 좋죠? 🔥
클로저를 어떻게 생성하나요? 🔥</p>
<h1 id="클로저">클로저</h1>
<blockquote>
<p>함수가 속한 렉시컬 스코프(Lexical Environment)를 기억하여, 함수가 렉시컬 스코프 밖에서 실행될 때도 이 스코프에 접근할 수 있게 해주는 기능.</p>
</blockquote>
<p>쉽게 설명하면, 클로저는 &quot;폐쇄,갇히다&quot; 라는 뜻으로 사용되고 있는데, 자바스크립트에서는 함수가 선언될(생성될) 그 당시에 주변의 환경과 함께 갇히는 것을 말한다.</p>
<p>또 다르게 설명하면, 내부함수는 외부함수의 지역변수에 접근할 수 있는데,
외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근할 수 있는 것이다.</p>
<h3 id="렉시컬-스코프">렉시컬 스코프</h3>
<p>함수가 선언이 되는 위치에 따라서 상위 스코프가 결정되는 스코프입니다. 함수가 선언이 될 때, 스코프가 생성된다.</p>
<h2 id="외부-함수의-변수를-참조하는-내부-함수">외부 함수의 변수를 참조하는 내부 함수</h2>
<pre><code class="language-javascript">const outer = () =&gt; {
  let a = 1;
  const inner = () =&gt; {
    console.log(++a); //2
  };
  inner();
};
outer();</code></pre>
<p>inner 함수 내부에서는 a를 선언하지 않았기 때문에 환경레코드에서 값을 찾지 못해서 외부 환경 참조에 지정된 상위 컨텍스트인 outer의 렉시컬환경에 접근해서 다시 a를 찾는다.</p>
<p>outer의 함수의 실행컨텍스트가 종료되면 렉시컬 환경에 저장된 식별자들(a, inner)에 대한 참조를 지운다.</p>
<p>주소에 저장되어있던 값들은 자신을 참조하는 변수가 하나도 없게 되서 가비지 컬렉터의 수집 대상이 된다.</p>
<h2 id="클로저를-사용하는-이유">클로저를 사용하는 이유</h2>
<h3 id="데이터를-보존할-수-있다">데이터를 보존할 수 있다.</h3>
<p>클로저 함수는 외부 함수의 실행이 끝나더라도 외부 함수 내 변수를 사용할 수 있다.
클로저는 이처럼 특정 데이터를 스코프 안에 가두어 둔 채로 계속 사용할 수 있게하는 폐쇄성을 갖는다.</p>
<h3 id="정보의-접근-제한-캡슐화">정보의 접근 제한 (캡슐화)</h3>
<p>‘클로저 모듈 패턴’을 사용해 객체에 담아 여러 개의 함수를 리턴하도록 만든다.
이러한 정보의 접근을 제한하는 것을 캡슐화라고 한다.</p>
<h3 id="모듈화에-유리하다">모듈화에 유리하다.</h3>
<p>클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있다.
이와 같이 함수의 재사용성을 극대화 함수 하나를 독립적인 부품의 형태로 분리하는 것을 모듈화라고한다.
클로저를 통해 데이터와 메소드를 묶어다닐 수 있기에 클로저는 모듈화에 유리하다.</p>
<h2 id="클로저-생성하는-방법">클로저 생성하는 방법</h2>
<p>함수가 생성될때마다 생성된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 - 실행컨텍스트]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%96%89%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%8B%A4%ED%96%89%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Mon, 20 Nov 2023 10:05:28 GMT</pubDate>
            <description><![CDATA[<p>실행 컨텍스트 🔥
실행 컨텍스트에 대해 말해보세요 🔥🔥</p>
<h1 id="실행-컨텍스트">실행 컨텍스트</h1>
<blockquote>
<p>실행할 코드에 제공할 환경 정보들을 모아놓은 객체
자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념</p>
</blockquote>
<p>자바스크립트는 실행 컨텍스트가 활성화되는 시점에 다음과 같은 현상이 발생한다.</p>
<ul>
<li>호이스팅이 발생한다.(선언된 변수를 위로 끌어올린다.)</li>
<li>외부 환경 정보를 구성한다.</li>
<li>this 값을 설정한다.</li>
</ul>
<h2 id="실행-컨텍스트-구성">실행 컨텍스트 구성</h2>
<ul>
<li>전역공간은 자동으로 컨텍스트로 구성된다.</li>
<li>함수를 실행한다.</li>
<li>eval()함수를 실행한다.</li>
<li>block을 만든다 (ES6+)</li>
</ul>
<pre><code class="language-javascript">var a = 1; // 전역 컨텍스트
function outer () { // outer 컨텍스트
  function inner () { // inner 컨텍스트
    console.log(a); // undefined
    var a = 3;
    console.log(a); // 3
  }
  inner();
  console.log(a); // 1
}
outer();
console.log(a); // 1</code></pre>
<ol>
<li>프로그램 실행 : [전역컨텍스트]</li>
<li>outer 실행 : [전역컨텍스트, outer]</li>
<li>inner 실행 : [전역컨텍스트, outer, inner]</li>
<li>inner 종료 : [전역컨텍스트, outer]</li>
<li>outer 종료 : [전역컨텍스트]</li>
</ol>
<h2 id="실행-컨텍스트-구성할때-생기는-것">실행 컨텍스트 구성할때 생기는 것</h2>
<h3 id="variableenvironment">VariableEnvironment</h3>
<ul>
<li>현재 컨텍스트 내의 식별자들의 대한 정보</li>
<li>외부 환경 정보</li>
<li>선언 시점의 LexicalEnvironment의 스냅샷 (최초 실행 시의 스냅샷을 유지)</li>
</ul>
<h3 id="lexicalenvironment">LexicalEnvironment</h3>
<ul>
<li>처음에는 VariableEnvironment와 같음</li>
<li>변경 사항이 실시간으로 반영 됨</li>
<li>환경 레코드로 인해서 호이스팅이 발생한다.</li>
<li>외부 환경참조로 인해 스코프와 스코프체인이 형성된다.</li>
</ul>
<h3 id="thisbining">ThisBining</h3>
<ul>
<li>식별자가 바라봐야할 대상 객체</li>
</ul>
<h2 id="환경-레코드와-호이스팅">환경 레코드와 호이스팅</h2>
<p>자바스크립트 엔진은 코드를 실행하기전에 식별자를 수집한다.</p>
<h3 id="환경-레코드">환경 레코드</h3>
<blockquote>
<p>현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다.</p>
</blockquote>
<ul>
<li>매개변수 식별자</li>
<li>함수 자체</li>
<li>함수 내부의 식별자</li>
</ul>
<h3 id="host-object-호스트-객체">Host Object (호스트 객체)</h3>
<ul>
<li>전역 실행 컨텍스트는 변수 객체를 생성하는 대신 전역 객체를 활용한다.</li>
<li>브라우저의 Window 객체, Node의 Global 객체 등이 해당한다.</li>
<li>이들은 Host Object로 분류된다.</li>
</ul>
<p>즉, 코드가 실행 되기 전에 자바스크립트의 엔진은 이미 실행 컨텍스트에 속한 변수명들을 모두 알고 있게 되는 셈이다.</p>
<h3 id="호이스팅">호이스팅</h3>
<p>자바스크립트 엔진의 실제 동작 방식 대신에 자바스크립트 엔진은 &quot;식별자들을 최상단으로 끌어올려놓은 다음, 실제 코드를 실행한다&quot; 라고 생각해 코드 해석에 문제되는 것이 없다.</p>
<blockquote>
<p>자바스크립트 엔진이 실제로 변수를 끌어올리지 않지만, 편의상 끌어올리는 것이라고 간주한다.</p>
</blockquote>
<h2 id="외부환경참조와-스코프">외부환경참조와 스코프</h2>
<h3 id="scope">scope</h3>
<blockquote>
<p>스코프란 식별자에 대한 유효범위이다.</p>
</blockquote>
<ul>
<li>Scope A의 외부에서 선언한 변수는, A의 외부/내부 모두 접근 가능하다.</li>
<li>A의 내부에서 선언한 변수는 오직 A의 내부에서만 접근할 수 있다.</li>
</ul>
<p><strong>자바스크립트는 오직 함수에 의해서 스코프가 생성된다.</strong></p>
<h3 id="scope-chain">scope chain</h3>
<ul>
<li>식별자의 유효범위를 안에서 바깥으로 차례로 검색해나가는 것</li>
<li>이를 가능하게 하는 것이 외부환경참조이다.</li>
</ul>
<h2 id="실행-컨텍스트-스택">실행 컨텍스트 스택</h2>
<blockquote>
<p>생성된 실행 컨텍스트는 스택으로 관리된다.</p>
</blockquote>
<p>자바스크립트 엔진은 먼저 전역 코드를 평가하여 저역 실행 컨텍스트를 생성한다.
함수가 호출되면 함수 코드를 평가하여 함수 실행 컨텍스트를 생성한다.</p>
<h2 id="소스코드의-타입">소스코드의 타입</h2>
<p>4가지의 타입의 소스코드는 실행 컨텍스트를 생성한다.</p>
<h3 id="전역-코드-global-code">전역 코드 global code</h3>
<ul>
<li>전역 코드 전역에 존재하는 소스코드를 말한다.</li>
<li>전역에 정의된 함수, 클래스 등의 내부 코드는 포함되지 않는다.</li>
</ul>
<p>전역 변수를 관리를 위해 최상위 스코프인 전역 스코프 생성 필요
var 키워드로 선언된 전역 변수, 함수 선언문으로 정의된 전역 함수를 
전역 객체의 프로퍼티와 메서드로 바인딩하고 참조하기 위해 전역 객체와 연결되어야한다.
전역코드 평가 -&gt; 전역 실행 컨텍스트가 생성.</p>
<h3 id="함수-코드-function-code">함수 코드 function code</h3>
<ul>
<li>함수 내부에 존재하는 소스코드를 말한다.</li>
<li>함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함되지 않는다.</li>
</ul>
<p>함수 코드는 지역 스코프를 생성하고 지역 변수, 매개변수, arguments 객체를 관리.
생성한 지역 스코프를 전역 스코프에서 시작하는 스코프 체인의 일원으로 연결해야한다.
함수 코드 평가 -&gt; 함수 실행 컨텍스트 생성.</p>
<h3 id="eval-코드-eval-code">eval 코드 eval code</h3>
<ul>
<li>빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드를 말한다.</li>
</ul>
<p>strict mode에서 자신만의 독자적인 스코프를 생성한다.
eval 코드 평가 -&gt; eval 실행 컨텍스트 생성.</p>
<h3 id="모듈-코드-module-code">모듈 코드 module code</h3>
<ul>
<li>모듈 내부에 존재하는 소스코드를 말한다.</li>
<li>모듈 내부의 함수,클래스 등의 내부코드는 포함되지 않는다.</li>
</ul>
<p>모듈별로 독립적인 모듈 스코프를 생성한다.
모듈 코드 평가 -&gt; 모듈 실행 컨택스트 생성.</p>
<h2 id="소스코드의-평가와-실행">소스코드의 평가와 실행</h2>
<h3 id="평가-과정">평가 과정</h3>
<ul>
<li>실행 컨텍스트를 생성</li>
<li>변수, 함수 등의 선언문만 먼저 실행하여 생성된 변수나 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프에 등록</li>
</ul>
<h3 id="실행-과정">실행 과정</h3>
<ul>
<li>선언문을 제외한 소스코드가 순차적으로 실행되기 시작(런타임)</li>
<li>변수나 함수의 참조를 실행 컨텍스트가 관리하는 스코프에서 검색해서 취득.</li>
<li>변수 값 변경과 같은 소스코드 실행결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 this]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-this</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-this</guid>
            <pubDate>Mon, 13 Nov 2023 08:42:57 GMT</pubDate>
            <description><![CDATA[<p>this가 뭔가요? 🔥
this 바인딩이란? 🔥
this는 동적으로 바인딩이 된다고 하는데 바인딩되는 객체가 어떻게 다르나요?</p>
<h1 id="this">this</h1>
<blockquote>
<p>this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수다.
this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메소드를 참조할 수 있다.</p>
</blockquote>
<p>this는 자바스크립트 엔진에 의해 암묵적으로 생성되며,
코드 어디서든 참조할 수 있다.</p>
<p>함수를 호출하면 arguments 객체와 this가 암묵적으로 함수 내부에 전달된다.
함수 내부에서 arguments 객체를 지역 변수처럼 사용할 수 있는 것철 this도 지역 변수처럼 사용할 수 있다.</p>
<p>단, this가 가르키는 값, 즉 this 바인딩은 함수 호출 방식에 의해 동적으로 결정된다.</p>
<h2 id="this-바인딩">this 바인딩</h2>
<blockquote>
<p>바인딩이란 식별자와 값을 연결하는 과정을 의미한다.
this 바인딩은 this가 가리킬 객체를 바인딩하는 것이다.</p>
</blockquote>
<p>하지만 자바스크립트의 this는 함수가 호출되는 방식에 따라 this에 바인딩 될 값.
즉, this 바인딩이 동적으로 결정된다.</p>
<h3 id="객체-리터럴">객체 리터럴</h3>
<p>객체 리터럴의 메서드 내부에서의 this는 메서드를 호출한 객체, 즉 circle을 가리킨다.</p>
<pre><code class="language-javascript">const circle = {
  radius: 5,
  getDiameter() {
       // this는 메소드를 호출한 객체를 가리킨다.
    return 2 * this.radius;
  }
};

console.log(circle.getDiameter()); //10</code></pre>
<h3 id="생성자-함수">생성자 함수</h3>
<p>생성자 함수 내부의 this는 생성자 함수가 생성할 인스턴스를 가리킨다.</p>
<pre><code class="language-javascript">function Circle(radius) = {
  // this는 생성자 함수가 생성할 인스턴스를 가리킨다.
  this.redius = radius;
};

Circle.prototype.getDiameter = function () {
 // this는 생성자 함수가 생성할 인스턴스를 가리킨다.
 return 2 * this.radius;
}

// 인스턴스 생성
const circle = new Circle(5);
console.log(circle.getDiameter()); //10</code></pre>
<h3 id="자바스크립트만-다르다">자바스크립트만 다르다.</h3>
<p>java, c++ 같은 클래스 기반 언어의 this는 클래스가 생성하는 인스턴스를 가리킨다.</p>
<p>자바스크립트의 this는 함수가 호출되는 방식에 따라 this에 바인딩 될 값,
즉 this 바인딩이 동적으로 결정된다.
또한, strict mode 역시 this 바인딩에 영향을 준다.</p>
<h1 id="함수-호출-방식과-this-바인딩">함수 호출 방식과 this 바인딩</h1>
<blockquote>
<p>this 바인딩은 함수 호출 방식.
즉, 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다.</p>
</blockquote>
<h3 id="렉시컬-스코프와-this-바인딩은-결정-시기가-다르다">렉시컬 스코프와 this 바인딩은 결정 시기가 다르다.</h3>
<p>함수의 상위 스코프를 결정하는 방식인 렉시컬 스코프는 함수 정의가 평가되어 
함수 객체가 생성되는 시점에 상위 스코프를 결정한다.
하지만 this 바인딩은 함수 호출 시점에 결정된다.</p>
<h2 id="일반-함수-호출">일반 함수 호출</h2>
<blockquote>
<p>this에는 전역 객체가 바인딩된다.</p>
</blockquote>
<p>일반 함수로 호출하면 함수 내부의 this에는 전역 객체가 바인딩된다.</p>
<pre><code class="language-javascript">foo(); // window</code></pre>
<ol start="2">
<li>메서드 호출</li>
</ol>
<blockquote>
<p>this에는 전역 객체가 바인딩된다.</p>
</blockquote>
<p>프로토타입 메서드 내부에서 사용된 this도 일반 메서드와 마찬가지로 해당 메서드를 호출한 객체에 바인딩 된다.</p>
<pre><code class="language-javascript">const obj = { foo };
obj.foo(); // obj</code></pre>
<ol start="3">
<li>생성자 함수 호출</li>
</ol>
<blockquote>
<p>생성자 함수 내부의 this에는 생성자 함수가 미래에 생성할 인스턴스가 바인딩된다.</p>
</blockquote>
<pre><code class="language-javascript">new foo(); // foo{}</code></pre>
<ol start="4">
<li>Function.prototype.apply/call/bind 메서드에 의한 간접 호출</li>
</ol>
<blockquote>
<p>apply,bind,call 메서드는 Function.prototype의 메서드이다.
즉, 이들의 메서드는 모든 함수가 상속받아 사용할 수 있다.</p>
</blockquote>
<p>apply와 call 메서드의 본질적인 기능은 함수를 호출하는 것이다.
this와 콜백 함수 내부의 this가 상이하면 문맥상 문제가 발생한다.
따라서 콜백 함수 내부의 this를 외부 함수 내부의 this와 일치시켜야한다.
이때 bind 메서드를 사용해서 this를 일치시킬 수 있다.</p>
<pre><code class="language-javascript">const bar = {name : &quot;bar&quot;};

foo.call(bar); // bar
foo.apply(bar); // bar
foo.bind(bar); // bar</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 strict mode]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-strict-mode</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-strict-mode</guid>
            <pubDate>Mon, 13 Nov 2023 00:47:16 GMT</pubDate>
            <description><![CDATA[<h1 id="strict-mode">strict mode</h1>
<blockquote>
<p>자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업애 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생시킨다.</p>
</blockquote>
<ul>
<li>린트도구 : 소스코드를 실행하기 전에 소스코드를 스캔하여 문법적 오류만이 아니라 
잠재적 오류까지 찾아내고 오류의 원인을 리포팅해주는 도구</li>
</ul>
<p>stirct mode가 제한하는 오류는 물론 코딩 컨벤션을 설정 파일 형태로 정의 하고
강제할 수 있기 때문에 더욱 강력한 효과를 얻을 수 있다.</p>
<h2 id="사용방법">사용방법</h2>
<p>전역의 선두 또는 함수 몸체의 선두에 &#39;use strict&#39; 추가한다.
전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.</p>
<p>맞는 방법</p>
<pre><code class="language-javascript">&#39;use strict&#39;

function foo (){
    x = 10; // reference Error
}

foo();</code></pre>
<p>틀린 방법 (제대로 동작하지 않음)</p>
<pre><code class="language-javascript">
function foo (){
    x = 10; // 에러 발생 안됨
  &#39;use strict&#39;
}

foo();</code></pre>
<h3 id="전역에-strict-mode는-피해야한다">전역에 strict mode는 피해야한다.</h3>
<p>외부에 서드파티 라이브러리를 사용하면 non-strict-mode인 경우가 있어서
전역에 strict mode를 적용하는 것은 바람직 하지 않다.</p>
<p>이럴땐 즉시 실행 함수로 스크립트 전체를 감싸서
스코프를 구분하고 즉시 실행 함수의 선두에 strict mode를 적용한다.</p>
<h3 id="함수-단위로-strict-mode를-적용하는-것도-피하자">함수 단위로 strict mode를 적용하는 것도 피하자.</h3>
<p>어떤 함수는 적용하고, 어떤 함수는 적용 안하는 것은 바람직하지 않다
모든 함수에 일일이 strict mode를 적용하는 건 번거롭다.
함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 문제가 발생할 수 있다.</p>
<p>=&gt; 그래서 strict mode는 즉시 실행 함수로 감싼 스크리브 단위로 적용하는 것이 바람직하다.</p>
<h2 id="strict-mode가-발생시키는-에러">strict mode가 발생시키는 에러</h2>
<ul>
<li>암묵적 전역</li>
<li>변수, 함수, 매개변수의 삭제</li>
<li>매개변수 이름의 중복</li>
<li>with 문의 사용</li>
</ul>
<h2 id="strict-mode를-적용에-의한-변화">strict mode를 적용에 의한 변화</h2>
<h3 id="일반-함수의-this">일반 함수의 this</h3>
<p>strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다.
생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다.</p>
<h3 id="arguments-객체">arguments 객체</h3>
<p>strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 - 객체지향 프로그래밍]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Thu, 26 Oct 2023 12:50:46 GMT</pubDate>
            <description><![CDATA[<p>객체지향 프로그래밍은 무엇을 의미하나요? 🔥
객체지향 프로그래밍의 특징에 대해 말해볼 수 있나요? 🔥
자바스크립트는 객체지향 프로그래밍 언어인가요?</p>
<h1 id="객체지향-프로그래밍">객체지향 프로그래밍</h1>
<blockquote>
<p>독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임</p>
</blockquote>
<p>프로그램을 명령어 또는 함수의 목록으로 보는 
전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 
여러 개의 독립적인 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.</p>
<p>객체지향프로그래밍은 실체(사물이나 개념)을 인식하는 철학적 사고를 프로그래밍에 접목을 시도한 것에서 시작됐다.</p>
<ul>
<li>실체 : 특징이나 성질을 나타내는 속성</li>
</ul>
<p>사람은 이름, 주소, 성별, 나이 등 다양한 속성을 갖는다.
이때 이름이 강영현이고, 주소는 JYP인 성별은 남성이며, 나이는 31살인 사람과 같이 속성을 구체적으로 표현하면 특정한 사람을 다른 사람과 구별하여 인식 할 수 있다.</p>
<h3 id="추상화">추상화</h3>
<blockquote>
<p>다양한 속성중에서 프로그램에 필요한 속성만 간추려내서 표현하는 것이 추상화</p>
</blockquote>
<p>사람에게는 다양한 속성이 있지만, 우리가 구현하려는 프로그램에서는 사람의 &quot;이름&quot;, &quot;주소&quot; 라는 속성에만 관심이 있다고 했을때, 다양한 속성중에서 프로그램에 필요한 속성만 간추려내서 표현하는 것이 추상화이다.</p>
<h3 id="객체">객체</h3>
<blockquote>
<p>속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조</p>
</blockquote>
<h2 id="객체지향프로그래밍-특징">객체지향프로그래밍 특징</h2>
<h3 id="캡슐화encapsulation">캡슐화(Encapsulation)</h3>
<p>데이터와 코드를 외부로부터 영향을 받지 않게 하고 데이터의 역할, 기능단위로 만드는 캡슐형태다.</p>
<h3 id="상속inheritance">상속(Inheritance)</h3>
<p>상위 클래스의 속성을 하위 클래스가 물려 받는것 이다.</p>
<h3 id="추상화abstraction">추상화(abstraction)</h3>
<p>추상화는 필요없는 특성은 제거하고 공통적인 속성과 기능을 추출하여 정의하는것을 말한다</p>
<h3 id="다형성polymorphism">다형성(Polymorphism)</h3>
<p>상위 클래스의 특징을 가지고 있지만 하위 클래스만의 다양한 형태의 클래스가 존재함을 말한다.
상속되었을 때 자식이 부모의 유전자를 가지고 있지만 자식만의 특징을 가지고 있는 것과 비슷하다</p>
<h1 id="자바스크립트는-객체지향-프로그래밍일까">자바스크립트는 객체지향 프로그래밍일까?</h1>
<blockquote>
<p>아니다.
자바스크립트는 객체 지향 언어로 개발되지 않았기때문에 객체지향 프로그래밍으로 보기 어렵다.</p>
</blockquote>
<p>하지만 자바스크립트에 Class 속성을 사용해서 객체 지향 프로그래밍을 할 수 있다.
<br/>
<br/>
<br/>
<br/></p>
<blockquote>
<p><a href="https://velog.io/@satoshi25/JavaScript%EB%8A%94-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%96%B8%EC%96%B4%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4">참고자료</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 일급객체]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%BC%EA%B8%89%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%BC%EA%B8%89%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Thu, 19 Oct 2023 11:46:47 GMT</pubDate>
            <description><![CDATA[<h1 id="일급-객체">일급 객체</h1>
<blockquote>
<p>일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체</p>
</blockquote>
<p>함수가 일급객체라는 것은 함수를 객체와 동일하게 사용할 수 없다라는 의미.</p>
<h2 id="일급-객체-특징">일급 객체 특징</h2>
<ul>
<li>무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.</li>
<li>변수나 자료구조등에 저장할 수 있다.</li>
<li>함수의 매개변수에 전달할 수 있다.</li>
<li>함수의 반환값으로 사용할 수 있다.*</li>
</ul>
<pre><code class="language-javascript">// 1. 함수는 무명 리터럴로 생성할 수 있다.
const increase = function (num) {
    return ++num;
}

// 2. 함수는 객체에 저장할 수 있다.
const predicates = {increase,decrease};

// 3. 함수의 매개변수에 전달할 수 있다.
// 4. 함수의 반환값으로 사용할 수 있다.
function makeCounter(predicate){
    let num = 0;

    return function(){
        num = predicate(num);
        return num;
    }
}</code></pre>
<h1 id="함수형-프로그래밍">함수형 프로그래밍</h1>
<blockquote>
<p>함수형 프로그래밍은 함수의 응용을 강조한다. 
프로그래밍이 문이 아닌 식이나 선언으로 수행되는 선언형 프로그래밍 패러다임을 따르고 있다.</p>
</blockquote>
<p>함수형 프로그래밍에서는</p>
<ul>
<li>순수함수 : 어떤 외부 상태에 의존하지도 않고, 변경하지도 않는, 즉 부수 효과가 없는 함수</li>
<li>비순수함수 : 외부 상태에 의존하거나 외부 상태를 변경하는 즉, 부수 효과가 있는 함수</li>
</ul>
<h2 id="순수함수">순수함수</h2>
<blockquote>
<p>어떤 외부 상태에도 의존하지 않고 외부 상태를 변경하지도 않는 함수</p>
</blockquote>
<ul>
<li>동일한 인자가 전달되면 언제나 동일한 값을 반환하는 함수</li>
<li>어떤 외부 상태에 의존하지 않고 오직 매개변수를 통해 함수 내부로 전달되 인수에게만 의존해 반환값을 만듦.</li>
<li>함수 외부 상테에 의존하는 함수는 외부 상태에 따라 반환값이 달라짐.</li>
<li>함수의 외부 상태를 변경하지 않음.</li>
</ul>
<pre><code class="language-javascript">var count = 0;

// 순수함수
function increase(n){
    return ++n;  
}

// 순수함수가 반환한 결과값을 변수에 재할당해서 상태를 변경
count = increase(count);
console.log(count); //1</code></pre>
<h2 id="비순수함수">비순수함수</h2>
<blockquote>
<p>외부 상태에 의존하거나 외부 상태를 변경하는 함수</p>
</blockquote>
<ul>
<li>함수의 외부 상태에 따라 반환값이 달라지는 함수.</li>
<li>외부 상태에 의존하는 함수</li>
<li>함수의 외부 상태를 변경하는 부수효과(side effect)가 있다.</li>
</ul>
<pre><code class="language-javascript">var count = 0;

// 비순수함수
function increase(){
    return ++count;
}

// 비순수함수는 외부 상태를 변경해 상태 변화를 추적하기 어려움.
increase();
console.log(count); //1</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 생성자 함수]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 12 Oct 2023 12:28:56 GMT</pubDate>
            <description><![CDATA[<p>생성자 함수가 뭔가요?
객체 리터럴로 만들 때와는 무슨 차이가 있죠? 왜 생성자 함수를 사용하나요?
생성자 함수가 객체(인스턴스)를 생성하는 과정에 대해 간략하게 설명해줄 수 있나요?</p>
<h1 id="생성자-함수">생성자 함수</h1>
<blockquote>
<p>new 연산자와 함께 호출하여 객체를 생성하는 함수</p>
</blockquote>
<p>생성자 함수에 의해 생성된 객체를 인스턴스라고 한다.</p>
<h2 id="object-생성자-함수">Object 생성자 함수</h2>
<blockquote>
<p>new 연산자와 함께 Object 생성자 함수를 호출하면 빈 객체를 생성해서 반환한다.</p>
</blockquote>
<p>빈 객체를 생성한 이후 프로퍼티 또는 메서드를 추가해서 객체를 완성할 수 있다.</p>
<pre><code class="language-javascript">const person = new Object();

person.name = &quot;Lee&quot;;
person.sayHello = function () {
    console.log(&quot;Hi, My name is&quot; + this.name);
}

console.log(person); //{name : &quot;Lee&quot;, sayHello: f}
person.sayHello();</code></pre>
<p>자바스크립트는 Object 생성자 함수 이외에도
String,Number,Boolean,Function,Array,Date,ReExp,Promise,Date 등 빌트인 생성자 함수를 제공한다.</p>
<h3 id="빌트인-생성자-함수-예시">빌트인 생성자 함수 예시</h3>
<pre><code class="language-javascript">const strObj = new String(&quot;Lee&quot;);
console.log(typeof strObj); //Object
console.log(strObj); //String {&quot;Lee&quot;}

const numObj = new Number(123);
console.log(typeof numObj); //Object
console.log(numObj); //Number {123}</code></pre>
<h2 id="객체리터럴에-의한-객체-생성-방식의-문제점">객체리터럴에 의한 객체 생성 방식의 문제점</h2>
<p>객체 리터럴로 객체 생성을 하게되면, 훨씬 더 직관적이고 간편하다.
하지만, 객체 리터럴로 객체 생성을 하면 단 하나의 객체만 생성한다.</p>
<blockquote>
<p>동일한 프로퍼티를 갖는 여러개의 객체를 생성할땐, 매번 똑같은 걸 쓰면서 생성하기 때문에 매우 비효율적이다.</p>
</blockquote>
<pre><code class="language-javascript">const circle1 = {
 radius : 5,
  getDiameter() {
   return 2 * this.radius;
  }
}

const circle2 = {
 radius : 5,
  getDiameter() {
   return 2 * this.radius;
  }
}

console.log(circle1.getDiameter()) //10
console.log(circle2.getDiameter()) //20</code></pre>
<h2 id="생성자-함수를-사용했을때의-장점">생성자 함수를 사용했을때의 장점</h2>
<ul>
<li>생성자 함수를 사용하여 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성할 수 있다.<pre><code class="language-javascript"></code></pre>
</li>
</ul>
<p>const Circle(radius){
    this.radius = radius;
      this.getDiameter = const = () =&gt; {
     return 2 * this.radius; 
    }
}</p>
<p>const circle1 = new Circle(5);
const circel2 = new Circle(10);</p>
<p>console.log(circle1); //10
console.log(circle2); //20</p>
<pre><code>
## 생성자 함수의 인스턴스 생성과정

생성자 함수의 역할은

* 프로퍼티 구조가 동일한 인스턴스를 생성하기 위한 템플릿으로서 동작하여 인스턴스를 생성하는 것
* 생성된 인스턴스를 초기화 (인스턴스 프로퍼티 추가 및 초기값 할당)하는 것.

자바스크립트 엔진은
암무적인 처리를 통해 인스턴스를 생성하고 반환한다.
new 연산자와 함께 생성자 함수를 호출하면 자바스크립트 엔진은 아래의 과정을 거쳐 인스턴스를 생성하고 초기화 한 후 암묵적으로 인스턴스를 반환한다.

### 1. 인스턴스 생성과 this 바인딩

빈 객체가 암묵적으로 생성된다. (빈 객체가 생성자 함수가 생성한 인스턴스)
생성된 빈 객체, 즉 인스턴스는 this에 바인딩 된다.
**그래서 생성자 함수의 내부의 this가 생성자 함수가 생성할 인스턴스를 가르키는 이유.**

#### new연산자를 붙히지 않았을 경우 this

`new`연산자를 붙히지 않았을 경우에는 결국 일반 함수로 호출하는 것이 단점,
`this`는 무엇을 가르키는가?

* 일반함수로서 호출 👉🏻 전역객체
* **메소드**로서 호출 👉🏻 메소드를 호출한 객체 ( 마침표 앞의 객체 )
* **생성자 함수**로서 호출 👉🏻 생성자 함수가 생성할 인스턴스 ( 객체 )

### 2. 인스턴스 초기화

&gt; 생성자 함수에 코드가 한 줄씩 실행되어 this에 바인딩되어 있는 인스턴스를 초기화한다.

즉, this에 바인딩되어 있는 인스턴스에 프로퍼티나 메서드를 추가하고,
생성자 함수가 인수로 전달받은 초기값을 인스턴스 프로퍼티에 할당하여,
초기화하거나 고정값을 할당한다.

### 3. 인스턴스 반환

&gt; 생성자 함수 내부의 모든 처리가 끝나면 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.

만약 this가 아닌 다른 객체를 명시적으로 반환하면 this가 반한되지 못하고 return 문에 써놓은 객체가 반환된다.
하지만, 명시적으로 원시값을 반환하면 원시 값 반환은 무시되고 암묵적으로 this가 반환된다.
그래서 생성자 함수 내부에서 명시적으로 this가 아닌 다른 값을 반환하는 것은 생성자 함수의 기본 동작을 훼손하기 때문에
생성자 함수 내부에서는 return 문을 반드시 생략한다.

### 코드로 살펴보기

```    javascript
const Circle = (radius) =&gt; {
    //1. 암묵적으로 빈 객체가 생성되고 this에 바인딩된다.
    //2. this에 바인딩되어 있는 인스턴스를 초기화한다.

      this.radius = radius;
      this.getDiameter = const = () =&gt; {
     return 2 * this.radius; 
    }
    //3. 암묵적으로 this를 반환한다.
    return {};
}

// 인스턴스 생성. Circle 생성자 함수는 명시적으로 반환한 객체를 반환한다.
const circle = new Circle(1);
console.log(circle); // {}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[테스트]]></title>
            <link>https://velog.io/@_dodo_hee/%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@_dodo_hee/%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 10 Oct 2023 09:42:45 GMT</pubDate>
            <description><![CDATA[<p>테스트란 무엇인가요?
테스트의 예는 어떤 것들이 있나요?
테스트는 왜 해야 하나요?
유닛 테스트란 무엇인가요?
통합 테스트란 무엇인가요?
E2E 테스트란 무엇인가요?</p>
<h1 id="테스트">테스트</h1>
<blockquote>
<p>테스트를 소프트웨어의 관점에서 정의하면 &quot;애플리케이션이 요구 사항에 맞게 동작하는지를 검증하는 행위&quot;</p>
</blockquote>
<h2 id="테스트-예">테스트 예</h2>
<ul>
<li>DB에 데이터를 입력하는 API를 개발 &gt; API 호출 &gt; DB값 검증</li>
<li>디자인 시안에 맞게 HTML/CSS를 작성 &gt; 브라우저에서 실제 렌더링된 결과를 확인</li>
<li>새로운 기능을 추가하기 위해 기존 모듈을 리팩토링 &gt; 영향을 받는 다른 모듈의 실행 결과를 확인</li>
<li>버그를 수정하기 위해 기존 함수를 수정 &gt; 버그가 수정 확인 &amp; 영향을 받는 다른 모듈의 실행 결과를 확인</li>
<li>개발 환경에서 테스트된 어플리케이션을 리얼 환경에 배포 &gt; 배포 과정에서 발생한 문제가 없는지 확인</li>
</ul>
<h2 id="테스트를-왜-해야하는가">테스트를 왜 해야하는가?</h2>
<ul>
<li>더 적극적으로 리팩토링 등의 코드 개선을 할 수 있어 코드 품질이 향상</li>
<li>개발 단계에서의 제품 품질이 향상되어 테스터와의 불필요한 커뮤니케이션 비용이 감소</li>
<li>테스트는 코드가 의도한대로 동작한 다는 것을 보장</li>
<li>코드를 수정할때 테스트가 존재하지 않는다면 코드 수정시 발생할 수 있는 사이드이팩트 예상 어려움.</li>
</ul>
<h1 id="유닛-테스트">유닛 테스트</h1>
<blockquote>
<p>코드의 Unit단위를 테스트</p>
</blockquote>
<h2 id="장점">장점</h2>
<ul>
<li>프론트엔드 코드에서 유닛은 컴포넌트나, 서비스가 될 수 있다.</li>
<li>제일 작은 단위를 테스트하기 때문에 모든 시나리오를 테스트할 때 테스트의 양이 가장 적어서 효율적이다.</li>
<li>TDD 사용시 가장 작은단위 부터 기능대로 동작하는지 확인하면서 개발하기 좋다.</li>
<li>별도의 통합이 필요없기 때문에 백엔드 API가 구현이 안되어도 작성할 수 있다.</li>
</ul>
<h2 id="단점">단점</h2>
<ul>
<li>단위 테스트는 의존성이 있는 모듈을 제어하기 위해 필연적으로 모의 객체(Mocking)을 사용할 수 밖에 없기 때문에, 각 모듈이 실제로 잘 연결되어 상호 작용하는지에 대해서는 검증하지 못한다.</li>
<li>모듈의 사소한 API 변경에도 영향을 받기 때문에 작은 단위의 리팩토링에도 쉽게 깨지는 문제가 있다.</li>
</ul>
<h1 id="통합-테스트">통합 테스트</h1>
<blockquote>
<p>통합된 기능을 테스트</p>
</blockquote>
<h2 id="장점-1">장점</h2>
<ul>
<li>유닛테스트가 단일 컴포넌트나 단일 서비스를 기준으로 테스트를 했다면, 유닛들 간의 데이터를 주고받는 환경을 테스트한다.</li>
<li>통합테스트 전략에 따라 프론트엔드 전체 유닛들만 통합하여 테스트하거나, 백엔드와 데이터베이스까지 전체를 통합해서 테스트하는 경우도 있다.</li>
<li>전체 유닛의 상호작용에 대해서 테스트가 가능하다.</li>
</ul>
<h2 id="단점-1">단점</h2>
<ul>
<li>단일 모듈이 복잡한 알고리즘이나 분기문을 갖고 있을 때 단위 테스트에 비해 테스트가 번거롭다.</li>
<li>테스트 중복이 발생할 확률이 높다는 단점이 있다.</li>
</ul>
<h1 id="e2e-테스트">E2E 테스트</h1>
<blockquote>
<p>end to end의 약자로, 소프트웨어의 가장 끝단인 사용자로 부터 가장 끝단인 백엔드 인프라까지 테스트</p>
</blockquote>
<h2 id="장점-2">장점</h2>
<ul>
<li>주로 유저 스토리를 기반의 시나리오를 기반으로 테스트를 진행한다.</li>
<li>사용자 관점에서 전체 시나리오를 테스트하기 때문에 코드의 변경에도 테스트를 변경할 필요 없다.</li>
<li>다른 테스트와 달리 전체 시나리오를 테스트하기 떄문에 소프트웨어의 무결성을 보장하기 가장 좋다.</li>
<li>사용자 관점에서 전체 시나리오를 테스트하기 때문에 전체를 테스트하기 위해선 굉장히 많은 테스트가 필요하다.</li>
<li>프론트엔드만 따로 테스트하는 것이 불가능하며, 백엔드와의 통합이 필요하다.</li>
<li>전체 테스트를 하는데 시간이 오래걸려 자주 테스트하기 어렵다.</li>
</ul>
<h2 id="단점-2">단점</h2>
<ul>
<li>단위 테스트나 통합 테스트에 비해 테스트의 실행 속도가 느리다.</li>
<li>개발 단계에서 빠른 피드백을 받기 어렵다.</li>
<li>세부 모듈이 갖는 다양한 상황들의 조합을 고려해야 하기 때문에 테스트를 작성하기가 쉽지 않다. </li>
<li>큰 단위의 기능을 작은 기능으로 나누어 테스트할 수가 없어 필연적으로 테스트 사이에 중복이 발생된다.</li>
<li>테스트 실행 환경의 예상하지 못한 문제들(네트워크 오류, 프로세스 대기로 인한 타임아웃 등)로 인해 테스트가 가끔 실패하는 일이 발생되기도 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 scope]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-scope</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-scope</guid>
            <pubDate>Thu, 21 Sep 2023 12:31:00 GMT</pubDate>
            <description><![CDATA[<p>스코프가 뭔가요? 🔥🔥🔥
스코프에는 어떤 종류가 있죠? 🔥🔥
렉시컬 스코프를 아나요? 안다면 렉시컬 스코프는 무엇을 의미하나요? 🔥
전역 변수로 변수를 선언하면 생기는 문제점은 무엇이 있을까요?</p>
<h1 id="스코프란">스코프란?</h1>
<blockquote>
<p>자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.
즉, 스코프는 식별자가 유효한 범위를 말한다.</p>
</blockquote>
<pre><code class="language-javascript">
var x = &#39;global&#39;;

function foo(){
    var x = &#39;local&#39;
    console.log(x); //1
}

foo();

console.log(x); //2</code></pre>
<p>x라는 이름으로 두개의 변수를 선언했다.
자바스크립트 엔진은 어떤 변수를 참조해야 할 것인지를 결정해야한다. = 식별자 결정
자바스크립트 엔진은 스코프를 통해 어떤 변수를 참조해야할 것인지 결정한다.
따라서 스코프란, 자바스크립트엔진이 식별자를 검색할 때 사용하는 규칙이다.</p>
<p>만약 스코프라는 개념이 없다면, 같은 이름을 갖는 변수는 충돌을 일으켜, 프로그램 전체에서 하나밖에 사용할 수 밖에 없게 된다.</p>
<h1 id="전역-스코프">전역 스코프</h1>
<blockquote>
<p>코드 가장 바깥 영역</p>
</blockquote>
<p>전역에 변수를 선언하면, 전언 스코프를 갖는 전역 변수가 된다.
전역 변수는 어디서든지 참조할 수 있다.</p>
<h1 id="지역-스코프">지역 스코프</h1>
<blockquote>
<p>함수 몸체 내부 영역</p>
</blockquote>
<p>지역에 변수를 선언하면 지역 스코프를 갖는 지역 변수가 된다.
지역 변수는 자신이 선언된 지역과 하위 지역에서만 참조할 수 있다.
지역변수는 자신의 지역 스코프와 하위 스코프에서 유효하다.</p>
<h1 id="렉시컬-스코프">렉시컬 스코프</h1>
<p>자바스크립트는 렉시컬 스코프를 따라 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다.
함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다.
즉 함수의 상위 스코프는 언제나 자신이 정의된 스코프다.</p>
<p>이처럼 함수의 상위 스ㅗ프는 함수 정의가 실행될 때 정적으로 결정된다.
함수 정의(함수 선언문 또는 함수 표현식)가 실행되어 생성된 함수 객체는 이렇게 결정된 상위 스코프를 기억한다.
함수가 호출될 때마다 함수의 상위 스코프를 참조할 필요가 있기 때문이다.</p>
<h1 id="변수의-생명-주기">변수의 생명 주기</h1>
<p>변수는 선언에 의해 생성되고 할당을 통해 값을 갖는다. 그리고 언젠가 소멸된다.
변수에 생명주기가 없다면, 한번 선언된 변수는 프로그램을 종료하지 않는 한 영원히 메모리 공간을 점유하게 된다.</p>
<p>변수는 자신이 선언된 위치에서 생성되고 소멸된다.
전역 변수의 생명 주기는 애플리케이션의 생명주기와도 같다.
하지만 함수 내부에서 선언된 지역 변수는 함수가 호출되면 생성되고 함수가 종료하면 소멸된다.</p>
<pre><code class="language-javascript">
var x = 1;

function foo(){
    var x = 10;
      bar();
}

function bar(){
    console.log(x);
}

foo();
console.log(x); //referror : x is not defined</code></pre>
<h2 id="전역-변수의-생명-주기">전역 변수의 생명 주기</h2>
<p>함수와 달리 전역 코드는 호출이 없어도 실행된다. = 진입점이 없어도 코드가 로드되고 해석된다.
전역코드는, 더 이상 실행할 문이 없을때 종료된다.</p>
<p>var 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 된다.
이는 전역 변수의 생명 주기가 전역 객체의 생명 주기와 일치한다는 것을 말한다.</p>
<pre><code>// 전역 변수 x 생성
var x = &#39;global&#39; // 전역 변수 x 값 할당

function foo(){ // 지역 변수 x 생성
    var x = &#39;local&#39; // 지역 변수 x 값 할당
    console.log(x);
    return x; 
    // 지역 변수 x 소멸
}

foo();
console.log(x);</code></pre><h2 id="전역-변수의-문제점">전역 변수의 문제점</h2>
<h3 id="암묵적-결합">암묵적 결합</h3>
<p>전역 변수를 선언한 의도는 전역, 즉 코드 어디서든 참조하고 할당할 수 있는 변수를 사용하겠다는 것.
그렇게 되면, 모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합을 허용하는 것이다.
변수의 유효범위가 크면 클수록 코드의 가독성은 나빠지고, 의도치않게 상태가 변경될 수 있는 위험성도 높아진다.</p>
<h3 id="긴-생명-주기">긴 생명 주기</h3>
<p>전역 변수는 생명 주기가 길다.
따라서 메모리 리소스도 오랜 기간 소비한다.
또한 전역 변수의 상태를 변경할 수 있는 시간도 길고 기회도 많다.
생명주기가 긴 전역 변수는 변수의 이름이 중복될 가능성이 있다.
변수 이름이 중복되면 의도치 않은 재할당이 이뤄진다.</p>
<h3 id="스코프-체인-상에서-종점에-존재">스코프 체인 상에서 종점에 존재</h3>
<p>전역 변수는 스코프 체인 상에서 종점에 존재한다.
변수를 검색할 때 전역 변수가 가장 마지막에 검색된다는 것을 말한다.
즉, 전역변수의 검색 속도가 가장 느리다.</p>
<h3 id="네임스페이스-오염">네임스페이스 오염</h3>
<p>자바스크립트의 가장 큰 문제는, 파일이 분리되어 있다해도 하나의 전역 스코프를 공유한다는 것.
따라서 다른 파일 내에서 동일한 이름으로 정의된 전역 변수나,함수가 같은 스코프안에 존재할 경우 예상치 못한 결과를 가져온다.</p>
<h2 id="전역-변수의-사용을-억제하는-방법">전역 변수의 사용을 억제하는 방법</h2>
<blockquote>
<p>전역 변수를 반드시 사용해야 할 이유를 찾지 못한다면 지역 변수를 사용해야한다.
즉, 변수 스코프는 좁을수록 좋다.</p>
</blockquote>
<h3 id="즉시-실행-함수">즉시 실행 함수</h3>
<p>함수 정의와 동시에 호출되는 즉시 실행 함수는 단 한번만 호출된다.
모든 코드를 즉시 실행 함수로 감싸면 모든 변수는 즉시 실행 함수의 지역 변수가 된다.</p>
<h3 id="네임스페이스-객체">네임스페이스 객체</h3>
<p>전역에 네임스페이스 역할을 담당할 객체를 생성하고 전역 변수처럼 사용하고 싶은 변수를 프로퍼티로 추가하는 방법이다.</p>
<h3 id="모듈-패턴">모듈 패턴</h3>
<p>클래스를 모방한, 관련 있는 변수와, 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만든다.
자바스크립트의 강력한 기능인 클로저를 기반으로 동작한다.</p>
<h4 id="클로저">클로저</h4>
<p>전역 변수를 억제할 수 있는 기능.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 함수]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 14 Sep 2023 11:42:54 GMT</pubDate>
            <description><![CDATA[<p>기본 function 함수와 화살표 함수의 차이를 알고있나요?
자바스크립트에서 함수를 정의하는 방법은 몇가지가 있나요?
함수 선언문과 함수 표현식은 어떤 차이가 있나요?
즉시 실행 함수(IIFE)에 대해 알고 있나요? 알고 있다면 아는 내용에 대해 말해보세요</p>
<h1 id="함수">함수</h1>
<p>수학에서의 함수는 입력을 받아 출력을 내보내는 일련의 과정을 정의한 것.
프로그래밍 언어의 함수는</p>
<blockquote>
<p>일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것.</p>
</blockquote>
<p>프로그래밍 언어의 함수도 입력을 받아서 출력을 내보낸다.
함수 내부로 입력을 전달받는 변수를 매개변수
입력을 인수
출력을 반환값이라 한다.</p>
<p>함수는 함수 정의를 통해 생성한다.</p>
<h2 id="기본-함수">기본 함수</h2>
<pre><code class="language-javascript">//함수 정의 
function add(x,y){
    return x+y;
}

//함수 호출
add(1,2); //3</code></pre>
<h2 id="화살표-함수">화살표 함수</h2>
<ul>
<li>ES6부터 도입</li>
<li>function 키워드 대신 화살표를 사용해 좀 더 간략한 방법으로 선언</li>
<li>화살표 함수는 익명함수로 정의</li>
<li>화살표 함수는 생성자 함수로 사용할 수 없음</li>
<li>기존함수와 this, 바인딩 방식이 다름</li>
<li>prototype 프로퍼티가 없음</li>
<li>arguments 객체를 생성하지 않음.</li>
</ul>
<pre><code class="language-javascript">const add = (x,y) =&gt; x+y;
console.log(add(2,3)); //5</code></pre>
<h2 id="화살표-함수와-기본-함수의-차이">화살표 함수와 기본 함수의 차이</h2>
<h3 id="1-화살표-함수는-인스턴스를-생성할-수-없는-non-constructor">1. 화살표 함수는 인스턴스를 생성할 수 없는 non-constructor</h3>
<p>화살표 함수는 인스턴스를 생성할 수 없어서 prototype 프로퍼티가 없고 프로토타입도 생성하지 않는다.</p>
<pre><code class="language-javascript">const Foo = () =&gt; {};

// 화살표 함수는 생성자 함수로서 호출 할 수 없다.
new Foo() //TypeError : Foo is not a constructor</code></pre>
<h3 id="2-중복된-매개변수-이름을-선언-할-수-없다">2. 중복된 매개변수 이름을 선언 할 수 없다.</h3>
<p>일반 함수는 중복된 매개변수 이름을 선언해도 에러가 발생하지 않는다.
단, strict mode에서 중복된 매개변수 이름을 선언하면 에러가 발생한다.
화살표 함수에서도 중복된 매개변수 이름을 선언하면 에러가 발생한다.</p>
<h3 id="3-화살표-함수는-함수-자체의-thisargumentssupernewtarget-바인딩을-갖지-않는다">3. 화살표 함수는 함수 자체의 this,arguments,super,new,target 바인딩을 갖지 않는다.</h3>
<p>화살표 함수는 this,arguments,super,new,target 참조하면, 스코프 체인을 통해 상위 스코프의 this,arguments,super,new,target 를 참조한다.</p>
<h2 id="함수를-정의하는-방법">함수를 정의하는 방법</h2>
<ul>
<li><p>함수 선언문</p>
<pre><code class="language-javascript">function add(x,y){
  return x+y;
}</code></pre>
</li>
<li><p>함수 표현식</p>
</li>
</ul>
<pre><code class="language-javascript">var add = function(x,y){
    return x+y;
}</code></pre>
<ul>
<li>생성자 함수</li>
</ul>
<pre><code class="language-javascript">var add = new Function(&#39;x&#39;,&#39;y&#39;, &#39;returnx+y&#39;);</code></pre>
<ul>
<li>화살표 함수</li>
</ul>
<pre><code class="language-javascript">var add = (x,y) =&gt; x+y;</code></pre>
<h3 id="💡-변수-선언과-함수-정의">💡 변수 선언과 함수 정의</h3>
<p>변수는 선언한다. 함수는 정의한다로 표현한다.
함수 선언문이 평가되면 식별자가 암묵적으로 생성되고 함수 객체가 할당된다.</p>
<h2 id="함수-선언문">함수 선언문</h2>
<blockquote>
<p>함수 선언문은 표현식이 아닌 문이다.</p>
</blockquote>
<pre><code class="language-javascript">function add(x,y){
    return x+y;
}

//undefined</code></pre>
<p>그래서 함수 선언문을 실행하면 완료 값 undefined가 출력된다.
만약 표현식인 문이라면 완료 값 undefined 대신 표현식이 평가되어 생성된 함수가 출력되어야된다.</p>
<p>표현식이 아닌 문은 변수에 할당 할 수 없다.
함수 선언문도 표현식이 아닌 문이라 변수에 할당 할 수 없다.</p>
<h2 id="함수-표현식">함수 표현식</h2>
<p>자바스크립트는 함수의 객체 타입의 값이다.
자바스크립트의 함수는 값처럼 변수에 할당 할 수도 있고, 프로퍼티 값이 될 수도 있고, 배열의 요소가 될 수도 있다.</p>
<p>이처럼 값의 성질을 갖는 객체를 일급 객체라고 한다.</p>
<blockquote>
<p>자바스크립트 함수는 일급 객체이다.
함수가 일급 객체라는 건, 함수를 값처럼 자유롭게 사용할 수 있다는 의미이다.</p>
</blockquote>
<p>함수는 일급객체이므로 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있다.
함수 정의 방식을 함수 표현식이라고 한다.</p>
<h2 id="함수-표현식과-함수-선언문의-차이">함수 표현식과 함수 선언문의 차이</h2>
<h3 id="호이스팅">호이스팅</h3>
<p>함수 선언식은 함수 전체를 호이스팅한다.
정의된 범위의 맨 위로 호이스팅이 되서 함수 선언전에 함수를 사용할 수 있다.</p>
<p>함수 표현식은 별도의 변수에 할당한다.
변수는 선언부와 할당부를 나누어 호이스팅한다.</p>
<pre><code class="language-javascript">//함수 선언문
hoisted(); // 동작
function hoisted() {
  console.log(&quot;호이스팅됨&quot;);
}

// 함수 표현식
notHoisted(); // 에러: 함수가 아직 정의되지 않았습니다.
var notHoisted = function () {
  console.log(&quot;호이스팅되지 않음&quot;);
};</code></pre>
<h3 id="변수-할당">변수 할당</h3>
<p>함수 선언문에서는 함수 이름이 변수에 자동으로 할당된다. 
함수 표현식에서는 함수를 변수에 할당하는 것이 명시적으로 이루어진다.</p>
<pre><code class="language-javascript">// 함수 선언문
declaration(); // 동작
function declaration() {
  console.log(&quot;함수 선언문&quot;);
}

// 함수 표현식
expression(); // 에러: 함수가 아직 정의되지 않았습니다.
var expression = function () {
  console.log(&quot;함수 표현식&quot;);
};</code></pre>
<h3 id="익명-함수">익명 함수</h3>
<p>함수 선언문은 함수 이름을 생략할 수 없다.
함수 표현식은 함수를 익명으로 만들 수 있다.</p>
<pre><code class="language-javascript">// 함수 선언문
function named() {
  console.log(&quot;이름 있는 함수&quot;);
}

// 함수 표현식
var anonymous = function () {
  console.log(&quot;익명 함수&quot;);
};</code></pre>
<h2 id="즉시-실행-함수-iife">즉시 실행 함수 (IIFE)</h2>
<blockquote>
<p>정의되자마자 즉시 실행되는 함수</p>
</blockquote>
<pre><code class="language-javascript">function () {
    console.log(&quot;IIFE&quot;);
})();

// 화살표 함수로도 사용 가능하다
(() =&gt; {
    console.log(&quot;IIFE&quot;);
})();</code></pre>
<h3 id="왜-사용할까">왜 사용할까?</h3>
<ol>
<li>필요없는 전역 변수의 생성을 줄일 수 있다.
함수를 생성하면 그 함수는 전역 변수로써 남아있게 되고, 많은 변수의 생성은 전역 스코프를 오염시킬 수 있다.
즉시실행함수를 선언하면 내부 변수가 전역으로 저장되지 않기 때문에 전역 스코프의 오염을 줄일 수 있다.</li>
</ol>
<ol start="2">
<li>private한 변수를 만들 수 있다.
즉시실행함수는 외부에서 접근 할 수 없는 자체적인 스코프를 가지게된다. 이는 클로저의 사용 목적과도 비슷하며 내부 변수를 외부로부터 private하게 보호 할 수 있다는 장점이 있다.</li>
</ol>
<h3 id="어떻게-사용할까">어떻게 사용할까?</h3>
<ol>
<li>단 한 번의 사용이 필요한 함수
즉시실행함수는 한 번의 실행 이후 없어지기 때문에 단 한번의 사용한 필요한 함수에 사용된다.</li>
<li>자바스크립트 모듈
자바스크립트 모듈을 만들때에도 즉시실행함수가 많이 활용된다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[효율적으로 코드짜보기]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9D%BC%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%95%98%EB%A9%B4%EC%84%9C-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%9E%98%EC%A7%9C%EA%B8%B0%EA%B0%80-%EA%B0%80%EB%8A%A5%ED%95%B4</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9D%BC%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%95%98%EB%A9%B4%EC%84%9C-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%9E%98%EC%A7%9C%EA%B8%B0%EA%B0%80-%EA%B0%80%EB%8A%A5%ED%95%B4</guid>
            <pubDate>Tue, 12 Sep 2023 08:41:25 GMT</pubDate>
            <description><![CDATA[<h1 id="좋은-코드란">좋은 코드란?</h1>
<blockquote>
<p>모든 팀원이 이해(understandability)하기 쉽도록 작성된 코드인 것 같다.</p>
</blockquote>
<p>좋은 코드, 클린 코드에 대한 정의는 많지만, 내가 실무에서 봤을때 좋은 코드라고 느꼈던 부분은,</p>
<ol>
<li>알기 쉬운 변수명, 함수명</li>
<li>읽기 쉬운 코드</li>
<li>중복을 줄인 코드</li>
</ol>
<p>사실 일하다보면, 정말 많은 클린코드의 원칙, 좋은 코드의 원칙을 지키기란 정말 어려운 것 같다.
이후에 리팩토링을 하더라도, 우선적으로 내가 실무를 하면서 지키고 있었던 나만의 코드 룰을 몇가지 소개해보려고 한다.</p>
<h2 id="변수함수명-잘-짓기">변수,함수명 잘 짓기</h2>
<p>나는 영어를 아주 잘하지 못한다.
그래서 그런지, 뭔가 내가 한눈에 봐도 딱 알아차릴 수 있는 변수명과 함수명을 좋아한다.
내가 알아볼 수 있다면, 남들도 당연하게 알아볼 것이라고 생각한다ㅎ</p>
<h3 id="나는-변수명-지을때">나는 변수명 지을때,</h3>
<ol>
<li>명사에 가깝게 짓기 (단수형으로)<pre><code class="language-javascript">const editMode  //수정모드;
const folder  //폴더 </code></pre>
</li>
<li>배열일때는 여러개인걸 명시 (복수형으로)</li>
</ol>
<pre><code class="language-javascript"> const selectedItems = // 선택된 아이템들</code></pre>
<ol start="3">
<li>함수의 역할 (어떨때 실행되는 함수인지)</li>
</ol>
<p>개인적으로 함수명 짓기가 제일 어려웠다.
뭔가 어느정도까지 함수의 역할을 함수명에 적어줘야하는지 감이 잘안왔는데</p>
<p>예를들어 초기화 버튼을 클릭 후, 진짜 초기화 하냐는 alert가 있을때
clickOpenResetAlert를 처럼 함수 동작에 관해서 써줘야할지
View 그대로 초기화 버튼을 클릭하다. 라는 것에 관해서 써줘야할지 너무 애매했다.
하지만 나의 선택은 View와 가깝게 작성을 했고 무조건 동사로 작업했다.</p>
<p>view에 가깝게 이름을 지은 이유는,
누군가 내 코드를 고쳐야하는 일이 생길 경우에 화면을 동작하면서 볼 가능성이 더 높을 것 같다고 생각했다.
그래서 좀 더 화면을 동작하자마자 알 수 있는 직관적인 이름을 지으려고 했다.</p>
<pre><code class="language-javascript">const clickViewTotalPrice = // 총금액보기를 클릭하세요
const clickReset = // 초기화 버튼 클릭 후 alert
const clickConfirmReset = // alert에 초기화 클릭</code></pre>
<h2 id="읽기-쉬운-코드">읽기 쉬운 코드</h2>
<ol>
<li>props로 내려주는 interface 정리</li>
</ol>
<p>위는 변수, 아래는 함수로 정리해서 항상 작업해줬다.
확실히 어떤 정보들을 받고, 어떤 행동들을 하는지 한눈에 구분이 되서 보기 편리했다.</p>
<pre><code class="language-javascript">interface ViewProps {
    searchKeyword : string;
    items : Item[];
    onChangeSearchKeyword : () =&gt; void;
    onClickEditMode : () =&gt; void;
    onClickItem : () =&gt; void;
}</code></pre>
<ol start="2">
<li>import 쪽도 정리 (개인적..ㅎ)</li>
</ol>
<p>회사 코드 이외의 외부 사람들의 코드를 보는 버릇을 들이진 못했다.
남이 짠 코드도 많이 봐야한다고 하는데
이건 그냥 내 취향이다.. 나는 {} / * as / 
이런 순서로 정리하거나, 기능 관련으로 import 를 정리되어있는 코드를 보기 편해한다.</p>
<pre><code class="language-javascript">import React, { useState } from &quot;react&quot;;
import { Widgets } from &quot;app/view&quot;;
import { Util } from &quot;app/view-model&quot;;
import * as DataModel from &quot;app/service/settlement-input/data-model&quot;;
import styled from &quot;styled-components&quot;;
import useDebounce from &quot;app/service/hooks/useDebounce&quot;;</code></pre>
<ol start="3">
<li>조건문 보다는 switch가 더 나을수도</li>
</ol>
<p>사실 회바회 인 것 같다.
회사에서도 switch 문을 더 선호했고, 나도 줄줄이 늘어져있는 if else / ? : 보다는 가독성이 swich가 더 낫다고 생각한다.</p>
<pre><code class="language-javascript">    if(yellow){
        로직
    } eles if(red){
        로직
    }
    else{
        로직
    }

    switch (color) {
        case &quot;yellow&quot; :
        로직
        case &quot;red&quot; :
        로직
    }</code></pre>
<h2 id="중복을-줄인-코드">중복을 줄인 코드</h2>
<ol>
<li>컴포넌트 분리</li>
</ol>
<p>자주 사용 되고, 반복적으로 발생되는 위젯,컴포넌트,코드들은 재활용 할 수 있게 컴포넌트로 분리해서 작업해준다.</p>
<ol start="2">
<li>util 사용, custom hooks 사용</li>
</ol>
<p>함수가 너무 자주사용되고, 반복적으로 발생된다면,
util 폴더를 생성해서, 계산하는 함수, 날짜를 구하는 함수를 사용해서
import 해서 꺼내쓰는 식으로 구현하는 편이었다.</p>
<pre><code class="language-javascript">//util 폴더안에 있는 함수
  getSliceTime = (saveTime: string) =&gt; {
        const now = new Date(saveTime);
        const hours = now.getHours();
        const minutes = now.getMinutes();
        const seconds = now.getSeconds();
        return `${hours}:${minutes}:${seconds}`;
    };

   validatePhoneNumber = (phonenumber: string) =&gt; {
        const regex = new RegExp(/^(010|011)[0-9]{3,4}[0-9]{4}$/g);
        return regex.test(phonenumber);
    };</code></pre>
<pre><code class="language-javascript">//custom hooks
import React from &quot;react&quot;;

export default function useInnerWidth(): number {
    const [innerWidth, setInnerWidth] = React.useState&lt;number&gt;(window.innerWidth);

    React.useEffect(() =&gt; {
        window.addEventListener(&quot;resize&quot;, setWidth);

        return () =&gt; {
            window.removeEventListener(&quot;resize&quot;, setWidth);
        };
    }, []);

    const setWidth = () =&gt; {
        setInnerWidth(window.innerWidth);
    };

    return innerWidth;
}
</code></pre>
<h1 id="함수-쪼개기">함수 쪼개기</h1>
<blockquote>
<p>서로 다른 두 대상을 한꺼번에 다루는 코드를 발견하면 각각을 별개모듈로 나누는 방법이다.</p>
</blockquote>
<p>예를 들어 입력값이 처리 로직에 적합하지 않은 형태로 들어오는 경우, 
본 작업에 들어가기 전에 입력값을 다루기 편한 형태로 가공한다. 
혹은 로직을 순차적인 단계들로 분리하거나 해도 된다.</p>
<p>하나의 함수를 잘게잘게 쪼개서 적절한 이름을 짓고 나눠서 작성하는게 중요하다.
함수를 잘게 쪼개서 관리하면 디버깅 하기도 편리하다.</p>
<ol>
<li>get 함수는 따로 빼준다.</li>
</ol>
<p>나는 회사에서 작업했을때 get 관련 함수는 꼭 따로 빼줬다.
언제 어느때에 정보를 불러올지 모르고, get 함수는 게다가 복잡성이 커질 우려가 높았다.</p>
<p>그래서 init함수에다가 get 함수를 분리하지 않고 그냥 넣었을경우, 디버깅이 너무 어려웠고
코드 자체가 읽기 싫어지고 어려웠다.</p>
<p>약간 모듈화에 가깝게 생각해서 get 함수들을 다 모듈화 시켜놓고
필요한 함수들에서 불러오는 식으로 진행했더니 함수가 너무 깔끔해졌었다.</p>
<p>(React.query를 쓰고나서는 진짜..극락..)</p>
<ol start="2">
<li>Private Method, 큰 함수를 작은 함수로 분리</li>
</ol>
<p>회사 실무코드에서는 DataModel이란 클래스를 생성해서 프론트에서 가져다쓰기 좋게 가공해주는 영역이 있었다.</p>
<p>Private Method: 클래스 내에서 특정 함수가 다른 함수에 의해만 호출될 경우, 
그 함수를 클래스의 내부(private) 메서드로 만들어 정보 은닉을 유지하고 클래스 인터페이스를 단순화시켰다.</p>
<p>큰 함수를 작은 함수로 분리 : 
위와 비슷한 사례인데, 너무 함수의 역할이 커지면, 함수의 역할을 분리해서 작업 한 후
필요한 곳에서 실행시키는 방식이다.</p>
<h1 id="결론">결론</h1>
<p>바쁜 스타트업이나 프로젝트 개발 시간이 제한된 상황에서 코드 품질을 100%까지 유지하려는 것은 현실적으로 어렵다고 생각한다. 
마감 기한을 지키면서 완벽한 코드를 작성하는 것은 너무 이상적이다. 
따라서 프로젝트 개발과 코드 품질 사이에는 trade-off가 필요하다고 생각했다.</p>
<p>그래서 나만의 최소한의 규칙을 정해서 이정도는 무조건 코드를 짤때 
최소한의 조건을 지켜야지!하며 나와의 약속을 하고 코드를 짠다.</p>
<p>개발 프로세스 중에 코드 품질을 유지하기 위해 나만의 최소한의 규칙을 정하는 것은 중요한 단계다. 
이러한 규칙은 개발하는 동안 코드를 작성할 때 필수적으로 지켜야 하는 기준으로써, 
코드의 가독성과 안정성을 보장할 수 있다.</p>
<p>부족한 부분은 시간적 여유가 생겼을때 &#39;클린 코드&#39;나 &#39;리팩토링&#39;과 책을 통해 학습하고 코드를 평가하며 점차 품질을 향상시키는 데 노력해야한다고 생각한다.</p>
<p>여유가 생길때마다 리팩토링이란 책이나, 클린코드 책을 통해서
좋은 코드의 조건을 계속 숙지해 나아가면서 점차 시간이 여유로워질때는 리팩토링을 하고
실무에서 나와의 최소 조건을 늘려나가는 것도 하나의 방법이라고 생각한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[원시 값과 객체 비교]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9B%90%EC%8B%9C-%EA%B0%92%EA%B3%BC-%EA%B0%9D%EC%B2%B4-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9B%90%EC%8B%9C-%EA%B0%92%EA%B3%BC-%EA%B0%9D%EC%B2%B4-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Thu, 07 Sep 2023 12:22:43 GMT</pubDate>
            <description><![CDATA[<p>원시 값과 객체 비교
동적 타이핑을 지원하는 자바스크립트에서 데이터의 타입을 크게 2개로 나누는 이유가 있을까요?
값에 의한 전달이 뭔가요?
참조에 의한 전달이 뭔가요?</p>
<h1 id="원시-값과-객체-비교">원시 값과 객체 비교</h1>
<p>자바스크립트가 제공하는 7가지 데이터 타입(숫자, 문자열, 불리언, null, undefined, 심벌, 객체 타입)은 크게 원시 타입과 객체 타입으로 구분할 수 있다.</p>
<h2 id="원시-값">원시 값</h2>
<blockquote>
<p>변경 불가능한 값</p>
</blockquote>
<p>원시 값을 변수에 할당하면, 변수에는 실제 값이 저장된다.
원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다.
&quot;값에 의한 전달&quot;</p>
<h2 id="객체">객체</h2>
<blockquote>
<p>변경 가능한 값</p>
</blockquote>
<p>객체를 변수에 할당하면 변수에는 참조 값이 저장된다.
객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다.
&quot;참조에 의한 전달&quot;</p>
<h1 id="자바스크립트에서-데이터타입을-2가지로-나누는-이유">자바스크립트에서 데이터타입을 2가지로 나누는 이유</h1>
<p>자바스크립트 엔진이 평가된 값에 따라 타입을 나눈다.</p>
<blockquote>
<p>메모리 공간 확보에 있다.</p>
</blockquote>
<p>값은 2진수로 메모리에 저장되며, 변수는 해당 메모리 공간의 주소값을 가리키게 되는데,
이때 필욯나 최소 메모리 공간의 데이터 타입에 따라 다르다.
이외에도 데이터 타입이 필요한 이유에는 몇가지가 더 있다.</p>
<ul>
<li>값을 저장할때 확보해야하는 메모리 공간의 크기를 결정하기 위해</li>
<li>값을 참조할 때 한번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해</li>
<li>메모리에 읽어 들인 2진수를 어떻게 해석해야할지 결정하기 위해</li>
</ul>
<h1 id="값에-의한-전달">값에 의한 전달</h1>
<blockquote>
<p>숫자, 문자, Boolean 등 원시값이 담긴 객체에서 이뤄진다.</p>
</blockquote>
<ul>
<li>전달하는 변수에 저장된 “값”을 다른 메모리 공간에 복사하여 전달받는 변수에 전달한다.</li>
<li>원본과 사본 어느 한 쪽을 변경해도 다른 쪽이 영향을 받지 않는다. </li>
<li>즉 둘은 별개의 값이 되며, 서로 간섭할 수 없다.</li>
</ul>
<h1 id="참조에-의한-전달">참조에 의한 전달</h1>
<blockquote>
<p>객체와 배열 등 객체 타입의 값을 할당할 때 이뤄진다.</p>
</blockquote>
<ul>
<li>전달하는 변수에 저장된 “참조값(할당된 객체가 담긴 메모리 주소)”을 다른 공간에 복사하여 전달받는 변수에 전달한다.</li>
<li>변수들이 메모리 주소를 통해 같은 객체에 접근할 수 있다. 즉, 두 개의 식별자가 하나의 객체를 “공유” 한다.</li>
<li>원본과 사본 어느 한 쪽에서 객체를 변경하면 서로 영향을 주고받는다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[비즈니스 유형]]></title>
            <link>https://velog.io/@_dodo_hee/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EC%9C%A0%ED%98%95</link>
            <guid>https://velog.io/@_dodo_hee/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EC%9C%A0%ED%98%95</guid>
            <pubDate>Tue, 05 Sep 2023 11:10:37 GMT</pubDate>
            <description><![CDATA[<p>SaaS가 뭔가요?
기타 비즈니스 유형​은 뭐가 있나요?
business logic 이란 무엇인가요?
브라우저와 node.js의 차이는?</p>
<h1 id="saas">SaaS</h1>
<blockquote>
<p>서비스형 소프트웨어(SaaS)는 인터넷 브라우저를 통해 최종 사용자에게 애플리케이션을 제공하는 클라우드 기반 소프트웨어 모델</p>
</blockquote>
<ul>
<li>고객이 필요에 따라 액세스할 수 있는 서비스 및 애플리케이션을 호스팅.</li>
<li>유지 관리 방식이나 기본 인프라의 관리 방식에 대해 고민할 필요가 없어진다.</li>
<li>사용량에 따른 구독이나 요금제 시스템</li>
</ul>
<p>예시로는, 웹 기반 이메일.
이메일 제품의 추가 기능을 관리하거나 이메일 프로그램이 실행되는 서버 및 운영 체제를 유지 관리할 필요 없이 이메일을 보내고 받을 수 있다.</p>
<h2 id="saas를-사용하는-이유">SaaS를 사용하는 이유</h2>
<p>SaaS 공급업체들은 하드웨어, 소프트웨어 도구 및 애플리케이션을 자체 데이터 센터 또는 클라우드 환경에서 관리한다.
사용자들은 그냥 사용목적에 맞게만 사용할 줄만 안다면 다른건 크게 신경쓰지 않아도 되기 때문에 편리하다.</p>
<ul>
<li>클라우드 접근성</li>
<li>저렴한 선결제 비용</li>
<li>지속적으로 발생하는 비용 감소</li>
<li>빠른 배포</li>
<li>온디맨드 확장성</li>
<li>신뢰성</li>
<li>자동 업데이트</li>
<li>통합</li>
<li>실시간 데이터 분석</li>
</ul>
<h1 id="비즈니스-유형-종류">비즈니스 유형 종류</h1>
<h2 id="b2c--business-to-consumer">B2C  (Business to Consumer)</h2>
<blockquote>
<p>기업과 개인과의 거래</p>
</blockquote>
<p>야놀자, 네이버</p>
<h2 id="b2b-business-to-business">B2B (Business to Business)</h2>
<blockquote>
<p>기업과 기업간의 거래</p>
</blockquote>
<p>flex, 레몬베이스</p>
<h2 id="d2cdirect-to-consumer">D2C(Direct to Consumer)</h2>
<blockquote>
<p>소비자 직접 거래</p>
</blockquote>
<p>나이키, 젝시믹스</p>
<h2 id="o2oonline-to-offline-o4oonline-for-offline">O2O(Online to Offline), O4O(Online for Offline)</h2>
<blockquote>
<p>온라인 플랫폼을 활용해 오프라인에서 서비스를 제공</p>
</blockquote>
<p>배달의 민족, 카카오택시, 에어비앤비</p>
<h2 id="c2mcustomer-to-manufacture">C2M(Customer to Manufacture)</h2>
<blockquote>
<p>소비자와 생산자 간의 거래</p>
</blockquote>
<p>올웨이즈, 핀둬둬</p>
<h2 id="c2ccustomer-to-customer">C2C(Customer to Customer)</h2>
<blockquote>
<p>소비자 간 거래</p>
</blockquote>
<p>당근마켓, 중고나라, 번개장터</p>
<h1 id="비즈니스-로직이란">비즈니스 로직이란?</h1>
<blockquote>
<p>사용자의 요구사항을 해결하기 위한 실질적인 코드 한 문장</p>
</blockquote>
<ol>
<li>회원이 작성한 아이디 값을 저장</li>
<li>회원정보가 있는 데이터베이스 연결</li>
<li>데이터베이스에 회원이 작성한 아이디 값이 있는지 중복검사</li>
<li>회원의 아이디가 이미 있는지 없는지 여부를 데이터화 하여 저장</li>
<li>데이터베이스 연결 끊기</li>
<li>View 영역에게 가공된 데이터 전달</li>
</ol>
<p>위에 설명한 한줄한줄이 전부 비즈니스 로직으로 불릴 수 있다.</p>
<h1 id="브라우저와-nodejs의-차이">브라우저와 node.js의 차이</h1>
<p>우선 공통점은 둘다, 자바스크립트 언어를 기반으로 실행되며, 자바스크립트 엔진을 내장한다.</p>
<h2 id="목적">목적</h2>
<p>node.js는 서버 개발 환경을 제공하는 것이 목적
브라우저는 HTML, CSS, JS를 실행하여 웹 페이지를 화면에 띄우는 것이 목적</p>
<blockquote>
<p><a href="https://eibery77.tistory.com/421">참고자료</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[지나가는 FE의 UIUX에 대한 고찰]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%A7%80%EB%82%98%EA%B0%80%EB%8A%94-FE%EC%9D%98-UIUX%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@_dodo_hee/%EC%A7%80%EB%82%98%EA%B0%80%EB%8A%94-FE%EC%9D%98-UIUX%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Fri, 01 Sep 2023 15:27:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/d00ed414-e511-4cd3-b0ba-63caf8f044f8/image.png" alt="UIUX 이쁘면 다냐"></p>
<h1 id="🤷♀️-왜-갑자기">🤷‍♀️ 왜 갑자기?</h1>
<p>최근에 사이드프로젝트도 많이 해보고 있고, 이직 준비를 하면서 겪었던 과제를 해결하면서
내가 어떤 개발자이지? 내가 지금 뭐를 중심적으로 개발했지? 라는 생각을 하게 됐다.
공통적으로 내가 대답한 답은,</p>
<p><strong>&quot;사용자의 쉬운 경험, 사용자의 익숙한 경험&quot;</strong>을 중시 했던 것 같다.</p>
<p>내 생각 뿐만이 아니라, 실제로 프론트엔드가 UIUX를 공부 해야할 이유가 있다.</p>
<ul>
<li>유저들의 기대치와 요구사항이 계속 변화하고 있다.</li>
<li>경쟁이 치열한 시장에서는 우수한 UI/UX가 제품 또는 서비스의 주요 차별화 요소가 되고 있다.</li>
<li>더 나은 경험을 위해 기술적 혁신과 함께 UI/UX 디자인 및 개발도 계속 발전하고 있다.</li>
</ul>
<p>이런 생각들을 하다 나와 같은 연차와 나와 같은 생각을 하고 있는 사람들을 위해 블로그를 작성한다.</p>
<h1 id="uiux">UI/UX</h1>
<h2 id="ui">UI</h2>
<blockquote>
<p>UI (User Interface)는 사용자와 시스템 또는 애플리케이션 간의 상호작용을 표현하는 디자인 요소와 요소의 배치를 의미한다.</p>
</blockquote>
<p>화면 디자인, 버튼, 메뉴, 아이콘, 색상, 레이아웃 등과 관련이 있다.
사용자가 시스템 또는 애플리케이션을 어떻게 조작하고 상호작용하는지를 <strong>시각적</strong>으로 표현한다.</p>
<h2 id="ux">UX</h2>
<blockquote>
<p>User Experience(사용자 경험)는 사용자가 제품, 서비스 또는 애플리케이션과 상호작용하는 과정에서 느끼는 전반적인 경험을 의미한다.</p>
</blockquote>
<p>사용자의 만족도, 편의성, 효율성, 접근성 및 사용자의 감정과 관련이 있다.
사용자의 요구사항을 충족, 작업을 쉽게 수행할 수 있도록 <strong>설계하고 최적화하는 데 초점</strong>을 맞춘다.</p>
<h2 id="예시-사진">예시 사진</h2>
<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/2a0a5f49-f84b-43af-bcc6-a5ad71379faf/image.png" alt="UIUX예시"></p>
<p>이것보다 UIUX의 예시를 설명하는데에 더 나은 사진을 못 본듯.</p>
<h3 id="ui의-케찹은">UI의 케찹은</h3>
<p>진짜 이쁘고, 감성적이고, 옛날 레트로 갬성을 불러일으키고, 누가봐도 이쁘다.
하지만, 딱봐도 병으로 생겨서 케찹짤때 겁나 불편하다고 생각이 든다.</p>
<h3 id="ux의-케찹은">UX의 케찹은</h3>
<p>케찹을 짤때 아래로 향하게 툭툭 내려치면서, 케찹을 짯던 기억이 있을텐데, 그걸 아주 쉽게 보완했다.
아예 세워놓는 디자인을 통해 우리가 불필요한 행동을 하지 않게 되었고, 훨씬 편해졌다.</p>
<h3 id="결론">결론</h3>
<p>UI가 괜찮다고 해서 UX까지 괜찮은 건 아니라는 걸 알려주는 이미지이다.
그리고 UX가 편리해지게 UI도 같이 변경되면서, UX는 UI를 포함하고 있다고 말할 수 있다.</p>
<p>이렇게 UIUX가 별개가 아니듯,
좋은 UX가 좋은 UI가 아니고
좋은 UI가 좋은 UX가 아니다.</p>
<h2 id="개발자가-꼭-알아야해">개발자가 꼭 알아야해?</h2>
<p>나는 꼭 알아야된다 주의의 개발자긴 하지만,
공부 안해서 나쁠 건 없다고 생각한다.</p>
<ul>
<li>최근 채용공고에서 UIUX에 관심이 많은 사람 우대 조건에 많이 보이고 있다.</li>
<li>복잡해진 웹 때문에, 정보 표현하는 방식이 다양해지면서 사용자 입장에서 더 고려를 해야한다.</li>
</ul>
<h1 id="📜-10가지-ux-법칙">📜 10가지 UX 법칙</h1>
<h2 id="제이콥의-법칙">제이콥의 법칙</h2>
<blockquote>
<p>유저는 익숙한 경험을 토대로 새로운 제품을 판단한다.</p>
</blockquote>
<p>다른 서비스에서 축적된 경험으로 다른 서비스를 이해하려고 할때 <strong>멘탈 모델</strong>이라고 부른다.
기존 방식을 아예 버린 후, 아예 새롭게 UX를 제공한다면, 유저는 새롭게 학습해야해서 불쾌할 수 있다.</p>
<p>*멘탈 모델 : 시스템, 사물이 실제로 어떠한 방식으로 작동할 것이라고 생각하는 인간의 사고 과정을 구조화</p>
<h2 id="피츠의-법칙">피츠의 법칙</h2>
<blockquote>
<p>목표물에 도달하는 데 걸리는 시간은 목표물의 거리와 크기에 따라 달라진다.</p>
</blockquote>
<ul>
<li>터치할 수 있는 영역간의 거리는 적당해야한다. (입력 오류가 안날 수 있는 정도)</li>
<li>너무 크기가 커서도, 너무 작아서도 안된다.</li>
<li>모바일 특성상 사용자 시선이 중심으로 집중되서, Horizontal 보다 Vertical 형태가 더 좋다.</li>
</ul>
<h2 id="힉의-법칙">힉의 법칙</h2>
<blockquote>
<p>선택지가 너무 많으면 인지 부하가 증가한다.</p>
</blockquote>
<ul>
<li>선택지의 갯수가 증가할수록, 사용자의 인지 부하도 증가된다. (뇌 자체에서 선택시간이 길어짐)</li>
<li>사용자가 빠르게 목적을 달성 할 수 있도록 그룹핑 해주는 형식도 좋다.</li>
</ul>
<h2 id="밀러의-법칙">밀러의 법칙</h2>
<blockquote>
<p>인간의 작업 기억 용량과 작업의 복잡도 사이의 관계를 설명하는 심리학적 원리</p>
</blockquote>
<ul>
<li>보통 사람은 작업을 7(+-2)개의 항목 밖에 기억하지 못한다.</li>
<li>심리학자 조지 밀러라는 사람이 정보 처리 용량의 관한 한계에 대한 논문 자료도 있다.</li>
<li>사람은 글자 수가 아니라, 정보 덩어리로 기억한다. (글자수 7 = 단어 7)</li>
<li>덩어리화의 대표적인 예시가 핸드폰 번호</li>
</ul>
<h2 id="포스텔의-법칙">포스텔의 법칙</h2>
<blockquote>
<p>유저는 채워 넣어야 할 정보의 양이 많아질수록 인지부하가 증가한다.</p>
</blockquote>
<ul>
<li>사용자의 입력은 무조건 수용하되, 사용자에게 요청하는 정보의 양은 보수적으로 책정한다.</li>
<li>한번에 너무 많은 정보를 입력 요청하게 되면, 피로감과 에너지 소모가 커진다.</li>
</ul>
<h2 id="피크엔드의-법칙">피크엔드의 법칙</h2>
<blockquote>
<p>사용자의 경험은 평균이나 합계가 아니라 절정의 순간이나, 마지막 순간에 느낀 감정을 바탕으로 판단된다.</p>
</blockquote>
<ul>
<li>우리가 앱을 사용하면서 중요한 순간, 특히 실패했던 경험을 더 오래 기억하려는 경향이 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/3be7692a-30b0-4c6a-a753-056786e83e2f/image.png" alt="에러페이지"></p>
<h2 id="테슬러의-법칙">테슬러의 법칙</h2>
<blockquote>
<p>모든 시스템에는 더 이상 줄일 수 없는 일정 수준의 복잡성이 존재한다.</p>
</blockquote>
<ul>
<li>토스는 은행별 계좌번호 고유의 패턴을 파악해서 추천 은행명을 표시해준다.</li>
<li>필연적인 복잡성이 발생할때, 사용자를 어드바이스해 불편함의 간극을 줄이는 게 서비스 제공자 역할</li>
</ul>
<img src="https://velog.velcdn.com/images/_dodo_hee/post/18eec6c6-e7dd-44f1-a31c-3e43ad7b85ea/image.png" width="200" height="50"/>


<h2 id="심미적-사용성-효과">심미적 사용성 효과</h2>
<blockquote>
<p>사람들은 보기 좋은 디자인이 사용성이 뛰어나다고 인식한다.</p>
</blockquote>
<ul>
<li>예를들어 금융앱이 딱딱하고 복잡하고 어렵다라는 인식이 있었는데 토스는 이쁘고, 사용성도 뛰어난 것</li>
<li>사람들은 웹사이트가 어떤지 평가하는데 50m/s 가 걸린다고 한다.</li>
</ul>
<img src="https://velog.velcdn.com/images/_dodo_hee/post/841f827a-6443-40d8-bc96-faf5ddf9e1ae/image.png" width="200" height="50"/>
<img src="https://velog.velcdn.com/images/_dodo_hee/post/c26749be-4a16-4303-88c1-4d9e206c8a3c/image.png" width="200" height="50"/>

<h2 id="폰-레스토프-효과">폰 레스토프 효과</h2>
<blockquote>
<p>동일한 요소들 중에서 눈에 띄는 요소가 기억에 더 오래 남는 현상을 말한다.</p>
</blockquote>
<ul>
<li>비슷한 여러 객체가 있을땐, 특정 기능을 강조하거나 유도하기 위해 보색 컬러 같은 시각적인 효과를 적용한다.</li>
<li>예를들어, 온보딩 기능, 알림 기능</li>
<li>시각적 강조를 남발하면, 집중력이 떨어질 수 있고, 산만해질 수 있다.</li>
</ul>
<h2 id="도허티-임계">도허티 임계</h2>
<blockquote>
<p>사용자와 컴퓨터 간의 인터랙션 시 가장 적절한 시간 범위를 나타내는 개념</p>
</blockquote>
<ul>
<li>사용자의 관심을 유지하고 생산성을 높이기 위해서는 0.4초 이내의 시스템 피드백을 제공한다.</li>
<li>정보를 전달할때 딜레이가 생길땐, 스켈레톤 UI, 로딩 애니메이션으로 역동적인 볼거리를 제공해 지루함을 해소시킨다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/a4870e5d-0d01-4979-b878-bb3d5669c29f/image.png" alt="스켈레톤"></p>
<h1 id="마무리">마무리</h1>
<p>실제로 난 정말 편하고 간단하고 이쁜 서비스만 찾아다녔다.
주식을 처음 시작하려고 할때도, 증권앱 어떤 걸로 할지 고민하다가
토스가 너무 내 눈엔 쉽고 편했어서 나의 첫 증권앱이었다.
UIUX 법칙을 공부해보면서, 토스가 얼마나 고민한지 느껴졌고,
실제 다녔던 회사에서도 왜 그렇게 디자인 리뷰가 길어졌는지도 너무 이해가 됐다.</p>
<p>UIUX 법칙을 공부하면서, 실제 사용자로써, 개발자로써 공감가는 것들도 너무 많았다.
더 나은 서비스, 더 나은 제품을 만들려면, 프론트엔드로써 사용자 중심의 UX 공부는 더 필수라고 느껴졌고,
의견이나, 아이디어를 제공할 수 있는 지식을 길러야한다고 느꼈다.</p>
<p>사실 요즘, 프론트엔드가 아닌 다른 개발자로 방향을 전환해야하나 싶었는데, 아직 그 고민은 너무 일렀다.
조금 더 사용자들이 쉽게 접근하고 이해할 수 있는 인터페이스를 많이 개발해보고, 
UX적으로 좋고, 유명한 프로젝트를 경험해보고 싶다.</p>
<blockquote>
<p><a href="https://brunch.co.kr/@chadwick/33">참고자료</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 객체]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Thu, 31 Aug 2023 08:17:45 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트에서 객체란 뭘까요?
함수와 메서드의 차이점에 대해 알고 계신가요?
자바스크립트에서 객체를 생성하는 방법은 어떤 것들이 있나요?</p>
<p>자바스크립트는 객체(object) 기반의 스크립트 언어이며 자바스크립트를 이루고 있는 거의 “모든 것”이 객체이다.
원시타입을 제외한 나머지 값들은 모두 객체이다.</p>
<h1 id="객체">객체</h1>
<blockquote>
<p>자바스크립트의 객체는 키(key)과 값(value)으로 구성된 프로퍼티(Property)들의 집합이다. </p>
</blockquote>
<p>자바스크립트의 함수는 일급 객체이므로 값으로 취급할 수 있다.
프로퍼티 값으로 함수를 사용할 수도 있고, 프로퍼티 값이 함수일 경우, 
일반함수와 구분하기 위해 메소드라고 부른다.</p>
<p>객체는 데이터를 의미하는 프로퍼티와 데이터를 참조하고,
조작할 수 잇는 동작을 의미하는 메소드로 구성된 집합이다.
객체는 데이터와 그 데이터에 관련되는 동작을 모두 포함할 수 있기 때문에 
데이터와 동작을 하나의 단위로 구조화할 수 있어 유용하다.</p>
<p>자바스크립트 객체는 객체지향의 상속을 구현하기 위해
<strong>프로토타입</strong>이라고 불리는 객체의 프로퍼티와 메소드를 상속 받을 수 있다.</p>
<h2 id="프로퍼티">프로퍼티</h2>
<blockquote>
<p>프로퍼티 키(이름)와 프로퍼티 값으로 구성</p>
</blockquote>
<p>프로퍼티키는 프로퍼티를 식별하기 위한 식별자.</p>
<h3 id="프로퍼티-명명-규칙">프로퍼티 명명 규칙</h3>
<ul>
<li>프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 symbol 값</li>
<li>프로퍼티 값 : 모든 값</li>
</ul>
<p>Symbol은 ES6(ES2015)에서 도입된 새로운 원시 데이터 타입</p>
<h2 id="메소드">메소드</h2>
<blockquote>
<p>객체에 제한되어있는 함수를 의미한다.</p>
</blockquote>
<ul>
<li>프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드라 부른다.</li>
<li>해당 객체의 상태와 데이터에 접근하거나 수정하는 작업을 수행하기 위해 사용</li>
<li>객체의 프로퍼티에 할당된 함수로, 그 객체의 상태를 조작하거나 동작을 수행하는 데 사용</li>
</ul>
<h3 id="함수와-메소드-차이">함수와 메소드 차이</h3>
<blockquote>
<p>코드 블록을 감싸고 실행할 수 있는 작업의 단위를 나타내는 프로그래밍 개념</p>
</blockquote>
<h4 id="함수">함수</h4>
<ul>
<li>일련의 코드 문장들을 묶어 재사용 가능한 블록으로 정의한 것</li>
<li>어떤 객체에 속하지 않고 독립적으로 존재할 수 있다.</li>
<li>자바스크립트에서 함수는 일급 객체로 취급되어 변수에 할당하고,다른 함수에 전달하며, 함수에서 반환할 수 있다.</li>
</ul>
<h1 id="객체-생성-방법">객체 생성 방법</h1>
<h2 id="객체-리터럴">객체 리터럴</h2>
<blockquote>
<p>가장 일반적인 자바스크립트 객체 생성 방식.</p>
</blockquote>
<p>중괄호({})를 사용하여 객체를 생성하는데 {} 내에 1개 이상의 프로퍼티를 기술하면 해당 프로퍼티가 추가된 객체를 생성할 수 있다</p>
<pre><code class="language-javascript">var emptyObject = {};</code></pre>
<h2 id="object-생성자-함수">Object 생성자 함수</h2>
<blockquote>
<p>객체 리터럴 방식으로 생성된 객체는 결국 빌트인(Built-in) 함수인 Object 생성자 함수로 객체를 생성하는 것을 단순화시킨 축약 표현(short-hand)이다.</p>
</blockquote>
<p>자바스크립트 엔진은 객체 리터럴로 객체를 생성하는 코드를 만나면 내부적으로 Object 생성자 함수를 사용해서 객체를 생성한다.
개발자가 일부러 Object 함수를 사용해 객체를 생성해야하는 일은 거의 없다.</p>
<pre><code class="language-javascript">var person2 = {
  name: &#39;Kim&#39;,
  gender: &#39;female&#39;,
  sayHello: function () {
    console.log(&#39;Hi! My name is &#39; + this.name);
  }
};</code></pre>
<h2 id="생성자-함수">생성자 함수</h2>
<blockquote>
<p>자바스크립트의 생성자 함수는 이름 그대로 객체를 생성하는 함수</p>
</blockquote>
<p>일반 함수에 new 연산자를 붙여 호출하면 생성자 함수처럼 동작할 수 있다.
그래서 생성자 함수명은 첫문자를 대문자로 기술하여 혼란을 방지한다.</p>
<ul>
<li>생성자 함수 이름은 일반적으로 대문자로 시작한다. (생성자 함수임을 인식할 수 있도록 도움)</li>
<li>프로퍼티 또는 메소드명 앞에 기술한 this는 생성자 함수가 생성할 인스턴스(instance)를 가리킴.</li>
<li>this에 연결(바인딩)되어 있는 프로퍼티와 메소드는 public(외부에서 참조 가능)하다.</li>
</ul>
<pre><code class="language-javascript">// 생성자 함수
function Person(name, gender) {
  this.name = name;
  this.gender = gender;
  this.sayHello = function(){
    console.log(&#39;Hi! My name is &#39; + this.name);
  };
}

// 인스턴스의 생성
var person1 = new Person(&#39;Lee&#39;, &#39;male&#39;);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발자도구, 세션스토리지, 로컬스토리지]]></title>
            <link>https://velog.io/@_dodo_hee/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%8F%84%EA%B5%AC-%EC%84%B8%EC%85%98%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EB%A1%9C%EC%BB%AC%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80</link>
            <guid>https://velog.io/@_dodo_hee/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%8F%84%EA%B5%AC-%EC%84%B8%EC%85%98%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EB%A1%9C%EC%BB%AC%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80</guid>
            <pubDate>Tue, 29 Aug 2023 09:51:39 GMT</pubDate>
            <description><![CDATA[<p>개발자도구 각 탭의 역할
세션스토리지, 로컬스토리지 차이
세션스토리지 역할, 로컬스토리지 역할</p>
<h2 id="개발자-도구">개발자 도구</h2>
<blockquote>
<p>개발자도구는 브라우저에서 제공하는 하나의 도구
사이트를 즉시 수정하고 문제 발생시 원인을 파악하여 빠른 속도로 더 나은 사이트를 만들 수 있다.</p>
</blockquote>
<h3 id="📎-개발자도구-단축키">📎 개발자도구 단축키</h3>
<ul>
<li>개발자도구 : cmd + option + I /  ctrl + shift + I</li>
<li>개발자도구 Element 패널 : cmd + option + c (option &gt; shift로 대체가능)</li>
<li>개발자도구 Console 패널 : cmd + option + j (option &gt; shift로 대체가능)</li>
</ul>
<br/>

<hr>
<h2 id="console-패널">Console 패널</h2>
<p>console은 객체이다.
Console에는 로그인메서드를 포함한 다양한 메서드가 존재한다.
프론트엔드의 경우에는 디버깅시 다른도구를 사용하는 것 보다 console.log를 사용한다.</p>
<h3 id="📎-console패널의-기능">📎 Console패널의 기능</h3>
<ul>
<li>자바스크립트 코드를 바로 실행하고 에러 확인 가능</li>
<li>중단시점에서 변수체크와 값을 수정하고 평가 가능</li>
</ul>
<h3 id="📎-console-내용-전부-지우기">📎 Console 내용 전부 지우기</h3>
<p><img src="https://images.velog.io/images/_dodo_hee/post/e73abdc0-1fd7-45af-b98b-571c0881a2cc/image.png" alt="clear 이미지"></p>
<p>console창에 여러가지들을 테스트한 뒤에 콘솔창을 확인해보면 
이전 console에 출력한 내용까지 확인된다.</p>
<p>콘솔 내용을 아예 다 지우고 빈 console창을 나타내게 하고싶을땐,
<code>console.clear();</code>를 사용해주면 된다.</p>
<p>Console.clear();를 대체하는 내용 지우는 방법</p>
<ol>
<li>ctrl + L (맥은 cmd + k)</li>
<li>:출입금지_기호: 아이콘 클릭</li>
<li>clear(); 
😱 Preserve log upon navigation 이 적용 되어 있으면, 작동이 안된다.😱</li>
</ol>
<h3 id="📎-console-내용-남아있게하기">📎 Console 내용 남아있게하기</h3>
<p><img src="https://images.velog.io/images/_dodo_hee/post/57fb0702-2bac-4085-875d-9bb61dc9d392/image.png" alt="내용남아있게하기"></p>
<p>👉 <strong>Cmd + option + j</strong> &gt; console 옆 <strong>톱니바퀴아이콘</strong> 클릭 &gt; <strong>network</strong> &gt; <strong>Preserve log</strong> 체크</p>
<p><img src="https://images.velog.io/images/_dodo_hee/post/88aa23d7-818d-4bf2-b599-2b51d06981ad/image.png" alt=""></p>
<h3 id="📎-console-error와-warning-제외하기">📎 Console Error와 Warning 제외하기</h3>
<p>Console 창에서 에러와 경고메세지를 제외하고 콘솔을 보고싶을땐,</p>
<p><img src="https://images.velog.io/images/_dodo_hee/post/50bd8200-59f4-48e8-b565-25bdedb3b7b8/image.png" alt="4번째사진"></p>
<p>Console창에서 filter 옆에 Default levels 누르고 창이 뜨고 Warnings 와 Errors를 체크나 해제하면 된다.!</p>
<h3 id="📎-요소패널-이용하면서-콘솔패널이용하는-방법">📎 요소패널 이용하면서 콘솔패널이용하는 방법</h3>
<p><strong>Cmd + option + I</strong> 를 누르고 Element 패널이 나타나면 esc를 눌러서 맨 하단에 console패널이 나오는 것을 확인해라!</p>
<br/>

<hr>
<h2 id="element-패널">Element 패널</h2>
<p>코드를 분석하고 실시간으로 확인할 수 있게 하는 기능이 있고,
레이아웃과 디자인 테스트 가능하다.</p>
<ul>
<li>웹 페이지의 구성 (dom)</li>
<li>구성요소의 스타일 속성 (css)</li>
<li>Css 수정,ul 수정</li>
</ul>
<h3 id="📎-스타일-순서">📎 스타일 순서</h3>
<blockquote>
<p>! important -&gt; inline style -&gt; id selector -&gt; class selector -&gt; tag selector -&gt; * selector -&gt; 상위 요소에 의해 상속된 속성</p>
</blockquote>
<h3 id="📎-user-agent-stylesheet">📎 user agent stylesheet</h3>
<ul>
<li>margin 값을 정해두지 않아서 브라우저 임의대로 설정 되어 있는 것
결과물이 의도한 것과 조금 다를 수 있다.</li>
<li>그래서 * {margin:0;padding:0;}을 사용함</li>
<li>브라우저의 기본 스타일 값을 의미. ( Default ) 브라우저 마다 스타일 기본값이 다름.</li>
</ul>
<br/>

<hr>
<h2 id="network-패널">Network 패널</h2>
<p>현재 보고있는 페이지에서 실시간으로 통신하고 있는 정보가 표시되고,
api 크롤링과 로딩 성능 테스트도 가능하다.</p>
<h3 id="📎-xhr-탭-기능">📎 XHR 탭 기능</h3>
<p><img src="https://images.velog.io/images/_dodo_hee/post/0451f106-d0ea-4d93-ae09-3ffe767e6c25/image.png" alt="xhr"></p>
<p>브라우저에서 서버에 API를 호출할때 호출or응답이 정상적으로 이루어지는지 알 수 있다.
그래서 프론트와 백엔드 개발자의 소통 역할을 하는 탭이다.</p>
<h2 id="application-패널">Application 패널</h2>
<p>브라우저 저장소의 기능을 담당. 즉, 현재 로딩된 웹 페이지에서 사용된 모든 리소스(이미지, DB, 로컬 및 세션 스토리지, 쿠키, 애플리케이션 캐시 등)를 검사할 수 있다.</p>
<ul>
<li>프로그레시브 웹 앱 디버그</li>
<li>스토리지, DB 및 캐시 검사 및 관리</li>
<li>쿠키 검사 및 삭제</li>
<li>리소스 검사</li>
</ul>
<h1 id="local-storage--session-storage">Local Storage &amp; Session Storage</h1>
<p>서버와 클라이언트가 통신을 할 때 통신이 연속적으로 이어지지 않고 한 번 통신이 되면 끊어진다.
서버는 클라이언트가 누구인지 계속 인증을 받아야하는데,
클라이언트에서는 번거로움을 해결하기 위해 쿠키, 세션스토리지, 로컬 스토리지를 사용해서 서버에게 인증 정보를 가지고 있다가 제공한다.</p>
<h2 id="local-storage">Local Storage</h2>
<ul>
<li>사용자가 지우지 않는 이상 데이터의 영구성이 보장</li>
<li>사용자가 지우지 않는 이상 계속 클라이언트 웹브라우저에 남아있다</li>
<li>storage 3가지 중 허용 용량이 가장 크다(10mb).</li>
<li>지속적으로 필요한 정보를 저장하기에 좋다.</li>
</ul>
<p>ex) 자동 로그인 정보 / 장바구니</p>
<h2 id="session-storage">Session Storage</h2>
<ul>
<li>윈도우나 브라우저 탭을 닫을 경우 사라진다. </li>
<li>즉 데이터의 영구성을 보장하지 않는다. 일회성의 데이터</li>
</ul>
<p>ex) 비회원 장바구니/ 일회성 로그인 / 잠깐 동안 필요한 정보</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 4]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-4</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-4</guid>
            <pubDate>Thu, 24 Aug 2023 13:00:56 GMT</pubDate>
            <description><![CDATA[<h1 id="자바스크립트-배열">자바스크립트 배열</h1>
<blockquote>
<p>동적으로 크기가 조정되는 가변적인 자료구조</p>
</blockquote>
<p>배열은 리스트와 비슷한 객체로서 순회와 변형 작업을 수행
길이도, 각 요소의 자료형도 고정되어 있지 않다.
밀집성을 보장하지 않는다.
연속적인 메모리 공간에 저장되지 않으며, 다양한 데이터 타입을 저장한다.</p>
<h1 id="자료구조의-배열">자료구조의 배열</h1>
<blockquote>
<p>동일한 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료 구조</p>
</blockquote>
<p>배열의 요소는 하나의 타입으로 통일되어 있으며 서로 연속적으로 인접되어 있다.
고정된 크기를 가지며, 각 요소가 연속적인 메모리 공간에 저장한다.</p>
<h1 id="배열-메서드-종류">배열 메서드 종류</h1>
<h2 id="배열-리터럴">배열 리터럴</h2>
<pre><code class="language-javascript">const arr = [
  &#39;zero&#39;, &#39;one&#39;, &#39;two&#39;, &#39;three&#39;, &#39;four&#39;,
  &#39;five&#39;, &#39;six&#39;, &#39;seven&#39;, &#39;eight&#39;, &#39;nine&#39;
];</code></pre>
<h2 id="배열-생성자">배열 생성자</h2>
<pre><code class="language-javascript">const arr = new Array(1, 2, 3);

const arr2 = new Array(20); // 인수 하나만 넘겨줄때는 그 인수가 배열길이
arr2.length // 20</code></pre>
<h1 id="고차-함수">고차 함수</h1>
<blockquote>
<p>함수를 파라미터로 전달받거나 연산의 결과로 반환해주는 메서드</p>
</blockquote>
<p>함수형 프로그래밍의 핵심이기도 하며, 자바스크립트를 함수형 프로그래밍에 알맞은 언어로 만들어주는 특성</p>
<h2 id="종류">종류</h2>
<ul>
<li>forEach</li>
<li>map</li>
<li>find</li>
<li>findIndex</li>
<li>filter</li>
<li>reduce</li>
<li>reduce</li>
<li>some</li>
<li>sort</li>
<li>every</li>
</ul>
<h1 id="foreach-map">forEach, map</h1>
<blockquote>
<p>공통점은 &quot;배열을 이용한다&quot;는 점</p>
</blockquote>
<h2 id="map은-새로운-배열을-반환">map은 새로운 배열을 반환</h2>
<p>map()은 배열 내의 모든 요소 각각에 대하여 주어진 함수(콜백)를 호출한 결과를 모아 새로운 배열을 반환한다는 특징을 가지고 있다.</p>
<h2 id="리턴값을-보내지-않는-foreach">리턴값을 보내지 않는 forEach()</h2>
<pre><code>let arr = [1,2,3,4,5];
let a = arr.forEach(function(value){
    return value;
});
console.log(a);   //undefined</code></pre><p>forEach 문 밖으로 리턴값을 받지 못한다.</p>
<p>##</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CORS]]></title>
            <link>https://velog.io/@_dodo_hee/CORS</link>
            <guid>https://velog.io/@_dodo_hee/CORS</guid>
            <pubDate>Tue, 15 Aug 2023 09:57:48 GMT</pubDate>
            <description><![CDATA[<h1 id="cors">CORS</h1>
<blockquote>
<p>CORS(Cross-Origin Resource Sharing)는 출처가 다른 자원들을 공유한다는 뜻</p>
</blockquote>
<p>한 출처에 있는 자원에서 다른 출처에 있는 자원에 접근하도록 하는 개념.
즉, 교차되는 출처 자원들의 공유</p>
<p>컴퓨터적으로는,
CORS는 추가 HTTP 헤더를 사용해서 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제이다.</p>
<p>웹 애플리케이션은 리소스가 자신의 출처(도메인,프로토콜,포트)와 다를때 교차 출처 HTTP 요청을 실행한다.</p>
<h2 id="출처">출처</h2>
<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/6fc5574e-e20b-47a3-afdb-b4a35f840175/image.png" alt="출처이미지"></p>
<p>Protocol + Host + Port 3가지가 같으면 동일 출처(Origin)라고 한다.</p>
<h2 id="동일-출처-정책-same-origin-policy">동일 출처 정책 (Same-origin policy)</h2>
<blockquote>
<p>다른 출처로부터 조회된 자원들의 읽기 접근을 막아 다른 출처 공격을 예방한다.</p>
</blockquote>
<p>다른 출처 자원을 가져오는 것을 굉장히 제한적으로 허용했고, 
SPA, 미디어 중심 웹사이트들이 더 늘어나며 규칙도 늘어났다.</p>
<p>그래서, 다른 출처 리소스에 접근성을 높이기 위해 CORS가 등장</p>
<h1 id="cors-에러">CORS 에러</h1>
<h3 id="출처가-다를때">출처가 다를때</h3>
<ul>
<li>Protocol이 다를때</li>
<li>Host가 다를때</li>
<li>포트번호가 다를때</li>
</ul>
<h3 id="헤더-값이-요청의-출처와-일치하지-않는-도메인일-경우">헤더 값이 요청의 출처와 일치하지 않는 도메인일 경우</h3>
<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/e1799874-dd7c-43f1-9a51-23c9d70ba79a/image.png" alt=""></p>
<h3 id="access-control-allow-credentials-가-true로-설정되지-않았거나-access-control-allow-origin-헤더에-있는-값이-허용된-출처가-아닐때">access-control-allow-credentials 가 true로 설정되지 않았거나, access-control-allow-origin 헤더에 있는 값이 허용된 출처가 아닐때</h3>
<p><img src="https://velog.velcdn.com/images/_dodo_hee/post/56fa4599-816a-4bcf-8393-124513156fbf/image.png" alt=""></p>
<h1 id="캐시">캐시</h1>
<blockquote>
<p>데이터나 값을 미리 복사해 임시로 저장해 두는 장소</p>
</blockquote>
<p>사이트를 불러 올때, 전에 불러왔던 사진을 접속때마다 불러오면 데이터의 낭비를 일으킨다.
캐시를 통해 클라이언트에 저장해둘 수 있고, 주기적으로 비워줘야한다.</p>
<h2 id="실전-예시">실전 예시</h2>
<p>그래서 우리가 어떤 기능을 웹사이트에 업데이트 후
다른 누군가가 확인하고 있을때,
예를들어, 업데이트 된 정보가 다른 누군가에게 확인이 되지 않을때, 우리는 캐시를 지워달라고 말한다.</p>
<h1 id="snippet">snippet</h1>
<blockquote>
<p>재사용 가능한 소스코드나 텍스트의 작은 부분을 일컫는 프로그래밍 용어</p>
</blockquote>
<p>쉽게 말해 자동완성 기능</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 3]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-3</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-3</guid>
            <pubDate>Thu, 10 Aug 2023 12:25:54 GMT</pubDate>
            <description><![CDATA[<h1 id="타입-변환">타입 변환</h1>
<p>자바스크립트에는 모든 타입이 있고, 값의 타입은 개발자에 의해 의도적으로 다른 타입으로 변환할 수 있다.
또는 자바스크립트 엔진에 의해 암묵적으로 자동 변환도 할 수 있다.</p>
<h1 id="명시적-타입-변환type-casting">명시적 타입 변환(Type casting)</h1>
<blockquote>
<p>개발자에 의해 의도적으로 타입을 변환하는 것</p>
</blockquote>
<h2 id="예시">예시</h2>
<pre><code class="language-javascript">var x = 10;

// 명시적 타입 변환
var str = x.toString(); 
console.log(typeof str); // string</code></pre>
<p>toString 메서드를 이용하여, number 의 타입을 string으로 변경해준다.</p>
<h2 id="방법">방법</h2>
<h3 id="문자열-타입-변환">문자열 타입 변환</h3>
<ul>
<li>String 생성자 함수를 new 연산자 없이 호출하는 방법</li>
<li>Object.prototype.toString 메소드를 사용하는 방법</li>
<li>문자열 연결 연산자를 이용하는 방법</li>
</ul>
<pre><code class="language-javascript">console.log(String(1));  // &quot;1&quot;</code></pre>
<h3 id="숫자-타입-변환">숫자 타입 변환</h3>
<pre><code class="language-javascript">console.log(Number(&#39;0&#39;));  // 0</code></pre>
<h3 id="숫자-타입-변환-1">숫자 타입 변환</h3>
<pre><code class="language-javascript">console.log(Number(&#39;0&#39;));  // 0</code></pre>
<h3 id="불리언-타입-변환">불리언 타입 변환</h3>
<ul>
<li>Boolean 생성자 함수를 new 연산자 없이 호출하는 방법</li>
<li>! 부정 논리 연산자를 두번 사용하는 방법</li>
</ul>
<pre><code class="language-javascript">console.log(Boolean(&#39;x&#39;));       // true
console.log(Boolean(&#39;&#39;));        // false</code></pre>
<h1 id="암묵적-타입-변환-type-coercion">암묵적 타입 변환 (Type coercion)</h1>
<blockquote>
<p>자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것
자바스크립트 엔진은 표현식을 평가할 때 문맥, 즉 컨텍스트(Context)에 고려하여 암묵적 타입 변환을 실행한다. </p>
</blockquote>
<pre><code class="language-javascript">var x = 10;

// 암묵적 타입 변환
var str = x + &#39;&#39;;

console.log(typeof str, str); // string 10
console.log(x); // 10</code></pre>
<p>숫자 타입 x의 값을 바탕으로 새로운 문자열 타입의 값을 생성해 표현식을 평가한다.
하지만, 기존 값이 변경되지는 않는다.</p>
<h2 id="방법-1">방법</h2>
<h3 id="문자열-타입-변환-1">문자열 타입 변환</h3>
<pre><code class="language-javascript">1 + &#39;2&#39; // &quot;12&quot;
true + &#39;&#39; // &quot;true&quot;</code></pre>
<h3 id="숫자-타입-변환-2">숫자 타입 변환</h3>
<pre><code class="language-javascript">1 - &#39;1&#39;    // 0
1 * &#39;10&#39;   // 10
1 / &#39;one&#39;  // NaN</code></pre>
<h3 id="불리언-타입-변환-1">불리언 타입 변환</h3>
<pre><code class="language-javascript">if (&#39;&#39;) console.log(x);</code></pre>
<h3 id=""></h3>
<h2 id="-기존-값변수을-직접-변경하는-것은-아니다"># 기존 값(변수)을 직접 변경하는 것은 아니다.</h2>
<p>변수값을 변경하려면 재할당을 통해 새로운 메모리 공간을 확보하고, 
그곳에 원시값을 저장하고 변수명이 재할당된 원시값이 저장된 메모리 공간의 주소를 기억하도록 해야하기 때문이다.    </p>
<h2 id="-자바스크립트-엔진이-어떻게-움직일까"># 자바스크립트 엔진이 어떻게 움직일까?</h2>
<p>자바스크립트 엔진이 표현식을 에러없이 평가하기 위해 기존 값을 바탕으로 새로운 타입의 값을 만들어 단 한번 사용하고 버린다.</p>
<ol>
<li>변수 x의 숫자 값을 바탕으로 새로운 문자열 값 ‘10’을 생성</li>
<li>표현식 ‘10’ + ‘‘를 평가</li>
<li>자동 생성된 문자열 ‘10’은 표현식의 평가가 끝나면 아무도 참조하지 않으므로 가비지 컬렉터에 의해 메모리에서 제거.</li>
</ol>
<h2 id="-좋은-코드"># 좋은 코드</h2>
<p>자신의 코드에서 암묵적으로 타입이 변환되는지, 명시적으로 변환되는지 예측이 가능한 코드로 작성해야한다.
예측하지 못하거나 예측한 내용이 결과와 일치하지 않는다면 버그를 날 가능성이 높아진다.</p>
<h3 id="그럼-암묵적-코드를-안쓰면-되지-않을까">그럼 암묵적 코드를 안쓰면 되지 않을까?</h3>
<p>좋은 생각이지만, 그렇게 접근하면 옳진 않다.
암묵적 코드가 명시적 코드보다 가독성 면이 좋을 수 있고,
자바스크립트 문법을 잘 이해하고 있는 개발자에게는 <code>(10).toString()</code>보다 <code>10 + &#39;&#39;</code>이 더욱 간결하고 이해하기 쉬울 수 있다.</p>
<h1 id="truthy--falsy">truthy / falsy</h1>
<h2 id="truthy">truthy</h2>
<blockquote>
<p>참 </p>
</blockquote>
<pre><code class="language-javscript">if (true) {}
if ({}) {}
if (&quot;0&quot;) {}
if ([]) {}</code></pre>
<h2 id="falsy">falsy</h2>
<blockquote>
<p>거짓</p>
</blockquote>
<ul>
<li><p>undefined  </p>
</li>
<li><p>null  </p>
</li>
<li><p>false  </p>
</li>
<li><p>0(+0, -0)  </p>
</li>
<li><p>NaN  </p>
</li>
<li><p>&quot;&quot;</p>
<pre><code class="language-javascript">if (undefined) {}
if (null) {}
if (false) {}
if (0) {}
if (NaN) {}
if (&quot;&quot;) {}</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 2]]></title>
            <link>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-2</link>
            <guid>https://velog.io/@_dodo_hee/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-2</guid>
            <pubDate>Thu, 03 Aug 2023 10:06:11 GMT</pubDate>
            <description><![CDATA[<h1 id="심벌-타입">심벌 타입</h1>
<blockquote>
<p>ES6부터 도입 된, 7번째 데이터 타입으로 변경 불가능한 원시 타입의 값이다.</p>
</blockquote>
<ul>
<li>다른 값과 중복되지 않는 유일무이한 값.</li>
<li>주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용.</li>
<li>객체 프로퍼티 키로 사용할 수 있는 값은 빈 문자열을 포함하는 모든 문자열 또는 심벌 값.</li>
</ul>
<h1 id="데이터-타입">데이터 타입</h1>
<blockquote>
<p>데이터 타입은 프로그래밍 언어에서 사용할 수 있는 데이터(숫자,문자열,불리언 등)의 종류.</p>
</blockquote>
<p>코드에서 사용되는 모든 데이터는 메모리에 저장하고 참조할 수 있어야한다.</p>
<p>데이터 타입 데이터를 메모리에 저장할때,</p>
<ul>
<li>확보해야하는 메모리 공간의 크기</li>
<li>할당할 수 있는 유효한 값에 대한 정보</li>
<li>메모리에 저장되어 있는 2진수 데이터를 어떻게 해석할 지에 대한 정보</li>
</ul>
<p>들을 컴퓨터와 개발자에게 알려준다.</p>
<h2 id="데이터-타입-사용하는-이유">데이터 타입 사용하는 이유?</h2>
<ul>
<li>한정된 메모리 공간을 효율적으로 관리하기 위해</li>
<li>2진수 데이터로 메모리에 저장 된 데이터를 다양한 형태로 사용하기 위해</li>
</ul>
<br/>

<h1 id="데이터-타입-종류">데이터 타입 종류</h1>
<h2 id="원시-타입">원시 타입</h2>
<blockquote>
<p>변경 불가능한 값(immutable value)이며 pass-by-value(값에 의한 전달) 이다.</p>
</blockquote>
<h3 id="숫자-타입">숫자 타입</h3>
<ul>
<li>자바스크립트는 모든 수를 실수로 처리.</li>
<li>정수만 표현하기 위한 별도의 데이터 타입이 존재하지 않음.</li>
<li>메모리에 64비트 부동소수점 형식의 2진수로 저장.</li>
<li>메모리에 있는 어떤 형식의 값을 참조하든지 모두 10진수로 해석.</li>
<li>숫자 타입은 특별한 값도 있음.(Infinity, -Infinity, NaN)</li>
</ul>
<p><strong>자바스크립트 엔진은 대소문자를 구별한다.</strong></p>
<h3 id="문자열-타입">문자열 타입</h3>
<ul>
<li>문자열은 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합</li>
<li>전 세계 대부분의 문자를 표현</li>
<li>나타내는 방법은 세 가지. (&#39; &#39;, &quot; &quot;, 백틱) - 문자열 나타낼 때 가장 일반적으로 작은따옴표가 사용.</li>
</ul>
<h3 id="템플릿-리터럴">템플릿 리터럴</h3>
<ul>
<li>템플릿 리터럴은 ES6부터 도입.</li>
<li>멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공.</li>
<li>템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리.</li>
<li>${}</li>
</ul>
<h3 id="불리언-타입">불리언 타입</h3>
<ul>
<li>true | false</li>
</ul>
<h3 id="undefined-타입">undefined 타입</h3>
<ul>
<li>var로 변수를 선언하면 자바스크립트 엔진이 자동적으로 undefined로 초기화시켜버림</li>
<li>변수를 참조했을 때 undefined가 반환된다면, 변수 선언 이후 값이 할당되지 않은, 초기화되지 않은 변수라는 뜻.</li>
</ul>
<h3 id="null-타입">null 타입</h3>
<ul>
<li>변수에 값이 없다는 것을 의도적으로 명시할 때 사용</li>
<li>이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거</li>
<li>자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다.</li>
</ul>
<h2 id="객체-타입-참조-타입">객체 타입 (참조 타입)</h2>
<blockquote>
<p>원시 타입을 제외한 모든 것이 객체 타입이다.</p>
</blockquote>
<ul>
<li>객체타입은 변경 가능한 값을 뜻한다.</li>
<li>객체타입을 복사해서 다른 변수에 할당 할 경우 해당 객체 타입의 주소값이 두번 째 변수의 메모리 공간에 저장된다.</li>
<li>원시타입을 복사해서 다른 변수에 할당 할 경우 해당 원시 타입의 원시값이 두번 째 변수의 메모리 공간에 값 자체가 저장된다.</li>
</ul>
<h1 id="동적-타이핑">동적 타이핑</h1>
<blockquote>
<p>자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. 
재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.</p>
</blockquote>
<p>동적 타입 언어는 유연성은 높지만, 신뢰성은 떨어진다.
동적 타이핑 언어는 사용자가 직접 타입을 지정 하지 않는다.
사용자는 값을 대입하고, 자바스크립트 엔진은 사용자가 대입한 값을 바탕으로 타입을 지정한다.</p>
<pre><code class="language-javascript">dohee = &quot;babo&quot;;</code></pre>
<h1 id="정적-타이핑">정적 타이핑</h1>
<blockquote>
<p>정적 타입언어는 명시적 타입선언을 하는 언어</p>
</blockquote>
<p>정적 타입 언어는 컴파일 시점에 타입 체크한다
= 선언한 데이터에 맞는 값을 할당했는지 검사하는 처리.
만약 타입 체크 통과 못했다면 에러를 발생시킨다.</p>
<pre><code class="language-javascript">const dohee = &quot;yeah&quot;;</code></pre>
<h1 id="타입-변환">타입 변환</h1>
<blockquote>
<p>기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성하는 것.</p>
</blockquote>
<ul>
<li>개발자 의도에 따라 값의 타입을 변환하는 것<ul>
<li>명시적 타입 변환</li>
<li>타입 캐스팅</li>
</ul>
</li>
<li>개발자 의도와는 상관없이 표현식을 평가하는 중에 자바스크립트 엔진에 의해 암묵적으로 타입이 변환되는 것<ul>
<li>암묵적 타입 변환</li>
<li>타입 강제 변환</li>
</ul>
</li>
<li>명시적 타입 변환이나, 암묵적 타입 변환이 기존 원시값을 직접 변경하는 것은 아님.<ul>
<li>원시 값은 변경 불가능 한 값이므로 변경 불가능.</li>
</ul>
</li>
</ul>
<p><strong>자바스크립트는 가급적 에러를 발생시키지 않도록, 암묵적으로 타입 변환을 통해 표현식을 평가한다.</strong></p>
<h1 id="단축-평가">단축 평가</h1>
<blockquote>
<p>타입 변환하지 않고 그대로 반환하는 것.</p>
</blockquote>
<ul>
<li>단축 평가는 표현식을 평가하는 도중에 평가결과가 확정된 경우,
나머지 평가 과정을 생략.</li>
<li>단축평가를 사용하면 if 문을 대체할 수 있으며,</li>
<li>삼항 조건 연산자는 if-else 문을 대체할 수 있다.</li>
</ul>
<p><del>진짜 말그대로 짧게 평가한다는 뜻..같은데..?</del></p>
<h2 id="논리-연산자">논리 연산자</h2>
<blockquote>
<p>논리합|| 또는 논리곱&amp;&amp;.</p>
</blockquote>
<h3 id="논리곱">논리곱&amp;&amp;</h3>
<p>두 개의 피연산자가 모두 true로 평가될 때 true를 반환.
좌항에서 우항으로 평가가 진행.</p>
<h3 id="논리합">논리합||</h3>
<p>두 개의 피연산자 중 하나만 true로 평가되어도 true를 반환.</p>
<h2 id="옵셔널-체이닝-연산자">옵셔널 체이닝 연산자</h2>
<blockquote>
<p>ES11 부터 사용, 옵셔널 체이닝 연산자 ?</p>
</blockquote>
<ul>
<li>좌항의 피연산자가 null 또는 undefined인 경우
undefined를 반환하고, 아니면 우항의 프로퍼티 참조를 이어간다</li>
</ul>
<h2 id="null-병합-연산자">null 병합 연산자</h2>
<blockquote>
<p>ES11 부터 사용, null 병합 연산자 ??</p>
</blockquote>
<ul>
<li>좌항의 피연산자 null 또는 undefined인 경우
우항의 피연산자를 반환,아니면 좌항의 피연산자를 반환.</li>
<li>null 병합 연산자 ??는 변수에 기본값을 설정할 때 유용.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>