<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jack_whiteblack.log</title>
        <link>https://velog.io/</link>
        <description>개린이의 개발 고수되기 작전!</description>
        <lastBuildDate>Thu, 09 Feb 2023 13:24:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jack_whiteblack.log</title>
            <url>https://velog.velcdn.com/images/jack_whiteblack/profile/b3136450-0863-46b5-b0cd-fa9781e5d2fb/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jack_whiteblack.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jack_whiteblack" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JavaScript - 순서도 그리기]]></title>
            <link>https://velog.io/@jack_whiteblack/JavaScript-%EC%88%9C%EC%84%9C%EB%8F%84-%EA%B7%B8%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@jack_whiteblack/JavaScript-%EC%88%9C%EC%84%9C%EB%8F%84-%EA%B7%B8%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Thu, 09 Feb 2023 13:24:29 GMT</pubDate>
            <description><![CDATA[<h2 id="1-프로그램-절차를-만들-때의-원칙">1. 프로그램 절차를 만들 때의 원칙</h2>
<ol>
<li>프로그램 절차의 개수는 정해져 있어야 한다.</li>
<li>각 절차는 항상 같은 내용이어야 한다.</li>
<li>최대한 모든 가능성을 고려해야 한다.</li>
<li>예시는 절차를 검증하는 데 사용한다.</li>
</ol>
<p>👉 예시
끝말잇기</p>
<ol>
<li>게임에 몇 명이 참가할지를 선택한다.</li>
<li>참가자 순서를 정한다. (편의상 숫자로 한다.)</li>
<li>첫 번째 사람이 어떤 단어를 말한다.</li>
<li>다음 사람이 어떤 단어를 말한다.</li>
<li>절차 4에서 말한 단어가 올바른지 판단한다.</li>
<li>올바르다면 그 다음 사람이 어떤 단어를 말한다.</li>
<li>올바르지 않다면 틀렸다고 표시한다.</li>
<li>게임을 계속 진행한다.</li>
</ol>
<p>=&gt; 순서가 항상 일정한 것이 아니기 때문에 차례대로 나열하는 것보다 순서도를 그리는 것이 낫다.</p>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/585a295d-c8a2-439e-85f1-777099e45874/image.png" alt=""></p>
<br>

<h2 id="2-대화창-prompt-alert-confirm">2. 대화창 (prompt, alert, confirm)</h2>
<h3 id="1-prompt">1. prompt</h3>
<ul>
<li>브라우저에서 입력을 할 수 있는 대화 상자</li>
</ul>
<pre><code class="language-javascript">&lt;script&gt;
    prompt(&#39;몇 명이 참가하나요?&#39;);
&lt;/script&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/a8a782a8-df25-42bf-8554-090c1150afcd/image.png" alt=""></p>
<pre><code class="language-javascript">- prompt에 입력을 하면 문자열로 입력이 되기 때문에 숫자로 만들어줘야 한다.

&lt;script&gt;
    const number = parseInt(prompt(&#39;몇명이 참가하나요?&#39;), 10);
        or
    const number = Number(prompt(&#39;몇명이 참가하나요?&#39;), 10);
&lt;/script&gt;

-&gt; 10은 10진법이라는 것을 알려주기 위해 작성</code></pre>
<h3 id="2-alert">2. alert</h3>
<ul>
<li>알림창, 경고창</li>
</ul>
<pre><code class="language-javascript">alert(&#39;사용자에게 표시할 메시지&#39;);</code></pre>
<pre><code class="language-javascript">&lt;script&gt;
  const number = parseInt(prompt(&#39;몇명이 참가하나요?&#39;), 10);
  alert(number);
&lt;/script&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/bdb398c9-1527-44de-9209-f6b0b3ebeef2/image.png" alt=""></p>
<h3 id="3-confirm">3. confirm</h3>
<ul>
<li>맞는지 아닌지 확인 창 (boolean 값 : true or false)</li>
</ul>
<pre><code class="language-javascript">&lt;script&gt;
  const number = parseInt(prompt(&#39;몇명이 참가하나요?&#39;), 10);
  alert(number);
  const yesOrNo = confirm(&#39;맞나요?&#39;);
&lt;/script&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/383c332b-fee5-40b8-b013-0acc94916b3a/image.png" alt=""></p>
<blockquote>
<p>prompt : 함수는 사용자로부터 값을 전달받는다.
alert : 사용자에게 경고 메시지를 표시한다.
confirm : 함수는 사용자의 확인을 요구한다.</p>
</blockquote>
<br>

<h2 id="3-html-태그-선택하기-queryselector">3. HTML 태그 선택하기 (querySelector)</h2>
<ul>
<li>자바스크립트에서 HTML 태그를 가져오는 것을 선택한다고 표현한다.
(document.querySelector 함수 사용)</li>
</ul>
<pre><code class="language-javascript">document.querySelector(&#39;선택자&#39;)

-&gt; 선택자는 HTML 태그를 선택할 수 있게 도와주는 문자열</code></pre>
<pre><code class="language-javascript">input 태그
&lt;script&gt;
  const $input = document.querySelector(&#39;input&#39;);
  console.log($input);
&lt;/script&gt;

button 태그
&lt;script&gt;
  const $button = document.querySelector(&#39;button&#39;);
  console.log($button);
&lt;/script&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/fd9cd2b3-b5da-4d01-bf09-169757fc7cd3/image.png" alt=""></p>
<ul>
<li>태그가 여러 개있는 경우에 태그를 모두 선택하고 싶다면 document.querySelectorAll 함수를 사용한다.<img src="https://velog.velcdn.com/images/jack_whiteblack/post/dfe277e8-7cfe-430e-9535-034a956ac84a/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/a4b1c347-1fcf-45f1-8488-63d821f7ff84/image.png" alt=""></li>
<li><blockquote>
<p>document.querySelector를 사용 할 경우에는 여러 개 중 첫번째가 선택이 된다.</p>
</blockquote>
</li>
</ul>
<pre><code class="language-javascript">word-relay.html

&lt;script&gt;
  const number = parseInt(prompt(&#39;몇명이 참가하나요?&#39;), 10);
  alert(number);
  const yesOrNo = confirm(&#39;맞나요?&#39;);

 document.querySelector(&#39;span&#39;);
 document.querySelector(&#39;#order&#39;); // #는 아이디를 뜻한다.

 // 버튼 3개 중 2개
document.querySelectorAll(&#39;.btn&#39;); // .은 클래스를 뜻한다.
&lt;/script&gt;</code></pre>
<pre><code class="language-javascript">document.querySelector(&#39;#아이디&#39;);
document.querySelector(&#39;.클래스&#39;);</code></pre>
<pre><code class="language-html">&lt;body&gt;
&lt;div&gt;&lt;span id=&quot;order&quot;&gt;1&lt;/span&gt;번째 참가자&lt;/div&gt;
&lt;div&gt;제시어: &lt;span id=&quot;word&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;input type=&quot;text&quot;&gt;
&lt;button&gt;입력&lt;/button&gt;
&lt;script&gt;
    const $span = document.querySelector(&#39;div span&#39;);
       // 태그와 태그사이에 공백이 있으면 자손 태그를 나타내는 것이다.
      // -&gt; div의 자손인 span을 찾아라
      // 자식 : div 태그 바로 안에 들어있는 span 태그 (&#39;div&gt;span&#39;);
      // 자손 : 손자까지 포함 span 태그 안에 들어있는 태그들
      console.log($span);
&lt;/script&gt;
&lt;/body&gt;</code></pre>
<pre><code class="language-javascript">선택자가 여러 개일 때
document.querySelector(&#39;선택자 내부선택자 내부선택자...&#39;);</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/7b7ca0bd-0a55-4909-a598-f4c178d0462a/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/3448e6b5-589c-49e6-a74d-b2a60b173b1e/image.png" alt=""></p>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p>[리뉴얼] 렛츠기릿 자바스크립트 (조현영 / 인프런)</p>
<p>✔ 제로초님(조현영님) JavaScript 강의를 보고 공부한 것을 정리하였습니다.
✔ 사진 및 자료 삽입도 제로초님(조현영님) 강의에서 가져왔습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - 기본 문법 (3)]]></title>
            <link>https://velog.io/@jack_whiteblack/JavaScript-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-3</link>
            <guid>https://velog.io/@jack_whiteblack/JavaScript-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-3</guid>
            <pubDate>Mon, 06 Feb 2023 06:35:30 GMT</pubDate>
            <description><![CDATA[<h2 id="1-객체">1. 객체</h2>
<ul>
<li>객체(object) : 자료형의 일종으로 다양한 값을 모아둔 또다른 값<ul>
<li>종류 : 배열(array), 함수(function), 배열이나 함수가 아닌 객체
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/bd23db25-a667-4869-a766-74ed5e726ca7/image.png" alt=""></li>
</ul>
</li>
</ul>
<br>

<h3 id="1-배열-기본">1. 배열 기본</h3>
<ul>
<li>배열 : 다양한 자료형들을 하나로 묶어둔 것 -&gt; 값들을 나열한 것
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/f6c2ce46-055b-402a-a797-d41bd537bdd1/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/2266948b-7717-41cf-b0d0-c9548df40f8d/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/7b3154ac-a51d-4a33-976b-3369e41a7283/image.png" alt=""></li>
</ul>
<ul>
<li>배열의 요소 개수 구하기 : 배열 이름 뒤에 .length를 붙이면된다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/33883bff-0e83-4e27-a23d-23947dcf0aa5/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/536586df-0940-40c1-bf9b-a0b5a60c6bbd/image.png" alt=""></li>
</ul>
<p>❓ Quiz</p>
<blockquote>
<p>arr라는 배열이 있을 때 배열의 마지막에서 세 번째 요소 찾기</p>
</blockquote>
<pre><code class="language-javascript">&gt; const arr = [1,2,3,4,5]
&gt; console.log(arr[arr.length - 3]); -&gt; 정답

&lt; 3</code></pre>
<ul>
<li>배열 요소 추가</li>
</ul>
<pre><code class="language-javascript">&gt; const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  target[5] = &#39;f&#39;;
  console.log (target);

&lt;[&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;]</code></pre>
<ul>
<li>배열의 제일 앞에 값을 추가하고 싶을 때 &#39;unshift&#39; 사용</li>
</ul>
<pre><code class="language-javascript">&gt; const target = [&#39;나&#39;, &#39;다&#39;, &#39;라&#39;, &#39;마&#39;, &#39;바&#39;];
  target.unshift(&#39;가&#39;);
  console.log(target);

&lt; (6) [&#39;가&#39;, &#39;나&#39;, &#39;다&#39;, &#39;라&#39;, &#39;마&#39;, &#39;바&#39;]</code></pre>
<ul>
<li>배열의 제일 뒤에 값을 추가하는 방법 -&gt; push 사용</li>
</ul>
<pre><code class="language-javascript">&gt; const target = [&#39;가&#39;, &#39;나&#39;, &#39;다&#39;, &#39;라&#39;, &#39;마&#39;];
  target.push(&#39;바&#39;);
  console.log(target);

&lt; (6) [&#39;가&#39;, &#39;나&#39;, &#39;다&#39;, &#39;라&#39;, &#39;마&#39;, &#39;바&#39;]</code></pre>
<blockquote>
<p>⁕ const : 상수 (엄밀히 상수는 아님 -&gt; 배열에 새 값을 추가하거나 수정할 수 있어서)
=&gt; const에는 처음 이후에는 새로운 값을 대입(=)하지만 못한다고 기억하면됨. const에 객체(배열, 함수, 객체 리터럴)가 대입된 경우 객체 내부의 속성이나 배열의 요소는 수정할 수 있다.</p>
</blockquote>
<pre><code class="language-javascript">&gt; const target2 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];

  target2 = [&#39;f&#39;, &#39;g&#39;]; // 불가능 (새로운 변경) -&gt; 재할당 불가
  target2[0] = &#39;h&#39;; // 가능 (내부 요소 변경 및 추가)</code></pre>
<br>

<ul>
<li>배열 마지막 요소 제거 -&gt; pop 사용</li>
</ul>
<pre><code class="language-javascript">&gt; const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  target.pop();
  console.log(target);

&lt; (4) [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]</code></pre>
<ul>
<li>배열 첫 번째 요소 제거 -&gt; shift 사용</li>
</ul>
<pre><code class="language-javascript">&gt; const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  target.shift();
  console.log(target);

&lt; (4) [&#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;]</code></pre>
<ul>
<li>배열의 중간 요소 제거 -&gt; splice 사용<pre><code class="language-javascript">&gt; const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
target.splice(2, 2); // target.splice(시작지점, 시작점부터 지우고 싶은 갯수);
console.log(target);
</code></pre>
</li>
</ul>
<p>&lt; (3) [&#39;a&#39;, &#39;b&#39;, &#39;e&#39;]</p>
<hr>
<blockquote>
<p>const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  target.splice(1); // 해당 인덱스부터 끝까지 모든 요소 제거
  console.log(target);</p>
</blockquote>
<p>&lt; [&#39;a&#39;]</p>
<hr>
<blockquote>
<p>const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  target.splice(1, 3, &#39;f&#39;, &#39;g&#39;); // 인덱스 1부터 3개를 지우고 그 자리에 f와 g를 추가한다.
  console.log(target);</p>
</blockquote>
<p>&lt; (4) [&#39;a&#39;, &#39;f&#39;, &#39;g&#39;, &#39;e&#39;]</p>
<hr>
<ul>
<li>아무것도 지우지 않고 중간에 추가하고 싶을 때</li>
</ul>
<blockquote>
<p>const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  target.splice(2, 0, &#39;f&#39;);
  console.log(target);</p>
</blockquote>
<p>&lt; (6) [&#39;a&#39;, &#39;b&#39;, &#39;f&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;]</p>
<pre><code>
- 배열에서 요소 찾기 -&gt; includes 사용
: includes에 주어진 값이 배열 내부에 존재하면 true가 되고, 존재하지 않으면 false가 된다.
![](https://velog.velcdn.com/images/jack_whiteblack/post/ce5de8bb-00be-4aba-a4be-a922c3249fbd/image.png)

- 요소의 정확한 위치 찾기 -&gt; indexOf, lastIndexOf 사용
  - indexOf : 앞에서부터 찾기
  - lastIndexOf : 뒤에서부터 찾기

```javascript
&gt; const target = [&#39;d&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;c&#39;];
  const result = target.indexOf(&#39;c&#39;);
  const result2 = target.lastIndexOf(&#39;d&#39;);
  const result3 = target.indexOf(&#39;a&#39;);

  console.log(result);
  console.log(result2);
  console.log(result3);

  2
  3
  -1 -&gt; 배열에 존재하지 않으므로</code></pre><ul>
<li>배열 반복하기</li>
</ul>
<pre><code class="language-javascript">&lt;while&gt;
&gt; const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  let i = 0;
  while(i &lt; target.length) {
      console.log(target[i]);
    i++;
  }

&lt; a
  b
  c
  d
  e

&lt;for&gt;
&gt; const target = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
  for(let i = 0; i &lt; target.length; i++) {
        console.log(target[i]);
  }

&lt; a
  b
  c
  d
  e</code></pre>
<p>❓ Quiz</p>
<blockquote>
<p>다음 배열에서 &#39;라&#39;를 모두 제거 -&gt; indexOf와 splice 사용</p>
</blockquote>
<pre><code class="language-javascript">const arr = [&#39;가&#39;, &#39;라&#39;, &#39;다&#39;, &#39;라&#39;, &#39;마&#39;, &#39;라&#39;];
for(let i = 0; i &lt; arr.length; i++) {
    arr.splice(arr.indexOf(&#39;라&#39;), 1);
}
console.log(arr);</code></pre>
<br>

<h3 id="2-함수-function">2. 함수 (function)</h3>
<ul>
<li>일정한 동작을 수행하는 코드</li>
<li>함수를 만들 때는 보통 function 예약어를 사용하거나 =&gt;(화살표) 기호를 사용. 화살표 기호를 사용한 함수를 화살표 함수(arrow fucntion)이라고 한다.</li>
</ul>
<blockquote>
<p>function() {}
or
() =&gt; {}</p>
</blockquote>
<pre><code class="language-javascript">형식 (함수에 이름붙이기) : 선언한다(declare)

function a() {} -&gt; 함수 선언문 뒤에는 세미콜론을 잘 안붙인다.
// 함수를 상수에 대입하는 대신 function 키워드 뒤에 함수 이름을 넣어주는 방식 
// -&gt; 함수 선언문 (function declaration statement)

const b = function() {};
// 상수나 변수에 대입하는 방식 -&gt; 함수 표현식 (function expression)

const c = () =&gt; {};
// 화살표 함수</code></pre>
<pre><code class="language-javascript">&gt; function a() {} // 선언

  a(); // 호출</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/3eb960a0-2cc4-4b53-8fc7-89073e81cb1e/image.png" alt=""></p>
<ul>
<li><p>return : 함수를 반환해주기도 하고 종료하기도 한다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/a7a3b8c7-724f-4549-ad2b-8d364cd1ac31/image.png" alt="">=&gt; 명시적으로 return 문을 사용하지 않는다면 항상 함수 동작문 끝에 return undefined가 있다고 생각하면 된다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/0d35e888-ca38-4e02-860c-de397be7fc4c/image.png" alt=""></p>
</li>
<li><p>여러개를 리턴하는 법</p>
</li>
<li><blockquote>
<p>배열로<img src="https://velog.velcdn.com/images/jack_whiteblack/post/28a20a53-5798-45da-920f-780cee5f087a/image.png" alt=""></p>
</blockquote>
</li>
<li><p>return 문이 실행되면 그 아래 코드는 아예 실행되지 않는다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/82696137-e2cd-498a-931f-265735374927/image.png" alt=""></p>
</li>
</ul>
<p>✔ 매개변수와 인수 (parameter, argument)</p>
<pre><code class="language-javascript">&gt; function a(parameter) {
      console.log(prameter);
  }
  a(&#39;argument&#39;); 
  -&gt; argument가 첫 번째 parameter로 들어가서 parameter가 argument가 된 후 출력된다.

&lt; argument

- 함수를 선언할 때 parameter (매개변수)
- 함수를 실행(호출)할 때 argument (인수)</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/749f7d3b-1679-4d81-a762-ad493bed621c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/aace42ea-ff30-41ee-9820-0c90ff92f941/image.png" alt="">=&gt; function 함수에서만 console.log(arguments)사용 가능 : 호출할 때 넣었던 argument들을 배열 형태로 보여준다.</p>
<pre><code class="language-javascript">예시
&gt; function add(x, y) {
    return x + y;
  }

  add(5, 3)

&lt; 8</code></pre>
<p>❓ Quiz</p>
<blockquote>
<p>매개변수로 x, y, z을 받아 곱한 값을 반환하는 multiply 함수를 만들기 (단, 화살표 함수로 만들기)</p>
</blockquote>
<pre><code class="language-javascript">const multi = (x, y, z) =&gt; {
    return x * y * z;
}

// 이런식으로도 가능 (중괄호와 return이 바로 이어질 때 생략 가능)
const multi = (x, y, z) =&gt; x * y * z;

multi(2, 12, 4);

ans = 96</code></pre>
<ul>
<li><p>다른 변수 사용</p>
<pre><code class="language-javascript">&gt; function minus1(x, y) {

    const a = 100;

    return(x - y) * a;
}

console.log(minus1(5,3));
</code></pre>
</li>
</ul>
<p>&lt; 200</p>
<pre><code>![](https://velog.velcdn.com/images/jack_whiteblack/post/ffbb213d-589e-4f40-8c6d-2b0c82e33d47/image.png)=&gt; 함수 바깥에 있는 변수를 가져와도 된다.

&lt;br&gt;

### 3. 객체 리터럴 기본

- 배열이나 함수가 아닌 객체
- 객체는 여러 개의 변수를 하나의 변수로 묶을 때 사용

```javascript
const name = &#39;abc&#39;;
const year = 1900;
const month = 01;
const date = 01;
const gender = &#39;M&#39;;

↓ 변수를 묶는다.

const human = {

    name: &#39;abc&#39;,
    year: 1900,
    month: 01,
    date: 01,
    gender: &#39;M&#39;,

}; -&gt; 중괄호를 쓰면 객체 리터럴</code></pre><ul>
<li>배열과의 차이점은 속성 이름이 있냐 없냐</li>
<li>name, year, month, date, gender같은 정보들을 속성(property)라고 한다.</li>
<li>속성은 속성 이름과 속성 값으로 구분된다. (name : 속성 이름, abc : 속성 값)</li>
<li>객체 형식</li>
</ul>
<pre><code class="language-javascript">const 객체 = {
    속성이름: 속성값,
}</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/f0c11a98-cb65-4e9b-bebc-217c8d5a623f/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/0226200d-eb07-4d2d-bb80-0fa22f8acc18/image.png" alt="">=&gt; 다음을 대비하기 위해</p>
<ul>
<li><p>속성 이름은 문자열이어야 한다.</p>
</li>
<li><p>속성 이름에 숫자나 공백 그리고 특수문자가 들어갈 때는 &#39; &#39; 이 안에 넣는다. (&#39;2name&#39;, &#39;na me&#39;, &#39;na-me&#39;)<img src="https://velog.velcdn.com/images/jack_whiteblack/post/87f57410-643a-46fa-8236-bc0d4dbf6bc7/image.png" alt=""></p>
</li>
<li><p>속성에 접근하는 방법
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/c458d96a-0fcd-4d40-8aa7-533aa94cd529/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/b2f4090f-5ea8-40b1-a1fe-4beb01eed32b/image.png" alt="">=&gt; 대괄호를 쓰는 이유는 문자열로 감싸준 특수한 속성이름 때문에</p>
</li>
<li><p>대괄호에 따옴표를 빼면 변수가 되므로 주의하길..! (아예 다른 값이 됨)</p>
</li>
<li><p>객체 속성 수정 및 추가 : 배열이랑 비슷
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/30b9e881-4d1c-487b-97d6-75d81ba986f3/image.png" alt=""></p>
</li>
<li><p>속성 제거하기 : delete 사용</p>
</li>
</ul>
<pre><code class="language-javascript">&gt; delete human.gender;
  console.log(human.gender);

&lt; undefined</code></pre>
<br>

<p>&lt;참고&gt; 배열과 함수가 객체인 이유</p>
<ul>
<li><p>객체의 성질을 모두 다 사용할 수 있음</p>
</li>
<li><p>배열과 함수에도 속성들을 추가할 수도 있고 수정 및 제거가 가능</p>
</li>
<li><p>객체는 함수와 배열을 포함하는 개념이라서 {}를 사용해 만든 객체를 객체 리터럴이라고 부르는 것이다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/6f26d44b-5bf9-4e2b-bf0d-f874af0ec261/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/ecd4fba6-470c-4d96-90b5-aae33dec86c9/image.png" alt=""></p>
</li>
<li><p>메서드 : 객체의 속성 값으로 함수를 넣었을 때 이 속성을 메서드라고 한다.</p>
</li>
</ul>
<pre><code class="language-javascript">const debug = {
  log: function(value) {
      console.log(value);
  }
};

debug.log(&#39;Hello, Method&#39;);

&lt; Hello, Method</code></pre>
<br>

<h3 id="4-객체의-비교-원시값과의-차이점">4. 객체의 비교 (원시값과의 차이점)</h3>
<ul>
<li><p>객체끼리는 모양이 같아도 비교하면 false가 나온다. (배열, 함수, 리터럴 모두)</p>
</li>
<li><p>객체가 아닌 숫자, 문자열, 불 값, null, undefined는 모두 true를 반환한다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/a702db52-e9d9-49c7-8d21-582b09d42253/image.png" alt=""></p>
</li>
<li><p>true가 나오게 하려면 기존 객체를 변수에 저장해 두어야 한다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/1d71ac59-2303-4b90-84fd-822221751702/image.png" alt=""></p>
</li>
</ul>
<p>=&gt; { } === { } 이거는 새로운 객체와 새로운 객체를 비교하기 때문에 당연히 다른 것이다.</p>
<br>

<ul>
<li>참조와 복사
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/be856035-f0e7-4a1d-99da-9558ad42f067/image.png" alt=""></li>
</ul>
<ul>
<li>객체가 아닐 때
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/54401a28-ad6f-42cb-9ca8-c59118a9af1b/image.png" alt=""></li>
</ul>
<p>❓ Quiz</p>
<blockquote>
<p>다음과 같이 객체 안에 객체가 있을 때, &#39;조&#39; 값에 접근하는 방법은?</p>
</blockquote>
<pre><code class="language-javascript">const zerocho = {
    name: {
        first: &#39;현영&#39;,
          last: &#39;조&#39;,
    },

      gender: &#39;m&#39;,
};</code></pre>
<pre><code class="language-javascript">zerocho.name.last;
or
zerocho[&#39;name&#39;][&#39;last&#39;];
-&gt; 답

&lt; 조</code></pre>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p>[리뉴얼] 렛츠기릿 자바스크립트 (조현영 / 인프런)</p>
<p>✔ 제로초님(조현영님) JavaScript 강의를 보고 공부한 것을 정리하였습니다.
✔ 사진 및 자료 삽입도 제로초님(조현영님) 강의에서 가져왔습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - 기본 문법 (2)]]></title>
            <link>https://velog.io/@jack_whiteblack/JavaScript-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-2</link>
            <guid>https://velog.io/@jack_whiteblack/JavaScript-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-2</guid>
            <pubDate>Thu, 02 Feb 2023 16:10:05 GMT</pubDate>
            <description><![CDATA[<h3 id="1-변수-선언하기-let">1. 변수 선언하기 (let)</h3>
<ul>
<li>특정한 값을 저장해야 하는 상황이 발생할 때 사용
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/bcaaa8e7-377f-46a3-bf0a-ff3e39213224/image.png" alt=""></li>
</ul>
<blockquote>
<p>console.log() : 반환하는 역할이 아니라 그림판처럼 글자를 적는 곳
변수만 입력 : 출력물을 반환
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/0219104d-f059-41dd-a30a-7d11cab5c8d9/image.png" alt=""></p>
</blockquote>
<p>let 변수명 : 변수를 선언하다
let 변수명 = 500 + 500; -&gt; 선언과 동시에 값을 넣는 것은 초기화했다.
=&gt; 변수 선언문
&#39; = &#39; : 대입하다. (우항에서 좌항으로 대입하다)</p>
<br>

<ul>
<li>변수와 메모리
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/f1408ad2-eabf-4829-b620-876b801dda9f/image.png" alt=""></li>
</ul>
<br>

<h3 id="2-변수-이름-짓기">2. 변수 이름 짓기</h3>
<ul>
<li>변수 선언하고 초기화하지 않으면 변수 값은 undefined가 된다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/7def1c29-286a-42f3-8c01-1e4e03145774/image.png" alt=""></li>
</ul>
<ul>
<li>변수명은 중복되면 안된다.</li>
<li>특수문자는 $, _ 만 된다.</li>
<li>첫글자로 숫자는 안된다.</li>
<li>띄어쓰기 하면 안된다.
(해결법 : bigNum, bananaApple -&gt; Camel Case / contents_title -&gt; Snake Case)</li>
<li>let과 예약어를 사용하면 안된다.<ul>
<li>예약어
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/80b187d5-4338-4f65-956b-8c1fbd690f44/image.png" alt=""></li>
</ul>
</li>
</ul>
<br>

<h3 id="3-변수-수정하기">3. 변수 수정하기</h3>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/799cdb5d-68ab-42bc-9389-f32f2b84f9a1/image.png" alt=""></p>
<ul>
<li>변수에 넣은 값을 비울 때
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/3b11f544-e70c-4146-8791-d810d1fd1b01/image.png" alt=""></li>
</ul>
<ul>
<li>변수를 다른 변수에 대입 가능
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/c75009cc-87e0-4ba5-8ab8-bc16b603ddf2/image.png" alt=""></li>
</ul>
<ul>
<li>변수 값 수정하기 : 반복되는 것은 변수에 저장해서 사용하면 수정이 용이하다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/bfa69876-188b-4aff-963a-97474447eb03/image.png" alt=""></li>
</ul>
<br>

<h3 id="4-조건문-if">4. 조건문 (if)</h3>
<ul>
<li>주어진 조건에 따라 코드를 실행하거나 실행하지 않는 문이다.</li>
<li>분기점 판단에 따라 실행하기도 한다.</li>
</ul>
<pre><code class="language-javascript">* if 조건문의 기본 형식

if(조건식) {
  동작문1;
  동작문2;
}

ex)
if(true) {
    console.log(&#39;Hello, if!&#39;);
}

-&gt; Hello, if!</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/267a372b-0c6e-4ea3-8370-1b8e87015c07/image.png" alt=""></p>
<br>

<h3 id="5-else-else-if-switch">5. else, else if, switch</h3>
<ul>
<li>else</li>
</ul>
<pre><code class="language-javascript">* if-else 조건문의 기본 형식

if(조건식) { // 조건식이 참인 값일 때 실행
    동작문;
} else { // 조건식이 거짓인 값일 때 실행
    동작문;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/c676bd91-666f-445b-ab8b-4cb981eb5589/image.png" alt=""></p>
<ul>
<li>else if</li>
</ul>
<pre><code class="language-javascript">* if-else 조건문의 기본 형식

if(조건식) { // 조건식이 참인 값일 때 실행
    동작문;
} else if (조건식) { // 조건식이 거짓인 값일 때 실행
    동작문;
} else {
     동작문; 
}</code></pre>
<pre><code class="language-javascript">
const score = 90;
if(score &gt;= 90) { // 90점 이상
    console.log(&#39;A+&#39;);
} else if(score &gt;= 80) { // 90점 미만 80점 이상
    console.log(&#39;A&#39;);
} else if(score &gt;= 70) { // 80점 미만 70점 이상
    console.log(&#39;B+&#39;);
} else if(score &gt;= 60) { // 70점 미만 60점 이상
    console.log(&#39;B&#39;);
} else { // 60점 미만
    console.log(&#39;F&#39;);
}

-&gt; A+</code></pre>
<ul>
<li>중첩 if문</li>
</ul>
<pre><code class="language-javascript">
let first = true;

let second = false;

if(first) {
  console.log(&#39;첫 번째 조건 충족!&#39;);

  if(second) {
    console.log(&#39;두 번째 조건도 충족!&#39;);
  } else {
    console.log(&#39;두 번째 조건은 불충족!&#39;);
  }

} else {
  console.log(&#39;첫 번째 조건 불충족!&#39;);
}
</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/35492d45-33f4-47a1-9be8-82dc6281052b/image.png" alt=""></p>
<p>↓ 아래와 같이 깔끔하게 코드를 수정할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/75222ff8-1cd6-48bf-8c23-40e7787a14f9/image.png" alt=""></p>
<ul>
<li>switch</li>
</ul>
<pre><code class="language-javascript">* switch 문의 기본 형식

switch(조건식) {

  case 비교 조건식:

    동작문;
}

-&gt; 조건식과 비교 조건식이 같으면 동작문을 실행</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/f2bfe196-db0a-453c-8067-9e02dbd9d7c6/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/cb5b21e1-0a75-489a-b47b-fba2930bd95c/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/b171692b-aa26-414c-aa2d-ce5e4c11084b/image.png" alt="">-&gt; switch문은 조건식과 비교조건식이 같을 때 그 아래에 있는 값도 모두 출력하기에 특정 값을 출력하고 싶으면 break를 사용한다.</p>
<pre><code class="language-javascript">
let value = &#39;F&#39;;

switch(value) {

  case &#39;A&#39;:

    console.log(&#39;A&#39;);

    break;

  case &#39;B&#39;:

    console.log(&#39;B&#39;);

    break;

  case &#39;C&#39;:

    console.log(&#39;C&#39;);

    break;

  default:

    console.log(&#39;아무것도 일치하지 않음&#39;);

    // default는 if문의 else와 같은 것이다.

-&gt; 아무것도 일치하지 않음</code></pre>
<br>

<h3 id="6-조건부-연산자-삼항-연산자">6. 조건부 연산자 (삼항 연산자)</h3>
<ul>
<li>조건부 연산자의 기본 형식<blockquote>
<p>조건식 ? 참일 때 실행되는 식 : 거짓일 때 실행되는 식</p>
</blockquote>
</li>
</ul>
<pre><code class="language-javascript">Example

&gt; 5 &gt; 0 ? &#39;참입니다&#39; : &#39;거짓입니다&#39;;
&lt; &quot;참입니다&quot;

&gt; let value = 5 &lt; 0 ? &#39;참입니다&#39; : &#39;거짓입니다&#39;;
&lt; undefined
&gt; value;
&lt; &quot;거짓입니다&quot;

- 조건부 연산자를 if문으로 변경하기

&lt;조건부 연산자&gt;
let condition = true;
let value = condition ? &#39;참&#39; : &#39;거짓&#39;;
console.log(value);

&lt;if문&gt;
if(condition) { 
       value = &#39;참&#39;;
} else {
    value = &#39;거짓&#39;;
}

console.log(value);

- 조건부 안에 조건부
let condition1 = true;
let condition2 = false;
let value = condition1 ? condition2 ? &#39;둘 다 참&#39; : &#39;condition1만 참&#39; : &#39;condition1이 거짓&#39;;
console.log(value);

&lt; condition1만 참</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/9526207d-1080-4ede-afb7-3327d2c03016/image.png" alt=""></p>
<pre><code class="language-javascript">- 중첩되어 있으면 괄호로 구분해주는 것이 좋다.
let value = condition1 ? (condition2 : &#39;둘 다 참&#39; : &#39;condition1만 참&#39;) : &#39;condition1이 거짓&#39;;

- 들여쓰기로도 구분 가능
let value = condition1
    ? condition2
        ? &#39;둘 다 참&#39; 
        : &#39;condition1만 참&#39; 
    : &#39;condition1이 거짓&#39;;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/84e77566-54c3-4a9c-a8c9-2dbbcb461357/image.png" alt=""></p>
<p>❓ Quiz</p>
<pre><code class="language-javscript">if문을 switch문과 조건부 연산자로 바꾸기

&lt;if문&gt;
let cond = true;
let vlaue = &#39;&#39;;
if(cond) {
    value = &#39;참&#39;;
} else {
    value = &#39;거짓&#39;;
}

&lt;switch문&gt;
let cond = true;
let value = &#39;&#39;;
switch(cond){
    case true:
        value = &#39;참&#39;;
        break;

    case false:
        value = &#39;거짓&#39;; 
        break;
}

&lt;조건부 연산자&gt;
let cond = true;
let value = cond ? &#39;참&#39; : &#39;거짓&#39;;

console.log(value);</code></pre>
<br>

<h3 id="7-반복문">7. 반복문</h3>
<h4 id="1-while">1. while</h4>
<ul>
<li>while 문의 기본형식</li>
</ul>
<pre><code class="language-javascript">while (조건식)
      동작문;

while (조건식) {
    동작문1;
      동작문2;
      동작문3;
}

예제
while (true) {
     console.log(&#39;Hello, While&#39;); -&gt; 무한 반복
}

let i = 1;
while(i &lt;= 100) {
    console.log(&#39;Hello, While&#39;);
      i++;
}
&lt; (100) Hello, While -&gt; 문자열이 100번 실행되었다.
&lt; 100 -&gt; i의 값</code></pre>
<br>

<h4 id="2-for">2. for</h4>
<ul>
<li>for 문의 기본 형식</li>
</ul>
<pre><code class="language-javascript">for(시작; 조건식; 종료식)
  동작문;

예제
for(let i = 0; i &lt; 100; i++) {
    console.log(&#39;Hello, for!&#39;);
}
&lt; (100) Hello, for!</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/d7a2c7f0-528f-4163-8b02-c8946ce93e86/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/ae0a6f80-8bb3-4eb2-8ba2-ebc417953671/image.png" alt=""></p>
<blockquote>
<p>⁕ 참고 : for 문의 시작, 조건식, 종료식은 생략 가능</p>
</blockquote>
<pre><code class="language-javascript">&gt; for(;;) {

  } -&gt; 무한 반복 (조건이 true가 되어버려서)</code></pre>
<p>❓ Quiz</p>
<pre><code class="language-javascript">for(let i = 0; i &lt; 100; i++) {
    console.log(i + 1);
}</code></pre>
<br>

<h3 id="8-break와-continue">8. break와 continue</h3>
<ul>
<li>break : 반복문을 중간에 멈춰야 할 때 사용</li>
<li>continue : 특정 조건에서만 실행되기를 원할 때 사용</li>
<li><blockquote>
<p>continue를 넣으면 이후 코드는 건너뛴다.</p>
</blockquote>
</li>
</ul>
<pre><code class="language-javascript">&lt;break&gt;
let i = 0;
while(true) {
    if(i===5) break; -&gt; i가 5일 때 break가 실행
      i++;
}
console.log(i);
&lt; 5
* 무한 반복문은 while을 쓰면 좋다고 한다.

&lt;continue&gt;
let i = 0;
while(i &lt; 10) { // 홀수만 console.log
    i++;
      if(i % 2 === 0) {    // 짝수만
        continue;    // 건너뛰기
    }
  console.log(i); 
  -&gt; if문 조건에 만족하면 continue에 의해 실행되지 않고 다음 반복문으로 간다.
}</code></pre>
<br>

<h3 id="9-중첩-반복문">9. 중첩 반복문</h3>
<ul>
<li>반복문 안에 반복문이 있는 것</li>
</ul>
<pre><code class="language-javascript">&gt; for(let i = 0; i &lt; 10; i++) {
    for(let j = 0; j &lt; 10; j++) {
        console.log(i, j);
    }
  }

&gt; for(let i = 0; i &lt; 5; i++) {
    if(i % 2 === 0) {
        continue;
    }
      for(let j = 0; j &lt; 5; j++) {
          if(j % 2 === 0) {
            continue;
        }
          for(let k = 0; k &lt; 5; k++) {
            if(k % 2 === 0) {
                continue;
            }
              console.log(i, j, k);
        }
    }
  }</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/2eade865-fd49-4445-9183-e3077bed4d70/image.png" alt=""></p>
<p>❓ Quiz</p>
<ul>
<li>짝수가 나오지 않는 구구단</li>
</ul>
<pre><code class="language-javascript">for(let i = 1; i &lt; 10; i++) {
    if(i % 2 === 0) {
        continue;
    }
      for(let j = 1; j &lt; 10; j++) {
        if(j % 2 === 0) {
            continue;
        }
          console.log(i, j, i*j); 
    }
}</code></pre>
<ul>
<li>별 찍기</li>
</ul>
<pre><code class="language-javascript">*****
****
***
**
*

for(let i = 5; i &gt; 0; i--) {
    console.log(&#39;*&#39;.repeat(i)) -&gt; 반복 함수
}

for(let i = 0; i &lt; 5; i++) {
    console.log(&#39;*&#39;.repeat(5 - i))
}

-----------------------------------------------------

*
***
*****
*******
*********

for(let i = 0; i &lt; 10; i++) {
    if(i % 2 === 0) {
        continue;
    }
      console.log(&#39;*&#39;.repeat(i));
}

-----------------------------------------------------

*********
*******
*****
***
*

for(let i = 10; i &gt; 0; i--) {
    if(i % 2 === 0) {
        continue;
    }
      console.log(&#39;*&#39;.repeat(i));
}

-----------------------------------------------------

*****
 ****
  ***
   **
    *

for(let i = 0; i &lt; 5; i++) {
      console.log(&#39; &#39;.repeat(i), &#39;*&#39;.repeat(5 - i));
}

-----------------------------------------------------

    *
   **
  ***
 ****
*****

for(let i = 0; i &lt; 5; i++) {
    console.log(&#39; &#39;.repeat(4 - i), &#39;*&#39;.repeat(i + 1));
}</code></pre>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p>[리뉴얼] 렛츠기릿 자바스크립트 (조현영 / 인프런)</p>
<p>✔ 제로초님(조현영님) JavaScript 강의를 보고 공부한 것을 정리하였습니다.
✔ 사진 및 자료 삽입도 제로초님(조현영님) 강의에서 가져왔습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript - 기본 문법 (1)]]></title>
            <link>https://velog.io/@jack_whiteblack/JavaScript</link>
            <guid>https://velog.io/@jack_whiteblack/JavaScript</guid>
            <pubDate>Tue, 31 Jan 2023 19:31:51 GMT</pubDate>
            <description><![CDATA[<h1 id="javascript">JavaScript</h1>
<h3 id="1-hello-world">1. Hello World</h3>
<ul>
<li>console.log()
: Crome 개발자 도구를 띄워 코드를 입력한다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/4542d18e-2ff2-4714-b076-872a816b40ba/image.png" alt=""></li>
</ul>
<blockquote>
<p>외우면 좋은 영어 단어</p>
<ul>
<li>( ) parentheses</li>
<li>{ } braces</li>
<li>[  ] brackets</li>
</ul>
</blockquote>
<br>

<h3 id="2-세미콜론-주석-들여쓰기">2. 세미콜론, 주석, 들여쓰기</h3>
<ul>
<li><p>세미콜론 : 하나의 명령이 끝날 때 명령 뒤에 붙임 (명령어 구분)
(안붙인다고 에러가 나진 않지만 에러가 나는 경우도 있기에 붙이는 것이 좋다.)
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/58b7d2c1-cff2-4fb0-91aa-0435615e3c53/image.png" alt=""></p>
</li>
<li><p>주석</p>
<ul>
<li>코드에 대한 설명을 작성하기 위할 때 사용</li>
<li>쓰이지 않는 코드에도 사용가능
(// , /* */)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/ff7bc8b5-c548-44ea-97c6-0f21c515a9ff/image.png" alt=""></p>
<ul>
<li>들여쓰기 : 가독성을 높이기 위해 사용</li>
</ul>
<pre><code class="language-javascript">* 예시

if (condition) {
  console.log(&#39;Hello, World&#39;);
}</code></pre>
<br>

<h3 id="3-문자열-기본-따옴표-백틱-typeof-escape">3. 문자열 기본 (따옴표, 백틱, typeof, escape)</h3>
<blockquote>
<ul>
<li>값 (value) : 프로그램이 조작할 수 있는 데이터</li>
<li>자료형 (data type) : 값의 종류</li>
</ul>
</blockquote>
<ul>
<li><p>문자열
: 문자열 표시는 &#39; &#39; (작은 따옴표), &quot; &quot; (큰 따옴표), ` (백틱) 으로 한다.</p>
<ul>
<li>백틱의 특성으로는 줄바꿈이 가능하다는 것이다.</li>
<li>다른 것들에서 줄바꿈을 하고 싶으면 \n을 사용한다.</li>
</ul>
</li>
<li><p>typeof : 자료형을 확인하고 싶을 때
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/87d31239-1c26-41f3-826e-265c565ee8d2/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="4-문자열-합치기-연산자">4. 문자열 합치기 (연산자)</h3>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/ad884e06-48b0-4f1d-9788-f4d316314db0/image.png" alt=""></p>
<br>

<h3 id="5-숫자-기본-parseint-nan">5. 숫자 기본 (parseInt, NaN)</h3>
<blockquote>
<ul>
<li>이진법 : 0b111 -&gt; 7</li>
<li>팔진법 : 0111 -&gt; 73 : 0뒤에 o는 붙여도 되고 안붙여도 된다.</li>
<li>십육진법 : 0x1a1 -&gt; 417 : 숫자는 0부터 9까지 밖에 없기 때문에 10~15는 알파벳 a, b, c, d, e, f로 표현한다.</li>
</ul>
</blockquote>
<ul>
<li><p>NaN -&gt; 종류는 숫자, 풀네임은 Not a Number ... just memorize</p>
</li>
<li><p>parseInt(&#39;123&#39;) / Number(&#39;123&#39;) : 문자열 숫자를 진짜 숫자로 바꿔준다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/b1b41e04-33f8-4bf3-8fa2-7c608987360a/image.png" alt=""></p>
</li>
<li><p>parseFloat(&#39;3.14&#39;) : 숫자 소숫점으로 만들기, parseInt는 정수로만 만들어준다. but Number는 다된다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/2f45b314-9a71-4176-8f37-e68d24cac1f3/image.png" alt=""></p>
</li>
</ul>
<blockquote>
<ul>
<li>Number()와 parseInt()의 차이점
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/6056dfc3-95ef-4bb4-98e8-7e75b4e5b8d4/image.png" alt=""></li>
</ul>
</blockquote>
<ul>
<li><p>prompt() : 문자열을 입력할 수 있게 하는 것
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/36b35998-6fe4-4876-a336-bd41b32914be/image.png" alt=""></p>
</li>
<li><p>거듭제곱 : **
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/761ac65c-6b58-4fe0-ae17-f397f1df7745/image.png" alt=""></p>
</li>
<li><p>Infinity (숫자) 무한을 나타냄
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/e489bd1f-19ce-441b-a270-3d279bb5f698/image.png" alt=""></p>
</li>
</ul>
<br>

<h3 id="6-연산자-우선순위-소수-계산-주의점">6. 연산자 우선순위, 소수 계산 주의점</h3>
<ul>
<li>소수점 계산
: 컴퓨터는 소수점 계산을 잘 못한다.
=&gt; 소수를 정수로 만들어서 계산을 한 후 소수로 돌려놔야한다.</li>
</ul>
<br>

<h3 id="7-불-값-boolean-값들의-비교">7. 불 값 (boolean, 값들의 비교)</h3>
<ul>
<li>true와 false를 나타낸다. (1과 0에 대응된다.)</li>
</ul>
<p>⁎ 참고 . NaN끼리 비교</p>
<ul>
<li>유일하게 false가 나오는 것</li>
</ul>
<pre><code class="language-javascript">&gt; NaN == NaN;
&lt; false

!= 이 것을 제외하고는 다 false</code></pre>
<ul>
<li>true, false 값 비교하기</li>
</ul>
<pre><code class="language-javascript">&gt; true &gt; false; -&gt; (1 &gt; 0)
&lt; true</code></pre>
<ul>
<li>문자열 비교</li>
</ul>
<pre><code class="language-javascript">&gt; &#39;b&#39; &gt; &#39;a&#39;;
&lt; true
-&gt; 사전순 : 뒤에 나오는게 크다

&gt; &#39;ad&#39; &gt; &#39;ab&#39;;
&lt; true</code></pre>
<ul>
<li>다른 자료형 비교</li>
</ul>
<pre><code class="language-javascript">&gt; &#39;3&#39; &lt; 5; -&gt; 문자열이 숫자로 바뀌면서 비교
&lt; true

&gt; &#39;abc&#39; &lt; 5; -&gt; 문자열이 숫자로 바뀌므로 abc는 NaN이 되어 false값이 나온다.
&lt; false</code></pre>
<ul>
<li>= 와 == 와 === 차이</li>
</ul>
<blockquote>
<p>&#39;=&#39; : 우항을 좌항으로 대압한다.
&#39;==&#39; : 같다 (값만 비교)
&#39;===&#39; : 같다 (자료형까지 비교)</p>
<p>⁕ &#39; != &#39; 도 동일 
&#39;!=&#39; : 다르다 (값만 비교)
&#39;!==&#39; : 다르다 (자료형까지 비교)</p>
</blockquote>
<br>

<h3 id="8-논리-연산자">8. 논리 연산자</h3>
<ul>
<li>&amp;&amp;(and), ||(or)</li>
<li>!!&#39;a&#39;; -&gt; true : ( &#39; !! &#39; ) Boolean으로 형변환하는 연산자</li>
</ul>
<blockquote>
<p>📌 false, &#39;&#39;(빈 문자열), 0, NaN, undefined, null, document.all(거의 사용은 안함)은 불 값으로 형 변환했을 때, false가 된다.</p>
</blockquote>
<h3 id="9-undefined와-null">9. undefined와 null</h3>
<ul>
<li><p>빈 값 : undefined, null</p>
<ul>
<li>undefined : 반환할 결과값이 없을 때 나온다. -&gt; undefined를 반환한다.</li>
<li>null : 의도적으로 빈 값을 넣을 때 사용</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p>[리뉴얼] 렛츠기릿 자바스크립트 (조현영 / 인프런)</p>
<p>✔ 제로초님(조현영님) JavaScript 강의를 보고 공부한 것을 정리하였습니다.
✔ 사진 및 자료 삽입도 제로초님(조현영님) 강의에서 가져왔습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Softeer - 장애물 인식 프로그램]]></title>
            <link>https://velog.io/@jack_whiteblack/Softeer-%EC%9E%A5%EC%95%A0%EB%AC%BC-%EC%9D%B8%EC%8B%9D-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8</link>
            <guid>https://velog.io/@jack_whiteblack/Softeer-%EC%9E%A5%EC%95%A0%EB%AC%BC-%EC%9D%B8%EC%8B%9D-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8</guid>
            <pubDate>Sat, 07 Jan 2023 01:30:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/7290d74e-2aa2-45c0-b621-fb8c9aaefa9b/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/a8babf29-db20-42b0-9a26-cdbdd61c86f4/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/7bd95554-2bd9-4062-b5a0-e731a8c32d69/image.png" alt=""></p>
<h3 id="👨💻-제출-코드">👨‍💻 제출 코드</h3>
<pre><code class="language-java">import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

public class Practice02 {

    static Queue&lt;Point&gt; qpoint = new LinkedList&lt;&gt;();

    static int[][] arr;
    static int[][] checkArr;
    static String[] strArr;

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        StringTokenizer st = new StringTokenizer(sc.nextLine());

        int n = Integer.parseInt(st.nextToken());

        arr = new int[n][n];
        checkArr = new int[n][n];
        strArr = new String[n];

        for(int i = 0; i &lt; n; i++) {
            for(int j = 0; j &lt; n; j++) {
                checkArr[i][j] = 0;
            }
        }

        for(int i = 0; i &lt; n; i++) {
            st = new StringTokenizer(sc.nextLine());
            String str = st.nextToken();
            for(int j = 0; j &lt; n; j++) {
                arr[i][j] = Character.getNumericValue(str.charAt(j));                
            }
        }

        ArrayList&lt;Integer&gt; list = new ArrayList&lt;&gt;();

        for(int i = 0; i &lt; n; i++) {
            for(int j = 0; j &lt; n; j++) {
                if(arr[i][j] == 1 &amp;&amp; checkArr[i][j] != 1) {
                    int c = line(i, j);
                    list.add(c);
                }
            }
        }
        Collections.sort(list);
        System.out.println(list.size());        
        for(int i = 0; i &lt; list.size(); i++) {
            System.out.println(list.get(i));
        }

    }

    public static int line(int a, int b) {
        int count = 0;

        qpoint.offer(new Point(a, b));
        checkArr[a][b] = 1;
        count++;
        while(!qpoint.isEmpty()) {
            Point tmp = qpoint.poll();

            if(tmp.y &lt; arr.length - 1 ) {
                if(arr[tmp.y+1][tmp.x] == 1 &amp;&amp; checkArr[tmp.y+1][tmp.x] != 1) { // 아래
                    qpoint.offer(new Point(tmp.y+1, tmp.x));
                    checkArr[tmp.y+1][tmp.x] = 1;
                    count++;
                }                
            }

            if(tmp.y &gt; 0) {                
                if(arr[tmp.y-1][tmp.x] == 1 &amp;&amp; checkArr[tmp.y-1][tmp.x] != 1) { // 위
                    qpoint.offer(new Point(tmp.y-1, tmp.x));
                    checkArr[tmp.y-1][tmp.x] = 1;
                    count++;
                }
            }

            if(tmp.x &gt; 0) {
                if(arr[tmp.y][tmp.x-1] == 1 &amp;&amp; checkArr[tmp.y][tmp.x-1] != 1) { // 좌
                    qpoint.offer(new Point(tmp.y, tmp.x-1));
                    checkArr[tmp.y][tmp.x-1] = 1;
                    count++;
                }                
            }

            if(tmp.x &lt; arr.length - 1) {
                if(arr[tmp.y][tmp.x+1] == 1 &amp;&amp; checkArr[tmp.y][tmp.x+1] != 1) { // 우
                    qpoint.offer(new Point(tmp.y, tmp.x+1));
                    checkArr[tmp.y][tmp.x+1] = 1;
                    count++;
                }                
            }

        }
        return count;
    }
}

class Point {
    int x;
    int y;

    Point(int y, int x) {
        this.x = x;
        this.y = y;
    }
}</code></pre>
<br>

<h3 id="✔-사용된-개념">✔ 사용된 개념</h3>
<ul>
<li>StringTokenizer</li>
<li>ArrayList</li>
<li>Queue</li>
</ul>
<br>

<h3 id="📌stringtokenizer">📌StringTokenizer</h3>
<pre><code class="language-java">Scanner sc = new Scanner(System.in);
        StringTokenizer st = new StringTokenizer(sc.nextLine());

        int n = Integer.parseInt(st.nextToken());

        arr = new int[n][n];
        checkArr = new int[n][n];
        strArr = new String[n];

        for(int i = 0; i &lt; n; i++) {
            for(int j = 0; j &lt; n; j++) {
                checkArr[i][j] = 0;
            }
        }

        for(int i = 0; i &lt; n; i++) {
            st = new StringTokenizer(sc.nextLine());
            String str = st.nextToken();
            for(int j = 0; j &lt; n; j++) {
                arr[i][j] = Character.getNumericValue(str.charAt(j));                
            }
        }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - 구구단 (2), 끝말잇기]]></title>
            <link>https://velog.io/@jack_whiteblack/React-%EA%B5%AC%EA%B5%AC%EB%8B%A8-2</link>
            <guid>https://velog.io/@jack_whiteblack/React-%EA%B5%AC%EA%B5%AC%EB%8B%A8-2</guid>
            <pubDate>Wed, 21 Dec 2022 08:32:55 GMT</pubDate>
            <description><![CDATA[<h1 id="구구단">구구단</h1>
<h2 id="1-react-hooks">1. React Hooks</h2>
<ul>
<li>Hooks : 함수 컴포넌트에 state와 ref 기능을 추가해준 것</li>
</ul>
<pre><code class="language-html">index2.html

&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;구구단&lt;/title&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot;&gt;&lt;/script&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt; &lt;!-- 결과: &lt;div id=&quot;root&quot;&gt;&lt;button&gt;Like&lt;/button&gt;&lt;/div&gt; --&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    // class GuGuDan extedns React.Component {
    //
    // }

    // Hooks : GuGuDan이라는 함수 컴포넌트에 state와 ref기능을 추가해준 것
    const GuGuDan = () =&gt; { // 함수 컴포넌트
        const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9 /*초기값*/));
        // 구조 분해 문법 : 변수 자리에다가 배열쓰고 객체쓰고 하는 것 (= 비구조화 할당)
        const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
        const [value, setValue] = React.useState(&#39;&#39;);
        const [result, setResult] = React.useState(&#39;&#39;);
        const inputRef = React.useRef(null);
        // use로 시작되는 것이 Hooks

         const onSubmitForm = (e) =&gt; {
            e.preventDefault();
            if (parseInt(value) === first * second) {
                setResult(&#39;정답: &#39; + value);
                setFirst(Math.ceil(Math.random() * 9));
                setSecond(Math.ceil(Math.random() * 9));
                setValue(&#39;&#39;);
                inputRef.current.focus();
            } else {
                setResult(&#39;땡&#39;);
                setValue(&#39;&#39;);
                inputRef.current.focus();
            }
        }

        const onChangeInput = (e) =&gt; {
            setValue(e.target.value);
        }

        return (
            &lt;React.Fragment&gt;
                &lt;div&gt;{first} 곱하기 {second}는 ?&lt;/div&gt;
                &lt;form onSubmit={onSubmitForm}&gt;
                    &lt;input ref={inputRef} onChange={onChangeInput} value={value}/&gt;
                    &lt;button&gt;입력!&lt;/button&gt;
                &lt;/form&gt;
                &lt;div id=&quot;result&quot;&gt;{result}&lt;/div&gt;
            &lt;/React.Fragment&gt;
        );
    }
&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
     ReactDOM.createRoot(document.querySelector(&#39;#root&#39;)).render(&lt;div&gt;&lt;GuGuDan/&gt;&lt;/div&gt;);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br>

<h3 id="1-1-class와-hooks-비교">1-1. Class와 Hooks 비교</h3>
<pre><code class="language-html">Class

Gugudan-class.html

&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;/&gt;
    &lt;title&gt;구구단&lt;/title&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react@16/umd/react.development.js&quot;&gt;&lt;/script&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react-dom@16/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt; &lt;!-- 결과: &lt;div id=&quot;root&quot;&gt;&lt;button&gt;Like&lt;/button&gt;&lt;/div&gt; --&gt;
&lt;script type=&quot;text/babel&quot;&gt;
  class GuGuDan extends React.Component {
    state = {
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: &#39;&#39;,
      result: &#39;&#39;,
    };

    onSubmit = (e) =&gt; {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        this.setState((prevState) =&gt; {
          return {
            result: &#39;정답: &#39; + prevState.value, // 정답 값 표시하기 (현재 값) =&gt; 현재 state
            first: Math.ceil(Math.random() * 9),
            second: Math.ceil(Math.random() * 9),
            value: &#39;&#39;,
            // =&gt; 미래 state
          };
        });
        this.input.focus();
      } else {
        this.setState({
          result: &#39;땡&#39;,
          value: &#39;&#39;,
        });
        this.input.focus();
      }
    };

    onChange = (e) =&gt; {
      this.setState({ value: e.target.value });
    };

    input;

    onRefInput = (c) =&gt; { this.input = c; };
    // =&gt; 함수를 렌더링할 때 마다 만들면 낭비이기 때문에 함수를 따로 빼는 것이 좋다.

    // 컨텐츠
    render() {
        console.log(&#39;렌더링&#39;); // setState를 할 때마다 render 함수가 실행된다.
      return (
        &lt;React.Fragment&gt;
          &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
          &lt;form onSubmit={this.onSubmit}&gt;
            &lt;input ref={this.onRefInput} type=&quot;number&quot; value={this.state.value} onChange={this.onChange}/&gt;
            &lt;button&gt;입력!&lt;/button&gt;
            {/* &lt;button id=&quot;button&quot; className=&quot;&quot; htmlFor=&quot;&quot;&gt;입력!&lt;/button&gt; */}
            {/* id 사용 가능 */}
            {/* class : React에서는 class대신 className을 사용해야한다. -&gt; React class랑 헷갈려서 */}
            {/* label의 for 속성 : for대신 htmlFor을 써야한다. -&gt; 반복문의 for과 헷갈린다. */}
          &lt;/form&gt;
          &lt;div&gt;{this.state.result}&lt;/div&gt;
        &lt;/React.Fragment&gt;
      );
    }
  }

&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
  ReactDOM.render(&lt;GuGuDan/&gt;, document.querySelector(&#39;#root&#39;));
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<pre><code class="language-html">Hooks

index2.html

&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;구구단&lt;/title&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot;&gt;&lt;/script&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt; &lt;!-- 결과: &lt;div id=&quot;root&quot;&gt;&lt;button&gt;Like&lt;/button&gt;&lt;/div&gt; --&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    // class GuGuDan extedns React.Component {
    //
    // }

    // Hooks : GuGuDan이라는 함수 컴포넌트에 state와 ref기능을 추가해준 것
    const GuGuDan = () =&gt; { // 함수 컴포넌트
        const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9 /*초기값*/));
        // 구조 분해 문법 : 변수 자리에다가 배열쓰고 객체쓰고 하는 것 (= 비구조화 할당)
        const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
        const [value, setValue] = React.useState(&#39;&#39;);
        const [result, setResult] = React.useState(&#39;&#39;);
        const inputRef = React.useRef(null);
        // use로 시작되는 것이 Hooks

         const onSubmitForm = (e) =&gt; {
            e.preventDefault();
            if (parseInt(value) === first * second) {
                setResult(&#39;정답: &#39; + value);
                setFirst(Math.ceil(Math.random() * 9));
                setSecond(Math.ceil(Math.random() * 9));
                setValue(&#39;&#39;);
                inputRef.current.focus();
            } else {
                setResult(&#39;땡&#39;);
                setValue(&#39;&#39;);
                inputRef.current.focus();
            }
        }

        const onChangeInput = (e) =&gt; {
            setValue(e.target.value);
        }

        console.log(&#39;렌더링&#39;);
        return (
            &lt;React.Fragment&gt;
                &lt;div&gt;{first} 곱하기 {second}는 ?&lt;/div&gt;
                &lt;form onSubmit={onSubmitForm}&gt;
                    &lt;input ref={inputRef} onChange={onChangeInput} value={value}/&gt;
                    &lt;button&gt;입력!&lt;/button&gt;
                &lt;/form&gt;
                &lt;div id=&quot;result&quot;&gt;{result}&lt;/div&gt;
            &lt;/React.Fragment&gt;
        );
    }
&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
     ReactDOM.createRoot(document.querySelector(&#39;#root&#39;)).render(&lt;div&gt;&lt;GuGuDan/&gt;&lt;/div&gt;);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br>

<h1 id="끝말잇기">끝말잇기</h1>
<h2 id="1-웹팩">1. 웹팩</h2>
<ul>
<li>Node : javascript 실행기</li>
</ul>
<h3 id="1-1-웹팩-설치">1-1. 웹팩 설치</h3>
<ol>
<li><p>node랑 npm 설치하기</p>
</li>
<li><p>터미널에서 폴더 위치 설정하고 npm init 치기</p>
</li>
<li><p>package name, author(이름), license(MIT, ISTC) 설정
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/da1bc376-7d00-4632-af76-c8cbe0b1c67a/image.png" alt="">-&gt; package.jsc 생성 : 리액트 개발에 필요한 모든 패키지를 넣는 곳</p>
</li>
<li><p>npm i react react-dom : react랑 react-dom 설치</p>
</li>
<li><p>npm i -D webpack webpack-cli : 리액트할 때 필요한 webpack과 webpack-cli 설치</p>
</li>
</ol>
<ul>
<li>-D : 실제 서비스가 아닌 개발용으로만 웹팩을 사용하겠다는 의미</li>
</ul>
<p>6.</p>
<ul>
<li><p>실제 서비스에서 사용되는 것들
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/be4e04eb-2cf6-43b9-bf3a-670051817d92/image.png" alt=""> dependencies에 기록</p>
</li>
<li><p>개발할 때만 사용되는 것들
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/ca7cccaf-2808-4748-8f28-0e24f8f2eff4/image.png" alt=""> devDependencies에 기록</p>
</li>
</ul>
<ol start="7">
<li>webpack.config.js 생성<pre><code class="language-javascript">module.exports = {
 속성들 넣기
};</code></pre>
</li>
<li>client.jsx 생성
```javascript
const React = require(&#39;react&#39;);
const ReactDom = require(&#39;react-dom&#39;);</li>
</ol>
<p>-&gt; react와 react-dom 불러오기</p>
<p>ReactDom.render(<WordRelay />, document.querySelector(&#39;#root&#39;));</p>
<pre><code>9. index.html 생성
```html
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;끝말잇기&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;script src=&quot;./dist/app.js&quot;&gt;&lt;/script&gt;  
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="1-2-모듈-시스템과-웹팩-설정">1-2. 모듈 시스템과 웹팩 설정</h3>
<ul>
<li>모듈 시스템 덕분에 필요한 것만 불러올 수 있어 효율적이다.</li>
<li>웹팩은 여러 파일을 하나의 파일로 합쳐준다.</li>
</ul>
<pre><code class="language-javascript">client.jsx

const React = require(&#39;react&#39;);
const ReactDom = require(&#39;react-dom&#39;);

const WordRelay = require(&#39;./WordRelay&#39;);

ReactDom.render(&lt;WordRelay /&gt;, document.querySelector(&#39;#root&#39;));</code></pre>
<pre><code class="language-javascript">WordRelay.jsx

const React = require(&#39;react&#39;);
const {Component} = React;

class WordRelay extends Component {
    state = {

    };

    render() {

    }
}

module.exports = WordRelay;
// 파일을 나눌 때는 const..와 modul..e을 추가적으로 적어준다.</code></pre>
<pre><code class="language-javascript">webpack.config.js

// 파일을 하나로 합쳐주는 역할을 함

const path = require(&#39;path&#39;); // 경로 조작

module.exports = {
    name: &#39;wordrelay-setting&#39;, // 불필요하지만 속성같은 느낌 : 웹팩에 대한 설명
    mode: &#39;development&#39;, // 실서비스: production
    devtool: &#39;eval&#39;, // 빠르게 하겠다는 뜻
    resolve: {
        extensions: [&#39;.js&#39;, &#39;.jsx&#39;]
        // 이렇게 하면 확장자를 일일이 쓸 필요 없이 알아서 찾아준다.
    },

    entry: {
        app: [&#39;./client&#39;],
        //app: [&#39;./client.jsx&#39;, &#39;WordRelay.jsx&#39;] -&gt; client.jsx에서 이미 WordRelay.jsx를 불러오고 있기 때문에 굳이 또 적지 않아도 된다.
    }, // 입력 (ex. client.jsx, WordRelay.jsx)
    output: {
        path: path.join(__dirname, &#39;dist&#39;), // -&gt; 현재 폴더 안에 있는 dist 폴더
        // path.join : 경로를 합쳐줌
        // __dirname : 현재 폴더 경로
        filename: &#39;app.js&#39;
    }, // 출력 (ex. app.js)
};
// -&gt; 이러고 터미널에 webpack을 치면 파일을 하나로 합친다.</code></pre>
<h3 id="1-3-웹팩으로-빌드하기">1-3. 웹팩으로 빌드하기</h3>
<ul>
<li>터미널에 webpack을 쳤을 때 오류가 나면 해결하는 방법<ul>
<li>package.json에서 scripts를 바꿔준다.</li>
<li><blockquote>
<p>터미널에 npm run dev를 친다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/d13aa89f-f52c-48d6-a890-57edc9c38fae/image.png" alt=""></p>
</blockquote>
</li>
<li>터미널에 npx webpack을 친다.</li>
</ul>
</li>
</ul>
<h3 id="1-4-오류-해결하기">1-4. 오류 해결하기</h3>
<ul>
<li>app.js를 활용해서 index.html을 실행하면 오류가난다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/e61c1acc-f71d-437a-aba7-c6e3b540d0aa/image.png" alt=""> -&gt; babel을 추가해야한다.</li>
</ul>
<br>

<ul>
<li><p>babel 설치 (개발용에서만 사용)</p>
<ul>
<li>npm i -D @babel/core : babel의 기본적인 것이 들어있다.</li>
<li>npm i -D @babel/preset-env : 브라우저에 맞게 최신 문법을 옛날 문법으로 바꿔준다.</li>
<li>npm i -D @babel/preset-react : jsx같은 것을 지원할 수 있다.</li>
<li>npm i -D babel-loader : babel이랑 webpack을 연결해준다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/25e82808-3637-4bd6-b169-1a1843933b69/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>webpack.config.js<pre><code class="language-javascript">// 파일을 하나로 합쳐주는 역할을 함
</code></pre>
</li>
</ul>
<p>const path = require(&#39;path&#39;); // 경로 조작</p>
<p>module.exports = {
    name: &#39;wordrelay-setting&#39;, // 불필요하지만 속성같은 느낌 : 웹팩에 대한 설명
    mode: &#39;development&#39;, // 실서비스: production
    devtool: &#39;eval&#39;, // 빠르게 하겠다는 뜻
    resolve: {
        extensions: [&#39;.js&#39;, &#39;.jsx&#39;]
        // 이렇게 하면 확장자를 일일이 쓸 필요 없이 알아서 찾아준다.
    },</p>
<pre><code>entry: {
    app: [&#39;./client&#39;],
    //app: [&#39;./client.jsx&#39;, &#39;WordRelay.jsx&#39;] -&gt; client.jsx에서 이미 WordRelay.jsx를 불러오고 있기 때문에 굳이 또 적지 않아도 된다.
}, // 입력 (ex. client.jsx, WordRelay.jsx)

module: {
    rules: [{
        test: /\.jsx?/, // js파일과 jsx파일을 이 rule을 적용하겠다는 뜻 (정규 표현식)
        loader: &#39;babel-loader&#39;, // babel rule
        options: {
            presets: [&#39;@babel/preset-env&#39;, &#39;@babel/preset-react&#39;], // 알아서 js나 jsx 파일에 babel을 적용해준다.
            plugins: [&#39;@babel/plugin-proposal-class-properties&#39;],
        },
    }],
}, // -&gt; entry에 있는 파일을 읽고 거기에 module을 적용한 후, output에 뺀다.

output: {
    path: path.join(__dirname, &#39;dist&#39;), // -&gt; 현재 폴더 안에 있는 dist 폴더
    // path.join : 경로를 합쳐줌
    // __dirname : 현재 폴더 경로
    filename: &#39;app.js&#39;
}, // 출력 (ex. app.js)</code></pre><p>};
// -&gt; 이러고 터미널에 webpack을 치면 파일을 하나로 합친다.</p>
<pre><code>
```jsx
WordRelay.jsx


const React = require(&#39;react&#39;);
const {Component} = React;

class WordRelay extends Component {
    state = {
        text: &#39;Hello, webpack&#39;,
    };

    render() {
        return &lt;h1&gt;{this.state.text}&lt;/h1&gt;
    }
}

module.exports = WordRelay;
// 파일을 나눌 때는 const..와 modul..e을 추가적으로 적어준다.</code></pre><h3 id="1-5-구구단-웹팩으로-빌드하기">1-5. 구구단 웹팩으로 빌드하기</h3>
<hr>
<br>

<h2 id="📚-referecne">📚 Referecne</h2>
<ul>
<li>학습 자료 및 그림 출처<blockquote>
<p>Inflearn - 웹 게임을 만들며 배우는 React (조현영 (제로초))</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - 구구단 (1)]]></title>
            <link>https://velog.io/@jack_whiteblack/React-%EA%B5%AC%EA%B5%AC%EB%8B%A8</link>
            <guid>https://velog.io/@jack_whiteblack/React-%EA%B5%AC%EA%B5%AC%EB%8B%A8</guid>
            <pubDate>Fri, 16 Dec 2022 16:48:55 GMT</pubDate>
            <description><![CDATA[<h2 id="1-리액트를-사용하는-이유">1. 리액트를 사용하는 이유</h2>
<ul>
<li>복잡한 웹앱에서 데이터와 화면 일치 문제 같은 것을 쉽게 풀어준다.</li>
<li>요즘 트렌드</li>
</ul>
<blockquote>
<p>단점 : 검색 엔진 노출에 어려움이 있다.</p>
</blockquote>
<h2 id="2-리액트">2. 리액트</h2>
<ul>
<li>리액트는 JavaScript다.</li>
<li>데이터 중심으로 움직인다.</li>
<li>함수형과 클래스형으로 나뉜다.<ul>
<li>현재 클래스형은 거의 사용하지 않으나, ErrorBoundary에서는 사용한다. (사용빈도 : 1%)</li>
</ul>
</li>
</ul>
<pre><code class="language-html">class LikeButton extends React.Component {

}
=&gt; 클래스형

const LikeButton = () =&gt; {};
function LikeButton() {}
=&gt; 함수형</code></pre>
<br>

<pre><code class="language-html">like-button.html


&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;웹게임&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;!-- 남의 코드 불러올 때 사용 --&gt;
&lt;!-- 개발용 --&gt;
&lt;script crossorigin src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot;&gt;&lt;/script&gt; 
&lt;script crossorigin src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
&lt;!-- 배포용 --&gt;
&lt;!--&lt;script src=&quot;https://unpkg.com/react@18/umd/react.production.min.js&quot; crossorigin&gt;&lt;/script&gt;--&gt;
&lt;!--&lt;script src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.production.min.js&quot; crossorigin&gt;&lt;/script&gt;--&gt;
&lt;script&gt;
    &#39;use strict&#39;;

    const e = React.createElement;

    // 원시적인 형태
    // 리액트 = js
    // 리액트는 데이터 중심으로 움직인다.
    class LikeButton extends React.Component {
        constructor(props) {
            super(props);
            this.state = {liked: false}; // 데이터
        }

        render() {
            if(this.state.liked) {
                return &#39;You liked this.&#39;;
            }

            return e(&#39;button&#39;, {onClick: () =&gt; this.setState({liked: true})}, &#39;Like&#39;); // 화면
        } // =&gt; 데이터가 바뀌면 화면이 바뀐다. : 화면에서 바뀔 부분을 state로 만든다.
    } // class는 거의 사용하지 않음 : ErrorBoundary에서 사용 (1%)
    // =&gt; 컴포넌트 : 데이터와 화면을 하나로 묶어둔 덩어리

    //const LikeButton = () =&gt; {};
    //function LikeButton() {}
&lt;/script&gt;
&lt;script&gt;
    ReactDOM.createRoot(document.querySelector(&#39;#root&#39;)).render(e(LikeButton));
    // LikeButton 이라는 컴포넌트를 &lt;div id=&quot;root&quot;&gt;&lt;/div&gt; 여기 안에다가 컴포넌트를 그린다.
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt; </code></pre>
<ul>
<li>컴포넌트 : 데이터와 화면을 하나로 묶어둔 덩어리</li>
</ul>
<br>

<h2 id="3-jsx-xml">3. JSX (XML)</h2>
<pre><code class="language-html">like-button-jsx.html


&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;script crossorigin src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot;&gt;&lt;/script&gt;
&lt;script crossorigin src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt; &lt;!-- babel을 사용하기 위한 script --&gt;
&lt;!--&lt;script src=&quot;https://unpkg.com/react@18/umd/react.production.min.js&quot; crossorigin&gt;&lt;/script&gt;--&gt;
&lt;!--&lt;script src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.production.min.js&quot; crossorigin&gt;&lt;/script&gt;--&gt;
&lt;script type=&quot;text/babel&quot;&gt;
  &#39;use strict&#39;;

  class LikeButton extends React.Component {
    constructor(props) {
      super(props);
      this.state = {liked: false};
    }

    render() {
      if (this.state.liked) {
        return &#39;You liked this.&#39;;
      }

      return (
        &lt;button onClick={() =&gt; this.setState({liked: true})}&gt;
          Like
        &lt;/button&gt;
      ); // 실무에서 주로 쓰임
    } // =&gt; babel을 추가하지 않으면 작동하지 않음
  }
&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    // ReactDOM.render(&lt;LikeButton /&gt;, document.querySelector(&#39;#root&#39;)); // React 17버전 코드
    ReactDOM.createRoot(document.querySelector(&#39;#root&#39;)).render(&lt;LikeButton/&gt;); // React 18버전 코드
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li>babel을 사용하면<pre><code class="language-html">return (
  &lt;button onClick={() =&gt; this.setState({liked: true})}&gt;
      Like
  &lt;/button&gt;
);</code></pre>
이 것을</li>
</ul>
<pre><code class="language-html">return e(&#39;button&#39;, {onClick: () =&gt; this.setState({liked: true})}, &#39;Like&#39;);</code></pre>
<p>이 것으로 바꾸어준다.</p>
<br>

<h2 id="4-클래스-컴포넌트의-형태와-리액트-데브툴즈">4. 클래스 컴포넌트의 형태와 리액트 데브툴즈</h2>
<ul>
<li>객체를 함부로 바꾸지 말 것 (불변성) -&gt; 복사하기
: 기존 객체는 놔두고 객체를 복사해서 새로운 객체를 만들어서 바꾸기</li>
</ul>
<pre><code class="language-html">예시

const array = []; // 배열도 객체
pop, push, shift, unshift, splice -&gt; 배열을 직접적으로 수정 // React에서는 사용하지 않음
concat, slice -&gt; 새로운 배열을 만들어냄</code></pre>
<pre><code class="language-html">return (
    &lt;button onClick={() =&gt; {
      this.setState({liked: true});
    }}&gt;
        Like
    &lt;/button&gt;
);</code></pre>
<ul>
<li>클릭을 하면 데이터가 true로 바뀌고 true로 바뀌는 즉시 화면이 바뀐다. -&gt; 데이터를 바꾸면 화면을 바꾸는 것이다.</li>
</ul>
<br>

<h2 id="5-함수-컴포넌트-함수형-x">5. 함수 컴포넌트 (함수형 X)</h2>
<ul>
<li>코드가 간략하다.</li>
<li>this를 쓸 일이 없다.</li>
</ul>
<pre><code class="language-javascript">// 함수 컴포넌트는 this를 쓸 일이 없다.
  // const LikedButton = () =&gt; {} // 화살표 함수
  function LikeButton() { // 함수형 컴포넌트 X 함수 컴포넌트 O
        const [liked, setLiked] = React.useState(false); // 구조분해
        // liked : 데이터, setLiked : 데이터를 바꾸는 함수
        // -&gt; 뭔 짓을 하든, 결국 return한게 화면이다.
        /*
            js 옛날 문법
            const result = React.useState(false);
            const liked = result[0];
            const setLiked = result[1];
        */

        /*
        // 예시
        const[news, setNews] = React.useState([&#39;뉴스1&#39;, &#39;뉴스2&#39;, &#39;뉴스3&#39;, &#39;뉴스4&#39;, &#39;뉴스5&#39;])
        const [category, setCategory] = React.useState([&#39;스포츠&#39;, &#39;연예&#39;, &#39;경제&#39;, &#39;시사&#39;, &#39;정치&#39;])

        if(category === &#39;뉴스&#39;) {
            return &#39;뉴스화면&#39;
        } // 데이터들을 사용해서 화면 리턴
        */

        if(liked) {
            return &#39;You liked this.&#39;;
        }
        return (
            &lt;button onClick={() =&gt; {setLiked(true);}}&gt;Like&lt;/button&gt;
        );

    }</code></pre>
<br>

<h2 id="6-구구단">6. 구구단</h2>
<pre><code class="language-html">index.html


&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot; /&gt;
        &lt;title&gt;구구단&lt;/title&gt;
        &lt;script crossorigin src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot;&gt;&lt;/script&gt;
        &lt;script crossorigin src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
        &lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div id=&quot;root&quot;&gt;&lt;/div&gt; &lt;!-- 결과: &lt;div id=&quot;root&quot;&gt;&lt;button&gt;Like&lt;/button&gt;&lt;/div&gt; --&gt;
        &lt;script type=&quot;text/babel&quot;&gt;
            class GuGuDan extends React.Component {
                constructor(props) {
                    super(props);
                    this.state = {
                        first: Math.ceil(Math.random() * 9),
                        second: Math.ceil(Math.random() * 9),
                        value: &#39;&#39;,
                        result: &#39;&#39;,
                    };
                }

                render() {
                    return (
                        &lt;div&gt;
                            &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
                            {/* 중간에 js를 삽입하고 싶으면 {}를 사용한다. */}
                            &lt;form&gt;
                                &lt;input type=&quot;number&quot; value={this.state.value} onChange={(e) =&gt; this.setState({value: e.target.value})} /&gt;
                                {/* input.onChange = (e) =&gt; {console.log(e.target.value)} : 글자 치는 것이 콘솔에 나오게 함 ↑ */}
                                &lt;button&gt;입력!&lt;/button&gt;
                            &lt;/form&gt;
                            &lt;div&gt;{this.state.result}&lt;/div&gt;
                        &lt;/div&gt;
                    );
                }
            }
        &lt;/script&gt;
        &lt;script type=&quot;text/babel&quot;&gt;
            ReactDOM.createRoot(document.querySelector(&#39;#root&#39;)).render(&lt;GuGuDan/&gt;);
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<br>

<h3 id="6-1-클래스-메서드">6-1. 클래스 메서드</h3>
<pre><code class="language-html">index.html
구구단 컴포넌트


&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot; /&gt;
        &lt;title&gt;구구단&lt;/title&gt;
        &lt;script crossorigin src=&quot;https://unpkg.com/react@18/umd/react.development.js&quot;&gt;&lt;/script&gt;
        &lt;script crossorigin src=&quot;https://unpkg.com/react-dom@18/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
        &lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div id=&quot;root&quot;&gt;&lt;/div&gt; &lt;!-- 결과: &lt;div id=&quot;root&quot;&gt;&lt;button&gt;Like&lt;/button&gt;&lt;/div&gt; --&gt;
        &lt;script type=&quot;text/babel&quot;&gt;
            class GuGuDan extends React.Component {
                constructor(props) {
                    super(props);
                    this.state = { // 변할 것들
                        first: Math.ceil(Math.random() * 9),
                        second: Math.ceil(Math.random() * 9),
                        value: &#39;&#39;,
                        result: &#39;&#39;,
                    };
                }

                onSubmit = (e) =&gt; { // submit할 때 실행
                    e.preventDefault();
                    if(parseInt(this.state.value) === this.state.first * this.state.second) {
                        this.setState({
                            result: &#39;정답&#39;,
                            first: Math.ceil(Math.random() * 9),
                            second: Math.ceil(Math.random() * 9),
                            value: &#39;&#39;,
                        });
                    } else {
                        this.setState({
                            result: &#39;땡&#39;,
                            value: &#39;&#39;,
                        });
                    }
                }

                onChange = (e) =&gt; {
                    this.setState({value: e.target.value})
                };

                render() {
                    return (
                        &lt;div&gt;
                            &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
                            {/* 중간에 js를 삽입하고 싶으면 {}를 사용한다. */}
                            &lt;form onSubmit={this.onSubmit}&gt;
                                &lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange} /&gt;
                                {/* input.onChange = (e) =&gt; {console.log(e.target.value)} : 글자 치는 것이 콘솔에 나오게 함 ↑ */}
                                &lt;button&gt;입력!&lt;/button&gt;
                                {/* 기본 이벤트 핸들러 : onClick, onChange, onSubmit, onLoad, onInput, onFocus, onBlur */}
                            &lt;/form&gt;
                            &lt;div&gt;{this.state.result}&lt;/div&gt;
                        &lt;/div&gt;
                    );
                }
            }
        &lt;/script&gt;
        &lt;script type=&quot;text/babel&quot;&gt;
            ReactDOM.createRoot(document.querySelector(&#39;#root&#39;)).render(&lt;div&gt;&lt;GuGuDan/&gt;&lt;GuGuDan/&gt;&lt;/div&gt;);
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/1b10bf12-f0db-45a6-9f91-50d61ac347a9/image.png" alt=""></p>
<h3 id="6-2-fragment와-기타-팁들">6-2. Fragment와 기타 팁들</h3>
<ul>
<li>의미없는 div 태그</li>
</ul>
<pre><code class="language-html">&lt;div&gt;
  &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
  {/* 중간에 js를 삽입하고 싶으면 {}를 사용한다. */}
  &lt;form onSubmit={this.onSubmit}&gt;
    &lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange} /&gt;
    {/* input.onChange = (e) =&gt; {console.log(e.target.value)} : 글자 치는 것이 콘솔에 나오게 함 ↑ */}
    &lt;button&gt;입력!&lt;/button&gt;
    {/* 기본 이벤트 핸들러 : onClick, onChange, onSubmit, onLoad, onInput, onFocus, onBlur */}
  &lt;/form&gt;
  &lt;div&gt;{this.state.result}&lt;/div&gt;
&lt;/div&gt;</code></pre>
<br>
개선 사항 ↓
<br>

<ul>
<li>빈 태그로 묶어주기
: 현재 babel에서는 지원을 하지 않는다
(babel2에서 지원)</li>
</ul>
<pre><code class="language-html">&lt;&gt;
  &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
  &lt;form onSubmit={this.onSubmit}&gt;
    &lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange} /&gt;
    &lt;button&gt;입력!&lt;/button&gt;
  &lt;/form&gt;
  &lt;div&gt;{this.state.result}&lt;/div&gt;
&lt;/&gt;</code></pre>
<br>

<ul>
<li>React.Fragment 사용</li>
</ul>
<pre><code class="language-html">&lt;&gt;
  &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
  &lt;form onSubmit={this.onSubmit}&gt;
    &lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange} /&gt;
    &lt;button&gt;입력!&lt;/button&gt;
  &lt;/form&gt;
  &lt;div&gt;{this.state.result}&lt;/div&gt;
&lt;/&gt;</code></pre>
<br>

<ul>
<li>form 태그 유무</li>
</ul>
<pre><code class="language-html">form 태그가 있을 때는 onSubmit 사용
&lt;form onSubmit={this.onSubmit}&gt;
  &lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange} /&gt;
  &lt;button type=&quot;submit&quot;&gt;입력!&lt;/button&gt;
&lt;/form&gt;
--------------------------------------------------------
form이 없으면 onClick 사용
&lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange} /&gt;
&lt;button onClick={this.onSubmit}&gt;입력!&lt;/button&gt;</code></pre>
<br>

<ul>
<li>직접 만든 함수는 무조건 화살표 함수로</li>
<li><blockquote>
<p>function으로 바꾸게 되면 작동을 하지 않는다.
: this의 의미가 달라진다.</p>
</blockquote>
</li>
</ul>
<pre><code class="language-javascript">onSubmit = (e) =&gt; { // submit할 때 실행
    e.preventDefault();
    if(parseInt(this.state.value) === this.state.first * this.state.second) {
          this.setState({
          result: &#39;정답&#39;,
          first: Math.ceil(Math.random() * 9),
          second: Math.ceil(Math.random() * 9),
          value: &#39;&#39;,
          });
    } else {
          this.setState({
              result: &#39;땡&#39;,
            value: &#39;&#39;,
          });
    }
};

onChange = (e) =&gt; {
  this.setState({value: e.target.value})
};</code></pre>
<br>

<ul>
<li>constructor 생략 가능
: 실무에서 많이 쓰임</li>
</ul>
<pre><code class="language-javascript">
// constructor 포함
class GuGuDan extends React.Component {
  constructor(props) {
    super(props);
    this.state = { // 변할 것들
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: &#39;&#39;,
      result: &#39;&#39;,
    };
  }
}

----------------------------------------

// constructor 미포함
class GuGuDan extends React.Component {
    state = { // 변할 것들
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: &#39;&#39;,
      result: &#39;&#39;,
    };
}</code></pre>
<br>

<h3 id="6-3-함수형-setstate">6-3. 함수형 setState</h3>
<ul>
<li>정답 표시하기 (this.state.value)</li>
</ul>
<pre><code class="language-javascript">
onSubmit = (e) =&gt; {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        this.setState({
            result: &#39;정답: &#39; + this.state.value, // 정답 값 표시하기 (현재 값)
            first: Math.ceil(Math.random() * 9),
            second: Math.ceil(Math.random() * 9),
            value: &#39;&#39;,
        });
        this.input.focus();
      } else {
        this.setState({
          result: &#39;땡&#39;,
          value: &#39;&#39;,
        });
        this.input.focus();
      }
    };</code></pre>
<ul>
<li>예전 상태 값을 다음 상태 값에 활용할 수 있다.</li>
</ul>
<pre><code class="language-javascript">
onSubmit = (e) =&gt; {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        this.setState((prevState) =&gt; {
          return {
            result: &#39;정답: &#39; + prevState.value, // 정답 값 표시하기 (현재 값) =&gt; 현재 state
            first: Math.ceil(Math.random() * 9),
            second: Math.ceil(Math.random() * 9),
            value: &#39;&#39;,
            // =&gt; 미래 state
          };
        });
        this.input.focus();
      } else {
        this.setState({
          result: &#39;땡&#39;,
          value: &#39;&#39;,
        });
        this.input.focus();
      }
    };</code></pre>
<ul>
<li>preveState 사용</li>
<li>예전 state 값으로 새로운 state 값을 만들 때 return을 해주는 함수 사용 (setState에 this.state가 들어갈 때 사용)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/908a4eb8-68ab-4a5e-a85d-65734839dd7d/image.png" alt=""></p>
<br>

<h3 id="6-4-ref">6-4. ref</h3>
<pre><code class="language-html">&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;/&gt;
    &lt;title&gt;구구단&lt;/title&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react@16/umd/react.development.js&quot;&gt;&lt;/script&gt;
    &lt;script crossorigin src=&quot;https://unpkg.com/react-dom@16/umd/react-dom.development.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;root&quot;&gt;&lt;/div&gt; &lt;!-- 결과: &lt;div id=&quot;root&quot;&gt;&lt;button&gt;Like&lt;/button&gt;&lt;/div&gt; --&gt;
&lt;script type=&quot;text/babel&quot;&gt;
  class GuGuDan extends React.Component {
    state = {
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: &#39;&#39;,
      result: &#39;&#39;,
    };

    onSubmit = (e) =&gt; {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        this.setState((prevState) =&gt; {
          return {
            result: &#39;정답: &#39; + prevState.value, // 정답 값 표시하기 (현재 값) =&gt; 현재 state
            first: Math.ceil(Math.random() * 9),
            second: Math.ceil(Math.random() * 9),
            value: &#39;&#39;,
            // =&gt; 미래 state
          };
        });
        this.input.focus();
      } else {
        this.setState({
          result: &#39;땡&#39;,
          value: &#39;&#39;,
        });
        this.input.focus();
      }
    };

    onChange = (e) =&gt; {
      this.setState({ value: e.target.value });
    };

    input;

    onRefInput = (c) =&gt; { this.input = c; };

    // 컨텐츠
    render() {
        console.log(&#39;렌더링&#39;); // setState를 할 때마다 render 함수가 실행된다.
      return (
        &lt;React.Fragment&gt;
          &lt;div&gt;{this.state.first} 곱하기 {this.state.second}는?&lt;/div&gt;
          &lt;form onSubmit={this.onSubmit}&gt;
            &lt;input ref={this.onRefInput} type=&quot;number&quot; value={this.state.value} onChange={this.onChange}/&gt;
            &lt;button&gt;입력!&lt;/button&gt;
          &lt;/form&gt;
          &lt;div&gt;{this.state.result}&lt;/div&gt;
        &lt;/React.Fragment&gt;
      );
    }
  }

&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
  ReactDOM.render(&lt;GuGuDan/&gt;, document.querySelector(&#39;#root&#39;));
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/d7a19e22-cd30-430a-b7bf-e1330d507013/image.png" alt=""></p>
<br>

<hr>
<br>

<h2 id="📚-referecne">📚 Referecne</h2>
<ul>
<li>학습 자료 및 그림 출처<blockquote>
<p>Inflearn - 웹 게임을 만들며 배우는 React (조현영 (제로초))</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - 파일 입출력]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Thu, 08 Dec 2022 13:35:02 GMT</pubDate>
            <description><![CDATA[<h2 id="1-파일-입출력">1. 파일 입출력</h2>
<h3 id="1-1-javaiofile">1-1. java.io.File</h3>
<ul>
<li>File 클래스는 파일 또는 폴더에 대한 정보를 제공하는 클래스이다.</li>
<li>File 클래스의 객체는 정보를 조회하고자 하는 파일이나 폴더의 경로에 대한 문자열을 생성자 파라미터로 전달하는 형태로 만들 수 있다. 이때 파라미터로 전달되는 경로가 실제로 존재하지 않더라도 File 객체의 생성이 가능해진다.</li>
</ul>
<br>

<ul>
<li>C:\photo\food.jpg 파일에 대한 객체 생성 예시</li>
</ul>
<pre><code class="language-java">File file = new File(&quot;C:\photo\food.jpg&quot;);

File file = new File(&quot;C:\photo&quot;, &quot;food.jpg&quot;);</code></pre>
<h3 id="1-2-경로-설정하기">1-2. 경로 설정하기</h3>
<ul>
<li><p>운영체제간의 호환성 유지를 위한 &quot;/&quot;의 사용
-&gt; 경로 문자열을 설정할 때 윈도우 기반에서 역슬래시()를 사용하지만 가급적 다른 운영체제와의 호환성을 위해 슬래시(/)를 사용하는 것이 좋다.</p>
</li>
<li><p>절대 경로
-&gt; 작업 디렉토리와 관계없이 절대적인 위치를 의미하는 경로
-&gt; 리눅스 기준 : httpd.conf
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./conf/httpd.conf
-&gt; 윈도우 예시 : hosts
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ../drivers/etc/hosts</p>
</li>
</ul>
<h3 id="1-3-문자-인코딩-character-encoding이란">1-3. 문자 인코딩 (character encoding)이란?</h3>
<ul>
<li>문자나 기호들의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로 부호화하는 방법
-&gt; UTF-8 : 8비트 이진수로 표현하는 방법</li>
</ul>
<h3 id="1-4-스트림이란">1-4. 스트림이란?</h3>
<ul>
<li>입출력에서 stream이란 디바이스의 입출력 방식이 character 단위이든 block 단위이든 관계없이 &quot;1바이트&quot;씩 &quot;연속&quot;적으로 전달되는 형태로, 추상화된 상태를 의미한다.</li>
<li>입출력 장치는 개별적인 특성이 있으므로 읽고, 쓰는 단위가 각각 다르지만 스트림은 이러한 일련의 과정을 추상화하여 모든 디바이스를 character 단위로만 사용하도록 한다.</li>
<li>즉, 입출력 디바이스의 특성을 무시하고 하난의 단일한 입출력 인터페이스를 다룰 수 있도록 하는 것이 stream이다.</li>
</ul>
<h3 id="1-5-자바의-스트림-관련-클래스">1-5. 자바의 스트림 관련 클래스</h3>
<ul>
<li>스트림 관련 클래스들은 각각 InputStream(입력/읽기), OutputStream(출력/저장)과 관련된 인터페이스를 상속받기 때문에 모두 동일한 메서드를 가지고 있다.</li>
<li>프로그래머는 상황에 따라 적절한 클래스를 사용하기만 하면 동일한 방법으로 스트림을 사용할 수 있다.</li>
</ul>
<h3 id="1-6-파일-저장-관련">1-6. 파일 저장 관련</h3>
<ul>
<li>저장을 위한 빈 파일 생성하기
-&gt; OutputStream의 객체를 생성한다.</li>
<li>파일에 내용 쓰기
-&gt; 저장할 내용을 byte 배열로 변환한다.
-&gt; 변환된 배열을 OutputStream의 write() 메서드에게 파라미터로 전달</li>
<li>파일 닫기
-&gt; OutputStream 객체로 close() 메서드를 호출하여 스트림을 닫는다.</li>
<li>파일 저장시에 유의사항
-&gt; OutputStream은 각각의 단계마다 예외처리를 강제적으로 요구한다.
-&gt; try ~ catch 블록이 형성되는 과정에서 변수의 유효성 범위에 대한 처리에 유의해야 한다.</li>
</ul>
<h3 id="1-7-파일-읽기-과정">1-7. 파일 읽기 과정</h3>
<ul>
<li>파일을 읽기 위한 InputStream 객체 생성하기</li>
<li>읽은 내용을 담기 위한 빈 byte 배열 생성하기
-&gt; 파일의 용량 크기만큼 배열의 사이즈를 지정해야 한다.</li>
<li>파일의 내용 읽기
-&gt; 읽은 내용을 담기위한 byte 배열을 InputStream 객체의 read() 메서드에게 파라미터로 전달한다.</li>
<li>사용이 완료된 스트림 닫기
-&gt; InputStream 객체의 close() 메서드를 호출하여 스트림을 닫는다.</li>
<li>읽은 내용을 문자열로 변환하기
-&gt; byte 배열을 String 클래스의 생성자에게 전달하여 문자열로 변환한다.
-&gt; 이 과정에서 어떤 인코딩을 사용할 지를 함께 설정해야 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - 컬렉션 프레임워크]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Thu, 08 Dec 2022 13:08:14 GMT</pubDate>
            <description><![CDATA[<h2 id="1-컬렉션-프레임워크-collection-framework">1. 컬렉션 프레임워크 (Collection Framework)</h2>
<h3 id="1-1-collection-framework란">1-1. Collection Framework란?</h3>
<ul>
<li>다수의 데이터를 쉽게 처리할 수 있는 표준화된 방법을 제공하는 클래스들로 기존 배열형태의 자료 저장에서 좀 더 다양한 데이터들을 저장하기 위한 필수 클래스이다.</li>
</ul>
<h3 id="1-2-hashmap-클래스">1-2. HashMap 클래스</h3>
<ul>
<li>데이터에 이름표를 적용하여 저장하기</li>
<li>HashMap 클래스는 Map 인터페이스를 상속받는 &#39;자료 보관소&#39;이기 때문에 암묵적 객체 형변환의 규칙에 따라 Map형태로 선언하고 HashMap형태로 할당한다.</li>
<li>선언과 할당시에 HashMap의 이름표로 사용할 데이터 형(String)과 HashMap에 저장할 데이터형의 클래스 이름으로 명시해야하는데 이를 &#39;제너릭스&#39;라 한다.</li>
<li>제너릭스에 명시할 수 있는 데이터형은 반드시 클래스 이름이여야 하기 때문에 기본 자료형을 보관할 경우 Wrapper Class의 이름을 사용한다.</li>
</ul>
<pre><code class="language-java">Map&lt;String, 저장할 데이터의 클래스 이름&gt; data 
            = new HashMap&lt;String, 저장할 데이터의 클래스 이름&gt;();</code></pre>
<ul>
<li>기존에 저장된 데이터와 중복되는 이름이 저장될 경우, 기존에 저장된 데이터를 덮어 씌우게 된다.</li>
</ul>
<h3 id="1-3-arraylist">1-3. ArrayList</h3>
<ul>
<li>ArrayList는 List 인터페이스를 상속받는 클래스로 데이터를 이름표 없이 무제한으로 보관할 수 있다.</li>
<li>ArrayList에 추가되는 데이터는 순차적으로 배열과 같은 인덱스 번호를 부여받는다.</li>
<li>상위 인터페이스형으로 선언하고 ArrayList 클래스로 객체를 할당하며, 선언과 할당 시에는 보관하고자 하는 지료형에 대한 제너릭스를 명시한다.</li>
</ul>
<p>```java
List&lt;저장할 데이터의 클래스 이름&gt; list
        = new ArrayList&lt;저장할 데이터의 클래스 이름&gt;();
``</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - 예외처리]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Thu, 08 Dec 2022 12:58:25 GMT</pubDate>
            <description><![CDATA[<h2 id="1-예외처리">1. 예외처리</h2>
<h3 id="1-1-에러의-종류">1-1. 에러의 종류</h3>
<ul>
<li>컴파일 에러<ul>
<li>소스코드의 구문 오류로 인하여 컴파일이 불가능한 상태</li>
<li>이클립스에서 빨간색으로 표시되는 경우에 해당한다.</li>
<li>프로그램을 실행하기 전에 발견되므로 상대적으로 고치기 쉽다.</li>
</ul>
</li>
</ul>
<ul>
<li>런타임 에러<ul>
<li>구문상의 에러는 없지만, 프로그램이 실행되는 과정에서 다양한 경우의 수에 대응하지 못하여 발생하는 예외상황</li>
<li>런타임 에러가 발생하면 프로그램은 강제로 종료된다.</li>
<li>우리가 프로그램의 에러라고 부르는 현상은 대부분 런타임 에러에 해당한다.</li>
</ul>
</li>
</ul>
<h3 id="1-2-런타임-에러의-종류">1-2. 런타임 에러의 종류</h3>
<ul>
<li>런타임 에러는 프로그램 자체의 구조적인 문제로 인한 논리적 오류와 자바 가상머신 자체의 문제로 인한 오류, 그리고 예외가 있다.</li>
<li>논리 오류<ul>
<li>논리적 모순이 생기지 않도록 코드를 작성해야 한다.</li>
</ul>
</li>
<li>자바 가상머신 자체의 오류<ul>
<li>프로그래머가 책임질 수 있는 수준의 오류가 아니다.</li>
</ul>
</li>
<li>예외(Exception)<ul>
<li>프로그램 실행 중에 발생할 수 있는 예기치 않은 사건으로 프로그래머의 노력으로 처리할 수 있다.</li>
<li>자바 가상 머신은 프로그램 실행 중에 예외가 발생하면 관련된 예외 클래스로부터 예외 객체를 생성하여 프로그램에서 지정된 예외처리 구문으로 넘긴다.</li>
<li>예외가 발생하면 프로그램에 지정된 예외 처리 구문이 자바 가상머신에 의해 호출되고, 이때 전달되는 예외 객체를 넘겨받아 적절한 처리를 수행한다.</li>
</ul>
</li>
</ul>
<h3 id="1-3-java의-예외처리">1-3. java의 예외처리</h3>
<ul>
<li>java에서는 try ~ catch ~ finally 구문을 통해 프로그래머가 예외 상황에 대응할 수 있도록 하고 있다.</li>
</ul>
<pre><code class="language-java">try {
    // 기본적으로 실행되는 부분
} catch (예외 클래스 이름 객체 이름) {
    // try 블록에서 예외가 발생한 경우 이 곳으로 제어가 넘어온다.
} finally {
    // 예외 상황의 발생 여부에 상관없이 무조건 실행되는 부분
    // finally 블록은 생략 가능하다.
}</code></pre>
<ul>
<li>try 블록 실행도중 catch에서 명시한 예외 클래스에 해당하는 런타임 에러가 발생하면, try 블록을 즉시 중단하고 catch 블록이 실행된 후, finally 블록이 실행된다.</li>
</ul>
<h3 id="1-4-catch-블록을-사용한-복잡한-에러처리">1-4. catch 블록을 사용한 복잡한 에러처리</h3>
<ul>
<li>catch 블록은 에러가 예상되는 상황에 대해 복수로 명시하는 것이 가능하다.</li>
</ul>
<pre><code class="language-java">try {
    //
} catch(NumberFormatException e) {
} catch(ArrayIndexOutOfBoundsException e) {
}</code></pre>
<h3 id="1-5-exception-클래스">1-5. Exception 클래스</h3>
<ul>
<li>Java에서 예외 상황을 의미하는 모든 클래스들의 최상위 클래스</li>
<li>이 클래스의 이름으로 catch 블록을 구성하면, 모든 예외 상황에 일괄적으로 대응할 수는 있지만, catch 블록이 세분화된 경우와는 달리 상황 별 개별적인 처리는 불가능하다.</li>
<li>Exception 클래스에 대한 예외처리는 대부분 맨 마지막 catch 블록에 명시하여 &#39;마지막 알 수 없는 에러&#39;를 의미하도록 구성한다.</li>
</ul>
<pre><code class="language-java">try {
} catch(NumberFormatException e) {
} catch(ArrayIndexOutOfBoundsException e) {
} catch(Exception e) {
}</code></pre>
<h3 id="1-6-여러-객체-e의-기능">1-6. 여러 객체 &#39;e&#39;의 기능</h3>
<ul>
<li>e.getMessage()
-&gt; 간략한 에러 메시지를 리턴한다.
-&gt; e.getLocalisMessage()도 같은 기능을 한다.</li>
<li>e.printStackTrace()
-&gt; 실제 예외 상황시에 출력되는 메시지를 강제로 출력한다.
-&gt; 개발자가 catch 블록 안에서 예외 상황을 분석하기 위한 용도로 사용한다.</li>
</ul>
<h2 id="2-calendar-class---날짜-처리">2. Calendar Class - 날짜 처리</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - 정규 표현식]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D</guid>
            <pubDate>Thu, 08 Dec 2022 09:15:52 GMT</pubDate>
            <description><![CDATA[<h2 id="1-정규-표현식">1. 정규 표현식</h2>
<h3 id="1-1-정규-표현식이란">1-1. 정규 표현식이란?</h3>
<ul>
<li>정규 표현식(Reqular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 &#39;형식언어&#39;이다.</li>
<li>정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 &#39;문자열의 검색과 치환&#39;을 위해 지원하고 있다.</li>
<li>java.util.regex 패키지에 포함되어있다.</li>
</ul>
<h3 id="1-2-정규-표현식의-사용">1-2. 정규 표현식의 사용</h3>
<ul>
<li>boolean java.util.regex.Pattern.matches(String arg0, CharSequence arg1);</li>
<li>arg0 : 정규 표현식 문자열이다.</li>
<li>arg1 : 형식을 검사받기 위한 내용이다.</li>
<li>즉, 위의 기능은 arg1이 arg0의 형식에 맞는지를 검사하고 결과를 boolean으로 리턴한다.</li>
</ul>
<h3 id="1-3-정규-표현식">1-3. 정규 표현식</h3>
<ul>
<li>숫자 모양에 대한 형식 검사
&quot;^[0-9]*$&quot;<br></li>
<li>영문으로만 구성되었는지에 대한 형식 검사
&quot;^[a-zA-Z]*$&quot;<br></li>
<li>한글로만 구성되었는지에 대한 형식 검사
&quot;^[ㄱ-ㅎ가-힣]*$&quot;<br></li>
<li>영문과 숫자로만 구성되었는지에 대한 형식 검사
&quot;^[a-zA-Z0-9]*$&quot;<br> </li>
<li>한글과 숫자로만 구성되었는지에 대한 형식 검사
&quot;^[ㄱ-ㅎ가-힣0-9]*$&quot;<br></li>
<li>이메일 형식인지에 대한 검사. &quot;아이디@도메인&quot;의 형식을 충족해야 한다.
&quot;^<a href="%5B-_.%5D?%5B0-9a-zA-Z%5D">0-9a-zA-Z</a><em>@<a href="%5B-_.%5D?%5B0-9a-zA-Z%5D">0-9a-zA-Z</a></em>.[a-zA-Z]{2,3}$&quot;<br></li>
<li>&quot;-&quot;없이 핸드폰번호인지에 대한 형식검사.
&quot;^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$&quot;<br></li>
<li>&quot;-&quot;없이 전화번호인지에 대한 형식검사. 각 부분에 대한 자리수도 충족시켜야 한다.
&quot;^\\d{2,3}\\d{3,4}\\d{4}$&quot;<br></li>
<li>&quot;-&quot;없이 주민번호에 대한 글자수 및 뒷자리 첫글자가 1~4의 범위에 있는지에 대한 검사
&quot;^\\d{6}[1-4]\\d{6}&quot;</li>
</ul>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><a href="https://hamait.tistory.com/342">정규표현식 (Regex) 정리</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - Wrapper Class]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-Wrapper-Class</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-Wrapper-Class</guid>
            <pubDate>Thu, 08 Dec 2022 09:01:49 GMT</pubDate>
            <description><![CDATA[<h2 id="1-wrapper-class">1. Wrapper Class</h2>
<ul>
<li>Java는 데이터를 관리하기 위하여 기본 데이터 타입을 지원하지만, 클래스를 통해서 만들어진 객체를 통한 데이터 관리도 가능하다.</li>
<li>어떤 상황에서는 기본 데이터 타입의 변수를 객체 형태로 사용해야 하는 경우가 있는데, 이때 기본형 타입을 객체로 포장할 필요가 있다.</li>
<li>포장 클래스(Wrapper Class)는 특정 기본형 타입을 나타내는 용도로 사용된다.</li>
</ul>
<h3 id="1-1-wrapper-class-의미">1-1. Wrapper Class 의미</h3>
<ul>
<li>초창기 java 언어는 기본 자료형의 연산보다도 Wrapper Class를 사용한 연산이 더 많이 이루어졌으나, java 언어가 발전함에 따라서 기본 자료형과 Wrapper Class간의 연산 차이가 없어졌다.</li>
<li>최근의 java 언어는 Wrapper Class와 기본 자료형을 구분하지 않고 사용하기 때문에 객체로서의 특별한 의미가 없어졌다고 볼 수 있다.</li>
</ul>
<h3 id="1-2-wrapper-calss의-객체만들기">1-2. Wrapper Calss의 객체만들기</h3>
<ul>
<li>각각의 Wrapper 클래스의 객체는 자신과 대응되는 기본 자료형의 데이터를 파라미터로 전달받는다.</li>
</ul>
<pre><code class="language-java">int num = 1;
Integer wrapper = new Integer(num);</code></pre>
<h3 id="1-3-wrapper-class의-형변환">1-3. Wrapper Class의 형변환</h3>
<ul>
<li>기본 자료형과 Wrapper 클래스 간에는 서로 암묵적 형변환이 가능하다.</li>
</ul>
<pre><code class="language-java">int num = 100;
Integer wrapper = num;
-----------------------------------------
Integer wrapper2 = new Integer(200);
int num = wrapper2;</code></pre>
<h3 id="1-4-wrapper-class의-static-데이터">1-4. Wrapper Class의 static 데이터</h3>
<ul>
<li>모든 Wrapper Class는 static 데이터 형태로 Wrapper Class에 대응되는 자료형에 대한 최솟값과 최댓값을 가지고 있다.</li>
</ul>
<pre><code class="language-java">int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;</code></pre>
<h3 id="1-5-문자열-데이터의-형변환">1-5. 문자열 데이터의 형변환</h3>
<ul>
<li>1과 &quot;1&quot;의 차이
-&gt; 기본 자료형과 문자열 데이터 간의 연산에서는 기본 자료형 데이터가 문자열로 변환된 후, 문자열 간의 연산으로 처리된다.</li>
</ul>
<pre><code class="language-java">int a = 1;
String b = &quot;1&quot;;
System.out.println(a+b); // &quot;11&quot;이 출력됨</code></pre>
<ul>
<li>사용자 입력값에 대한 연산
-&gt; 모든 프로그램 플랫폼에서 사용자의 입력값은 String으로 처리된다.
-&gt; 만약, 인터넷 뱅킹에서 2개의 계좌로 송금할 금액을 각각 입력하였을 때, 총 금액을 계산한다면 다음과 같이 처리될 것이다.</li>
</ul>
<pre><code class="language-java">String money1 = &quot;5000&quot;;
String money2 = &quot;3000&quot;;

String total = money1 + money2; // 50003000 출력</code></pre>
<ul>
<li>문자열 데이터를 기본 데이터형으로 변환하기
-&gt; Wrapper Class에는 기본 자료형의 모양을 띄고 있는 문자열 데이터를 실제 기본 자료형으로 변환시키는 기능이 포함되어 있다.
-&gt; Java에서 Wrapper Class의 가장 큰 의미는 바로 이 부분이라고 할 수 있다.</li>
</ul>
<pre><code class="language-java">String money1 = &quot;5000&quot;;
String money2 = &quot;3000&quot;;

int m1 = Integer.parseInt(money1);
int m2 = Integer.parseInt(money2);

System.out.println(m1 + m2); // 8000 출력</code></pre>
<h2 id="2-math-class">2. Math Class</h2>
<h3 id="2-1-수학적인-연산을-지원하는-클래스">2-1. 수학적인 연산을 지원하는 클래스</h3>
<ul>
<li>Math Class는 흔히 계산을 하는데 도움이 되는 많은 수의 기본적인 수학 함수들을 제공한다.</li>
<li>Math Class는 java 표준 라이브러리의 java.lang 패키지에 정의되어 있다.</li>
<li>Math Class의 모든 메서드들은 static 메서드로, 클래스의 객체를 생성하지 않고 그 메서드가 정의된 클래스 이름을 통해서 호출될 수 있다.</li>
</ul>
<h2 id="3-string-class">3. String Class</h2>
<ul>
<li>문자열에서 정보를 추출하기 위한 String Class의 기본 기능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - 패키지]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-%ED%8C%A8%ED%82%A4%EC%A7%80</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-%ED%8C%A8%ED%82%A4%EC%A7%80</guid>
            <pubDate>Thu, 08 Dec 2022 08:35:54 GMT</pubDate>
            <description><![CDATA[<h2 id="1-패키지-package">1. 패키지 (Package)</h2>
<h3 id="1-1-java-package">1-1. Java Package</h3>
<ul>
<li>패키지 -&gt; 클래스에 대한 묶음 단위</li>
<li>클래스를 용도별이나, 기능별로 그룹화 한 것을 말한다. 소스코드는 폴더로 분류된 형태로 존재하게 된다.</li>
<li>서로 다른 패키지에 속해 있다면 다른 클래스와 이름이 동일하더라도 충돌이 발생하지 않는다. (서로 다른 폴더에는 이름이 같은 파일들이 존재할 수 있다.)</li>
</ul>
<h3 id="1-2-패키지-추가하기">1-2. 패키지 추가하기</h3>
<ul>
<li>패키지 이름의 일반적인 정의 형식
-&gt; 회사 도메인 이름의 역순, 프로젝트 이름의 소문자
-&gt; com.koreait.shop.user
-&gt;com.koreait.shop.article</li>
</ul>
<h3 id="1-3-패키지">1-3. 패키지</h3>
<ul>
<li>패키지에 소속된 클래스 파일은 첫 번째 라인에서 자신이 소속된 클래스 패키지 이름을 선언해야 한다.</li>
<li>이클립스가 왼쪽의 트리 영역에서 소스를 분류하는 작업을 통해 구문을 자동으로 추가해 주지만, 간혹 처리되지 않을 때도 있으므로 package 구문에서 에러가 발생할 경우 소스가 어떤 패키지에 있는지 확인하여 직접 이 구문을 수정해 주어야 한다.</li>
</ul>
<h2 id="2-classpath">2. ClassPath</h2>
<ul>
<li>컴파일이 완료된 *.class 파일들이 위치하는 경로</li>
</ul>
<h2 id="3-라이브러리">3. 라이브러리</h2>
<ul>
<li>한개 이상의 패키지들을 배포하기 용이하도록 압축한 형태</li>
<li>다른 프로그램에서 라이브러리 안에 포함된 기능을 활용할 수 있다.</li>
<li>*.jar</li>
</ul>
<h2 id="4-java-기본-api들">4. JAVA 기본 API들</h2>
<ul>
<li>우리가 사용하는 JDK안에는 이미 수많은 라이브러리가 포함되어 있고, 이 라이브러리 안에는 프로그램 개발에 필요한 패키지들이 기본적으로 포함되어 있다.</li>
<li>자바 프로그래밍은 이러한 라이브러리들의 기능을 활용하여 이루어진다.</li>
<li>이렇게 프로그램 개발을 위하여 기본적으로 제공되는 기능들을 API라 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA - 디자인 패턴]]></title>
            <link>https://velog.io/@jack_whiteblack/JAVA-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@jack_whiteblack/JAVA-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Thu, 08 Dec 2022 08:11:22 GMT</pubDate>
            <description><![CDATA[<h2 id="1-디자인-패턴-design-pattern">1. 디자인 패턴 (Design Pattern)</h2>
<h3 id="1-1-디자인-패턴이란">1-1. 디자인 패턴이란?</h3>
<ul>
<li>디자인 패턴이란 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 풀어나갈 것인가에 대한 일종의 솔루션 같은 것이다.</li>
<li>디자인 패턴은 설계자들이 &quot;올바른&quot; 설계를 &quot;빨리&quot; 만들 수 있도록 도와준다.</li>
</ul>
<h3 id="1-2-singleton-패턴">1-2. SingleTon 패턴</h3>
<ul>
<li>프로그램 내의 여러 곳에서 반복적으로 사용되어야 하는 객체에 대해 전역적인 범위를 갖도록 객체를 생성하고, 이 객체를 여러 곳에서 공유하기 위한 클래스 작성 패턴</li>
<li>이러한 패턴을 통해 생성된 객체를 싱글톤 객체라고 한다.</li>
</ul>
<h3 id="1-3-singleton-객체의-이점">1-3. SingleTon 객체의 이점</h3>
<ul>
<li>프로그램의 전역에서 활용할 재료로 사용되는 공유 기능을 하나만 생성하여 여러 곳에서 재사용합으로서 메모리를 효육적으로 사용할 수 있다.</li>
<li>단 한번만 객체를 생성하면 다시 객체를 생성할 필요가 없기 때문에, 해당 기능을 사용할 때마다 객체를 일일이 생성해야 하는 번거로움을 피할 수 있다.</li>
</ul>
<h3 id="1-4-공통-기능을-포함할-클래스-안에서-스스로의-객체를-static으로-선언">1-4. 공통 기능을 포함할 클래스 안에서 스스로의 객체를 static으로 선언</h3>
<ul>
<li>static이 적용된 자원은 메모리의 고정영역에 생성되기 때문에, 클래스 자체의 객체나 그 안에 포함된 멤버변수, 메서드와는 메모리 상에서 구별된다고 볼 수 있다.</li>
<li>그러므로 Calc 클래스 안에 static 형태로 Calc 클래스의 객체를 정의하더라도 코드상의 논리적인 연관 관계를 위해 하나의 파일에서 정의하는 것일 뿐, 실제로는 Calc 클래스 자체에서 독립된 객체가 되는 것이다.</li>
</ul>
<pre><code class="language-java">public class Calc {
    static Calc current;
}</code></pre>
<ul>
<li>Calc 클래스 이외의 여러 곳에서 new 연산자를 사용하여 객체 할당이 가능하다면 SingleTon이라는 개념 자체가 성립되지 않으므로, 외부에서 이 객체에 직접적인 접근을 못하도록 은닉시킨다.</li>
</ul>
<pre><code class="language-java">public class Calc {
    private static Calc current;
}</code></pre>
<h3 id="1-5-은닉된-객체를-할당하거나-메모리에서-삭제하는-기능-추가">1-5. 은닉된 객체를 할당하거나 메모리에서 삭제하는 기능 추가</h3>
<ul>
<li>current 객체를 private로 지정하였기 때문에 객체를 메모리에 간접적으로 할당하고 삭제하기 위한 메서드가 필요하다.</li>
<li>객체를 메모리에서 제어하기 위해서는 null을 사용한다.</li>
</ul>
<pre><code class="language-java">public class Calc {
    private static Calc current; // &lt;- private static Calc current = new Calc(); (객체 선언)

    // 객체 할당처리
    // 객체가 할당되지 않은 경우에만 할당하도록 하여 중복 할당을 방지한다.
    public static Calc getInstance() {
        if(current == null) {
            current = new Calc();
        }
        return current;
    }
    // 객체에 null을 대입하면 메모리에서 삭제된다.
    public static void freeInstance() {
        current = null;
    }
}</code></pre>
<h3 id="1-6-new-연산자를-사용한-객체-할당-금지하기">1-6. new 연산자를 사용한 객체 할당 금지하기</h3>
<ul>
<li>기본 생성자를 private 형태로 정의하면 객체 생성자가 은닉 처리되어 외부에서 new 연산자를 사용한 객체 할당이 금지된다.</li>
</ul>
<pre><code class="language-java">public class Calc {
    private static Clac current;

    // 객체 할당 처리
    // 객체가 할당되지 않은 경우에만 할당하도록 하여 중복 할당을 방지한다.
    public static Calc getInstance() {
        if(current == null){
            current = new Calc();
        }
        return current;
    }

    // 객체에 null을 대입하면 메모리에서 삭제된다.
    public static void freeInstance() {
        current = null;
    }

    private Calc() {
        super();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - 들어가기 전 (2)]]></title>
            <link>https://velog.io/@jack_whiteblack/React-%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%A0%84-2</link>
            <guid>https://velog.io/@jack_whiteblack/React-%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%A0%84-2</guid>
            <pubDate>Mon, 05 Dec 2022 17:58:00 GMT</pubDate>
            <description><![CDATA[<h2 id="1-javascript-ecmascript">1. JavaScript (ECMAScript)</h2>
<ul>
<li>웹페이지에 생명을 불어넣는 역할을 함 (동적인 부분 담당)</li>
<li>스크립트 언어의 종류<ul>
<li>프로그램이 시작되는 런타임 언어가 해석되고 실행이 가능</li>
</ul>
</li>
<li>표준 버전 : ES5, ES6(ECMAScript2015, ES2015)</li>
</ul>
<h3 id="1-1-javascript의-문법-es6-기준">1-1. JavaScript의 문법 (ES6 기준)</h3>
<ul>
<li>자료형 (Data Type) : 데이터를 다루기위해 미리 정해놓은 데이터의 유형<ul>
<li>보통 변수를 선언하는 시점에 해당 변수의 자료형이 결정되지만 JS에서는 변수를 선언할 때가 아닌 변수의 데이터가 개입되는 시점에 해당 변수의 자료형이 결정된다.</li>
</ul>
</li>
<li>동적 타이핑 (Dynamic Typing) : 동적으로 자료형이 결정되는 것<ul>
<li>JS에서 사용</li>
<li>변수를 선언할 때 변수의 자료형을 쓰지않고 var나 let을 사용
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/2e4df5f1-6d6b-4e91-9483-be87a70e1915/image.png" alt=""><ul>
<li>배열을 사용하는 예제와 인덱스를 이용해서 배열의 변수에 접근하는 예제
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/12824154-b0e3-45f9-a42b-4f794dbea62b/image.png" alt=""></li>
<li>object type : 객체를 다루기위한 자료형</li>
<li><blockquote>
<p>JS에서의 객체는 key와 value로 이루어진 쌍의 집합을 의미
(key는 문자열 value는 어떤 자료형이든 다 가능)
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/33000eeb-4d4b-4e77-a005-32bc436cec8e/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="1-2-연산자-operator">1-2. 연산자 (Operator)</h3>
<ul>
<li><p>대입 연산자 (Assignment Operator)</p>
<ul>
<li>대입 연산자는 항상 오른쪽에서 왼쪽 방향을 흐름이 흘러감!
-&gt; 오른쪽에 있는 값을 왼쪽에 대입시킨다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/8213b6bd-62ed-497c-987f-e4869c040116/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/b27aacb8-dad2-4a21-a143-4bb23be11f44/image.png" alt=""></li>
</ul>
</li>
<li><p>사칙 연산자</p>
</li>
<li><p>, -, <em>, /(나눗셈 몫), %(나눗셈 나머지), *</em>(지수 연산자)</p>
</li>
<li><blockquote>
<p>산술 연산자 (Arithmetic Operators)
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/1a967bc9-28c7-4ba1-8bf9-f75d05743bf6/image.png" alt=""></p>
</blockquote>
</li>
<li><p>대입 + 산술
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/dadb0e0e-e52c-4b28-bbf5-ada0b9f14db8/image.png" alt=""></p>
</li>
<li><p>증가 연산자(++), 감소 연산자(--)</p>
<ul>
<li><p>postfix 방식 : a++
-&gt; 먼저 증감 전의 값을 반환하고 이후에 변수의 값이 증감된다.</p>
</li>
<li><p>prefix 방식 : ++a
-&gt; 먼저 변수의 값을 증감시키고 이후에 증감된 변수의 값을 반환한다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/37f821e4-8fb8-496c-be58-7ae29f5e4148/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>유의점 : 꼭 연산자를 변수에 붙여야하는 순서에 유의</p>
</blockquote>
<ul>
<li><p>관계 연산자 (Relational Operators) = 비교 연산자 (Comparison Operators)
: 변수들 사이의 관계를 비교하기 위해 사용 (변수들의 값 비교)</p>
<ul>
<li>&lt;, &gt;, &lt;=, &gt;= -&gt; 왼쪽에 나온 변수를 기준으로 생각하기
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/9b12e789-2099-4eeb-bb29-d340604455d4/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/9e98bfd0-4dfc-4878-b18c-002dc2d1577e/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/96bf2e28-8160-409a-9a85-30b328b47e8d/image.png" alt=""></li>
</ul>
</li>
</ul>
<br>

<ul>
<li>동등 연산자 (Equality Operators) : 변수의 값이 같은지 다른지를 판단할 때 사용<img src="https://velog.velcdn.com/images/jack_whiteblack/post/8dcc773c-a35c-4b92-baf8-726d6d907d11/image.png" alt=""></li>
</ul>
<br>

<ul>
<li>일치 연산자 (Strict Equality Operators) : JS에서는 변수의 자료형까지도 같은지에 대해 엄격하게 동일한지 확인할 때 사용<img src="https://velog.velcdn.com/images/jack_whiteblack/post/6909ce19-a24e-4e03-bea9-c424bd5545dd/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/896e672f-143f-4cf9-9821-5fe3f8b32366/image.png" alt=""></p>
<br>

<ul>
<li>이진 논리 연산자 (Binary Logical Operators) : true와 false 값만을 갖는 boolean 값을 비교할 때 사용 <img src="https://velog.velcdn.com/images/jack_whiteblack/post/ee48792f-c279-41cd-b3d2-6dabad2f1414/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/8a5ec281-d0d7-4ca1-9678-f9fbd67b8925/image.png" alt=""></li>
</ul>
<br>

<ul>
<li>조건부 연산자 (Conditional Operator) : 조건에 따라서 결과가 두개로 나뉘어지게 됨 -&gt; 삼항 연산자 (Ternary Operator)
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/092a03ef-fcc4-4e12-aca7-322aad4227d5/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/cab0de8f-4f88-4b3e-8a7e-de668a452187/image.png" alt=""></li>
</ul>
<br>

<h3 id="1-3-javascript의-함수">1-3. JavaScript의 함수</h3>
<ul>
<li>함수 : 입력을 받아서 정해진 출력을 하는 것<ul>
<li>함수의 입력을 파라미터(parameters) 또는 인자(arguments)라고 한다.
<img src="https://velog.velcdn.com/images/jack_whiteblack/post/eceed78c-3c2d-4116-afcd-845a0324204f/image.png" alt=""></li>
</ul>
</li>
</ul>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li>학습 자료 및 그림 출처<blockquote>
<p>Inflearn - 처음 만난 리액트 (React) : Inje Lee(소플)</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - 들어가기 전 (1)]]></title>
            <link>https://velog.io/@jack_whiteblack/React-%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%A0%84</link>
            <guid>https://velog.io/@jack_whiteblack/React-%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%A0%84</guid>
            <pubDate>Mon, 05 Dec 2022 16:03:18 GMT</pubDate>
            <description><![CDATA[<h2 id="1-html-hyper-text-markup-langage">1. HTML (Hyper Text Markup Langage)</h2>
<p>: 웹사이트이 뼈대를 구성하기 위해 사용하는 마크업 언어
-&gt; 보통 웹에서 주로 사용하였으나 웹 브라우저를 이용하여 데스크탑 용 앱을 만들 수 있는 기술에도 사용된다.</p>
<h3 id="1-1-tag-태그">1-1. Tag (태그)</h3>
<p>:웹사이트의 구조를 만들고 웹사이트에 들어갈 내용을 채운다.</p>
<ul>
<li>구성<pre><code class="language-html">&lt;html&gt; -&gt; 열기
&lt;/html&gt; -&gt; 닫기
</code></pre>
</li>
</ul>
<p><br/> -&gt; 열고 닫기를 한번에 할 수 있음</p>
<pre><code>- 웹사이트의 뼈대를 구성하는 태그들
```html
&lt;html&gt;
  &lt;head&gt; -&gt; 웹사이트 속성 (제목, 설명 등 : 메타데이터)
  &lt;/head&gt;
  &lt;body&gt; -&gt; 웹사이트에 보이는 컨텐츠
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/c3195797-f190-4cad-a0d8-f27a0d7ee194/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/ed0ab309-fcf4-4f68-88a8-fbcb86ad3f55/image.png" alt=""><img src="https://velog.velcdn.com/images/jack_whiteblack/post/58c3d11e-7c33-4687-8c28-d61988fc6e48/image.png" alt=""> -&gt; 웹사이트의 제목을 넣기위해 title 태그를 사용</p>
<h3 id="1-2-spa-single-page-application">1-2. SPA (Single Page Application)</h3>
<p>: 하나의 페이지만 존재하는 웹사이트</p>
<p><img src="https://velog.velcdn.com/images/jack_whiteblack/post/daf751fc-345b-46d7-a627-fc1f64636a5e/image.png" alt=""> -&gt; 멀티 페이지와 싱글 페이지</p>
<h2 id="2-css-cascading-style-sheets">2. CSS (Cascading Style Sheets)</h2>
<p>: 웹사이트에 레이아웃과 글꼴 그리고 색상 등과 같이 디자인을 입히는 역할을 하는 언어</p>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li>학습 자료 및 그림 출처<blockquote>
<p>Inflearn - 처음 만난 리액트 (React) : Inje Lee(소플)</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - 2022년 개정]]></title>
            <link>https://velog.io/@jack_whiteblack/React-2022%EB%85%84-%EA%B0%9C%EC%A0%95</link>
            <guid>https://velog.io/@jack_whiteblack/React-2022%EB%85%84-%EA%B0%9C%EC%A0%95</guid>
            <pubDate>Sat, 03 Dec 2022 03:23:32 GMT</pubDate>
            <description><![CDATA[<h2 id="1-설치">1. 설치</h2>
<ul>
<li><a href="https://nodejs.org/ko/">https://nodejs.org/ko/</a> 에 들어가서 node js를 설치해준다.</li>
<li><a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> 에 들어가서 vs code를 설치해준다.</li>
</ul>
<h2 id="2-수정">2. 수정</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 - 같은 숫자는 싫어]]></title>
            <link>https://velog.io/@jack_whiteblack/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4</link>
            <guid>https://velog.io/@jack_whiteblack/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4</guid>
            <pubDate>Sun, 20 Nov 2022 18:01:20 GMT</pubDate>
            <description><![CDATA[<h2 id="같은-숫자는-싫어">같은 숫자는 싫어</h2>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p><a href="https://devuna.tistory.com/22">[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시</a></p>
</li>
<li><p><a href="https://yongku.tistory.com/entry/%EC%9E%90%EB%B0%94Java-%EC%8A%A4%ED%83%9DStack-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EC%98%88%EC%A0%9C">자바(Java) 스택(Stack) 클래스 및 예제</a></p>
</li>
<li><p><a href="https://hbase.tistory.com/122">[Java] Stack(스택) 사용법 및 예제</a></p>
</li>
<li><p><a href="https://wakestand.tistory.com/88">프로그래머스 짝지어 제거하기(Java)</a></p>
</li>
<li><p><a href="https://limreus.tistory.com/79">[코테/JAVA] 연습문제 : 같은 숫자는 싫어</a></p>
</li>
<li><p><a href="https://velog.io/@tlsdmsgp33/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4-java">[프로그래머스] 같은 숫자는 싫어 java</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 - 올바른 괄호]]></title>
            <link>https://velog.io/@jack_whiteblack/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@jack_whiteblack/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8</guid>
            <pubDate>Sun, 20 Nov 2022 17:56:20 GMT</pubDate>
            <description><![CDATA[<h2 id="올바른-괄호">올바른 괄호</h2>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p><a href="https://devuna.tistory.com/22">[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시</a></p>
</li>
<li><p><a href="https://yongku.tistory.com/entry/%EC%9E%90%EB%B0%94Java-%EC%8A%A4%ED%83%9DStack-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EC%98%88%EC%A0%9C">자바(Java) 스택(Stack) 클래스 및 예제</a></p>
</li>
<li><p><a href="https://hbase.tistory.com/122">[Java] Stack(스택) 사용법 및 예제</a></p>
</li>
<li><p><a href="https://wakestand.tistory.com/88">프로그래머스 짝지어 제거하기(Java)</a></p>
</li>
<li><p><a href="https://coding-factory.tistory.com/266">[Java] 삼항연산자 사용법 &amp; 예제</a></p>
</li>
<li><p><a href="https://hyojun.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8-Java">[프로그래머스] 올바른 괄호 - Java</a></p>
</li>
<li><p><a href="https://conanglog.tistory.com/229">[프로그래머스/java] 올바른 괄호 (stack 사용 유무)</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 4949번]]></title>
            <link>https://velog.io/@jack_whiteblack/%EB%B0%B1%EC%A4%80-4949%EB%B2%88</link>
            <guid>https://velog.io/@jack_whiteblack/%EB%B0%B1%EC%A4%80-4949%EB%B2%88</guid>
            <pubDate>Sat, 19 Nov 2022 17:38:30 GMT</pubDate>
            <description><![CDATA[<h2 id="균형잡힌-세상">균형잡힌 세상</h2>
<p>📌 문제
세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.</p>
<p>정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.</p>
<p>문자열에 포함되는 괄호는 소괄호(&quot;()&quot;) 와 대괄호(&quot;[]&quot;)로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.</p>
<p>모든 왼쪽 소괄호(&quot;(&quot;)는 오른쪽 소괄호(&quot;)&quot;)와만 짝을 이뤄야 한다.
모든 왼쪽 대괄호(&quot;[&quot;)는 오른쪽 대괄호(&quot;]&quot;)와만 짝을 이뤄야 한다.
모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.
정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.</p>
<hr>
<p>📌 입력
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호(&quot;( )&quot;) 대괄호(&quot;[ ]&quot;)등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(&quot;.&quot;)로 끝난다.</p>
<p>입력의 종료조건으로 맨 마지막에 점 하나(&quot;.&quot;)가 들어온다.</p>
<p>📌 출력
각 줄마다 해당 문자열이 균형을 이루고 있으면 &quot;yes&quot;를, 아니면 &quot;no&quot;를 출력한다.</p>
<hr>
<p>📌 예제 입력 1 
So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
A rope may form )( a trail in a maze.
Help( I[m being held prisoner in a fortune cookie factory)].
([ (([( [ ] ) ( ) (( ))] )) ]).
  .
.</p>
<p>📌 예제 출력 1 
yes
yes
no
no
no
yes
yes</p>
<hr>
<p>📌 힌트
7번째의 &quot; .&quot;와 같이 괄호가 하나도 없는 경우도 균형잡힌 문자열로 간주할 수 있다.</p>
<br>

<pre><code class="language-java">import java.util.Scanner;
import java.util.Stack;

public class Training_02 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        while(true) {
            String str = sc.nextLine();

            if(str.equals(&quot;.&quot;)) {
                break;
            } else {
                if(solution(str)) {
                    System.out.println(&quot;yes&quot;);
                } else {
                    System.out.println(&quot;no&quot;);
                }
            }
        }
    }

    public static boolean solution(String str) {
        boolean answer = true;

        Stack&lt;Character&gt; stack = new Stack&lt;&gt;();

            for(int i = 0; i &lt; str.length(); i++) {
                char c = str.charAt(i);

                if(c == &#39;(&#39; || c == &#39;[&#39;) {
                    stack.push(c);
                }

                if(c == &#39;)&#39;) {
                    if(stack.empty()) {
                        return false;
                    } else if(stack.peek() != &#39;(&#39;) {
                        return false;
                    } else {
                        stack.pop();
                    } 
                }

                if(c == &#39;]&#39;) {
                    if(stack.empty()) {
                        return false;
                    } else if(stack.peek() != &#39;[&#39;) {
                        return false;
                    } else {
                        stack.pop();
                    }
                }

                if(!stack.empty()) {
                    answer = false;
                } else {
                    answer = true;
                }
            }
        return answer;
    }
}</code></pre>
<ul>
<li>stack을 활용하여 풀었다.</li>
</ul>
<hr>
<h2 id="📚-reference">📚 Reference</h2>
<ul>
<li><p><a href="https://devuna.tistory.com/22">[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시</a></p>
</li>
<li><p><a href="https://yongku.tistory.com/entry/%EC%9E%90%EB%B0%94Java-%EC%8A%A4%ED%83%9DStack-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EC%98%88%EC%A0%9C">자바(Java) 스택(Stack) 클래스 및 예제</a></p>
</li>
<li><p><a href="https://hbase.tistory.com/122">[Java] Stack(스택) 사용법 및 예제</a></p>
</li>
<li><p><a href="https://wakestand.tistory.com/88">프로그래머스 짝지어 제거하기(Java)</a></p>
</li>
<li><p><a href="https://1-7171771.tistory.com/34">백준 4949번 균형잡힌 세상 java</a></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>