<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>acidic.log</title>
        <link>https://velog.io/</link>
        <description>이유에 집착하는 프론트엔드 개발자 지망생입니다 🧐</description>
        <lastBuildDate>Sun, 19 Sep 2021 13:48:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>acidic.log</title>
            <url>https://images.velog.io/images/p-acid/profile/bfe811f7-602f-453a-9703-ec6a6791c2c4/IMG_3059.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. acidic.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/p-acid" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[TIL] React : State, Props]]></title>
            <link>https://velog.io/@p-acid/TIL-React-State-Props</link>
            <guid>https://velog.io/@p-acid/TIL-React-State-Props</guid>
            <pubDate>Sun, 19 Sep 2021 13:48:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>리액트의 <code>State</code> 와 <code>Props</code> 에 대한 내용과 <code>Event</code> 를 통해 이를 활용하는 내용 등을 포함합니다. 😊</p>
</blockquote>
<h1 id="리액트-state-📋">리액트 <code>State</code> 📋</h1>
<p><img src="https://images.velog.io/images/p-acid/post/086e4cb3-c3bc-4d44-a970-14ce20c90e4c/changed_meme.gif" alt=""></p>
<p>리액트를 통해 동적 웹을 구현하고자 할 때, 빼놓을 수 없는 없는 개념 중 하나가 <strong><code>State</code></strong> 다. <strong><code>State</code></strong> 는 말 그대로 <strong>상태</strong>를 의미하며, 그 <strong>상태의 대상</strong>은 해당 <strong>컴포넌트를 향한다.</strong>
</br>또한, <code>State</code> 는 컴포넌트의 <strong>UI 정보를 지닌 객체</strong>이기도 하다. 이게 무슨 의미인지 클래스형 컴포넌트에서 <code>State</code> 를 어떻게 정의하는 지에 대한 내용과 함께 알아보자.
</br></p>
<pre><code class="language-javascript">import React, { Component } from &#39;react&#39;;

class State extends Component {
  constructor() {
    super();
    this.state = {
      color: &#39;red&#39;,
    };
  }

  handleColor = () =&gt; {
    this.setState({
      color: &#39;blue&#39;
    })
  }

  render() {
    return (
      &lt;div&gt;
        &lt;h1 style={{ color: this.state.color }}&gt;Class Component | State&lt;/h1&gt;
        &lt;button onClick={this.handleColor}&gt;Click&lt;/button&gt;
      &lt;/div&gt;
    );
  }
}

export default State;</code></pre>
<p></br><code>State</code> 를 위 예시를 활용하여 설명해보자. 일단 <strong><code>constructor</code></strong> 를 통해 <code>state</code> 의 <strong>초기 값을 설정해준다.</strong> 이 과정에서 해당 <strong><code>super()</code> 를 꼭 넣어주어야 한다.</strong> 해당 <code>super()</code> 를 왜 필수로 사용해야 하는지에 대해서는 명확히 이해하지 못했기 때문에, 별도로 기재한다.
</br></p>
<h3 id="💡-super-에-대하여">💡 <code>super()</code> 에 대하여</h3>
<blockquote>
<p>자바스크립트의 <code>class</code> 에서 <code>super</code> 란 <strong>부모 클래스의 생성자 내지 메서드를 불러옴</strong>을 의미한다. <code>extends</code> 를 사용하여 부모 클래스를 통해 클래스를 생성하면 <code>super()</code> 를 사용할 수 있게 된다. 그렇게 되면 다음과 같은 상황을 만들 수 있다.
</br></p>
</blockquote>
<pre><code class="language-javascript">class Person{
    constructor(name, first, second){
        this.name = name;
        this.first = first;
        this.second = second;
    }
    sum(){
        return this.first+this.second;
    }
}
class PersonPlus extends Person{
    constructor(name, first, second, third){
        super(name, first, second);
        this.third = third;
    }
    sum(){
        return super.sum()+this.third;
    }
}</code></pre>
<p></br>위와 같이 <code>Person</code> 이라는 <code>class</code> 에서 파생된 <code>PersonPlus</code> 에서 <code>super()</code> 를 사용하여 <strong>부모 클래스의 생성자를 공유</strong>하고, <code>super</code> 를 통해 <strong>부모의 메서드를 사용할 수 있다.</strong> 
</br>리액트에서는 해당 <code>super()</code> 를 <code>this</code> 사용의 조건으로 강제한다는 부분이 있는데 해당 내용에 대해서는 심화 학습이 필요하기 때문에, 이번 리액트 <code>state</code> 에서는 생략하겠다.</p>
</br>

<h2 id="setstate-🔧"><code>setState()</code> 🔧</h2>
<p><img src="https://images.velog.io/images/p-acid/post/eb01bc0d-1b37-4232-805e-8d66495acdb2/setState_meme.jpg" alt=""></p>
<p>변수가 아닌 <code>state</code> 를 사용하는 장점은 값을 <strong>동적으로 변경할 수 있을 때</strong> 진가를 발휘할 것이다. <code>setState()</code> 는 이러한 <strong><code>state</code> 값을 변경할 수 있는 방법</strong>이다. 위 예시에서는 <code>setState()</code> 를 통해 요소의 색을 변경하고자 하였다.
</br></p>
<pre><code class="language-javascript">  handleColor = () =&gt; {
    this.setState({
      color: &#39;blue&#39;
    })
  }

  render() {
    return (
      &lt;div&gt;
        &lt;h1 style={{ color: this.state.color }}&gt;Class Component | State&lt;/h1&gt;
        &lt;button onClick={this.handleColor}&gt;Click&lt;/button&gt;
      &lt;/div&gt;
    );
  }
}</code></pre>
<p></br>해당 예시에서 <code>setState()</code> 를 통해 <code>color</code> 값을 <code>blue</code> 로 바꾼다는 것을 <code>handelColor</code> 라는 <code>arrow function</code> 을 통해 정의해준다. 그리고 <code>h1</code> 태그에 <code>style</code> 속성에서 <code>color</code> 에 해당하는 값으로 해당 <code>state</code> 값을 대입하고, 해당 <code>state</code> 값을 변경하기 위해 미리 정의해두었던 함수를 <code>button</code> 태그의 <code>onClick</code> 이벤트에 연동하여 대입해준다. 그렇다면 버튼을 클릭했을 때, <code>h1</code> 태그의 텍스트 색이 변화하는 것을 확인할 수 있을 것이다.
</br>위와 같이 <code>state</code> 값을 변화시켜 동적인 웹 구축에 활용할 수 있다. 추가적으로, 함수형 컴포넌트의 경우 <code>useState</code> 라는 것을 활용하여 <code>state</code> 값과 변경 함수에 대해 일괄적으로 정의할 수 있다.
</br></p>
<h1 id="props-🗃️"><code>props</code> 🗃️</h1>
<p><img src="https://images.velog.io/images/p-acid/post/c0411f5b-7b19-4b24-a664-0c2177b776ad/deeper_meme.jpg" alt=""></p>
<p><code>state</code> 에 대해 이해했다면 이제 <strong><code>props</code></strong> 에 대해 이해하면서 컴포넌트를 다루기 위한 준비를 확실하게 해보자. <strong><code>props</code></strong> 는 말 그대로 <strong>컴포넌트 속성 값</strong>을 의미하며, 자세히 말하자면 <strong>부모 컴포넌트로 부터 전달 받은 데이터 객체</strong>를 의미한다.
</br>이게 사람 말인가 싶다면 <span style = 'background-color : #fff5b1'>그게 정상이다. 😊</span> 자괴감에 빠지지 말고 좀 더 쉽게 알아보자.
</br></p>
<h2 id="props-를-통한-데이터-전달-📩"><code>props</code> 를 통한 데이터 전달 📩</h2>
<pre><code class="language-javascript">// Parent.js

import React from &#39;react&#39;;
import Child from &#39;../pages/Child/Child&#39;;

class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: &#39;red&#39;
    };
  }

  render() {
    return (
      &lt;div&gt;
        &lt;h1&gt;Parent Component&lt;/h1&gt;
    &lt;Child titleColor={this.state.color}/&gt;
      &lt;/div&gt;
    );
  }
}

export default State;</code></pre>
<pre><code class="language-javascript">// Child.js
import React from &#39;react&#39;;

class Child extends React.Component {
  render() {
        // console.log(this.props);

    return (
      &lt;div&gt;
        &lt;h1 style={{color : this.props.titleColor}}&gt;Child Component&lt;/h1&gt;
      &lt;/div&gt;
    );
  }
}

export default State;</code></pre>
<p></br>위와 같이 두 가지 컴포넌트가 정의되어 있다고 가정하자. <code>Parent</code> 컴포넌트는 아래 작성된 <code>Child</code> 컴포넌트를 불러와 사용하고 이름대로 부모 자식의 관계를 갖는다. 해당 상황에서 <strong><code>Child</code> 는 <code>Parent</code> 컴포넌트의 값에 접근하기 위해 어떻게 해야 할까?</strong>
</br>우선 위 예시의 <code>Parent</code> 컴포넌트에서 <code>Child</code> 컴포넌트를 불러와 사용하는 과정에서 <code>props</code> 를 넘기기 위해 <code>Parent</code> 의 <code>state</code> 값인 <code>blue</code> 를 <code>this.state.color</code> 를 통해 전달해준다. 그리고 해당 <code>props</code> 를 <code>titleColor</code> 라고 정의한다.
</br>그렇다면 이제 <code>Child</code> 컴포넌트는 <code>titleColor</code> 라는 값에 <code>props</code> 객체를 통해 접근 가능하다. 그렇게 <code>Child</code> 컴포넌트에서 <code>this.props.titleColor</code> 를 통해 넘겨 받은 <code>props</code> 값에 접근하고 이를 활용할 수 있는 것이다.
</br>또한 <code>props</code> 를 통해 <code>state</code> 값 뿐만 아니라 <code>setState</code> 를 활용하는 <code>event handler</code> 또한 전달할 수 있다.
</br></p>
<h2 id="props-를-통한-함수-전달-📬"><code>props</code> 를 통한 함수 전달 📬</h2>
</br>

<pre><code class="language-javascript">// Parent.js

import React from &#39;react&#39;;
import Child from &#39;../pages/Children/Children&#39;;

class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: &#39;red&#39;
    };
  }

  handleColor = () =&gt; {
    this.setState({
      color: &#39;blue&#39;
    })
  }

  render() {
    return (
      &lt;div&gt;
        &lt;h1&gt;Parent Component&lt;/h1&gt;
    &lt;Child titleColor={this.state.color} changeColor={this.handleColor}/&gt;
      &lt;/div&gt;
    );
  }
}

export default State;</code></pre>
<pre><code class="language-javascript">// Child.js

import React from &#39;react&#39;;

class Child extends React.Component {
  render() {
        // console.log(this.props);

    return (
      &lt;div&gt;
        &lt;h1 style={{color : this.props.titleColor}}&gt;Child Component&lt;/h1&gt;
    &lt;button onClick={this.props.changeColor}&gt;Click&lt;/button&gt;
      &lt;/div&gt;
    );
  }
}

export default State;</code></pre>
<p></br>이어지는 예시는 <code>setState</code> 부분에서 <code>button</code> 을 통해 <code>h1</code> 태그의 색을 바꾸는 것과 같은 예시이다. 다른 점이 있다면, <code>event handling</code> 을 부모 컴포넌트가 아닌 <strong>자식 컴포넌트</strong>에서 진행한다는 점이다. 그러기 위해서 부모 컴포넌트에서 정의한 <code>state</code> 를 변경할 수 있는 <code>setState</code> 가 들어간 <code>event handler</code> 함수를 위와 같이 전달하는 것이다.
</br>함수를 전달하는 방식은 앞의 값 전달 방식과 동일하다. <code>changeColor={this.handleColor}</code> 를 통해 전달하고자 하는 <code>props</code> 함수를 <code>changeColor</code> 라는 이름으로 전달한다. 그리고 전자와 마찬가지로 자식 요소에서 <code>props</code> 객체를 통해 함수를 전달 받아 이벤트에 바로 사용하면 된다.
</br>위와 같은 방식을 활용하면 컴포넌트의 컴포넌트화를 진행하는 과정에서 자유롭게 부모 자식의 데이터를 공유할 수 있다.
</br></p>
<h1 id="마무리-🧾">마무리 🧾</h1>
<p></br>사실 학습하다 보니, <code>state</code> 와 <code>props</code> 라는 부분은 실제로 적용하면서 학습하는 과정에서 더욱 이해가 깊어지는 것 같다. 이를 활용하여 진행 중인 프로젝트의 컴포넌트화를 원활히 진행한 후 학습했던 내용을 되짚어 보는 것도 좋을 것 같다.
</br></p>
<ul>
<li><code>state</code> 는 <strong>컴포넌트의 상태</strong>이며 <strong>컴포넌트가 갖는 값</strong>을 의미한다.</li>
<li><code>props</code> 란 <strong>컴포넌트 속성</strong>으로 <strong>부모 컴포넌트로 부터 상속 받는 데이터</strong>를 의미한다.</li>
<li><code>setState</code> 를 통해 <strong><code>state</code> 값을 변경할 수 있으며</strong>, 이를 <strong>이벤트 핸들링</strong>에 활용할 수 있다.</li>
<li><code>props</code> 를 통해 <strong>부모 요소의 <code>state</code> 를 자식에 반영할 수 있고</strong>, 이를 <strong>변경할 수도 있다.</strong>(State 끌어올리기)</br>

</li>
</ul>
<p><span style='background-color : #fff5b1'>그럼 20000 👍🏻</span>
<img src="https://images.velog.io/images/p-acid/post/d4391457-1c33-4ef8-b1b0-d5c0dda97d2d/jerry_finger.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React : Basics]]></title>
            <link>https://velog.io/@p-acid/TIL-React-Basics</link>
            <guid>https://velog.io/@p-acid/TIL-React-Basics</guid>
            <pubDate>Wed, 15 Sep 2021 00:51:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>리액트(React)</strong>에 대한 기본적인 내용으로 리액트에 대한 <strong>기반 정보</strong>와 <strong>컴포넌트</strong>, <strong>JSX</strong>에 대한 내용을 포함합니다. 😊</p>
</blockquote>
<h1 id="리액트란-무엇인가-🔤">리액트란 무엇인가? 🔤</h1>
<p><img src="https://images.velog.io/images/p-acid/post/b1e8ced7-fd0f-42bf-8eff-e84b932a1b6f/amazing_meme2.gif" alt=""></p>
<p>험하디 험한 바닐라 자바스크립트를 지나 드디어 <strong>리액트</strong>에 도착했다. 잠깐 알아봤는데도 이리 어메이징하고 어썸한게 있나 싶다. 그렇다면 리액트는 무엇인가? <strong>페이스북</strong>에서 만든건 알겠는데 제대로 알아본 적이 없다. 이번 포스팅에서 간단히 리액트에 대해 알아보고, <strong>어떤 원리로 디스플레이에 반영되는지</strong>에 대해서도 Araboza.</p>
<p><strong>리액트(React)</strong>는 자바스크립트 <strong>라이브러리</strong>의 하나로 <strong>사용자 인터페이스(UI)를 만들기 위해</strong> 사용된다. 앞에서도 말했듯이, <strong>페이스북</strong>에 의해 만들어졌고 개별 개발자 및 기업들 공동체에 의해 유지보수 된다. 
</br>리액트와 비슷하게 사용되는 <strong>Angular, Vue</strong>가 <strong>MVC(Model-View-Controller) Architecture</strong>인데 반해, 리액트는 오직 <strong>View</strong> 만을 담당하며, 그렇기에 추가적인 <strong>third-party 라이브러리(React-router, Redux)</strong>를 함께 사용한다. </p>
<h3 id="💡-third-party-library">💡 <code>third-party library</code></h3>
<blockquote>
<p>기본적으로 <strong>제 3자</strong>의 의미를 갖는 <strong>&#39;third-party&#39;</strong> 가 포함된 <strong>&#39;third-party library&#39;</strong>는 프로그래밍을 위해 도움이 되는 <strong>플러그인이나 라이브러리 등</strong>을 말한다.
</br>이에 대한 예시로 리액트의 경우 <strong>React-router</strong>를 사용하는데, <strong>SPA(Single Page Application)</strong> 방식을 채택하는 리액트의 경우 <strong>MPA(Multi Page Application)</strong> 방식처럼 페이지의 이동이 불가피하다. 그렇기에 페이지를 새로 불러 들이지 않고 <strong>변경된 부분만 수정</strong>하여 하나의 페이지에서 출력하게 해주는 렌더링 라이브러리인 <strong>라우터</strong>를 사용하는 것이다.</p>
</blockquote>
</br>

<h2 id="가상-돔virtual-dom-🌐">가상 돔(<code>Virtual Dom</code>) 🌐</h2>
<p></br>리액트의 가장 큰 장점 중 하나는 <strong>가상 돔(Virtual DOM)</strong>을 통해 실제 돔에 접근하는 대신에 <strong>추상화 시킨 객체에 접근한다</strong>는 것이다. 이 부분이 어떠한 장점을 갖는 지는 다음과 같은 이유가 있다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/5b664870-dbb2-4bc2-a4f3-da37f14e0418/image.png" alt=""></p>
<p>위 예시는 UI를 변경하는 과정에서 가상돔과 브라우저의 상태를 보여주는 내용이다. 위 내용을 설명하기에 앞서 <strong>실제 돔과 가상 돔</strong>의 차이점에 대해 간단히 알아보자. 실제 돔을 조작하는 것은 화면에 실제로 적용하는 과정이기에 이를 진행하는 것은 <strong>상대적으로 무거운 프로세스에 속한다.</strong> 그렇기 때문에, 이를 직접 조작하는 것 보다 이전에 만들어 놓은 경량 복사본인 <strong>가상 돔에</strong> 이를 우선적으로 적용하고 <strong>실제 돔과 어떠한 차이점이 있는 지 비교</strong>하여 돔 조작을 진행하는 것이 <strong>보다 더 가벼운 프로세스</strong>에 해당하는 것이다.
</br>다시 돌아와서 위 예시를 살펴보면, 우선 <strong>상태가 변화된 것을 인지</strong>하고 이에 따라 <strong>변화한 부분을 추적</strong>하여 가상 돔에 적용하였으며 마지막으로 변경 부분에 대해 <strong>실제 돔에 적용</strong>하여 이를 마무리 짓는다. 이렇게 되면 특히나 사용자의 인터랙션이 많은 <strong>SPA(Single Page Application)</strong>는 변화의 양이 많기 때문에, 변화의 양을 한꺼번에 묶어서 한 번에 진행하는 형태인 리액트가 훨씬 쾌적한 브라우저 환경을 제공한다.</p>
<h2 id="💡-spasingle-page-application">💡 SPA(<code>Single Page Application</code>)</h2>
<blockquote>
<p><strong>SPA(Single Page Application)</strong>란 서버에서 완전히 <strong>새로운 페이지를 불러오지 않고 현재 페이지를 동적으로 다시 작성함으로 페이지를 변경하는</strong> 형식을 말한다. 페이스북을 하다보면 다른 사람이 게시물에 댓글을 달았을 때, 별도의 새로고침 없이 업데이트 됨을 볼 수 있었다. 그러한 기능이 가능한 이유는 <strong>페이지가 업데이트 될 때, 새로운 문서(HTML)를 다시 스캔하는 것이 아니라</strong>, 자바스크립트를 활용하여 다시금 <strong>변화가 일어난 부분에 대해서만 수정을 진행하기 때문이다.</strong>
</br>SPA와 반대되는 개념으로 <strong>MPA(Multi Page Application)</strong>가 있는데, 나는 해당 개념을 <strong>화이트보드의 갯수</strong>로 비유하여 이해하기로 했다. SPA의 경우 <strong>화이트보드가 하나고 여러가지 초안을 바꾸면서 수정하는 형식</strong>이고, MPA의 경우는 <strong>여러가지의 화이트보드에 초안들이 미리 작성되어 있는 상태에서 화이트보드를 변경하는 형식</strong>이라고 이해했다.
</br>그렇기에 SPA 형식은 빠른 반응성, 화면 전환 등의 측면에서 <strong>사용자 친화적</strong>이고 상대적으로 <strong>유지보수가 쉽고 개발속도가 빠르며, 전체 트래픽 양이 적다</strong>는 장점이 있다.
</br>반면에, 처음 접속과 동시에 모든 리소스를 한 번에 받기 때문에 <strong>초기 구동 속도가 느리다</strong>는 점과, <strong>검색엔진 최적화(SEO)가 CSR 방식으로 어렵다는 점</strong> 등이 단점으로 꼽힌다.</p>
</blockquote>
</br>

<h2 id="컴포넌트component-🧱">컴포넌트(Component) 🧱</h2>
<p><img src="https://images.velog.io/images/p-acid/post/2f1e334c-e60d-4471-aff0-159278ddc3d0/lego_meme.gif" alt=""></p>
<p>또한 리액트의 장점으로 <strong>컴포넌트(Component)</strong>를 활용한다는 점이 있다. <strong>컴포넌트</strong>란 컴퓨터 소프트웨어에서 다시 사용할 수 있는 <strong>범용성</strong>을 위해 개발된 소프트웨어 구성 요소를 일컫는다. 그런 의미에서 알 수 있듯이 리액트에서는 반복되는 UI 구성 요소들을 하나의 컴포넌트로 지정하여 <strong>반복적인 작업을 방지</strong>하고 <strong>유지보수에 원활함</strong>을 부여한다. 컴포넌트의 특징을 정리하면 다음과 같다.
</br></p>
<ul>
<li><strong>재활용</strong>이 가능하다. </li>
<li>코드 <strong>유지보수</strong>에 용이하다.</li>
<li>코드 <strong>가독성</strong>이 높아진다.</li>
<li><strong>컴포넌트 내 컴포넌트</strong>를 포함할 수 있다.</li>
</ul>
<p></br>이러한 특징 덕분에 컴포넌트를 활용하여 UI 구성을 좀 더 체계적으로, 계획적으로 할 수 있는 것이다.</p>
<p>리액트에는 두 가지의 <strong>컴포넌트 선언 방식</strong>이 있는데 하나는 <strong>클래스(Class)형 컴포넌트</strong> , 나머지 하나는 <strong>함수형(Functional) 컴포넌트</strong>이다. 클래스형 컴포넌트와 함수형 컴포넌트의 역할은 비슷하지만, 그 <strong>선언 방식</strong>에서 차이를 보인다. 
</br></p>
<h3 id="클래스형-컴포넌트class-component">클래스형 컴포넌트(Class Component)</h3>
</br>

<pre><code class="language-javascript">import React from &#39;react&#39;

class Component extends React.Component { // extends : 클래스를 다른 클래스의 자식으로
  render() {
    return (
      &lt;div&gt;
        &lt;h1&gt;This is Class Component!&lt;/h1&gt;
      &lt;/div&gt;
    )
  }
}

export default Component</code></pre>
<p></br><strong>클래스형 컴포넌트</strong>는 보이는 듯이 <strong><code>render()</code></strong> 함수를 사용하고 <strong>JSX</strong> 를 반환하는 형식을 갖는다. 클래스형 컴포넌트는 다음과 같은 특징을 갖는다.
</br></p>
<ul>
<li><strong>state 기능, lifecycle 기능</strong> 등을 사용 가능</li>
<li><strong>임의 메서드</strong> 정의 가능</li>
</ul>
</br>

<h3 id="함수형-컴포넌트functional-componant">함수형 컴포넌트(Functional Componant)</h3>
</br>

<pre><code class="language-javascript">import React from &#39;react&#39;

const Component = () =&gt; {
  return (
    &lt;div&gt;
      &lt;h1&gt;This is Functional Component!&lt;/h1&gt;
    &lt;/div&gt;
  )
};

export default Component</code></pre>
<p></br><strong>함수형 컴포넌트</strong>는 클래스형 컴포넌트와 다르게 <code>render()</code> 함수를 사용할 필요 없고, 보다 더 <strong>간략하게 컴포넌트를 선언할 수 있다</strong>는 장점이 있다. 함수형 컴포넌트의 특징은 다음과 같다.
</br></p>
<ul>
<li><strong>메모리 자원</strong>을 상대적으로 <strong>덜 사용한다.</strong></li>
<li><strong>컴포넌트 선언</strong>이 편하다.</li>
<li><strong><code>Hook</code></strong> 활용</li>
</ul>
<p></br>최근에는 <strong>함수형 컴포넌트</strong>를 더 선호하는 추세이다.
</br></p>
<h3 id="💡-jsxjavascript-syntax-extension">💡 JSX(JavaScript Syntax Extension)</h3>
<blockquote>
<p><strong>JSX(JavaScript Syntax Extension)</strong>를 간단하게 말하면 <strong>&quot;자바스크립트 내부에서 HTML을 사용한 것&quot;</strong>이라고 말할 수 있고, 정확히 말하자면 <strong>자바스크립트 확장 문법</strong>이다.
</br>위 예시들에서 자바스크립트 내부에 <strong>HTML 구조의 코드가 작성된 것</strong>을 확인할 수 있다. 이렇게 작성된 코드들은 <strong>바벨(Babel)</strong>이라는 자바스크립트 컴파일러를 통해 <strong>일반 자바스크립트 형태의 코드</strong>로 변환된다. 이렇게 JSX로 작성하면, <strong>DOM과 <code>Event</code></strong> 를 활용하는 것보다 좀 더 <strong>직관적으로 확인할 수 있기에,</strong> 개발 과정에서 효율을 증가시킨다.
</br>JSX의 문법적 특징으로 <strong>자바스크립트 표현을 <code>{}</code> 안에 작성하는 것</strong>과, <strong>Self Closing tag</strong> 그리고 작성할 때, 하나의 컴포넌트는 <strong>모든 요소들을 감싸는 하나의 최상위 요소가 존재해야 한다는 점</strong> 등이 있다.
</br></p>
</blockquote>
<pre><code class="language-javascript">// 최상위 요소 있음
return (
  &lt;div&gt;
    &lt;h1&gt;Hello, World!&lt;/h1&gt;
    &lt;div&gt;Welcome to JSX!&lt;/div&gt;
  &lt;/div&gt;
)
// 최상위 요소 없음 : 오류 발생
return (
  &lt;h1&gt;Hello, World!&lt;/h1&gt;
  &lt;div&gt;Welcome to JSX!&lt;/div&gt;
)</code></pre>
<p></br>최상위 요소가 존재하지 않는 경우, 다른 태그로 래핑하는 것이 꺼려지는 경우 <strong>Fragments</strong>를 활용하여 <strong>형식상의 래핑</strong>을 진행할 수 있다. 그렇게 되면 <strong>실제로 렌더링 되고 난 뒤에는 감싸는 태그는 존재하지 않는 결과</strong>를 보여준다.</p>
<pre><code class="language-javascript">// 최상위 요소 Fragments
return (
  &lt;&gt;
    &lt;h1&gt;Hello, World!&lt;/h1&gt;
    &lt;div&gt;Welcome to JSX!&lt;/div&gt;
  &lt;/&gt;
)</code></pre>
</br>

<h2 id="리액트-라우터react-router-🗺️">리액트 라우터(<code>react-router</code>) 🗺️</h2>
<p><img src="https://images.velog.io/images/p-acid/post/85c5f62b-7fa2-410b-921a-e65c1ee6e849/portal_meme.gif" alt=""></p>
<p>앞에서 SPA 방식에 대해 언급하면서, 관련 개념으로 등장했던 <strong>라우터</strong>에 대해 알아보자. SPA는 말 그대로 <strong>하나의 페이지 만으로 구성된 어플리케이션</strong>을 의미하는데, 이것이 곧 한 종류의 화면 만이 존재하는 것은 아니다. 당연히도, <strong>SPA</strong> 또한 직접 브라우저의 API를 사용하고 상태를 설정해서 <strong>다른 뷰를 보여줄 수 있다.</strong>
</br>이렇게 다른 주소에 따라 다른 뷰를 보여주는 것을 <strong>라우팅(Routing)</strong>이라고 하고, 공식은 아니지만 <strong>리액트의 경우</strong>엔 이제 알아볼 <strong>리액트 라우터(<code>react-router</code>)</strong>라는 써드 파티 라이브러리를 주로 사용한다.
</br></p>
<h3 id="리액트-라우터-사용법">리액트 라우터 사용법</h3>
<p></br>우선 <strong>CRA 프로젝트를 생성했다는 전제 하에</strong> 이후의 과정을 알아보자. 리액트 라우터를 사용하기 위해서는 별도의 설치 과정을 필요로 한다. 
</br></p>
<pre><code class="language-terminal">npm install react-router-dom --save</code></pre>
<p></br>CRA 프로젝트를 설치하고, 해당 디렉토리로 이동하여, 터미널로 해당 명령어를 실행하여 리액트 라우터를 설치한다. 설치가 끝났다면, 이제 컴포넌트를 구현할 차례다.
</br></p>
<pre><code class="language-javascript">import React from &#39;react&#39;;
import {
  BrowserRouter as Router,
  Switch,
  Route,
} from &#39;react-router-dom&#39;;

import Login from &#39;./pages/Login/Login&#39;;
import Main from &#39;./pages/Main/Main&#39;;

class Routes extends React.Component {
  render() {
    return (
      &lt;Router&gt;
        &lt;Switch&gt;
          &lt;Route exact path=&quot;/&quot; component={Login} /&gt;
          &lt;Route exact path=&quot;/main&quot; component={Main} /&gt;
        &lt;/Switch&gt;
      &lt;/Router&gt;
    )
  }
}

export default Routes;</code></pre>
<p></br>위 예시는 라우터 컴포넌트를 구현한 예시이다. 우선 최상단에서 <strong>리액트 모듈</strong>을 불러오고, 라우터에서 <strong><code>BrowserRouter</code> , <code>Switch</code> , <code>Route</code> 를 불러온다.</strong> 위 세 가지는 아래의 컴포넌트 생성에 사용될 것이다.
</br>그리고 이어서 <strong>페이지에 해당하는 컴포넌트들을 각각의 위치에서 불러온다.</strong> 위 예시에선 <code>Login</code> 과 <code>Main</code> 이라는 컴포넌트를 불러왔다.
</br>그다음에 본격적으로 <strong>컴포넌트를 생성</strong>한다. 위 예시에선 컴포넌트 생성을 <strong>클래스 컴포넌트 방식</strong>을 사용하여 생성했다. 우선 <code>Router</code> 로 정의된 <code>BrowserRouter</code> 를 통해 <strong>전체 라우트들을 묶어준다.</strong> 그리고 그 안에 <code>Switch</code> 를 통해 이동할 <code>Route</code> 들을 묶어준다. 마지막으로 그 내부에 <code>Route</code> 를 작성하는 것으로 컴포넌트 생성을 마친다. 위 예시의 경우 <strong>초기 링크</strong>를 <strong><code>Login</code> 으로 설정</strong>한다.
</br>이렇게 <code>Routes</code> 컴포넌트를 생성하였으면, <code>index.js</code> 의 렌더링 부분을 변경해준다.
</br></p>
<pre><code class="language-javascript">ReactDOM.render(&lt;Routes /&gt;, document.getElementById(&#39;root&#39;));</code></pre>
<p></br>위 예시를 보면 <code>Routes</code> 컴포넌트를 렌더링하는 것으로 변경되어있다. 이렇게 설정하면, <code>Routes</code> 컴포넌트 내부에서 설정한 <code>default</code> 값의 링크로 초기 페이지가 설정되고, 이후 <strong><code>&lt;Link&gt;</code> 컴포넌트 혹은 <code>this.props.history.push()</code> 를 통해 페이지를 이동할 수 있다.</strong>
</br></p>
<h3 id="💡-link-컴포넌트와-thispropshistorypush">💡 <code>&lt;Link&gt;</code> 컴포넌트와 <code>this.props.history.push()</code></h3>
<blockquote>
<p>위 두 가지 방법은 리액트 라우터를 이용하여 링크를 이동할 수 있는 두 가지 방법이다. 왜 굳이 두 가지 방법이 존재하는지 <strong>사용법과 함께 차이점을 알아보자.</strong>
</br>우선 각각의 사용법은 다음과 같다.
</br></p>
</blockquote>
<pre><code class="language-javascript">// &lt;Link&gt;
// 불러오기
import { Link } from &#39;react-router-dom&#39;
&lt;Link to=&quot;/signup&quot;&gt;회원가입&lt;/Link&gt;</code></pre>
<pre><code class="language-javascript">// this.props.history.push()&#39;
// 불러오기
import { withRouter } from &#39;react-router-dom&#39;
// 함수 생성
goToMain = () =&gt; {
  this.props.history.push(&#39;/main&#39;);
}
// 이벤트에 추가
&lt;button className=&quot;loginBtn&quot; onClick={this.goToMain}&gt;</code></pre>
<p></br>위에서 볼 수 있는 가장 큰 차이점은 <strong>함수를 사용한다는 점</strong>일 것이다. <code>Link</code> 의 경우 바로 컴포넌트를 추가하여 이를 <strong>조건 없이 바로 실행</strong>할 수 있지만, <code>this.props.history.push()</code>  의 경우 <strong>함수를 통해 작성하여</strong> 해당 과정에서 <strong>로직을 추가할 수 있다는 점</strong>이 있다. 그렇다, <strong>로직의 추가 가능 유무</strong>가 두 가지 방식의 큰 차이점이다.
</br>또한 <code>Link</code> 의 경우, 렌더링 이후 <code>&lt;a&gt;</code> 태그로 변하는데, 사용에 있어 그 차이점이 존재한다. <code>&lt;a&gt;</code> 태그를 포함한 세 가지의 사용 방법은 다음과 같이 정리할 수 있다.
</br></p>
<ul>
<li><code>Link</code> : 별도의 <strong>로직이 필요 없는 페이지 내 이동</strong> 
ex) 프로필 확인 등 </li>
<li><code>this.props.history.push()</code> : <strong>로직이 필요한 페이지 내 이동</strong> 
ex) 로그인 등</li>
<li><code>&lt;a&gt;</code> 태그 : <strong>외부 링크</strong>로의 이동</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Web : HTTP]]></title>
            <link>https://velog.io/@p-acid/TIL-Web-HTTP</link>
            <guid>https://velog.io/@p-acid/TIL-Web-HTTP</guid>
            <pubDate>Sun, 12 Sep 2021 12:35:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>HTTP 통신의 개괄적인 내용이며 <strong>Stateless, Request, Response, Status code</strong> 등에 등에 대한 내용을 포함하고 있습니다. 😊</p>
</blockquote>
<h1 id="http-📶">HTTP? 📶</h1>
<p><img src="https://images.velog.io/images/p-acid/post/f66393a9-ad04-458c-8586-b78cff93fee7/status_200_meme.gif" alt=""></p>
<p><strong>HTTP</strong>, 단어로 분리해서 들으면 이게 뭔가 싶지만 우리는 웹 서핑을 하다 <strong>주소창</strong>에서 심심치 않게 이것을 확인할 수 있다. 그렇지만 굳이 이것에 대해 알아보려 하는 생각은 하지 않았을 것이다. 그렇다면 HTTP는 무엇인가.
</br>앞서 개발자 도구의 네트워크 패널에 대해 공부하면서 <strong>HTTP Status</strong>에 대해 잠시 알아본 바가 있다. 이는 <strong>리소스의 요청과 응답</strong>에 있어 그 <strong>상태를 나타내는 것</strong>이라고 간단히 이해했었다. 그러한 맥락에서 HTTP의 정의부터 알아보자. 
</br><strong>HTTP는 <code>HyperText Transfer Protocol</code></strong>의 약자로 클라이언트와 서버 사이에서 이루어지는 <strong>요청(Request) 및 응답(Response)</strong>의 과정을 정리한 <strong>규약(Protocol)</strong>이다. 사람들도 내가 원하는 정보를 얻기 위해서 소통하고자 할 때 이를 묻는 양식이 정해져있다. <strong>&quot;어떠한 정보가 필요한지, 물어보는 방식은 무엇인지&quot;</strong> 등과 <strong>&quot;그 요청에 대해 답변할 수 있는지, 안된다면 이유는 무엇인지&quot;</strong> 등에 대해 커뮤니케이션 한다. 컴퓨터 또한 이러한 커뮤니케이션을 위한 규약이 필요한 것이다.</p>
<blockquote>
<p>그렇다면 데이터를 요청하여 받고 이를 활용하여 화면에 나타내기 위해선 <strong>HTTP를 알아야겠네요?</strong> 🤔</p>
</blockquote>
<p>그래서 이제 <strong>HTTP</strong>는 <strong>어떤 특징을 갖는지, 요청과 응답은 어떠한 형식으로 이루어지는지</strong> 등에 대한 내용을 알아볼 것이다.
</br></p>
<h1 id="http의-특징-📤">HTTP의 특징 📤</h1>
<p></br>HTTP는 위에서 언급했던 내용을 포함하여 다양한 특징을 가진다. 우선 <strong>대부분의 파일 형식들을 HTTP 통신을 이용해 전송 가능하다.</strong> 대표적으로 <strong>JSON, TEXT, IMAGE</strong> 파일들을 전송하는데 사용할 수 있다.
</br>이러한 데이터의 이동은 위에서 언급한 바와 같이 <strong>요청</strong>과 그에 따른 <strong>응답</strong>으로 이루어지고, 응답과 요청은 <strong>무상태</strong>와 <strong>비연결성</strong>이라는 특징을 갖는다.
</br></p>
<h2 id="request--response-🔛"><code>Request</code> &amp; <code>Response</code> 🔛</h2>
<p><img src="https://images.velog.io/images/p-acid/post/cb2fd4c9-bcc7-40e3-b847-3bea90811e25/mudo_http.gif" alt=""></p>
<p>HTTP 통신은 <strong>클라이언트 측에서 요청</strong>을 보내면 이에 따라 <strong>서버 측에서 결과에 따라 응답</strong>을 보내는 형식을 갖는다. 당연히도 이에 대한 <strong>형식이 존재</strong>하고 이러한 형식에 맞추지 않고 맘대로 요청을 진행할 경우 문제가 발생할 것이다.
(<del>위 짤처럼 밑도 끝도 없이 달라고 하면 못 알아먹는다...😅</del>)
</br>그렇기 때문에 우리는 <strong>각각의 형식</strong>에 대해 이해할 필요가 있는 것이다.
</br></p>
<h3 id="request"><code>Request</code></h3>
<p></br><strong>요청(Request)</strong>은 크게 <strong><code>StartLine</code> , <code>Headers</code> , <code>Body</code></strong> 인 <strong>세 가지</strong>로 구분된다. 각각의 영역에는 다음과 같은 정보가 들어간다.
</br></p>
<ul>
<li><code>StartLine</code> : 요청의 <strong>첫 번째 줄</strong>. 요청의 개괄적인 부분에 해당한다.
= <code>HTTP method / Request Target / HTTP version</code></li>
<li><code>Headers</code> : 요청의 <strong>메타데이터</strong>가 담기며 <strong>객체 형태</strong>를 갖는다.
= <code>Headers { Host : ~, User-Agent : ~ ...  }</code></li>
<li><code>Body</code> : 요청의 <strong>상세 내용</strong>에 해당한다. 역시 <strong>객체 형태</strong>를 갖는다. <code>Headers</code> 와 유사한 구조를 갖는다. <strong><code>Body</code> 가 존재하지 않는 메서드</strong>도 있다.(<code>ex) Get</code>)
= <code>Body { Host : ~, User-Agent : ~ ... }</code></li>
</ul>
</br>

<h3 id="response"><code>Response</code></h3>
<p></br><strong>응답(Response)</strong> 또한 요청과 같이 <strong><code>StartLine</code> , <code>Headers</code> , <code>Body</code></strong> 인 <strong>세 가지</strong>로 구분되고, 내용 또한 대체로 유사하다.
</br></p>
<ul>
<li><code>StartLine</code> : 응답의 <strong>첫 번째 줄</strong>. 응답 상태에 대한 간략한 내용을 포함한다.
= <code>HTTP version / Status Code / Status Text</code></li>
<li><code>Headers</code> : 응답의 <strong>메타데이터</strong>가 담기며 <strong>객체 형태</strong>를 갖는다.
= <code>Headers { Connection : ~, Content-Length : ~ ...  }</code></li>
<li><code>Body</code> : 응답의 <strong>상세 내용</strong>에 해당하며, 역시 <strong>객체 형태</strong>를 갖는다. 요청과 마찬가지로 <strong>생략될 수도 있다.</strong></li>
</ul>
<p></br>위와 같은 구조를 갖는 요청과 응답은 다음의 예시와 같이 진행된다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/3d7809e5-c1c4-49a0-8f69-0db25ec8c7e1/image.png" alt=""></p>
<h3 id="💡-http-method">💡 HTTP Method</h3>
<blockquote>
<p>HTTP 통신에서 <strong>어떠한 목적을 갖고 있는 지</strong>에 따라 다른 <strong>HTTP Method</strong>가 사용된다. 다양한 Method가 있지만, 가장 많이 사용하는 <strong><code>GET</code></strong> 과 <strong><code>POST</code></strong> 를 비교하면서 알아보자.
</br>우선 <strong><code>GET</code></strong>의 경우 데이터를 <strong>읽거나 검색할 때</strong> 사용하는 메서드로 성공적으로 이루어졌을 때, HTTP Code <strong><code>200 OK</code></strong>를 반환한다. 또한 <code>GET</code> 요청은 <strong>idempotent(멱등성)</strong> 한데 이는 같은 요청을 하더라도 <strong>매번 같은 값을 반환한다</strong>는 의미를 가진다. 그러므로 <code>GET</code> 을 데이터를 변경하는 등의 안전하지 않은 연산에 사용하는 것을 지양한다.
</br>반면에 <strong><code>POST</code></strong> 의 경우, 새로운 <strong>리소스의 생성</strong>에 사용된다. 더 구체적으로 부모 요소의 <strong>하위 리소스 생성</strong>에 사용된다는 말이다. 그렇기에 <code>POST</code> 는 성공적으로 완수하면 <strong><code>201 Created</code></strong> 를 반환한다. 그리고 <code>POST</code> 메서드는 <code>GET</code> 과 반대로 <strong>idempotent 하지 않기에</strong> 같은 <code>POST</code> 요청을 반복해도 <strong>같은 결과를 확신할 수 없다.</strong> 그러므로 같은 <code>POST</code> 요청을 보내면 다른 리소스를 반환할 가능성이 높다.
</br>보다 더 구체적인 내용은 <a href="https://tools.ietf.org/html/rfc7231#section-4">Request methods에 대한 명세</a>와 <a href="https://www.w3schools.com/tags/ref_httpmethods.asp">w3schools.com의 GET method vs POST method</a>를 참조하자.</p>
</blockquote>
</br>

<h2 id="connectionless"><code>Connectionless</code></h2>
<p></br>요청과 응답에 있어 클라이언트와 서버는 연결을 시작한 이후 과정이 끝나면 동시에 <strong>연결을 끊어버린다는 특징을 갖는다.</strong> 그렇다면 왜 연결을 굳이 끊어야만 하는 것일까?
</br>서버는 <strong>불특정 다수의 클라이언트</strong>와 통신을 해야하는 환경을 갖는데 만약 이 연결을 계속 유지한다면, 이와 함께 발생하는 <strong>리소스가 불가피하게 늘어날 것</strong>이고 <strong>연결의 수 또한 감소</strong>할 것이다. 그러한 이유 때문에 HTTP 통신은 비연결성을 갖는다.
</br>이렇게 들으면 비연결성이 단점이 없는 것 같지만, <strong>반복적으로 연결 및 해제의 과정을 거쳐야 하기에, 오버헤드가 발생할 수 있다는 단점 또한 갖고 있다.</strong>
</br></p>
<h2 id="stateless"><code>Stateless</code></h2>
<p><img src="https://images.velog.io/images/p-acid/post/19762f30-269d-4308-ac6b-4f836637c497/dobby_request_meme.gif" alt=""></p>
<p>위에서 언급한 비연결성으로 인해 각각의 요청은 구분되어 서버에게 <strong>독립적인 대상</strong>으로 취급 받는다. 이 말이 무슨 말이냐면, 바로 이전에 보낸 요청임에도 불구하고 이전의 요청과 <strong>연관성을 갖지 못하며</strong>, 서로 간 <strong>영향을 주지 않는다</strong>는 것이다.
</br>예를 들어, 다음과 같은 상황이 존재한다.
</br></p>
<pre><code>// Request/Response 1
Client -- &#39;나는 유저 &quot;a&quot; 야 로그인 할 수 있니?&#39; --&gt; Server
Server -- &#39;알겠어, 확인하고 시켜줄게&#39; --&gt; Client

// Request/Response 2
Client -- &#39;전에 왔던, 유저 &quot;a&quot; 야 로그인 시켜줘&#39; --&gt; Server
Server -- &#39;너가 누군데, 난 &quot;a&quot; 몰라&#39; --&gt; Client</code></pre><p></br>앞의 요청에서 유저 <code>a</code> 라는 데이터를 확인하여 로그인을 요청하였고, 이에 따라 로그인이 되었지만 다시 로그인을 진행할 때, 전에 있던 <strong>유저 <code>a</code> 가 방문했던 기록</strong>을 다시 참조하는 것이 불가능하다고 했다.
</br>이처럼 요청 간에는 <strong>독립성</strong>이 존재하기 때문에, 매 연결마다 새로운 데이터를 가져와야 하는 단점이 존재할 것이다.
</br>이러한 상황에서 <strong>중복 요청을 방지하고자</strong>, <strong>토큰을 포함하여</strong> 응답과 함께 보내 <strong>클라이언트에 저장</strong>하고 다음에 같은 요청을 진행하고자 할 때, <strong>토큰을 함께 포함하여 요청을 시도</strong>하면 이를 더 신속하게 처리할 수 있도록 한다. 이러한 토큰은 클라이언트에 <strong>쿠키나 스토리지</strong> 등의 형태로 저장된다.</p>
</br>

<h1 id="http-status-code-❗">HTTP Status Code ❗</h1>
<p><img src="https://images.velog.io/images/p-acid/post/1bf4bb9c-fe90-4efa-93e3-a46ba2d4d915/image.png" alt=""></p>
<p>위에서 요청과 응답을 알아보았는데, 적절한 요청을 보냈을 때 응답에 포함되어 오는 정보 중, <strong>HTTP 통신의 상태</strong>를 나타내는 코드가 있다.
</br>이러한 상태 코드의 유형은 아주 다양하지만, 그 중 간략하게 구분지어 몇 가지만 알아보도록 하자.
</br></p>
<h2 id="요청-성공">요청 성공</h2>
<p></br>아래의 상태 코드들은 요청에 의해 <strong>연결이 성공적으로 진행</strong>되거나, 요청한 <strong>데이터가 성공적으로 전송된 경우</strong> 등을 의미한다.
</br></p>
<ul>
<li><strong><code>200 OK</code></strong> : 성공적으로 응답</li>
<li><strong><code>201 Created</code></strong> : 성공적으로 리소스 생성</li>
</ul>
</br>

<h2 id="클라이언트-에러">클라이언트 에러</h2>
<p></br>오류가 발생한 부분이 <strong>요청 부분</strong>에서 잘못된 것으로, 주로 <strong>프론트엔드 단에서 오류가 발생했을 때</strong> 보이는 응답 코드다.
</br></p>
<ul>
<li><strong><code>400 Bad Request</code></strong> : 유효하지 않는 요청</li>
<li><strong><code>401 Unauthorized</code></strong> : 리소스 요청에 대한 인증자격 부족</li>
<li><strong><code>403 Forbidden</code></strong> : 요청을 이해했지만 승인을 거부</li>
<li><strong><code>404 Not Found</code></strong> : 서버가 요청한 리소스를 찾을 수 없음</li>
</ul>
</br>

<h2 id="서버-에러">서버 에러</h2>
<p></br>오류가 <strong>서버 측</strong>에서 발생했을 경우 나타나는 응답 코드로, 주로 <strong>백엔드 단에서 문제가 발생</strong>하면 나타나는 응답 코드다. 
</br></p>
<ul>
<li><strong><code>500 Internal Server Error</code></strong> : 내부 서버 오류로 요청을 이행하지 못함</li>
<li><strong><code>501 Not Implemented</code></strong> : 요청 수행에 필요한 기능을 서버가 지원하지 않음</li>
</ul>
</br>

<h1 id="마무리-🧾">마무리 🧾</h1>
<p></br>오늘도 어김없이 마무리 정리 시간이 돌아왔다. HTTP에 대한 전반적인 내용을 정리하면서 마무리하자.
</br></p>
<ul>
<li><strong>HTTP</strong>란 클라이언트와 서버 사이의 <strong>요청</strong>과 <strong>응답</strong>을 규정한 규약이다.</li>
<li>HTTP는 <strong>요청(Request)</strong>과 <strong>응답(Response)</strong>으로 이루어지며 요청과 응답은 <strong><code>StartLine</code> , <code>Headers</code> , <code>Body</code></strong> 구분되는 형식을 갖는다.</li>
<li>HTTP는 <strong>비연결성(<code>Connectionless</code>)과 무상태(<code>Stateless</code>)</strong>의 특징을 갖기 때문에 각종 <strong>스토리지와 쿠키</strong>를 활용한다.</li>
<li>HTTP 통신 상태를 표현하는 <strong>응답 코드(HTTP Status Code)</strong>가 존재하며 각 코드마다 <strong>성공하거나 실패의 내용을 포함한다.</strong></li>
</ul>
</br>

<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<p><a href="https://ko.wikipedia.org/wiki/HTTP">HTTP : wikipedia : HTTP</a>
<a href="https://kotlinworld.com/97">HTTP 특징 : kotlinworld : HTTP(HyperText Transfer Protocol)의 특징</a>
<a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Status">HTTP Status Code : MDN Web Docs : HTTP 상태 코드</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] CS : Database]]></title>
            <link>https://velog.io/@p-acid/TIL-CS-Database</link>
            <guid>https://velog.io/@p-acid/TIL-CS-Database</guid>
            <pubDate>Sat, 11 Sep 2021 14:34:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>Database</strong>에 대한 <strong>개괄적인 내용</strong>으로 <strong>DB, DBMS, RDBMS, ACID 등에</strong> 대한 내용을 포함합니다. 😊</p>
</blockquote>
<h1 id="데이터베이스란-무엇인가-💾">데이터베이스란 무엇인가 💾</h1>
<p><img src="https://images.velog.io/images/p-acid/post/ead96bd8-e584-4cd4-b4d3-628a66b1639a/thatsinteresting.gif" alt=""></p>
<p><strong>데이터(Data)</strong>는 무엇인가. CS에서 데이터란 <strong>컴퓨터가 처리할 수 있는 문자, 소리, 그림 등의 형태로 된 자료</strong>를 의미한다. 컴퓨터 안 기록이라는 의미다. 그러한 데이터가 일반적으로 <strong>정리된 데이터의 집합</strong>을 <strong>데이터베이스(Database)</strong>라고 정의한다.
</br>그렇다면 데이터베이스가 웹에서 어떠한 과정으로 <strong>요청</strong>되고 <strong>전달</strong>되는지 알아보자.</p>
<p><img src="https://images.velog.io/images/p-acid/post/e1652769-2183-4315-8173-951cb6356d15/image.png" alt=""></p>
<p>크게 <strong>클라이언트</strong>와 <strong>서버</strong>, <strong>데이터베이스</strong>로 구분지었을 때, 클라이언트에서 서버에 필요한 <strong>데이터를 요청</strong>한다. 그렇다면 서버는 요청한 <strong>정보를 가공</strong>하고 <strong>전달</strong>해야하기 때문에, 데이터베이스로 부터 <strong>정보를 요청</strong>하고 그에 따른 <strong>응답을 받는 과정</strong>이 진행된다. 이 과정에서 <strong>DBMS(Database Management System)</strong>가 개입하여 그 역할을 수행한다.
</br><strong>DBMS</strong>는 말 그대로 <strong>데이터베이스를 관리하는 시스템</strong>으로 서버에서 데이터베이스에 요청할 때 이를 <strong>제어하고 관리하는 역할</strong>을 수행하는 시스템이다. 한 마디로, 저장된 데이터를 가져오는 <strong>실질적 주체</strong>인 것이다.</p>
<blockquote>
<p>그렇다면 기록을 저장하기 위해 DB/DBSM을 사용하는 이유는 무엇일까? 🧐</p>
</blockquote>
<p><strong>DB</strong>의 경우 <strong>데이터 보존</strong>과 <strong>체계적 관리</strong>의 측면이 있다. 
</br>우선 <strong>데이터 보존</strong>의 경우 장기간 보관해야하는 목적의 데이터의 경우 휘발성 데이터 저장 방식은 비효율적인 결과를 불러온다. 그렇기에 <strong>장기간 데이터 보관</strong>을 하려면 이러한 데이터베이스 형태로 보관함이 용이하다는 장점이 있다.
</br><strong>체계적 관리</strong>의 경우 논리적으로 연관성 있는 데이터를 분산된 상태가 아닌 <strong>정리가 된 상태로 제어하고 관리</strong>하기 때문에, 데이터 요청에 의해 이를 가져올 때도 <strong>효율적으로 관리할 수 있다</strong>는 장점이 있다.
</br><strong>DBMS</strong>는 <strong>생산성, 기능성, 신뢰성</strong> 등을 사용의 근거로 말할 수 있다. 
</br><strong>생산성</strong> 부분에서 설명하자면 데이터 요청의 목적은 크게 네 가지로 구분되는데 이것을 <strong>CRUD(Create, Read, Update, Delete)</strong>라고 한다. 이러한 데이터의 관리 및 연산 기능을 DBMS가 제공하기 때문에 유용하다고 할 수 있다.
</br><strong>기능성</strong> 측면에서는 단순히 하나의 데이터베이스 만을 일방향으로 활용하는 것만이 아니라 <strong>다양한 방식으로 원활환 관리를 진행할 수 있다(복수의 유저 요청 대응 가능 등)</strong>는 점이 그 이유가 된다.
</br>마지막으로, <strong>신뢰성</strong> 부분에서 한 곳에 집중되는 데이터를 분리하여 관리할 수 있어, <strong>부하가 분산</strong>되고 데이터를 <strong>주기적으로 백업</strong>하여 결과적으로 안전한 데이터 관리가 가능하다는 점이 있다.
</br></p>
<h2 id="근데-데이터베이스-꼭-알아야-해요-😟">근데 데이터베이스 꼭 알아야 해요? 😟</h2>
<p><img src="https://images.velog.io/images/p-acid/post/8c0f53e4-5ae6-4489-8071-359e132cb0b4/pengsu_me_meme.gif" alt=""></p>
<p>프론트엔드가 굳이 데이터베이스에 대해 알아야 하냐고 생각이 들 수 있지만, 그렇게 생각하면 큰 오산이다. 어쨌든 프론트엔드 단에서 하는 업무는 결과적으로 <strong>백엔드에서 넘어온 데이터를 활용하여 완성할 수 있는 부분</strong>이고 그러기 위해선 넘어오는 데이터가 <strong>어떤 형식</strong>인지, <strong>어떠한 방식으로 넘어오는지</strong> 등에 대한 내용은 이해를 돕기 위해 충분히 필요한 내용이다.
</br>또한 개발은 혼자나 한쪽의 영역에서만 진행하는 것이 아니라, 서로 다른 부분들이 <strong>토론과 합의</strong>에 의해 이루어지는 것이기 때문에, 이에 대한 부분을 무시하고 <strong>&quot;아 나는 그거 달라고 했는데, 왜 말을 못 알아먹지?&quot;</strong> 라는 마인드를 접어두기 위해선 자료 구조나 데이터베이스에 대한 이해는 필수 불가결한 부분일 것이다.
</br>그러니 앞으로 진행될 프로젝트의 과정에서 서로의 잘잘못 따지다가 뼈만 남은 웹 페이지를 남기기 싫다면 데이터베이스에 대해 간단히라도 머릿 속에 새기고 가자.</p>
<p>(<del>그리고 이거 배우면 나름 재밌기도 한데...😅</del>)
</br></p>
<h1 id="rdbmsrelational-database-management-system-🖇️">RDBMS(<code>Relational DataBase Management System</code>) 🖇️</h1>
<p><img src="https://images.velog.io/images/p-acid/post/8bf9a3a6-18ff-42cc-84a0-e40cb5ec19eb/infinite_ddoong.gif" alt=""></p>
<p>DBMS는 배워서 알겠는데, <strong>RDBMS</strong>는 무엇일까? RDBMS를 해석하면 <strong>관계형 데이터베이스 관리 시스템</strong>이라는 의미를 갖는다. 그렇다면 관계형 데이터베이스에 대해 우선적으로 알아보자.
</br><strong>관계형 데이터베이스(RDB)</strong>란 관계형 데이터 모델에 기초를 둔 데이터베이스이다. 이 말이 무슨 말이냐면, <strong>데이터를 관리하는 방식에 있어 데이터 간의 관계를 중심</strong>으로 이를 진행한다는 뜻이다. 다음 그림를 보면 이를 더 쉽게 이해할 수 있다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/8f48d10c-aafe-4d23-8c53-87b8ce001155/RDBMS.png" alt=""></p>
<p>위 그림은 관계형 데이터베이스가 어떠한 구조를 갖고 있는지 보여준다. 같은 분류로 묶이 여러가지 데이터베이스가 <strong>서로 간의 관계에 따라 연결되어 있다.</strong>
</br>RDBMS에서 데이터베이스는 <strong>행(Row)과 열(Column)</strong>로 구성되어 있는 엑셀의 형식과 유사한 형태를 가진다. 이러한 표 형식의 <strong>2차원 데이터</strong>가 <strong>테이블(Table)</strong>에 해당하고 이러한 테이블들이 위와 같이 관계를 이루고 있는 것이 관계형 데이터베이스인 것이다. 그리고 이러한 관계형 데이터베이스를 관리하는 것이 <strong>RDBMS</strong>다. 대표적인 RDBMS로 <strong>Oracle, MySQL, PostgreSQL</strong> 등이 이에 해당한다.</p>
<h3 id="💡-nosqlnot-only-sql">💡 NoSQL(<code>Not Only SQL</code>)</h3>
<blockquote>
<p>엑셀이 장기간 동안 사무실을 지배했지만, 더이상 RDBMS로는 처리할 수 없을 만큼 <strong>복잡하고 방대한 데이터들</strong>이 생겨나기 시작했다.
</br>그러한 연유로 <strong>NoSQL</strong>에 대한 중요성이 강조되었다. <strong>NoSQL</strong>이란 <strong>&quot;Not Only SQL&quot;</strong>의 약자로 관계형 데이터베이스와는 다르게 데이터나 <strong>테이블 간의 관계를 정의하지 않는다.</strong> 그렇기 때문에, <strong>자유롭게 데이터를 저장할 수 있다</strong>는 장점이 있다.
</br>그리고 <code>key</code> , <code>Value</code> 값으로만 나타내며 굳이 <strong>스키마 규격에 맞춰서 데이터를 다루지 않아도 된다는 장점</strong> 때문에 대용량 데이터의 관리에 유리하다.
</br>하지만 RDBMS가 좀 더 정형화 된 데이터라는 점에서 아직까지 확실한 장점이 있기에, 각각의 필요 분야에서 적절히 사용 됨을 인지하자.</p>
</blockquote>
</br>

<h3 id="💡-primary-key">💡 <code>Primary key</code></h3>
<blockquote>
<p>2차원 배열은 행과 열을 가지는데 주로 각 행의 첫 번째 요소는 <strong>해당 열의 인덱스</strong>가 배정되어 있는 것을 확인할 수 있다. 이를 <strong>Primary key</strong> 라고 하며 관계형 데이터베이스에서 <strong>데이터의 식별자</strong>로 이용하는 용도로 주로 쓰인다. </p>
</blockquote>
</br>

<h2 id="테이블-간의-관계-🔗">테이블 간의 관계 🔗</h2>
<p><img src="https://images.velog.io/images/p-acid/post/b5923558-5a83-44d9-a1ff-7f9f9e337a47/gifntext-gif%20(1).gif" alt=""></p>
<p>앞에서 말했듯이 관계형 데이터베이스는 각 테이블이 <strong>상호 연관성</strong>을 가지며, 이는 <strong>완전한 독립이 존재하지 못한다</strong>는 것이다. 그리고 그러한 관계는 테이블 간의 관계가 어떻게 되어 있는가에 따라서도 구분이 되는데, 이는 크게 <strong>1:1(One to One), 1:M(One to Many), M:M(Many to Many)</strong>로 구분된다.
</br>우선 <strong>1:1</strong>은 각각의 테이블에 있는 데이터가 <strong>하나당 하나의 데이터만 연결</strong>되어 있는 것이다. 이에 대한 예시로 사람과 주민등록번호라는 각각의 테이블이 존재할 때가 있다.
</br>각각의 사람의 이름이 적혀있는 테이블과 그 사람들의 주민등록번호가 저장되어 있는 테이블이 존재할 때, 각각의 사람들은 하나의 주민등록번호 만을 가질테고, 반대로도 각각의 주민등록번호는 한 사람의 주민등록번호 밖애 될 수 없다. 이렇게 <strong>각각의 데이터의 관계가 1:1로 이루어진 관계를 1:1 관계라고 한다.</strong> 
</br>다음으로 <strong>1:M</strong>은 <strong>하나의 데이터가 다른 테이블에 여러 데이터와 관련되어 있는 형태</strong>의 관계이다. 이에 대한 예시로 사람과 그 사람들의 가족의 이름들이 포함된 테이블의 관계를 예시로 들 수 있다.
</br>역시나 하나의 테이블에는 사람들의 이름이 저장되어 있고, 다른 테이블에는 그 사람의 가족의 이름들이 포함된 명단이 있다. 한 사람은 여러 명의 가족의 이름과 대응이 될 수 있지만, 해당 가족들은 한 사람과 연관되어 있는 형태의 관계를 확인할 수 있다. 이러한 관계를 <strong>1:M</strong> 관계라고 정의할 수 있다.
</br>마지막으로 <strong>M:M</strong> 관계는 다수의 데이터와 다수의 데이터가 <strong>복수 대 복수로 연결될 수 있는 관계</strong>를 말한다. M:M 관계는 한 사람과 그 사람이 입은 옷들을 저장한 테이블 간의 관계로 설명할 수 있다.
</br>이 경우 한 사람당 머리부터 발끝까지 다양한 옷을 입었을테고, 그 옷들은 각각의 브랜드가 있을 것이다. 하지만, 다른 사람이라도 같은 옷을 입었을 경우가 존재하고 이렇게 되면 한 사람이 여러가지 옷을 입고 있지만, 하나의 옷이라도 여러 사람들이 공통적으로 입고 있을 수 있는 것이다. 이러한 관계를 <strong>M:M 관계</strong>라고 정의한다.</p>
<h2 id="트랜잭션transaction-🧰">트랜잭션(<code>Transaction</code>) 🧰</h2>
<p></br><strong>트랜잭션(Transaction)</strong>이란 괸계형 데이터베이스가 제공하는 기능 중 하나로, 데이터베이스 상태를 변환시키는 <strong>하나의 논리적 기능을 수행하기 위한 작업의 단위</strong> 또는 한꺼번에 모두 수행되어야 하는 <strong>일련의 연산</strong>들을 의미한다.
</br>트랜잭션은 <strong>ACID</strong>를 보장하면서 앞에서 언급한 일련의 작업이 하나의 작업처럼 취급되는 것이라, <strong>모두 성공(Commit)</strong> 아니면 <strong>모두 실패(Rollback)</strong>만이 있는 것을 의미한다.
</br>그렇다면 이 ACID에 대해 간단히 알아보자.
</br></p>
<h3 id="원자성atomicity">원자성(<code>Atomicity</code>)</h3>
<p></br><strong>원자성</strong>이란 트랜잭션의 연산은 데이터베이스에 <strong>전부 반영되든지, 아니면 전혀 반영이 되지 않든지</strong> 해야 한다는 것이다.
</br> 트랜잭션 내 모든 명령은 반드시 수행되어야 하며 <strong>하나의 명령이라도 오류가 발생한다면</strong> 트랜잭션 <strong>전부가 취소</strong> 되고 원래대로 되돌아간다.</p>
<h3 id="일관성consistency">일관성(<code>Consistency</code>)</h3>
<p></br><strong>일관성</strong>이란 트랜잭션의 실행이 완료되었을 때, <strong>데이터베이스의 상태가 일관성이 있어야 함</strong>을 의미한다. 시스템의 고정 요소는 트랜잭션 전후와 관계 없이 상태가 같아야 한다.</p>
<h3 id="독립성isolation">독립성(<code>Isolation</code>)</h3>
<p></br><strong>독립성</strong>은 하나의 둘 이상의 트랜잭션이 실행되는 동안에는 <strong>다른 트랜잭션이 개입하지 못함</strong>을 의미한다. 또한 수행 중인 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 <strong>해당 트랜잭션의 수행 결과를 참조할 수 없다.</strong></p>
<h3 id="지속성durability">지속성(<code>Durability</code>)</h3>
<p></br>마지막으로, <strong>지속성</strong>은 성공적으로 완료한 트랜잭션이 만든 결과는 시스템 고장이라도 <strong>저장이 되면 지속적으로 유지한다</strong>는 것이다.</p>
<h3 id="💡-트랜잭션의-연산commitrollback">💡 트랜잭션의 연산(<code>Commit/Rollback</code>)</h3>
<blockquote>
<p>위에서 언급한 트랜잭션의 <strong>연산</strong>에 대해 알아보자.
</br>우선 <strong>Commit 연산</strong>은 한 가지의 트랜잭션이 <strong>성공적으로 마무리를 하고 일관된 상태를 유지할 때</strong>, 연산이 완료됐음을 <strong>관리자에게 알려주는 것</strong>이다.
</br>그리고 <strong>Rollback 연산</strong>은 하나의 트랜잭션 처리가 비정상적인 종료가 되어 <strong>일관성이 깨졌을 때</strong>, 일부 정상 처리된 것이 있더라도 일관성을 위해, 해당 트랜잭션이 행한 <strong>모든 연산을 취소하는 것</strong>이며, Rollback의 경우 해당 트랜잭션을 <strong>재시작 혹은 폐기</strong>한다.</p>
</blockquote>
</br>

<h1 id="마무리-🧾">마무리 🧾</h1>
<p></br>위 내용들을 요약하면 다음과 같이 정리할 수 있다.
</br></p>
<ul>
<li><strong>DB(Database)</strong>는 <strong>데이터의 집합</strong>이고, <strong>DBMS(Database Management System)</strong>는 이를 <strong>중간에서 관리하는 소프트웨어다.</strong></li>
<li>DB는 <strong>데이터 보존과 체계적 관리</strong>의 측면에서, DBMS는 <strong>생산성, 기능성, 신뢰성</strong>의 측면에서 이점을 갖는다.</li>
<li><strong>RDB(Relational Database)</strong>는 데이터베이스 중 <strong>데이터 간 관계</strong>에 중심을 둔 데이터베이스고, <strong>RDBMS</strong>는 이를 관리하기 위한 시스템으로, <strong>Oracle, MySQL, PostgreSQL</strong> 등이 이에 해당한다.</li>
<li>테이블 간의 관계에 따라 <strong>1:1, 1:M, M:M</strong> 관계로 구분된다.</li>
<li><strong>트랜잭션(Transaction)</strong>이란 논리적 기능 수행을 위한 <strong>작업 단위</strong> 내지 <strong>일련의 과정</strong>을 의미한다.</li>
<li>트랜잭션은 <strong>ACID</strong>를 보장하며 일련의 작업이 <strong>전체의 성공(<code>commit</code>) 혹은 실패(<code>Rollback</code>)</strong>로만 이루어진다.</li>
</ul>
<p></br>그럼 다음 토픽인 <strong>HTTP</strong>에서 다시 돌아오겠다.
<img src="https://images.velog.io/images/p-acid/post/c1e83c55-789c-4881-b6fd-cf21372b8e36/thanks_to_jerry.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript : DOM]]></title>
            <link>https://velog.io/@p-acid/TIL-JavaScript-DOM</link>
            <guid>https://velog.io/@p-acid/TIL-JavaScript-DOM</guid>
            <pubDate>Fri, 10 Sep 2021 12:41:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 DOM에 대한 내용으로 관련 서적인 <a href="https://book.naver.com/bookdb/book_detail.nhn?bid=7360511">DOM을 깨우치다</a>를 포함하여 여러 자료들을 참고하여 작성하였습니다! 😊
<del>사실상 해당 서적 리뷰가 맞지 않나...</del></p>
</blockquote>
<h1 id="dom을-알아보자-📃">DOM을 알아보자! 📃</h1>
<p><img src="https://images.velog.io/images/p-acid/post/d37edab3-f430-489a-a136-53239aa42dd7/doms_meme.gif" alt=""></p>
<p><strong>DOM(Document Object Model)</strong>이란 무엇인가. 정말 어디에도 있는 DOM은 자바스크립트를 통해 HTML을 조작하기 위하여 알아야 할 개념 중 하나다. 단어 그대로 <strong>DOM</strong>은 <strong>문서 객체 모델</strong>로 XML이나 HTML 문서에 접근하기 위한 <strong>일종의 인터페이스</strong>다.</p>
<h3 id="💡-인터페이스에-대한-간단한-이해">💡 인터페이스에 대한 간단한 이해</h3>
<blockquote>
<p><strong>인터페이스(interface)</strong>란 서로 다른 두 개의 시스템, 장치 사이에서 <strong>정보나 신호를 주고 받는 경우의 접점이나 경계면</strong>으로 정의된다. 이렇게 말하면 어렵게 들리지만, <strong>둘 사이에서 상호작용 하는 곳</strong>이라고 해석하면 이해하기 편하다. 
</br>그렇다면 우리가 흔히 말하는 <strong>UI(User Interface)</strong>는 <strong>사용자와 컴퓨터 간의 상호작용 접접</strong>이라고 해석할 수 있다. 대표적인 UI 요소로서 <strong>버튼, 토글, 모달 등</strong>이 있는데 각각의 기능에 대해 생각해보면 인터페이스에 대한 이해가 더 수월할 것이다.</p>
</blockquote>
<p>그렇다면 왜 HTML은 DOM으로 변환되어야 하는 것일까? 사실 자바스크립트 입장에서 HTML은 <strong>유의미한 데이터 형식이 아니다.</strong> 단지 <strong>텍스트 형식</strong>의 데이터인 것이다. 이를 자유롭게 다루기 위해서는 각 태그 요소가 <strong>어떠한 상관관계를 갖고, 어떠한 속성을 갖는 지에 대한 내용을 정의</strong>하여 <strong>객체 형태로 저장</strong>할 필요가 있었던 것이다.</p>
<h3 id="💡-dom은-원래-xml-문서를-위한-api-였다">💡 DOM은 원래 XML 문서를 위한 API 였다?</h3>
<blockquote>
<p>간단하게 말하자면, HTML의 문법이 XML 문법에 비해 비교적 <strong>유연하기 때문이다.</strong> 
</br>HTML은 가끔 <strong>시작 또는 종료에 대한 태그를 생략하는 것</strong>이 가능한데, 이렇게 너그럽고 편한 HTML의 요소가 <strong>공식적인 문법을 작성하기 어렵게 만드는 문제</strong>가 있다. 그렇기에 본디 비교적 엄격한 XML을 위한 것이었지만, <strong>HTML에서도 사용 가능하도록 확장</strong>되었다고 한다.</p>
</blockquote>
<p></br>앞에서 작성했던 브라우저의 작동 방식에서 DOM에 대한 이야기를 많이 했는데, 정작 DOM에 대한 자세한 설명도 부족하고, 이에 대한 근본적인 이해가 부족한 것 같아서 해당 포스팅을 작성한다.
</br>이어지는 내용에서 DOM에 대한 이해를 위해서 <strong>노드(node)</strong>에 대해 알아볼 것이다.
</br></p>
<h1 id="노드node학개론-🌱">노드(<code>node</code>)학개론 🌱</h1>
<p><img src="https://images.velog.io/images/p-acid/post/a81cb6ee-f28d-4f38-b323-69f85c0f6a62/node_meme.gif" alt=""></p>
<p>위 여성분처럼 노드를 자유자재로 다루기 위해 <strong>노드</strong>에 대해 알아보자! 구글에 <strong>노드(node)의 정의</strong>에 대해 검색하면 컴퓨터 과학에서 쓰이는 <strong>기초적인 단위</strong>라고 한다. 노드에 대한 내용을 정리하면 다음과 같이 정리할 수 있다.
</br></p>
<ul>
<li><strong>DOM</strong>을 구성하는 각 요소는 <strong>노드</strong>다.</li>
<li>노드들로 구성된 <strong>트리 형태</strong>의 구조가 HTML에서 인덱싱을 통해 구분된 <strong>계층 구조</strong>와 <strong>캡슐화</strong>를 표현한다.</li>
<li>모든 요소가 노드에 해당하며, <strong>공백</strong>과 <strong>주석</strong>도 마찬가지다.</li>
</ul>
</br>

<h2 id="노드의-유형">노드의 유형</h2>
<p></br>이러한 노드 중 HTML 문서를 다룰 때 가장 <strong>일반적인 노드 유형</strong>은 다음과 같다.
</br></p>
<ul>
<li><strong><code>DOCUMENT_NODE</code> (예 : <code>window.document</code>)</strong></li>
<li><strong><code>ELEMENT_NODE</code> (예 : HTML의 태그들 <code>&lt;body&gt;</code>, <code>&lt;a&gt;</code> 등)</strong></li>
<li><code>ATTRIBUTE_NODE</code> (예 : <code>class=&#39;funEdges&#39;</code>)</li>
<li><code>TEXT_NODE</code> (예 : 줄바꿈과 공백을 포함한 HTML 내 텍스트 문자)</li>
<li><code>DOCUMENT_FRAGMENT_NODE</code> (예 : <code>document.createDocumentFragment()</code>)</li>
<li><code>DOCUMENT_TYPE_NODE</code> (예 : <code>&lt;!DOCTYPE html&gt;</code>)</li>
</ul>
<p></br>위 노드 유형들을 포함한 모든 노드들은 각각의 요소를 <strong>식별할 수 있는 코드 값</strong>을 가진다. 모든 노드 유형들과 각각에 해당하는 코드 값을 표현하면 다음과 같다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/a3ed252f-3a86-4f0c-96bf-08cf8496103b/image.png" alt="">
</br></p>
<h2 id="노드의-상속">노드의 상속</h2>
<p><img src="https://images.velog.io/images/p-acid/post/0a71304e-ff9e-41d5-8e02-edd5fac0c38a/image.png" alt=""></p>
<p>DOM 트리의 각 노드 객체는 <strong><code>Node</code></strong> 로 부터 <strong>속성과 메서드를 상속받는다.</strong> 위 그림은 상속 관계를 표현한 그림이다. 그림에는 나오지 않았지만, <code>Node</code> 또한 다른 객체들처럼 <strong><code>Object.prototype</code> 으로 부터 상속받는다.</strong>
</br>또한, 위 그림에서 확인할 수 있듯이 각 노드 객체는 <strong><code>Node</code> 를 포함한 해당 모든 상위 객체로부터 속성 및 메서드를 상속받는다.</strong> 
</br></p>
<h2 id="노드의-속성-및-메서드">노드의 속성 및 메서드</h2>
<p></br>노드 객체의 속성과 메서드에서 중요한 내용은 <strong>계층 구조가 존재</strong>하고 <strong>주로 관계를 다룬다</strong>는 점이다. 또한 위에서 언급한 바와 같이 <strong>상위 노드 객체의 속성과 메서드를 상속받는다.</strong> 다음의 예시로 이에 대해 간단히 알아보자.</p>
<p><img src="https://images.velog.io/images/p-acid/post/19628fab-b87e-46bc-b3a3-174c1c03642f/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/p-acid/post/8a4ae6a2-4fff-41bc-90ab-54c87477a54f/image.png" alt=""></p>
<p></br>우선 기준이 되는 요소를 <code>id</code> 값으로 <strong><code>document.getElementById</code></strong> 를 통해 <code>&lt;body&gt;</code> 태그를  불러와 변수 <code>start</code> 에 저장한다. 이어서 해당 변수를 활용하여 노드 객체의 속성 값을 반환해본다.
</br>그런데 <code>start</code> 의 첫 번째 자식 요소를 <code>firstChild</code> 를 통해 불러왔는데, 반환 값으로 <code>&lt;ul&gt;</code> 태그가 아닌 <strong><code>#text</code></strong> 가 반환되었다. 이유는 위에서 언급한 <strong>&quot;모든 요소가 노드에 해당하며, 공백과 주석도 마찬가지다&quot;</strong> 라는 부분에서 알 수 있다. 해당 HTML 문서에서 <code>start</code> 의 첫 번째 자식 요소는 <code>body</code> 와 <code>&lt;ul&gt;</code> 사이에 있는 <strong>공백</strong>이고, 그렇기에 <code>#text</code> 를 반환한 것이다. 만약, <code>&lt;ul&gt;</code> 태그를 지정하고 싶었다면 아래 두 가지 방식을 활용하면 되는 것이다.
</br>이렇게 <strong>노드 간의 관계를 활용</strong>하여 연관된 노드를 지정하여 활용할 수 있다. 자주 사용하는 속성과 메서드는 다음과 같다.</p>
<h4 id="속성">속성</h4>
<ul>
<li><code>childNodes</code></li>
<li><code>firstChild</code></li>
<li><code>lastChild</code></li>
<li><code>nextSibling</code></li>
<li><code>parentNode</code></li>
<li><code>previousSibling</code><h4 id="메서드">메서드</h4>
</li>
<li><code>appendChild()</code></li>
<li><code>removeChild()</code></li>
<li><code>hasChildNodes()</code></li>
</ul>
<p></br>다음의 예시를 보면 더 이해가 편하다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/d118458a-905f-476a-824b-1321a3d28c32/example_structure.png" alt=""></p>
<p>개발자 도구를 사용하여 각 요소의 관계를 통해 속성과 메서드를 활용해보겠다. </p>
<p><img src="https://images.velog.io/images/p-acid/post/d83a3f06-7e4a-4e02-bcdf-c74f1bda53c0/node_console.png" alt=""></p>
<p></br> 최상단 부터 차례로 해석해보자. 우선 <code>parent</code> 클래스를 갖는 요소 중 첫 번째 인덱스에 위치한 요소를 변수 <code>el</code> 로 지정한다. <code>el</code> 을 입력하니 올바르게 <code>div.parent</code> 가 나타난 것을 확인할 수 있다. 해당 노드가 기준점이 되어줄 것이다.
</br>이어서 <code>el</code> 의 자식 요소의 갯수를 <code>el.childElementCount</code> 를 통해 세 보니 <code>5</code> 라는 값이 출력되면서 알맞은 갯수를 출력해주었다. 이어서 <code>el.firstElementChild</code> 를 사용하여 첫 번째 요소를 찾고, 해당 요소에서 더 들어가 <code>el.firstElementChild.nextElementSibling</code> 를 통해 첫 번째 요소의 형제 요소를 찾았더니 알맞은 값이 출 됨을 확인할 수 있다.
</br>마지막으로 해당 <code>el</code> 에 요소를 추가하기 위해 <code>const div = document.createElement(&#39;div&#39;)</code> 를 통해 <code>div</code> 태그를 하나  생성한다. 그리고 해당 <code>div</code> 에 <code>classList</code> 를 통해 <code>child</code> 라는 클래스를 추가했으며, 마지막으로 <code>el</code> 에 만들어 둔 <code>div</code> 를 추가하고 <code>innerText</code> 를 활용하여 해당 <code>div</code> 내부에 <code>6</code> 이라는 텍스트를 추가했다. 그렇게 해당 결과와 같이 5개 였던 요소들이 6개로 추가되었고, 같은 클래스를 부여하여 같은 CSS가 적용 되었음을 확인할 수 있다. 
</br></p>
<h2 id="노드의-추적과-추가생성">노드의 추적과 추가/생성</h2>
</br>

<h3 id="노드의-추적">노드의 추적</h3>
<p></br>위 예시에서 <code>div.parent</code> 노드를 HTML에서 <code>className</code> 을 통해 가져온 것을 확인할 수 있다. 이렇게 DOM에서 메서드를 사용하여 특정 노드를 찾아올 수 있는데, 그 방법은 다음과 같다.
</br></p>
<ul>
<li><code>document.querySelector(&#39;selector&#39;)</code></li>
<li><code>document.querySelectorAll(&#39;selector&#39;)</code></li>
<li><code>document.getElementsByClassName(&#39;className&#39;)</code></li>
<li><code>document.getElementById(&#39;idName&#39;)</code></li>
</ul>
<p></br>해당 메서드들을 활용하여 DOM 노드들을 특정 기준으로 불러올 수 있다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/04b5f811-bade-4e12-8eb7-2646f87dec11/create_node.png" alt=""></p>
<p></br>각 메서드의 활용 방법과 반환 값을 알 수 있는 예시다. 해당 예시는 위 예시에서 <code>div.child</code> 의 마지막 요소만 <code>div#lastChild</code> 로 바꾼 뒤 진행한 예시다. 위 메서드들은 <strong>인자의 형식</strong>이나 <strong>반환 값의 형식</strong>에 따라 구분된다.
</br>우선 <strong>인자 형식</strong>에 따라 <code>document.querySelector(&#39;selector&#39;)</code> , <code>document.querySelectorAll(&#39;selector&#39;)</code> 은 <strong>선택자 작성 방식</strong>으로 인자 값을 사용한다. 하지만 <code>document.getElementsByClassName(&#39;className&#39;)</code> , <code>document.getElementById(&#39;idName&#39;)</code> 의 경우는 <strong>클래스 명, ID 명을 바로 작성</strong>한다는 차이점이 있다.
</br>그리고 <strong>반환 값의 형식</strong>에 따라 <code>document.querySelector(&#39;selector&#39;)</code> , <code>document.getElementById(&#39;idName&#39;)</code> 은 <strong>단일 값</strong>을 반환하기 때문에, 노드 하나 만을 반환하고 일치하는 노드가 존재하지 않는 경우 <code>null</code> 을 반환하지만, <code>document.querySelectorAll(&#39;selector&#39;)</code> , <code>document.getElementsByClassName(&#39;className&#39;)</code>의 경우  <strong>복수의 값</strong>을 반환하기 때문에 인덱스 값을 <code>[i]</code> 을 통해 입력해야 하고 값이 없을 때도 빈 배열을 반환한다는 차이가 있다.
</br>이렇게 노드를 추적하여 특정 위치에 요소를 추가하거나 변경하는 것이 가능하다.
</br>그렇다면 예시 일부를 추출하여 요소 생성과 추가의 과정을 설명해보자.</p>
<p><img src="https://images.velog.io/images/p-acid/post/547f3513-6c38-422c-80de-308e8362b4e5/create_node_2.png" alt=""></p>
<p>우선 <code>div</code> 라는 변수에 <code>createElement</code> 라는 메서드를 사용하여 <code>div</code> 태그 노드를 <strong>생성</strong>하고 저장한다. 그리고 해당 <code>div</code> 값에 <code>classList</code> 를 통해 ,<code>child</code> 라는 클래스를 부여해준다. 이후 앞에서 선언해 준 <code>el</code> 에 <code>append</code> 를 통해 <code>div</code> 변수를 <strong>추가</strong>한다. 마지막으로 <code>innerText</code> 를 통해 <code>el</code> 의 마지막 자식 요소에  <code>6</code> 이라는 값을 <strong>추가</strong>한다.
</br>위에서 강조 표시한 <strong>생성</strong>과 <strong>추가</strong>에 대해 이어서 알아보자.
</br></p>
<h3 id="노드의-생성-및-추가">노드의 생성 및 추가</h3>
</br>

<h4 id="생성">생성</h4>
<ul>
<li><code>createElement()</code> </li>
<li><code>createTextNode()</code></br>
#### 추가 </li>
<li><code>innerHTML/Text = input</code></li>
<li><code>outerHTML/Text = input</code></li>
<li><code>textContent = input</code></li>
<li><code>insertAdjacentHTML()</code> </li>
</ul>
<p><img src="https://images.velog.io/images/p-acid/post/012f6340-9e82-4aea-9c4a-e93f6ddbe5d1/create_node3.png" alt=""></p>
<p>위 예시를 보면 각각의 방법으로 생성을 진행하고 추가도 진행한 내용이다. <code>createElement()</code> 의 경우엔 앞 전의 예시에서 사용했기 때문에 제외하였다.
</br>우선 <code>createElement()</code> 와 <code>createTextNode()</code> 의 경우 선언과 동시에 변수에 저장되고 값의 형태의 경우, 전자는 <code>element</code> 노드 형태로, 후자의 경우 <code>Text</code> 노드 형태로 저장된다.
</br>그리고 총 네 가지의 추가 방법을 작성했는데, <code>innerHTML/Text</code> 은 노드 요소 내부에, <code>outerHTML/Text</code> 의 경우 태그 전체를 갱신하며 기존 태그가 사라진다고 생각하면 된다. <code>textContent</code> 는 <code>Text</code> 요소를 생성하여 갱신하고, 마지막 <code>insertAdjacentHTML()</code> 의 경우엔 <code>element</code> 노드에서만 동작하며 인자 값이 두 가지가 들어가는데, <code>(location, &#39;textStyleTag&#39;)</code> 로 구성되며 앞엔 정해진 키워드(<code>beforeend</code> 등)를 인자로 갖고 뒤엔 <code>outerHTML</code> 작성과 같이 전체 노드 형식을 작성한다.
</br>이외에도 <strong>추가</strong>에는 두 가지 방법이 더 있다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/c940eae1-be0e-4123-a55a-499f9bef73ba/create_node4.png" alt=""></p>
<p>앞의 방식들은 대부분 노드 값을 갱신하는 것이었다면, 위 두 가지 방법은 <strong>요소를 지우지 않고</strong> 추가를 진행한다. <code>appendChild()</code> 의 경우 추가하고자 하는 노드를 해당 요소의 맨 끝 자식 요소로 추가한다. 배열 메서드의 <code>push()</code> 와 같은 구조라고 생각하면 편할 것 같다.</p>
<p></br><code>insertBefore()</code> 의 경우 인자 값으로 두 가지를 받는데, <code>(element, location)</code> 의 형태로 받게 된다. 우선 추가하고자 하는 요소를 받고, 이후 경로를 지정하여 해당 요소 기준으로 앞에 위치한다. 이렇게 유연한 방식으로 노드를 추가할 수 도 있다.
</br></p>
<h2 id="노드의-제거와-변경">노드의 제거와 변경</h2>
<p></br>노드의 생성과 추가가 이루어졌으면, <strong>제거와 변경</strong>도 가능할 것 임을 이미 짐작했을 것이다. 제거와 변경은 다음과 같은 메서드를 사용하여 진행할 수 있다.</p>
<h4 id="제거">제거</h4>
<ul>
<li><code>removeChild()</code></li>
</ul>
<h4 id="변경">변경</h4>
<ul>
<li><code>replaceChild()</code></li>
</ul>
<p><img src="https://images.velog.io/images/p-acid/post/5ffe60bf-80e4-46a8-94ad-3f3c37f857d2/remove_node.png" alt=""></p>
<p>우선 제거의 경우 <code>removeChild()</code> 와 같이 상속 관계를 활용하여 진행할 수 있다. 이 경우 해당 노드의 <code>parentNode</code> 혹은 <code>parentElement</code> 를 참조하여 제거를 진행할 수 있다. 
</br>변경도 제거와 같이 상속 관계를 활용하면서, 인자를  두 가지를 받는다. 인자는 <code>(inputElement, location)</code> 으로 <code>location</code> 에 <code>inputElement</code> 를 대입하여 사용 가능하다. 위 예시의 경우 <code>parent</code> 의 마지막 자식 요소를 지정하여 변경한 모습이다.
</br></p>
<h2 id="노드의-복제">노드의 복제</h2>
<p></br>특정 노드의 구조를 <strong>복제</strong>하여 사용할 수도 있다. 그렇게 된다면, 같은 구조의 노드는 반복적으로 생성할 필요가 없는 것이다. 복제는 다음의 방법으로 진행할 수 있다.</p>
<h4 id="복제">복제</h4>
<ul>
<li><code>cloneNode()</code></li>
</ul>
<p><img src="https://images.velog.io/images/p-acid/post/1c17b359-c3a4-4aaa-a34d-db9a69249a52/image.png" alt=""></p>
<p>해당 예시를 보면 <code>parent</code> 노드 자체만 복사한 경우와, 노드 전체를 복사한 경우가 구분되어 있다. <code>cloneNode()</code> 메서드의 경우, 특정 노드를 복제하는데 <strong>인자 값</strong>에 따라 전체를 복사할 지, 단일 요소만 복사할 지를 구분할 수 있다.
</br><code>cloneOne</code> 의 경우 인자 값을 부여하지 않았기 때문에, <code>parent</code> 노드 단일 객체 만을 복제했지만, <code>cloneAll</code> 의 경우 인자 값에 <code>true</code> 를 추가하여 해당 노드의 자식 요소들까지 전부 복제하였다.</p>
<h1 id="마무리-🧾">마무리 🧾</h1>
<p></br>완벽하게 해당 책을 독파하고 전체를 정리하여 작성하고 싶었지만, 부트캠프 커리큘럼과 동시에 진행하고자 하니 약간 버거워 <strong>내가 실제로 활용했던 부분에 대해서 작성하는 것</strong>을 1차 목표로 두고 기존의 작성 목록을 마무리지었다.
</br>이어서 리액트를 진행할 예정이지만, 바닐라 자바스크립트 또한 놓치지 않고 꾸준히 공부해야 함을 명심하자.</p>
<h4 id="🔖-참고">🔖 참고</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model/Introduction">DOM : MDN Web Docs : DOM 소개</a> + 각종 메서드들</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Review] 로그인 화면 구현]]></title>
            <link>https://velog.io/@p-acid/Review-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%99%94%EB%A9%B4-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@p-acid/Review-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%99%94%EB%A9%B4-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Sun, 05 Sep 2021 13:15:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>한 주간의 학습 내용을 복기하는 겸 <strong>로그인 화면</strong>을 간단하게 구현하고, 활용한 <strong>학습 내용을 정리</strong>한 포스팅입니다. 😊</p>
</blockquote>
<h1 id="프롤로그-🗂️">프롤로그 🗂️</h1>
<p><img src="https://images.velog.io/images/p-acid/post/5145831e-cb27-4bed-bb4c-3e5225a2daff/interstella_meme.gif" alt=""></p>
<p>이전에 공부하면서 느낀 내용 중, 가장 큰 부분은 <strong>&quot;이론을 배우고, 실습해보자&quot;</strong> 라는 부분인 것 같다. 항상 인간은 자신이 망각의 동물인 것 마저 망각하고 <strong>얻은 지식에 대해 기만하는 자세</strong>가 생기는 것 같다<del>(물론 나만 그럴 수도 😂)</del>.
</br><strong>자신감을 갖는 것</strong>도 중요하지만, 그 지식이 온전히 <strong>나의 것</strong>이 되기 위해서는 단순히 학습하는 것 외에도 <strong>추가적인 노력이 필요함</strong>을 요즘 절실히 느끼는 것 같다.
</br>그래서 <strong>복기하는 시간을 갖자</strong>고 생각했던 것 같다. 그리고 복기하면서 다시금 <strong>&quot;그때 해냈던 일이지만, 다시 하려니 어려울 수도 있구나&quot;</strong> 라는 것을 심심치 않게 느꼈고, 가능한 뭔가 <strong>찝찝하고 확실하지 않다면</strong> 이렇게 <strong>정리하는 시간</strong>을 갖는게 좋을 것 같다. 드라마틱한 결과는 아니지만 소소하게 정리하다 보면, 언젠간 그 규모가 <strong>눈에 띄게 커지지 않을까 기대해본다.</strong> 🧩
</br></p>
<h1 id="개요-🗺️">개요 🗺️</h1>
<p><img src="https://images.velog.io/images/p-acid/post/4188b0ad-ca75-49d4-a7ef-3b8bb855e871/image.png" alt=""></p>
</br>

<h3 id="github-link-🔗">Github Link 🔗</h3>
<blockquote>
<p><a href="https://p-acid.github.io/instagram_clone/"><strong>Github Page Link</strong> 📄</a>
<a href="https://github.com/p-acid/instagram_clone"><strong>Github Repository Link</strong> 📦</a></p>
</blockquote>
</br>

<h3 id="복기-사항">복기 사항</h3>
</br>

<ul>
<li><strong>HTML <code>container tag</code> 의 역할</strong>과 <strong>상속 관계</strong>의 이해 </li>
<li><strong>CSS <code>display : flex</code></strong> 에 대한 이해</li>
<li><strong><code>getElementByClassName</code></strong> 와 <strong><code>getElementByID()</code></strong> 가 불러오는 <strong>데이터 구조의 이해</strong></li>
<li><strong><code>addEventListener()</code></strong> 를 통한 <strong>이벤트 구현</strong></li>
</ul>
</br>

<h3 id="구현-사항">구현 사항</h3>
</br>

<ul>
<li><strong>인스타그램의 로그인 영역</strong>을 간단하게 구현 </li>
<li><strong>login <code>button</code></strong> 을 누르는(<code>click</code>) <strong>이벤트가 발생</strong>하면, <code>ID</code> 와 <code>Password</code> 에 따라 <strong>결과 값을 다르게 <code>alert</code></strong> 하는 기능</li>
</ul>
</br>

<h3 id="기술-스택">기술 스택</h3>
<p><img src="https://images.velog.io/images/p-acid/post/c537b6da-0bc7-4a4f-b050-982b9e8a6d07/sikrok.jpg" alt=""></p>
<p>&quot;아 이번엔 <strong><code>CSS</code>와 <code>JavaScript</code></strong>로 하겠습니다. 그런데, <strong><code>HTML</code></strong>을 약간 곁들인...&quot;
</br></p>
<h1 id="결과-내용-🙌🏻">결과 내용 🙌🏻</h1>
</br>

<h2 id="기부니가-조크등요-🕺🏻">기부니가 조크등요 🕺🏻</h2>
<p><img src="https://images.velog.io/images/p-acid/post/3b61eb2a-0cf5-4078-9f0f-9883e7a39eb3/wonderful.gif" alt=""></p>
<p>막 그리 대단한 결과물은 아니지만, 내가 <strong>알고 있는 개념을 명확히 적용할 수 있었다</strong>는 점에서 뿌듯한 결과물이었다. 또한, 생각했던 것보다 <strong>소요 시간이 짧았기에</strong>, 그 부분도 내가 어느 정도 이해를 했다는 부분이라 생각되어 보람찼다.
</br>아침에 일어나자마자 생각하고 구현해 본 사항이라, 실제 인스타그램을 클론하기 위해서는 <strong>더 많은 UI 요소</strong>가 필요하겠지만, 이를 <strong>초석</strong>이라 생각하고 조금씩 <strong>리빌딩</strong> 해볼까 싶다.
</br></p>
<h2 id="로그인-화면-리뷰-📟">로그인 화면 리뷰 📟</h2>
</br>

<h3 id="로그인-화면--htmlcss">로그인 화면 : HTML/CSS</h3>
</br>

<p><img src="https://images.velog.io/images/p-acid/post/ba513583-4c54-4b8b-b479-0a8a346e07a4/login_success.gif" alt=""></p>
<h4 id="html">HTML</h4>
<pre><code class="language-html">&lt;body&gt;
    &lt;div class=&quot;main&quot;&gt;
        &lt;h1 class=&quot;logo&quot;&gt;Acidgram&lt;/h1&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;input type=&quot;text&quot; placeholder=&quot;ID&quot; id=&quot;id&quot; class=&quot;account&quot;&gt;
            &lt;input type=&quot;password&quot; placeholder=&quot;Password&quot; id=&quot;password&quot; class=&quot;account&quot;&gt;
            &lt;button id=&quot;login&quot; class=&quot;account&quot;&gt;login&lt;/button&gt;
            &lt;p id=&quot;alert&quot; class=&quot;account&quot;&gt; &lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;   
    &lt;script src=&quot;script.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre>
</br>

<h4 id="css">CSS</h4>
<pre><code class="language-css">.main {
    width: 250px;
    height: 300px;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    border: 1px solid lightgrey;
    border-radius: 5px;
}

.logo {
    margin-top: 0px;
    margin-bottom: 40px;
}

#login {
    width: 100%;
    background-color: skyblue;
    border-color: transparent;
    color: white;
}

.account {
    display: block;
    margin-bottom: 3px;
    padding: 3px;
    border: 1px solid lightgray;
    border-radius: 3px;
}

#alert {
    border-color: transparent;
}</code></pre>
<p></br>CSS 구성에 있어, 최대한 <strong><code>display : flex</code></strong> 를 활용하여 작성하려 했다. 
</br>먼저, 전체를 포괄하는 <strong><code>.main</code></strong> 에 <strong><code>display : flex</code></strong> 를 작성하고 <strong><code>justify-content: center;</code> , <code>align-items: center;</code></strong> 를 통해 <strong>가로, 세로 가운데 정렬</strong>을 진행한다. 그리고 <strong><code>flex-direction : column</code></strong> 을 통해 <strong>열방향으로 정렬</strong>하여 세로 한 줄로 정리하여 마무리했다.
</br>나머지 부분은 <code>rgb</code> 값을 추출하진 않았고 유사하다고 생각하는 색상을 추가했으며 이외의 구성 또한 비슷하게 구현해봤다.</p>
</br>

<h3 id="로그인-과정--자바스크립트">로그인 과정 : 자바스크립트</h3>
</br>

<h4 id="로그인-성공-화면">로그인 성공 화면</h4>
<p><img src="https://images.velog.io/images/p-acid/post/ba513583-4c54-4b8b-b479-0a8a346e07a4/login_success.gif" alt=""></p>
<h4 id="로그인-실패--password-오류">로그인 실패 : <code>Password</code> 오류</h4>
<p><img src="https://images.velog.io/images/p-acid/post/203bfd74-90ce-498a-876c-8450c8a64b7c/login_pwErr.gif" alt=""></p>
<h4 id="로그인-실패--id-오류">로그인 실패 : <code>ID</code> 오류</h4>
<p><img src="https://images.velog.io/images/p-acid/post/b9cf5b26-60ca-4cb3-b1ca-82ee05456386/login_idErr.gif" alt=""></p>
<h4 id="실패-횟수-초과">실패 횟수 초과</h4>
<p><img src="https://images.velog.io/images/p-acid/post/a8adb5a9-c1c8-4bb3-a31f-aaa14945ec45/login_5times.gif" alt=""></p>
<h4 id="자바스크립트-코드">자바스크립트 코드</h4>
</br>

<pre><code class="language-javascript">const id = document.getElementById(&#39;id&#39;)
const password = document.getElementById(&#39;password&#39;)
const login = document.getElementById(&#39;login&#39;)
let errStack = 0;

login.addEventListener(&#39;click&#39;, () =&gt; {
    if (id.value == &#39;acid&#39;) {
        if (password.value == &#39;0000&#39;) {
            alert(&#39;로그인 되었습니다!&#39;)
        }
        else {
            alert(&#39;아이디와 비밀번호를 다시 한 번 확인해주세요!&#39;)
            errStack ++;
        }
    }
    else {
        alert(&#39;존재하지 않는 계정입니다.&#39;)
    }

    if (errStack &gt;= 5) {
        alert(&#39;비밀번호를 5회 이상 틀리셨습니다. 비밀번호 찾기를 권장드립니다.&#39;)
    }
})</code></pre>
<p></br>우선 <strong><code>addEventListener()</code></strong> 를 사용하기 이전에, <strong><code>id</code> , <code>password</code>, <code>login</code></strong> 에 <code>getElementById()</code> 를 통해 해당하는 <code>elementNode</code> 를 할당한다. 그리고 <code>password</code> 를 틀린 횟수를 할당할 <code>errStack</code> 변수 또한 정의해준다.
</br>그리고 해당 노드의 <code>value</code> 를 활용하여 4가지 경우를 정의했다.</p>
<ul>
<li><code>id.value</code> 가 일치하고, <code>password.value</code> 마저 일치하는 경우</li>
<li><code>id.value</code> 만 일치하는 경우</li>
<li><code>id.value</code> 마저 일치하지 않는 경우</li>
<li><code>id.value</code> 만 일치할 때, 해당 계정을 기준으로 <code>password</code> 를 5회 이상 틀린 경우</li>
</ul>
<p>그렇게 구현된 화면이 위에서 부터 순서대로 나와있다.
</br></p>
<h2 id="마무리-📋">마무리 📋</h2>
<p></br> 한 주간 배웠던 내용을 정리하면서 내가 몰랐던 부분에 대해서도 다시금 알아가고, 또 팀원들과 별도로 스터디를 진행하면서 새로이 알게 된 지식들도 정말 값진 경험들이었다.
</br>앞으로 무언가가 궁금하면, <strong>주저 말고 찍어보자.</strong> 그렇다면 화면에 답이 나올 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Tools : DevTools]]></title>
            <link>https://velog.io/@p-acid/TIL-Tools-DevTools</link>
            <guid>https://velog.io/@p-acid/TIL-Tools-DevTools</guid>
            <pubDate>Sun, 05 Sep 2021 01:28:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 포스팅은 <strong>브라우저 개발자 도구</strong>에 대한 내용을 포함하고 있으며, <strong>크롬(Chrome)</strong>을 중심으로 다루고 있습니다. 😊</p>
</blockquote>
<h1 id="프롤로그-🌊">프롤로그 🌊</h1>
<p><img src="https://images.velog.io/images/p-acid/post/3d481751-764b-4433-a5f7-acd57863724e/moomin_swim.gif" alt=""></p>
<p>HTML을 작성하고 CSS나 자바스크립트를 작성할 때, 원하는 대로 되지 않으면 애꿎은 콤퓨타 탓만 하게 된다. 사실 우리가 사용하는 PC나 브라우저는 아무런 잘못이 없는데 말이다. <del>(그만큼 화풀이가 필요하시다는 거겠지... 😂)</del>
</br>암튼 롤에서 습관적으로 하게 되는 남탓을 브라우저에게 하면서 대답을 받으려 하지 말고, <strong>브라우저가 어떤 곤경에 빠져 있는지, 이 친구가 왜 내 말을 이해하지 못하는지(사실은 내가 뭘 잘못했는지)</strong>를 잘 알려주는 것이 <strong>개발자 도구(Development Tools)</strong>다.
</br>그러니 이번 기회에 개발자 도구에 대해 배워서, 문제 해결을 위한 <strong>무지성 코드 작성</strong>으로 헤매고 있는 <span style="color:skyblue">무민이</span>가 아닌 영리한 개발자가 되도록 하자! 🦛
</br></p>
<h1 id="개발자-도구-🔍">개발자 도구 🔍</h1>
<p><img src="https://images.velog.io/images/p-acid/post/13e2a828-12f8-4323-9915-87aa9f666c2d/image.png" alt=""></p>
<p>코드를 작성하고 실행했을 때, 예상치 못한 오류가 발생한다면 갑자기 삶이 그렇게 고되게 느껴질 수가 없을 것이다. 이러한 상태를 빠르게 편-안해질 수 있도록 하는 것이 <strong>개발자 도구(Development Tools)</strong>이라고 앞에서 말한 바 있다.
</br><strong>개발자 도구</strong>는 브라우저에서 기본적으로 제공되는 개발을 도와주는 도구이다. 이를 이용하면 <strong>어떠한 부분에서 문제가 발생해서 내가 원하는 부분이 구현이 되지 않았는 가</strong>에 대해 쉽게 알 수 있다. 또한, <strong>원하는 수정 사항을 브라우저 내에서 수정을 진행</strong>하여 실시간으로 이를 확인하며 <strong>원본 파일을 건드리지 않을 수도 있다.</strong>
</br>단순히 이런 기능 외에도 다양한 패널과 탭이 존재하여, 그 사용법을 알고 있다면 문제 발생에 대한 대처를 명확하고 신속하게 하여 <strong>생산성을 극대화 시킬 수 있다.</strong>
</br>기본적으로 개발자 도구는 윈도우 기준으로 <strong><code>F12</code> 키</strong> 혹은 <strong><code>ctrl + shift + i</code></strong> 커맨드를 사용하여 열 수 있다. 이번 포스팅에선 <strong>크롬(Chrome)</strong>을 활용하여 먼저 학습을 진행했던 <strong>Elements, Console, Network, Application</strong> 패널에 대해 알아보자.
</br></p>
<h2 id="elements-panel-🧱">Elements panel 🧱</h2>
<p><img src="https://images.velog.io/images/p-acid/post/f8937121-4e18-473b-81e2-0be9a83ad8a8/image.png" alt=""></p>
<p><strong>Elements panel</strong>은 웹 페이지의 <strong>DOM(node)</strong>이나 <strong>CSS(Style)</strong>에 대한 내용을 확인할 수 있는 패널이고, 해당 패널에서 <strong>UI나 CSS의 수정</strong>을 진행할 수도 있다. DOM에 대한 사항은 위 이미지 기준으로 <strong>왼쪽 영역</strong>에서 확인 가능하고, CSS에 대한 사항은 <strong>Styles 와 Computed 에서</strong> 확인할 수 있다.
</br></p>
<h3 id="dom-보기-및-변경">DOM 보기 및 변경</h3>
<p><img src="https://images.velog.io/images/p-acid/post/c93c6e11-364a-450f-8f1f-f872ebf43922/image.png" alt=""></p>
<p>특정 <strong>DOM node</strong>가 어디 있는지 찾기 위해 다음과 같은 방법을 시도할 수 있다.
</br></p>
<ul>
<li>해당 영역 <strong>마우스로 드래그</strong>하고 <strong>마우스 오른쪽 클릭</strong> 후 <strong><code>검사</code></strong></li>
<li><strong>검사 아이콘(위 노란색 영역)</strong> 클릭 후, 화면에서 요소 지정</li>
</ul>
<p></br>이렇게 해당 노드를 찾았다면 <strong>마우스</strong>를 통해 <strong>토글</strong>을 열고 닫으면서 노드를 확인할 수 있지만, <strong>키보드</strong>를 통해서도 가능하다. 키보드를 통한 <strong>기본 조작</strong>은 <strong>방향키</strong>를 사용하며 방법은 다음과 같다.
</br></p>
<ul>
<li><strong>방향키 위, 아래(<code>↑</code>, <code>↓</code>) : 노드 이동</strong></li>
<li>*<em>방향키 오른쪽(<code>→</code>) : 토글 열기 *</em></li>
<li><strong>방향키 왼쪽(<code>←</code>) : 토글 닫기</strong></li>
</ul>
<p></br>또한, 원하는 노드를 찾기 위해서 Elements 내부에서 <strong><code>ctrl  + f</code></strong> 를 통해 노드 찾기 탭을 열 수 있다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/8b5e41f4-e31a-4156-b2a5-c08df3984bdb/image.png" alt=""></p>
<p></br>그리고 노드들을 <strong>추가(편집)나 제거, 재정렬</strong> 등을 하는 <strong>요소 수정</strong>이 가능하다. 해당 기능을 사용하는 방법들은 다음과 같이 정리할 수 있다.
</br></p>
<ul>
<li><strong>노드 추가 및 편집</strong> : 노드 혹은 텍스트 부분을 <strong>더블 클릭</strong>하여 편집 모드 실행. <strong>요소 노드, 텍스트는 편집, 속성은 모두 가능.</strong></li>
<li><strong>노드 제거</strong> : 노드 선택 후, <strong>키보드 <code>Delete</code> 키 입력</strong></li>
<li><strong>노드 재정렬</strong> : 노드 선택 후, <strong>드래그</strong> 하여 이동 </li>
</ul>
<p></br>마지막으로, Elements 패널에서 <strong><code>ESC</code></strong> 키를 누르면, <strong>Console 패널을 동시에 사용</strong>할 수 있다.
</br></p>
<h3 id="css-보기-및-변경">CSS 보기 및 변경</h3>
<p><img src="https://images.velog.io/images/p-acid/post/459cc2aa-be92-47c4-ba18-845ef01bcf37/image.png" alt=""></p>
<p></br><strong>CSS</strong>의 경우에도, 앞의 DOM node를 보거나 변경하는 방법과 유사하다. 조금 다른 점이 있다면 <strong>추가</strong>의 경우 해당하는 노드 영역을 <strong>클릭</strong>하면 <strong>새로운 CSS</strong>를 추가할 수 있다. 
</br>위 <strong>Styles</strong> 탭을 보면 위에서부터 아래까지 <strong>구역</strong>이 나누어져 있는 것을 알 수 있다. 해당 구역은 아래에서 위로 갈 수록 <strong>CSS 요소의 우선 순위가 올라간다</strong>.
</br>이외 추가적인 사항에 대해서는 <a href="https://developer.chrome.com/docs/devtools/css/">크롬 개발자 도구 CSS 보기 및 변경에 대한 사항</a>에서 찾아보는 걸로 마무리 하자.
</br>그리고 여기서는 <strong>Styles</strong>과 <strong>Computed</strong>의 차이점, <strong><code>user agent stylesheet</code></strong>는 무엇인가에 대해 알아보자!</p>
<h3 id="💡-styles-와-computed">💡 <code>Styles</code> 와 <code>Computed</code></h3>
<blockquote>
<p><strong>Styles</strong>와 <strong>Computed</strong>는 둘 다 CSS 요소를 보여주고 있지만, 그 <strong>표현 방법</strong>에서 다소 차이를 보인다.
</br>우선 <strong>Styles</strong>의 경우 위와 같이 해당 노드에 어떤 <strong>선택자</strong>를 통해 CSS 요소가 <strong>반영되었는 지</strong> 혹은 <strong>반영되지 않았는 지</strong>에 대한 내용을 담고 있다. 하지만, <strong>Computed</strong>의 경우 다르게 표현되는 것을 확인할 수 있다.
<img src="https://images.velog.io/images/p-acid/post/9e7608fe-32f8-44d8-8224-91870ef90009/image.png" alt="">
위 이미지는 같은 노드의 CSS 값을 Computed 탭에서 확인한 것이다. Computed는 <strong>화면에 렌더링 되는 스타일 내용만 나열</strong>하고 다른 스타일 내용은 반영하지 않는다. 이를 통해 실제 화면 렌더링에서 어떠한 요소들이 반영되는 지에 대해 파악이 가능하다. 추가적으로 해당 탭에서는 <strong>편집이 불가능하다.</strong></p>
</blockquote>
<h3 id="💡-user-agent-stylesheet">💡 <code>user agent stylesheet</code></h3>
<blockquote>
<p><strong><code>user agent stylesheet</code></strong>란 <strong>브라우저</strong>가 제공하는 <strong>기본 스타일 값</strong>을 의미한다. <strong><code>&lt;button&gt;</code></strong> 태그 등을 작성하면, <strong>CSS 요소를 작성하지 않았음에도</strong> 불구하고, <strong>버튼의 형태를 유지한 상태</strong>로 화면에 렌더링 되는 것을 확인했을 것이다. 이는 브라우저에서 해당 태그에 대해 특정 CSS 값을 <strong>기본적으로 부여하도록 한 것이기 때문이다.</strong> 
</br>해당 영역은 <strong>수정이 불가능</strong>하며, 브라우저 별로(Chrome, Safari, IE) <strong>기본적인 속성 값이 상이</strong>하기 때문에, 대개 <strong>개발 시작 단계</strong>에서 <strong><code>reset.css</code> 혹은 <code>normalize.css</code></strong> 에서 <strong>기본 스타일 값을 모두 초기화</strong> 시키고 진행하여 브라우저 종류에 상관 없이 <strong>동일한 화면을 출력</strong>하도록 한다.</p>
</blockquote>
</br>

<h2 id="console-panel-⚠️">Console panel ⚠️</h2>
<p><img src="https://images.velog.io/images/p-acid/post/0b60d4be-3696-4a0f-8e83-7568e6efec34/image.png" alt=""></p>
<p></br><strong>Console panel</strong>은 <strong>자바스크립트</strong>와 연관된 패널로 <strong>자바스크립트 코드를 즉시 실행</strong>해보거나, <strong>디버깅</strong>의 과정에서 사용하는 패널이다. 개발자는 console에 기록된 <strong>메세지</strong>를 보면서 <strong>자바스크립트가 원활하게 작동하는 지</strong>를 확인할 수 있고, 만약 <strong>문제가 발생</strong>한다면 <strong>오류 내용을 기록</strong>하여 개발자로 하여금 원인을 찾기 수월하게 만들어 준다.
</br>위 예시를 보면 <strong><code>console.log()</code></strong> 를 통해 <strong><code>&#39;Hello, World!&#39;</code> 라는 문자열</strong>을 <strong>콘솔에 출력</strong>하도록 자바스크립트 코드를 작성하였다. 이렇게 바로 자바스크립트 구문을 작성하여 <strong>DOM 노드</strong>를 제어하거나, 수정하고자 하는 자바스크립트 구문을 <strong>테스트 해볼 수 있다.</strong>  </p>
<p><img src="https://images.velog.io/images/p-acid/post/ceb8b8f3-9f18-4add-9e89-fda388c61bc6/image.png" alt=""></p>
<p>위 이미지에서 패널 오른쪽 노란색 부분을 누르면 <strong>콘솔 설정</strong>에 대한 내용을 볼 수 있다. 콘솔 설정의 각 항목에 대한 내용은 다음과 같다.
</br></p>
<ul>
<li><strong>Hide network : 네트워크 메시지 숨기기</strong>
ex) 404
<img src="https://images.velog.io/images/p-acid/post/ebbfa0fb-915f-4cd7-84e8-d0ee9fcff01a/image.png" alt=""></li>
<li><strong>Preserve log : 페이지 로드 시 메시지 유지</strong>
: 기본적으로 콘솔은 새 페이지 로드 시, 메시지를 삭제함</li>
<li><strong>Selected context only : 선택한 context만 필터링</strong>
: <strong><code>top</code></strong> 영역의 <strong>토글</strong>을 누르고 드롭다운에서 해당 context 선택</li>
<li><strong>Group Similar messages in console : 메시지 그룹화 활성화/비활성화</strong></li>
<li><strong>Log XMLHttpRequests : 모든 <code>XMLHttpRequest</code> 와 <code>Fetch</code> 콘솔에 대한 요청을 기록</strong></li>
<li><strong>Eager evaluation : 반환 값 미리보기 활성화/비활성화</strong></li>
<li><strong>Autocomplete from history : 앞에서 작성한 표현식 자동 완성 활성화/비활성화</strong></li>
<li><strong>Evaluate triggers user activation</strong></li>
</ul>
<p></br>위와 같은 기능을 활용하여 Console panel을 사용 함에 있어 더 효과적으로 활용할 수 있다. 실제로 프론트엔드의 경우 <strong>&quot;콘솔 찍어 봤나요?&quot;</strong>라는 말을 하듯이, 다른 도구를 사용하는 것보다 <code>console.log</code> 를 활용하는 경우가 대부분이다.</p>
<h3 id="💡-console-은-객체다">💡 <code>console</code> 은 객체다</h3>
<blockquote>
<p>무의식적으로 사용하는 <code>console.log()</code> 이지만 정작 이게 무엇인지 자세히 생각해보지 않았을 것이다.
</br>앞의 <a href="https://velog.io/@p-acid/TIL-JavaScript-Object">객체 포스팅</a>에서도 짧게 언급했었지만, <strong><code>console</code> 은 객체 형태이기 때문에</strong> 해당하는 프로퍼티들이 있을 것이고, 메서드도 존재할 것이다. 그 중 하나가 <code>log</code> 메서드이고, <code>console.log()</code> 는 하나의 메서드를 사용했다고 생각 함이 옳다.</p>
</blockquote>
</br>

<h2 id="network-panel-📶">Network panel 📶</h2>
<p><img src="https://images.velog.io/images/p-acid/post/44bec081-4e53-4135-ad34-53dfd79aa897/image.png" alt=""></p>
<p><strong>Network panel</strong>은 <strong>웹 페이지 로드</strong>부터 필요한 이미지, 미디어, url과 같은 <strong>리소스들을 가져오는 과정</strong>을 확인할 수 있는 패널이다.
</br>자세히 말하자면, 해당 리소스의 <strong>이름은 무엇인지</strong>, 로드 <strong>상태가 어떤지, 형식</strong>은 어떤지 등의 내용을 포함하여 요청하는 데 <strong>얼마 만큼의 시간이 걸렸는지</strong> 등의 내용을 알 수 있기 때문에 페이지 로드에 있어 <strong>지연되는 부분</strong>이나 <strong>문제인 부분</strong>의 <strong>성능 향상</strong> 내지 <strong>오류 해결</strong>을 도모할 수 있다.
</br>위 예시를 보면 받아온 리소스들의 리스트가 <strong>탭</strong>으로 구분되어 정보를 제공하고 있다. 각 탭 마다 의미하는 바를 정리하면 다음과 같다.
</br></p>
<ul>
<li><strong>Filmstrip : 탭 위 타임라인 형태의 그래프. 각 데이터의 로드 순서를 시각적으로 확인 가능</strong></li>
<li><strong>Name : 리소스 이름과 URL</strong></li>
<li><strong>Status : HTTP 응답 코드, 작동 여부를 코드로 확인.</strong></li>
<li><strong>Type : 리소스의 형식(.html, .js 등)</strong></li>
<li><strong>Initiator : 리소스 요청 근원으로, 링크로 이동하면 요청 원인 소스 코드로 넘어감</strong></li>
<li><strong>Time : 리소스 로드 시간</strong></li>
<li><strong>Waterfall : 리소스 로드의 세부 과정을 구분하여 그래픽으로 표시</strong></li>
</ul>
<p></br>위와 같은 탭을 기준으로 구분하여 원하는 리소스에 대한 정보를 알 수 있다. 그리고 표시된 리소스 중 관련 없는 리소스들을 제외할 수 있도록 <strong>필터링</strong>도 가능하다.</p>
<h3 id="💡-404-page-not-found-">💡 404 Page Not Found ?</h3>
<blockquote>
<p>웹 페이지를 로드할 때, 문제가 발생하면 <strong>404 Page Not Found</strong>라는 문장을 심심치 않게 볼 수 있다. 이는 <strong>HTTP 상태에 오류가 있음</strong>을 알려주는 코드인 <strong>404</strong>를 포함한 컴퓨터로부터의 메시지이다. 이러한 코드를 <a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Status">HTTP Status Code</a>라고 정의한다.
</br><strong>404 Page Not Found</strong>의 경우엔 서버가 <strong>요청받은 리소스를 찾을 수 없다</strong>는 오류 메시지로, 브라우저에서는 알려지지 않은 URL을 의미한다. 네트워크 패널에서는 이러한 부분들을 확인할 수 있고, <strong>리소스들의 HTTP 요청이 성공적으로 이루어졌는지</strong> 확인할 수 있다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/p-acid/post/ec64c2e6-f5ff-4db3-97d1-5db3b602c2a2/image.png" alt=""></p>
<p>위 이미지의 노란색 영역을 보면 다양한 구분들이 나누어져 있음을 확인할 수 있다. 해당 영역은 파란색 아이콘인 <strong>필터 아이콘</strong>을 클릭하면 열고 닫을 수 있는 <strong>리소스 필터링</strong> 영역이다. 해당 리소스 필터링 영역의 각 부분은 다음과 같은 의미를 갖는다.
</br></p>
<ul>
<li><strong>Filter(<code>input</code>) :</strong> 원하는 리소스를 <strong>Name을 기준으로 검색</strong>할 수 있다.
: <strong>텍스트, 정규식, <code>-</code>(제외), 속성 필터</strong> 등을 사용 가능</li>
<li><strong>Hide data URLs :</strong> 다른 문서에 포함된 작은 파일 제외</li>
<li><strong>All ~ Other :</strong> 리소스 <strong>유형별 데이터</strong> 찾기
: <code>ctrl</code> + 마우스 클릭을 통해 <strong>다중 선택</strong> 가능</li>
<li><strong>Has blocked cookies / Blocked Requests :</strong> <strong>요청이 막힌 쿠키</strong>나, <strong>막힌 요청</strong>만 보기</li>
</ul>
<p></br>위와 같은 기능을 활용하여 원하는 데이터 만을 추려 보기에 훨씬 수월해질 수 있다. 그렇게 추린 데이터 중 원하는 데이터를 찾았다면 해당 데이터를 클릭하고 자세한 사항을 확인할 수 있다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/a79f194c-dcd7-4728-908f-e920537ece98/image.png" alt=""></p>
<p>위 이미지는 마켓컬리의 카테고리 API를 추적하여 찾은 결과다. 탭을 보면 <code>Headers</code> 부터 <code>Cookies</code> 까지 다양한 탭이 있지만, 이번엔 간단히 <code>Headers</code> 와 <code>Preview</code> 탭에 대해 알아본다.
</br><strong><code>Headers</code></strong> 는 요청에 대한 HTTP 헤더 데이터를 확인할 수 있는 영역으로, <strong>일반적인 정보</strong>나 <strong>요청 헤더</strong>, <strong>응답 헤더</strong> 섹션 등으로 구분된다.
<img src="https://images.velog.io/images/p-acid/post/afd0f7ed-4223-4741-9ba2-82c67eb4518d/image.png" alt="">
<strong><code>Preview</code></strong> 탭은 텍스트  형식으로 작성되어 있는 데이터를 <strong>트리 형태</strong>로 쉽게 확인할 수 있는 탭이다.</p>
<p>이외에도 더 많은 기능들의 자세한 사항은 <a href="https://developer.chrome.com/docs/devtools/network/">크롬 개발자 도구 Network panel에 대한 사항</a>에서 알아보는 것으로 마무리 한다.
</br></p>
<h2 id="application-panel-💿">Application panel 💿</h2>
<p><img src="https://images.velog.io/images/p-acid/post/e08c0e8c-673a-49ea-9131-2f948ecad288/image.png" alt=""></p>
<p></br><strong><code>Application panel</code></strong>도 현재 로딩된 <strong>웹 페이지에서 사용한 리소스를 확인</strong>할 수 있는 패널이다. 다만 앞의 네트워크 패널과 차이점이 있다면, <strong>네트워크 패널</strong>은 요청에 있어 그 <strong>과정을 중점적으로 확인</strong>할 수 있는 탭이고, <strong>어플리케이션 패널</strong>은 데이터베이스, 로컬 및 세션 스토리지, 쿠키 등 로딩된 모든 리소스를 구분지어 <strong>저장한 것을 확인할 수 있다.</strong>
</br>위 이미지의 왼쪽을 보면 저장소 영역이 보일 것이다. 이번 포스팅에선 열려 있는 <code>Local Storage</code> , <code>Session Storage</code> , <code>Cookies</code> 부분을 중점적으로 알아보자.
</br></p>
<h3 id="local-storage"><code>Local Storage</code></h3>
<p></br><strong><code>Local Storage</code></strong> 는 <strong>웹 스토리지 객체</strong>의 일종으로 브라우저 내에서 <strong><code>key-value</code></strong> 페어의 객체 형태로 저장된다. <code>Local Storage</code> 의 데이터는 다음과 같은 특징을 갖는다.
</br></p>
<ul>
<li>브라우저에 <strong>계속 남아있는 데이터</strong>(<strong>데이터의 영구성</strong> 보장)
: 사용자가 지우지 않는 이상</li>
<li>대체로 <strong>지속성이 필요한 데이터</strong>가 이에 해당
: <strong>ID 저장, 각종 UI 정보 등</strong></li>
</ul>
<p></br>또한, <code>Local Storage</code> 의 특정 데이터를 저장하거나 가져올 수도 있는데, 해당 메서드는 다음과 같다.</p>
</br>

<table>
<thead>
<tr>
<th>요청</th>
<th>메서드</th>
</tr>
</thead>
<tbody><tr>
<td>데이터 저장</td>
<td><code>localStorage.setItem(&quot;key&quot;, &quot;value&quot;)</code></td>
</tr>
<tr>
<td>데이터 호출</td>
<td><code>localStorage.getItem(&quot;key&quot;)</code></td>
</tr>
</tbody></table>
</br>

<h3 id="session-storage"><code>Session Storage</code></h3>
<p></br><strong><code>Session Storage</code></strong> 또한 <strong>웹 스토리지 객체</strong>의 일종으로 브라우저 내에서 <strong><code>key-value</code></strong> 페어의 객체 형태로 저장된다. <code>Session Storage</code> 의 데이터는 다음과 같은 특징을 갖는다.
</br></p>
<ul>
<li>윈도우나 브라우저 탭을 <strong>닫으면 사라지는 데이터</strong>
: 현재 페이지가 <strong>브라우징 되는 영역</strong>에서만 데이터가 <strong>유지</strong>되고, <strong>새로 고침</strong>을 통해서는 해당 데이터가 사라지지 않음</li>
<li>대체로 <strong>단기간</strong>만 필요한 정보
: <strong>언어 선택, 특정 유저 정보 등</strong></li>
</ul>
<p></br><code>Session Storage</code> 의 경우에도 특정 데이터를 저장하거나 가져올 수도 있다.</p>
</br>

<table>
<thead>
<tr>
<th>요청</th>
<th>메서드</th>
</tr>
</thead>
<tbody><tr>
<td>데이터 저장</td>
<td><code>sessionStorage.setItem(&quot;key&quot;, &quot;value&quot;)</code></td>
</tr>
<tr>
<td>데이터 호출</td>
<td><code>sessionStorage.getItem(&quot;key&quot;)</code></td>
</tr>
</tbody></table>
</br>

<h3 id="cookie"><code>Cookie</code></h3>
<p></br><strong><code>Cookie</code></strong> 는 클라이언트에 대한 내용을 <strong>웹 사이트에서 클라이언트의 웹 브라우저에 전송하는 정보</strong>이며, <code>key-value</code> 페어로 저장되지만 <strong>문자열 형태</strong>로 저장된다. 쿠키는 다음과 같은 특징을 갖는다.
</br></p>
<ul>
<li><strong>만료일자</strong>를 지정하게 되어 있음(<strong>언젠간 제거된다.</strong>)</li>
<li>상대적으로 <strong>용량이 작음</strong>(최대 4KB &lt; 5MB(<code>Local Storage</code>))</li>
</ul>
<p></br><code>Cookie</code> 또한 위와 같이 사용할 수 있는 메서드가 존재한다.</p>
</br>

<table>
<thead>
<tr>
<th>요청</th>
<th>메서드</th>
</tr>
</thead>
<tbody><tr>
<td>데이터 저장</td>
<td><code>setcookie(&quot;key&quot;, &quot;value&quot;, &quot;지속시간 (초단위)&quot;)</code></td>
</tr>
<tr>
<td>데이터 호출</td>
<td><code>document.cookie</code></td>
</tr>
</tbody></table>
</br>

<h3 id="💡-cookie-가-존재하는데-왜-local-storage-를">💡 <code>Cookie</code> 가 존재하는데, 왜 <code>Local Storage</code> 를?</h3>
<blockquote>
<p>앞에서 확인했지만, <strong><code>Local Stroage</code></strong> 와 <strong><code>Cookie</code></strong> 는 명확한 차이점을 갖지만, 그렇다고 <code>Cookie</code> 가 존재 함에도 불구하고 <code>Local Storage</code> 를 사용하는 이유가 <strong>직관적으로 다가오지는 않는다.</strong> 이에 대한 이유를 한 마디로 정리하면, <code>Local Storage</code> 가 보다 <strong>더 나은 영구적인 솔루션</strong>이라는 것이다.
</br>HTML5가 나오고 등장한 <code>Local Storage</code> 는 기존의 <code>Cookie</code> 와는 크게 <strong>세 가지</strong>가 있다.
</br>우선, <code>Local Storage</code> 는 <code>Cookie</code>와 달리 <strong>HTTP 요청</strong>에서 데이터를 주고 받을 필요가 없다. 이는 <strong>클라이언트와 서버 간 전체 트래픽</strong>과 <strong>낭비되는 대역폭의 양을 감소 시킬 수</strong>을 의미한다.
</br>다음으로, 앞에서 언급한 바이지만 <code>Local Storage</code> 는 <code>Cookie</code> 보다 <strong>큰 용량(5MB &gt; 4KB)</strong>을 갖고 있다. 그렇기에 <strong>영구적인 정보 보관</strong>에 있어 훨씬 유리하다.
</br>마지막으로, <code>Local Storage</code> 의 <strong>만료 조건</strong>은 <strong><code>persistent cookie(지속성 쿠키)</code></strong> 처럼 동작한다. 이는 자바스크립트 코드를 통해 사용자가 의도적으로 제거하지 않는 이상 <strong>데이터는 삭제되지 않는다는 것이다.</strong> 이 또한 영구적 정보 보관에 유리한 내용이다.
</br>추가적으로, <code>Local Storage</code>를 사용하면 문자열 뿐만아니라 <strong>javascript의 <code>object</code></strong>로도 저장할 수 있다.</p>
</blockquote>
</br>

<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<p><a href="https://developer.chrome.com/docs/devtools/ove">Chrome 개발자 도구 : Chrome Developers : Chrome DevTools</a>
<a href="https://ko.javascript.info/localstorage#ref-702"><code>localStorage</code> &amp; <code>sessionStorage</code> &amp; <code>cookie</code> : javascript.info : localStorage와 sessionStorage</a>
<a href="https://erwinousy.medium.com/%EC%BF%A0%ED%82%A4-vs-%EB%A1%9C%EC%BB%AC%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-28b8db2ca7b2"><code>localStorage</code> 와 <code>cookie</code> 의 차이점 : Erwinousy님 medium : 쿠키 vs 로컬스토리지: 차이점은 무엇일까?</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] CSS : layout]]></title>
            <link>https://velog.io/@p-acid/TIL-CSS-layout</link>
            <guid>https://velog.io/@p-acid/TIL-CSS-layout</guid>
            <pubDate>Wed, 01 Sep 2021 15:58:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>CSS 레이아웃</strong>에 대한 내용으로 <strong><code>Box-model</code>, <code>display</code> , <code>flex</code>, <code>position</code>등에 대한 내용</strong>을 포함하고 있습니다. 😊</p>
</blockquote>
<h1 id="css-layout-🧩">CSS layout 🧩</h1>
<p><img src="https://images.velog.io/images/p-acid/post/63a566fa-4ff3-4693-8981-9fa1a8f230ad/tetris.gif" alt=""></p>
<p><strong>레이아웃(layout)</strong>은 출판, 건축 등의 분야에서 <strong>시각적 효과</strong>나 <strong>사용 목적</strong>을 고려하여 <strong>구성·배열</strong>하는 등의 일이라는 사전적 정의를 갖는데, 이와 유사하게 <strong>CSS의 레이아웃</strong>은 <strong>알맞은 위치에 요소들을 배열</strong>하는 것이다. 레이아웃이 별도로 지정되지 않은 상태에서는 <strong>normal flow(일반 대열)</strong>로 배치된다. </p>
<h3 id="💡-normal-flow일반-대열">💡 normal flow(일반 대열)</h3>
<blockquote>
<p><strong>normal flow(일반 대열)</strong>란 <strong>CSS를 적용하지 않을 경우</strong>, 웹페이지 요소가 배치되는 방식을 의미한다. 보다 나은 웹페이지는 <strong>normal flow</strong> 상태에서 읽는 것이 가능하고, <strong>견고하고 구조화 된 문서</strong>로 시작하는 것이다.
</br>normal flow 상태에서 읽기 가능하다는 점은 <strong>기능이 제한된 브라우저에서 사용에 무리가 없거나</strong>, 페이지 콘텐츠를 소리 내 읽는 <strong>스크린 리더와 같은 기능을 사용하는 유저들에게 이를 가능케 하는(readable)</strong> 콘텐츠를 만들 수 있다는 것이다.
</br>그렇기에 <strong>레이아웃 변경</strong>에 있어서도 최대한 <strong>normal flow에 맞춰 협력 함</strong>이 지향된다.</p>
</blockquote>
<p></br>이러한 레이아웃을 이해하기 위해 기본적으로 <strong>각 요소에 대한 영역이 어떻게 설정되는 지</strong>에 대해 알아보자.</p>
<h2 id="box-model-📦">Box model 📦</h2>
<p><img src="https://images.velog.io/images/p-acid/post/e59e2e38-134e-48b3-b96a-2a519d7c817a/image.png" alt=""></p>
<p><strong>Box model(박스 모델)</strong>은 문서 레이아웃 계산에서 <strong>각각의 요소를 사각형 박스</strong>로 표현하는 것이다. 
</br>박스 모델은 개발자 도구를 통해 위와 같이 확인할 수 있고, 안쪽에서 부터, <strong>콘텐츠(contents), 패딩(<code>padding</code>), 보더(<code>border</code>), 마진(<code>margin</code>)</strong>에 대한 영역을 정의하고 있다. 각 영역을 간단하게 정의하면 다음과 같다.
</br></p>
<ul>
<li><strong>콘텐츠 영역(content area)</strong> : 
글이나 이미지, 비디오 등 실제 내용을 포함하는 영역. </li>
<li><strong>안쪽 여백 영역(padding area)</strong> : 콘텐츠 영역과 테두리 영역 사이의 내부 영역으로, 콘텐츠 영역을 요소 안쪽 여백까지 포함하는 크기로 확장.</li>
<li><strong>테두리 영역(border area)</strong> : 안쪽 여백 영역과 바깥 여백 영역을 구분하는 영역</li>
<li><strong>바깥 여백 영역(margin area)</strong> : 테두리 영역 밖의 영역</li>
</ul>
<p></br>이렇게 박스 모델을 통해 <strong>각 요소가 특정 위치에서 얼마 만큼의 크기를 차지할 수 있는 지</strong>를 지정할 수 있다. </p>
<p></br>이제 박스 모델에 대한 지식을 바탕으로 HTML 태그의 <code>display</code> 에 대한 내용을 <code>block</code> 과 <code>inline</code> 등의 개념과 함께 알아보자.
</br></p>
<h2 id="display-🖥️"><code>display</code> 🖥️</h2>
<p><img src="https://images.velog.io/images/p-acid/post/a48be68f-5095-4d50-ba33-305c4260e8bc/image.png" alt=""></p>
<p>HTML 작성 이후, 위 사진 같이 요소 이동을 위해 <strong><code>display</code></strong> 값을 설정할 필요가 있다. CSS의 <strong><code>display</code></strong>란 <strong>요소가 어떻게 표시될 지</strong>에 대해 선택하는 속성이다. 이를 통해 앞에서 언급한 normal flow 속에서 요소가 위치하는 방식을 변경할 수 있다.
</br><code>display</code> 는 당연히도 <strong>속성 값</strong>에 따라 그 요소의 표시 형식을 결정하기에, 이어서 해당 속성 값 중 대표적인 값에 대해 알아보자.
</br></p>
<h3 id="block"><code>block</code></h3>
<p></br><strong><code>block</code></strong> 은 해당 요소를 블록 요소로 지정하며, 블록 요소에 대한 내용은 다음과 같다.
</br></p>
<ul>
<li>기본 값으로 <strong>가로 영역을 전부 차지</strong>하며, 다른 요소들과 구분될 때 <strong>줄바꿈</strong>이 발생한다.</li>
<li><strong>크기 변경(<code>width</code>, <code>height</code>, <code>margin</code>, <code>padding</code>)</strong>이 가능하다.</li>
<li><strong><code>&lt;div&gt;</code> , <code>&lt;p&gt;</code> , <code>&lt;h1&gt;</code></strong> 등의 태그가 이에 해당한다.</br>

</li>
</ul>
<p><img src="https://images.velog.io/images/p-acid/post/7c868db1-ed22-442f-b033-e8b35ded933a/block_element.png" alt=""></p>
<pre><code class="language-css">div {
    background-color: red; /* 영역 구분을 위함 */
    width: 300px;
    height: 300px;
    margin: 100px;
    padding: 30px;
}</code></pre>
<p></br>임의의 <code>&lt;div&gt;</code> 태그에 CSS를 적용한 예시이다. 예시와 같이 <code>width</code> 값 부터 시작해서 <code>padding</code> 값 까지 원활하게 적용된 모습이다.
</br></p>
<h3 id="inline"><code>inline</code></h3>
<p></br><strong><code>inline</code></strong> 값은 해당 요소를 <strong>인라인 요소</strong>로 지정하며, 인라인 요소에 대한 내용은 다음과 같다.
</br></p>
<ul>
<li>기본 값으로 <strong>내부 콘텐츠의 영역만</strong>을 차지한다.</li>
<li><strong>줄바꿈</strong>이 이루어지지 않고, <strong>이어서 작성된다.</strong></li>
<li><strong>크기 변경</strong>이 불가능하다. (<code>width</code> 와 <code>height</code> 는 미적용. <code>padding</code> 은 전 방향 적용되고, <code>margin</code> 은 <code>right</code> , <code>left</code> 만)</br>

</li>
</ul>
<p><img src="https://images.velog.io/images/p-acid/post/d2d185d1-260e-48ac-b2ce-57592c0cfe95/span.png" alt=""></p>
</br>

<pre><code class="language-css">body {
    padding-top: 30px;
}

span {
    background-color: red;
    width: 300px;
    height: 300px;
    margin: 100px;
    padding: 30px;
}</code></pre>
<p></br>임의의 <code>&lt;span&gt;</code> 태그에 CSS를 적용한 예시다. 모든 요소는 위에서 설명한 바와 같이 적용되지만, <code>padding</code> 의 경우 <code>top</code> , <code>bottom</code> 은 <strong>해당 영역을 정의하지만 차지하지는 않는다.</strong>
</br></p>
<h3 id="💡-inline-의-margin-의-특징">💡 <code>inline</code> 의 <code>margin</code> 의 특징</h3>
<blockquote>
<p><code>inline</code> 의 <code>margin-top</code> 과 <code>margin-bottom</code> 의 경우 해당 영역을 정의하지만 차지하지는 않는다는 표현을 사용했는데, 이는 위 코드에서 <code>body</code> 태그에 들어간 CSS 요소를 제거하면 알 수 있다.
</br>위 예시의 경우엔 <code>body</code> 에 <code>padding-top</code> 을 통해 최상단에 여백을 준 상태인데, 해당 여백이 사라지면 <code>span</code> 요소의 윗 쪽 패딩 부분이 사라진 것으로 보인다.
</br>이는 해당 영역을 정의는 하지만, 다른 요소를 밀어내지 않는다는 의미로 차지하지 않는다고 정의하였다.
</br><a href="https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/The_box_model">박스 모델에 대한 MDN</a> 내용을 보면, 박스의 외부 디스플레이 유형이 <code>inline</code> 일 경우를 설명하는 부분에서 이처럼 정의되어 있다. 
</br><strong>&quot;패딩과 여백, 테두리는 다른 인라인 박스들이 다른 박스로부터 멀어지지게 하지 않습니다.</strong>&quot;
</br>적용 결과 모든 방향의 패딩이 아닌, <code>padding-right</code> 와 <code>padding-left</code> 의 경우엔 해당 영역을 차지하는 것으로 확인되었다. 아래 예시의 경우엔, <code>span</code> 내부에 <code>span</code> 태그를 삽입하여 별도의 클래스를 부여한 뒤, 해당 클래스 요소에만 위와 같은 CSS 요소를 추가했다.
<img src="https://images.velog.io/images/p-acid/post/f1949075-1f58-4d01-8e7a-c4bb6891ea36/padding_side.png" alt=""></p>
</blockquote>
<pre><code class="language-html">...
&lt;body&gt;
    &lt;span&gt;&lt;span class = &#39;span&#39;&gt;aaaaaaaa&lt;/span&gt;
      aaaaaaaa&lt;/br&gt;aaaaaaaa&lt;/span&gt;
&lt;/body&gt;
...</code></pre>
</br>

<h3 id="inline-block"><code>inline-block</code></h3>
<p></br><strong><code>inline-block</code></strong>은 <code>inline</code> 과 <code>block</code> 의 중간 형태이며 다음과 같은 특징을 갖는다.
</br></p>
<ul>
<li>기본 값으로 <strong>내부 콘텐츠의 영역만</strong>을 차지한다.</li>
<li><strong>줄바꿈</strong>이 이루어진다.</li>
<li><strong>크기 변경(<code>width</code>, <code>height</code>, <code>margin</code>, <code>padding</code>)</strong>이 가능하다. </li>
</ul>
<p><img src="https://images.velog.io/images/p-acid/post/e320398e-72cc-449c-b5d3-87a97c0966a4/inline-block.png" alt=""></p>
<pre><code class="language-css">.span {
    display: inline-block;
    background-color: red;
    width: 300px;
    height: 300px;
    padding: 30px;
}</code></pre>
<p></br> 위 <code>inline</code> 의 <code>margin</code> 에 대한 내용에서 나왔던 예시에서 <code>display</code> 값을 <code>inline-block</code> 으로 변경한 예시다. 보이는 바와 같이 클래스가 지정된 요소에 대해서 <code>width</code> 와 <code>height</code> 에 대한 부분이 명확히 정의되어 있고, <code>padding</code> 에 대해서도 명확히 적용된 것을 알 수 있다. 
</br>이처럼 <strong>크기 변경의 영역에서 <code>block</code> 과 같은 기능</strong>을 갖는다.
</br></p>
<h3 id="flex"><code>flex</code></h3>
<p></br><strong><code>flex</code></strong> 는 <strong>1차원 상의 요소들을 배치할 때</strong> 편리하게 사용할 수 있는 속성 값이다. 이를 배열하고자 하는 요소들의 <strong>부모(container)요소</strong>에 적용하면 동시에 모든 직계 자식들이 <code>flex</code> 항목이 된다. 이후 여러 속성 값을 통해, 해당 요소들을 자유롭게 배열할 수 있다는 점이 편리하다는 것이다.
</br>이어서 <code>display : flex</code> 와 함께 사용하는 속성과 값들에 대해 알아보자. </p>
<h4 id="justify-content"><code>justify-content</code></h4>
<p><strong>가로선 상의 정렬</strong>을 정의</p>
<ul>
<li>flex-start : 요소들을 컨테이너의 왼쪽으로 정렬</li>
<li>flex-end : 요소들을 컨테이너의 오른쪽으로 정렬</li>
<li>center : 요소들을 컨테이너의 가로선 상 가운데로 정렬</li>
<li>space-between : 요소들 사이에 동일한 간격</li>
<li>space-around : 요소들 주위에 동일한 간격</br>

</li>
</ul>
<h4 id="align-items"><code>align-items</code></h4>
<p><strong>세로선 상의 정렬</strong>을 정의</p>
<ul>
<li>flex-start : 요소들을 컨테이너의 최상단으로 정렬</li>
<li>flex-end : 요소들을 컨테이너의 최하단으로 정렬</li>
<li>center : 요소들을 컨테이너의 세로선 상 가운데로 정렬</li>
<li>baseline: 요소들을 컨테이너의 시작 위치에 정렬</li>
<li>stretch: 요소들을 컨테이너에 맞도록 늘림</br>

</li>
</ul>
<h4 id="flex-direction"><code>flex-direction</code></h4>
<p>컨테이너 내부에서 <strong>요소들의 정렬 방향</strong>을 정의</p>
<ul>
<li>row: 요소들을 텍스트의 방향과 동일하게 정렬</li>
<li>row-reverse: 요소들을 텍스트의 반대 방향으로 정렬</li>
<li>column: 요소들을 위에서 아래로 정렬</li>
<li>column-reverse: 요소들을 아래에서 위로 정렬</br>

</li>
</ul>
<h4 id="order"><code>order</code></h4>
<p>컨테이너 <strong>각 요소의 순서를 바꿀 수 있음</strong></p>
<ul>
<li>기본 값은 <strong>0</strong>이며, 양수나 음수로 변경 가능</li>
<li>해당 위치 기준으로 얼마나 움직일지를 정의</br>

</li>
</ul>
<h4 id="flex-wrap--flex-flow"><code>flex-wrap</code> &amp; <code>flex-flow</code></h4>
<p><strong><code>flex-wrap</code></strong> 은 요소의 정렬에서 줄 구분의 유무를 정의하고, <strong><code>flex-flow</code></strong> 는 <code>flex-wrap</code> 과 <code>flex-direction</code> 을 합쳐 두 값을 동시에 대입(<code>flex-flow : [direction] [wrap]</code>)한다.</p>
<ul>
<li>nowrap: 모든 요소들을 한 줄에 정렬</li>
<li>wrap: 요소들을 여러 줄에 걸쳐 정렬</li>
<li>wrap-reverse: 요소들을 여러 줄에 걸쳐 반대로 정렬(줄 시작 기준이 바뀜)</br>

</li>
</ul>
<h4 id="align-content"><code>align-content</code></h4>
<p><strong>여러 줄 사이의 간격</strong>을 지정</p>
<ul>
<li>flex-start: 여러 줄들을 컨테이너의 꼭대기에 정렬</li>
<li>flex-end: 여러 줄들을 컨테이너의 바닥에 정렬</li>
<li>center: 여러 줄들을 세로선 상의 가운데에 정렬</li>
<li>space-between: 여러 줄들 사이에 동일한 간격을 둠</li>
<li>space-around: 여러 줄들 주위에 동일한 간격을 둠</li>
<li>stretch: 여러 줄들을 컨테이너에 맞도록 늘림</br>


</li>
</ul>
<h3 id="grid"><code>grid</code></h3>
<p></br><code>flex</code> 가 1차원 레이아웃을 위한 것이라면, <strong><code>grid</code></strong> 는 <strong>2차원 레이아웃</strong>을 위한 것이다. 행과 열을 기준으로 요소들을 배열하는 것이다.
</br><code>grid</code> 는 다음과 같은 속성들을 사용하여 요소들을 배열할 수 있다.
</br></p>
<ul>
<li><code>grid-template-columns</code> : 열의 갯수와 크기를 정의</li>
<li><code>grid-template-rows</code> : 행의 갯수와 크기를 정의</li>
<li><code>grid-gap</code> : 요소 간 간격을 정의</li>
</ul>
</br>

<p><img src="https://images.velog.io/images/p-acid/post/e015d6cf-9488-43a2-81c0-26c2ebfdd75c/grid1.png" alt=""></p>
<pre><code class="language-html">&lt;div class=&quot;wrapper&quot;&gt;
    &lt;div class=&quot;box1&quot;&gt;하나&lt;/div&gt;
    &lt;div class=&quot;box2&quot;&gt;둘&lt;/div&gt;
    &lt;div class=&quot;box3&quot;&gt;셋&lt;/div&gt;
    &lt;div class=&quot;box4&quot;&gt;넷&lt;/div&gt;
    &lt;div class=&quot;box5&quot;&gt;다섯&lt;/div&gt;
    &lt;div class=&quot;box6&quot;&gt;여섯&lt;/div&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">.wrapper {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows: 100px 100px;
    grid-gap: 10px;
}</code></pre>
<p></br>또한, 자식 요소들에 대해 CSS 값을 부여하여 <strong>각 요소의 면적에 대해 정의</strong>할 수도 있다.
</br></p>
<p><img src="https://images.velog.io/images/p-acid/post/756ea140-5d77-4bf8-b1b8-997a426e4d46/grid2.png" alt=""></p>
<pre><code class="language-html">&lt;div class=&quot;wrapper&quot;&gt;
    &lt;div class=&quot;box1&quot;&gt;하나&lt;/div&gt;
    &lt;div class=&quot;box2&quot;&gt;둘&lt;/div&gt;
    &lt;div class=&quot;box3&quot;&gt;셋&lt;/div&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">.wrapper {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows: 100px 100px;
    grid-gap: 10px;
}

.box1 {
    grid-column: 2 / 4;
    grid-row: 1;
}

.box2 {
    grid-column: 1;
    grid-row: 1 / 3;
}

.box3 {
    grid-row: 2;
    grid-column: 3;
}</code></pre>
<p></br> 위와 같이 <code>grid-row</code> 와 <code>grid-column</code> 을 통해, 각 요소가 차지하는 영역을 정의하여 <code>grid</code> 내 비율을 조정할 수 있다. </p>
</br>

<h2 id="position--🚶"><code>position</code>  🚶</h2>
<p><img src="https://images.velog.io/images/p-acid/post/5e78e0a3-1b84-4981-86fc-83c5576c2da2/gifntext-gif.gif" alt=""></p>
<p><strong><code>position</code></strong> 은 <strong>문서 상에 요소를 배치하는 방법</strong>을 의미한다. <code>position</code> 속성 값의 기준이 되는 중요한 요소 중 하나는 <strong>문서의 흐름을 따르는 지에 대한 여부</strong>일 것이다. 해당 부분에 집중하며 <code>position</code> 속성 값에 대해 알아보자.
</br></p>
<h3 id="static"><code>static</code></h3>
<p></br><strong><code>static</code></strong> 은 <code>position</code> 의 <strong>기본 값</strong>으로, 요소를 <strong>일반적인 문서 흐름에 따라 배치</strong>하는 것을 의미한다. <code>static</code> 의 경우에는 <code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>, <code>z-index</code> 속성들의 영향을 받지 않는다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/e327c0d5-1f70-4692-a661-12449a5fa58a/image.png" alt=""></p>
<p>위 경우 <code>top</code> 속성에 값을 대입했지만, 결과로 반영되지 않은 모습이다.
</br></p>
<h3 id="relative"><code>relative</code></h3>
<p></br><strong><code>relative</code></strong> 는 위와 같이 문서의 흐름은 따르지만, <strong>자신의 위치를 기준</strong>으로 <code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>, <code>z-index</code> 속성들에 따라 <strong>요소의 위치가 변경될 수 있다.</strong></p>
<p><img src="https://images.velog.io/images/p-acid/post/4e2b7aee-3fb8-4897-a662-ec1f77d33e57/image.png" alt=""></p>
<p><code>static</code> 과 같은 <code>top</code> 값을 할당했지만, <code>relative</code> 의 경우 요소의 위치가 변경되었다. 여타 값이 주어지지 않으면 <code>relative</code> 또한 <code>static</code> 과 같은 기능을 한다.
</br>그리고 <code>relative</code> 의 경우에 자신의 위치를 기준으로 하기 때문에 <strong>다른 요소의 위치에 영향을 주지 않는다는 점</strong>이 중요하다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/61712fff-126d-41c9-bdaa-3fe97542786c/image.png" alt=""></p>
<p>위와 같이 <code>body</code> 에 요소를 추가해도 문서의 흐름에 따라 정해진 자신의 위치에서만 움직이기 때문에 다른 요소의 위치에 영향을 주지 않는다. 또한, 그렇기에 <strong>요소가 겹칠 수 있다는 점</strong>을 유의해야 한다. 위 경우엔 <code>top</code> 값으로 마이너스 값을 대입한다면 요소가 겹칠 수 있다.</p>
</br>

<h3 id="absolute"><code>absolute</code></h3>
<p></br><strong><code>absolute</code></strong> 는 일반적인 <strong>문서 흐름을 따르지 않고 제외된다.</strong> 그리고 <strong>가장 가까운 조상 요소</strong>에 대해 상대적으로 배치한다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/e7a485fc-d2a8-4e5a-81c9-7fe0c2c512f0/image.png" alt=""></p>
<p>위 경우 가장 가까운 조상 요소인 <code>first div</code> 를 기준으로 <code>absolute div</code> 가 <code>top : 100px</code> 의 위치 함을 알 수 있다.
</br>위 예시에서 <code>second-div</code> 가 사라져도 <code>absolute</code> 의 위치에는 변함이 없지만, <strong><code>first div</code> 가 사라질 경우</strong> 그 다음 가까운 조상 요소인 <strong><code>second-div</code> 를 기준으로 위치하게 된다.</strong>
</br>만약 조상 요소가 존재하지 않는다면, <strong><code>body</code> 를 기준으로</strong> 위치를 움직인다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/8f13c868-3fcd-4aec-930c-9b971bfcf458/image.png" alt=""></p>
<h3 id="fixed"><code>fixed</code></h3>
<p></br><strong><code>fixed</code></strong> 도 <code>absolute</code> 와 마찬가지로 <strong>문서의 흐름에서 제외되지만</strong>, <code>fixed</code> 의 경우 <strong>스크린 뷰포트를 기준으로</strong> 한 위치에서 배치되며, <strong>스크롤 되어도 움직이지 않는다.</strong></p>
<h3 id="💡-뷰포트viewport">💡 뷰포트(viewport)</h3>
<blockquote>
<p>디스플레이 상의 <strong>표시 영역</strong>을 의미하며, 간단하게 웹페이지가 <strong>브라우저 화면에서 실제로 표시되는 영역</strong>을 의미한다.
</br>뷰포트에 대한 사항은 <code>head</code> 태그에서 <code>meta</code> 태그를 통해 설정할 수 있다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/p-acid/post/04ce6212-7a62-4007-ad62-3bb1a1e261a1/snapScroll.gif" alt=""></p>
<p>위 예시를 보면 상단 메뉴에 해당하는 텍스트 요소들이 스크롤이 진행 됨에도 고정되어 있는 것을 알 수 있다. <code>fixed</code> 값을 사용하면 해당 요소와 같이 요소를 배치할 수 있다.</p>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Learn/CSS/CSS_layout/Introduction">CSS layout : MDN Web Docs : CSS 레이아웃 입문서</a>
<a href="https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/The_box_model">CSS box model : MDN Web Docs : 상자 모델</a>
<a href="https://developer.mozilla.org/ko/docs/Web/CSS/position">CSS position : MDN Web Docs : position</a>
<a href="https://medium.com/@yeon22/css-css-position-%EC%84%A4%EB%AA%85-f2c0a0b26556">CSS Position : Suyeon Bak님 medium : (CSS) CSS Position 설명
</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Web : 브라우저 작동 원리]]></title>
            <link>https://velog.io/@p-acid/TIL-CS-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9E%91%EB%8F%99-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@p-acid/TIL-CS-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%9E%91%EB%8F%99-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Wed, 25 Aug 2021 07:19:10 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>브라우저 작동 원리에 대한 내용으로 <strong>브라우저 기본 구조, 렌더링 엔진</strong> 등에 대한 내용을 포함하고 있습니다! 😊</p>
</blockquote>
<h1 id="프롤로그-🤓">프롤로그 🤓</h1>
<p><img src="https://images.velog.io/images/p-acid/post/54d58844-acbe-4bef-b9ad-a94209066bec/%EA%B6%81%EA%B8%88%ED%95%98%EB%84%A4%EC%A7%A4.gif" alt=""></p>
<p>이번 학습은 사전스터디 학습에서 <strong><code>script</code> 태그의 위치에 따른 주의점</strong>에 대해 발표하기 위한 공부를 하다 <strong>브라우저의 작동 원리</strong>에 대해 알아보면서 더 깊게 알아보고자 작성하게 됐다.
</br>이번 학습을 진행하면서 <strong>CS 지식이 풍부할 때, 웹 브라우저 성능 향상에 있어 큰 도움이 된다는 사실</strong>을 다시금 깨달았고, 앞으로 궁금한건 정리하여 기록하자고 생각했다. <del>(물론 노오력을 하겠다는 뜻이다...^^)</del>
</br></p>
<blockquote>
<p>앞으로 나올 내용들은 2011년도에 발행된 이스라엘 개발자 <strong>탈리 가르시엘(Tali Garsiel)</strong>의 <a href="https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/">How Browsers Work: Behind the scenes of modern web browsers</a> 의 내용을 <strong>네이버 D2</strong>에서 번역한 <a href="https://d2.naver.com/helloworld/59361">브라우저는 어떻게 동작하는가?</a> 라는 포스팅을 참고하면서 작성한 포스팅이다.</p>
</blockquote>
</br>

<h1 id="브라우저-주요-기능과-웹-표준-🖥️">브라우저 주요 기능과 웹 표준 🖥️</h1>
</br>

<h2 id="브라우저-주요-기능">브라우저 주요 기능</h2>
</br>

<ul>
<li><strong>브라우저의 주요 기능</strong>은 사용자가 <strong>선택한 자원을 서버에 요청</strong>하고 <strong>브라우저에 표시</strong>하는 것이다.</li>
<li><strong>자원의 형태</strong>는 보통 <strong>HTML 문서</strong>지만 <strong>PDF나 이미지 등 다른 형태</strong>일 수도 있다.</li>
<li>자원의 주소는 <strong>URI(Uniform Resource Identifier)</strong>에 의해 정해진다.</br>

</li>
</ul>
<h2 id="웹-표준에-대하여">웹 표준에 대하여</h2>
</br>

<ul>
<li><strong>웹 표준</strong>의 존재는 어떤 운영체제나 브라우저를 사용하더라도 <strong>동일하게 보이고, 정상적으로 작동</strong>하기 위함을 의미한다.</li>
<li>과거 웹 표준을 일부만 따르던 시절에는 웹 제작자가 <strong>심각한 호환성 문제</strong>를 겪었지만, 최근 대부분의 브라우저가 <strong>표준 명세를 따른다.</strong></li>
<li>2019년 기준, <strong>HTML과 DOM의 표준 개발 권한이 W3C에서 WHATWG 에게 념겨졌고</strong>, WHATWG의 <strong>Living Standard</strong>를 명세 표준으로 삼기로 했다. 이에 대한 내용은 <a href="https://zdnet.co.kr/view/?no=20190531184644">&quot;둘로 나뉜 웹 표준, 하나로 합쳐진다&quot;</a> 라는 해당 기사를 참고하면 된다.</br>

</li>
</ul>
<h1 id="브라우저의-기본-구조-📝">브라우저의 기본 구조 📝</h1>
<p></br>브라우저의 기본 구조는 다음과 같이 구성된다.</p>
<p><img src="https://images.velog.io/images/p-acid/post/a4c55b13-ae54-4827-80a8-e6e85852dab2/browser_structure.png" alt=""></p>
<ul>
<li><strong>사용자 인터페이스</strong> : 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등 <strong>요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분</strong>이다. <strong>사용자와 상호 작용하는 매개체</strong>를 의미한다.</li>
<li><strong>브라우저 엔진</strong> : 사용자 인터페이스와 렌더링 <strong>엔진 사이를 연결하여 동작을 제어</strong>하는 엔진</li>
<li><strong>렌더링 엔진</strong> : <strong>요청한 콘텐츠를 표시</strong>하는 엔진. <strong>HTML과 CSS를 파싱</strong>하여 <strong>화면에 표시</strong>한다.</li>
<li><strong>통신</strong> : HTTP 요청과 같은 <strong>네트워크 호출에 사용</strong>. </li>
<li><strong>UI 백엔드</strong> : 콤보박스와 창, 체크박스, 버튼과 같은 <strong>기본적인 위젯(장치)</strong>을 그림</li>
<li><strong>자바스크립트 해석기</strong> : <strong>자바스크립트 코드를 해석하고 실행</strong>해주는 인터프리터</li>
<li><strong>자료 저장소</strong> : <strong>자료 저장 계층</strong>. 쿠키 저장과 같이 모든 종류의 자원을 하드디스크에 저장할 필요가 있다.</li>
</ul>
<p></br>위 구조에서 브라우저 마다 구분되는 <strong>렌더링 엔진</strong>에 대해 알아본다.
</br></p>
<h2 id="렌더링-엔진-⚙️">렌더링 엔진 ⚙️</h2>
<p></br><strong>렌더링 엔진</strong>은 HTML, CSS, JavaScript 등 <strong>요청 내용을 브라우저 화면에 표시하는 기능</strong>을 한다. 이 과정에서 다양한 브라우저의 <strong>렌더링 방식이 다르기 때문에, 크로스 브라우징 이슈 혹은 성능 차이가 발생</strong>하기도 한다.
</br></p>
<h3 id="렌더링-엔진들">렌더링 엔진들</h3>
<p></br>대표적인 렌더링 엔진으로 <strong>오픈소스 브라우저</strong>에 해당하는 <strong>파이어폭스와 사파리, 크롬의 렌더링 엔진</strong>을 알아본다. 각각의 렌더링 엔진은 다음과 같다.
</br></p>
<ul>
<li><strong>파이어폭스</strong> : <strong>게코(Gecko)</strong> - 모질라 재단에서 만든 레이아웃 엔진</li>
<li><strong>사파리</strong> : <strong>웹키트(Webkit)</strong> - KTHML에서 파생된 레이아웃 엔진</li>
<li><strong>크롬</strong> : <strong>블링크(Blink)</strong> - 웹키트에서 파생된 레이아웃 엔진</li>
</ul>
<p></br>위와 같은 렌더링 엔진 중, <strong>블링크</strong>를 예시로 들어 <strong>렌더링 엔진의 작동 과정</strong>을 설명한다.
</br></p>
<h3 id="작동-과정">작동 과정</h3>
<p></br>렌더링 엔진은 웹 서버로 부터 전달받은 HTML 문서를 맨 처음 네트워크 레이어에서 불러온 뒤, 아래와 같은 과정을 거친다.
</br></p>
<ul>
<li><strong>DOM Tree / CSSOM Tree 생성</strong>
: <strong>HTML</strong>을 <strong>파싱</strong>하여 <strong>DOM Tree</strong>를 구성하고, <strong>CSS</strong>를 <strong>파싱</strong>하여 <strong>CSSOM Tree</strong>를 구성한다. </li>
<li><strong>Render Tree 생성</strong>
: 두 트리를 합쳐 <strong>Render Tree</strong>를 생성</li>
<li><strong>Render Tree 배치(reflow/layout)</strong>
: 뷰포트의 <strong>정확한 위치</strong>에 각 <strong>노드를 표시</strong></li>
<li><strong>Render Tree 그리기</strong>
: Render  Tree의 각 노드를 가로지르며 형상을 그림</br>

</li>
</ul>
<h3 id="💡-파싱parsing">💡 파싱(<code>parsing</code>)</h3>
<blockquote>
<p>컴퓨터 과학에서 <strong>파싱</strong>의 정의는 일련의 문자열에 있는 <strong>의미있는 토큰(token)으로 분해</strong>하고 이들로 이루어진 <strong>파스 트리(parse tree)를 만드는 과정</strong>이라고 정의되어 있다.
</br>현재 렌더링 엔진에서 말하는 <strong>DOM Tree</strong>와 <strong>CSSOM Tree</strong>의 경우에는 각각 HTML과 CSS를 파싱하여 만든 결과물이다. 
</br>HTML의 경우, 각 요소를 <strong>DOM(Document object model) 노드</strong>로 변환하여 Tree 구조를 만들어 DOM Tree를 생성한다. 
<img src="https://images.velog.io/images/p-acid/post/b228af9d-2b49-4bc8-a92f-5c6f9b93fb05/image.png" alt="">
CSS의 경우에는 HTML 대신 CSS에 대해 DOM 프로세스를 진행하며 <strong>CSSOM(CSS Object Mode)</strong>도 트리 구조를 가지고, <strong>cascading rule</strong>에 따라 스타일을 세분화한다. 
<img src="https://images.velog.io/images/p-acid/post/7cfbb080-5a09-4620-999d-3183b40af247/image.png" alt=""></p>
</blockquote>
</br>

<h3 id="💡-렌더-트리render-tree">💡 렌더 트리(Render Tree)</h3>
<blockquote>
<p>위에서 언급한 HTML의 파싱이 이루어지고 DOM Tree가 형성된 후, CSS를 파싱하여 <strong>DOM Tree와 CSSOM을 합쳐 렌더 트리를 만든다.</strong> 
<img src="https://images.velog.io/images/p-acid/post/814c7014-9243-44e1-b4a1-3498258c1712/image.png" alt="">
<strong>렌더 트리</strong>는 <strong>시각적 요소가 어떻게 나타날지</strong>를 정한다. 렌더 트리를 생성하기 위한 과정은 다음과 같다.</p>
</blockquote>
<ul>
<li>DOM Tree의 루트에서 시작해서 <strong>노드 각각을 읽으며 표시</strong>
▶️ <strong>메타 태그</strong>나 <strong>스크립트 태그</strong> 등의 노드는 표시되지 않는다.
▶️ 일부 노드는 <strong>CSS를 통해 숨겨지며 렌더 트리에서도 생략</strong>이 된다. 예를 들어, <code>span</code> 노드에 <code>display : none</code> 속성을 설정하면 렌더 트리에서 누락(<code>visible : hidden</code> 은 레이아웃에서 공간을 차지하므로, 앞의 예시와는 다르다.)</li>
<li><strong>표시된 각 노드에</strong> 대해 적절하게 일치하는 <strong>CSSOM 규칙을 찾아 적용</strong>한다.</li>
<li>표시된 노드를 <strong>콘텐츠 및 계산된 스타일과 함께 내보낸다.</strong></li>
</ul>
</br>

<h1 id="브라우저의-성능-최적화-✅">브라우저의 성능 최적화 ✅</h1>
<p></br>앞에서 배운 브라우저의 작동 방식에 대한 이해를 했다면, <strong>브라우저의 성능 최적화</strong>에 대한 주제를 다룰 수 있다.
</br></p>
<h2 id="crpcritical-rendering-path">CRP(Critical Rendering Path)</h2>
<p></br><strong>CRP(Critical Rendering Path)</strong>란 <strong>중요 렌더링 경로</strong>로 브라우저가 HTML, CSS, Javascipt를 화면에 픽셀로 변화하는 일련의 단계를 말하며 <strong>이를 최적화하는 것은 렌더링 성능을 향상</strong>시킨다. 사용자가 브라우저에 URL을 입력한 후, 브라우저는 다음과 같은 작업을 수행한다.
</br></p>
<ul>
<li>브라우저가 서버에게 <strong>HTML 파일을 요청하고 서버는 응답</strong>한다.<strong>(request/response)</strong></li>
<li>서버에게 받은 <strong>HTML 파일을 로딩</strong>한다.<strong>(loading)</strong></li>
<li>HTML을 한줄 한줄씩 읽어서 <strong>DOM과 CSSOM으로 변환</strong>한다.<strong>(scripting)</strong></li>
<li>DOM과 CSSOM을 결합하여 <strong>렌더 트리를 형성</strong>한다.<strong>(rendering)</strong></li>
<li>각 노드의 <strong>치 및 크기 계산</strong>한다.<strong>(layout)</strong></li>
<li>화면의 <strong>픽셀로 변환</strong>한다.<strong>(painting)</strong></li>
</ul>
<p></br>위 과정을 카테고리화 하면 다음과 같다.
</br></p>
<ul>
<li><strong>Construction Part</strong> : <strong>DOM Tree 생성 ~ Render Tree 생성</strong>
: 브라우저가 이해할 수 있는 <strong>브라우저만의 언어로 바꾸는 작업</strong> 파트</li>
<li><strong>Operation Part</strong> : <strong>layout ~ composition</strong>
: <strong>Render Tree를 이용해</strong> 구조 형성 및 배치 계산을 하여 <strong>화면의 픽셀로 변환</strong>.(<strong>composition</strong>은 최종적으로 <strong>z-index</strong>에 따라 가장 높은 요소가 나중에 배치되며 <strong>우선 순위를 구분</strong>)</li>
</ul>
<p></br> 해당 파트별로 최적화를 이끌어 낼 수 있는 부분은 다음과 같다.
</br></p>
<ul>
<li><strong>Construction Part</strong> : 불필요한 태그나 콘텐츠가 있는지 확인해 본다.</li>
<li><strong>Operation Part</strong> : 초기 렌더링 시간과 이후 자바스크립트에 의해 DOM이 추가/삭제되거나, CSS 속성 값이 변경되는 경우 등을 이해하여 <strong>Paint</strong>가 자주 일어나지 않도록 한다.</li>
</ul>
<p></br>해당 부분만으로는 디테일한 이해가 부족하다. 이를 <strong>Layout</strong>과 <strong>Paint</strong> 그리고 <strong>Composite</strong>에 대한 개념을 이해하면서 알아보자.
</br></p>
<h2 id="layout--paint--composite">layout &amp; paint &amp; composite</h2>
<p></br>위에서 자바스크립트에 의해 <strong>렌더 트리가 다시 재구성되는 경우(요소 추가 및 제거나 속성 값 변경 등)</strong>가 있다고 했다. 기존에 파싱이 되었던 <strong>DOM Tree와 CSSOM Tree</strong>는 자바스크립트에 의해 그 요소의 값이 변경되어 렌더 트리가 변경될 수 있다는 말인데, 이 과정에서 단계를 분리하여 그 과정을 최소화할 수 있다. 
<img src="https://images.velog.io/images/p-acid/post/a44da84c-9a83-4ffc-a027-4b2ecab647fc/image.png" alt="">
자바스크립트로 인해 <strong>Style 이후 과정의 반복</strong>을 단계화 한 다이어그램이다. 이 과정에서 3가지로 구분되어 반복이 이루어질 수 있는데, <strong>layout 이후의 과정 진행</strong>, <strong>paint 이후의 과정 진행</strong>, <strong>composite만 이루어지는 경우</strong>가 이에 해당한다. 위 다이어그램의 경우는 <strong>Layout 이후의 과정이 진행된 경우</strong>를 보여준다. 이를 <strong>레이아웃(또는 리플로우)</strong>라고 한다.
<img src="https://images.velog.io/images/p-acid/post/cbad7f5f-f584-4d9f-9950-3b4c2b95740f/image.png" alt="">
레이아웃은 요소의 <strong>기하학적 영향(위치, 크기 등의 변화)을 주는 CSS 속성값</strong>을 변경할 때 발생하는데, 반대로 영향을 주지 않는다면 위 다이어그램 처럼 <strong>layout 과정을 스킵</strong>하고 진행한다. 이를 <strong>리페인트</strong>라고 한다.
<img src="https://images.velog.io/images/p-acid/post/a130a9fc-2546-41c4-bf4b-ea6328ad3445/image.png" alt="">
layout과 paint의 과정이 필요 없는 CSS 속성을 변경할 경우에는, 브라우저가 <strong>바로 composite 단계로 넘어간다.</strong> 위 다이어그램이 해당 사례에 해당한다.
</br>당연하게도 최소한의 과정을 포함하는 것이 부하가 적고 효율적인 운영이 가능하다. 각 CSS 요소는 렌더링 엔진마다 어느 단계를 거치는 지에 대한 차이가 존재한다. 이에 대한 내용은 <a href="https://csstriggers.com/">다음 링크</a>에서 확인할 수 있다. 이를 알맞게 적용할 때 성능 최적화를 유도할 수 있을 것이다. </p>
<h4 id="🔖-참고-및-출처">🔖 참고 및 출처</h4>
<blockquote>
<p><a href="https://d2.naver.com/helloworld/59361">브라우저 동작 원리 : NAVERD2 : 브라우저는 어떻게 동작하는가?</a>
<a href="https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/">브라우저 동작 원리 : html5rocks.com : How Browsers Work: Behind the scenes of modern web browsers</a>
<a href="https://onlydev.tistory.com/9">렌더트리 &amp; CRP : 개발 전용차선 : 렌더 트리(Render Tree), CRP(Critical Rendering Path)</a>
<a href="https://ui.toast.com/fe-guide/ko_PERFORMANCE#%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%EC%97%90-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EB%A1%A0%EA%B3%BC-%EC%B8%A1%EC%A0%95-%EB%8F%84%EA%B5%AC">성능 최적화 : TOASTUI : 성능 최적화</a>
<a href="https://developers.google.com/web/fundamentals/performance/rendering/?hl=ko">성능 최적화 : Google Developers : 렌더링 성능</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자기소개 페이지 제작(feat. 짧은 회고)]]></title>
            <link>https://velog.io/@p-acid/%EC%9E%90%EA%B8%B0%EC%86%8C%EA%B0%9C-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%A0%9C%EC%9E%91feat.-%EC%A7%A7%EC%9D%80-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@p-acid/%EC%9E%90%EA%B8%B0%EC%86%8C%EA%B0%9C-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%A0%9C%EC%9E%91feat.-%EC%A7%A7%EC%9D%80-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sat, 21 Aug 2021 14:05:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자기소개 페이지 제작 과정과, 이후의 짧은 회고를 담은 내용입니다. 😊</p>
</blockquote>
<p>HTML과 CSS에 대한 강의를 듣고, 마냥 간단할 것만 같았던 페이지 제작이었지만, 역시 <strong>인생은 실전인 것인가...</strong> 실제로 만들고 나니, 그렇게 고민하고 머리를 쥐어싸던 시간이 무색할 정도로 <strong>간단한 페이지</strong>가 완성되었다!
</br>그렇다고 코드가 깨끗한 건 아니라니는게 반전이지만, 끝내고 나니 후련한 마음도 있고, 나름 내가 대견해서 얼른 벨로그를 쓰고 싶었다.
</br><del>진짜, 깃허브 페이지 올리는거 너무 힘들었다... 페이지 만드는 것보다... 😂</del>
</br>제작 과정을 소개하기에 앞서 <strong>자기소개 페이지 링크와 해당 리포지토리 링크</strong>를 공유한다!</p>
<blockquote>
<p><a href="https://github.com/p-acid/profile">깃허브 리포지토리 링크 💻</a>
<a href="https://p-acid.github.io/profile/">자기소개 페이지 링크 💻</a> </p>
</blockquote>
</br>

<h1 id="개요-🗺️">개요 🗺️</h1>
</br>

<h4 id="제작-기간">제작 기간</h4>
<p>약 3일(21.08.19 ~ 21.08.21)</p>
<h4 id="전체적인-구상">전체적인 구상</h4>
<ul>
<li><strong>반응형 웹</strong> 구현하기<strong>(가.능.한)</strong></li>
<li><code>Snap Scroll</code> 적용</br>

</li>
</ul>
<h4 id="기술-스택">기술 스택</h4>
<p><img src="https://images.velog.io/images/p-acid/post/e07edafa-97ba-4c20-983c-7e4efb612f1e/gangrok_choi.jpg" alt=""></p>
<p><strong>&quot; <code>HTML</code> 과 <code>CSS</code></strong> 로 하겠습니다. 근데 이제 <strong>약간의 <code>JavaScript</code> 를 곁들인. &quot;</strong></p>
</br>

<h1 id="결과-및-회고-🙌🏻">결과 및 회고 🙌🏻</h1>
<h2 id="인생은-실전이다-😂">인생은 실전이다 😂</h2>
<p><img src="https://images.velog.io/images/p-acid/post/8f6ca075-407b-4ac1-aaa2-601226c8a256/CSS_meme.gif" alt=""></p>
<p>마이크 타이슨은 말했다. <strong>&quot;누구나 그럴싸한 계획을 가지고 있다. 한 대 쳐맞기 전까지는&quot;</strong>. 이게 내 이야기일지 누가 알았겠는가. <code>HTML</code> 작성할 때만 해도 희망과 행복이 가득했던 나의 자기소개 페이지 프로젝트는 <code>CSS</code> 작성과 동시에 힘들어졌다. 인터스텔라가 가능하다면 과거의 나에게 <del>&quot;강의만 보지 말고 닥치고 코드 좀 쳐 봐&quot;</del> 라고 전달하고 싶다.
</br>생각만 하는 것과 실제로 작성하는 것이 많이 괴리가 있고, 어려운 일이라는 사실을 알게 된 후, 상상으로 그려낸 다양한 기획안들은 철수시키고 <strong>나의 수준에 맞는 디자인 및 기능 구현</strong>을 목표로 다시금 구상을 했다.
</br>그렇게 위와 같은 전체적인 구상 하에 <strong>조금씩 기능을 추가하기로 결정했다.</strong></p>
<h4 id="반응형-웹-구현">반응형 웹 구현</h4>
<p><img src="https://images.velog.io/images/p-acid/post/92cf9cbb-7495-43b0-9398-bf6cb4d37e1b/Responsive_Web.gif" alt=""></p>
<h4 id="snap-scroll-적용"><code>Snap Scroll</code> 적용</h4>
<p><img src="https://thumbs.gfycat.com/AdmiredHalfBeardeddragon-size_restricted.gif" alt=""></p>
<h4 id="메뉴-이동">메뉴 이동</h4>
<p><img src="https://images.velog.io/images/p-acid/post/8048ab95-52d5-4770-885a-3f0292357b6d/menu_switch.gif" alt=""></p>
<h4 id="사진-자동-전환">사진 자동 전환</h4>
<p><img src="https://images.velog.io/images/p-acid/post/74373ee7-d936-44a3-8e86-750c583d71c7/auto_changed_pic.gif" alt=""></p>
<p>그렇게 위와 같은 기능이라면 기능인...? 것들을 구현했다.
</br><strong>반응형 웹</strong>의 경우 완벽한 구현은 못했지만, 그래도 구색 정도는 맞추고 싶어서 이래저래 시도를 해봤다. 대체로 화면 변화에 따라 바뀌는 <strong>요소들의 간격에 따라 각각의 위치를 조정</strong>해주고, 특정 구간에서 <strong>메뉴를 화면에서 없앤다는지</strong> 등의 형식으로 구현했다.
</br></p>
<pre><code class="language-css">/* 첫 번째 페이지 구간 */
@media screen and (max-width: 683px) {
    #one h3 {
        top: 25%;
        transform: translate(-50%, -25%);
    }
    .menu {
        display: none;
    }
}

@media screen and (max-height: 610px) {
    .menu {
        display: none;
    }
}

/* 두 번째 페이지 구간 */
@media screen and (max-width: 683px) {
    #two h3 {
        top: 10%;
        left: 50%;
        transform: translate(-50%, -10%);
    }

    #two .talk {
        top: 77%;
        left: 50%;
        transform: translate(-50%, -77%);
    }
}

@media screen and (max-height: 610px) {
    #two h3 {
        top: 17%;
        left: 50%;
        transform: translate(-50%, -17%);
    }

    #two .talk {
        top: 77%;
        left: 50%;
        transform: translate(-50%, -77%);
    }
}</code></pre>
<p></br><strong><code>Snap Scroll</code></strong> 은 <a href="https://www.youtube.com/watch?v=lkTpOHv1Ros">노마드 코더 님의 최신 CSS 기능 소개 영상</a>을 참고했다. 
</br></p>
<pre><code class="language-css">#container {
    width: 100%;
    height: 100vh;
    overflow: auto;
    scroll-snap-type: y mandatory; /* scroll snap */
    scroll-behavior: smooth;
}

#container .item {
    scroll-snap-align: center; /* scroll snap */
    display: inline-block;
    width: 100%;
    height: 100vh;
    display: flex;
    font-size: 38px;
    color: white;
    justify-content: center;
    align-items: center;
}</code></pre>
</br>

<p><strong>메뉴 이동</strong> 부분은 <code>a</code> 태그를 이용하여 <code>id</code> 값을 통해 위치를 이동하도록 하였다. 스터디 팀원분께서 관련 자료를 알려주셔서, 해당 자료를 참고하여 작성했다!</p>
</br>

<pre><code class="language-html">&lt;!-- a 태그에 hypertext reference id 값으로 설정 --&gt;
&lt;li&gt;&lt;a href = &quot;#one&quot;&gt;#Home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href = &quot;#two&quot;&gt;#About&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href = &quot;#three&quot;&gt;#Contact&lt;/a&gt;&lt;/li&gt;

&lt;!-- section에 id 값 부여 --&gt;
&lt;section id = &#39;one&#39; class = &#39;item&#39;&gt;
&lt;section id = &#39;two&#39; class = &#39;item&#39;&gt;
&lt;section id = &#39;three&#39; class = &#39;item&#39;&gt;</code></pre>
</br>

<p><strong>사진 자동 전환</strong> 부분이 위에서 언급한 &quot;약간의 자바스크립트&quot;가 포함된 부분으로 이 부분은 <a href="http://www.w3bai.com/ko/w3css/w3css_slideshow.html">w3bai.com</a>을 참고하여 작성하였다.
</br></p>
<pre><code class="language-javascript">var slideIndex = 0;
carousel();

function carousel() {
    var i;
    var x = document.getElementsByClassName(&quot;slide&quot;);
    for (i = 0; i &lt; x.length; i++) {
      x[i].style.display = &quot;none&quot;;
    }
    slideIndex++;
    if (slideIndex &gt; x.length) {slideIndex = 1}
    x[slideIndex-1].style.display = &quot;block&quot;;
    setTimeout(carousel, 3000); // 3초 마다 사진을 변경
}</code></pre>
<h2 id="깃허브의-역습-🐈">깃허브의 역습 🐈‍</h2>
<p><img src="https://images.velog.io/images/p-acid/post/9a075132-f60d-45db-8c3a-5645b6ba8a90/github_pushError.gif" alt=""></p>
<p>그렇게 좋다던 깃허브, 이번에 처음 접하면서 <code>push</code> 조차 몰랐던 내가 어찌저찌 노력해서 깃허브 페이지를 생성하는 쾌거를 이뤄냈다.
</br>돌아보니 그렇게 고생할 일이었나 싶지만, 당시 <code>push</code> 오류가 발생했을 때, 무지성 구글링을 통해 방법을 찾아보고, 리포지토리를 몇 번은 지우고 다시 만든 것 같다.
</br>다시 돌아보니, 그냥 <code>add</code> 도 안하고 <code>commit</code> 도 안했으며, 웹에서 커밋을 진행하면 뭔가 오류가 발생하는 것 같은데, <code>pull</code> 을 못해서 그렇게 된 것 같다. 그래도 결론적으로 사용해봤던 것에 의의를 두고! 새롭게 채워진 내 잔디가 너무 귀여웠다는...😊</p>
<h2 id="짧은-회고-💡">짧은 회고 💡</h2>
<p></br>이번 자기소개 페이지 만들기 프로젝트를 하면서, 내가 프론트엔드와 백엔드 중에 어떠한 것이 잘 어울릴지에 대해 확실하게 생각하게 되었다. 확실히 나는 미세한 마진이나 위치 조정에 집중해서 한 세월 보내는 것을 좋아하고, 결과물로 내가 생각했던 디자인의 웹이 나왔을 때, 그 만족감이 이루 말할 수 없는 것으로 보아 <strong>프론트엔드</strong>가 맞다고 확신하게 되었다.
</br>그리고 <strong>기본에 충실한 사람</strong>이 어떤 의미를 가지며, 내가 한참 부족한 사람이라는 것을 다시금 깨달았다. 솔직히 처음 시작할 때, <code>HTML</code> 과 <code>CSS</code> 를 너무 가볍게 생각하고 강의를 들으면서, 이정도면 못하는 사람이 없겠다는 생각을 했던 것 같다. 위에서도 언급했지만, 역시 <strong>단순히 배운다는 것</strong>과 이를 활용하여 <strong>실제로 적용하는 것</strong>은 많은 차이가 있었다.
</br>지금까지의 나는 시도하기를 두려워해서 지레 겁먹은 부분에 대해 시도 조차 하지 않는 경우가 다반사였다. 삶을 살아오면서 그렇게 지나간 기회들이 많았을 것이고, 그 중에는 내 인생을 바꿀 수 있는 기회들도 여럿 존재했을 것이다. 그렇게 지나가면서 이번에 새롭게 개발자의 길을 선택한 것은 두려움을 이겨내고 얻은 소중한 기회라고 생각한다. 끈기 없게 놓았던 여러 기회나, 두려움에 포기했던 순간들과 다르게 만족할만할 결과물을 만들어 내도록 방심하지 않고 꾸준히 노력하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] HTML : Semantic]]></title>
            <link>https://velog.io/@p-acid/TIL-HTML-Semantic-Tag</link>
            <guid>https://velog.io/@p-acid/TIL-HTML-Semantic-Tag</guid>
            <pubDate>Sun, 15 Aug 2021 15:50:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>HTML 시맨틱 웹과 시맨틱 태그에 대한 내용입니다. 😊</p>
</blockquote>
<h1 id="📑-시맨틱semantic-개론">📑 시맨틱(<code>Semantic</code>) 개론</h1>
<p><img src="https://images.velog.io/images/p-acid/post/8363cc3d-2485-4253-8b85-2952c530dcd8/gifntext-gif.gif" alt=""></p>
<p>HTML 공부를 하다보면, <strong>시맨틱 태그</strong>에 대한 내용을 꼭 마주하게 된다. 이전에, HTML 태그를 공부하면서</p>
<blockquote>
<p>전부 <code>&lt;div&gt;</code> 로 작성해도 작동이 되는데, <strong>굳이 다른 태그들이 필요한건가?</strong></p>
</blockquote>
<p>문득 이런 생각이 들었는데, 역시 이유 없이 존재하는 태그는 없다 이말이다. 매번 이유에 집착하게 만드는 나로써는 <strong>시맨틱 웹(<code>Semantic Web</code>)과 시맨틱 태그(<code>Semantic Tag</code>)</strong>는 좋은 집착의 대상이 되기에 충분했다. 그렇게 공부할 기회가 생긴다면, 포스팅을 작성하면서 이를 정리하고 싶었는데 오늘이 그 날이다.
</br>사실 지금 당장에 필요한 내용은 아닐 수도 있지만, 시맨틱 태그의 경우 습관을 잘못 들이면, 이를 바꾸는 것이 많이 힘들 것 같다 싶어 <strong>기초를 탄탄하게 하자</strong>는 취지로 먼저 작성하게 되었다!
</br>우선 <strong>시맨틱(<code>Semantic</code>)</strong>의 정의는 &quot;의미론적인, 의미의&quot;라는 뜻을 가진다. 해당 정의에서 유추해 볼 수 있는 시맨틱 웹과 시맨틱 태그의 의미는 <strong>의미있는 웹, 의미있는 태그</strong> 정도일 것이다.
</br>그렇다면 의미있다는 것은 무슨 의미일까? 자 이제 <strong>시맨틱 웹과 태그에 대해 <em>Araboza</em>.</strong>
</br></p>
<h2 id="🌐-시맨틱-웹semantic-web">🌐 시맨틱 웹(<code>Semantic Web</code>)</h2>
<p><img src="https://images.velog.io/images/p-acid/post/18bb51f6-b5f6-48e0-a905-eb574daf0501/www_tim%20(1).jpg" alt=""></p>
<p>웹 기술의 발전은 인터넷을 실생활까지 확산되는 결과를 이뤄냈지만, 축적되는 정보 속에서 <strong>불필요한 정보</strong> 또한 우후죽순으로 늘어났다. 그리고 그러한 정보들은 <strong>정보 검색 시 정보 홍수를 가중</strong>시켜, 올바른 <strong>데이터를 검색하는데 문제를 발생시켰다.</strong> 
</br> 그런 문제들에 대해 2001년 팀 버너스리 등에 의해 제시된 웹 기술의 비전이 <strong>시맨틱 웹(<code>Semantic Web</code>)</strong>인 것이다. <strong>시맨틱 웹</strong>이란 컴퓨터가 이해할 수 있는 잘 정의된 의미를 기반으로 <strong>의미적 상호운용성(<code>semantic interoperability</code>)</strong>을 실현하여, 다양한 <strong>정보 자원의 처리 자동화</strong>, 데이터의 통합 및 재사용 등을 컴퓨터가 스스로 수행하여, <strong>인간과 컴퓨터 모두 잘 이해할 수 있는 웹</strong>이다.</p>
<blockquote>
<p>간단히 말하자면 검색 과정에서 <strong>좀 더 정확한 정보를 가져오는 좋은 웹</strong>이라는 것이다!</p>
</blockquote>
<p>그렇다면 왜 시맨틱 웹은 <strong>검색 과정에서 이점을 가질까?</strong> 이에 대한 내용을 <strong>검색 엔진 최적화(SEO : <code>Search Engine Optimization</code>)</strong>에 대한 개념과 함께 간단히 알아보자</p>
<h3 id="💡-검색-엔진-최적화seo와-시맨틱-웹">💡 검색 엔진 최적화(SEO)와 시맨틱 웹</h3>
<blockquote>
<p><strong>검색 엔진 최적화(SEO)</strong>란 검색 엔진으로부터 웹사이트나 웹페이지에 대한 <strong>웹사이트 트래픽의 품질과 양을 개선하는 과정</strong>이라고 정의된다. 웹사이트는 검색 엔진 상단에 노출되는 것이 중요하고, <strong>검색 엔진 최적화의 여부</strong>는 이를 결정하는데 그 기준이 될 수 있다는 것이다.
</br>검색 엔진은 <strong>로봇(Robot)</strong>이라는 프로그램을 통헤 <strong>크롤링</strong>을 진행하여 다수의 <strong>웹사이트 정보를 수집</strong>하고, 수집한 데이터를 <strong>키워드 색인</strong>을 통해 가공하여 사용한다. 이 과정에서 컴퓨터는 <strong>어떠한 데이터가 강조된 데이터 인지 구분하지 못한다.</strong> 그렇기에, 컴퓨터 입장에서 <strong>시맨틱 웹</strong>은 보다 <strong>명확히 데이터를 전달하는 친절한 웹</strong>인 것이다.
</br>명확한 의미 인지는, 웹을 더 <strong>의미있는 데이터를 포함한 웹</strong>으로 만들고, 이는 검색 엔진 최적화의 측면에서도 <strong>효율적</strong>이다.</p>
</blockquote>
<p>HTML으로 작성된 문서는, <strong>메타데이터</strong>와 <strong>자연어</strong>가 뒤섞여 있고 이에 대해 <strong>개발자의 의도가 명확히 전달되면서 작성된 웹</strong>이 시맨틱 웹이라고 할 수 있다.
</br></p>
<h2 id="🔗-시맨틱-태그semantic-tag">🔗 시맨틱 태그(<code>Semantic Tag</code>)</h2>
<p><img src="https://images.velog.io/images/p-acid/post/2643b9be-3560-4cc3-8b8e-9a7532242588/be_comfortable_div.jpg" alt=""></p>
<p>그렇기 때문에, 우리는 <code>&lt;div&gt;</code>를 남발하지 않고, 명확한 의미를 부여하는 <strong>시맨틱 태-그</strong>에 대해 인지하고 <strong>적재적소에 사용해야 하는 것</strong>이다.</p>
<blockquote>
<p>그렇다면, <strong>&quot;나는 검색 엔진 상단에 위치할 필요 없으니깐, <code>&lt;div&gt;</code> 로 도배하고 작동만 하게 할래요  🤪&quot;</strong> 라고 생각할 수도 있으시겠다.</p>
</blockquote>
<p>하지만, 시맨틱 태그는 단순히 웹 검색 엔진 상단에 위치하기 위해서만 사용하는 것이 아니다.
</br><strong>시맨틱 태그(<code>semantic tag</code>)</strong>란 <strong>개발자와 브라우저 모두에게 의미를 주는 태그</strong>라고 할 수 있다. 시맨틱 태그가 존재하듯이 <strong>논 시맨틱 태그(<code>non-semantic tag</code>)</strong> 또한 존재한다. 대표적으로 우리가 밥먹듯이 사용하는 <strong><code>&lt;div&gt;</code></strong>가 이에 해당한다. 
</br></p>
<ul>
<li><strong>시맨틱 태그(<code>semantic tag</code>)</strong> : <code>&lt;table&gt;</code>, <code>&lt;article&gt;</code> 등</li>
<li><strong>논 시맨틱 태그(<code>non-semantic tag</code>)</strong> : <code>&lt;div&gt;</code>, <code>&lt;span&gt;</code> 등</li>
</ul>
<p></br>시맨틱 태그의 경우, <code>content</code> 에 대한 설명을 명확히 포함하지만, 반대의 경우에는 이를 포함하지 않는 태그라고 할 수 있다.</p>
<h3 id="시맨틱-태그의-이유">시맨틱 태그의 이유</h3>
<blockquote>
<p>시맨틱 태그의 사용을 비유하자면, 물을 마시는 행위를 냄비나 그릇을 사용하여 할 수 있지만, <strong>컵을 이용하여 마시는 것이 적절한 것</strong>과 비슷하다.</p>
</blockquote>
<p>이를 간단한 예시와 함께 알아보자.
</br></p>
<pre><code class="language-html">&lt;!-- in HTML --&gt;
&lt;em&gt;Hello&lt;/em&gt;
&lt;i&gt;Hello&lt;/i&gt;
&lt;!-- 텍스트가 기울어지는 결과를 똑같이 출력 --&gt;</code></pre>
<p></br>위 두 줄의 코드는 똑같이 <code>Hello</code> 라는 텍스트가 <strong>기울어진 형태로 출력</strong>된다. 출력 결과에 대해서 사람들은 같은 내용이라고 인식하겠지만, <strong>컴퓨터의 경우에는 이를 다르게 인식한다.</strong>
</br>앞의 <strong><code>&lt;em&gt;</code> 태그</strong>는 <strong>강조된 텍스트(<code>emphasized text</code>)</strong>를 의미하며 <strong>태그 안의 <code>content</code> 를 강조</strong>하는 의미를 갖고, 이어지는 <strong><code>&lt;i&gt;</code> 태그</strong>의 경우에는 단순히 텍스트를 <strong>기울임꼴로 표시하는 기능</strong>을 가진 태그이다.
</br>만약, 내가 <code>content</code> 를 강조하고자 하는 목적으로 태그를 사용한다면 화면 상으로 같은 결과를 보이지만, 브라우저에게 명확히 이를 강조하겠다고 의미를 부여하는 <strong><code>&lt;em&gt;</code> 태그를 사용함이 효과적일 것이다.</strong>
</br>이렇게, 브라우저로 하여금 의미있는 데이터를 제공받게 되면, <strong>웹 접근성(Web Accessibility)</strong> 측면에서도 다른 일반 웹들과 비교하여 우위를 갖게 된다.
</br>브라우저는 <strong>의미있는 데이터</strong>를 받을 때, 이를 <strong>가공하고 전달하는 과정에서 좀 더 효율적인 결과물을 만들어 낼 수 있기에</strong> 시맨틱 태그는 이러한 측면에서도 중요성을 알 수 있다.</p>
<h3 id="💡-웹-접근성web-accessibility">💡 웹 접근성(Web Accessibility)</h3>
<blockquote>
<p>웹 접근성의 정의는 신체 및 정신적 <strong>장애의 유무와 관계 없이 모든 사람들이 웹사이트를 이용할 수 있는 것</strong>을 말한다. 
</br>장애라는 요소를 특정 짓긴 했지만, 웹 접근성은 장애를 갖지 않은 사람에게도 이점이 있다.
</br>예를 들어, 팔이 부러지거나 안경을 잃어버리는 등의 과정에서 <strong>&quot;일시적 장애&quot;를 겪는 사람들</strong>에게나, 밝은 햇빛, 시끄러운 소리 등의 <strong>환경적 요소로 인해 상황적 제약을 겪는 사람</strong> 등이 이에 해당할 수 있다.</p>
</blockquote>
<p>마지막으로, 코드를 작성하는 <strong>우리를 위한 것</strong>이기도 하다. 
</br>만약, <strong>모든 코드가 <code>&lt;div&gt;</code> 태그로 구성되어 있다면</strong>, 작동은 원활히 하겠지만, 직접 보기에 <strong>직관적으로 이해되는 느낌</strong>이 있다면 그건 아마 시맨틱 태그로 작성된 부분일 것이다.
</br><code>&lt;div&gt;</code> 태그로 작성할 경우 이를 <code>id</code> 로 구분하거나 <code>class</code> 명을 통해 구분하는데, 코드 작성 길이가 길어질 수록 불편함에 대한 체감이 더 커진다고 한다.
</br>협업의 측면에서도 <strong>서로가 이해하기 쉬운 코드를 작성하는 것</strong>은 중요한 부분일 것이고, <strong>유지 및 보수에 용이하고, 가독성이 높은 코드</strong>를 작성하고 싶다면 시맨틱 태그로 코드를 작성하도록 하자! 😊
</br>그렇게 시맨틱 태그로 작성해야 하는 이유를 정리하면 다음과 같다.
</br></p>
<ul>
<li><strong>검색 엔진 최적화(SEO : Search Engine Optimization)</strong></li>
<li><strong>웹 접근성(Web Accessibility)</strong></li>
<li><strong>유지 보수 및 가독성</strong></li>
</ul>
<blockquote>
<p><strong>SEO와 시맨틱 태그의 연관성을 확인</strong>하기 위해 작성하신 <a href="https://velog.io/@seongkyun/Semantic-Tag%EB%8A%94-SEO%EC%97%90-%EC%98%81%ED%96%A5%EC%9D%84-%EB%AF%B8%EC%B9%A0%EA%B9%8C">seongkyun님의 포스트</a>를 보면, 시맨틱 태그가 웹에 어떤 영향을 주는 지에 대해 조금 더 체감 될 것이다.</p>
</blockquote>
<p></br>지금까지 시맨틱 웹과 태그에 대해 간단히 알아봤으니, 이제 그 예시에 대해 간단히 알아보자.
</br></p>
<h3 id="시맨틱-태그들">시맨틱 태그들</h3>
<p><img src="https://images.velog.io/images/p-acid/post/4b7ffeeb-e577-4993-8d2d-c7225d45c0a0/SemanticVSNonSemantic-Diagram.svg" alt=""></p>
<p>위 다이어그램을 보면, <strong><code>&lt;div&gt;</code> 태그 만을 사용한 코드</strong>와 <strong>시맨틱 태그를 사용한 코드</strong>가 직관적으로 어떻게 차이가 나는지 인지할 수 있다.
</br>각 요소를 최상단부터 해당 다이어그램에 존재하지 않는 시맨틱 태그까지 정리해보도록 하자.</p>
<h4 id="header-and-nav"><code>header</code> and <code>nav</code></h4>
<p><strong><code>header</code></strong> 는 대체로 <strong>웹페이지 상단 정보 영역</strong>을 의미하고, <strong><code>nav</code> 태그</strong> 는 <strong>페이지의 네비게이션 영역</strong>을 지정한다. 네비게이션 영역에 자주 쓰이는 예제로 <strong>메뉴, 목차, 색인 등</strong>이 이에 해당한다.</p>
<h4 id="main"><code>main</code></h4>
<p><strong><code>main</code></strong> 은 위에서 언급한 <code>header</code> 영역과 구분되어, HTML 문서 <code>body</code> 영역의 <strong>주요 컨텐츠나 핵심적인 내용을 포함하는 영역</strong>이다. 
</br>이어서 설명할  <code>article</code> 이나, <code>section</code> 등의 영역이 포함되기도 하는 영역이다.</p>
<h4 id="article-and-section"><code>article</code> and <code>section</code></h4>
<p><strong><code>article</code></strong> 은 신문 기사 하나와 같이 <strong>독립적인 콘텐츠 영역을 의미</strong>하며, 예시로 <strong>게시판과 블로그 글, 매거진이나 뉴스 기사 등</strong>이 이에 해당한다. 
</br><strong><code>section</code></strong> 은 본문 영역의 <strong>연관성 있는 여러 영역들을 감싸는 용도</strong>로 사용 가능하다. 일반적인 섹션을 정의할 때 사용하고 <strong>주로 제목 요소(<code>h1</code> ~ <code>h6</code>)를 포함하는 경우</strong>가 많다.
</br>위 예시처럼 <code>article</code> 영역의 주황색 부분이 <code>section</code> 이 되어 구성될 수도 있고, 반대로 <code>section</code> 이 <code>article</code> 영역을 감쌀 수도 있다.</p>
<h3 id="💡-article-vs-section">💡 <code>&lt;article&gt;</code> vs <code>&lt;section&gt;</code></h3>
<blockquote>
<p><code>article</code> 에 대해 자세히 설명하자면, 다른 페이지에서 보여져도 이해하는데 문제 없고, <strong><code>main</code> 안의 다른 정보들 필요 없이 고유하게 독립적인 정보를 나타낼 수 있는 부분</strong>을 <code>article</code> 로 지정한다. 
</br>콘텐츠가 사이트에 포함된 <strong>독립적인 섹션의 성향이 크다면</strong>, <code>section</code> 대신 <strong><code>article</code></strong> 을 사용 함이 맞다.</p>
</blockquote>
<h4 id="aside"><code>aside</code></h4>
<p><strong><code>aside</code></strong> 는 문서 주요 내용과 직접적인 관련은 없지만, <strong>부가적인 정보나 주 내용과 간접적으로 연관된 부분</strong>을 나타낸다. 주로 <strong>사이드바 혹은 콜아웃 박스</strong> 등으로 나타난다.</p>
<h4 id="figure-and-figcaption"><code>figure</code> and <code>figcaption</code></h4>
<pre><code class="language-HTML">&lt;!-- figure &amp; figcaption structure --&gt;
&lt;figure&gt;
    &lt;img&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</code></pre>
<p><strong><code>figure</code></strong> 은 <strong>이미지나 비디오, 코드 등과 같은 자료</strong>를 포함할 수 있는 영역이다. <strong><code>figcaption</code></strong> 은 부모 <code>figure</code> 태그에 포함된 <strong>자료의 설명이나 범례</strong> 등에 해당하며, <code>figure</code> 태그 안에 포함된다.</p>
<h4 id="ul--ol--dl"><code>ul</code> &amp; <code>ol</code> &amp; <code>dl</code></h4>
<pre><code class="language-HTML">&lt;!-- ul &amp; ol &amp; dl structure --&gt;

&lt;ul&gt; &lt;!-- or ol --&gt;
  &lt;li&gt;item1&lt;/li&gt;
  &lt;li&gt;item2&lt;/li&gt;
&lt;/ul&gt;

&lt;dl&gt;
  &lt;dt&gt;description term&lt;/dt&gt;
  &lt;dd&gt;description detail&lt;/dd&gt;
&lt;/dl&gt;</code></pre>
<p><strong><code>ul</code></strong> 의 경우 <strong>순서가 없는 리스트(<code>Unordered list</code>)</strong>를 나열할 때 사용하고, <strong><code>ol</code></strong> 의 경우 <strong>순서가 있는 리스트(<code>Ordered list</code>)</strong>를 나열할 때 사용하며, 두 태그 모두 <strong><code>li</code></strong> 를 사용하여 <strong>목록 요소</strong>들을 표현한다.
</br><strong><code>dl</code></strong> 은 <strong>설명 목록(<code>description list</code>)</strong>을 나타낼 때 사용하며, <strong><code>dt</code></strong> 로 <strong>설명할 단어(<code>description term</code>)</strong>를 표현하고, <strong><code>dd</code></strong> 에 <strong>설명 내용(<code>description detail</code>)</strong>을 작성한다.</p>
<h4 id="button-and-a"><code>button</code> and <code>a</code></h4>
<p><strong><code>button</code></strong> 은 클릭 가능한 <strong>버튼 요소</strong>를 의미하고, <strong><code>a</code></strong> 는 <strong><code>href</code></strong> 특성을 통해 다른 페이지나 같은 페이지의 <strong>어느 위치로 이동할 수 있는 하이퍼링크</strong>를 만든다.</p>
<h3 id="💡-button-vs-a">💡 <code>button</code> vs <code>a</code></h3>
<blockquote>
<p><code>button</code> 과 <code>a</code> 는 CSS로 똑같이 이를 꾸몄을 때, 같은 외형을 갖지만 용도를 다르게 해야 한다.
</br>우선 <code>button</code> 의 경우에는 눌렀을 때 <strong>특정한 행동이 실행되는 경우</strong>에 사용한다. 예를 들어, <strong>로그인 버튼이나 가입</strong> 등과 같은 기능이 이에 해당한다.
</br><code>a</code> 의 경우에는 위에서 언급한 하이퍼링크에 대한 내용과 같이 <strong>특정 링크로 이동하고자 할 때</strong>에 사용하는 것이 효과적이다.</p>
</blockquote>
<h4 id="footer"><code>footer</code></h4>
<p><strong><code>footer</code></strong> 는 주로 <strong>웹페이지 하단</strong>에 해당하는 영역으로, 일반적으로 <strong>작성자, 관련 문서, 저작권 정보 등의 내용</strong>이 포함된다.</p>
</br> 

<blockquote>
<p>이외에도 많은 시맨틱 태그가 있기에 차차 사용해보면서 추가로 정리할 예정 😊</p>
</blockquote>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<p><a href="https://velog.io/@bining/html">시맨틱 태그 : bining님 벨로그 : [html] 시맨틱 태그(sementic tag)</a>
<a href="https://eunsukimme.github.io/html/2019/12/18/Semantic-Web/">시맨틱 태그 : Codesigner&#39;s Dev Story : Semantic HTML(시맨틱 HTML) 이란?</a></p>
</blockquote>
<h4 id="🔖-전체적인-참고">🔖 전체적인 참고</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/">각각의 시맨틱 태그 : MDN Web Docs</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript : Object]]></title>
            <link>https://velog.io/@p-acid/TIL-JavaScript-Object</link>
            <guid>https://velog.io/@p-acid/TIL-JavaScript-Object</guid>
            <pubDate>Fri, 13 Aug 2021 12:27:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 객체와 구성 요소, 접근 방법 등의 내용을 포함하고 있습니다. 😊</p>
</blockquote>
<h1 id="👥-자바스크립트의-객체">👥 자바스크립트의 객체</h1>
<p>프로그래밍에서 <strong>객체(<code>Object</code>)</strong>는 자주 사용되고 언급되는 요소 중 하나인데, 자바스크립트에서 객체는 <strong>관련된 함수와 데이터의 집합</strong>으로 정의할 수 있다.
</br>여기서 생각나는 가장 가까운 기억은 <strong>객체 지향 프로그래밍(OOP)</strong>이 아닐까 싶다. 자바스크립트는 <strong>객체 지향 프로그래밍 언어</strong>이며 <strong>스크립트 언어</strong>에 속한다.</p>
<h3 id="💡-절차적-프로그래밍procedural-programming과-객체-지향-프로그래밍object-oriented-programming">💡 절차적 프로그래밍(<code>Procedural Programming</code>)과 객체 지향 프로그래밍(<code>Object Oriented Programming</code>)</h3>
<blockquote>
<p>프로그래밍에서 무엇을 지향한다는 것은 <strong>특정 방식에 대한 패러다임</strong>이라고 해석할 수 있다. 그리고 앞으로 설명할 두 가지 방식이 <strong>반대되는 방식</strong>이 아님을 인지해야 한다.
</br>앞에서 의미한 지향의 의미로 해석하면, <strong>절차적 프로그래밍(<code>Procedural Programming</code>)</strong>을 절차 지향적인 방법(순차적인 명령 수행)으로 프로그래밍을 한다고 생각할 수 있지만, 이 부분은 <strong>번역상의 오류</strong>로 다뤄진다. 절차적이지 않은 프로그래밍을 생각할 수 없는 부분에서 이를 알 수 있다.
</br>정확히 말하자면, <strong>절차적 프로그래밍</strong>에서 절차적(<code>procedural</code>)이라는 뜻은 <strong>프로시저</strong>에 대한 이야기다. 프로시저에 대해 간단히 이해하면 <strong>특정 업무를 수행하기 위한 과정</strong>라고 생각하면 편하다.
</br>그런 의미에서 절차적 프로그래밍은 <strong>특정 업무 수행을 위한 과정에 따라 차례대로 코드를 기술하는 방식</strong>이라고 이해할 수 있다. 그렇기에 <strong>Top-Down</strong> 방식으로 설계되고, 컴퓨터의 처리구조와 유사하여 빠른 처리 속도를 갖고 있다. 대표적인 언어로는 <strong>C</strong>가 이에 해당한다.
</br>과거에는 비교적 큰 규모의 하드웨어와 소프트웨어가 필요하지 않아 절차적 언어가 대표적인 언어였지만, 코드의 규모가 커지고 복잡해져 동작을 이해하기에 어려운 상태의 <strong>&#39;스파게티 코드&#39;</strong>가 되어버리는 단점이 생겨났다. 이러한 문제 극복을 위해 <strong>객체 지향 프로그래밍</strong>이 등장한 것이다.
</br><strong>객체 지향 프로그래밍(<code>Object Oriented Programming</code>)</strong>은 객체를 생성하고, 해당 <strong>객체 단위의 상호 작용을 서술하는 방식</strong>을 의미한다. 객체 지향 프로그래밍은 처리 속도가 상대적으로 느리지만, <strong>캡슐화(<code>Encapsulation</code>)와 상속(<code>inheritance</code>), 다형성(<code>polymorphism</code>)</strong>이라는 키워드와 장점을 설명할 수 있다.
</br>우선, <strong>캡슐화(<code>Encapsulation</code>)</strong>는 <strong>객체의 속성과 행위를 하나로 묶고, 실제 구현 내용을 은닉</strong>한다는 의미를 갖는다. 여기서 은닉은 <strong>접근 제한자</strong>를 통해 이루어질 수 있다. 그리고 <strong>상속(<code>inheritance</code>)</strong>은 상위 객체와 하위 객체의 관계에서 <strong>하위 객체가 상위 객체의 필드 및 메소드를 사용할 수 있게 물려준다</strong>는 의미이다. 마지막으로, <strong>다형성(<code>polymorphism</code>)</strong>은 <strong>하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다</strong>는 것이다. 이는 <strong>오버라이딩(<code>Overriding</code>)과 오버로딩(<code>Overloading</code>)</strong>이 가능하다는 의미다.
</br>자바스크립트는 이 중 <strong>객체 지향 프로그래밍</strong>에 해당한다.</p>
</blockquote>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://programmingnote.tistory.com/14?category=801790">절차적 프로그래밍 : 마녀표정님 Tistory : 1. 절차적 프로그래밍 : Procedural Programming</a>
<a href="https://ddit-jhkim.tistory.com/entry/%EC%A0%88%EC%B0%A8%EC%A0%81-%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">절차적 프로그래밍 &amp; 객체 지향 프로그래밍 : Young Developer&#39;s Note : 절차적 프로그래밍과 객체 지향 프로그래밍</a>
<a href="https://yongbba.tistory.com/18">절차적 프로그래밍 &amp; 객체 지향 프로그래밍 : 코딩과 프로그래밍 그 사이 어딘가... : 객체지향 프로그래밍(OOP) 절차적 프로그래밍(PP)</a>
<a href="https://st-lab.tistory.com/151">절차적 프로그래밍 &amp; 객체 지향 프로그래밍 : Stranger&#39;s Lab : 객체지향(OOP)과 절차적 프로그래밍(PP)</a>
<a href="https://jeong-pro.tistory.com/95">객체 지향 프로그래밍 : 기본기를 쌓는 정아마추어 코딩블로그 : 객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)</a>
<a href="https://mjn5027.tistory.com/47">프로시저(<code>Procedure</code>) : 애송이의 코딩이야기 : [ Oracle ] 프로시저와 함수의 차이</a></p>
</blockquote>
</blockquote>
<h3 id="💡-스크립트-언어script-language">💡 스크립트 언어?(<code>Script Language</code>)</h3>
<blockquote>
<p><strong>스크립트 언어(<code>Script Language</code>)</strong>란 <strong>응용 소프트웨어를 제어</strong>하는 컴퓨터 프로그래밍 언어를 가르킨다. 이는 이미 존재하는 소프트웨어를 제어하기 위한 언어라는 뜻이다. 
</br>스크립트 언어에 대해 찾다보면 연관된 내용으로 <strong>컴파일 언어</strong>와 <strong>인터프리터 언어</strong>에 대한 내용을 많이 찾게 된다.
</br>컴파일 언어와 인터프리터 언어를 간단하게 설명하자면, 컴파일러는 <strong>소스코드를 모두 기계어로 변환</strong>한 뒤 실행하는 언어를 의미하고, 인터프리터는 <strong>소스코드 한 줄씩 해석</strong>하여 바로 명령어를 실행하는 언어를 의미한다.
</br>정의에 따르면, 스크립트 언어는 <strong>인터프리터 언어</strong>에 해당하는 것으로 이해되지만, <a href="https://stackoverflow.com/questions/30139235/are-all-scripting-languages-interpreted">모든 스크립트 언어는 인터프리터 언어에 해당하는지에 대한 질문</a>을 보면 컴파일 되지만, 스크립트로도 실행 가능한 부분도 있다고 생각된다.</p>
</blockquote>
<h4 id="🔖-출처-1">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%96%B8%EC%96%B4">스크립트 언어 : 위키백과</a>
<a href="https://runcoding.tistory.com/10">스크립트 언어 &amp; 인터프리터 &amp; 컴파일러 : 런코딩 : [자바스크립트] 스크립트언어 / 인터프리터와 컴파일러 차이점</a>
<a href="https://velog.io/@damiano1027/CS-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%96%B8%EC%96%B4-vs-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%96%B8%EC%96%B4">스크립트 언어 &amp; 컴파일 언어 : damiano1027님 벨로그 : [CS] 스크립트 언어 vs 컴파일 언어</a></p>
</blockquote>
</blockquote>
<p></br>자바스크립트가 객체 지향 프로그래밍 언어에 속하기에 객체에 대한 이해는 자바스크립트를 사용하기 위해 필요한 과정으로 생각된다.
</br>이전 <a href="https://velog.io/@p-acid/TIL-Javascript-Basics">자바스크립트 기초</a>에 대한 포스팅에서 기본 타입을 제외한 나머지 데이터가 모두 <strong>객체</strong>에 해당한다.</p>
<h2 id="객체의-프로퍼티property">객체의 프로퍼티(<code>Property</code>)</h2>
<blockquote>
<p><strong>객체</strong>는 <strong>프로퍼티의 집합</strong>이다.</p>
</blockquote>
<p><strong>프로퍼티(<code>Property</code>)</strong>란 객체를 이루는 단위이다. 프로퍼티는 <strong>키(<code>key</code>)와 값(<code>value</code>)</strong>로 구성되어 있고, 프로퍼티 <strong>키</strong>를 통해 각 <strong>프로퍼티를 식별</strong>할 수 있다. 
</br>위 내용들을 예시를 통해 알아보자.
</br></p>
<pre><code class="language-javascript">let obj = {
  firstName : &#39;Acid&#39;,
  lastName : &#39;Park&#39;,
  age : 24
}</code></pre>
<p></br>위 예시는 객체를 생성하는 객체 리터럴 문법이다. 위와 같이 <strong>중괄호(<code>{}</code>)</strong>를 열고 안에 키와 값을 <strong>콜론(<code>:</code>)</strong>을 기준으로 구분하여 작성하며, 프로퍼티 간의 구분은 <strong>콤마(<code>,</code>)</strong>를 통해 구분한다.
</br>위 예시에서 키는 <code>firstName</code> 과 <code>lastName</code>, <code>age</code> 가 이에 해당하고, 값은 <code>&#39;Acid&#39;</code>, <code>&#39;Park&#39;</code> 그리고 <code>24</code> 등이 이에 해당한다.
</br>프로퍼티 값에는 모든 자료형이 들어올 수 있고 배열과 함수도 가능한데, 값이 함수일 경우 이를 <strong>메소드(<code>Method</code>)</strong>라고 정의한다.</p>
<h3 id="💡-메소드method와-함수function의-차이">💡 메소드(<code>Method</code>)와 함수(<code>Function</code>)의 차이</h3>
<blockquote>
<p>함수와 메소드의 관계는 <strong>함수가 더 포괄적인 의미</strong>를 갖는다고 이해할 수 있다.
</br>둘의 차이를 간단히 설명하면, <strong>함수</strong>의 경우에는 <strong>독립적이고</strong>, <strong>메소드</strong>의 경우 객체에 <strong>종속적이다.</strong> 
</br>이를 간단한 예시로 이해해보자.
</br></p>
</blockquote>
<pre><code class="language-javascript">// 함수
function func() {
  console.log(&#39;Hello, World!&#39;)
}
// 메소드
let obj = {
  method : function () {
    console.log(&#39;Hello, World!&#39;)
  }
}
func() // 함수 호출
obj.method() // 메소드 호출</code></pre>
<p></br>위 두 가지 경우는 같은 값을 출력한다. 하지만, 함수는 독립적으로 자신의 함수명(<code>func()</code>)만으로 실행이 되지만, 객체(<code>obj</code>)에 종속된 메소드(<code>method</code>)의 경우 <code>obj</code> 를 통해 실행된다.
</br>이러한 부분이 <strong>메소드가 객체에 종속된다</strong>는 점을 의미한다.</p>
<h4 id="🔖-출처-2">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://sustainable-dev.tistory.com/33">메소드와 함수 : 지속가능한 개발 블로그 : 메소드와 함수 (Method and Function)의 차이점</a></p>
</blockquote>
</blockquote>
<p></br>객체를 구성하는 프로퍼티는 다음과 같은 방법으로 접근할 수 있다.</p>
<h3 id="프로퍼티-접근법">프로퍼티 접근법</h3>
<p>프로퍼티에 접근하는 것은 <strong>점 표기법(Dot notation)과 괄호 표기법(Bracket notation)</strong>을 통해 가능하다.
</br>두 가지 방식을 통해, 다음과 같이 프로퍼티에 접근할 수 있다.
</br></p>
<pre><code class="language-javascript">let obj = {
  firstName : &#39;Acid&#39;,
  lastName : &#39;Park&#39;,
  age : 24
}

console.log(obj.firstName) // 점 표기법
console.log(obj[&#39;firstName&#39;]) // 괄호 표기법</code></pre>
<p></br>위 두 가지 방식은 같은 결과를 출력한다. 하지만 <strong>프로퍼티 식별자</strong>에서 차이를 보인다.
</br><strong>점 표기법</strong>의 경우 알파벳으로 시작하며, 공백을 포함하지 못하고, 숫자로도 시작할 수 없다. 하지만 <strong>괄호 표기법</strong>의 경우 문자열 형태를 가지며, 공백을 포함할 수 있고, 변수 또한 문자열로 해석된다면 사용할 수 있다.
</br>점 표기법이 비교적 읽기 쉽고, 작성하기 더 편하기 때문에 자주 사용하지만, 특수한 경우에는 괄호 표기법이 더 용이할 수 있다.
</br>예를 들어, 조건에 따라 다른 프로퍼티에 접근해야 하는 경우가 있다.
</br></p>
<pre><code class="language-javascript">let obj = {
  name1 : &#39;David&#39;,
  name2 : &#39;Robert&#39;
}

function func(n) {
  let result = n === 0 ? &#39;name1&#39; : &#39;name2&#39;
  return result
}

console.log(obj[func(1)])</code></pre>
<p></br>해당 경우 <code>&#39;Robert&#39;</code> 라는 값이 출력되는 것을 확인할 수 있다. 이렇게 괄호 표기법을 사용하면 함수의 인자 값에 따라 <strong>유동적으로 다른 프로퍼티에 접근</strong>할 수 있다.
</br>프로퍼티에 접근하는 방법을 알아보았으니, 이어서 프로퍼티 추가와 변경 및 제거에 대해 알아보자.
</br></p>
<h3 id="프로퍼티-추가-변경-삭제">프로퍼티 추가, 변경, 삭제</h3>
<p>프로퍼티의 추가와 변경은 위 <strong>두 가지 접근법</strong>을 통해 가능하다.
</br></p>
<pre><code class="language-javascript">let obj = {
  name1 : &#39;David&#39;,
  name2 : &#39;Robert&#39;
}

obj.name3 = &#39;Tom&#39; // 점 표기법 추가
obj[&#39;name4&#39;] = &#39;Duke&#39; // 괄호 표기법 추가

console.log(obj.name3, obj.name4) // output : &#39;Tom&#39; &#39;Duke&#39;

obj.name3 = &#39;Kim&#39; // 점 표기법 수정
obj[&#39;name4&#39;] = &#39;Park&#39; // 괄호 표기법 수정

console.log(obj.name3, obj.name4) // output : &#39;Kim&#39; &#39;Park&#39;</code></pre>
<p></br>위와 같이 점 표기법과 괄호 표기법을 활용하여 프로퍼티의 추가와 변경이 가능하다.
</br><strong>괄호 표기법</strong>의 경우에는 동적으로 프로퍼티를 추가할 수 있다.
</br></p>
<pre><code class="language-javascript">const obj = {

};

[&#39;red&#39;, &#39;green&#39;, &#39;blue&#39;].forEach((color) =&gt; {
  obj[color] = color.substring(0, 1);
});

console.log(obj)
/* output : [object Object] {
  blue: &quot;b&quot;,
  green: &quot;g&quot;,
  red: &quot;r&quot;
} */</code></pre>
<p></br>해당 예시의 경우 배열 내 요소들을 <code>forEach()</code> 메서드를 통해 순환하면서, 배열 내 요소들을 각각 프로퍼티 키로 가져오고, <code>substring()</code> 메서드를 활용하여 요소의 앞 글자만 추출하여 프로퍼티 값으로 저장하는 예시이다.
</br>위와 같이 <strong>파라미터 값을 활용하여</strong> 동적으로 프로퍼티를 추가할 수 있다.
</br>프로퍼티의 <strong>삭제</strong>는 배열 요소의 삭제와 같이 <strong><code>delete</code> 연산자</strong>를 사용하여 가능하다. 
</br></p>
<pre><code class="language-javascript">let obj = {
  name1 : &#39;David&#39;,
  name2 : &#39;Robert&#39;
}

delete obj.name1

console.log(obj) // output : [object Object] { name2: &quot;Robert&quot; }</code></pre>
<p></br>위 예시와 같이 <code>delete</code> 연산자를 통해 프로퍼티의 삭제를 진행할 수 있다.</p>
<h3 id="객체와-forin-문">객체와 <code>for...in</code> 문</h3>
<p>앞의 <a href="https://velog.io/@p-acid/TIL-JavaScript-Loop">반복문에 대한 포스팅</a>에서도 다룬 내용이지만 객체에 대해 알았으니, 다시 한 번 짚고 넘어가자.
</br><strong><code>for...in</code> 문</strong>은 객체 내부에서 <strong>프로퍼티 키</strong>를 대상으로 순환한다. 
</br></p>
<pre><code class="language-javascript">let obj = {
    a: 1,
    b: 2,
    c: 3
};
for (let i in obj) { // i = key 값
    console.log(i + &#39;: &#39; +obj[i]);
};
// output : a: 1, b: 2, c: 3</code></pre>
<p></br>해당 예시에서 <code>i</code> 는 객체 <code>obj</code> 내부의 프로퍼티 키인 <strong><code>a</code>, <code>b</code>, <code>c</code></strong> 에 해당한다. 이처럼 프로퍼티 키로 접근할 수 있지만, 값(<code>value</code>)에 직접적으로 접근할 수 없다. 그래서 예시와 같이 <strong><code>obj[i]</code></strong> 와 같은 형식으로 값에도 접근할 수 있다.</p>
<h2 id="객체와-메소드method">객체와 메소드(<code>Method</code>)</h2>
<p>객체의 저장된 값이, 즉 <strong>프로퍼티 값이 함수일 때,</strong> 이를 <strong>메소드(<code>method</code>)</strong>라고 한다. <strong><code>console.log()</code> 의 경우</strong>에도 메소드의 형태를 갖고 있는데, 여기서 <code>console</code> 이라는 객체의 메소드인 <code>log()</code> 의 프로퍼티 값이 함수라는 것을 알 수 있다.
</br></p>
<pre><code class="language-javascript">let obj = {
  sayHello : () =&gt; {
    console.log(&#39;Hello&#39;)
  }
}

obj.sayHello() // output : &#39;Hello&#39;</code></pre>
<p></br>위 예시는 <code>console</code> 에 <code>Hello</code> 라는 값을 출력하는 <code>obj</code> 의 메소드를 작성한 것이다. 해당 메소드의 경우 객체 <code>obj</code> 에만 사용이 가능하다.
</br>또한, 메소드를 활용하면서 <strong>객체 내부의 프로퍼티 값</strong>을 활용할 수 있는데, 이와 관련되어 <strong><code>this</code></strong>에 대한 개념이 있다.
</br></p>
<h3 id="메소드와-this">메소드와 <code>this</code></h3>
<p>메서드를 통해 객체 내부 정보에 접근할 수 있을 때, 메소드는 제 역할을 할 수 있다. 이와 관련되어 <strong><code>this</code></strong>라는 키워드가 있다. <strong><code>this</code></strong> 는 해당 객체를 가리키며, 이때 해당 객체는 <strong>메소드를 호출할 때 사용된 객체</strong>를 의미한다.
</br>다음의 예시를 보면서 알아보자.
</br></p>
<pre><code class="language-javascript">let user = { name: &quot;John&quot; };
let admin = { name: &quot;Admin&quot; };

function sayHi() {
  alert( this.name );
}

// 별개의 객체에서 동일한 함수를 사용함
user.f = sayHi;
admin.f = sayHi;

// &#39;this&#39;는 &#39;점(.) 앞의&#39; 객체를 참조하기 때문에
// this 값이 달라짐
user.f(); // John  (this == user)
admin.f(); // Admin  (this == admin)</code></pre>
<p></br>해당 예시를 보면 동일한 <strong><code>sayHi()</code></strong> 라는 함수를 각각의 객체 <code>user</code> 와 <code>admin</code> 에 메소드로 추가한 뒤에 이를 실행하니, 결과 값이 <strong><code>John</code> 과 <code>Admin</code> 으로 다르게 나타났다.</strong>
</br>이를 통해, 자바스크립트에서 <code>this</code> 값은 <strong>런타임</strong>에 의해 결정된다는 것을 알 수 있다.
</br>자바스크립트에서 <code>this</code> 가 어떻게 작동하는지에 대해서 <a href="https://velog.io/@p-acid/TIL-JavaScript-Function">지난 함수 포스팅</a>에서 다뤘으니, 일반 함수와 화살표 함수의 <code>this</code> 차이, <code>scope</code> 의 구분에 대해 넘어가 다시 알아보자! 😊</p>
<h4 id="🔖-출처-3">🔖 출처</h4>
<blockquote>
<p><a href="https://ljtaek2.tistory.com/89">메소드 : 태기의 개발 Blog : 자바스크립트 - 객체 메소드 정리</a>
<a href="https://ko.javascript.info/object-methods">메소드와 <code>this</code> : javascript.info : 메서드와 this</a></p>
</blockquote>
<h4 id="🔖-전체적인-참고">🔖 전체적인 참고</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Basics">MDN Web Docs : JavaScript 객체 기본</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript : Loop]]></title>
            <link>https://velog.io/@p-acid/TIL-JavaScript-Loop</link>
            <guid>https://velog.io/@p-acid/TIL-JavaScript-Loop</guid>
            <pubDate>Wed, 11 Aug 2021 12:25:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 반복문의 종류와 각각의 사용법, 특징 등에 대한 내용입니다. 😊</p>
</blockquote>
<h1 id="🔃-자바스크립트의-반복문">🔃 자바스크립트의 반복문</h1>
<p><strong>반복문(<code>loop</code>)</strong>은 프로그래밍에서 <strong>일정 구간</strong>을 <strong>조건에 따라 지속적으로 반복</strong>하는 구문을 의미한다.
</br>반복문을 사용하면 단순히 같은 기능을 하는 구문들을 비효율적으로 <strong>여러 번 작성하지 않고, 한 번의 구문 작성만으로</strong> 똑같은 작업을 실행할 수 있다.
</br>자바스크립트에는 대표적인 반복문으로 <strong><code>for</code> 문과 <code>while</code> 문</strong>이 있고, <code>while</code> 문의 경우 변형되어 <strong><code>do~while</code> 문</strong>으로도 작성 가능하다.
</br>이번 포스팅에서는 해당 세 가지의 반복문 형태와 각각의 사용법 그리고 특징을 구분지어 알아볼 것이다.</p>
<h2 id="for-문"><code>For</code> 문</h2>
<p><strong><code>for</code> 문</strong>은 자바스크립트 반복문 생성 시, 일반적으로 사용하는 반복문 형태이다. 
</br><code>for</code> 문 또한 변형된 형태가 몇 가지 존재하는데, 해당 형태들이 <strong>언제 사용되는지</strong> 그리고 <strong>어떻게 작동하는지에</strong> 대해 함께 알아볼 것이다.</p>
<h3 id="for-문의-문법"><code>For</code> 문의 문법</h3>
<p>기본적인 <code>for</code> 문은 <code>for</code> 키워드를 통해 작성 가능하고 구성 요소로 <strong>변수 초기화, 조건식, 증감식</strong>이 있다.
</br></p>
<pre><code class="language-javascript">let arr = [1, &quot;two&quot;, true]

for (let i = 0; i &lt; arr.length; i++) {
    console.log(arr[i]) 
} // output : 1 two true</code></pre>
<p></br>위 예시는 배열 <code>arr</code> 을 순회하며 <code>console</code> 에 <code>arr</code> 의 각 요소들을 출력하는 작업을 진행한다.
</br>예시에서 <code>for</code> 다음의 괄호 안에 <strong>세미콜론(<code>;</code>)</strong>으로 구분된 요소들이 <strong><code>for</code> 문의 구성 요소</strong>에 해당한다.
</br>우선 <code>let i = 0</code> 을 통해 배열을 순회할 인덱스 요소가 될 <strong>변수 <code>i</code>를 선언과 동시에 초기화</strong>한다. 이어서 <code>i</code> 가 배열 <code>arr</code> 의 길이(<code>arr.length</code>) 보다 짧아야 함을 <strong>조건으로 제시</strong>하고, 반복의 기준이 되는 <code>i</code> 가 어떻게 변화할지에 대한 <strong>증감식을 작성</strong>한다. 예시의 경우 하나씩 증가하도록(<code>i++</code>) 작성하였다.
</br>그렇게 작성된 해당 <code>for</code> 문은 총 배열 길이인 <code>3</code> 만큼 <code>console.log(arr[i])</code> 구문을 반복하여 위와 같은 결과를 출력한 것이다.</p>
<h3 id="💡-for-문의-동작-순서">💡 <code>for</code> 문의 동작 순서</h3>
<blockquote>
<p><code>for</code> 문의 동작 순서에 대한 이해는 <code>for</code> 문의 작성에 있어 유연한 작성에 도움을 준다.
</br></p>
</blockquote>
<pre><code class="language-javascript">for (A; B; C) {
   D
}
// A : 변수 초기 선언, B : 조건식, C : 증감식, D : 실행 구문</code></pre>
<p></br>위 예시는 <code>for</code> 문 요소들의 각 위치를 알파벳으로 정의한 것이다.
</br><code>for</code> 문의 <strong>변수 초기화(<code>A</code>)</strong>는 <code>for</code> 문 시작과 함께 <strong>처음에만 실행</strong>되고 이후 반복 실행하지 않는다. 이후 <strong>조건식(<code>B</code>)</strong>으로 넘어와 제시된 조건의 반환 값이 <strong><code>true</code> 인지를 구분</strong>하여 <code>true</code> 일 경우, <strong>구문(<code>D</code>)을 실행</strong>한다. 그리고 <strong>증감식(<code>C</code>)</strong>으로 넘어와 증감식에 해당하는 변화를 준다.
</br>이후엔 다시 조건식으로 넘어와 조건을 확인하고, 구문을 실행한 뒤, 다시 증감식을 실행하는 것을 반복한다. 해당 순서를 작성하면 다음과 같다.
</br><strong>: A → B → D → ( C → B → D → )</strong> (이후 괄호 안 반복)
</br><code>for</code> 문이 해당 순서로 작동하기 때문에, 이를 고려하여 <code>for (let i = 0; i &lt; arr.length; i++)</code> 와 같은 보편적인 형태가 아니라 <strong>유동적으로 조건식과 증감식을 작성</strong>하여 <code>for</code> 문을 더욱 효과적으로 활용할 수 있다.</p>
<p></br>이어서 <strong><code>for</code> 문 구성 요소의 기능</strong>에 대해 자세히 알아보자.
</br>구성 요소 중 <strong>변수 초기화(위 예시 <code>A</code>)</strong> 부분의 경우, 배열의 인덱스 변수의 초기화 외에도 <strong>해당 반복문에서 사용될 변수</strong>의 초기화에 사용된다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4, 5]

for (let i = 0, len = arr.length; i &lt; len; i++) {
  console.log(arr[i])
}</code></pre>
<p></br>해당 예시의 경우, 조건식에서 호출되는 배열의 속성인 길이(<code>length</code>)에 대해 <strong>특정 변수(<code>len</code>)</strong>로 미리 할당하여 조건식이 순환할 때마다 배열 길이를 <strong>반환하는 과정을 생략</strong>하도록 할 수 있다. 이때, 각 변수의 초기화는 <strong>콤마(<code>,</code>)</strong>를 통해 구분한다.
</br>두 번째로, <strong>조건식(위 예시 <code>B</code>)</strong>의 경우 주로 초기 변수의 상태 평가에 사용되지만, 외부 전역 변수를 사용하는 등의 방식으로도 <strong>조건을 자유롭게 설정</strong>할 수 있다.
</br>또한, 조건식의 경우에는 <strong>생략</strong>할 수도 있으며, 해당 경우에는 <strong><code>break</code></strong> 를 반복문 내부에 삽입해야 한다. </p>
<h3 id="💡-break-문과-continue-문">💡 <code>break</code> 문과 <code>continue</code> 문</h3>
<blockquote>
<p>반복문에서 <strong>반복을 제어</strong>할 수 있는 구문이다.
</br><strong><code>break</code> 문</strong>은 반복문을 더 이상 반복하지 않고, 바로 <strong>해당 반복문을 끝내라</strong>는 의미를 갖는다.
</br><code>break</code> 문의 경우, 조건문(<code>if</code> 등)을 활용하여 <strong>특정 조건에 해당하는 경우 조건문을 끝내는 기능</strong>을 작성할  수 있다.
</br></p>
</blockquote>
<pre><code class="language-javascript">let sum = 0;
for (let number=1;; number++) // 조건식 생략 가능
{
    if ( number == 5) // 5일 경우 break 실행
    {
        break;
    }
      sum = sum+number;
      console.log(sum) // 합이 10이 되고 반복문 종료
}</code></pre>
<p></br><strong><code>continue</code> 문</strong>은 <code>break</code> 문과 달리 반복문을 끝내지 않지만, <code>continue</code> 문을 기준으로 <strong>아래에 있는 구문을 넘기고 반복문을 진행</strong>한다.
</br>해당 경우에도 조건문(<code>if</code> 등)을 활용하여 <strong>특정 조건에 해당하는 경우만 넘어가고</strong> 반복문을 진행하는 기능을 작성할 수 있다.
</br></p>
<pre><code class="language-javascript">let sum = 0;
for (let number=1; number&lt;=10; number++)
{
    if ( number == 5) // 5일 경우 continue 실행
    {
        continue;
    }
      sum = sum+number;
      console.log(sum) // 합이 15가 되는 경우가 사라짐
}</code></pre>
<p></br><code>break</code> 문과 <code>continue</code> 문은 <code>for</code> 문 말고도 <strong>다른 반복문(<code>while</code>, <code>do~while</code> 문)에서도 사용할 수 있다.</strong>
</br></p>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="http://rchemist.egloos.com/v/534921"><code>break</code> &amp; <code>continue</code> : 연금술사님 블로그 : 반복_break/continue문</a></p>
</blockquote>
</blockquote>
<p></br>마지막으로, <strong>증감식(위 예시 <code>C</code>)</strong>의 경우에는 주로 <strong>초기 변수의 증감</strong>에 사용된다. 증감식 또한 선택 사항이며 <strong>생략 가능</strong>하고, 초기 변수 외에도 <strong>다른 요소의 증감</strong>에도 사용 가능하다. </p>
<h4 id="🔖-출처-1">🔖 출처</h4>
<blockquote>
<p><a href="http://jun.hansung.ac.kr/CWP/Javascript/JavaScript%20for%20Loop.html"><code>for</code> 문의 구조 : jun.hansung : JavaScript For 루프(Loop)</a></p>
</blockquote>
<p></br>앞에서 알아본 기본적인 <code>for</code> 문 이외에도 다양한 형태가 있는데, <strong><code>for...in</code> 문</strong>과 <strong><code>for...of</code> 문</strong> 등이 이에 해당한다.
</br> <strong><code>for...in</code> 문</strong>은 <strong>열거 가능한 속성(enumerable)이 있는 객체</strong>들에 사용할 수 있고, 객체의 경우 <strong>객체 내 프로퍼티들을 순환</strong>하면서 <strong><code>key</code> 값에 접근</strong>할 수 있다. 
</br></p>
<pre><code class="language-javascript">let obj = {
    a: 1,
    b: 2,
    c: 3
};
for (let i in obj) { // i = key 값
    console.log(i + &#39;: &#39; +obj[i]);
};
// output : a: 1, b: 2, c: 3</code></pre>
<p></br><strong><code>for...of</code> 문</strong>은 <strong>반복자(<code>iterator</code>)</strong>가 있는 요소들은 모두 순환할 수 있으며, <strong><code>String</code> 과 같은 문자열</strong>도 각 문자를 순환할 수 있다. 
</br></p>
<pre><code class="language-javascript">let arr = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;];
for (let i of arr) {
    console.log(i);
};
// a, b, c
let fruit = &#39;orange&#39;;
for (let i of fruit) { // i = &#39;orange&#39;의 각 문자 단위
    console.log(i);
};
// o, r, a, n, g, e</code></pre>
<h4 id="🔖-출처-2">🔖 출처</h4>
<blockquote>
<p><a href="https://swimjiy.github.io/2019-02-17-js-for"><code>for...in</code>, <code>for...of</code> : Swimjiy devlog : [JavaScript] forEach, for...in, for...of 정리</a></p>
</blockquote>
</br>

<h3 id="💡-forin-사용-시-주의사항">💡 <code>for...in</code> 사용 시 주의사항</h3>
<blockquote>
<p><code>for...in</code> 은 <strong>배열의 순회에 사용하지 않도록</strong> 한다.
</br>그 이유는 보통 객체 프로퍼티를 순회하는데 사용하는 <code>for...in</code> 은 배열 요소를 순회할 경우 모든 <strong>프로퍼티를 순회하기에</strong> 일반적인 <strong><code>for</code> 를 사용하는 것 보다 느린</strong> 결과를 보여준다.
</br>또한, 브라우저마다 <strong>순회 순서</strong>가 다르기 때문에, <strong>매번 <code>index</code> 순서대로 수행되지 않을 수 있다는 문제점</strong>이 존재한다.
</br>위와 같은 이유로 배열의 순회에서는 <strong><code>for...in</code> 의 사용을 지양한다.</strong></p>
</blockquote>
<h4 id="🔖-출처-3">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://ui.toast.com/fe-guide/ko_ANTI-PATTERN#%EB%B0%B0%EC%97%B4%EC%9D%98-%EC%88%9C%ED%9A%8C%EB%8A%94-for-in%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4"><code>for...in</code> 주의사항 : TOASTUI : 안티 패턴
</a></p>
</blockquote>
</blockquote>
</br>

<h3 id="💡-반복문과-배열array">💡 반복문과 배열(<code>Array</code>)</h3>
<blockquote>
<p>반복문과 배열은 자주 함께 사용되는데, 그 이유를 이해하기 위해 <strong>자료 구조와 탐색 알고리즘</strong>에 대해 간단히 알아보자.
</br>배열의 <strong>자료 구조</strong>에 대한 내용은 <a href="https://velog.io/@p-acid/TIL-JavaScript-Array">배열 관련 포스팅</a>에 작성 했으니, 가서 확인하고 오자!
</br>그렇다면 <strong>탐색 알고리즘</strong>과 반복문을 연관지어서 개념을 이해해보자. 탐색 알고리즘이란 수많은 데이터 중 <strong>원하는 데이터를 찾는 알고리즘</strong>으로 선형, 이진, 해시 탐색법 등이 이에 해당한다. 그 중 지금 알아볼 <strong>선형 탐색법</strong>은 데이터를 <strong>순서대로 하나씩 검색</strong>하는 방식이다.
</br>배열의 자료 구조에 대한 이해가 됐다면, 배열은 <strong>선형 자료 구조</strong>라는 부분을 인지했을 것이다. 선형 자료 구조의 데이터는 <strong>일대일 관계</strong>를 갖고 순차적으로 연결되어 있기에 순서대로 하나씩 검색하는 방식인 선형 탐색법이 용이하다.
</br>그렇기 때문에 배열의 매 요소를 순환하면서 데이터를 탐색하는 반복문이 배열과 자주 사용된다고 생각할 수 있을 것이다.</p>
</blockquote>
</br>

<h2 id="while-문과-dowhile-문"><code>While</code> 문과 <code>do~while</code> 문</h2>
<p><strong><code>while</code> 문</strong>은 <code>for</code> 문과 유사하지만, 문법이나 구조에 있어서 차이를 보인다.
</br><code>while</code> 문의 정해진 구조는 <strong>조건을 제시하는 부분만 존재</strong>하고, 나머지 부분은 유동적으로 작성할 수 있다.
</br>그리고 <strong><code>do~while</code> 문</strong>의 경우 <code>while</code> 문과 유사하지만, 실행 구조에 있어 차이를 보여준다.
</br>우선 <code>while</code> 문을 먼저 알아보자.</p>
<h3 id="whlie-문"><code>whlie</code> 문</h3>
<p><strong><code>while</code> 문</strong>은 조건문이 참일 때 실행되는 반복문이고. 문장이 실행되기 전 참과 거짓을 판단한다.</p>
<p><code>while</code> 문의 문법은 간략하게 <strong><code>while (condition) {statement}</code></strong> 으로 구성되고, <code>condition</code> 부분이 <code>true</code> 이면 <code>statement</code> 부분을 반복적으로 실행한다.
</br></p>
<pre><code class="language-javascript">let i = 0 // 변수 선언

while (i &lt; 10) { // 조건식
  console.log(i)
  i++ // 변수 증감
}</code></pre>
<p></br>예시를 보면 <code>while</code> 의 경우에는 <code>for</code> 문과 달리 <strong>변수 초기화</strong>나 <strong>증감식</strong>을 작성하는 구간이 고정적이지 않다. 그렇기 때문에, 자칫하면 무한 루프의 구간에 빠질 수 있다.
</br>만약, <strong>정해진 반복 횟수</strong>가 있다면 <code>while</code> 보다는 <code>for</code> 를 사용하는 것이 효율적일 수 있다.
</br>반대로 정해진 조건을 만족할 때까지 실행해야 하는 구문이라면 <code>for</code> 문 보다 <code>while</code> 문이 효율적일 수 있다.
</br>앞에서도 언급했지만, <code>while</code> 문의 경우에도 <code>break</code> 와 <code>continue</code> 문을 사용할 수 있다.
</br><code>while</code> 문의 실행 순서를 알아보면 다음과 같다.
</br></p>
<pre><code class="language-javascript">while (A) { // A : condition
    B // B : Statement
}</code></pre>
<p></br><code>while</code> 문은 단순하게 조건(<code>A</code>) 부분이 통과되면, 지문(<code>B</code>)을 실행하고 다시 조건으로 순환하는 구조를 갖는다.</p>
<h3 id="dowhile-문"><code>do~while</code> 문</h3>
<p><strong><code>do~while</code> 문</strong>은 <code>while</code> 문과 조건의 위치가 다르다.
</br>그렇기 때문에 <code>do~while</code> 문은 조건 여부와 상관 없이 <strong>무조건 한 번 실행하고</strong> 반복문을 진행한다.
</br><code>do~while</code> 문의 문법은 간단하게 <code>do { statement } while (condition)</code> 이고 다음과 같은 예시로 작성할 수 있다.
</br></p>
<pre><code class="language-javascript">let i = 0;

do {
  console.log(i);
  i++;
} while (i &lt; 10)</code></pre>
<p></br>예시를 보면 실행 구문보다 조건이 아래에 적혀있다. 해당 구조를 확인하고 <strong><code>do~while</code> 문의 실행 순서</strong>를 확인하면 다음과 같이 이해할 수 있다.
</br></p>
<pre><code class="language-javascript">do {
    B
} while (A)</code></pre>
<p></br>위와 같이 실행 구문(<code>B</code>)을 조건에 상관 없이 실행하고 조건(<code>A</code>)에 걸리므로 <code>while</code> 문과 다르게 조건에 일치하지 않아도 <strong>무조건적으로 한 번은 실행</strong>하는 것이다.</p>
<h4 id="🔖-전체적인-참고">🔖 전체적인 참고</h4>
<blockquote>
<p><a href="https://www.zerocho.com/category/JavaScript/post/57341f84420974fa1f92a761">반복문 : ZeroCho님 개인 블로그 : 반복문(loop - while, for, do)</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript : Array]]></title>
            <link>https://velog.io/@p-acid/TIL-JavaScript-Array</link>
            <guid>https://velog.io/@p-acid/TIL-JavaScript-Array</guid>
            <pubDate>Tue, 10 Aug 2021 10:26:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 자료형 중 참조 타입에 포함되는 배열(<code>Array</code>)에 대한 내용입니다. 😊</p>
</blockquote>
<h1 id="📋-배열array이란">📋 배열(<code>Array</code>)이란?</h1>
<p><strong>배열(<code>Array</code>)</strong>을 간단하게 설명하면 <strong>순서를 가진 복수의 자료들을 저장하는 구조</strong>이다. 여기서 순서를 갖는다는 의미는 <strong>각 요소마다 인덱스를 활용할 수 있다는 점</strong>이 이에 해당하고, 복수의 자료들은 말 그대로 <strong>여러 자료들을 한 번에 저장할 수 있다는 점</strong>이다.
</br>배열을 통해 하나의 변수에 여러가지 값을 동시에 저장할 수 있게 되면서 <strong>다량의 데이터를 효과적으로 다룰 수 있고</strong>, <strong>인덱스를 활용하여 데이터를 추가하거나 제거하는 등</strong>의 다양한 기능들을 활용할 수 있다.
</br>이번 포스팅에선 배열의 생성과 접근 방식, 메서드와 관련된 내용 등에 대해 알아볼 것이다.
</br></p>
<h2 id="배열의-생성">배열의 생성</h2>
<p>배열을 생성하는 방법은 크게 <strong>두 가지</strong>가 있는데 첫 번째로 <strong>리터럴을 사용하는 방식</strong>, 두 번째로 <strong><code>new</code> 를 활용한 생성 방식</strong>이 있다.
</br></p>
<pre><code class="language-javascript">let arr1 = [] // 리터럴(문자열) 방식
let arr2 = new Array(arrayLength) // new 활용 방식</code></pre>
<p></br>첫 번째 방식은 간단하게 <strong>대괄호를 활용하는 것</strong>으로 배열을 생성할 수 있고, 두 번째 방식은 <code>arrayLength</code> 에 해당하는 부분에 숫자를 대입하여 해당 <strong>숫자 만큼의 길이를 갖는 배열을 생성</strong>할 수 있다. 해당 배열의 내부 요소들은 <strong>전부 <code>undefined</code> 로 구성</strong>된다.
</br></p>
<pre><code class="language-javascript">let arr3 = new Array(3) // output : (3) [undefined, undefined, undefined]</code></pre>
<p></br>또한 두 가지 방식 모두 배열 생성과 동시에 초기화가 가능하다. 리터럴 방식의 경우 <strong>대괄호 안에 요소</strong>를 콤마를 통해 구분하여 작성하는 방법으로, <code>new</code> 를 활용한 방식의 경우 <strong>소괄호 안에 요소</strong>를 콤마를 통해 구분하여 작성하는 방법으로 가능하다. 
</br></p>
<pre><code class="language-javascript">let arr4 = [1, 2, &quot;Hi&quot;] // output : (3) [1, 2, &quot;Hi&quot;]
let arr5 = new Array(1, 2, &quot;Hi&quot;) // output : (3) [1, 2, &quot;Hi&quot;]</code></pre>
<p></br>그리고 위에서 확인할 수 있듯이 배열은 <strong>다양한 데이터 타입을 함께 포함하여 사용</strong>할 수 있다. 
</br>이렇게 배열을 생성한 뒤에 배열 내 요소들을 활용하거나 추가 및 제거하는 방법에 대해 알아보자
</br></p>
<h2 id="배열-요소의-추가와-삭제">배열 요소의 추가와 삭제</h2>
<p>배열 내 요소는 각 요소마다 <strong>인덱스(<code>index</code>)</strong>를 갖고 있고, 인덱스를 통해 각 요소에 접근할 수 있다. 인덱스는 <strong><code>0</code> 부터 시작</strong>하며 인덱스 위치를 지정하는 방법은 배열 이름에 <strong>대괄호(<code>[]</code>)를 열어 안에 인덱스를 삽입</strong>하면 된다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, &quot;Hi&quot;]
console.log(arr[0], arr[2]) // output : 1 &quot;Hi&quot;</code></pre>
<p></br>위와 같이 배열의 <strong>인덱스를 지정</strong>하거나 배열 <strong>메서드(<code>Method</code>)를 활용</strong>하여 배열 요소의 추가와 삭제가 가능하다.</p>
<h3 id="💡-자바스크립트에서-메서드method란">💡 자바스크립트에서 메서드(<code>Method</code>)란?</h3>
<blockquote>
<p><strong>메서드</strong>와 <strong>함수</strong>는 서로 유사하지만 명확히 정의하자면 다른 존재이다.
</br>간단히 정의하면 함수가 메서드를 포함하는 용어이고, 메서드는 <strong>객체에 종속되는 함수</strong>를 의미한다.
</br>함수의 경우에는 <strong>그 자체가 기능을 수행</strong>하지만, 메서드의 경우에는 <strong>객체에 명령을 주고 객체가 기능을 수행</strong>하는 함수라고 이해하면 될 것이다.
</br>그렇기에, 함수 호출 방식과 메서드 호출 방식에서도 차이를 보인다.
</br></p>
</blockquote>
<pre><code class="language-javascript">// 임의의 함수 선언
function funcName() {
    console.log(&#39;Hello&#39;)
}
funcName() // output : &#39;Hello&#39;
// Array Method : pop()
let arr = [1, 2, 3]
console.log(arr.pop()) // output : 3</code></pre>
<p></br>위 임의의 함수 <code>funcName</code> 은 함수명을 통해 바로 실행이 가능하지만 배열의 <code>pop()</code> 메서드의 경우 배열명(<code>arr</code>)에 <code>.</code> 를 붙이고 사용한다.
</br>여기서 <code>pop()</code> 메서드는 <code>Array</code> 객체에 종속되어 있기 때문에, <code>Array</code> 객체에서 호출할 수 있다.</p>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://velog.io/@canonmj/%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94-object-%EC%8B%AC%ED%99%94%EC%9D%B4%ED%95%B4">함수와 메서드 : canonmj님 벨로그 : Javascript : 함수와 메서드의 차이는? object를 파헤쳐보자!</a>
<a href="https://sustainable-dev.tistory.com/33">함수와 메서드 : 지속가능한 개발 블로그 : 메소드와 함수 (Method and Function)의 차이점</a></p>
</blockquote>
</blockquote>
<h3 id="배열-요소의-추가">배열 요소의 추가</h3>
<p>배열 요소 추가는 다음과 같이 <strong>인덱스를 활용</strong>하여 필요한 위치에 값을 할당할 수 있다. 
</br></p>
<pre><code class="language-javascript">let arr = []

arr[0] = 1

console.log(arr) // output : (1) [1]</code></pre>
<p></br>이때 순서대로 할당할 필요는 필요는 없고, <strong>필요 위치에 할당</strong>을 하면 된다. 만약 <strong>배열의 길이를 초과하는 범위</strong>에 요소를 할당하면 그 사이의 요소들은 <strong>모두 <code>undefined</code> 로 할당</strong>된다.
</br></p>
<pre><code class="language-javascript">// 위 예시 코드에서 이어서 작성
arr[4] = 1

console.log(arr) // output : (5) [1, undefined, undefined, undefined, 1]</code></pre>
<p></br>그리고 <strong>메서드(<code>method</code>)</strong>를 통해 요소를 추가하는 것도 가능하다. 대표적인 메서드로 <strong><code>push()</code> 와 <code>unshift()</code></strong>가 있다.
</br><code>push()</code> <strong>배열 맨 뒤</strong>에 요소를 추가하고, <code>unshift()</code> 는 <strong>배열 맨 앞</strong>에 요소를 추가하는 메서드이다. 그리고 두 메서드는 요소를 추가한 뒤 <strong>새로운 배열의 길이를 반환</strong>한다.
</br><code>push()</code> 와 <code>unshift()</code> 메서드는 매개변수로 추가할 요소를 작성하여 사용할 수 있다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4]

let pushArr = arr.push(5)

console.log(pushArr) // output : 5
console.log(arr) // output : (5) [1, 2, 3, 4, 5]

let unshiftArr = arr.unshift(0)

console.log(unshiftArr) // output : 6
console.log(arr) // output : (5) [0, 1, 2, 3, 4, 5]</code></pre>
<p></br>배열 요소의 제거도 이와 유사한 방법으로 이루어진다.
</br></p>
<h3 id="배열-요소의-제거">배열 요소의 제거</h3>
<p>배열 요소의 제거는 기본적으로 <strong><code>delete</code> 연산자</strong>를 활용하여 가능하다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4]

delete arr[2]

console.log(arr) // output : (3) [1, 2, undefined, 4]</code></pre>
<p></br>하지만 해당 방법을 활용할 경우, 위와 같이 배열 <strong>길이(<code>length</code>)에는 변함이 없고</strong> 기존 위치에는 <code>undefined</code> 가 남음을 알 수 있다.
</br>그렇기에 완전히 배열 요소를 제거하기 위해서 다음의 <strong><code>pop()</code> 과 <code>shift()</code> 메서드</strong>를 활용할 수 있다.
</br><code>pop()</code> 메서드는 <code>push()</code> 와 유사하게 <strong>배열 맨 뒤</strong>의 요소를 제거하고, <code>shift()</code> 메서드는 <code>unshift()</code> 메서드와 유사하게 <strong>배열 맨 앞</strong>의 요소를 제거한다. 해당 두 메서드는 반환 값으로 <strong>배열에서 제거된 값</strong>을 반환한다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4]

let popArr = arr.pop()

console.log(popArr) // output : 4
console.log(arr) // output : (3) [1, 2, 3]

let shiftArr = arr.shift()

console.log(shiftArr) // output : 1
console.log(arr) // output : (2) [2, 3]</code></pre>
<p></br>또한, 추가적으로 <strong><code>splice()</code> 메서드</strong>를 활용해서 요소의 제거를 진행할 수 있는데, 동시에 추가도 함께 할 수 있다. <code>splice()</code> 의 문법은 다음과 같다.</p>
<blockquote>
<p><code>array.splice(start[, deleteCount[, item1[, item2[, ...]]]])</code></p>
</blockquote>
<p>해당 문법을 사용하여 추가와 제거를 동시에 진행하면 다음과 같이 할 수 있다. 
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, 3, 4]

let spliceArr = arr.slice(1, 1, &#39;two&#39;) // 요소를 제거하고 해당 인덱스에 요소 추가

console.log(spliceArr) // output : [2]
console.log(arr) // output : [1, &#39;two&#39;, 3, 4]</code></pre>
<p></br>그리고 <code>splice()</code> 는 요소의 추가와 제거를 분리하여 각각의 용도로 사용할 수도 있다. 
</br></p>
<pre><code class="language-javascript">// 요소 제거
let arr = [1, 2, 3, 4]

arr.slice(1, 1)

console.log(arr) // output : (3) [1, 3, 4]

// 요소 추가
arr.slice(1, 0, 2)

console.log(arr) // output : (4) [1, 2, 3, 4]</code></pre>
<p></br>위에서 알아본 메서드를 포함하여 배열 내 데이터들을 인덱스로 접근하여 추가 및 수정이 가능하다. 이제 이러한 배열이 자료구조적으로 어떠한 의미를 갖는지 간단하게 알아보자.</p>
<h2 id="배열의-특징">배열의 특징</h2>
<p>배열은 하나의 변수에 여러 가지의 값을 저장할 수 있는 자료형으로서, 배열 또한 <strong>객체</strong>이기 때문에 관련된 <strong>속성</strong>과 <strong>메서드</strong>가 존재한다.
</br>대표적인 속성으로는 <code>length</code> 가 이에 해당하고 메서드는 위에서 언급한 메서드들이 이에 해당한다.
</br>눈으로 보이는 배열의 가장 큰 특징은 <strong>인덱스</strong>가 존재하기에 순서가 있다는 점이고, 이를 활용하여 효과적으로 데이터를 관리할 수 있다는 점이다.
</br>그렇다면 배열은 어떠한 자료구조를 갖고 있으며, 자바스크립트의 배열은 타 언어의 배열과는 어떠한 차이점이 존재할까? 이에 대해 간단히 알아보자.</p>
<h3 id="배열과-자료구조">배열과 자료구조</h3>
<p>우선 배열의 자료구조를 설명하기에 앞서 자료구조에 대한 간단한 설명을 해아 한다.
</br><strong>자료구조(Data Structure)</strong>란 컴퓨터 과학에서 자료에 효율적인 접근 및 수정을 가능케 하는 자료의 조직 및 관리와 저장을 의미한다.
</br>자료구조는 그 형태에 따라 분류가 되는데, <strong>선형 구조(<code>Linear</code>)</strong>와 <strong>비선형 구조(<code>NonLinear</code>)</strong>가 이에 해당한다.
</br><strong>선형 구조</strong>는 자료를 구성하는 데이터를 <strong>순차적으로 나열</strong>시킨 형태를 의미하며 <strong>배열, 스택(<code>Stack</code>), 큐(<code>Queue</code>)</strong> 등이 이에 해당한다. 선형 구조의 경우 저장된 자료의 <strong>전후 관계가 1:1</strong>인 것이 특징이며, 요소를 <strong>순서대로 작업하는 경우</strong> 효과적으로 활용할 수 있다.
</br>반대로 <strong>비선형 구조</strong>는 <strong>하나의 자료와 여러가지의 자료가 연결</strong>될 수 있는 형태를 의미하며 <strong>트리(<code>Tree</code>)와 그래프(<code>Graph</code>)</strong> 등이 이에 해당한다. 비선형 구조는 데이터가 <strong>1:n 관계</strong>를 갖는 것이 특징이며 <strong>자료 간의 관계를 정의</strong>할 때 효과적으로 활용할 수 있다.
</br>위에서 언급했 듯이 배열은 선형 구조에 속하며 그렇기에 선형 구조의 특징을 이해하면서 배열의 특징을 이해하면 수월할 것이다. 이어서 배열의 특징과 자바스크립트의 배열은 어떤 차이가 있는 지에 대해서 알아보자.</p>
<h4 id="🔖-출처-1">🔖 출처</h4>
<blockquote>
<p><a href="https://ko.wikipedia.org/wiki/%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0">자료 구조 : Wikipedia : 자료 구조</a>
<a href="https://server-engineer.tistory.com/130"><code>Linear</code> &amp; <code>NonLinear</code> : HelloWorld : 선형구조와 비선형구조</a>
<a href="https://velog.io/@blackb0x/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0">자료 구조 : blackb0x님 벨로그 : 자바스크립트의 자료구조</a></p>
</blockquote>
<h3 id="자바스크립트-배열의-특징">자바스크립트 배열의 특징</h3>
<p>자바스크립트에서 배열은 타 프로그래밍 언어와는 차이점을 보인다. 이에 대해 알아보기 위해 프로그래밍 언어에서의 배열 특징에 대해 우선적으로 알아보자.
</br>일반적으로 <strong>배열(<code>Array</code>)</strong>이란 <strong>같은 자료형</strong>을 가진 <strong>연속된 메모리 공간</strong>으로 이루어진 자료구조라고 할 수 있다.
</br>위 두 가지 특징은 배열의 가장 기본적인 특징이면서 자바스크립트의 배열과 <strong>구분되는 특징</strong>이기도 하다.
</br>먼저 <strong>같은 자료형</strong>을 가진다는 부분은 자바스크립트의 경우, 배열에 <strong>다양한 자료형의 자료들을 동시에 할당할 수 있다</strong>는 점에서 차이점을 갖는다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, &#39;Hello&#39;, true]
// Number와 String, Boolean의 자료형이 동시에 할당된 모습이다.</code></pre>
<p></br>위와 같이 자바스크립트의 배열의 경우, 타 언어의 배열과 다르게 다양한 자료형을 하나의 변수에 할당할 수 있다.
</br>그리고 일반적인 배열이 <strong>연속된 메모리 공간</strong>을 갖는다는 부분에서, 자바스크립트의 배열은 각각의 배열 요소들이 연속적으로 이루어지지 않아도 된다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, &#39;Hello&#39;, true]

delete arr[1]

console.log(arr) // output : (4) [1, undefined, &quot;Hello&quot;, true]</code></pre>
<p></br>일반적으로 배열에서 배열 요소의 삭제가 이루어지면, 배열 요소를 연속적으로 유지하기 위해 <strong>요소들을 이동</strong>시켜야 하지만, 자바스크립트의 배열 요소 삭제 방법 중 하나인 <strong><code>delete</code></strong> 를 사용하면 배열 길이가 감소하지 않고 <strong>배열 요소의 공간은 그대로 유지된다는 점</strong>이 이에 해당한다.</p>
<h4 id="🔖-출처-2">🔖 출처</h4>
<blockquote>
<p><a href="https://codedragon.tistory.com/2048">배열 : CodeDragon : 배열(Array)</a>
<a href="https://codedragon.tistory.com/4373">배열 차이 : CodeDragon : 배열(Array), 배열 차이 (java vs javscript)</a></p>
</blockquote>
</br>

<h3 id="💡-자바스크립트의-배열은-배열이-아니다">💡 자바스크립트의 배열은 배열이 아니다?</h3>
<blockquote>
<p>위에서 언급한 바와 같이 자바스크립트의 배열은 여타 프로그래밍 언어에서의 배열과는 차이점이 있다.
</br>기존의 배열은 <strong>밀집 배열(<code>dense array</code>)</strong>로 배열 요소가 밀접하게 연속적으로 이어져서 <strong>순차적인 작업에 최적화</strong> 된 형태이다.
</br>하지만 자바스크립트의 경우에는 <strong>희소 배열(<code>sparse array</code>)</strong>로 배열 요소의 <strong>각 메모리 공간의 크기가 다를 수 있고 연속적으로 이루어지지 않아도 된다</strong>는 점에서 일반적인 배열의 의미를 갖는다고 말하기에 어려울 수 있다.
</br>자바스크립트의 배열을 배열이라고 하지 않는다면, 자바스크립트의 배열은 <strong>일반적인 배열의 특징을 갖춘 객체</strong>라고 말할 수도 있다.
</br>쉽게 말하자면 자바스크립트의 배열에서 인덱스는 객체(<code>Object</code>)의 프로퍼티 키(<code>key</code>)에 해당하고, <code>length</code> 프로퍼티를 별도로 갖는 객체라는 말이다.
</br>그렇기에 자바스크립트의 배열은 기존 배열이 인덱스를 통해 <strong>각 요소에 빠르게 접근할 수 있는 만큼 효율적이지 않지만</strong>, 배열 요소의 <strong>추가와 삭제</strong> 등과 같은 작업에서 <strong>좀 더 효율적일 수 있다</strong>는 부분이 장점이다.
</br>추가적으로, 모던 자바스크립트 엔진에서는 배열을 여타 배열과는 구별하여 <strong>좀 더 배열처럼 동작하도록 최적화</strong>하여 구현했다는 점도 알아두자.
</br></p>
</blockquote>
<h4 id="🔖-출처-3">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://poiemaweb.com/js-array-is-not-arrray">자바스크립트의 배열 : poiemaweb : 자바스크립트 배열은 배열이 아니다</a></p>
</blockquote>
</blockquote>
</br>

<h3 id="배열과-시간-복잡도time-complexity">배열과 시간 복잡도(<code>Time Complexity</code>)</h3>
<p>특정 배열에 하나의 요소를 추가하는 메서드는 같은 실행 시간을 가질까? 같은 갯수의 요소를 처리하는 메서드라도 그 방식에 따라 <strong>다른 효율</strong>을 보일 수 있을 것이다.
</br>자바스크립트 배열의 메서드들이 실행 시간을 각각 얼마나 갖는 가에 대해 이해하기 앞서, <strong>시간 복잡도(<code>Time Complexity</code>)와 빅 오(<code>Big-O</code>) 표기법</strong>에 대해 알 필요가 있다.
</br>우선 <strong>시간 복잡도</strong>란 실행 시간의 관점에서 해당 <strong>알고리즘의 효율을 측정하는 정도</strong>라고 말할 수 있다. 그리고 <strong>빅 오 표기법</strong>은 이러한 <strong>시간 복잡도를 나타내는 표기법</strong>이다. 빅 오 표기법은 <code>O()</code> 의 형태로 작성하고 시간 복잡도에 따라 괄호 안에 들어가는 값이 달라진다.
</br>위 시간 복잡도와 빅 오 표기법을 활용하여 자바스크립트 배열의 일부 메서드들이 어떤 시간 복잡도를 갖는 지에 대해 알아보자.
</br>우선, 배열 요소의 <strong>추가 및 제거</strong>와 관련된 <strong><code>push()</code> 그리고 <code>pop()</code></strong> 메서드와 <strong><code>unshift()</code>, <code>shift()</code></strong> 메서드가 있다.
</br><code>push()</code> 와 <code>pop()</code> 의 경우, <strong>배열의 맨 끝</strong>에 요소를 추가하거나 제거하는 메서드이기 때문에, 한 번의 단계만 필요하고 시간 복잡도는 <code>O(1)</code> 로 나타낼 수 있다.
</br><code>unshift()</code> 와 <code>shift()</code> 의 경우에는, <strong>배열 맨 앞</strong>에 요소를 추가하거나 제거하는 메서드이기 때문에, 다른 요소들의 인덱스 값이 바뀌므로 <code>O(n)</code> 의 시간 복잡도를 갖는다.</p>
<h3 id="💡-pop-이-shift-보다-효율적이라고">💡 <code>pop()</code> 이 <code>shift()</code> 보다 효율적이라고?</h3>
<blockquote>
<p><code>shift()</code> 메서드가 <code>O(n)</code> 의 시간 복잡도를 갖는 것에 대해 자세히 설명하면 다음과 같다.
</br><code>pop()</code> 의 경우, 맨 끝의 요소만 제거하기 때문에 <strong>다른 요소의 인덱스에 영향을 주지 않는다.</strong>
</br></p>
</blockquote>
<pre><code class="language-javascript">let arr = [1, 2, 3]
arr.pop()
console.log(arr) // output : (2) [1, 2]</code></pre>
<p></br>위 예시를 보면 맨 끝의 요소인 <code>3</code> 은 사라지고 기존 요소인 <code>1</code>, <code>2</code> 는 <strong>인덱스 값이 그대로</strong> 임을 알 수 있다.
</br></p>
<pre><code class="language-javascript">let arr = [1, 2, 3]
arr.shift()
console.log(arr) // output : (2) [2, 3]</code></pre>
<p></br>하지만, <code>shift()</code> 의 경우 맨 앞의 요소인 <code>1</code> 을 제거함과 동시에 기존 요소인 <code>2</code>, <code>3</code> 의 <strong>인덱스 값이 <code>1</code> 씩 감소하는 것</strong>을 확인할 수 있다.
</br>그렇기에 같은 갯수의 요소를 처리하지만, <code>shift()</code> 의 경우 <strong>모든 요소를 순환하며 인덱스 값을 변환하기 때문에</strong> 시간 복잡도에서 차이를 보이는 것이다.</p>
<p></br>이렇게 배열의 메서드들의 시간 복잡도가 어느 정도인지를 알고 이해한다면 같은 데이터를 처리함에 있어서도 효율적으로 다른 결과를 만들어 낼 수 있기에, 많은 데이터를 처리할수록 시간 복잡도에 대한 이해가 충분하다면 그것은 필히 도움이 될 것이다.</p>
<h4 id="🔖-출처-4">🔖 출처</h4>
<blockquote>
<p><a href="https://nunucompany.tistory.com/29">배열과 시간 복잡도 : 손누누님 Tistory : [Javascript/JS] 자바스크립트에서의 배열과 시간복잡도</a>
<a href="https://minhanpark.github.io/today-i-learned/javascript-big-o/">자바스크립트 자료형과 복잡도 : 러닝워터 개발 블로그 : 문제 31 : 자바스크립트 자료형의 복잡도</a></p>
</blockquote>
<h4 id="🔖-전체적인-참고">🔖 전체적인 참고</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array">배열 : MDN Web Docs : <code>Array</code></a>
<a href="https://poiemaweb.com/js-array">자바스크립트 <code>Array</code> : poiemaweb : 5.28 Array 배열</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript : Conditionals]]></title>
            <link>https://velog.io/@p-acid/TIL-JavaScript-Conditionals</link>
            <guid>https://velog.io/@p-acid/TIL-JavaScript-Conditionals</guid>
            <pubDate>Fri, 06 Aug 2021 10:30:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 조건문에 대한 내용입니다! 😊</p>
</blockquote>
<h1 id="📒-자바스크립트의-조건문conditionals">📒 자바스크립트의 조건문(<code>Conditionals</code>)</h1>
<p>자바스크립트에서는 코드의 <strong>진행을 제어할 수 있는 기능</strong>이 있다. 해당 제어 방식은 흐름 중간에 <strong>조건을 제시하여</strong> 흐름을 통제하던지 아니면 해당 흐름을 <strong>반복적으로 진행</strong>하도록 통제할 수도 있다.
</br>위와 같이 주어진 조건에 따라 코드를 제어하는 구문을 <strong>제어문</strong>이라고 한다.</p>
<h3 id="💡-제어문은-무엇인가">💡 제어문은 무엇인가</h3>
<blockquote>
<p>위에서 언급한 듯이, <strong>제어문(<code>control statements</code>)</strong>은 <strong>특정한 결과를 도출해내기 위해서 조건을 제시</strong>하여 조건에 부합하는 상반되는 결과를 도출하거나, 구간의 반복 등을 유도하는 구문이라고 할 수 있다.
</br>제어문에는 이번 포스팅에서 다룰 <strong>조건문</strong>과 <strong>반복문</strong>이 포함되며 흐름을 제어하는 구문이기 때문에, 순차적으로 진행되는 <strong>흐름이 제어문으로 인해 어떻게 전환되는지</strong>에 대한 이해가 필요하다!</p>
</blockquote>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://cofs.tistory.com/136">제어문의 정의 : Continuous Of Shoveling : [javascript 기초 강좌] 6. 제어문 ( if / switch / for / while / do~ while )</a></p>
</blockquote>
</blockquote>
<p></br> 그 중 이번에 다룰 <strong>조건문(<code>conditionals</code>)</strong>은 코드 흐름 중간에 조건을 제시하여 흐름을 통제하는 제어문의 일종이다. 
</br>대개 조건문은 <strong><code>if</code> 조건문</strong>을 사용하며 이외에도 <strong><code>switch</code> 조건문</strong>도 사용을 하는데, 이번 포스팅에서는 해당 구문들의 차이점과 구조에 대한 이해를 할 것이다.</p>
<h1 id="⚙️-if-문은-무엇인가">⚙️ <code>if</code> 문은 무엇인가?</h1>
<p>영어 어휘에서 의미하는 <code>if</code> 를 이해했을 때 우리는 간단히 자바스크립트의 <code>if</code> 문의 기능에 대한 이해를 할 수 있다.
</br><strong><code>if</code> 문</strong>은 말 그대로 만약에 ~ 면 이라는 <strong>조건을 제시</strong>하여 해당 조건에 부합하면 <code>true</code> 를 반환하여 <strong>작성한 구문</strong>을 실행하고, 반대의 경우 이어서 코드를 <strong>순차적으로 진행</strong>하거나 <strong>다른 조건을 다시금 제시</strong>하는 등의 흐름을 통제하는 기능을 하는 구문이다.
</br>해당 정의를 이해하면 이어지는 <code>if...else</code> 문법에 대한 사항이나 구조에 대한 이해가 쉽게 될 것이다. 그럼 이어서 <code>if...else</code> 문의 <strong>문법</strong>에 대해 알아보자.
</br></p>
<h2 id="ifelse-문의-문법"><code>if...else</code> 문의 문법</h2>
<p><code>if...else</code> 문은 크게 <strong>세 가지</strong> 단계로 이루어진다.
</br>우선 조건을 제시하고 <strong>결과 값이 <code>true</code> 일 경우 구문을 실행</strong>하는 <strong><code>if</code> 문</strong>, <strong>앞의 조건이 <code>false</code> 인 경우 실행</strong>할 내용을 작성하는 <strong><code>else</code>문</strong>, 마지막으로 <strong>앞의 조건이 <code>false</code> 일 경우 새로운 조건을 제시</strong>하는 <strong><code>else if</code></strong> 문이 있다.
</br>해당 부분을 예시 코드로 살펴보자
</br></p>
<pre><code class="language-javascript">if (condition1) { // if
    statement1
} else if (condition2) { // else if
    statement2
} else { // else
    statement3
}</code></pre>
<p></br>위 예시 코드를 보면 조건은 총 <strong>2가지</strong>가 제시되어 있고, 실행 구문은 <strong>3가지</strong>가 작성되어 있다.
</br>먼저 <code>if</code> 부터 보면 <code>if</code> 를 작성하고 소괄호(<code>()</code>)를 열어 해당 <strong>소괄호에 조건(<code>condition1</code>)을 작성</strong>한 다음 중괄호(<code>{}</code>)를 열어 <strong>중괄호 안에 구문(<code>statements1</code>)을 작성하는 구조</strong>를 갖는다.
</br>이어서 나오는 <code>else if</code> 도 <code>if</code> 와 같은 구조인데, 조건(<code>condition2</code>)을 제시하고 실행 구문(<code>statements2</code>)을 작성했으며 별다른 변화는 확인되지 않는다.
</br>그러나 <code>else</code> 의 경우 <strong>조건 부분이 생략</strong>된 것을 알 수 있다. 그 이유는 <code>else</code> 문이 앞의 <strong>모든 조건들에 부합하지 않는 반대의 경우</strong>를 서술하기 때문에 별도로 조건을 작성하지 않아도 되는 것이다.
</br>위 작성 방법은 세 가지 요소를 모두 활용하였을 때 작성할 수 있는 방식이고, <strong><code>else if</code> 와 <code>else</code> 는 필수적인 요소가 아니다.</strong> 그렇기 때문에, <code>else if</code> 와 <code>else</code> 가 생략 가능한 경우를 다음의 예시에서 알아보자.
</br></p>
<pre><code class="language-javascript">// n이 5 이상인 경우 true를 출력하는 조건문
let n = 3
if (n &gt;= 5) { 
    console.log(true)
}
console.log(`none`) // output : `none`</code></pre>
<p></br>위 예시의 경우 조건(<code>n &gt;= 5</code>)이 만족하는 경우 <code>true</code> 를 반환하고, 아닌 경우에는 흐름을 이어서 진행하며 <code>if</code> 문 밖의 <code>console.log()</code> 를 실행하여 <code>none</code> 을 출력한다. 이렇게 반대의 경우를 별도로 규정하지 않아도 되는 경우에는 <code>else</code> 와 <code>else if</code> 를 생략할 수 있다.
</br> 또한 <code>else</code> 만을 추가해서도 구문을 작성할 수 있다.
</br></p>
<pre><code class="language-javascript">// n이 5 이상인 경우 true를 출력하고, 반대의 경우 false를 출력하는 조건문
let n = 3
if (n &gt;= 5) { 
    console.log(true)
} else {
    console.log(false)
}</code></pre>
<p></br>이 경우에는 <code>else</code> 문이 <code>n</code> 이 앞 조건의 반대 상황을 의미하기 때문에 <strong><code>n &gt;= 5</code> 인 조건에 부적합한 모든 경우의 수들</strong>이 이에 해당하는 것이다.
</br>여기서 알아야 할 점은 <strong><code>n &gt;= 5</code> 의 반대가 <code>n &lt; 5</code> 만을 의미하는 것이 아님</strong>을 알아야 한다.
</br>반대의 경우에는 숫자가 아닌 경우(<code>NaN</code>), 값이 정의되지 않은 경우(<code>undefined</code>), 값이 의도적으로 비어있는 경우(<code>null</code>) 등을 포함하기 때문에, 조건의 의도가 <code>n &lt; 5</code> 이었다면 <strong>추가적으로 조건</strong>을 제시해야 할 것이다.
</br>만약 해당 경우 코드를 이런 식으로 수정할 수 있다.
</br></p>
<pre><code class="language-javascript">let n = NaN // n이 숫자 범위가 아닌 상황들을 else로 제시
if (n &gt;= 5) { 
    console.log(true)
} else if (n &lt; 5) {
    console.log(false)
} else {
    console.log(&#39;is Not a Number&#39;)
}</code></pre>
<p></br>해당 코드는 위에서 언급했던 나머지 경우들에 대해 <code>else</code> 를 통해 일괄적으로 정의했고, 앞에 <code>else if</code> 를 추가하여 <code>n &lt; 5</code> 에 대한 조건을 제시하였다. 
</br>알고리즘을 작성하다 보면 조건에 대한 명확한 제시가 되지 않아, 난 정확하게 입력한 것 같은데 예외의 경우에 걸려 답안과 일치하지 않는 상황이 발생하기도 한다. 그렇기 때문에, <strong>조건이 명확하게 어떤 바를 의미하는 지에 대한 이해</strong>를 명확히 하고 적절하게 구문을 사용하여야 한다.
</br></p>
<h3 id="💡-if-와-else-if-만을-사용하는-것">💡 <code>if</code> 와 <code>else if</code> 만을 사용하는 것</h3>
<blockquote>
<p>해당 경우에도 위와 마찬가지라고 생각한다.
</br></p>
</blockquote>
<pre><code class="language-javascript">let n = NaN
if (n &gt;= 5) { 
    console.log(true)
} else if (n &lt; 5) {
  console.log(false)
}
console.log(&#39;else&#39;) // output : &#39;else&#39;</code></pre>
<p></br>위 코드를 보면 변수 <code>n</code> 이 <code>NaN</code> 이기에 결과적으로 <code>&#39;else&#39;</code> 라는 결과 값을 반환한다.
</br>이렇게 코드 진행이 이어지게 하는 것이 의도 된 경우라면 상관이 없지만, 만약 <strong>숫자가 아닌 결과를 오류로 간주하고 진행을 제어해야 하는 상황</strong>이라면 이는 문제가 될 수 있다.
</br>조건문에서 <strong>자신이 생각한 의도</strong>와 <strong>코드에 작성된 의도</strong>가 명확히 일치해야 발생할 수 있는 오류를 최소한으로 할 수 있다고 생각한다.
</br>그렇기에 위 코드의 경우에도 그 의도를 명확히 함이 중요하다고 생각한다.</p>
<p></br>이렇게 <code>if...else</code> 의 문법에 대해 알아보았고, 그렇다면 실제로 이 구문이 어떻게 작동하는 지에 대해 알아보자.
</br></p>
<h2 id="ifelse-문의-흐름"><code>if...else</code> 문의 흐름</h2>
<p><code>if...else</code> 의 흐름에 대해서 알아보기 전에, 앞에서 제시한 예시 코드를 일부 변형한 것을 살펴 보면서 알아보자.
</br></p>
<pre><code class="language-javascript">let n = 3
if (n &gt;= 5) { 
    console.log(&#39;n &gt;= 5&#39;)
} else if (n &lt; 5) {
    console.log(&#39;n &lt; 5&#39;)
} else if (n === 3) {
  console.log(n)
} else {
    console.log(&#39;is Not a Number&#39;)
} // output : &#39;n &lt; 5&#39;</code></pre>
<p></br> 조건문의 흐름은 <strong>조건 일치 여부</strong>에 따라 그 흐름이 결정되는 것은 이미 다 알고 있을 것이다.
</br> 위 경우 변수 <code>n</code> 에 <code>3</code> 이라는 값이 할당되었고, 결과는 <code>3</code> 을 출력할 것 같지만 <code>&#39;n &lt; 5&#39;</code> 를 출력하는 결과를 알 수 있다.
</br>만약 의도한 출력 값이 <code>3</code> 이라면 이는 오류를 출력하지 않지만 문제가 있는 구문이다.
</br>이는 앞의 <code>else if</code> 조건에서 제시된 <code>n &gt; 5</code> 라는 조건이 다음의 <code>n === 3</code> 이라는 조건을 포함하는 조건이었기에, <code>3</code> 이라는 값을 저장한 변수 <code>n</code> 은 앞의 조건에 대해 <code>true</code> 를 반환하였고 그 시점에서 결과 값을 출력한 것이다.
</br>이를 의도한 바가 우선적으로 <code>3</code> 일 경우를 찾기 위함이라면 다음과 같이 수정할 수 있다.
</br></p>
<pre><code class="language-javascript">let n = 3
if (n === 3) { 
    console.log(n)
} else if (n &lt; 5) {
    console.log(&#39;n &lt; 5&#39;)
} else if (n &gt;= 5) {
  console.log(&#39;n &gt;= 5&#39;)
} else {
    console.log(&#39;is Not a Number&#39;)
} // output : 3</code></pre>
<p></br>이렇게 수정한 결과는 올바르게 <code>3</code> 이라는 값을 반환하는 것을 알 수 있다. 
</br>이렇게 조건문의 흐름은 <strong>우선적으로 작성된 조건에서 멈추면 뒤 조건들은 검증할 기회가 주어지지 않기 때문에</strong> 조건의 순서를 정확하게 하여 올바른 결과를 도출하도록 해야 한다.</p>
<p>이어서 <code>switch</code> 문에 대한 내용을 간단하게 알아보고 <code>if</code> 와 어떤 차이점이 있는지에 대한 내용을 알아보자.</p>
<h1 id="🔄-switch-문은-무엇인가">🔄 <code>switch</code> 문은 무엇인가</h1>
<p>우선 <strong><code>switch</code> 문</strong>도 제어문의 일부이며 조건문에 포함된다.
</br><code>switch</code> 문을 간단하게 표현하자면 <strong>단순한 복수의 <code>if</code> 문을 표현하는 구문</strong>이라고도 표현된다. 이 말이 어떤 의미를 갖는 지 <code>switch</code> 문의 문법을 설명하면서 함께 알아보자.</p>
<h2 id="switch-문의-문법과-기능"><code>switch</code> 문의 문법과 기능</h2>
<p><code>switch</code> 문은 다음과 같은 문법을 갖는다.
</br></p>
<pre><code class="language-javascript">switch (x) {
  case &#39;value1&#39;:  // if (x === &#39;value1&#39;)
    ...
    statement1

  case &#39;value2&#39;:  // if (x === &#39;value2&#39;)
    ...
    statement2

  default: // else
    ...
    statement3
}</code></pre>
<p></br>언뜻 보면 <code>if</code> 문과 비슷하지만, 조건에서 <strong>소괄호(<code>()</code>)가 없다는 점</strong>과 실행 구문에서 <strong>중괄호(<code>{}</code>)를 사용하지 않고 콜론(<code>:</code>)을 사용</strong>한다는 점에서 문법적인 요소의 차이를 보여준다.
</br>그리고 <code>switch</code> 문의 경우에는 <code>if</code> 가 아닌 <strong><code>case</code> 문을 통해 일치 여부를 구분</strong>하고, <code>else</code> 대신 <strong><code>default</code> 문을 통해 반대의 경우를 출력하거나 반환</strong>한다.
</br>또한 <strong>기능적인 부분</strong>에서도 차이가 존재하는데, <code>if</code> 의 경우에는 조건 지정의 자유도가 높지만, <code>switch</code> 문의 경우에는 <strong>일치 여부만 판별할 수 있기 때문</strong>에 단순한 조건만 제시할 수 있음을 알 수 있다.
</br>이러한 <code>switch</code> 문은 범위나 복잡한 조건을 제시할 경우에는 사용할 수 없지만, <strong>단순히 일치 여부만 판단해야 하는 <code>if</code> 문이 반복되는 경우</strong>를 대체할 수 있다.</p>
<h4 id="🔖-출처-1">🔖 출처</h4>
<blockquote>
<p><a href="https://ko.javascript.info/switch"><code>switch</code> 문 : JAVASCRIPT.INFO : switch문</a></p>
</blockquote>
</br>

<h3 id="💡-switch-문-언제-작성해야-할까">💡 <code>switch</code> 문, 언제 작성해야 할까?</h3>
<blockquote>
<p><code>switch</code> 문과 <code>if...else</code> 문의 차이점은 <strong>탐색하고자 하는 데이터에 접근하는 방식</strong>에서 차이를 보이는 것으로 이해했다.
</br> 정확한 내용은 CS에 대한 내용이고, 아직 CS가 부족한 본인에게 완벽한 이해가 되지 않기에 최대한 간단하게 해석하여 작성한다.
</br>간단하게 말하자면, <code>if...else</code> 문의 경우 조건에 만족하는 지를 구분하여 <strong>순차적으로 판단</strong>하는 반면에, <code>switch</code> 문의 경우 입력 값에 해당하는 <strong>점프 테이블의 위치로 <code>jump</code> 하는 방식</strong>을 채택한다.
</br>그렇기에, 점프 테이블을 별도로 만들지 않지만 특정 데이터를 찾기 위해 구분하는 과정(조건 구분)이 지속적으로 존재하는 <code>if...else</code> 문의 경우 <strong>조건의 수가 적을 수록 유리하다.</strong>
</br>반대로 구분하는 과정이 대입 값이 무엇인지만 확인하지만, 점프 테이블을 만드는 과정이 필요한 <code>switch</code> 문의 경우 <strong>조건의 수가 많을수록 유리하다.</strong>
</br>당연히도 해당 내용은 <code>if...else</code> 와 <code>switch</code> 둘 다 사용할 수 있는 경우에 해당한다! 😆</p>
</blockquote>
<h4 id="🔖-출처-2">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://thinkpro.tistory.com/132"><code>if...else</code> vs <code>switch</code>  : THINK-PRO BLOG : switch문과 if문의 성능 비교 (ISA 관점에서)</a></p>
</blockquote>
</blockquote>
<h4 id="🔖-전체적인-참고">🔖 전체적인 참고</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else">MDN Web Docs : <code>if...else</code></a>
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/switch">MDN Web Docs : <code>switch</code></a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript : Function]]></title>
            <link>https://velog.io/@p-acid/TIL-JavaScript-Function</link>
            <guid>https://velog.io/@p-acid/TIL-JavaScript-Function</guid>
            <pubDate>Thu, 05 Aug 2021 07:23:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 함수(<code>function</code>)의 다양한 정의 방법과 실행, 사용 이유 등에 대한 내용입니다. 😊</p>
</blockquote>
<h1 id="📒-자바스크립트의-함수란">📒 자바스크립트의 함수란?</h1>
<p>프로그래밍에서 <strong>함수(<code>function</code>)란</strong> 하나의 <strong>특별한 목적의 작업</strong>을 위해 독립적으로 설계된 <strong>프로그램 코드의 집합</strong>이라고 정의할 수 있다.</p>
<p>해당 정의를 이미지로 표현하면,
<img src="https://images.velog.io/images/p-acid/post/6dcaff4f-0f09-498b-89e0-c849ca8c1bed/function_image.png" alt=""></p>
<p>위와 같이 표현될 수 있는데, 이미지에서 나온 특정 <strong>입력 값이 투입</strong>되면 함수를 거쳐 <strong>새로운 출력 값을 반환</strong>하는 것과 같은 역할을 하는 것이다.</p>
<p>자바스크립트에서 함수는 일급 객체로 취급된다.</p>
<h3 id="💡-일급first-class-객체란">💡 일급(<code>first-class</code>) 객체란</h3>
<blockquote>
</blockquote>
<p>다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 일급 객체를 위한 조건은 다음과 같다.
</br></p>
<ul>
<li><strong>변수(<code>variable</code>)</strong>에 담을 수 있다.</li>
<li><strong>인자(<code>parameter</code>)</strong>로 전달할 수 있다.</li>
<li><strong>반환 값(<code>return value</code>)</strong>으로 전달할 수 있다.</br>
#### 🔖 출처
>> [1급 객체 : 위키백과 일급 객체](https://ko.wikipedia.org/wiki/%EC%9D%BC%EA%B8%89_%EA%B0%9D%EC%B2%B4)
[1급 객체 : 최정렬님 github.io](https://bestalign.github.io/dev/first-class-object/)

</li>
</ul>
</br>

<p>위 일급 객체에 대한 설명에서 나온 변수와 인자 그리고 반환 값에 대한 내용이 이어지는 자바스크립트 <strong>함수의 사용법</strong>에서 다뤄진다.</p>
<h1 id="⚙️-함수function-사용법">⚙️ 함수(<code>function</code>) 사용법</h1>
<p>함수도 변수가 선언과 할당의 과정이 있듯이, 마찬가지로 함수는 <strong>정의</strong>와 <strong>실행</strong>의 과정이 있다.</p>
<h2 id="함수의-정의">함수의 정의</h2>
<p>함수를 정의하는 다음과 같은 방법들이 있다.
</br></p>
<ul>
<li>함수 선언문</li>
<li>함수 표현식</li>
<li>화살표 함수 표현식</li>
</ul>
<p></br>우선 <strong>함수 선언문</strong>은 일반적인 프로그래밍 언어에서 함수 선언과 비슷한 형식으로 가장 기본적인 방법이다.</p>
<pre><code class="language-javascript">function functionName(parameter) {
    statements
}</code></pre>
<p></br>위 구문에서 보이는 바와 같이, <code>function</code> 을 작성하고 함수 이름(<code>functionName</code>)을 작성한 뒤에 소괄호(<code>()</code>) 안에 매개변수(<code>parameter</code>)의 이름을 작성한다. 그리고 중괄호를 열어 함수를 실행했을 때 작동되고자 하는 구문(<code>statements</code>)을 작성한다.</p>
<p></br><strong>함수 표현식</strong>은 함수 선언식의 구문과 비슷하지만 <strong>변수 값에 함수를 저장하는 형태</strong>의 구문을 갖는다.</p>
<pre><code class="language-javascript">let functionExpression = function functionName(parameter) {
    statements
}</code></pre>
<p>보이는 바와 같이 함수 선언문과 비슷한 형식이지만 변수(<code>functionExpression</code>)를 선언하여 해당 변수의 값으로 함수(<code>fucntionName</code>)를 할당한다.</p>
<p>위와 같이 구문 작성 방식의 차이가 있기 때문에, 두 방식은 차이점이 존재한다. 그 차이점은 <strong>호이스팅</strong>과 관련된 사항인데, 호이스팅 관련 내용은 이전 <a href="https://velog.io/@p-acid/TIL-Javascript-Basics">자바스크립트 기본에 대한 포스트</a>에 기재했으니 기억 안나면 다시 보는걸로!</p>
<h3 id="💡-함수-선언문과-함수-표현식의-차이점">💡 함수 선언문과 함수 표현식의 차이점</h3>
<blockquote>
<p>간단히 말하자면, <strong>함수 선언문</strong>은 호이스팅에 <strong>영향을 받고</strong>, <strong>함수 표현식</strong>은 호이스팅에 <strong>영향을 받지 않는다</strong>!</br>
해당 내용을 예시를 활용하여 알아보자</p>
</blockquote>
<pre><code class="language-javascript">// 함수 선언문
sayHello(); // output : hello
function sayHello(parameter) {
    console.log(&#39;hello&#39;)
}</code></pre>
<pre><code class="language-javascript">// 함수 표현식
sayHello(); // ReferenceError: sayHello is not defined
let functionExpression = function sayHello(parameter) {
    console.log(&#39;hello&#39;)
}</code></pre>
<p></br>위 두 가지 구문은 공통적으로 함수 실행 이후 선언이 이루어지는 형태이다.
</br>그러나 <strong>함수 선언문의 경우에만</strong> 정상적으로 함수 실행이 작동하는 결과를 확인할 수 있다.
</br>이는 위에서 언급한 바와 같이 호이스팅이 함수 선언문의 경우에만 일어나기 때문이다.
</br>변수는 <code>var</code>는 호이스팅이 일어나기 때문에 해당 방법을 지양하고 <code>let</code>과 <code>const</code> 방식을 지향해야 했다.
</br>마찬가지로, 함수도 호이스팅으로 인해 스코프가 꼬이고 문제 발생에 대한 정확한 원인 분석이 어려워지는 문제점 등이 발생하기 때문에, 대체적으로 <strong>함수 표현식을 지향한다!</strong></p>
</br>

<p>이어서 <strong>화살표 함수(<code>Arrow function</code>)</strong>는 문법에 들어가는 <code>=&gt;</code> 해당 부분이 마치 화살표 같아서 이름 지어진 함수 정의 방식이다. 화살표 함수의 문법은 다음과 같다.
</br></p>
<pre><code class="language-javascript">let arrowFunc = (parameter) =&gt; {
    console.log(&#39;Hi&#39;)
}

arrowFunc() // output : Hi</code></pre>
<p></br>또한, 앞의 두 가지 방식과는 다르게 화살표 함수는 <strong>구문이 짧고</strong>, <strong><code>this</code>의 바인딩 방식</strong>에서 일반 함수와 구분된다.
</br></p>
<h3 id="💡-일반-함수와-화살표-함수의-차이">💡 일반 함수와 화살표 함수의 차이</h3>
<blockquote>
<h4 id="this-에-대한-간단한-이해"><strong><code>this</code></strong> 에 대한 간단한 이해</h4>
<p></br><code>this</code> 를 간단하게 설명하자면, <strong>현재 실행하고 있는 문맥이 무엇인가에 대한 내용</strong>이다.
</br>누가 호출했느냐에 대한 내용이 중요한 부분인데, 브라우저 콘솔을 기준으로 <strong>기본은 <code>window</code></strong> 다.</p>
</blockquote>
<pre><code class="language-javascript">// in browser
console.log(this); // output : window
// strict 모드일 경우, undefined 라고 한다.</code></pre>
<p>이러한 <code>this</code> 객체 안에서는 결과 값이 달라진다.</p>
<pre><code class="language-javascript">var obj = {
  a: function() { console.log(this); },
};
obj.a(); // obj
var a2 = obj.a;
a2(); // window</code></pre>
<p>이는 객체 메서드 호출 시, <code>this</code> 를 <strong>내부적으로 바꾼다</strong>고 한다. 
</br>그러나 아래의 경우에는 <code>window</code> 가 출력된다. 왜냐하면 아래의 경우에는 변수에 값을 저장한 순간 <strong>객체의 메서드가 아닌 일반적인 함수</strong>가 되었기 때문에 더 이상 <code>obj</code> 의 메서드가 아닌 것이다.
</br>이렇게 자바스크립트의 <code>this</code> 는 정적인 것이 아닌 <strong>동적인 존재</strong>로 여겨진다. 이는 일반 함수의 <code>this</code>가  <strong>동적 스코프(<code>dynamic scope</code>)에 해당한다</strong>고 할 수 있다.
</br>그러나 <code>this</code> 는 동적 스코프가 아닌 <strong>정적 스코프(<code>lexical scope</code>)</strong>의 <code>this</code>를 갖는데, 이러한 부분에서 차이점을 가지며 바인딩 방식에 차이를 보인다.
</br>동적 스코프와 정적 스코프에 대한 내용은 아래 간단히 설명할 것이므로 <strong>필요 하에 목차를 눌러 이동하자!</strong>(해당 내용이 너무 길어져 별도로 작성 😂)
</br></p>
<blockquote>
<h4 id="바인딩binding-방식의-차이">바인딩(<code>binding</code>) 방식의 차이</h4>
<p></br>멀고도 먼 길이었다. 이제 바인딩의 차이에 대해 알아보자.
</br>동적 스코프와 정적 스코프에 대한 이해를 마쳤다는 전제 하에 간단히 설명하자면, <strong>화살표 함수</strong>는 함수 선언을 할 때<strong><code>this</code> 에 바인딩하는 객체가 정적으로 결정된다</strong>는 점이다. 이 말은 화살표 함수는 언제나 <strong>상위 스코프의 <code>this</code> 를 가리킨다는 것</strong>이다.
</br>예시 코드를 보면서 해당 내용을 이해해보자.</p>
</blockquote>
<pre><code class="language-javascript">function Person(){
  this.age = 0;
  setInterval(() =&gt; {
    this.age++; // this는 Person 객체를 참조
    console.log(this.age);
  }, 1000); // output : 1... 2... 3...
}
var p = new Person();</code></pre>
<p>콜백 함수(<code>callback function</code>)에 대한 내용은 잠시 미뤄두고 스코프에 대한 내용에 집중하자면, 위와 같은 상황에서 <code>setInterval()</code> 함수의 <code>this</code> 는 <strong>상위 스코프인 <code>Person</code>의 객체를 참조</strong>하여 해당 값인 <code>0</code> 을 사용한다.
</br>위에서 잠깐 언급한 바와 같이, 화살표 함수는 <strong>간단하게 함수 구문을 작성할 수 있다는 장점</strong>과 앞에서 이해한 <strong><code>this</code>의 바인딩 부분</strong>에서 상위의 객체를 참조할 수 있다는 점이 <strong>콜백 함수를 작성하는 데에 용이</strong>하다.
</br>이와 관련되어 콜백 함수에 관련된 내용과 화살표 함수로 대체 가능한 경우에 대한 내용은 별도로 포스팅을 할 예정이다. 👊</p>
<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://www.zerocho.com/category/JavaScript/post/5b0645cc7e3e36001bf676eb"><code>this</code> : 제로초님 개인블로그 : 자바스크립트 this는 무엇인가?</a>
<a href="https://nesoy.github.io/articles/2019-04/Javascript-Arrow-function"><code>Arrow Function Binding</code> : Nesoy Blog : Javascript Arrow function과 Binding에 대해</a></p>
</blockquote>
</blockquote>
<h3 id="💡-lexical-scope와-dynamic-scope">💡 <code>Lexical Scope</code>와 <code>Dynamic Scope</code></h3>
<blockquote>
<p><code>Lexical Scope</code> 는 변수나 함수가 <strong>선언된 곳의 내용</strong> 사용한다는 의미이고, <code>Dynamic Scope</code> 는 변수나 함수가 <strong>호출된 곳의 내용</strong> 사용한다는 의미를 갖는다.
</br> 해당 내용은 어떻게 해석할 수 있을까에 대해 예시 코드를 보면서 알아보자</p>
</blockquote>
<pre><code class="language-javascript">function log() {
  console.log(name);
}
function wrapper() {
  var name = &#39;nero&#39;;
  log();
}
var name = &#39;zero&#39;;
wrapper(); // output : zero</code></pre>
<p>해당 코드는 두 가지 방식에 따라 결과가 달라진다.
</br>우선 자바스크립트는 <code>Lexical Scope</code> 의 방식을 따르고 함수의 <strong>선언에 따라 상위 스코프가 결정</strong>되기 때문에, 코드를 실행하면 결과 값으로 <code>zero</code> 를 반환한다. 
</br>이는 선언을 기준으로 스코프를 결정하기 때문에, 선언하는 순간 <strong>자기 스코프 기준으로 상위 스코프의 가장 가까운 곳의 변수를 고정적으로 참조</strong>한다.
</br>그렇기 때문에, 위 코드의 경우에는 <code>wrapper()</code> 함수가 선언된 시점에서 <strong>상위 스코프의 전역 변수 <code>name</code>을 고정적으로 참조</strong>하기 때문에, 선언 시 <code>nero</code> 라는 값을 가진 <code>name</code> 이라는 지역 변수는 출력 결과에 영향을 주지 않는다.
</br>만약 <code>Dynamic Scope</code> 방식이라면 호출을 기준으로 스코프가 결정되기 때문에, 함수가 선언되고 <code>name</code>의 값이 변경되었지만 <code>wrapper()</code> 함수 내의 <code>log()</code> 함수가 호출 된 시점에서 <code>name</code> 이 재선언 되어 출력 값은 <code>nero</code>로 출력될 것이다.
</br>이정도로 간단하게 각 스코프에 대해 설명할 수 있다. 👌</p>
<h4 id="🔖-출처-1">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://medium.com/@yeon22/javascript-lexical-scope-static-scope-and-dynamic-scope-c4a9e941fab3"><code>Lexical and Dynamic Scope</code> : Suyeon Bak님 medium : (JavaScript) Lexical Scope(Static Scope) and Dynamic Scope</a>
<a href="https://www.zerocho.com/category/JavaScript/post/5740531574288ebc5f2ba97e"><code>Lexical and Dynamic Scope</code> : 제로초님 개인 블로그 : 함수의 범위(scope)</a></p>
</blockquote>
</blockquote>
</br>

<h3 id="함수명에-따른-구분">함수명에 따른 구분</h3>
<p>또한, 함수 작성 방식에서 <strong>함수의 이름(식별자 : <code>identifier</code>)을 작성하는 지의 유무</strong>에 따라 구분되기도 한다.</p>
<blockquote>
<p><a href="https://velog.io/@p-acid/TIL-Javascript-Basics">식별자 규칙에 대한 내용 리마인드! 🧐</a></p>
</blockquote>
<p>일반적으로 함수의 이름을 정의하는 함수 형태를 <strong>기명 함수</strong>라 하고, 반대로 참조할 식별자 없이 선언된 함수를 <strong>익명 함수</strong>라 한다.</p>
<pre><code class="language-javascript">// 기명 함수
function sayHello1() {
    console.log(&#39;Hello, World&#39;)
}
// 익명 함수 1
let sayHello2 = function () {
    console.log(&#39;Hello, World&#39;)
}</code></pre>
<p>위와 같이 기명 함수(<code>sayHello1()</code>)는 해당 <strong>함수명을 통해 선언</strong>되었지만, 아래 익명 함수(<code>sayHello2()</code>)의 경우 함수 표현식의 구문으로 <code>let</code> 을 통해 변수에 할당되었으며, <strong>변수명을 통해 구분</strong>할 수 있다.
</br>그리고 기명 함수의 경우엔 선언된 함수명을 통해 실행하지만, 아래 익명 함수의 경우에는 <strong>변수명을 통해 실행 가능</strong>하다. 위 익명 함수의 경우에는 아래와 같이 실행된다. </p>
<pre><code class="language-javascript">sayHello2(); // 기명 함수와 동일</code></pre>
<p>이러한 익명 함수는 주로 <strong>다른 함수에 대한 인수</strong>로 사용하거나, <strong>클로저(<code>closure</code>)</strong>로 사용하는 경우에 활용된다.</p>
<blockquote>
<p><strong>클로저(<code>closure</code>)</strong>는 간단하게 말하자면 <strong>내부 함수가 외부 함수에 접근할 수 있는 것에 대한 내용</strong>인데, 이후 별도의 포스팅을 진행할 것이다. 그래도 지금 당장 이해가 필요하다면 아래 링크로!</br></p>
</blockquote>
<h4 id="🔖-참고">🔖 참고</h4>
<blockquote>
<blockquote>
<p><a href="https://opentutorials.org/course/743/6544"><code>closure</code> : 생활코딩 : 클로저</a></p>
</blockquote>
</blockquote>
</br>

<h3 id="return-문의-역할"><code>return</code> 문의 역할</h3>
<p>그리고 함수에서 <strong>작동된 구문에 따라 나오는 결과 값을 반환하기 위해</strong>서는 <strong><code>return</code> 문</strong>이 존재해야 한다. 다음의 코드를 살펴보면서 알아보자.
</br></p>
<pre><code class="language-javascript">// return 문이 없는 함수
function sayHello() {
    let a = &#39;Hello, World&#39;
}
console.log(sayHello()) // output : undefined</code></pre>
<p></br>해당 함수의 경우 변수 <code>a</code> 에 <code>&#39;Hello, World&#39;</code> 라는 문자열을 저장하였지만, 이를 실행하여 <code>console</code> 에 출력하니 <code>undefined</code> 라는 값을 반환하였다.
</br>이는 함수의 <strong>기본 반환 값이 <code>undefined</code></strong> 로 정해져있고, <strong><code>returtn</code> 값을 설정하지 않았기에</strong> 기본 값이 출력된 것이다.
</br>해당 코드에서 변수 <code>a</code> 의 값을 출력하기 위해서 다음과 같이 수정할 수 있다.
</br></p>
<pre><code class="language-javascript">// return 문이 있는 함수
function sayHello() {
    let a = &#39;Hello, World&#39;
    return a
}
console.log(sayHello()) // output : &#39;Hello, World&#39;</code></pre>
<p></br>위 코드에서 <code>return</code> 값으로 <code>a</code> 를 설정하니 의도한 대로 <code>Hello, World</code>를 출력하는 것을 알 수 있었다. 
</br>해당 경우에는 단순히 <code>console</code> 에 출력하는 것이 목적이었지만, <code>return</code> 은 구문에 대한 값을 반환한다는 점에서 중요한 요소 중 하나이다.
</br></p>
<h2 id="함수의-실행">함수의 실행</h2>
<p>이미 위에서도 많이 봤겠지만, 함수의 실행은 다음과 같은 형식으로 할 수 있다.</p>
<pre><code class="language-javascript">function sayHello() {
    console.log(&#39;Hello, World&#39;)
}
sayHello(); // output : &#39;Hello, World&#39;</code></pre>
<p>위와 같이 <strong>함수명에 소괄호를 붙혀</strong> 실행할 수 있다. 또한 앞에서 언급한 익명 함수의 경우에는 변수명을 활용하여 함수를 선언할 수 있다.
</br>그리고 함수 실행을 선언 이후에 별도로 진행하는 것 말고도, 선언과 동시에 <strong>즉시 함수를 실행하는 함수</strong>도 존재한다.</p>
<pre><code class="language-javascript">// 기명 즉시 실행 함수 1
(function sayHello() {
    console.log(&#39;Hello, World&#39;)
})(); // output : &#39;Hello, World&#39;
// 기명 즉시 실행 함수 2
(function sayHello() {
    console.log(&#39;Hello, World&#39;)
}()); // output : &#39;Hello, World&#39;
// 익명 즉시 실행 함수 1
(function () {
    console.log(&#39;Hello, World&#39;)
})(); // output : &#39;Hello, World&#39;
// 익명 즉시 실행 함수 2
(function () {
    console.log(&#39;Hello, World&#39;)
}()); // output : &#39;Hello, World&#39;</code></pre>
<p>위 네 가지 함수 구문은 기명과 익명 함수로 구분되고 괄호의 위치만 달라진다. 괄호의 위치가 변경되어도 보시다시피 결과 값은 동일하다.
</br> <strong>즉시 실행 함수</strong>의 문법을 말하자면 함수를 작성하고 함수를 소괄호로 감싼 뒤, 인자를 포함할 소괄호를 다시금 작성해주면 된다.
</br>함수 표현식으로도 즉시 실행 함수를 작성하였지만, 익명 기명 구분 없이 오류가 발생했다.</p>
<pre><code class="language-javascript">(let sayHello = function () {
    console.log(&#39;Hello, World&#39;)
})(); // SyntaxError: /src/index.js: Unexpected reserved word &#39;let&#39; (2:1)</code></pre>
<p>위와 같은 구문 오류를 반환하는 것을 알 수 있다.</p>
<h4 id="🔖-출처-2">🔖 출처</h4>
<blockquote>
<p><a href="https://beomy.tistory.com/9">즉시 실행 함수 : beomy님 tistory : [자바스크립트] 함수(Function), 즉시실행함수(Immediately-invoked function expression)</a></p>
</blockquote>
<h1 id="🧐-함수를-사용하는-이유">🧐 함수를 사용하는 이유</h1>
<p>이렇게 함수에 대해 어느 정도 알아봤으니 함수를 사용하는 이유에 대해서도 간단하게 알아보자. 해당 내용에 대해서는 <strong>재사용성, 가독성, 모듈화</strong>라는 세 가지 키워드를 통해 알 수 있다.</p>
<h2 id="재사용성">재사용성</h2>
<p>재사용성은 말그대로 <strong>코드의 재사용</strong>에 대한 것을 의미한다.
</br>예를 들어, 같은 기능을 하는 구문이 있지만 사용되는 인자가 달라서 인자마다 같은 형식의 구문을 반복한다면 해당 구문은 매우 길어질 것이며, 불필요한 반복 업무 또한 늘어날 것이다.
</br></p>
<pre><code class="language-javascript">// 일정 구간에서 2의 배수들을 배열에 담는 구문
let two = []
for (let i = 1; i &lt; 10; i++) {
  two.push(i*2)
} 
console.log(two) // output :  [2, 4, 6 ... , 18]
// 일정 구간에서 3의 배수들을 배열에 담는 구문
let three = []
for (let i = 1; i &lt; 10; i++) {
  two.push(i*3)
} 
console.log(three) // output :  [3, 6, 9 ... , 27]</code></pre>
<p></br>해당 경우에 함수를 사용한다면 같은 함수에 인자만 다르게 대입하여 코드를 재사용할 수 있고, <strong>간략한 코드와 반복 업무의 감소</strong>를 도모할 수 있다.
</br></p>
<pre><code class="language-javascript">function pushMultiple(n) {
  let arr = []
  for (let i = 1; i &lt; 10; i++) {
    arr.push(i*n)
  }
  return arr
}
console.log(pushMultiple(2)) // output :  [2, 4, 6 ... , 18]
console.log(pushMultiple(3)) // output :  [3, 6, 9 ... , 27]</code></pre>
</br>

<h2 id="가독성">가독성</h2>
<p>가독성 또한 간단하게 말해 <strong>읽기 쉬운 코드</strong>를 의미한다. 해당 내용도 재사용성에서 사용한 예시를 활용하여 설명할 수 있다.
</br>먼저 읽기 쉽다는 것은 <strong>복잡하지 않고 간략하다</strong>는 의미가 될 수 있다.
</br>위 예시를 보면 함수를 사용하지 않은 구문과 함수를 사용한 구문이 단순히 코드 줄 갯수의 부분에서 차이가 있다는 것을 알 수 있다. 코드가 짧다는 것은 간략하게 같은 기능을 실행하고 이해할 수 있다는 장점이 된다.
</br>또한, 읽기 쉽다는 것은 <strong>해석에 용이하다</strong>는 의미도 포함된다.
</br>앞서 함수를 사용하지 않고 작성한 구문의 경우에는 출력하기 이전에 해당 변수명이나 <code>for</code> 문을 보고 직관적으로 결과 값을 예측하기 어려운 부분이 있다.
</br>그러나 함수를 사용한 구문은 <code>pushMultiple()</code> 이라는 함수명에서 해당 함수가 배수와 <code>push()</code> 메서드를 활용한다는 부분에 대해 어느 정도 유추할 수 있기에 해당 코드를 읽고 해석하는 것에 있어 유용하다.
</br></p>
<h2 id="모듈화">모듈화</h2>
<p>모듈화에 대한 이해를 위해 우선 <strong>모듈(<code>module</code>)</strong>에 대한 개념을 간단히 이해해보자.
</br><strong>모듈</strong>이란 소프트웨어 설계에서 기능 단위로 분해하고 추상화 되어 재사용 및 공유 가능한 수준으로 만들어진 단위를 의미하는데, 그러한 의미에서 <strong>모듈화</strong>는 <strong>원활한 협업</strong>을 도와주는 역할을 한다고 보면 된다.
</br> 필요 기능을 정의하고 구조적인 부분에서 서로에게 영향을 주지 않도록 코드를 작성하여, 오류가 발생하였을 때 디버깅의 과정에서 확실한 원인 파악과 이후 원활하고 신속한 수정 및 보수의 과정을 할 수 있다는 부분이 모듈화에 대한 내용에 포함된다.</p>
<h4 id="🔖-출처-3">🔖 출처</h4>
<blockquote>
<p><a href="https://myhappyman.tistory.com/19">함수를 사용하는 이유 : 개발 흔적 남기기 : Javascript - 함수(Function)를 사용하는 이유, 문법</a>
<a href="https://vincentgeranium.github.io/study/2019/08/26/module.html"><code>module</code> : VincentGeranium Blog : 모듈(Module)와 모듈화란?</a></p>
</blockquote>
<h4 id="🔖-전체적인-참고">🔖 전체적인 참고</h4>
<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions">함수 : MDN Web Docs : 함수</a></p>
</blockquote>
<h4 id="📓-수정-로그">📓 수정 로그</h4>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>수정 날짜</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>210806</td>
<td>미작성한 <code>return</code> 에 대한 개념 추가</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JavaScript Basics]]></title>
            <link>https://velog.io/@p-acid/TIL-Javascript-Basics</link>
            <guid>https://velog.io/@p-acid/TIL-Javascript-Basics</guid>
            <pubDate>Fri, 30 Jul 2021 17:21:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트의 기초적인 내용인 데이터 타입과 변수 선언 및 할당에 대한 내용입니다 :)</p>
</blockquote>
<hr>
<h1 id="💾-data-types">💾 Data types</h1>
<p>자바스크립트의 데이터 종류는 기본 타입과 참조 타입으로 구분된다.
</br></p>
<h2 id="기본-타입primitive-type"><strong>기본 타입(Primitive type)</strong></h2>
<p>: 원시 자료형, 원시 데이터라고도 하며 변경 불가능한 값이다.</p>
<ul>
<li>숫자형(Number) : <code>1</code> <code>100</code></li>
<li>문자형(String) : <code>cat</code> <code>dog</code> <code>&quot;1&quot;</code></li>
<li>논리형(Boolean) : <code>true</code> <code>false</code></li>
<li><u>null</u> : <u><code>null</code></u></li>
<li><u>undefined</u> : <u><code>undefined</code></u></br>

</li>
</ul>
<h3 id="💡-null과-undefined의-차이점">💡 <strong><code>null</code>과 <code>undefined</code>의 차이점</strong></h3>
<blockquote>
<ul>
<li>이 두 타입 모두는 값이 없음을 의미하지만, <code>null</code>의 경우엔 <strong>의도적으로</strong> 값이 비어있음을 의미하고, <code>undefined</code>의 경우엔 변수의 <strong>선언만 이루어지고</strong>, 값을 할당하지 않은 상태이다.</li>
</ul>
</blockquote>
<h2 id="참조-타입reference-type"><strong>참조 타입(Reference type)</strong></h2>
<p>: 값 자체를 복사하는 원시 타입과 달리 주소를 복사한다.</p>
<ul>
<li>배열(Array) : <code>[1, &#39;cat&#39;, true]</code></li>
<li>객체(Object) : <code>{ a : 200 }</code></li>
<li>함수(Function) : <code>function sayHello() {}</code></br>

</li>
</ul>
<h1 id="🔗-변수와-선언-및-할당">🔗 변수와 선언 및 할당</h1>
<p><strong>변수(variable)</strong>란 하나의 값(데이터)을 저장하기 위한 메모리 공간을 의미한다.</p>
<p>변수는 <strong>선언</strong>을 통해 해당 메모리 공간을 만들고, <strong>할당</strong>을 통해 데이터를 해당 공간에 저장한다.</p>
<h2 id="변수의-선언">변수의 선언</h2>
<p><strong>변수의 선언</strong>은 다음의 세 가지 방법으로 이루어진다.</p>
<ul>
<li><code>var</code></li>
<li><code>let</code></li>
<li><code>const</code></li>
</ul>
<p>변수의 선언은 <strong>한 번에 하나의 변수를 선언하는 것</strong>과 <strong>여러 변수를 선언하는 것</strong> 모두 가능하다.</p>
<pre><code class="language-javascript">// 하나의 변수 선언
let a;

// 여러 변수 동시에 선언
let a, b, c;</code></pre>
<p>기존에 자바스크립트에서 변수 선언은 <code>var</code>로 가능했으나, <u>ES6 부터 <code>let</code>과 <code>const</code>가 추가되어 사용되고 있다.</u></p>
<h3 id="💡-왜-let과-const를-사용하는가"><strong>💡 왜 <code>let</code>과 <code>const</code>를 사용하는가</strong></h3>
<blockquote>
<ul>
<li><strong>호이스팅(Hoisting)</strong>과 <strong>스코프(Scope)</strong>에 대한 간단한 이해</li>
</ul>
</blockquote>
<h4 id="호이스팅hoisting">호이스팅(Hoisting)</h4>
<pre><code class="language-javascript">console.log(a); // output: undefined
var a = &#39;Hello, World&#39;;
console.log(a); // output: Hello, World</code></pre>
<p>호이스팅은 함수 안의 선언들을 미리 훑어 코드 최상단에 선언하는 것이다.<br/>
위 예시를 보면 <code>var</code>를 사용하여 선언된 변수 <code>a</code>가 선언되기 이전에 <code>console.log</code>를 실행했음에도, 불구하고 에러가 발생하지 않았으며 <code>undefined</code>라는 값을 반환한다. 이는 호이스팅을 통해 우선적으로 변수 선언 부분만 분리하여 최상단으로 끌어올렸기 때문이다.<br/>
비교적 과거의 게시물에서는 호이스팅이 <code>var</code> 변수 선언과 함수선언문에서 이루어진다고 기재되어 있는데, 실제로 코드를 작성해보니 <code>let</code>과 <code>const</code>, 함수표현식, 화살표 함수 등 전부 호이스팅이 되었다. 어느 시점 이후부터 수정된 듯 보인다.</br>
그러므로 <code>var</code>, <code>let</code>, <code>const</code>, <code>function</code>, <code>function*</code>, <code>class</code> 키워드를 사용해 선언한 <strong>모든 식별자(변수, 함수, 클래스 등)는 호이스팅이 된다</strong>고 보는 것이 맞는 것 같다.</p>
<h4 id="스코프scope">스코프(Scope)</h4>
<pre><code class="language-javascript">let a = 1; // a : 전역 변수
function local() {
  let b = 2; // b : 지역 변수
}</code></pre>
<p><strong>유효범위</strong>의 의미를 갖는 스코프는 크게 코드 전 영역에서 참조 가능한 <strong>전역 스코프(Global scope)</strong>와 함수 코드 블록 내에서만 참조 가능한 <strong>지역 스코프(Local scope)</strong>로 구분된다.<br/>
변수는 선언 위치에 따라 스코프가 정해지기 때문에, 전역에서 선언되면 <strong>전역 변수(Global variable)</strong> 지역 내 선언 변수는 <strong>지역 변수(Local variable)</strong>이 된다.<br/>
위 경우 변수 <code>a</code>는 전역 변수이기 때문에 코드 전역에서 참조할 수 있지만, 변수 <code>b</code>는 함수 <code>local</code> 안에서만 참조할 수 있다.
<br/></p>
<ul>
<li><code>var</code>와 <code>let</code>, <code>const</code>의 차이점<br/><h4 id="함수-레벨-스코프와-블록-레벨-스코프">함수 레벨 스코프와 블록 레벨 스코프</h4>
<code>var</code>는 <strong>함수 레벨 스코프</strong>를 따르는데 이는 변수의 스코프를 구분하는 기준이 함수라는 의미이다.</br><pre><code class="language-javascript">function func() {
if (true) {
  var a = 1;
}
a = 2;
console.log(a);
}
func(); // output : 2</code></pre>
임의로 만든 <code>func</code> 함수의 <code>if</code> 문 안에서 변수 <code>a</code>의 선언이 이루어졌지만, <code>var</code>는 함수 레벨 스코프를 따르기 때문에 <code>if</code> 블록 밖에서도 변수 <code>a</code>의 참조(접근)가 가능하다.</br>
반면에 <code>let</code>과 <code>const</code>는 <strong>블록 레벨 스코프</strong>로 블록 단위로 스코프를 구분한다.<pre><code class="language-javascript">function func() {
if (true) {
  let a = 1;
}
a = 2;
console.log(a);
}
func(); // output : ReferenceError : a is not defined </code></pre>
그렇기 때문에 <code>let</code>으로 선언된 <code>if</code> 블록 밖의 변수 <code>a</code>는 정의가 되지 않았다는 결과가 나온다.<br/></li>
<li>정리</br>
<code>var</code>는 함수 외부라면 <strong>전역 변수</strong>에 해당하고, 참조의 영역이 비교적 방대하기 때문에 디버깅의 과정에서 <strong>원인 파악의 어려움</strong>을 주거나, 중복 선언 가능으로 인해 <strong>예측하지 못한 값의 반환</strong>이 이루어 질 수 있기 때문에 문제가 된다. 그러므로 재선언이 불가능하고 블록 레벨 스코프를 지원하는 <strong><code>let</code>과 <code>const</code>를 사용함이 바람직</strong>하다.<blockquote>
<blockquote>
<p>✔️ 추가적인 내용 : <code>let</code>과 <code>const</code>의 차이점</p>
</blockquote>
<p>구분|<code>let</code>|<code>const</code></p>
</blockquote>
</li>
<li>|-|-
재선언|X|X
재할당|O|X<h4 id="🔖-출처">🔖 출처</h4>
<blockquote>
<blockquote>
<p><a href="https://www.howdy-mj.me/javascript/var-let-const/">호이스팅 및 스코프 - MJ Kim&#39;s GitHub.io</a>
<a href="https://poiemaweb.com/js-scope">스코프 - Poiemaweb</a></p>
</blockquote>
</blockquote>
</li>
</ul>
</br>

<p>또한, 변수 선언 과정 중 <u>변수명을 작성하는 과정에서 식별자 규칙을 준수해야 한다.</u></p>
<h3 id="💡-식별자identifier">💡 식별자(Identifier)</h3>
<blockquote>
<p><strong>식별자(Identifier)</strong>란 이름을 붙일 때 사용하는 단어다.</br>
<strong>변수</strong>명, <strong>함수</strong>명 <strong>속성</strong>명, <strong>메소드</strong>명 등이 이에 해당하기에, 변수 이름 작성에 있어서도 다음의 식별자 작성 규칙에 따라야한다.</p>
</blockquote>
<h4 id="📓-식별자-규칙">📓 식별자 규칙</h4>
<ul>
<li><strong>키워드</strong>를 사용할 수 없다.<ul>
<li>키워드 : 제어문의 시작과 끝, 특정한 조작 목적 등으로 쓰이는 단어</li>
<li>ex) <code>break</code> , <code>for</code> , <code>function</code> 등</li>
</ul>
</li>
<li><strong>첫 번째 글자</strong>는 <strong>문자</strong>, <strong>언더스코어</strong>(<code>_</code>), <strong>달러사인</strong>(<code>$</code>)으로만 시작 가능하다.
= <strong>숫자</strong>는 <strong>불가능하다</strong>.</li>
<li><strong>언더스코어</strong>(<code>_</code>), <strong>달러사인</strong>(<code>$</code>)를 제외한 특수문자는 사용 불가능하다.</li>
<li><strong>공백</strong>은 포함하지 못한다.
</br>위와 같은 규칙에 부합하지 않으면 에러가 발생한다.
또한, 식별자 관례에 대한 내용으로 <code>camelCase</code>에 대한 내용이 있다.</br>
<code>camelCase</code> 란 식별자 작성 중 하나인데, 식별자 전체 중 <strong>첫 번째 단어를 제외한 모든 단어의 앞자리를 대문자로 변경</strong>하는 방식이다.</br>
예를 들면 <code>myname</code> 이라는 변수명의 경우, <code>myName</code>이라고 작성한다.</li>
</ul>
<h2 id="변수의-할당">변수의 할당</h2>
<p><strong>변수의 할당</strong>은 <strong>할당연산자</strong>(<code>=</code>)를 통해 이루어지고, <code>x = y</code> 라면, <strong>y의 값을 x에 할당함</strong>을 의미한다.</p>
<p>변수의 할당은 <strong>선언과 분리할 수 있으며</strong>, 한 번에 <strong>여러 변수를 선언함</strong>과 동시에 <strong>할당할 수 있다.</strong></p>
<pre><code class="language-javascript">// 선언과 할당 분리
let a; // 선언
a = 1; // 할당
console.log(a); // output : 1

// 한 번에 여러 변수를 선언과 분리하여 할당
let b, c, d;
b = 1, c = 2, d = 3;
console.log(b, c, d); // output : 1 2 3

// 한 번에 여러 변수를 선언과 동시에 할당
let e = 1, f = 2, g = 3;
console.log(b, c, d); // output : 1 2 3</code></pre>
<p>위에서 언급한 바와 같이 <code>let</code>과 <code>const</code>는 <strong>재할당</strong>의 영역에서 구분되는데 이는 다음과 같다.</p>
<pre><code class="language-javascript">let a;
a = 1;
console.log(a); // output : 1
a = 2;
console.log(a); // output : 2</code></pre>
<pre><code class="language-javascript">let a = 1;
console.log(a); // output : 1</code></pre>
<p><code>let</code>의 경우 변수의 선언과 할당을 분리하여 진행할 수 있고, 재할당도 가능하다. 또한, 변수의 선언과 할당을 동시에 진행하는 것도 가능하다.</p>
<pre><code class="language-javascript">const b; // SyntaxError : Const declarations require an initialization value</code></pre>
<pre><code class="language-javascript">const b = 1;
b = 2 // TypeError: &quot;b&quot; is read-only
</code></pre>
<p>하지만, <code>const</code>의 경우 선언과 동시에 값을 할당하지 않으면 에러가 발생하고, 재선언의 경우에도 에러가 발생한다.</p>
<p>이를 구분하여 <code>let</code>과 <code>const</code>를 적절한 용도에 사용하면 된다!</p>
<h4 id="📓-수정-로그">📓 수정 로그</h4>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>수정 날짜</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>210803</td>
<td><strong>선언과 할당 분리</strong> 내용 및 <strong>식별자</strong> 내용 추가</td>
</tr>
<tr>
<td>210805</td>
<td>수정 로그 <strong>표로 변경</strong></td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>