<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>iooi_alice.log</title>
        <link>https://velog.io/</link>
        <description>UIUX/Frontend</description>
        <lastBuildDate>Wed, 24 Jan 2024 08:28:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>iooi_alice.log</title>
            <url>https://velog.velcdn.com/images/iooi_alice/profile/2fa22719-07b6-4d4c-a22b-aa644e107d13/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. iooi_alice.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/iooi_alice" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[2024-01-24]]></title>
            <link>https://velog.io/@iooi_alice/%EA%B3%B5%EB%B0%B0%EC%88%98-js</link>
            <guid>https://velog.io/@iooi_alice/%EA%B3%B5%EB%B0%B0%EC%88%98-js</guid>
            <pubDate>Wed, 24 Jan 2024 08:28:59 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-프로그래머스---공배수">문제) 프로그래머스 - 공배수</h1>
<h2 id="📌-문제-설명">📌 문제 설명</h2>
<blockquote>
<p>정수 number와 n, m이 주어집니다. number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 return하도록 solution 함수를 완성해주세요.</p>
</blockquote>
<h2 id="📌-제한사항">📌 제한사항</h2>
<blockquote>
<p>10 ≤ number ≤ 100
2 ≤ n, m &lt; 10</p>
</blockquote>
<h3 id="--내-풀이">- 내 풀이</h3>
<pre><code class="language-js">function solution(number, n, m) {
  return number % n === 0 &amp;&amp; number % m === 0 ? 1 : 0
}</code></pre>
<h3 id="--다른-사람-풀이">- 다른 사람 풀이</h3>
<pre><code class="language-js">function solution(number, n, m) {
  return +!(number % n || number % m);
}</code></pre>
<hr>

<h1 id="문제-프로그래머스---대문자로-바꾸기">문제) 프로그래머스 - 대문자로 바꾸기</h1>
<h2 id="📌-문제-설명-1">📌 문제 설명</h2>
<blockquote>
<p>알파벳으로 이루어진 문자열 myString이 주어집니다. 모든 알파벳을 대문자로 변환하여 return 하는 solution 함수를 완성해 주세요.</p>
</blockquote>
<h2 id="📌-제한사항-1">📌 제한사항</h2>
<blockquote>
<p>1 ≤ myString의 길이 ≤ 100,000
myString은 알파벳으로 이루어진 문자열입니다.</p>
</blockquote>
<h3 id="--내-풀이-1">- 내 풀이</h3>
<pre><code class="language-js">const solution = (myString) =&gt; myString.toUpperCase()</code></pre>
<hr>

<h1 id="문제-프로그래머스---문자열-곱하기">문제) 프로그래머스 - 문자열 곱하기</h1>
<h2 id="📌-문제-설명-2">📌 문제 설명</h2>
<blockquote>
<p>문자열 my_string과 정수 k가 주어질 때, my_string을 k번 반복한 문자열을 return 하는 solution 함수를 작성해 주세요.</p>
</blockquote>
<h2 id="📌-제한사항-2">📌 제한사항</h2>
<blockquote>
<p>1 ≤ my_string의 길이 ≤ 100
my_string은 영소문자로만 이루어져 있습니다.
1 ≤ k ≤ 100</p>
</blockquote>
<h3 id="--내-풀이-2">- 내 풀이</h3>
<pre><code class="language-js">function solution(my_string, k) {
    let str = &#39;&#39;

    for(let i = 0; i &lt; k; i++){
        str += my_string
    }

    return str;
}</code></pre>
<h3 id="--다른-사람-풀이-1">- 다른 사람 풀이</h3>
<pre><code class="language-js">function solution(my_string, k) {
    return my_string.repeat(k)
}</code></pre>
<hr>

<h1 id="문제-프로그래머스---문자열로-변환">문제) 프로그래머스 - 문자열로 변환</h1>
<h2 id="📌-문제-설명-3">📌 문제 설명</h2>
<blockquote>
<p>정수 n이 주어질 때, n을 문자열로 변환하여 return하도록 solution 함수를 완성해주세요.</p>
</blockquote>
<h2 id="📌-제한사항-3">📌 제한사항</h2>
<blockquote>
<p>1 ≤ n ≤ 10000</p>
</blockquote>
<h3 id="--내-풀이-3">- 내 풀이</h3>
<pre><code class="language-js">function solution(n) {
    var answer = n.toString();
    return answer;
}</code></pre>
<h3 id="--다른-사람-풀이-2">- 다른 사람 풀이</h3>
<pre><code class="language-js">const solution = String</code></pre>
<pre><code class="language-js">function solution(n) {
    return n+&quot;&quot;;
}</code></pre>
<hr>

<h1 id="문제-프로그래머스---두-수의-연산값-비교하기">문제) 프로그래머스 - 두 수의 연산값 비교하기</h1>
<h2 id="📌-문제-설명-4">📌 문제 설명</h2>
<blockquote>
<p>연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.
<br>
12 ⊕ 3 = 123
3 ⊕ 12 = 312
양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 * a * b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요.
<br>
단, a ⊕ b와 2 * a * b가 같으면 a ⊕ b를 return 합니다.</p>
</blockquote>
<h2 id="📌-제한사항-4">📌 제한사항</h2>
<blockquote>
<p>1 ≤ a, b &lt; 10,000</p>
</blockquote>
<h3 id="--내-풀이-4">- 내 풀이</h3>
<pre><code class="language-js">function solution(a, b) {
    let sum = String(a) + String(b)
    let answer = Math.max(Number(sum), 2*a*b)
    return answer;
}</code></pre>
<h3 id="--다른-사람-풀이-3">- 다른 사람 풀이</h3>
<pre><code class="language-js">function solution(a, b) {
    let num1 = parseInt(a+&quot;&quot;+b+&quot;&quot;);
    let num2 = 2*a*b;
    return num1 &gt; num2 ? num1 : num2;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[API 라우팅]]></title>
            <link>https://velog.io/@iooi_alice/API-%EB%9D%BC%EC%9A%B0%ED%8C%85</link>
            <guid>https://velog.io/@iooi_alice/API-%EB%9D%BC%EC%9A%B0%ED%8C%85</guid>
            <pubDate>Fri, 12 Jan 2024 16:10:19 GMT</pubDate>
            <description><![CDATA[<h2 id="api-라우팅">API 라우팅</h2>
<p>1️⃣ API 라우트 만들기
2️⃣ 리퀘스트 다루기
3️⃣ 리스폰스 다루기
4️⃣ 실습</p>
<hr>

<h1 id="1️⃣-api-라우트-만들기">1️⃣ API 라우트 만들기</h1>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/3735037a-2219-4e81-832b-988f08cc9674/image.png" alt=""></p>
<ul>
<li>pages &gt; api 폴더 생성 &gt; short-links 파일생성
<code>api</code> 폴더명은 규칙이기 때문에 다른 이름으로 변경할 수 없음
endpoint: /api/short-links</li>
</ul>
<p>📝 short-links.js</p>
<pre><code class="language-js">export default function handler(req, res) {
  res.send(&#39;안녕 API!&#39;);
}</code></pre>
<p>📝 request.http</p>
<pre><code>GET http://localhost:3000/api/short-links</code></pre><p><img src="https://velog.velcdn.com/images/iooi_alice/post/c2b0da66-c731-42d3-ab31-b9409e46d205/image.png" alt=""></p>
<p>상단에 떠 있는 Send Request 클릭</p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/a4303923-b80f-4154-b268-43c1a58986d8/image.png" alt=""></p>
<hr>

<h1 id="2️⃣-리퀘스트-다루기">2️⃣ 리퀘스트 다루기</h1>
<h2 id="--리퀘스트-객체">- 리퀘스트 객체</h2>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/69fcda60-b8f5-45fb-90dc-a2f3966d03a4/image.png" alt=""></p>
<blockquote>
<p>req.cookies: session-id
req.method: 요청 매서드를 대문자로 보여줌 (GET/ POST)
req.body: 바디 내용
req.query: 쿼리스트링 ( ?q=&#39;여기에 들어오는 값&#39;)
req.id: 페이지 넘버</p>
</blockquote>
<p>🍪 쿠키란?
간단한 사용자 정보를 저장하거나 로그인하고 나서 인증정보를 브라우저에 저장한 뒤 request할 때마다 보내 줄 때 활용한다.</p>
<p>📝 [id].js</p>
<pre><code class="language-js">export default function handler(req, res) {
  res.send(req.method); // GET, POST 대문자로 찍힘
  //   res.send(req.cookies);
  //   쿠키란? 쿠키에는 간단한 사용자 정보를 저장 or 로인하고 나서 인증정보를 브라우저에 저장 한 뒤 request 할때마다 보내 줄 때 활용 함

  //   res.send(req.body);

  //   res.send(req.query);  // 쿼리스트링 ?q=&#39;여기에 들어오는 값&#39;

  //   res.send(req.id);  // 페이지 넘버
}</code></pre>
<p>📝 request.http</p>
<pre><code>GET http://localhost:3000/api/short-links/123?q=codeit

###

GET http://localhost:3000/api/short-links/123

###

POST  http://localhost:3000/api/short-links/123
Content-Type: application/json

{
    &quot;title&quot;: &quot;codeit&quot;
}

###

Get http://localhost:3000/api/short-links/123
Cookie: session-id=codeit1234</code></pre><hr>

<h1 id="3️⃣-리스폰스-다루기">3️⃣ 리스폰스 다루기</h1>
<h2 id="--리스폰스-객체">- 리스폰스 객체</h2>
<blockquote>
<p>함수 체이닝 방식으로 사용하기 때문에, res.status(201).send()처럼 함수를 이어서 사용할 수 있습니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/18bea2ca-1356-4a53-bdaf-64e0e226e31f/image.png" alt=""></p>
<p>📝 index.js</p>
<pre><code class="language-js">export default function qrcodes(req, res) {
  switch (req.method) {
    case &#39;POST&#39;:
      res.status(201).send({
        title: &#39;위키피디아 Next.js&#39;,
        url: &#39;https://en.wikipedia.org/wiki/Next.js&#39;,
      });
    case &#39;GET&#39;:
      res.send([
        {
          id: &#39;abc&#39;,
          title: &#39;위키피디아 Next.js&#39;,
          url: &#39;https://en.wikipedia.org/wiki/Next.js&#39;,
        },
        {
          id: &#39;def&#39;,
          title: &#39;코드잇 자유게시판&#39;,
          url: &#39;https://codeit.kr/community/general&#39;,
        },
        {
          id: &#39;ghi&#39;,
          title: &#39;코드잇 질문답변&#39;,
          url: &#39;https://www.codeit.kr/community/questions&#39;,
        },
      ]);
      break;

    default:
      res.status(404).send();
  }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Next.js 시작하기]]></title>
            <link>https://velog.io/@iooi_alice/Next.js-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@iooi_alice/Next.js-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 03 Jan 2024 17:41:32 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-react">📌 React</h1>
<h3 id="클라이언트사이드-렌더링">클라이언트사이드 렌더링</h3>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/73425dcd-9960-41bd-bffa-8623bbfac227/image.png" alt=""></p>
<p>🚧 문제점</p>
<ul>
<li>텅 빈 화면을 먼저 띄운다(빈 html을 먼저 읽음) -&gt; js 전부 로딩 -&gt; react 동작 -&gt; 제대로 된 화면을 보여준다.</li>
<li>초기 로딩이 느리다.</li>
<li>검색 엔진에 제공할 수 있는 정보가 적다. SEO에 취약함</li>
</ul>
<p>✅ 프리렌더링 해놓음 (미리 만들어서 전달)
BUT, 이렇게 되면 서버가 필요하다.(프리렌더링은 서버에서 렌더링하기 위함임)
이러한 문제를 해결해 줄 수 있는 프레임워크 등장! 👉 Next.js 🥳</p>
<h1 id="📌-nextjs">📌 Next.js</h1>
<h3 id="서버사이드-렌더링">서버사이드 렌더링</h3>
<ul>
<li><p>프리렌더링
웹페이지 로딩 이전에 하는 렌더링
👉 정적 생성 (<code>빌드</code> 할 때 <code>html을 미리</code> 만들어 놓는 것)
👉 export, getStaticProps 네이밍은 정해진 규칙임!</p>
<pre><code class="language-jsx">export async function getStaticProps() {
const res = await axios.get(&#39;/products&#39;);
const products = res.data.results;

return {
  props: {
    products,
}
}
</code></pre>
</li>
</ul>
<p>export default function Home({ products }) {
  //... 생략
}</p>
<pre><code></code></pre><p>npm run build</p>
<pre><code>
👉 서버사이드 렌더링 (GET요철할 때 보내줌)
  - 장점
    초기 로딩이 빨라진다
    검색엔진 최적화가 된다
- Vercel 서버 호스팅
- 파일 시스템 기반 라우팅(편하게 개발 가능)



&lt;hr&gt;

# 🔨 Next.js 설치하기</code></pre><p>npx create-next-app .</p>
<pre><code>`.`: 현재 폴더에서 next.js 다운로드

&gt;조마조마하게 지켜봤는데 역시나 `Error발생`..
맥북은 역시나 멀쩡하게 지나가는 일이 없다😭
심지어 에러난줄도 모르고 `npm run dev` 입력 함

![](https://velog.velcdn.com/images/iooi_alice/post/e0cab226-5691-43c6-b30f-e502ce6f6d8a/image.png)

&gt;Error: Your cache folder contains root-owned files, due to a bug in npm ERR! previous versions of npm which has since been addressed.

번역기: 캐시 폴더에 버그로 인해 루트 소유 파일이 포함되어 있습니다.
npm 오류입니다! 이후 해결된 이전 버전의 npm입니다.

&gt;please run:
npm ERR!   sudo chown -R 501:20 &quot;/Users/heeeee_soo/.npm&quot;

please를 믿어보기로 하고 아래와 같이 복붙했더니 에러가 해결됐다!!</code></pre><p>sudo chown -R 501:20 &quot;/Users/heeeee_soo/.npm&quot;</p>
<pre><code>
한 숨 돌리고 다시 설치하려니까 이미 파일이 만들어진게 있어서 충돌난다는 메시지가 나타났다.

이전에 설치된 파일들 전체 삭제하고 다시 아래와 같이 next 설치 명령어 실행 후 성공했다! </code></pre><p>npx create-next-app .</p>
<pre><code>&lt;hr&gt;

# 🎨 CSS 적용하기
### css module 적용하기
1️⃣ Home.module.css 파일 생성

2️⃣ 사용하는 page의 상단에 import
```jsx
import styles from &#39;../styles/Home.module.css&#39;

export default function Home() {
  return (
    &lt;h1 className={styles.title}&gt;
     안녕? Next.js! 후후~
    &lt;/h1&gt;
  )
}</code></pre><p>3️⃣ 웹 전체에 css 파일 적용</p>
<pre><code class="language-jsx">// app.js

import &#39;../styles/global.css&#39;

export default function App({ Component, pageProps }) {
  return &lt;Component {...pageProps} /&gt;
}</code></pre>
<p>모듈이 아닌 전체 적용이기 때문에 styles를 붙이지 않고 import하면 됨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴파일러 옵션 설정하기]]></title>
            <link>https://velog.io/@iooi_alice/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-%EC%98%B5%EC%85%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@iooi_alice/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-%EC%98%B5%EC%85%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 01 Jan 2024 16:16:58 GMT</pubDate>
            <description><![CDATA[<h1 id="컴파일러-옵션-자동-생성하기">컴파일러 옵션 자동 생성하기</h1>
<p>tsconfig.json 파일 생성</p>
<pre><code>tsc --init</code></pre><pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;ESNext&quot;, // ES5:화살표 함수 없음(옛날버전), ESNext:최신버전
    &quot;module&quot;: &quot;ESNext&quot;, // CommonJS, ESNext
    &quot;outDir&quot;: &quot;dist&quot;, // 컴파일 된 자바스크립트 파일이 위치할 곳
    &quot;strict&quot;: true, // 타입 검사를 얼마나 엄격하게 할건지(true, false)
    &quot;moduleDetection&quot;: &quot;force&quot; // 전역 모듈을 개별 모듈로 변경해 줌(export{})
  },
  &quot;include&quot;: [&quot;src&quot;] //src 모든 ts 파일 컴파일링해 줌
}</code></pre>
<hr>

<p>출처 | <a href="https://www.inflearn.com/course/lecture?courseSlug=%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8&amp;unitId=154362&amp;tab=curriculum">https://www.inflearn.com/course/lecture?courseSlug=%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8&amp;unitId=154362&amp;tab=curriculum</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Hello TS World]]></title>
            <link>https://velog.io/@iooi_alice/Hello-TS-World</link>
            <guid>https://velog.io/@iooi_alice/Hello-TS-World</guid>
            <pubDate>Sat, 30 Dec 2023 16:15:15 GMT</pubDate>
            <description><![CDATA[<h1 id="1️⃣-nodejs-패키지-초기화">1️⃣ node.js 패키지 초기화</h1>
<pre><code>&gt; npm init</code></pre><p>👉 모든 옵션을 default로 enter 눌러서 진행한다</p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/6c1bc38d-ef36-4c00-8c20-88df4e2cfd83/image.png" alt=""></p>
<p>👉 package.json 파일 생성!</p>
<h1 id="2️⃣-typesnode">2️⃣ types/node</h1>
<p>node.js가 제공하는 기본 기능들에 대해 미리 지정된 타입의 파일 제공</p>
<pre><code>&gt; npm i @types/node</code></pre><p><img src="https://velog.velcdn.com/images/iooi_alice/post/52c9176e-ad46-48ba-a4a7-bf54170b4972/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/6aed0d6e-9355-4299-b015-60acda9375b3/image.png" alt=""></p>
<h1 id="3️⃣-컴파일러-설치">3️⃣ 컴파일러 설치</h1>
<h2 id="✨-tsc로-컴파일하고-실행하기">✨ tsc로 컴파일하고 실행하기</h2>
<blockquote>
<p><code>tsc 파일명</code> 은 특정 파일을 컴파일 하도록 타입스크립트 컴파일러에게 지시하는 명령어입니다.
위 명령어를 입력하면 src/index.ts 파일을 타입스크립트 컴파일러가 <code>컴파일</code> 합니다.
컴파일이 완료되면 <code>자바스크립트</code> 파일 <code>src/index.js</code> 이 생성됩니다.</p>
</blockquote>
<pre><code>&gt; sudo npm install typescript -g</code></pre><p><code>-g</code> : global 설치, 컴퓨터 모든 곳에서 패키지 사용 가능 (한 번 설치하면 다른 프로젝트 시 따로 설치 안 해도 됨!)</p>
<pre><code>&gt; tsc -v
Version 5.1.6</code></pre><pre><code>&gt; tsc src/index.ts</code></pre><blockquote>
<p>컴파일 된 자바스크립트 코드는 node를 이용해 실행합니다.</p>
</blockquote>
<pre><code>&gt; node src/index.js
Hello Typescript</code></pre><h2 id="✨-tsxtypescript-execute로-실행하기">✨ TSX(TypeScript Execute)로 실행하기</h2>
<blockquote>
<p>🚧 <code>ts-node</code>는 Node 20 버전 이상에서는 더 이상 동작하지 않습니다. 따라서 아래에서 소개하는 <code>tsx</code>로 대체하여 설치 진행</p>
</blockquote>
<pre><code>&gt; sudo npm i -g tsx</code></pre><pre><code>&gt; tsx -v
tsx v4.7.0
node v20.7.0</code></pre><blockquote>
<p>한번의 명령어로 타입스크립트를 실행</p>
</blockquote>
<pre><code>&gt; tsx src/index.ts
Hello TypeScript</code></pre><hr>

<p>출처 | <a href="https://www.inflearn.com/course/lecture?courseSlug=%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8&amp;unitId=154361">https://www.inflearn.com/course/lecture?courseSlug=%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8&amp;unitId=154361</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] className]]></title>
            <link>https://velog.io/@iooi_alice/React-className</link>
            <guid>https://velog.io/@iooi_alice/React-className</guid>
            <pubDate>Thu, 23 Nov 2023 11:44:44 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-편리하게-클래스네임을-쓰는-방법">📌 편리하게 클래스네임을 쓰는 방법</h1>
<h2 id="템플릿-문자열을-사용한-예">템플릿 문자열을 사용한 예</h2>
<pre><code class="language-jsx">function Button({ isPending, color, size, invert, children }) {
  const classNames = `Button ${isPending ? &#39;pending&#39; : &#39;&#39;} ${color} ${size} ${invert ? &#39;invert&#39; : &#39;&#39;}`;
  return &lt;button className={classNames}&gt;{children}&lt;/button&gt;;
}

export default Button;
</code></pre>
<h2 id="배열을-사용한-예">배열을 사용한 예</h2>
<pre><code class="language-jsx">function Button({ isPending, color, size, invert, children }) {
  const classNames = [
    &#39;Button&#39;,
    isPending ? &#39;pending&#39; : &#39;&#39;,
    color,
    size,
    invert ? &#39;invert&#39; : &#39;&#39;,
  ].join(&#39; &#39;);
  return &lt;button className={classNames}&gt;{children}&lt;/button&gt;;
}

export default Button;
</code></pre>
<h2 id="classnames-라이브러리를-사용한-예">classnames 라이브러리를 사용한 예</h2>
<pre><code>$npm install classnames</code></pre><pre><code class="language-jsx">import classNames from &#39;classnames&#39;;

function Button({ isPending, color, size, invert, children }) {
  return (
    &lt;button
      className={classNames(
        &#39;Button&#39;,
        isPending &amp;&amp; &#39;pending&#39;,
        color,
        size,
        invert &amp;&amp; &#39;invert&#39;,
      )}&gt;
     { children }
   &lt;/button &gt;
  );
}

export default Button;
</code></pre>
<p><a href="https://www.npmjs.com/package/classnames">https://www.npmjs.com/package/classnames</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] state]]></title>
            <link>https://velog.io/@iooi_alice/React-state</link>
            <guid>https://velog.io/@iooi_alice/React-state</guid>
            <pubDate>Wed, 22 Nov 2023 02:01:49 GMT</pubDate>
            <description><![CDATA[<h2 id="state">State</h2>
<p>State -&gt; 상태
상태가 변경될 때마다 화면을 새롭게 그려내는 방식으로 동작한다.
useState라는 함수를 활용해서 state를 바꾼다.
보통 이렇게 Destructuring 문법으로 작성</p>
<pre><code class="language-jsx">const [num, setNum] = useState(1);</code></pre>
<p>첫 번째 요소가 바로 state, 두 번째 요소 tate를 바꾸는 setter 함수
state를 변경하려면 변수에 새로운 값을 할당하는 방식이 아닌 Setter함수를 활용해야 함!</p>
<h2 id="참조형-state">참조형 State</h2>
<pre><code class="language-jsx">// ... 

  const [gameHistory, setGameHistory] = useState([]);

  const handleRollClick = () =&gt; {
    const nextNum = random(6);
    gameHistory.push(nextNum);
    setGameHistory(gameHistory); // state가 제대로 변경되지 않는다!
  };

// ...</code></pre>
<p>gameHistory state는 배열 값 자체를 가지고 있는 게 아니라 그 배열의 주솟값을 참조하고 있기 때문에 push 메소드로 배열 안에 요소를 변경했다고 하더라도 결과적으로 참조하는 배열의 주솟값은 변경된 것이 아니게 됩니다.</p>
<h3 id="리액트-입장에서는-gamehistory-state가-참조하는-주솟값은-여전히-똑같기-때문에-상태state가-바뀌었다고-판단하지-않는-것이죠">리액트 입장에서는 gameHistory state가 참조하는 주솟값은 여전히 똑같기 때문에 상태(state)가 바뀌었다고 판단하지 않는 것이죠!</h3>
<p>참조형 state를 활용할 때는 반드시 새로운 참조형 값을 만들어 state를 변경해야 합니다. 👉 Spread 문법(...) 을 활용</p>
<pre><code class="language-jsx">// ... 

  const [gameHistory, setGameHistory] = useState([]);

  const handleRollClick = () =&gt; {
    const nextNum = random(6);
    setGameHistory([...gameHistory, nextNum]); // state가 제대로 변경된다!
  };

// ...

//배열의 요소가 변한것이지 주소값은 처음 그대로이기 때문에 state가 변경되었다고
//판단하지 않아 화면을 새롭게 렌더링하지 않습니다.</code></pre>
<h3 id="✨-참조형-state를-활용할-땐-반드시-새로운-참조형-값을-만들어서-state를-변경해야-한다는-점-꼭-기억해-두세요">✨ 참조형 state를 활용할 땐 반드시 새로운 참조형 값을 만들어서 state를 변경해야 한다는 점. 꼭 기억해 두세요!</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] Props]]></title>
            <link>https://velog.io/@iooi_alice/React-Props</link>
            <guid>https://velog.io/@iooi_alice/React-Props</guid>
            <pubDate>Tue, 21 Nov 2023 06:14:08 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-prop-전달-받기">📌 prop 전달 받기</h1>
<blockquote>
<p>Props는 Properties의 약자인데요, 컴포넌트에 지정한 속성들을 Props라고 부릅니다
문자열을 porp으로 전달할 경우에는 {}를 사용하지 않고 &quot;&quot;를 사용합니다.
Destructuring 문법을 활용해서 조금 더 간결하게 코드를 작성할 수 있습니다.</p>
</blockquote>
<h2 id="✨-실습으로-props-적용해보기">✨ 실습으로 props 적용해보기</h2>
<blockquote>
<ol>
<li>HandIcon 컴포넌트의 value라는 prop을 받을거에요</li>
<li>img의 src속성은 value의 값에 따라 다음과 같이 지정해 주세요</li>
</ol>
</blockquote>
<ul>
<li>&#39;rock&#39; 인 경우 rockImg 를 보여줍니다.</li>
<li>&#39;scissor&#39; 인 경우 scissorImg 를 보여줍니다.</li>
<li>&#39;paper&#39; 인 경우 paperImg 를 보여줍니다.</li>
</ul>
<h3 id="1-객체화-하기">1. 객체화 하기</h3>
<p>이미지 객체화</p>
<pre><code class="language-jsx">const IMAGES = {
  rock: rockImg,
  scissor: scissorImg,
  paper: paperImg
}</code></pre>
<p>전체 코드</p>
<pre><code class="language-jsx">import rockImg from &#39;./assets/rock.svg&#39;;
import scissorImg from &#39;./assets/scissor.svg&#39;;
import paperImg from &#39;./assets/paper.svg&#39;;

// 이미지 주소 객체화
const IMAGES = {
  rock: rockImg,
  scissor: scissorImg,
  paper: paperImg
}

function HandIcon ({value}) {
  const src = IMAGES[value]
  return &lt;img src={src} alt={src} /&gt;
}

export default HandIcon;</code></pre>
<h3 id="2-삼항으로-조건달기">2. 삼항으로 조건달기</h3>
<p>내가 푼 방법</p>
<pre><code class="language-jsx">value === &#39;rock&#39; ? rockImg : value === &#39;scissor&#39; ? scissorImg : paperImg</code></pre>
<p>전체 코드</p>
<pre><code class="language-jsx">import rockImg from &#39;./assets/rock.svg&#39;;
import scissorImg from &#39;./assets/scissor.svg&#39;;
import paperImg from &#39;./assets/paper.svg&#39;;

function HandIcon({value}) {
  const imgUrl = value === &#39;rock&#39; ? rockImg : value === &#39;scissor&#39;? scissorImg : paperImg
  return &lt;img src={imgUrl} alt={imgUrl} /&gt;;
}

export default HandIcon;</code></pre>
<hr>

<h1 id="📌-children-prop">📌 children prop</h1>
<blockquote>
<p>props에는 children이라는 조금 특별한 프로퍼티(prop, 프롭)가 있습니다.
컴포넌트를 단일 태그가 아니라 여는 태그와 닫는 태그의 형태로 작성하면, 그 안에 작성된 코드가 바로 이 children 값에 담기게 됩니다.</p>
</blockquote>
<h2 id="✨-실습으로-props-적용해보기-1">✨ 실습으로 props 적용해보기</h2>
<pre><code class="language-js">function Button({ children }) {
  return &lt;button&gt;{children}&lt;/button&gt;;
}

export default Button;</code></pre>
<pre><code class="language-js">import Button from &#39;./Button&#39;;
import Dice from &#39;./Dice&#39;;

function App() {
  return (
    &lt;div&gt;
      &lt;div&gt;
        &lt;Button&gt;던지기&lt;/Button&gt;
        &lt;Button&gt;처음부터&lt;/Button&gt;
      &lt;/div&gt;
      &lt;Dice color=&quot;red&quot; num={2} /&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] JSX 문법]]></title>
            <link>https://velog.io/@iooi_alice/React-JSX-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@iooi_alice/React-JSX-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Tue, 21 Nov 2023 05:19:49 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-jsx-문법">📌 JSX 문법</h1>
<h2 id="html과-다른-속성명">HTML과 다른 속성명</h2>
<h3 id="1-속성명은-카멜케이스camel-case로-작성">1. 속성명은 카멜케이스(Camel Case)로 작성</h3>
<blockquote>
<p>여러 단어가 조합된 HTML 속성들은 <code>카멜 케이스</code>로 작성한다.
<code>onClick</code>, <code>onBlur</code>, <code>onFocus</code>, <code>onMouseDown</code>, <code>onMouseOver</code>, <code>tabIndex</code> 등과 같은 속성</p>
</blockquote>
<h3 id="2-예외적으로-비표준-속성을-다룰-때-활용하는-data--속성은-카멜-케이스camel-case가-아니라-기존의-html-문법-그대로-작성해야-한다">2. 예외적으로 비표준 속성을 다룰 때 활용하는 data-* 속성은 카멜 케이스(Camel Case)가 아니라 기존의 HTML 문법 그대로 작성해야 한다.</h3>
<pre><code class="language-jsx"> &lt;button className=&quot;btn&quot; data-status=&quot;대기중&quot;&gt;대기중&lt;/button&gt;</code></pre>
<h3 id="3-예약어와-같은-속성명은-사용할-수-없다">3. 예약어와 같은 속성명은 사용할 수 없다</h3>
<blockquote>
<p><code>for</code>나 <code>class</code>처럼 자바스크립트의 문법에 해당하는 예약어와 똑같은 이름의 속성명은 사용할 수 없습니다.</p>
</blockquote>
<ul>
<li><code>for</code> -&gt; <code>htmlFor</code></li>
<li><code>class</code> -&gt; <code>className</code></li>
</ul>
<pre><code class="language-jsx">    &lt;label htmlFor=&quot;name&quot;&gt;이름&lt;/label&gt;
    &lt;input id=&quot;name&quot; className=&quot;name-input&quot; type=&quot;text&quot; /&gt;</code></pre>
<h3 id="4-반드시-하나의-요소로-감싸기---fragment">4. 반드시 하나의 요소로 감싸기 - Fragment</h3>
<blockquote>
<p>부모 태그를 만들어 하나의 요소로 만들어 주어야 합니다.</p>
</blockquote>
<pre><code class="language-jsx">  &lt;div&gt;
    &lt;p&gt;안녕&lt;/p&gt;
    &lt;p&gt;리액트!&lt;/p&gt;
  &lt;/div&gt;

  &lt;Fragment&gt;
    &lt;p&gt;안녕&lt;/p&gt;
    &lt;p&gt;리액트!&lt;/p&gt;
  &lt;/Fragment&gt;,

  &lt;&gt;
    &lt;p&gt;안녕&lt;/p&gt;
    &lt;p&gt;리액트!&lt;/p&gt;
  &lt;/&gt;,</code></pre>
<h3 id="5-중괄호-안에는-표현식만-가능하다">5. 중괄호 안에는 표현식만 가능하다!</h3>
<ul>
<li>❌ if 문</li>
<li>❌ for 문</li>
<li>❌ 함수 선언</li>
<li>❌ 자바스크립트 문장</li>
</ul>
<pre><code class="language-jsx">root.render(
  &lt;&gt;
    &lt;h1&gt;나만의 {item} 주문하기&lt;/h1&gt;
    &lt;button onClick={handleClick}&gt;확인&lt;/button&gt;
  &lt;/&gt;
);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 설치]]></title>
            <link>https://velog.io/@iooi_alice/React-%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@iooi_alice/React-%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 20 Nov 2023 11:15:36 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-먼저-설치해야될-항목">📌 먼저 설치해야될 항목</h2>
<ol>
<li>node.js LTS 설치</li>
<li>vscode 설치</li>
</ol>
<pre><code class="language-bash">node -v  // 노드 버전 확인
npm -v //  npm 버전 확인</code></pre>
<hr>

<h3 id="리액트-설치현재-폴더에서-생성하기이미-폴더를-생성한-경우">리액트 설치(현재 폴더에서 생성하기/이미 폴더를 생성한 경우)</h3>
<pre><code class="language-bash">npm init react-app .</code></pre>
<h3 id="리액트-설치폴더-이름으로-생성">리액트 설치(폴더 이름으로 생성)</h3>
<pre><code class="language-bash">npm init react-app &lt;폴더이름&gt;</code></pre>
<h3 id="개발-모드-실행">개발 모드 실행</h3>
<pre><code class="language-bash">npm run start</code></pre>
<h3 id="개발-모드-종료">개발 모드 종료</h3>
<pre><code class="language-bash">ctrl+C</code></pre>
<h3 id="개발된-프로젝트-빌드하기">개발된 프로젝트 빌드하기</h3>
<pre><code class="language-bash">npm run build</code></pre>
<h3 id="빌드한-것-로컬에서-실행하기">빌드한 것 로컬에서 실행하기</h3>
<pre><code class="language-bash">npx serve build</code></pre>
<p>👉 serve 프로그램을 다운 받고 build 폴더에서 서버가 실행</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열 메소드-reduce]]></title>
            <link>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-reduce</link>
            <guid>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-reduce</guid>
            <pubDate>Mon, 13 Nov 2023 09:10:17 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-reduce">📌 reduce</h1>
<blockquote>
<p>acc, el, i, arr
매 반복마다 콜백함수의 return 값을 다음 acc로 전달</p>
</blockquote>
<pre><code class="language-js">const numbers = [1, 2, 3, 4];

numbers.reduce((acc, el, i, arr ) =&gt; {
  return nextAccValue;
}, initialAccValue)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열 메소드-some, every]]></title>
            <link>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-some-every</link>
            <guid>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-some-every</guid>
            <pubDate>Mon, 13 Nov 2023 06:47:29 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-some">📌 some</h1>
<h2 id="조건을-만족하는-요소가-1개-이상-있는지">조건을 만족하는 요소가 1개 이상 있는지</h2>
<blockquote>
<p><code>조건</code>을 <code>만족</code>하는지 <code>확인</code>할 때 사용
<code>ture</code>, <code>false</code> 값으로 나옴</p>
</blockquote>
<pre><code class="language-js">const numbers = [1, 3, 5, 7, 9]

const someReturn = numbers.some((el, i) =&gt; {
  console.log(&#39;some:&#39;, i)
  return el &gt; 5;
})

console.log(someReturn);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/685b46e3-4f57-4724-a236-5d482c89e3d6/image.png" alt=""></p>
<h1 id="📌-every">📌 every</h1>
<h2 id="조건을-만족하지-않는-요소가-1개-이상-있는지--모든-조건을-다-만족하는지">조건을 만족하지 않는 요소가 1개 이상 있는지 = 모든 조건을 다 만족하는지</h2>
<blockquote>
<p><code>조건</code>을 <code>만족</code>하는지 <code>확인</code>할 때 사용
<code>ture</code>, <code>false</code> 값으로 나옴</p>
</blockquote>
<pre><code class="language-js">const numbers = [1, 3, 5, 7, 9]

const everyReturn = numbers.every((el, i) =&gt; {
  console.log(&#39;every:&#39;, i)
  return el &gt; 5;
})

console.log(everyReturn);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/dd6b9abc-11fe-431c-876b-a2b65332ddeb/image.png" alt=""></p>
<h1 id="주의">주의</h1>
<p>빈배열 <code>[]</code>일 경우 콜백함수를 실행하지 않고 flase, true를 리턴한다.</p>
<pre><code class="language-js">const numbers = []  // 빈 배열

const someReturn = numbers.some((el, i) =&gt; {
  console.log(&#39;some:&#39;, i)
  return el &gt; 5;
})

const everyReturn = numbers.every((el, i) =&gt; {
  console.log(&#39;every:&#39;, i)
  return el &gt; 5;
})

console.log(someReturn);
console.log(everyReturn);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/ddd2fcdc-d0c3-4d10-995a-dcd66f955c69/image.png" alt=""></p>
<p>🔥 every 메소드는 빈 배열일 경우 무조건 true를 반환한다!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열 메소드-filter, find]]></title>
            <link>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-filter-find</link>
            <guid>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-filter-find</guid>
            <pubDate>Mon, 13 Nov 2023 06:06:17 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-filter">📌 filter</h1>
<blockquote>
<ul>
<li><code>특정 조건</code>을 만족하는 <code>새로운 배열</code>을 필요로 할 때 사용</li>
</ul>
</blockquote>
<ul>
<li>하나만 있는 요소를 가져올 때도 반드시 <code>배열</code>로 <code>반환</code>함</li>
<li>조건을 만족하는 <code>모든 값</code>을 가져와야하기 때문에 <code>처음부터 끝까지 반복</code> 한다.</li>
</ul>
<pre><code class="language-js">const fruits = [
  {name: &#39;banana&#39;, money: 1000 },
  {name: &#39;orange&#39;, money: 2000 },
  {name: &#39;grape&#39;, money: 1000 },
  {name: &#39;kiwi&#39;, money: 3000 },
  {name: &#39;guava&#39;, money: 2000 },
  {name: &#39;strawberry&#39;, money: 1000 },
  {name: &#39;lemon&#39;, money: 3000 },
  {name: &#39;peach&#39;, money: 4000 },
]

const cart = fruits.filter((el) =&gt; el.money === 1000);

console.log(cart);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/0a779709-14c4-440a-a0d9-aea9a3ecb5c8/image.png" alt=""></p>
<h1 id="📌-find">📌 find</h1>
<blockquote>
<ul>
<li>배열이 아닌 <code>값</code>만 <code>반환</code>한다.</li>
</ul>
</blockquote>
<ul>
<li>위에서부터 검사하면서 조건에 맞는 값을 찾으면 반복을 멈추고 그 값만 반환하기 때문에 <code>조건</code>을 <code>만족</code>하는 <code>하나의 값</code>만 나온다.</li>
<li>조건에 맞지 않는 값을 찾으려 한다면 <code>undefined</code> 출력</li>
</ul>
<pre><code class="language-js">const fruits = [
  {name: &#39;banana&#39;, money: 1000 },
  {name: &#39;orange&#39;, money: 2000 },
  {name: &#39;grape&#39;, money: 1000 },
  {name: &#39;kiwi&#39;, money: 3000 },
  {name: &#39;guava&#39;, money: 2000 },
  {name: &#39;strawberry&#39;, money: 1000 },
  {name: &#39;lemon&#39;, money: 3000 },
  {name: &#39;peach&#39;, money: 4000 },
]

const cart = fruits.filter((el) =&gt; el.money === 1000);

console.log(cart);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/3bb70190-bdf0-4a67-abd4-da7b986b20e3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[배열 메소드-forEach, map]]></title>
            <link>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-forEach-map</link>
            <guid>https://velog.io/@iooi_alice/%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%86%8C%EB%93%9C-forEach-map</guid>
            <pubDate>Mon, 13 Nov 2023 05:03:37 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-foreach">📌 forEach</h1>
<blockquote>
<p>배열의 <code>값</code>을 하나씩 불러오고 <code>인덱스</code>와 <code>배열</code>을 가져올 수 있다.
새로운 변수에 할당하면 <code>undefined</code> 값을 부여받는다.
👉 새로운 배열로 반환할 수 없다. 
👉 단순히 배열의 반복 작업을 필요할 때 사용한다.</p>
</blockquote>
<pre><code class="language-js">const members = [&#39;영훈&#39;, &#39;윤수&#39;, &#39;동욱&#39;, &#39;태호&#39;];

members.forEach((element) =&gt; {
  console.log(`${element}님이 입장하셨습니다.`)
})

members.forEach((element, i) =&gt; {
  console.log(`${i} ${element}님이 입장하셨습니다.`)
})

members.forEach((element, i, arr) =&gt; {
  console.log(`${i} ${element}님이 입장하셨습니다.`)
  console.log(arr);  // members 배열이 i번 찍힘
})</code></pre>
<h1 id="📌-map">📌 map</h1>
<blockquote>
<p>map 메소드는 <code>return</code> 값으로 <code>새로운 배열</code>을 <code>반환</code>할 수 있다.
👉 반복 작업을 통해서 새로운 배열을 반환하고 싶을 때 사용한다.</p>
</blockquote>
<pre><code class="language-js">const firstNames = [&#39;영훈&#39;, &#39;윤수&#39;, &#39;동욱&#39;, &#39;태호&#39;];
const lastNames = [&#39;김&#39;, &#39;나&#39;, &#39;박&#39;, &#39;이&#39;];

const fullNames = firstNames.map((element, i) =&gt; {
  return lastNames[i] + element;
})</code></pre>
<p>-arrow function 적용</p>
<pre><code class="language-js">firstNames.map((element, i) =&gt; lastNames[i] + element)</code></pre>
<h1 id="🔥-주의">🔥 주의</h1>
<p>최대 반복 횟수는 배열의 길이 값 만큼만 반복한다.
(무한루프에 빠지지 않음!)</p>
<h2 id="1-배열의-새로운-요소-추가될-때--배열의-길이만큼-추가">1. 배열의 새로운 요소 추가될 때 =&gt; 배열의 길이만큼 추가</h2>
<pre><code class="language-js">const members = [&#39;영훈&#39;, &#39;윤수&#39;, &#39;동욱&#39;, &#39;태호&#39;];

members.forEach((element) =&gt; {
  console.log(`${element}님이 입장하셨습니다.`);
  members.push(&#39;새로운 멤버&#39;);
})

console.log(members);</code></pre>
<p>배열의 길이: 4 👉 <code>새로운 멤버</code> 4번 추가됨
<img src="https://velog.velcdn.com/images/iooi_alice/post/a7214d73-4e10-4a43-a829-6a29f15adf7b/image.png" alt=""></p>
<h2 id="2-배열의-길이가-줄어들-때--반복-횟수-줄어듦">2. 배열의 길이가 줄어들 때 =&gt; 반복 횟수 줄어듦</h2>
<pre><code class="language-js">const members = [&#39;영훈&#39;, &#39;윤수&#39;, &#39;동욱&#39;, &#39;태호&#39;];

members.forEach((element) =&gt; {
  console.log(`${element}님이 입장하셨습니다.`);
  members.pop();
})

console.log(members);</code></pre>
<p>pop()메서드는 배열의 마지막 요소를 제거하고 그 요소를 반환 👉 원본 배열을 수정!</p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/5c9a3892-e49f-4a41-8cb7-5cc1fc614dfa/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[위클리 페이퍼] - 4주차]]></title>
            <link>https://velog.io/@iooi_alice/%EC%9C%84%ED%81%B4%EB%A6%AC-%ED%8E%98%EC%9D%B4%ED%8D%BC-4%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@iooi_alice/%EC%9C%84%ED%81%B4%EB%A6%AC-%ED%8E%98%EC%9D%B4%ED%8D%BC-4%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 12 Nov 2023 18:23:21 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-var-let-const-를-중복-선언-허용-스코프-호이스팅-관점에서-서로-비교해-주세요">📌 var, let, const 를 중복 선언 허용, 스코프, 호이스팅 관점에서 서로 비교해 주세요.</h1>
<h2 id="📝-var">📝 var</h2>
<h3 id="--변수-선언">- 변수 선언</h3>
<pre><code class="language-js">var example;  // 변수 선언문</code></pre>
<p><code>선언단계</code>와 <code>초기화 단계</code>가 <code>동시</code>에 진행된다.
<code>선언단계</code>를 통해 변수 이름을 등록하고, <code>초기화 단계</code>를 통해 변수에 undefined를 할당해 초기화(최초로 값을 할당)한다.
👉 var 키워드로 선언한 변수는 어떠한 값도 할당하지 않아도 <code>undefined</code>라는 값을 가진다.</p>
<h3 id="--호이스팅">- 호이스팅</h3>
<pre><code class="language-js">console.log(example);  // undefined

var example;  // 변수 선언문</code></pre>
<p>자바스크립트 엔진은 <code>변수 선언</code>을 포함한 <code>모든 선언문</code>(변수 선언문, 함수 선언문 등)을 소스코드에서 찾아내 먼저 실행한다. 소스코드 평가 과정이 끝나면 비로소 변수 선언을 포함한 모든 선언물을 제외하고 소스코드를 순차적으로 실행한다.
👉 <code>변수 선언문</code>은 호이스팅에 의해 <code>런타임 이전 단계</code>에서 먼저 <code>실행</code>된다.</p>
<p>🔥 주의) 변수 선언은 런타임 이전에 먼저 실행되지만 <code>값의 할당</code>은 <code>런타임</code>에서 할당한다.
변수 선언과 할당을 하나의 문장으로 단축 표현해도 변수 선언, 값의 할당을 나누어서 실행한다.
👉  <code>변수 선언 + 초기화</code>  -&gt;  <code>값의 할당</code></p>
<pre><code class="language-js">console.log(example);  // undefined

var example = 10;  // 변수 선언 + 값 할당

console.log(example);  // 10</code></pre>
<h3 id="--함수-레벨-스코프">- 함수 레벨 스코프</h3>
<p>같은 스코프 내에서 중복 선언이 허용되기 때문에 의도치 않게 변수값이 재할당되어 변경되는 부작용을 발생시킨다.</p>
<h2 id="📝-let">📝 let</h2>
<p>중복 선언 허용하지않고 재할당만 가능
블록레벨 스코프
선언하기 전에 호출 시 Reference Error 발생
비어있는 값을 부여하면 undefined 반환</p>
<h2 id="📝-cosnt">📝 cosnt</h2>
<p>중복선언, 재할당 불가
하지만 객체를 할당하고 주소값을 참조하게 된다면 값의 변경이 가능해짐</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모던자바스크립트]-에러와 에러객체]]></title>
            <link>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%90%EB%9F%AC%EC%99%80-%EC%97%90%EB%9F%AC%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%90%EB%9F%AC%EC%99%80-%EC%97%90%EB%9F%AC%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Sun, 12 Nov 2023 09:50:00 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-에러와-에러-객체">📌 에러와 에러 객체</h1>
<h2 id="에러가-발생하면">에러가 발생하면?</h2>
<blockquote>
<p>그 순간 프로그램 자체가 멈춰버리고 그 이후의 코드는 더 이상 동작하지 않습니다. 
동작을 멈추고 자동으로 에러 내용이 담긴 에러 객체가 만들어집니다.</p>
</blockquote>
<h2 id="에러-객체는-이름과-메시지를-가지고-있습니다">에러 객체는 이름과 메시지를 가지고 있습니다</h2>
<blockquote>
<p><code>error.name</code>, <code>error.message</code></p>
</blockquote>
<h2 id="에러-유형">에러 유형</h2>
<p>ReferenceError
TypeError
SyntaxError</p>
<h2 id="의도적으로-에러-객체-만들기">의도적으로 에러 객체 만들기</h2>
<pre><code class="language-js">const error = new TypeError(&#39;타입 에러가 발생했습니다.&#39;);

console.log(error.name)  // TypeError
console.log(error.message)  // 타입 에러가 발생했습니다.</code></pre>
<pre><code class="language-js">throw error;</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/0915bc6f-2855-4e81-a0e3-c0fe6de079bf/image.png" alt=""></p>
<h2 id="에러-발생시키기">에러 발생시키기</h2>
<pre><code class="language-js">throw new Error(&#39;에러가 발생했습니다.&#39;)</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/8a81f10c-ee3a-4ed8-a352-029652c6873e/image.png" alt=""></p>
<h1 id="📌-try-catch-문">📌 try catch 문</h1>
<h2 id="예외-처리execption-handling">예외 처리(Execption Handling)</h2>
<blockquote>
<ul>
<li>SyntaxError(문법에 어긋난 코드)와 달리 <code>실행 가능한 코드에서 발생하는 에러</code>를 다룹니다.</li>
</ul>
</blockquote>
<ul>
<li>try catch 문을 활용하면 에러 발생 시 프로그램을 멈추지 않고, <code>에러</code>가 발생했을 때 <code>동작할 코드</code>를 다룰 수 있게 됩니다. 이후의 코드는 차례로 실행 가능합니다.</li>
<li><code>try 문</code>에서 에러가 발생해서 <code>에러 객체</code>가 만들어지면, 그 에러 객체를 <code>catch 문</code> 안에서 <code>다룰 수 있습니다.</code></li>
</ul>
<pre><code class="language-js">try {
  // 코드
} catch (error) {
  // 에러가 발생했을 때 동작할 코드
}</code></pre>
<h2 id="오류-발생-시점-이해하기">오류 발생 시점 이해하기</h2>
<pre><code class="language-js">console.log(&#39;에러전&#39;);
const name = &#39;alice&#39;;
name = &#39;jiun&#39;;  // 🔥 error 발생! 

// 이후 코드 실행 중지

const course = &#39;java&#39;;
console.log(course);</code></pre>
<p>👉 const를 재할당 했기 때문에 세번째 줄에서 <code>TypeError</code> 발생, 이후 코드는 실행되지 않는다.</p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/35e90aa9-6313-473d-9369-34917100a72e/image.png" alt=""></p>
<h2 id="try-catch문-사용하기">try catch문 사용하기</h2>
<pre><code class="language-js">try {
  console.log(&#39;에러전&#39;);
  const name = &#39;alice&#39;;
  name = &#39;jiun&#39;;

  const course = &#39;java&#39;;
  console.log(course);
} catch (error) {
  console.log(error);
  console.error(error);
  console.log(error.name);
  console.log(error.message);
}</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/d7411918-527c-4d1c-8ef7-acb154db2a0a/image.png" alt=""></p>
<p>catch()안의 파라미터 <code>error</code>는 <code>객체</code>이며, 원하는 다른 단어를 적어도 사용 가능하다.
ex) errr, e ...등</p>
<h2 id="try-catch문-활용하기">try catch문 활용하기</h2>
<pre><code class="language-js">function members(members) {
  try {
    for(const member of members) {
      console.log(member);
    }
  } catch (err){
    console.error(err);
    alert(`${err.name}가 발생했습니다. 콘솔창에서 확인해 주세요.`)
  }
}

const teamA = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39; ,&#39;D&#39;]
members(teamA);

const teamB = {name: &#39;Alice&#39;}  // 🔥 에러 발생
members(teamB);
// 👉 객체는 for of문으로 돌릴 수 없음

const teamC = [&#39;E&#39;, &#39;F&#39;, &#39;G&#39; ,&#39;H&#39;]
members(teamC);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/da53d2fe-3c0b-4ecb-bd13-3bc98b9c4bfd/image.png" alt=""></p>
<h2 id="정리">정리</h2>
<blockquote>
<p>try catch <code>문</code>은 각각의 <code>코드블럭</code>으로 이루어져 있기 때문에 <code>try문</code>에서 선언한 타이틀 변수는 <code>catch문</code>에서도 사용할 수 없고 밖에서도 사용이 불가능합니다.
각 스코프를 잘 생각해서 작성해야 합니다.</p>
</blockquote>
<h1 id="finally-문">finally 문</h1>
<blockquote>
<p>try...catch문이 끝난 다음에 <code>최종적으로 실행될 코드</code>를 다룰 때 활용합니다.
try문에서 에러가 발생하지 않는다면 try문의 코드가 모두 실행된 다음에, try문에서 에러가 발생한다면 catch문의 코드가 모두 실행된 다음 실행할 코드를 finally문에 작성하면 됩니다.
👉 try문에서 어떤 코드를 실행할 때 <code>에러 여부</code>와 <code>상관 없이</code> <code>항상 실행</code>할 코드를 작성</p>
</blockquote>
<pre><code class="language-js">try {
  // 실행할 코드
} catch (err) {
  // 에러가 발생했을 때 실행할 코드
} finally {
  // 항상 실행할 코드
}</code></pre>
<h2 id="finally문에서의-에러-처리는">finally문에서의 에러 처리는?</h2>
<blockquote>
<p>참고로 finally문에서 에러가 발생할 경우에는 다시 그 위에 있는 catch문으로 넘어가진 않습니다.
만약 <code>finally문</code>에서도 <code>에러 처리</code>가 필요한 경우에는 아래 처럼 try...catch문을 <code>중첩</code>해서 활용하는 방법이 있습니다.</p>
</blockquote>
<pre><code class="language-js">try {
  try {
    // 실행할 코드
  } catch (err) {
    // 에러가 발생했을 때 실행할 코드
  } finally {
    // 항상 실행할 코드
  }
} catch (err) {
  // finally문에서 에러가 발생했을 때 실행할 코드
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모던자바스크립트]-문법과 표현]]></title>
            <link>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AC%B8%EB%B2%95%EA%B3%BC-%ED%91%9C%ED%98%84</link>
            <guid>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AC%B8%EB%B2%95%EA%B3%BC-%ED%91%9C%ED%98%84</guid>
            <pubDate>Sun, 12 Nov 2023 05:55:57 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-조건-연산자">📌 조건 연산자</h1>
<h2 id="삼항-연산자ternary-operator">삼항 연산자(Ternary operator)</h2>
<blockquote>
<p><code>조건</code> ? <code>truthy</code> 할 때 표현식 : <code>falsy</code> 할 때 표현식</p>
</blockquote>
<pre><code class="language-js">function passChecker(score) {
  return score &gt; CUT_OFF ? &#39;합격&#39; : &#39;불합격!&#39;;
}</code></pre>
<h1 id="📌-spread-구문">📌 Spread 구문</h1>
<blockquote>
<p>배열에 유용함
배열의 각각의 <code>개별 값</code>을 가져옴
배열을 좀 더 편하게 <code>복사</code>할 수 있음</p>
</blockquote>
<pre><code class="language-js">const numbers = [1, 2, 3];
console.log(...numbers); // 1 2 3</code></pre>
<pre><code class="language-js">const webPublishing = [&#39;HTML&#39;, &#39;CSS&#39;];
const interactiveWeb = webPublishing.slice();

interactiveWeb.push(&#39;JavaScript&#39;);

console.log(webPublishing);  // [&#39;HTML&#39;, &#39;CSS&#39;]
console.log(interactiveWeb);  // [&#39;HTML&#39;, &#39;CSS&#39;, &#39;JavaScript&#39;]</code></pre>
<p>👉 slice(): 원본 배열이 그대로 보존
인자를 넘기지 않으면 배열의 처음 값부터 마지막 값까지 전체를 복제</p>
<h2 id="스프레드-연산자-사용헤서-바꾸기">스프레드 연산자 사용헤서 바꾸기</h2>
<pre><code class="language-js">const interactiveWeb = [...webPublishing, &#39;JavaScript&#39;]</code></pre>
<h2 id="스프레드-연산자-사용해서-배열-합치기">스프레드 연산자 사용해서 배열 합치기</h2>
<pre><code class="language-js">const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

const arr3 = [...arr1, ...arr2];
console.log(arr3);  // [1,2,3,4,5,6]</code></pre>
<h2 id="하나의-값으로-평가로-되는게-아닌-여러개의-목록으로-평가됨">하나의 값으로 평가로 되는게 아닌 여러개의 목록으로 평가됨</h2>
<pre><code class="language-js">const numbers = [1];
const number = ...numbers;  // SyntaxError!!!</code></pre>
<h2 id="배열을-객체에-담기">배열을 객체에 담기</h2>
<blockquote>
<p>프로퍼티로 만들어진다! index를 갖게 됨</p>
</blockquote>
<pre><code class="language-js">const members = [&#39;태호&#39;, &#39;종훈&#39;, &#39;우재&#39;];
const newObject = {...members};
console.log(newObject) // {0: &#39;태호&#39;, 1: &#39;종훈&#39;, 2: &#39;우재&#39;}</code></pre>
<h2 id="객체-spread하기">객체 Spread하기</h2>
<pre><code class="language-js">const latte = {
  esspresso: &#39;30ml&#39;,
  milk: &#39;150ml&#39;
};

const cafeMocha = {
  ...latte,
  chocolate: &#39;20ml&#39;,
}

console.log(latte); // {esspresso: &quot;30ml&quot;, milk: &quot;150ml&quot;}
console.log(cafeMocha); // {esspresso: &quot;30ml&quot;, milk: &quot;150ml&quot;, chocolate: &quot;20ml&quot;}</code></pre>
<h2 id="주의-사항">주의 사항</h2>
<blockquote>
<ul>
<li>객체로는 새로운 배열을 만들거나 함수의 아규먼트로 사용할 수는 없습니다.</li>
</ul>
</blockquote>
<ul>
<li>spread할 때는 반드시 <code>객체</code>를 표현하는 <code>중괄호</code> 안에서 활용해야 한다!!!!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모던자바스크립트] - 함수]]></title>
            <link>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sat, 11 Nov 2023 00:14:50 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-함수-만드는-방법">📌 함수 만드는 방법</h1>
<h2 id="함수-선언식">함수 선언식</h2>
<pre><code class="language-js">function printCodeit(){
  console.log(&#39;Codeit&#39;)
}</code></pre>
<h2 id="함수-표현식">함수 표현식</h2>
<blockquote>
<p>함수 선언을 변수에 할당하거나 다른 함수의 아규먼트로 활용하면서 마치 <code>함수 선언</code>을 <code>값</code>처럼 <code>활용</code>해서 함수를 만드는 방식</p>
</blockquote>
<pre><code class="language-js">const 함수명 = function(){}

const printCodeit = function(){
  console.log(&#39;Codeit&#39;)
}</code></pre>
<h1 id="📌-parameter">📌 Parameter</h1>
<p>👉 파라미터(Parameter) : 함수 소괄호 안어 들어가는 값
👉 아규먼트(Argument) : 함수를 호출하는 부분에서 값을 전달하는 부분</p>
<pre><code class="language-js">function greeting(name){
  console.log(`Hi! My name is ${name}`)
}

greeting(&#39;heesoo&#39;)

// 👉 파라미터 - name
// 👉 아규먼트 - &#39;heesoo&#39;</code></pre>
<h2 id="파라미터-기본값">파라미터 기본값</h2>
<pre><code class="language-js">function greeting(name = &#39;Codeit&#39;, interest){
  console.log(`Hi! My name is ${name}!`)
  console.log(`I like ${interest}!`)
}

greeting(&#39;JavaScript&#39;);
// Hi! My name is JavaScript!
// I like undefined!</code></pre>
<p>파라미터의 기본값과는 상관없이 아규먼트 순서대로 파라미터 안에 들어가기 때문에 <code>name = &#39;Codeit&#39;</code>과 같이 기본값으로 지정되는 파라미터는 맨 뒤에 작성하는 것을 권장함</p>
<pre><code class="language-js">function greeting(name = &#39;Codeit&#39;, interest = &#39;JavaScript&#39;){
  console.log(`Hi! My name is ${name}!`)
  console.log(`I like ${interest}!`)
}

greeting(undefined, &#39;Python&#39;);</code></pre>
<p>👉 undefined을 아규먼트로 사용하면 파라미터의 기본값을 불러서 사용할 수 있음</p>
<h1 id="📌-arguments">📌 Arguments</h1>
<p>함수 내부에서 arguments를 사용할 수 있음 = 유사배열 = 배열 메서드 사용 불가</p>
<pre><code class="language-js">function printArguments(){
  for(const arg of arguments){
    console.log(arg);
  }
}</code></pre>
<h1 id="📌-rest-parameter">📌 Rest Parameter</h1>
<blockquote>
<p>배열이기 때문에 배열의 메소드를 자유롭게 사용 가능
rest parameter를 먼저 사용하고 대체해야 될 경우에 arguments사용을 권장합니다.</p>
</blockquote>
<pre><code class="language-js">function printArguments(...args) {
  // args 객체의 요소들을 하나씩 출력
  for (const arg of args) {
    console.log(arg); 
  }
}

printArguments(&#39;Young&#39;, &#39;Mark&#39;, &#39;Koby&#39;);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/c055f4eb-f007-4e68-8079-ff5df1941f7b/image.png" alt=""></p>
<pre><code class="language-js">function printRankingList(first, second, ...others) {
  console.log(&#39;코드잇 레이스 최종 결과&#39;);
  console.log(`우승: ${first}`);
  console.log(`준우승: ${second}`);
  for (const arg of others) {
    console.log(`참가자: ${arg}`);
  }
}

printRankingList(&#39;Tommy&#39;, &#39;Jerry&#39;, &#39;Suri&#39;, &#39;Sunny&#39;, &#39;Jack&#39;);</code></pre>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/714c7c85-1943-466b-a05d-3ce49108ee5f/image.png" alt=""></p>
<h1 id="📌-arrow-function">📌 Arrow Function</h1>
<blockquote>
<p>👉 <code>익명 함수</code>를 좀 더 <code>간결</code>하게 표현할 수 있도록 ES2015에서 새롭게 등장한 함수 선언 방식
👉 <code>함수를 정의</code>할 때 활용될 수도 있고 <code>콜백 함수</code>로 전달할 때 활용할 수도 있습니다.</p>
</blockquote>
<h2 id="함수-정의">함수 정의</h2>
<pre><code class="language-js">const getTwice = (number) =&gt; {
  return number * 2;
};</code></pre>
<h2 id="콜백-함수로-활용">콜백 함수로 활용</h2>
<pre><code class="language-js">myBtn.addEventListener(&#39;click&#39;, () =&gt; {
  console.log(&#39;button is clicked!&#39;);
});</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모던자바스크립트]-데이터타입, 연산자]]></title>
            <link>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%83%80%EC%9E%85-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@iooi_alice/%EB%AA%A8%EB%8D%98%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%83%80%EC%9E%85-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Fri, 10 Nov 2023 13:49:31 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-모던-자바스크립트란">📌 모던 자바스크립트란?</h1>
<blockquote>
<p><code>현시점</code>에 사용하기 적합한 범위 내에서 <code>최신 버전</code>의 표준을 준수하는 자바스크립트</p>
</blockquote>
<h2 id="데이터-타입의-특징과-종류">데이터 타입의 특징과 종류</h2>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/8c833377-7607-4854-ac02-e1cff364bddc/image.png" alt=""></p>
<h2 id="falsy--truthy">Falsy / Truthy</h2>
<p>Falsy: false, null, undefined, 0, NaN, &#39;&#39;
Truthy : true, &#39;Codeit&#39;, 123, -123, {}, []
<img src="https://velog.velcdn.com/images/iooi_alice/post/b95f5f53-bacb-42b4-ad60-d8b8b4b891e2/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/4ef8f18b-9c71-46b8-9edc-075cfc9f4700/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/iooi_alice/post/030f78c8-6db5-464a-b2d7-98c0d744a5d9/image.png" alt=""></p>
<h2 id="and--or">AND / OR</h2>
<blockquote>
<p>(A &amp;&amp; B)
A : ture
👉 true가 올 경우 오른쪽 값을 반환
A : false
👉 flase값 바로 반환</p>
</blockquote>
<blockquote>
<p>(A || B)
A : ture
👉 true값 바로 반환
A : false
👉 flase올 경우 오른쪽 값을 반환</p>
</blockquote>
<pre><code class="language-js">console.log(&#39;Codeit&#39; &amp;&amp; &#39;JavaScript&#39;)  //&#39;JavaScript&#39;
console.log(null &amp;&amp; undefined)  // null</code></pre>
<pre><code class="language-js">console.log(&#39;String&#39; &amp;&amp; 123);  // 123
console.log({} || []);  // {}
console.log(0 &amp;&amp; false);  // 0
console.log(null || undefined);  // undefined
console.log(NaN &amp;&amp; &#39;Codeit&#39;);  // NaN
console.log(&#39;&#39; || true);  // true
console.log(&#39;JavaScript&#39; &amp;&amp; null);  // null
console.log(3000 || undefined);  // 3000
</code></pre>
<h2 id="and-와-or-연산자의-연산-우선순위">AND 와 OR 연산자의 연산 우선순위</h2>
<blockquote>
<p>AND 와 OR 연산자 사이에서는 AND 연산자의 우선순위가 더 높습니다.</p>
</blockquote>
<pre><code class="language-js">console.log(true || false &amp;&amp; false); // true
console.log((true || false) &amp;&amp; false); // false

console.log(&#39;Codeit&#39; || NaN &amp;&amp; false); // Codeit
console.log((&#39;Codeit&#39; || NaN) &amp;&amp; false); // false</code></pre>
<h2 id="null-병합-연산자-">null 병합 연산자 ??</h2>
<blockquote>
<p>물음표 두 개(??)를 사용해서 null 혹은 undefined 값을 가려내는 연산자 입니다.</p>
</blockquote>
<pre><code class="language-js">const example1 = null ?? &#39;I&#39;; // I
const example2 = undefined ?? &#39;love&#39;; // love
const example3 = &#39;Codeit&#39; ?? &#39;JavaScript&#39;; // Codeit

console.log(example1, example2, example3); // I love Codeit</code></pre>
<p>example1과 2를 보시면, 지금 null 병합 연산자 왼편에 각각 null과 undefined가 있죠? 이렇게 연산자 왼편의 값이 null 이나 undefined라면 연산자 오른편의 값이 리턴되고, example3처럼 연산자 왼편의 값이 null 이나 undefined가 아니라면 연산자 왼편의 값이 리턴되는 원리로 동작합니다. 결과적으로 마지막 줄에서 콘솔에 출력되는 값은 I love Codeit이 되겠죠?</p>
<blockquote>
<p>🔥 주의!
하지만 null 병합 연산자(??)는 왼편의 값이 null이나 undefined인지 확인하고 OR 연산자(||)는 왼편의 값이 falsy인지를 확인하기 때문에 아래 코드와 같이 null이나 undefined가 아닌 falsy 값을 활용할 때 결과가 서로 다르니깐, 이 부분은 꼭 기억해 두세요!</p>
</blockquote>
<pre><code class="language-js">const title1 = false || &#39;codeit&#39;;
const title2 = false ?? &#39;codeit&#39;;

console.log(title1); // codeit
console.log(title2); // false

const width1 = 0 || 150;
const width2 = 0 ?? 150;  //null, undefined가 아니므로 0 출력

console.log(width1); // 150
console.log(width2); // 0</code></pre>
<h2 id="변수와-스코프">변수와 스코프</h2>
<p>자바스크립트에는 다양한 변수 선언 키워드가 있습니다. 자바스크립트가 처음 등장할 때부터 사용되던 <code>var</code>와, 그리고 var의 부족함을 채우기위해 ES2015에서 새롭게 등장한 <code>let</code>과 <code>const</code>가 있는데요.</p>
<blockquote>
<p><code>var</code> 특징
변수 이름 중복선언 가능,
변수 선언 전에 사용 가능(호이스팅),
함수 스코프(함수를 기준으로 스코프를 구분)
특히나 중복된 이름으로 선언이 가능했던 특징은 여러 사람이 협업할 때 생각보다 자주 문제가 되곤 했었는데요. 
이런 문제를 개선하기 위해 ES2015에서 let과 const가 등장했고, 다음과 같은 특징이 있습니다.</p>
</blockquote>
<blockquote>
<p><code>let</code>, <code>const</code> 특징
변수 이름 중복선언 불가 (SyntaxError 발생)
변수 선언 전에 사용 불가 (ReferenceError 발생)
블록 스코프
덧붙여 const 키워드는 let 키워드와 다르게 값을 재할당할 수 없다는 특징도 있습니다.
그래서 ES2015 이후부터는 var보다 let과 const 키워드 사용이 권장된다는 사실도 참고해 두시면 좋을 것 같습니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자바스크립트 기본]-키보드 이벤트]]></title>
            <link>https://velog.io/@iooi_alice/%ED%82%A4%EB%B3%B4%EB%93%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8</link>
            <guid>https://velog.io/@iooi_alice/%ED%82%A4%EB%B3%B4%EB%93%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8</guid>
            <pubDate>Fri, 10 Nov 2023 12:33:21 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-키보드-이벤트">📌 키보드 이벤트</h1>
<blockquote>
<p>✨ KeyboardEvent.type
<code>keydown</code>: 키보드 버튼을 누른 순간
<code>keypress</code>: 키보드 버튼을 누른 순간
<code>keyup</code>: 키보드 버튼을 눌렀다 뗀 순간 <br>
✨ KeyboardEvent.key
이벤트가 발생한 버튼의 값 <br>
✨ KeyboardEvent.code
이벤트가 발생한 버튼의 키보드에서 물리적인 위치</p>
</blockquote>
<p><code>keypress</code>: 웹 표준에서 권장하지 않는 방법</p>
]]></description>
        </item>
    </channel>
</rss>