<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>oh_bom721.log</title>
        <link>https://velog.io/</link>
        <description>목표는 감자탈출</description>
        <lastBuildDate>Mon, 05 Jun 2023 14:13:11 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>oh_bom721.log</title>
            <url>https://velog.velcdn.com/images/oh_bom721/profile/4d104277-7bd7-40ec-9256-f8eddf32247a/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. oh_bom721.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/oh_bom721" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[드릴게 이것뿐이라,,🐬]]></title>
            <link>https://velog.io/@oh_bom721/%EB%93%9C%EB%A6%B4%EA%B2%8C-%EC%9D%B4%EA%B2%83%EB%BF%90%EC%9D%B4%EB%9D%BC</link>
            <guid>https://velog.io/@oh_bom721/%EB%93%9C%EB%A6%B4%EA%B2%8C-%EC%9D%B4%EA%B2%83%EB%BF%90%EC%9D%B4%EB%9D%BC</guid>
            <pubDate>Mon, 05 Jun 2023 14:13:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/oh_bom721/post/db3285f1-b68c-4e92-b848-9c50ecb31d09/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/8676bcbc-0a75-47a3-9347-695b1d4e72f5/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/0069155d-0a49-4bad-9818-45c7997317a3/image.JPG" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/e720ee9f-1f65-4fe1-86f6-37645087b987/image.JPG" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/ea22912f-debe-4247-9765-79ea70434491/image.JPG" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/f20f03b0-45b7-44b2-a516-27260de4ba24/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/7f15b1b6-e5f2-49eb-a8f2-d5bb7dd29500/image.JPG" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/a4c4a306-60df-4f90-9f86-3c7770374908/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/bdc74b38-86a1-4a85-8c79-b1b34ddbd666/image.JPG" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/134abca7-37d3-464c-989e-4ad240be8047/image.JPG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/9391b77d-c9a3-4583-b5f8-80d997d5c8f0/image.jpg" alt=""></p>
<p>늘 행복합시다 🧚‍♂️</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[최단 거리 BFS 문제]]></title>
            <link>https://velog.io/@oh_bom721/%EC%B5%9C%EB%8B%A8-%EA%B1%B0%EB%A6%AC-BFS-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@oh_bom721/%EC%B5%9C%EB%8B%A8-%EA%B1%B0%EB%A6%AC-BFS-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Mon, 05 Dec 2022 16:09:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/oh_bom721/post/4cf60539-ae98-4072-aaa8-cea5c59e0f12/image.png" alt=""></p>
<p>다음 그림과 같은 그래프가 있을때 정점(1)에서 출발하여 각 노드들에 도달하는데 걸리는 최단 거리를 출력하는 코드를 구현해 보자!</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/1510e543-870a-4fe7-b856-6294252a1b7f/image.png" alt=""></p>
<p>높이를 나타내서 다시 그려보면 다음과 같다</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/8292e50f-0897-4cbd-9f4d-421264f176dd/image.png" alt=""></p>
<p>다음과 같이 dis라는 배열을 만들어 정점 1로부터 도달하는데 걸리는 거리를 하나씩 넣는다.
예를들어 1-&gt;4-&gt;6-&gt;2의 구현과정을 먼저 보자면
dis[4]=dis[1]+1 // dis[4]=0+1=1
dis[6]=dis[4]+1 //dis[6]=1+1=2
dis[2]=dis[6]+1 //dis[2]=2+1=3</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/189091f7-db91-44e9-b20f-f70fa19fdd93/image.png" alt="">
우선 BFS를 구현할 ArrayList를 만들어 정점과 간선 정보를 입력한다.</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/1a29f2df-1220-4fd0-8209-1b40dd100fb2/image.png" alt=""></p>
<p>dis 1차원 배열을 머리속에 그리면서 생각하면 도움이 되는 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[경로 탐색(DFS, 인접리스트, ArrayList 풀이)]]></title>
            <link>https://velog.io/@oh_bom721/%EA%B2%BD%EB%A1%9C-%ED%83%90%EC%83%89DFS-%EC%9D%B8%EC%A0%91%EB%A6%AC%EC%8A%A4%ED%8A%B8-ArrayList-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@oh_bom721/%EA%B2%BD%EB%A1%9C-%ED%83%90%EC%83%89DFS-%EC%9D%B8%EC%A0%91%EB%A6%AC%EC%8A%A4%ED%8A%B8-ArrayList-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Mon, 05 Dec 2022 15:21:40 GMT</pubDate>
            <description><![CDATA[<h2 id="span-stylebackground-colorskyblue-경로탐색-문제span"><span style="background-color:skyblue"> 경로탐색 문제</span></h2>
<p>: 방향 그래프가 주어지면 1번 정점에서 N번 정점까지 가는 모든 경우의 수를 출력하는 알고리즘 짜기</p>
<h3 id="span-stylebackground-colorpink2차원-배열을-이용한-풀이span"><span style="background-color:pink">2차원 배열을 이용한 풀이</span></h3>
<p>문제를 풀기전 간단하게 그래프별로 행렬을 어떻게 구현하는지 살펴보자</p>
<ol>
<li><p>무방향 그래프
<img src="https://velog.velcdn.com/images/oh_bom721/post/a8efca2f-6b24-4610-9288-0bb66b8ad86c/image.png" alt=""></p>
</li>
<li><p>방향 그래프
<img src="https://velog.velcdn.com/images/oh_bom721/post/9fdd2340-93ca-437a-a2e2-de87dd11187a/image.png" alt=""></p>
</li>
<li><p>가중치 그래프
<img src="https://velog.velcdn.com/images/oh_bom721/post/2c03dc5d-1e6e-4a80-8c7d-a57eea6d74ac/image.png" alt=""></p>
</li>
</ol>
<p>이제 경로탐색 문제 풀이 코드를 보자면
<img src="https://velog.velcdn.com/images/oh_bom721/post/bd148d23-e2c2-44d3-b880-d0c71e0ccd20/image.png" alt=""></p>
<p>n(정점의 개수),m(간선의 개수)를 입력받은후 for문을 이용하여 그래프의 정점과 간선을 추가한다. 시작 점인 1 정점의 check를 1로 설정한후, DFS(1)을 호출한다.
<img src="https://velog.velcdn.com/images/oh_bom721/post/4512006b-a041-4948-8aad-796fbc079ad4/image.png" alt="">
현재 정점이 n번 정점에 도달하면 answer값 증가
그 외에는 2차원 graph 배열을 돌며 graph[v][i]가 있고, 정점i가 아직 방문 전일때(ch[i]==0) i정점을 방문하고 ,DFS(i) 실행
백트래킹 후에는 방문했던 정점을 다시 방문하지 않은 상태(ch[i]==0)으로 변경</p>
<h3 id="span-stylebackground-colorpinkarraylist를-이용한-풀이span"><span style="background-color:pink">ArrayList를 이용한 풀이</span></h3>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/eef53e9c-864d-40a7-b550-72c4d1184ddd/image.png" alt=""></p>
<p>메인 메서드에서 그래프 생성 및 정점과 간선 정보 입력받기</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/003bafe6-78da-42c5-82ae-8dcdedc6133c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BFS(Breadth-First Search) 너비 우선 탐색 or 레벨탐색]]></title>
            <link>https://velog.io/@oh_bom721/BFSBreadth-First-Search-%EB%84%88%EB%B9%84-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89-or-%EB%A0%88%EB%B2%A8%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@oh_bom721/BFSBreadth-First-Search-%EB%84%88%EB%B9%84-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89-or-%EB%A0%88%EB%B2%A8%ED%83%90%EC%83%89</guid>
            <pubDate>Mon, 05 Dec 2022 03:59:39 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskybluebfs-너비-우선-탐색span"><span style="background-color:skyblue">BFS: 너비 우선 탐색</span></h3>
<p>: 시작 노드에 인접한 노드부터 탐색하는 방법
가장 가까이 있는 정점을 먼저 방문 후 나중에 멀리있는 정점 방문하는 방식. 같은 층(level)에 있는 정점들을 다 방문 후 그 다음 층 노드들로 이동
<img src="https://velog.velcdn.com/images/oh_bom721/post/fb296558-b1ad-49a8-8882-eb6ac55e8702/image.png" alt=""></p>
<h4 id="span-stylebackground-colorbeige이진-트리-탐색-코드span"><span style="background-color:beige">이진 트리 탐색 코드</span></h4>
<ul>
<li><p>기본 트리 구현 코드
<img src="https://velog.velcdn.com/images/oh_bom721/post/a3c67e14-72ed-4433-bdfe-314d5f6972c5/image.png" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/38dbcda1-ab4a-4814-b1b6-f990a2d31430/image.png" alt=""></p>
</li>
<li><p>BFS 탐색 코드
<img src="https://velog.velcdn.com/images/oh_bom721/post/c195cdf3-d455-4bef-9ce6-3cb77dfe03fe/image.png" alt=""></p>
</li>
<li><p>실행 결과
<img src="https://velog.velcdn.com/images/oh_bom721/post/44cf0c0c-88ca-4583-a82d-d36de381dfa0/image.png" alt=""></p>
</li>
</ul>
<h4 id="span-stylebackground-colorbeige송아지-찾기-문제-코드span"><span style="background-color:beige">송아지 찾기 문제 코드</span></h4>
<p>문제 설명: 현재 나의 위치가 s, 송아지의 위치가 e일때 한번에 이동할 수 있는 양은 -1,1,5뿐이다. 이때 몇번만에 송아지의 위치까지 갈 수있는가?
<img src="https://velog.velcdn.com/images/oh_bom721/post/49b6ac70-46fc-4bbf-bb29-4ae206a21634/image.png" alt=""></p>
<p>이 그림을 코드로 구현하면 다음과 같다. 
<img src="https://velog.velcdn.com/images/oh_bom721/post/d42ce6cd-08dd-4165-b961-10744e84817f/image.png" alt=""></p>
<ul>
<li>tree 말단 노드까지 가장 짧은 경로의 높이 출력 
<img src="https://velog.velcdn.com/images/oh_bom721/post/a0052bdc-36f6-4ddc-aa31-b4004c2e9ef1/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[DFS(깊이 우선 탐색)]]></title>
            <link>https://velog.io/@oh_bom721/DFS%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@oh_bom721/DFS%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89</guid>
            <pubDate>Sun, 04 Dec 2022 09:24:13 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskybluedfsdepth-first-search-깊이-우선-탐색-span"><span style="background-color:skyblue">DFS(Depth First Search): 깊이 우선 탐색 </span></h3>
<p>: 이름에서 살짝 알 수 있듯이 트리에서 루트를 <strong>최대한 깊숙이</strong> 들어가서 확인 한 후 다시 돌아가는 탐색 방법
<img src="https://velog.velcdn.com/images/oh_bom721/post/36e7069a-ee91-403c-89bb-4c1fd76d512f/image.png" alt=""></p>
<p>알랑말랑 한다면 예시코드로 바로 가보자~</p>
<hr>
<p>전위, 중위 ,후위 구현 코드!를 보기전에</p>
<p>전위, 중위 ,후위가 뭔지 먼저 알아보자!</p>
<p><strong>전위</strong>: 부모 노드가 자식 노드들보다 먼저** 맨 앞에**
<strong>중위</strong>: 부모 노드가 좌우 자식 노드의 <strong>중간</strong>에
<strong>후위</strong>: 부모 노드가 자식 노드들보다 더 늦게 <strong>마지막</strong>에
<img src="https://velog.velcdn.com/images/oh_bom721/post/2b2c9729-951d-497c-b13d-0d7e3c9a9afe/image.png" alt="">
기준이 부모 노드임을 기억하면 덜 헷갈린다.</p>
<hr>
<p>Node 생성
<img src="https://velog.velcdn.com/images/oh_bom721/post/cb6064c8-0624-4de1-a11d-27946d2af1dd/image.png" alt=""></p>
<p>tree 생성
<img src="https://velog.velcdn.com/images/oh_bom721/post/890f656f-710a-4de8-9442-a51ca08e1279/image.png" alt=""></p>
<p><em>전위 코드</em>
<img src="https://velog.velcdn.com/images/oh_bom721/post/ba70a5e3-7cb1-4e81-b49f-2081b4d5d112/image.png" alt=""></p>
<p>: 부모 노드 출력 후 자식 노드 호출</p>
<p><em>중위 코드</em>
<img src="https://velog.velcdn.com/images/oh_bom721/post/47a6f199-8271-4774-b2eb-53debe4bf59b/image.png" alt=""></p>
<p>왼쪽 자식 노드 출력 후 부모 노드 출력</p>
<p><em>후위 코드</em></p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/f1a29bed-ac1a-4989-9acd-647c77d60134/image.png" alt=""></p>
<p>왼쪽 오른쪽 자식 노드 모두 출력 후 마지막에 부모노드 출력</p>
<p><span style="background-color:beige">부분 집합을 출력하는 코드 예시 </span>
<img src="https://velog.velcdn.com/images/oh_bom721/post/cc56469a-3d5a-4e44-9183-a408b8c5f8c6/image.png" alt=""></p>
<p>사실,,이해가 잘안되서 그림을 열심히 그리면서 했는데 한번 같이 올려볼게요,,
<img src="https://velog.velcdn.com/images/oh_bom721/post/9b0090e7-059f-458e-8749-8787121bb530/image.png" alt="">
<img src="https://velog.velcdn.com/images/oh_bom721/post/88a5b059-5315-4fd4-a0b4-a30351ecbfe9/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[08. [NextJS]pre-redning, data-fetching]]></title>
            <link>https://velog.io/@oh_bom721/08.-NextJSpre-redning-data-fetching</link>
            <guid>https://velog.io/@oh_bom721/08.-NextJSpre-redning-data-fetching</guid>
            <pubDate>Sun, 27 Nov 2022 07:31:17 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskybluenextjsspan"><span style="background-color:skyblue">NextJs</span></h3>
<p><code>:리액트의 SSR(Server Side Rendering)을 쉽게 구현하게 도와주는 프레임워크</code></p>
<h4 id="span-stylebackground-coloryellow-ssr-vs-csrspan"><span style="background-color:yellow"> SSR vs CSR</span></h4>
<p><strong>CSR(Client Side Rendering)</strong>
: 렌더링이 클라이언트 쪽에서 발생,
서버가 요청을 받으면 클라이언트에서 html과 js를 보내 주고 클라이언트가 렌더링함-&gt; 서버로부터 js파일을 모두 다운 받아 실행하기 전까지는 사용자는 볼 수 없음.</p>
<p><strong>SSR(Server Side Rendering)</strong>
:서버에서 렌더링을 다 마친 후 클라이언트에 보냄
클라이언트에 전달 되면, 이미 렌더링 준비가 끝났기에 즉시 html이 렌더링 된다. 클라이언트가 JS를 다운 받는 동안 csr과 달리 내용을 볼 수 있지만, 조작은 불가능 하다. </p>
<p><strong>로딩시간 비교</strong></p>
<ul>
<li>첫페이지 로딩 시간: SSR이 CSR보다 빠름
CSR은 한꺼번에 모든 파일들을 불러오지만 SSR은 매번 필요한 부분의 파일만 불러오기 때문에</li>
<li>전체 페이지 로딩 시간: CSR이 SSR보다 빠름
SSR은 다시 로딩 과정을 거쳐야 하기 때문-&gt; 그래서 SSR이 서버자원을 더 많이 사용한다. </li>
</ul>
<p><span style="background-color:whitesmoke" >참고자료🚀: </span></p>
<p>따라하며 배우는 리액트 강의 자료
[SSR vs CSR]<a href="https://hahahoho5915.tistory.com/52">https://hahahoho5915.tistory.com/52</a></p>
<h4 id="span-stylebackground-coloryellow-nextjs-기본구조span"><span style="background-color:yellow"> NextJS 기본구조</span></h4>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/84c80a9b-8190-446c-9f58-8ab3b7c883d1/image.png" alt=""></p>
<p><strong>pages</strong></p>
<ul>
<li>index.tsx가 메인 기본 페이지. &quot;/&quot; 페이지</li>
<li>app.tsx에 공통된는 레이아웃</li>
</ul>
<p><strong>public
styles
next.config.js</strong></p>
<h4 id="span-stylebackground-coloryellow-pre-renderingspan"><span style="background-color:yellow"> Pre-rendering</span></h4>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/4647dc62-4a95-45f1-af41-df09d46effe4/image.png" alt=""></p>
<p>pre-rendering를 하지 않는다면 초기화면에 아무것도 뜨지 않지만, pre-rendering시 미리 생성된 HTML이 보인다. </p>
<p><strong><span style="background-color:beige"> Static Generation</span></strong></p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/3211c6a9-bc0c-4ee7-b8f0-53f83e8634d7/image.png" alt=""></p>
<p>: html을 빌드타임에 생성해 둔 후 요청시 마다 재사용</p>
<p><strong><span style="background-color:beige"> Server-side Rendering</span></strong>
<img src="https://velog.velcdn.com/images/oh_bom721/post/43cdd06c-b763-4c98-9127-787b971ea98d/image.png" alt=""></p>
<p>: 각각의 요청마다 html을 생성함</p>
<p><strong>static generation을 사용하는 경우</strong>
:user의 요청 전에 pre-rendering이 필요한 경우, &#39;next build&#39;</p>
<p><strong>server-side rendering을 사용하는 경우</strong>
:계속 업데이트 되는 데이터를 보여주는 경우, 속도는 더 느림, &#39;npm run dev&#39;</p>
<p><span style="background-color:whitesmoke" >참고자료🚀: </span></p>
<p>따라하며 배우는 리액트 강의 자료
<a href="https://nextjs.org/learn/basics/data-fetching/two-forms">https://nextjs.org/learn/basics/data-fetching/two-forms</a>
<a href="https://ppsu.tistory.com/63">https://ppsu.tistory.com/63</a></p>
<h4 id="span-stylebackground-coloryellow-data-fetchingspan"><span style="background-color:yellow"> Data Fetching</span></h4>
<p><span style="background-color:beige"> <strong>getStaticProps</strong></span>
:static generation으로 빌드할때 데이터 불러며 한번 호출, 이후 수정 불가</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/dbe48f0a-66ee-4fa3-90fa-d620bcbded4c/image.png" alt=""></p>
<p>사용하는 경우</p>
<ul>
<li>사용자의 요청보다 먼저 빌드에 필요한 데이터를 가져올때</li>
</ul>
<p><span style="background-color:beige"> <strong>getStaticPaths</strong></span>
: side generation 데이터에 기반하여 pre-render시 동적 라우팅 구현
<img src="https://velog.velcdn.com/images/oh_bom721/post/e6f20daa-ffb2-411d-9dc3-8edbe7b9b2f5/image.png" alt=""></p>
<p><strong>paths</strong>: 어떤 경로가 pre-rendering할지 결정
빌드하는 동안 /posts/1와 /posts/2를 생성</p>
<p><strong>paras</strong>: 페이지 이름이 pages/posts/[postId]/[commentId]라면 params는 postId와 commentId 이다.</p>
<p><strong>fallback</strong><Br>
false: getStaticPaths로 리턴되지 않으므로 404페이지가 뜸<br>
true:getStaticPaths로 리턴되지 않으면 404가 뜨고, 리턴된다면 fallback 페이지가 뜸</p>
<p><span style="background-color:beige"> <strong>getServerSideProps</strong></span>
:Server Side Rendering 요청시 데이터 불러옴</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/4c49081a-f5b2-4d64-ac6b-73977014ec2d/image.png" alt=""></p>
<p><span style="background-color:whitesmoke" >참고자료🚀: </span></p>
<p>따라하며 배우는 리액트 강의 자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07. React Router]]></title>
            <link>https://velog.io/@oh_bom721/06.-React-Router</link>
            <guid>https://velog.io/@oh_bom721/06.-React-Router</guid>
            <pubDate>Wed, 16 Nov 2022 05:49:13 GMT</pubDate>
            <description><![CDATA[<p><code>따라하는 리액트 강의를 보고 정리하며, 추가적으로 다른 글도 참고해서 정리했습니다:)</code></p>
<h2 id="span-stylebackground-colorskybluereact-router-span"><span style="background-color:skyblue">React Router </span></h2>
<p>router는 SPA를 사용할때 이용됨.</p>
<p>SPA (Single Page Applicatioin)
<code>: 하나의 웹페이지에서 모든 정보를 나타내는 방식</code>
spa의 장점은 필요한 부분만 변경하기 때문에 새로 로드하지 않고 효율적으로 나타낼수 있다는 점이다.<br> 리액트 또한 하나의 index.html 파일을 가지고 있고, 이 템플릿 파일에 JS를 이용하여 다른 컴포넌트를 넣어 페이지를 변경해준다. React Router Dom이 새 컴포넌트로 라우팅, 탐색을 하고 렌더링하는데 도움을 줌.</p>
<h3 id="router-설치-방법">router 설치 방법</h3>
<p>npm install react-router-dom --save</p>
<h3 id="browse-router">Browse Router</h3>
<p>: HTML 5 history API(pushState, replaceState, popstate 이벤트)를 사용하여 ui를 url과 동기화 된 상태 유지해줌</p>
<h3 id="컴포넌트-생성-및-라우트-정의-예시">컴포넌트 생성 및 라우트 정의 예시</h3>
<pre><code>&lt;script&gt;
function App(){
    return(
    &lt;div className=&quot;App&quot;&gt;
    &lt;Routes&gt;
        &lt;Route path=&quot;/&quot; element={&lt;Home/&gt;}&gt; //메인 페이지
        &lt;Route path=&quot;contact&quot; element={&lt;/Contact&gt;}/&gt;
    &lt;/Routes&gt;
    &lt;/div&gt;
    )
    }
&lt;/script&gt;</code></pre><p>-Routes : 개별 경로에 대한 컨테이너 상위 역할, Route로 생성된 자식 컴포넌트 중에서 매칭되는 첫번재 route렌더링
-Route: 단일 경로를 만드는데 사용됨
    <code>-path: 원하는 컴포넌트의 url경로 지정</code>
        <code>이름도 원하는 대로 정할수 있다. &#39;/&#39;가 이름인 컴포넌트는 앱이 로드될때 먼저 렌더링 됨. 즉, 홈구성요소이다.</code>
     <code>-element: 컴포넌트 넣기</code></p>
<p>  위의 코드에 이어 Link를 이용해 경로 이동하는 코드</p>
<pre><code>&lt;script&gt;
import {Link} from &quot;react-router-dom&quot;;
function Home(){
    return(
    &lt;div&gt;
        &lt;Link to=&quot;contact&quot;&gt;contact page&lt;/Link&gt;
    &lt;/div&gt;
    );
   }

   export default Home;
&lt;/script&gt;</code></pre><p>Link 구성 요소는 html에서 a태그와 비슷함.</p>
<h3 id="중첩-라우팅">중첩 라우팅</h3>
<pre><code>&lt;Routes&gt;
    &lt;Route path=&quot;/&quot; element={&lt;App /&gt;}&gt;
        &lt;Route index element={&lt;Home /&gt;} /&gt;
        &lt;Route path=&quot;r1&quot; element={&lt;r1 /&gt;}&gt;
            &lt;Route path=&quot;r2&quot; element={&lt;r2 /&gt;}&gt;
         &lt;/Route&gt;
     &lt;/Route&gt;
 &lt;/Routes&gt; </code></pre><h3 id="outlet">Outlet</h3>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/bd4ab60e-6989-4389-9d17-ac78a876e5da/image.png" alt=""></p>
<p>내가 강의를 들으며 이해한 실행과정은 다음과 같다..</p>
<p>Layout 실행
Layout 안 Nav컴포넌트 실행
Outlet컴포넌트가 아래에 Routes를 가져와 실행
Footer 실행</p>
<h3 id="usenavigate">useNavigate</h3>
<p><code>navigate(&quot;url주소&quot;,{replace:true})</code>
첫번째 인자는 url주소를 두번째 인자는 replace(true or false)를 전달한다. true를 사용하면 navigate에 적힌 url주소로 넘어간 후 뒤로가기를 하면 전 페이지로 돌아오지 못한다. false라면 뒤로가기가 가능하고, false가 기본값이다. </p>
<p>예시 코드</p>
<pre><code>&lt;script&gt;
let navigate=useNavigate();
function handleClick(){
    navigate(&quot;/home&quot;);
    }
    &lt;/script&gt;</code></pre><h3 id="useparams">useParams</h3>
<p><code>현재 url에서 &lt;Route path&gt;와 일치하는 &lt;key,vaule&gt;쌍을 반환해주는 Hooks</code>
<del>이건 나중에 더 공부하고 정리! 아직 잘 모르겠,,ㅜㅜ</del></p>
<h3 id="uselocation">useLocation</h3>
<p><code>사용자가 현재 머물러있는 페이지에 대한 정보를 알려주는 hooks</code>
<img src="https://velog.velcdn.com/images/oh_bom721/post/93ab3169-d327-424a-a0d5-f736b4994ac5/image.png" alt=""></p>
<p> useLocation을 이용하여 location에 선언후, 현재 머무는 페이지의 pathname을 불러와서 출력하면 다음과 같이 뜬다 </p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/c4be4c66-a5f6-48aa-9c5d-aaf766941847/image.png" alt="">
: 메인 페이지에 머물때</p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/0203d78c-e278-421c-b1a4-53efb9d220ec/image.png" alt="">
: search 페이지에 머물때</p>
<br>

<p><span style="background-color:whitesmoke" >참고자료🚀: </span></p>
<p>따라하며 배우는 리액트 강의 자료,
<a href="https://velog.io/@soryeongk/ReactRouterDomV6">https://velog.io/@soryeongk/ReactRouterDomV6</a>
<a href="https://bearcomputer.tistory.com/48">https://bearcomputer.tistory.com/48</a>
<a href="https://hururuek-chapchap.tistory.com/212">https://hururuek-chapchap.tistory.com/212</a></p>
<p>useNavigate:
<a href="https://basemenks.tistory.com/278">https://basemenks.tistory.com/278</a>
<a href="https://padahkim.tistory.com/44">https://padahkim.tistory.com/44</a></p>
<p>useParams:
<a href="https://woong-jae.com/react/220717-useParams-testing">https://woong-jae.com/react/220717-useParams-testing</a>
&lt;&gt;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[06. Debounce, useRef]]></title>
            <link>https://velog.io/@oh_bom721/06.-Debounce-useRef</link>
            <guid>https://velog.io/@oh_bom721/06.-Debounce-useRef</guid>
            <pubDate>Tue, 15 Nov 2022 02:39:14 GMT</pubDate>
            <description><![CDATA[<h2 id="span-stylebackground-colorskyblue--debouncespan"><span style="background-color:skyblue">  Debounce</span></h2>
<p>: 사용자가 미리 결정된 시간 동안 타이핑을 멈출때까지 keyup 이벤트 처리를 지연시켜줌.
UI코드가 모든 이벤트를 처리할 필요가 없고, 서버로 전송되는 API 호출 수도 감소.</p>
<p>예시 코드 : 컴포넌트가 마운트 되는 시점에만 실행하게 하기위한 코드</p>
<pre><code>&lt;script&gt;
export const useDebounce=(value,delay)=&gt;{
    const [debounceValue, setDebounceValue]= useState(value);

    useEffect(()=&gt;{
        setDebounceValue(value)
    },delay);

    return ()=&gt;{
        clearTimeout(handler);
        };

    },[value,delay]);
    return debounceValue;

  }

 const debouncedSearchTerm=useDebounce(query.get(&quot;q&quot;),500);
&lt;/script&gt;

</code></pre><h2 id="span-stylebackground-colorskyblueuseref-span"><span style="background-color:skyblue">useRef </span></h2>
<p>-ref는 불필요한 렌더링을 방지함.
-state는 값이 변경될때마다 렌더링이 되지만, ref는 ref안의 값들을 변경해도 컴포넌트가 렌더링 되지 않는다. 변경하여도 렌더링을 발생시키지 말아야하는 갑값을 다룰때 유용
-JS에서 getElementById하는 것의 기능과 동일.</p>
<p>ref 생성
: useRef를 이용하여 ref객체를 만들고 ,이를 특정 dom에 ref값으로 설정. ref객체의 .current값이 특정 dom을 가리킴</p>
<pre><code>&lt;script&gt;
const ref=usesRef(); //ref생성

// ref.current사용
const listener=(event)=&gt;{
    if(!ref.current || ref.current.contains(event.target)){
        return;
        }
        handler(event);
    }
&lt;/script&gt;</code></pre><p><span style="background-color:whitesmoke" >참고자료🚀: </span>
<a href="https://itprogramming119.tistory.com/entry/React-useRef-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C">https://itprogramming119.tistory.com/entry/React-useRef-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C</a></p>
<p>따라하며 배우는 리액트 강의 자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[05. React Axios]]></title>
            <link>https://velog.io/@oh_bom721/05.-React-Axios</link>
            <guid>https://velog.io/@oh_bom721/05.-React-Axios</guid>
            <pubDate>Thu, 10 Nov 2022 05:10:20 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskyblue-axios-span"><span style="background-color:skyblue"> Axios </span></h3>
<p><code>:브라우저, node.js를 위한 promise API를 활용하는 HTTP 비동기 통신 라이브러리</code></p>
<ul>
<li><p>설치방법:</p>
<pre><code>npm install axios </code></pre><p>터미널에 입력한당</p>
</li>
<li><p>요청 옵션
  -method:get이 기본값,(put, post,patch등 있음)
  -url: 서버주소
  -baseurl:url앞에 붙는 주소로 앞에 공통으로 같은 부분<br>
  ex) url /movieRate이고 baseurl 이 <a href="http://api.themoviedb.org/3">http://api.themoviedb.org/3</a> 라면 
  <a href="http://api.themoviedb.org/3/movieRate%EC%9C%BC%EB%A1%9C">http://api.themoviedb.org/3/movieRate으로</a> 이동
  -params: url parameter(?key=value 로 요청하는 url get방식을 객체로 표현한 것)   </p>
  <br> 

<ul>
<li><p><strong>axios method</strong></p>
<h3 id="span-stylebackground-coloryellow-axios-get-span"><span style="background-color:yellow"> <strong>axios get</strong> </span></h3>
<p><code>: 단순 데이터를 요청할 경우, 파라미터 데이터를 포함시키는 경우</code></p>
<pre><code>&lt;script&gt;
const axios=require(&#39;axios&#39;);
axios.get(&#39;/user?ID=721)
.then(function(response)){
//성공시 실행 함수
console.log(response);
})
.catch(functioin(error){
console.log(error);
})
.finally(function(){
//항상 실행되는 함수
});
</code></pre></li>
</ul>
</li>
</ul>
<p>//위와 같은 예시
axios.get(&#39;/user&#39;,{
params:{
ID:721}})
.then~~뒤에서 부턴 동일
</script></p>
<pre><code>
###       &lt;span style=&quot;background-color:yellow&quot;&gt; **axios post** &lt;/span&gt;

   `: 데이터를 message body에 포함시켜 보내는 방법`
</code></pre><script>

axios.post("url",{
    firstName:"bom",
    lastName:"oh"})
    .then(function(response)){
    })
    .catch(function(error){
    })
</script>
<pre><code>
###       &lt;span style=&quot;background-color:yellow&quot;&gt; **axios delete** &lt;/span&gt;

   `: 일반적으로 body가 비어있다. DB에 저장되있는 내용을 삭제하는 목적으로 사용함`
</code></pre><script>
    axios.delete(`/user?ID=721)
    .then(~~위와동일)


    //더 많은 정보를 담아야 할때는 두번째 인자에 data를 추가해줄수 있다.
    axios.delete('/user?ID=721',{
        data:{
        firstName:"bom",
        lastName:"oh"
        }
        })
        .then~~
</script>

<pre><code>
###       &lt;span style=&quot;background-color:yellow&quot;&gt; **axios put** &lt;/span&gt;
`: DB에 저장되있는 내용을 갱신하는 목적, 내부적으로 get-&gt;post과정을 거침`
</code></pre><script>
    axios.put("url",{
        userName:"bom"})
        .then~~
</script>
<pre><code>

+ axios 인스턴스화
: 중복되는 부분을 계속 입력하지 않기 위해 사용

</code></pre><p>//axios.js</p>
<script>
import axios from "axios";
const instance=axios.create({
    baseURL:"",
    params:{
        api_key:
        language:"ko-KR"
        },});

 export default instance;
</script>
<pre><code></code></pre><p>//requests.js</p>
<script>
const requests={
    fetchNowPlaying:`/movie/now_playing`,
    fetchNetflixOriginals:`/discover/tv?with_networkds=213`,
    fetchTrending:`/trending/all/week`,
    fetchTopRated:`/movie/top_rated`,
}

export default requests;
</script>
<pre><code></code></pre><p>//axios  이용하여 현재 상영중인 영화불러오기
const request=axios.get(requests.fetchNowPlaying);</p>
<pre><code>





&lt;span style=&quot;background-color:whitesmoke&quot; &gt;참고자료🚀: &lt;/span&gt;
&lt;https://inpa.tistory.com/entry/AXIOS-%F0%9F%93%9A-%EC%84%A4%EC%B9%98-%EC%82%AC%EC%9A%A9#Axios_%EB%8B%A8%EC%B6%95_%EB%A9%94%EC%86%8C%EB%93%9C&gt;(정말 감사합니다..🧡)

따라하며 배우는 리액트 강의 자료</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[04. React useCallBack(), useMemo()]]></title>
            <link>https://velog.io/@oh_bom721/04.-React-useCallBack-useMemo</link>
            <guid>https://velog.io/@oh_bom721/04.-React-useCallBack-useMemo</guid>
            <pubDate>Mon, 07 Nov 2022 01:22:02 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskyblue-usecallback-span"><span style="background-color:skyblue"> useCallBack() </span></h3>
<p><code>const memoizedCallback = useCallback(fn(함수),deps(배열));</code>
:<code>memoization 된 callback 리턴</code></p>
<pre><code>memoization 이란?
:메모이제이션은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 
이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술</code></pre><p>첫번째 인자인 함수를 저장후, 두번째 인자인 의존성 배열 값 변경시 함수를 새로 생성</p>
<p>useCallBack 사용 전: 컴포넌트 렌더링 마다 새로운 함수가 생성
useCallBack 사용 후 : 컴포넌트 렌더링이 되더라도 의존성 배열 값이 변경되지 않는한 기존 함수 재사용</p>
<p>예시코드
<img src="https://velog.velcdn.com/images/oh_bom721/post/e7fce4bc-cca7-429e-9b79-0742db48eb29/image.png" alt=""></p>
<ul>
<li>의존성 배열에 아무것도 없다면, 컴포넌트 최초 렌더링 시에만 함수가 생성되고 그 후에는 동일한 참조값을 사용하는 함수가 됨.</li>
<li>의존성 배열이 콜백에 인자로 전달되지는 않지만, 콜백안에서 참조되는 모든 값은 의존성 값의 배열에 나타나야 한다.<del>(살짝 이해가 될듯말듯..? 더 공부하면서 깨달아보자,,)</del></li>
</ul>
<p><span style="background-color:whitesmoke" >참고자료🚀: </span>
<a href="https://www.daleseo.com/react-hooks-use-callback/">https://www.daleseo.com/react-hooks-use-callback/</a>
<a href="https://ko.reactjs.org/docs/hooks-reference.html#usecallback">https://ko.reactjs.org/docs/hooks-reference.html#usecallback</a>
<a href="https://devbirdfeet.tistory.com/134">https://devbirdfeet.tistory.com/134</a>
따라하며 배우는 리액트 강의자료</p>
<h3 id="span-stylebackground-colorskyblue-usememo-span"><span style="background-color:skyblue"> useMemo() </span></h3>
<p><code>const memoizedValue = useMemo(()=&gt;fn,deps);</code>
:<code>memoization 된 값 리턴</code></p>
<p>첫번재 인자인 fn은 결과값을 생성해주는 함수이고, deps는 재사용의 여부를 결정하는 의존성배열.
의존성배열의 변경시에만 메모이제이션된 값 다시 계산.</p>
<p>예시코드</p>
<pre><code>const z=useMemo(()=&gt;compute(x,y),[x,y]);</code></pre><p><del>실제론 생각보다 많이 안쓴대요..?</del></p>
<p><span style="background-color:whitesmoke" >참고자료🚀: </span>
<a href="https://www.daleseo.com/react-hooks-use-memo/">https://www.daleseo.com/react-hooks-use-memo/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[03. React Dom]]></title>
            <link>https://velog.io/@oh_bom721/03.-React-Dom</link>
            <guid>https://velog.io/@oh_bom721/03.-React-Dom</guid>
            <pubDate>Sun, 06 Nov 2022 16:21:42 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskyblue-dom-span"><span style="background-color:skyblue"> DOM? </span></h3>
<p><strong>D</strong>ocument <strong>O</strong>bject <strong>M</strong>odel
:문서 객체로 html 문서에 js가 접근할 수 있도록 html태그들을 객체로 만든 것
<img src="https://velog.velcdn.com/images/oh_bom721/post/c5893cd2-25d4-4908-815c-ca35dd1fabb5/image.png" alt=""></p>
<p>우리가 열심히 짠 js코드들이 html에 접근할 때 dom 객체를 통해 인식이 가능하다.</p>
<p><code>문제는 DOM은 변경사항이 있을때마다 re-rendering을 한다.</code> <br><code>즉, 속도가 느려질수밖에 없다.</code></p>
<p>➡➡ <strong>Virtual DOM</strong>의 등장</p>
<ol>
<li>변경사항 시 virtual dom에 re-rendering</li>
<li>virtual dom 끼리 비교</li>
<li>변경 사항 만 실제 DOM에 적용</li>
</ol>
<p>그런데 다른 글들을 찾아보다 보니..<br>
virtual dom을 사용하는게 대부분의 상황에서 빠르진 않대요,,?<br>그냥 나쁘지 않은 정도인것 같다..<del>(자세한건 참고자료 두번째 링크</del>)<del>~
어쨌든 변경사항들을 가상돔(virtual dom)에 모았다가 DOM에 한번에 보내는 기술이다</del> 성</p>
<p><span style="background-color:whitesmoke" >참고자료🚀: </span>
<a href="https://devbirdfeet.tistory.com/219">https://devbirdfeet.tistory.com/219</a>
<a href="https://velog.io/@woohm402/virtual-dom-and-react">https://velog.io/@woohm402/virtual-dom-and-react</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[02. React Hooks(useState, useEffect)]]></title>
            <link>https://velog.io/@oh_bom721/React-HooksuseState-useEffect</link>
            <guid>https://velog.io/@oh_bom721/React-HooksuseState-useEffect</guid>
            <pubDate>Sun, 06 Nov 2022 14:06:44 GMT</pubDate>
            <description><![CDATA[<h3 id="span-stylebackground-colorskyblue-react-hooks-span"><span style="background-color:skyblue"> React Hooks </span></h3>
<ul>
<li>react hooks 도입배경
<code>함수형 컴포넌트에서 state와 생명주기를 이용가능하게 해줌! class없이 react사용 가능!</code></li>
</ul>
<h3 id="span-stylebackground-coloryellow--usestatespan"><span style="background-color:yellow">  useState</span></h3>
<p>hook을 호출하여 함수 컴포넌트 안에 state를 추가
state는 컴포넌트가 다시 렌더링 되더라도 그대로 유지됨.</p>
<p><strong>사용방법</strong></p>
<blockquote>
</blockquote>
<p>const [state,setState]=useState(&#39;초기값&#39;);</p>
<p>현재의 state값과, 이 값을 업데이트 하는 함수를 동시에 제공</p>
<p><br>예시코드</p>
<pre><code>&lt;script&gt;
import React, { useState } from &#39;react&#39;;

function Example() {
  // &quot;count&quot;라는 새 상태 변수를 선언합니다
  const [count, setCount] = useState(0);

  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}
&lt;/script&gt;</code></pre><h3 id="span-stylebackground-coloryellow--useeffectspan"><span style="background-color:yellow">  useEffect</span></h3>
<p>useEffect를 사용하여 react에게 컴포넌트 렌더링 후 어떤일을 수행해야할지 지정.<br>리액트는 우리가 넘긴 함수(effect)를 기억 한 후 DOM업데이트 이후 불러냄.<BR> effects는 컴포넌트 안에 선언되어 있기 때문에, props와 state에 접근 가능. 렌더링 이후에 effects실행!
  vsc에 effect 치면 나오는 &#39;useEffectSnippet이용하면 기본 틀 자동 생성!
  <img src="https://velog.velcdn.com/images/oh_bom721/post/24cba558-0120-465c-ad52-465e7b011b26/image.png" alt=""></p>
 <br>

<ul>
<li>리액트가 DOM업데이트 후 문서의 타이틀을 바꾸는 컴포넌트 예시 코드</li>
</ul>
<pre><code>&lt;script&gt;
import React, { useState, useEffect } from &#39;react&#39;;

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() =&gt; {
    // 브라우저 API를 이용해 문서의 타이틀을 업데이트합니다
    document.title = `You clicked ${count} times`;
  });

  return (
    &lt;div&gt;
      &lt;p&gt;You clicked {count} times&lt;/p&gt;
      &lt;button onClick={() =&gt; setCount(count + 1)}&gt;
        Click me
      &lt;/button&gt;
    &lt;/div&gt;
  );
}
  &lt;/script&gt;</code></pre><p>  -effect 해제 하는 함수가 포함된 코드(effect 해제는 선택적) return 부분에 effect해제 함수를 적으면 됨</p>
<pre><code>  &lt;script&gt;
  import React, { useState, useEffect } from &#39;react&#39;;

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  function handleStatusChange(status) {
    setIsOnline(status.isOnline);
  }

  useEffect(() =&gt; {
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () =&gt; {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

  &lt;/script&gt;</code></pre>  <br>




<p><span style="background-color:whitesmoke" >참고자료🚀:</span></p>
<p><a href="https://ko.reactjs.org/docs/hooks-overview.html">Hook 개요</a>,
<a href="https://ko.reactjs.org/docs/hooks-effect.html">Using the Effect Hook</a>,</p>
<p>따라하며 배우는 리액트 강의 자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[01. React component, 생명주기, props, state ]]></title>
            <link>https://velog.io/@oh_bom721/01.-React-component-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-props-state</link>
            <guid>https://velog.io/@oh_bom721/01.-React-component-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-props-state</guid>
            <pubDate>Sun, 06 Nov 2022 13:53:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 5주차 🐬 내용정리
-React to-do앱 만들기(따라하며 배우는 리액트 2~3강)</p>
</blockquote>
<h2 id="react">React</h2>
<h3 id="span-stylebackground-colorskyblue-react-component-span"><span style="background-color:skyblue"> React Component </span></h3>
<p><code>리액트 컴포넌트는 리액트로 만들어진 앱을 이루는 최소한의 단위로, 사용자에게 보여지는 UI요소를 컴포넌트 단위로 구분하여 구현한다.</code></p>
<p> <span style="background-color:yellow"> <strong>1. Class Component 클래스형 컴포넌트</strong> </span></p>
<ul>
<li>class로 정의하고 render()함수에서 jsx 코드를 반환
(jsx는 js의 확장 문법으로 리액트에서 화면에서 UI가 보는 모습을 나타내줌. 자세한 내용은 !!! 링크 참고)<br>
+ state, 리액트 생명주기를 모두 포함함




</li>
</ul>
<p><span style="background-color:yellow"> <strong>2. Functional Component 함수형 컴포넌트</strong> </span></p>
<ul>
<li>function으로 정의하고 return 문에 jsx코드 반환
(arrow function 이용하여 정의 가능)</li>
<li>react hooks가 등장한 후로는 functional component에서도  state와 생명주기의 사용이 가능함.</li>
</ul>
<hr>
<p><strong>잠깐! JSX란..?</strong></p>
<p><img src="https://velog.velcdn.com/images/oh_bom721/post/feb24d2b-10bd-4e75-8f69-533df7424142/image.png" alt=""></p>
<p><code>자바스크립트 확장 문법으로, JavaScript에 xml을 추가한 것. 하나의 파일에 js와 html을 동시에 작성 가능</code></p>
<hr>
<blockquote>
<p>함수형 컴포넌트의 장점 vs class 컴포넌트
1.짧고 간결 2. 더 빠르다 3. 가독성이 더 좋다</p>
</blockquote>
<br>
<span style="background-color:whitesmoke" >참고자료🚀:</span>


<p><a href="https://chanhuiseok.github.io/posts/react-4/">https://chanhuiseok.github.io/posts/react-4/</a>,
<a href="https://goddaehee.tistory.com/299">https://goddaehee.tistory.com/299</a>,</p>
<p>따라하며 배우는 리액트 강의 자료 </p>
<h3 id="span-stylebackground-colorskyblue-react-생명주기lifecycle-span"><span style="background-color:skyblue"> React 생명주기(lifecycle) </span></h3>
<p>component가 렌더링 되기 위해 준비하는 과정부터 제거될때 까지의 과정
<img src="https://velog.velcdn.com/images/oh_bom721/post/3199ab6f-4b1f-4637-ae6b-82d5c7cead41/image.png" alt=""></p>
<ul>
<li>Did는 해당 시점이 끝난 후, will은 해당 시점 직전에  method실행을 의미</li>
</ul>
<ol>
<li><p>Mounting : 컴포넌트 인스턴스가 mount(생성)되고 dom에 삽입 되는 과정</p>
</li>
<li><p>Updating: props 또는 state 변경, 부모 컴포넌트의 re-rendering 등으로 인해 컴포넌트 업데이트 발생시 진행되는 과정</p>
</li>
<li><p>Unmounting: 컴포넌트가 dom상에서 unmount(제거)되는 과정</p>
</li>
</ol>
<br>
<span style="background-color:whitesmoke" >참고자료🚀:</span>


<p><a href="https://talking-potato.me/51">https://talking-potato.me/51</a>,
따라하며 배우는 리액트 강의 자료</p>
<h3 id="span-stylebackground-colorskyblue-react-props-span"><span style="background-color:skyblue"> React Props </span></h3>
<p><code>:props는 properties의 줄임말</code>
<code>- 상속하는 부모 컴포넌트로부터 자식 컴포넌트에게 데이터를 전달하는 방법</code>
<code>- props는 읽기전용(immuatable)로 자녀 컴포넌트에서는 변경 x, 변경하기 위해서는 부모 컴포넌트에서 변경해야함</code></p>
<h4 id="예시-코드">예시 코드</h4>
<p><strong>app.js</strong>
<code>:Form 컴포넌트에 handlesubmit,value,setValue props 내려주기</code></p>
<pre><code>&lt;Form handleSubmit={handleSubmit} value={value},setValue={setValue}&gt;</code></pre><p><strong>Form.js</strong>
<code>:props로 필요한 데이터 함수 가져오기</code></p>
<pre><code>function Form({handleSubmit,value,setValue}){...}</code></pre><h3 id="span-stylebackground-colorskyblue-react-state-span"><span style="background-color:skyblue"> React State </span></h3>
<p><code>:리액트에서 component 내부에서 가지고 있는 값.</code> <br><code>- state가 변경가능(mutable)</code>
<code>- state 변경시 component는 re-rendering됨.</code></p>
<p><em><strong>함수형 컴포넌트의 Hooks를 이용한 사용 방법</strong></em></p>
<blockquote>
</blockquote>
<p>const [state,setState]=useState(&#39;초기값&#39;);</p>
<p>예시코드(강의 코드)</p>
<pre><code>
&lt;script&gt;

import React,{useState} from &#39;react&#39;;

export default function Banner(){
    const [isClicked,setIsClicked]=useState(false);
}

if(!isClicked){
    //...다른 코드들
    &lt;button className=&quot;play_button&quot; onClick={()=&gt;setIsClicked(true)}&gt;play&lt;/button&gt;
}
&lt;/script&gt;</code></pre><p>위의 코드를 통해 state의 값을 setState를 이용하여 변경하는 방법을 알수 있다.</p>
<br>
<span style="background-color:whitesmoke" >참고자료🚀:
따라하며 배우는 리액트 강의 자료,</span>

<p><a href="https://songzzi.github.io/2021/11/21/react-2/">https://songzzi.github.io/2021/11/21/react-2/</a></p>
<p>더 자세한 hook과 useState에 관한 내용은 다음 글에서,,!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[00. 리액트 공부 시작]]></title>
            <link>https://velog.io/@oh_bom721/00.-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%B5%EB%B6%80-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@oh_bom721/00.-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EA%B3%B5%EB%B6%80-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Sun, 06 Nov 2022 13:52:48 GMT</pubDate>
            <description><![CDATA[<p>인프런에서 js기본강의 완강 후 리액트 강의를 듣기 시작했다. <br>&#39;따라하며 배우는 리액트 a-z&#39;라는, John Ahn 선생님의 강의이다. to-do 앱 만들기, netflix 앱 만들기 등을 실습해 보며 리액트에 대해 배운당.. <br>처음에 todo 앱 만들때까지는 처음보는 것 투성이라 어지럽기만했는데, netflix앱 만들기때부턴 점점 적응이 되어서 이제야 좀 리액트에 눈이 떠진것 같다..
그리고 눈이 떠지고 나니 재밌다..^^ 강의듣고 몰랐던 내용들 열심히 정리해 봐야징 가보자고 💨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[04-4. HTML을 위한 JavaScript with 자바스크립트 제대로 배워볼래?(Section 04)]]></title>
            <link>https://velog.io/@oh_bom721/04-4.-HTML%EC%9D%84-%EC%9C%84%ED%95%9C-JavaScript-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-04</link>
            <guid>https://velog.io/@oh_bom721/04-4.-HTML%EC%9D%84-%EC%9C%84%ED%95%9C-JavaScript-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-04</guid>
            <pubDate>Sat, 22 Oct 2022 06:45:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 4주차 🐬
-JS 강의 섹션4 (HTML을 위한 자바스크립트)까지 듣기</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<h2 id="section-04-html을-위한-js">Section 04. HTML을 위한 JS</h2>
<h3 id="span-stylebackground-colorskyblue1-html-element-control--span"><span style="background-color:skyblue">1. HTML element control  </span></h3>
<pre><code> &lt;button type=&quot;button&quot; onclick=&quot;doSave();&quot;&gt;Save&lt;/button&gt;</code></pre><pre><code>&lt;script&gt;
function doSave(){
            console.log(&quot;doSave&quot;);

            var oText1=document.getElementById(&quot;text1&quot;); //하나만 가져옴
            //id는 유일한 하나의 값이니까 element 하나만 가져옴

            console.log(oText1.value);

            var textValue=oText1.value;

           var oText2=document.querySelector(&quot;#text1&quot;);
            console.log(oText2);

            var oCheckbox=document.getElementsByName(&quot;chk_interest&quot;);
            console.log(oCheckbox);
            //Name은 같은거가 여러개일수도 있으니까 elements 인거임


            //방법 1
             for(var i=0;i&lt;oCheckbox.length;i++){
                 if(oCheckbox[i].checked){
                     console.log(oCheckbox[i].value);
                 }
             }

            //방법 2

           var oCheckbox2=document.querySelectorAll(&quot;[name=chk_interest]:checked&quot;);
           //selectorAll 은 배열형태로 리턴
            console.log(oCheckbox2);

           //selector는 하나의 객체만 리턴
           var oRadio=document.querySelector(&quot;[name=radio_email_yn]:checked&quot;);

           console.log(oRadio);

           var oSelect=document.getElementById(&quot;select1&quot;);
           console.log(oSelect.value);

           var oSelect=document.getElementById(&quot;select1&quot;);
           console.log(document.getElementById(&quot;div1&quot;).innerText);

           console.log(document.getElementsByTagName(&quot;div&quot;));
        }&lt;/script&gt;</code></pre><h3 id="span-stylebackground-colorskyblue2-html-event-control--span"><span style="background-color:skyblue">2. HTML event control  </span></h3>
<pre><code>  &lt;input type=&quot;text&quot; id=&quot;text1&quot; onfocus=&quot;doFocus();&quot; onblur=&quot;doBlur(this);&quot;&gt;
    &lt;br&gt; 
    &lt;select id=&quot;select1&quot; onchange=&quot;doChange();&quot;&gt;
        &lt;option value=&quot;KO&quot;&gt;korea&lt;/option&gt;
        &lt;option value=&quot;UK&quot;&gt;UK&lt;/option&gt;
        &lt;option value=&quot;US&quot;&gt;US&lt;/option&gt;

    &lt;/select&gt;

       &lt;input type=&quot;text&quot; id=&quot;text2&quot; onkeydown=&quot;doKeydown(event);&quot;&gt;
    &lt;button type=&quot;button&quot; onclick=&quot;doSearch()&quot;&gt;조회&lt;/button&gt;
    &lt;br&gt;
    &lt;button onclick=&quot;doSave();&quot;&gt;click&lt;/button&gt;</code></pre><pre><code>&lt;script&gt;
        function doFocus(){
            console.log(&quot;doFocus&quot;);

        }

        function doBlur(obj){
            if(obj.value==&quot;&quot;){
                alert(&quot;필수값이니까 반드시 입력 ㄱ&quot;);
            }

            console.log(obj.value);
        }

        function doChange(){
            var selectedValue=document.getElementById(&quot;select1&quot;).value;
            console.log(selectedValue);
        }

        function doSearch(){
            //enter키 누르면 조회 일어나지요
            console.log(&quot;조회를 시작합니다&quot;);

        }



        function doKeydown(event){
            if(event.keyCode==13){
                doSearch(); //엔터를 입력하면 doSearch를 시작해라
            }
            console.log(event);
        }
        function doSave(){
            console.log(&quot;doSave&quot;);
        }
    &lt;/script&gt;</code></pre><h3 id="span-stylebackground-colorskyblue3-html-style-control--span"><span style="background-color:skyblue">3. HTML style control  </span></h3>
<pre><code>&lt;head&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;style&gt;
        .border-red{
            border:4px dashed red;

        }

        .border-green{
            border:4px solid green;
        }

        .border-default{
            border-width:1px;
            border-color:blue;
            border-style:solid;
        }


    &lt;/style&gt;
&lt;/head&gt;</code></pre><pre><code> &lt;input type=&quot;text&quot; id=&quot;text1&quot; onblur=&quot;changeBorder();&quot;&gt;

    &lt;br&gt;radio(email):
    &lt;br&gt;
    &lt;label&gt;
        &lt;input type=&quot;radio&quot; name=&quot;radio_email_yn&quot; value=&quot;y&quot; onclick=&quot;showEmail();&quot;&gt;agree
    &lt;/label&gt;

    &lt;label&gt;
        &lt;input type=&quot;radio&quot; name=&quot;radio_emil_yn&quot; value=&quot;N&quot; onclick=&quot;hideEmail();&quot; checked&gt; deny
        &lt;div id=&quot;divEmail&quot; style=&quot;display:none;&quot;&gt;email&lt;input type=&quot;text&quot; id=&quot;email&quot;&gt;&lt;/div&gt;

    &lt;/label&gt;

    &lt;br&gt;  Select:  
    &lt;br&gt;
    &lt;select id=&quot;select1&quot; onchange=&quot;doChange(this);&quot;&gt;
        &lt;option value=&quot;Ko&quot;&gt;Korea&lt;/option&gt;
        &lt;option value=&quot;US&quot;&gt;US&lt;/option&gt;
        &lt;option value=&quot;UK&quot;&gt;UK&lt;/option&gt;


    &lt;/select&gt;

    &lt;select id=&quot;select2&quot; style=&quot;display:none;&quot;&gt;
        &lt;option value=&quot;Ko&quot;&gt;seoul&lt;/option&gt;
        &lt;option value=&quot;US&quot;&gt;busan&lt;/option&gt;
        &lt;option value=&quot;UK&quot;&gt;jeju&lt;/option&gt;


    &lt;/select&gt;

    &lt;button type=&quot;button&quot; onclick=&quot;doSave();&quot;&gt;save&lt;/button&gt;</code></pre><h3 id="span-stylebackground-colorskyblue4-data-table-span"><span style="background-color:skyblue">4. data table </span></h3>
<pre><code>  &lt;input type=&quot;text&quot; id=&quot;searchTxt&quot; onkeydown=&quot;checkEnter(event);&quot;&gt; 
  &lt;button type=&quot;button&quot; onclick=&quot;doSearch();&quot;&gt;조회&lt;/button&gt;
  &lt;table id=&quot;tb&quot;&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th onclick=&quot;doSort(&#39;name&#39;);&quot;&gt;name&lt;/th&gt;
        &lt;th onclick=&quot;doSort(&#39;email&#39;);&quot;&gt;email&lt;/th&gt;
        &lt;th onclick=&quot;doSort(&#39;company&#39;);&quot;&gt;company&lt;/th&gt;
        &lt;th onclick=&quot;doSort(&#39;address&#39;);&quot;&gt;address&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;&lt;/tbody&gt;
  &lt;/table&gt;
</code></pre><pre><code>  &lt;script&gt;
    var currentData = [];
    function doSort(key) {
      currentData.sort(function(a,b){
        return a[key]&gt;b[key]? 1: a[key]&lt;b[key]?-1 : 0;
      });

      renderTable(currentData);
    }

    function checkEnter(event) {
      if(event.keyCode == 13) {
        doSearch();
      }
    }

    function doSearch() {
      var searchText = document.getElementById(&quot;searchTxt&quot;).value;


      if(searchText == &quot;&quot;) {
        currentData = userList;
        renderTable(userList);
      }else {
        // /pattern/gi
        var regExp = new RegExp(searchText,&quot;i&quot;);
        var data = userList.filter(item =&gt; {
          if(regExp.test(item.name)) {
            return true;
          }else if(regExp.test(item.email)) {
            return true;
          }else if(regExp.test(item.company)) {
            return true;
          }else if(regExp.test(item.address)) {
            return true;
          }else {
            return false;
          }
        });

        currentData = data;

        renderTable(data);
      }
    }

    function renderTable(data) {
      var h = [];
      data.forEach(item =&gt; {
        h.push(`&lt;tr&gt;`);
        h.push(`&lt;td&gt;${item.name}&lt;/td&gt;`);
        h.push(`&lt;td&gt;${item.email}&lt;/td&gt;`);
        h.push(`&lt;td&gt;${item.company}&lt;/td&gt;`);
        h.push(`&lt;td&gt;${item.address}&lt;/td&gt;`);
        h.push(`&lt;/tr&gt;`);
      });

      document.querySelector(&quot;#tb&gt;tbody&quot;).innerHTML = h.join(&quot;&quot;);
    }

  &lt;/script&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[04-3. JavaScript 고급문법(error, Regular Expression 정규식) with 자바스크립트 제대로 배워볼래?(Section 03)]]></title>
            <link>https://velog.io/@oh_bom721/04-2.-JavaScript-%EA%B3%A0%EA%B8%89%EB%AC%B8%EB%B2%95-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-03-1hlbddy1</link>
            <guid>https://velog.io/@oh_bom721/04-2.-JavaScript-%EA%B3%A0%EA%B8%89%EB%AC%B8%EB%B2%95-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-03-1hlbddy1</guid>
            <pubDate>Mon, 17 Oct 2022 11:33:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 4주차 🐬
-JS 강의 섹션3 (자바스크립트 고급 문법)까지 듣기</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<h2 id="section-03-자바스크립트-고급-문법">Section 03. 자바스크립트 고급 문법</h2>
<h3 id="span-stylebackground-colorskyblue15try-catch-finally-span"><span style="background-color:skyblue">15.try-catch-finally </span></h3>
<p>try-catch-finally 역시 class와 마찬가지로 다른언어에서도 사용되는 개념이다.</p>
<ul>
<li>try문을 실행후 error발생시 catch에서 잡고, 모든 작업이 끝난 후에는 error발생 유무와 상관없이 finally를 실행</li>
</ul>
<pre><code>var x=21;
try{
if(x==&quot;&quot;) throw &quot;empty&quot;;
var y=x+1;
console.log(y);
} catch(err){
console.log(`x is ${err}`);
}finally{
console.log(&quot;try/catch문 마지막에 반드시 실행&quot;);
}</code></pre><ul>
<li><p>x가 null인 경우
<img src="https://velog.velcdn.com/images/oh_bom721/post/bf86250d-c2fc-4f2b-944b-20d07185524c/image.png" alt=""></p>
</li>
<li><p>x에 숫자가 올바르게 입력된 경우
<img src="https://velog.velcdn.com/images/oh_bom721/post/449f3a65-b167-4b48-9939-aa0f76e98da2/image.png" alt=""></p>
</li>
</ul>
<h3 id="span-stylebackground-colorskyblue16-strict-modespan"><span style="background-color:skyblue">16. strict mode</span></h3>
<pre><code> x=3.14;
 console.log(x);</code></pre><p>위의 코드처럼 변수선언을 안한채 사용하면 문법적인 문제가 있지만, js는 초기에 허용을 해줬다.
하지만!! 더 꼼꼼히 코드 구현을 하고 싶다면</p>
<pre><code>&quot;use strict&quot;; 
x=7;
console.log(x);</code></pre><p>이렇게 &quot;use strict&quot;선언해주면 이제 저 코드는 error가 뜬다.</p>
<pre><code>function myFunction(){
&quot;use strict&quot;;
}
//특정 함수 내에서만 쓰고싶다면 거기에만 넣어도됨.</code></pre><h3 id="span-stylebackground-colorskyblue17-regular-expression-정규식span"><span style="background-color:skyblue">17. Regular Expression 정규식</span></h3>
<ul>
<li><p>기본 모양
patt= <strong><span style="color:red">/</span>world<span style="color:red">/</span><span style="color:blue">i</span></strong>
&#39;/ /&#39;안에 검색할 내용, world-패턴, i- modifier</p>
</li>
<li><p>i의 역할</p>
<pre><code>var str=&quot;hello WORLD&quot;;
</code></pre></li>
</ul>
<p>console.log(str.search(&quot;world&quot;);// -1출력
// 대소문자가 다르기때문에 -1출력</p>
<p>console.log(str.search(/world/i));
// 6 출력(i는 대소문자 상관없이 검색가능)</p>
<pre><code>
+ g의 역할</code></pre><p>var str=&quot;hi world world&quot;;</p>
<p>console.log(str.replace(/world/i,&quot;ohoh&quot;));
//hi ohoh world 출력</p>
<p>console.log(str.replace(/world/g,&quot;bombom&quot;));
//hi bombom bombom 출력(g는 global의 약자, g는 모든 world를 다 bombom으로 바꿈</p>
<pre><code>+ [abc]: a나 b나 c가 있는 문자 다 찾기</code></pre><p>var str=&quot;Is this all there is&quot;;</p>
<p>var patt=/[hat]/g; //h나 a나 t 있는 문자 다 찾기
console.log(str.match(patt));
//[&#39;t&#39;, &#39;h&#39;, &#39;a&#39;, &#39;t&#39;, &#39;h&#39;]출력</p>
<pre><code>
+ [0-9]: 0부터 9까지 모든 수 찾기</code></pre><p>var str=&quot;123wowthing777&quot;;
console.log(str.match(/[0-9]/g);</p>
<p>//[&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;7&#39;, &#39;7&#39;, &#39;7&#39;]출력</p>
<pre><code>
+ (a|b): a 또는 b(a or b)</code></pre><p>var str=&quot;red, green, blue, re,green,red,gree,yellow&quot;;</p>
<p>console.log(str.match(/(red|green)/g;</p>
<p>// [&#39;red&#39;, &#39;green&#39;, &#39;green&#39;, &#39;red&#39;] 출력</p>
<pre><code>
+ \d: 숫자찾기 [0-9]와 동일
</code></pre><p>var str=&quot;give 721&quot;;
console.log(str.match(/\d/g));
//[&#39;7&#39;, &#39;2&#39;, &#39;1&#39;] 출력 </p>
<pre><code>
+ \s 공백 찾기
&lt;br&gt;
+ \b 
</code></pre><p>var str=&quot;helloooo&quot;;
console.log(str.match(/\blo/g);</p>
<p>//[&#39;oo&#39;] 출력</p>
<pre><code>
+ n+: n이 최소한 1개 이상</code></pre><p>var str=&quot;ohbom bom bom bo&quot;
console.log(str.match(/bom+/g));
//[&#39;bom&#39;, &#39;bom&#39;, &#39;bom&#39;] 출력</p>
<pre><code>
+ n*: 0개 혹은 여러개 가능 
</code></pre><p>var str=&quot;hellooo world&quot;;</p>
<p>console.log(str.match(/lo*/g));
//l또는 lo,loo.... 찾기
//[&#39;l&#39;, &#39;looo&#39;, &#39;l&#39;] 출력</p>
<pre><code>
o는 0개여도 상관 없고, 여러개 여도 상관없다.
l이 무조건있지만 o는있어도 되고 없어도됨

+ n?: 0개 혹은 1개</code></pre><p>var str=&quot;1, 100 or 5010000&quot;;
console.log(str.match(/10?/g));
//0은 0개이거나 1개까지만 있는지 확인
//[&#39;1&#39;, &#39;10&#39;.&#39;10&#39;] 출력</p>
<pre><code>
5010000를 보면 딱 10까지만 찾고 리턴하는거 찾을 수 있음. 만약 &quot;/10*/&quot; 였다면 10000을 리턴했을 것이다.

이 점이 &#39;*&#39;와 ?의 차이!!

+ w3schools.com 사이트에 정규식 잘 나와있으니 참고~

#### &lt;span style=&quot;background-color:yellow&quot;&gt;실무 사용예시&lt;/span&gt;

+ &lt;strong&gt;1.우편번호 5자리가 모두 숫자임을 확인할때&lt;/strong&gt;

```var patt=/^\d{5}$/;```

^/d: 반드시 숫자로 시작해라
d{5}:숫자 5개
$:앞에꺼로 마치겠다!(즉 여기선 숫자5개로 마치겠다) 
</code></pre><p>var postalCode=&quot;p01174&quot;;
var postalCode2=&quot;32334&quot;;</p>
<p>//test는 정규식 내장함수이므로 patt.test()으로 실행
console.log(patt.test(postalCode)); //false
console.log(patt.test(postalCode2)); //true</p>
<pre><code>
+ &lt;strong&gt;2. 전화번호 확인&lt;/strong&gt;

```var patt=/^(010)-\d{4}-\d{4}$/;```

^(010): 반드시 010으로 시작
- 숫자4자리 - 숫자4자리 로 끝난다.
</code></pre><p>var tel=&quot;010-1234-5678&quot;;
console.log(patt.test(tel));
//true </p>
<pre><code>+ &lt;strong&gt;3. 이메일 주소 확인 ☪&lt;/strong&gt;

```var patt=/^\w+([\.-]?\w+)*@\w+(\.\w{2,3})+$/;```

^w+: 하나이상의 문자열로 시작
[\.-]?: 
    [\.-]는 .이나-가 있는지 찾기
    [\.-]?는 .이나-가 있어도 되고 없어도됨

/w+: 다시 하나이상의 문자열로 시작
([\._]?\w+)*: ([\._]?\w+)가 있어도 되고 없어도됨

@\w+ : @후 문자 한개이상 오기
(\.\w{2,3}): . 이후에 2개 혹은 3개의문자가 옴.
(\.\w{2,3})+: (\.\w{2,3})가 1개이상
$: 종료,,

~~와 어려워,,~~
</code></pre><p> console.log(patt.test(&quot;<a href="mailto:wowthing@gmail.com">wowthing@gmail.com</a>&quot;));//true<br> console.log(patt.test(&quot;<a href="mailto:hw.go@gmail.co.kr">hw.go@gmail.co.kr</a>&quot;));//true</p>
<pre><code>








</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[04-2. JavaScript 고급문법(promise, async await, module 등) with 자바스크립트 제대로 배워볼래?(Section 03)]]></title>
            <link>https://velog.io/@oh_bom721/04-2.-JavaScript-%EA%B3%A0%EA%B8%89%EB%AC%B8%EB%B2%95-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-03</link>
            <guid>https://velog.io/@oh_bom721/04-2.-JavaScript-%EA%B3%A0%EA%B8%89%EB%AC%B8%EB%B2%95-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-03</guid>
            <pubDate>Mon, 17 Oct 2022 11:33:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 4주차 🐬
-JS 강의 섹션3 (자바스크립트 고급 문법)까지 듣기</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<h2 id="section-03-자바스크립트-고급-문법">Section 03. 자바스크립트 고급 문법</h2>
<h3 id="span-stylebackground-colorskyblue11-promise-span"><span style="background-color:skyblue">11. promise </span></h3>
<ul>
<li>promise가 필요한 상황</li>
</ul>
<p>만약에 다음과 같은 코드가 있다고 해보자</p>
<pre><code>  var x=1;
  y=callServerData();//서버 호출해서 데이터 받아오는 함수

  var z=x+y;</code></pre><p>  위와 같은 코드에서 y에 함수값 받기전에 다음코드로 넘어가서 y가 비었다고 에러가 날수 있다! 이걸 방지하기 위해 y값 받기전까지 우리는 진행하지 않을게 -&gt; <strong>promise!!!</strong></p>
<p>mock server 다운받아서 사용했다. 자세한 설치방법은 개발자의 품격선생님의 유튜브 강의에 나와있다~</p>
<pre><code>&lt;script src=&quot;https://cdn.jsdelivr.net/npm/axios@1.1.2/dist/axios.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
  var url=
  &quot;https://08fe256f-b1a1-470a-a1d3-0e22ec9aa918.mock.pstmn.io/userList&quot;;
    //mock server에 만든 데이터의 request url

   // promise

   function getData(){

   //resolve는 정상적으로 처리됬을때, reject는 무언가 잘못되었을때

   return new Promise(function(resolve,reject){
       axios.get(url).then(function(response){
    console.log(response.data);
    resolve(response.data);
        });

   });

   }

   //getData 호출 후 리턴값이 resolve로 오고난 후
   getData().then(function(data){
         for(var item of data.userList){
        console.log(item.name);
        }  
   });

&lt;/script&gt;</code></pre><br>


<h3 id="span-stylebackground-colorskyblue12-async-awaitspan"><span style="background-color:skyblue">12. async await</span></h3>
<p>async(비동기)-await(기다려줄게!)는 한쌍이다😊</p>
<pre><code>&lt;script&gt;
async function getData2(){
    return (await axios.get(url)).data;
//(await axios.get(url))을 받은 후 그것의 data를 리턴

//위의 url을 일반화 한 코드
async function getData2(path){
    return (await axios.get(path)).data;
}

async function calculateSum(){
    var data=await getData2();

    var total=0;
    for(var item of data.products){
    total+=item.price;
    }

    console.log(total);

}

calculateSum();

&lt;/script&gt;</code></pre><h3 id="span-stylebackground-colorskyblue13-module-span"><span style="background-color:skyblue">13. module </span></h3>
<p><span style="background-color:yellow">module 쓰기 전 코드</span>
<strong>3-13. beforemodule.js 코드</strong></p>
<pre><code>function log(message){
console.log(message);
}

function error(message){
console.error(message);
}</code></pre><p><strong>3-13.beforemodule.html 코드</strong></p>
<pre><code>&lt;script src=&quot;./3-13.beforemodule.js&quot;&gt;
log(&quot;log로 메시지 출력&quot;);
error(&quot;error로 메시지 출력&quot;);
&lt;/script&gt;
//이렇게 하면 내가 script에 적은 모든 함수와 변수가 import됨</code></pre><blockquote>
<p>내가 script에 쓴 함수나 변수중에 일부만 사용하고 사용하고 싶다면? -&gt; module 이용!!!</p>
</blockquote>
<p><span style="background-color:yellow">module 사용 후 코드</span>
<strong>3-13.module.js </strong></p>
<pre><code>  export function log(message){
  console.log(message);
  }

  export function error(message){
  console.error(message);
  }

  export const PI=3.14;</code></pre><p> <strong>3-13.module.html</strong></p>
<pre><code>&lt;script type=&quot;module&quot;&gt;
import {log,PI} from &quot;./3-13.module.js&quot;;

log(PI);
log(&quot;log로 메시지 출력&quot;);
&lt;/script&gt;</code></pre><p>출력값:
<img src="https://velog.velcdn.com/images/oh_bom721/post/cddf8cd5-9871-4a53-a5c2-5d72211b7176/image.png" alt=""></p>
<ul>
<li>module 사용이 언제 필요할까?<blockquote>
<p>우리팀이 만든 함수를 가져와서 쓰는데 난 거기서 한두개만 쓸거다 근데 그걸 위해 다 import는 ,,굳이?
그리고 그 위에 다른사람이 정의한건 다 알진 못하니까 내가 같은 변수명으로 또 선언해서 꼬일수도 있는 불상사 방지!</p>
</blockquote>
</li>
</ul>
<p><span style="background-color:yellow">다른 js가 또다른 js import 하는 경우</span></p>
<p><strong>3-13.ref.js</strong></p>
<pre><code>import {log,error,PI} from &quot;./3-13.module.js&quot;;
log(&quot;ref에서 출력하는 메시지&quot;);
</code></pre><p><strong>3-13.module.html</strong></p>
<pre><code>&lt;script src=&quot;./3-13.ref.js&quot; type=&quot;module&quot;&gt;&lt;/script&gt;</code></pre><p>출력값:
<img src="https://velog.velcdn.com/images/oh_bom721/post/d3dbba79-a66b-44a2-9a53-d9b9182fe4aa/image.png" alt=""></p>
<h3 id="span-stylebackground-colorskyblue14class-span"><span style="background-color:skyblue">14.class </span></h3>
<p>바로 예시 코드를 봅시다아</p>
<ul>
<li><strong>Car class 선언 및 항목별 getter setter 설정</strong></li>
</ul>
<pre><code>class Car{
    constructor(modelName,modelYear,type,price){
        this.modelName=modelName;
        this.modelYear=modelYear;
        this.type=type;
        this.price=price;
        //this는 이 class를 의미
}
    //modelName getter
    getModelName(){
    return this.modelName;
    }

    getModelYear(){
    return this.modelYear;
    }

    getPrice(){
    return this.price;
    }

    //price setter
    setPrice(price){
    this.price=price;
    }

}
</code></pre><pre><code>let car=new Car(&quot;iconic&quot;,&quot;2021&quot;,&quot;e&quot;,&quot;4000&quot;);
console.log(car.getModelName()); //iconic 출력

let car2=new Car(&quot;genesis&quot;,&quot;2021&quot;,&quot;e&quot;,&quot;7000&quot;);
car2.setPrice(&quot;7700&quot;);
console.log(Car2.getPrice()); //7700 출력
</code></pre><ul>
<li><p>** Class 상속(Car을 상속받은 ElectronicCar 구현)**</p>
<pre><code>class ElectronicCar extends Car{
  constructor(modelName,modelYear,price,chargeTime){
  super(modelName,modelYear,&quot;e&quot;,price);
  //부모 class인 Car의 생성자를 이용한 super

  this.chargeTime=chargeTime;
  }

  setChargeTime(time){
  this.chargeTime=time;
  }

  getChargeTime(){
  return this.chargeTime;
  }
}</code></pre></li>
<li><p>chargeTime 설정 방법 1 (생성자 이용)</p>
<pre><code>let elecCar1=new ElectronicCar(&quot;ionic5&quot;,&quot;2022&quot;,&quot;9000&quot;,60);</code></pre></li>
</ul>
<ul>
<li>chargeTime 설정 방법 2 (setter 이용)<pre><code>let elecCar2=new ElectronicCar(&quot;a&quot;,&quot;2222&quot;,33);
elecCar2.setChargeTime(88);

</code></pre></li>
</ul>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[04-1. JavaScript 고급문법(this, arrow function, rest parameter 등) with 자바스크립트 제대로 배워볼래?(Section 03)]]></title>
            <link>https://velog.io/@oh_bom721/04-1.-JavaScript-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98this-scope-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-03</link>
            <guid>https://velog.io/@oh_bom721/04-1.-JavaScript-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98this-scope-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-03</guid>
            <pubDate>Sat, 15 Oct 2022 15:13:25 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 4주차 🐬
-JS 강의 섹션3 (자바스크립트 고급 문법)까지 듣기</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<h2 id="section-03-자바스크립트-고급-문법">Section 03. 자바스크립트 고급 문법</h2>
<h4 id="span-stylebackground-colorskyblue1this-span"><span style="background-color:skyblue">1.this </span></h4>
<ul>
<li>window 객체를 의미</li>
</ul>
<pre><code>console.log(this); //console.log(window);
</code></pre><pre><code>function myFunction(){
console.log(this);
}</code></pre><ul>
<li><p>object안에서는 object 자체를 의미</p>
<pre><code> var person={

          firstName:&quot;oh&quot;,
          lastName:&quot;bom&quot;,
          fullName:function(){
              return this.firstName + &quot; &quot; +this.lastName;
          }

      };</code></pre></li>
<li><p>html안에서 this는   html 그 자체를 의미</p>
</li>
</ul>
<pre><code>&lt;button type=&quot;button&quot; onclick=&quot;this.style.backgroundColor=&#39;blue&#39;&quot;&gt;클릭&lt;/button&gt;
&lt;button type=&quot;button 2&quot; onclick=&quot;callFunc(this);&quot;&gt; 클릭2&lt;/button&gt;
//위에서 this는 html의미

function callFunc(obj){
console.log(obj);
}
</code></pre><h4 id="span-stylebackground-colorskyblue2-scope-span"><span style="background-color:skyblue">2. scope </span></h4>
<p>scope는 변수에 대한 접근성을 의미함</p>
<ul>
<li><strong> local scope </strong></li>
</ul>
<pre><code>function myFunction(){
var carName=&quot;hyundai&quot;;
}</code></pre><ul>
<li><strong>global scope</strong><pre><code>myFunction2(); 
</code></pre></li>
</ul>
<p>//이렇게 함수선언보다 함수를 앞에 놓아도 에러가 안난다.
//JS는 함수 선언이 호출보다 더 아래에 있더라도
//함수를 먼저 해석한 후에 호출을 실행하기 때문</p>
<p>var carNmae2=&quot;kia&quot;;</p>
<p>function myFunction2(){
console.log(carName2);
}</p>
<pre><code></code></pre><p>//myFunction3(); //error
//위와 같은 경우에는 함수호출이 선언보다 앞에 있더라도 에러가 아니었지만
//함수를 변수안에 넣는 경우에는 호출이 선언보다 앞에 있으면 에러남.</p>
<p>var myFunction3=function(){
console.log(&quot;haha&quot;);
}</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 3. default function parameter &lt;/span&gt;

ES6에서 추가된 내용
</code></pre><p>function say(message=&quot;this is default message&quot;){
console.log(message);
}</p>
<p>say();//this is default message 출력</p>
<pre><code></code></pre><p>function plus(x,y=1){
console.log(x+y);
}</p>
<p>plus(4);// 4+1=5 출력</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 4. rest parameter &lt;/span&gt;


&gt; 만약에 덧셈을 하는 함수를 짜는데, 변수를 몇 개 받아야 할지 모르겠다? 

+ ver1
</code></pre><p>function sum(...args){
var total=0;
for(var x of args){
total+=x;
}
return total;
}</p>
<p>console.log(sum(1,3,5)); //9출력</p>
<pre><code>
+ ver2
</code></pre><p>function sum2(...args){
let total=0;
args.forEach(function(x){
total+=x;
})
return total;
}</p>
<p>console.log(sum2(1,2,3))//6 출력</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 5. arrow function &lt;/span&gt;

함수명=(parameter)=&gt;{}
함수명=(parameter)=&gt;return 값

&gt; ```
var hello=()=&gt;{
return &quot;hello world!&quot;
}
var hello=()=&gt;&quot;espanola~&quot;;</code></pre><ul>
<li>자세한 arrow function 유도과정</li>
</ul>
<pre><code>function hello(){
return &quot;hello&quot;;
}

var hello=function(){
return &quot;hello world!&quot;;
}

var hello=()=&gt;{
return &quot;hi222&quot;;
}

var hello=()=&gt;&quot;espanola~&quot;;

var hi=(firstName,lastName)=&gt;&quot;hi &quot;+firstName+lastName;

console.log(hi(&quot;oh&quot;,&quot;bom&quot;));

//parameter가 1개일 땐 ()조차 생략가능
var intro=fullName=&gt;&quot;nice to meet you&quot;+fullName;
console.log(intro(&quot;ohbom&quot;));</code></pre><h4 id="span-stylebackground-colorskyblue-6-template-literals-span"><span style="background-color:skyblue"> 6. template literals </span></h4>
<p>전달한 혹은 전달받은 변수를 출력하거나 리턴할때 
 함께 전달할 말들을 `` 로 묶고 그 안에 그 변수를 &amp;{변수이름} 이런식으로 넣어서 쓸수 있다.</p>
<blockquote>
<pre><code> ho=(name)=&gt;`hi ${name}`;
 console.log(ho(&quot;ho&quot;));
// hi ho</code></pre></blockquote>
<pre><code></code></pre><p>function hello(name){
var name2=&quot;HW&quot;;
console.log(&quot;hi ${name2} ! and hello ${name}&quot;);</p>
<p>}</p>
<p>hello(&quot;john doe&quot;);
//hi HW ! and hello john doe</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 7. Object Literal Syntax Extension &lt;/span&gt;
</code></pre><p>var type=&quot;student&quot;;
var score={
[type]:&quot;oh bom&quot;,
score:90
};</p>
<p>console.log(socre.student);//oh bom 출력</p>
<p>var type2=&quot;grade&quot;;
score[type2]=1;
//score.grade=1;과 동일</p>
<pre><code>
이전 포스팅 중
_&#39;(02.JavaScript 기본 문법 with 자바스크립트 제대로 배워볼래?(Section 01)&#39;_ 의
**3.object 선언방법2**와 함께 공부하면 좋을 것 같다.
➡[velog](https://velog.io/@oh_bom721/02-1.JavaScript-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98)

#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 8. Spread Operator&lt;/span&gt;
</code></pre><p>var arr1=[4,5,6];
var arr2=[1,2,3,...arr1];
//...arr1에서 ...은 분해하는거 의미</p>
<p>console.log(arr2);
//1,2,3,4,5,6 출력</p>
<pre><code></code></pre><p>var cd=&quot;CD&quot;;
var alphabet=[&quot;A&quot;,&quot;B&quot;,...cd];
console.log(alphabet);
//A B C D 출력</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 9. Object destructuring&lt;/span&gt;
</code></pre><p>function getPerson(){
return {
Name:&quot;oh_bom&quot;,
age:23,
country:korea
};
}</p>
<p>//!! 실무에서 자주 쓰임
var{Name,country}=getPerson();
console.log(age);//error(age는 object destructuring 안해줘서)
console.log(country); // korea 출력</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 10. array destructuring&lt;/span&gt;
</code></pre><p>function getScores(){
return [70,80,90];
}</p>
<p>//array destructuring
var [x,y]=getScores();
console.log(x); // 70 출력</p>
<p>//위도, 경도 예시
function getLocation(){
return [127.22,721.01];
}</p>
<p>var [latitude,longitude]=getLocation();
console.log(longitude); //721.01 출력</p>
<pre><code>











</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[03-3. JavaScript 내장함수(Date, Math, json) with 자바스크립트 제대로 배워볼래?(Section 02)]]></title>
            <link>https://velog.io/@oh_bom721/03-3.-JavaScript-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98Date-Math-json-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-02</link>
            <guid>https://velog.io/@oh_bom721/03-3.-JavaScript-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98Date-Math-json-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-02</guid>
            <pubDate>Thu, 13 Oct 2022 06:02:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 3주차 🐬
-JS 강의 섹션2 (자바스크립트 내장 함수)까지 듣기</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<h2 id="section-02-자바스크립트-내장-함수">Section 02. 자바스크립트 내장 함수</h2>
<h4 id="span-stylebackground-colorskyblue5-datespan"><span style="background-color:skyblue">5. Date</span></h4>
<ul>
<li>Date 객체 생성<pre><code>var d=new Date();
console.log(d); //현재 날짜 및 시간 출력
</code></pre></li>
</ul>
<p>console.log(&quot;timezone: &quot;,d.getTimezoneOffset());
//timezone:  -540 출력
//-540분=-9h (우리나라 기준)</p>
<pre><code>
인덱스를 month는 0부터, day는 1부터 시작
그래서 7로 입력하면 august 나온당

~~강의자님 추측은 ,, 월을 배열에 넣을때마다 -1을 해줘야하니까?~~

+ 다양한 date함수들
</code></pre><p>var year=d.getFullYear();
var month=d.getMonth();
var day=d.getDay();
var hour=d.getHours()&#39;
var minute=d.getMinutes();
var second=d.getSeconds();</p>
<pre><code>
+ TIME ZOONE
:외부 라이브러리 사용, moment.js 사용함
moment.js.cdn 검색 후 나오는 스크립트 head에 입력

![](https://velog.velcdn.com/images/oh_bom721/post/a5bd4e1e-ff0e-4915-9c6d-4f0957d3796d/image.png)

나는 두번째꺼를 복사하여 head에 입력했다.
</code></pre><p>console.log(moment().format(&quot;YYYY-MM-DD&quot;));
console.log(moment().subtract(7,&quot;days&quot;).format(&quot;YY-MM-DD&quot;);
console.log(moment().add(7,&quot;days&quot;).format(&quot;YYMMDD&quot;));</p>
<p>// moment.js 라이브러리를 사용하여 format을 지정할수도,
원하는 날짜, 연도 등을 add, subtract하는 것이 가능하다.</p>
<pre><code>#### &lt;span style=&quot;background-color:skyblue&quot;&gt;6. Math&lt;/span&gt;

+ round(): 반올림</code></pre><p>math.round(4.9); // 5</p>
<pre><code>
+ ceil() 무조건 올림으로 정수만들기</code></pre><p>console.log(Math.ceil(7.21)); //8</p>
<pre><code>
실무 사용예시
&gt;만약 서버로부터 받아온 데이터가 72개이고, 한페이지에서 10개씩 글을 보여준다고 하자. 그러면 필요한 페이지 수는?
-&gt; ceil(72/10) 해서 8페이지 필요함!

+ floor() : 무조건 내림</code></pre><p>Math.floor(7.21); //7
Math.floor(-4.23);// -5
//-4.23보다 작게 내려서 정수값을 리턴하는것이므로 -4가 아니라 -5리턴</p>
<pre><code>
+ trunc() : 정수 부분만 리턴
</code></pre><p>Math.trunc(-4.23); // -4
//위의 floor()와 비교해보기 ^*^</p>
<pre><code>
+ sign(): 음수 -1, 양수 1 리턴</code></pre><p>Math.sign(-7.21); // -1리턴</p>
<pre><code>
+ pow() 제곱</code></pre><p>Math.pow(2,5);//2의 5제곱=32 리턴</p>
<pre><code>
+ sqrt() 루트

+ ⭐&lt;span style=&quot;background-color:yellow&quot;&gt;&lt;strong&gt;abs() : 무조건 양수로 변환&lt;/strong&gt;&lt;/span&gt;</code></pre><p>Math.abs(-3.1);// 3.1 리턴
//간격이나 계산용도로 쓰인다</p>
<pre><code>
+ max()</code></pre><p>Math.max(2,12,442,214,68,7); 가장 큰 값 리턴</p>
<pre><code>
+ ⭐&lt;span style=&quot;background-color:yellow&quot;&gt;&lt;strong&gt;random() &lt;/strong&gt;&lt;/span&gt;

Math.random(): 0&lt;=x&lt;1 해당하는 수 리턴

ex) 1~10사이 수 중 랜덤</code></pre><p>Math.floor(Math.random()*10+1);</p>
<pre><code>
ex2) a부터 b사이의 랜덤한 정수 출력 (a&lt;=x&lt;=b)일때</code></pre><p>Math.floor(Math.random()*(b-a+1)+a);</p>
<p>//여기서 b-a+1은 b부터 a사이의 간격을 의미한다
//우리가 2부터 5사이에 숫자가 몇개있는지 센다면 총 4개라고 답할텐데
그때 그 4는 5-2+1 을 해서 나온 수이다.</p>
<pre><code>
ex 3) a&lt;=x&lt;b 라면</code></pre><p>Math.floor(Math.random()*(b-a))+a;
//여기선 b보다 작은수까지 정수를 세기때문에(b는 미포함)
b-a가 두 정수사이의 간격이 됨</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt;7. json&lt;/span&gt;

JSON-JavaScript Object Notation

    json서버로부터 웹페이지로 데이터 전송시,
    웹페이지에서 서버로 데이터 전송시에 사용

</code></pre><p>var data={
&quot;employees&quot;:[
{&quot;firstName&quot;: &quot;oh&quot;, &quot;lastName&quot;: &quot;bom&quot;},
{&quot;firstName&quot;: &quot;oh2&quot;, &quot;lastName&quot;:&quot;bom2&quot;}
]
}</p>
<p>console.log(data.employees[0].firstName); //oh 출력</p>
<pre><code>
Json.stringify: data를 string으로 바꿀수 있음</code></pre><p>console.log(JSON.stringify(data));
//출력값
//{&quot;employees&quot;:[{&quot;firstName&quot;:&quot;oh&quot;,&quot;lastName&quot;:&quot;bom&quot;},{&quot;firstName&quot;:&quot;oh2&quot;,&quot;lastName&quot;:&quot;bom2&quot;}]}</p>
<pre><code>

JSON.parse : string을 object로 만들기 가능
</code></pre><p> var text=&#39;{&quot;employees&quot;:[&#39;+
        &#39;{&quot;firstName&quot;:&quot;oh&quot;,&quot;lastName&quot;:&quot;bom&quot;},&#39;
        +&#39;{&quot;firstName&quot;:&quot;oh2&quot;,&quot;lastName&quot;:&quot;bom2&quot;}]}&#39;;</p>
<pre><code>    console.log(JSON.parse(text));

    //출력
    employees: Array(2)
    0: {firstName: &#39;oh&#39;, lastName: &#39;bom&#39;}
    1: {firstName: &#39;oh2&#39;, lastName: &#39;bom2&#39;}</code></pre><pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 8. window&lt;/span&gt;
+ 다양한 window명령들 소개</code></pre><p>alert(&quot;this is alert!&quot;);
confirm(&quot;really delete?);
prompt(&quot;insert your passcode);
window.open(&quot;<a href="https://google.com&quot;">https://google.com&quot;</a>);</p>
<pre><code>
+ setTimeout</code></pre><p>setTimeout(function(){
console.log(&quot;5초후 실행&quot;);
}, 1000*5);
//밀리 세컨드가 기준이라 1000은 1초 의미</p>
<pre><code>+ setInterval
</code></pre><p>setInterval
var i=0;
var fnc=setInterval(function(){
console.log(&quot;3초마다 실행&quot;);</p>
<p>if(i==3){
clearInterval(fnc);
}
i++</p>
<p>},3000);</p>
<pre><code>
#### &lt;span style=&quot;background-color:skyblue&quot;&gt; 9. 개발자 도구&lt;/span&gt;

+ 콘솔창 띄우는 종류 4가지
</code></pre><p>console.log(&quot;hello&quot;);
console.info(&quot;2&quot;);
console.warn(&quot;3&quot;);
console.error(&quot;4&quot;);</p>
<pre><code>
+ table로 만들어 띄우기</code></pre><p> var userList=[ 
            {first:1,second:2},
            {first:11,second:22}
        ];
        console.table(userList);</p>
<pre><code>
![](https://velog.velcdn.com/images/oh_bom721/post/e9c60b49-16ee-41c4-9e42-fa30b48f54f6/image.png)

+ 프로그램 구동시간 체크</code></pre><p>function a(){</p>
<p>console.time();</p>
<p>//program code~~</p>
<p>console.timeEnd();</p>
<p>}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[03-2. JavaScript 내장함수(Array) with 자바스크립트 제대로 배워볼래?(Section 02)]]></title>
            <link>https://velog.io/@oh_bom721/03-2.-JavaScript-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98Array-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-02-6jkvaiji</link>
            <guid>https://velog.io/@oh_bom721/03-2.-JavaScript-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98Array-with-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%BC%EB%9E%98Section-02-6jkvaiji</guid>
            <pubDate>Mon, 10 Oct 2022 07:11:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>스터디 3주차 🐬
-JS 강의 섹션2 (자바스크립트 내장 함수)까지 듣기</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<h2 id="section-02-자바스크립트-내장-함수">Section 02. 자바스크립트 내장 함수</h2>
<h4 id="span-stylebackground-colorskyblue4-arrayspan"><span style="background-color:skyblue">4. Array</span></h4>
<ul>
<li>toString(): array를 string으로 변환<pre><code>var fruits=[&quot;banana&quot;,&quot;orange&quot;,&quot;kiwi&quot;];
console.log(fruits.toString());
//banana, orange, kiwi 출력
</code></pre></li>
</ul>
<pre><code>
+ join()</code></pre><p>console.log(fruits.join(&quot;*&quot;));
//<em>을 기준으로 join
//banana</em>orange*kiwi 출력</p>
<pre><code>
+ push()</code></pre><p>//string에 이어서 문자열 추가하는 방법1
var txt=&quot;hello&quot;;
txt+= &quot;everyone~&quot;;</p>
<p>//arr에 push 이용하여 string 추가
var arr=[];
arr.push(&quot;one&quot;);
arr.push(&quot;two&quot;);</p>
<pre><code>
+ pop() 
:가장 마지막에 추가한 element return

+ shift() :배열의 첫번째 element 제거후 리턴</code></pre><p>var numbers=[&quot;one&quot;,&quot;two&quot;,&quot;three&quot;];
var s=numbers.shift();
console.log(s);
console.log(numbers);</p>
<p>//출력값
//one
//[&#39;two&#39;, &#39;three&#39;] </p>
<pre><code>
+ unshift(): 배열의 첫번째 인덱스에 새 element추가</code></pre><p>numbers.unshift(&quot;zero&quot;);
console.log(numbers);
//[&#39;zero&#39;, &#39;two&#39;,&#39;three&#39;] 출력</p>
<pre><code>
+ splice(a,b,c)
-a: 시작 위치, b: 삭제할 element 수, c: 추가할 요소
그 뒤로부터 element를 이어서 넣는다
</code></pre><p>let seasons=[&quot;spring&quot;,&quot;summer&quot;,&quot;autumn&quot;,&quot;winter&quot;];
seasons.splice(1,2,&quot;봄과 겨울 사이&quot;);</p>
<p>console.log(seasons);
//출력값: [&quot;spring&quot;,&quot;봄과 겨울 사이&quot;,&quot;winter&quot;]</p>
<pre><code>
 + concat
</code></pre><p>var myInst=[&quot;guitar&quot;];
var myFx=[&quot;eq&quot;,&quot;reverb&quot;];
var mine=myInst.concat(myFx);
console.log(mine);
//출력값: [&quot;guitar&quot;, &quot;eq&quot;,&quot;reverb&quot;]</p>
<pre><code>
+ slice()
</code></pre><p>var seasons=[&quot;spring&quot;,&quot;summer&quot;,&quot;autumn&quot;,&quot;winter&quot;];
var seasons2=seasons.slice(1,3);
//index 1번부터 3번 전, 즉 2번인덱스까지의 값 리턴
consoel.log(seasons2);
//출력값: [&#39;summer&#39;, &#39;autumn&#39;]</p>
<pre><code>
+ ⭐&lt;span style=&quot;background-color:yellow&quot;&gt;&lt;strong&gt;!sort!&lt;/strong&gt;&lt;/span&gt;
 1. abc 순으로 정렬
</code></pre><p>var arr=[&quot;vienna&quot;,&quot;budapest&quot;,&quot;seoul&quot;,&quot;praha&quot;];
console.log(arr.sort());</p>
<p>// [&#39;budapest&#39;, &#39;praha&#39;, &#39;seoul&#39;, &#39;vienna&#39;] 출력</p>
<pre><code>
2. 오름차순으로 정렬</code></pre><p> var points=[4,2,33,9,10];
        console.log(points.sort());
        //10,2,33,4,9으로 출력
  /* sort는 저 숫자들을 문자열로 바꾼 후 
  정렬시키때문에 맨 앞자리 수로(4,2,3,9,1)을 
  기준으로 정렬이 된다. 
  */</p>
<pre><code>
그래서 다시 sort함수를 수정해줘야 한다.

    오름차순으로 정렬
</code></pre><p>points.sort(function(a,b){
/*
if(a&gt;b) return 1;
else if(a&lt;b) return -1;
else return 0;
*/
return a-b;</p>
<p>});</p>
<pre><code>
내림차순으로 정렬하려면 마지막에 return b-a;를 해주면됨

다음은 obejct를 배열에 넣고, 그 배열속 객체들의 값을 비교하는 함수를 작성한 예시이다.</code></pre><pre><code>var btob=[
         {name:&quot;현식&quot;,point:100, city:&quot;seoul&quot;},
        {name:&quot;창섭&quot;,point:90,city:&quot;seoul&quot;},
        {name: &quot;성재&quot;,point:80,city:&quot;vienna&quot;}
        ];


btob.sort(function(a,b){

/*
if(a.point&gt;b.point) return 1;
else if(a.point&lt;b.point) return -1;
else return 0;
*/

//간단한 ver
return a.point&gt;b.point?1: a.point&lt;b.point?:-1:0;

});

console.log(btob.sort());</code></pre><pre><code>출력값:</code></pre><p>(3) [{…}, {…}, {…}]
0
: 
{name: &#39;성재&#39;, point: 80, city: &#39;vienna&#39;}
1
: 
{name: &#39;창섭&#39;, point: 90, city: &#39;seoul&#39;}
2
: 
{name: &#39;현식&#39;, point: 100, city: &#39;seoul&#39;}</p>
<pre><code>
  + ⭐&lt;span style=&quot;background-color:yellow&quot;&gt;&lt;strong&gt;filter&lt;/strong&gt;&lt;/span&gt;
: 조건에 맞는 배열만 리턴
</code></pre><p>//예시 1
var pass=btob.filter(funciton(person){
return person.point&gt;80;
});</p>
<p>console.log(pass);
/*0
: 
{name: &#39;창섭&#39;, point: 90, city: &#39;seoul&#39;}
1
: 
{name: &#39;현식&#39;, point: 100, city: &#39;seoul&#39;}</p>
<p>두 객체만 리턴
*/</p>
<p>//예시 2
var seoul=btob.filter(function(person){
return person.city==&quot;seoul&quot;;</p>
<p>});</p>
<p>console.log(seoul);</p>
<p>/*
0
: 
{name: &#39;창섭&#39;, point: 90, city: &#39;seoul&#39;}
1
: 
{name: &#39;현식&#39;, point: 100, city: &#39;seoul&#39;}</p>
<p>리턴</p>
<p>*/</p>
<pre><code></code></pre><p>예시3
const numbers = [1, 2, 3, 4, 5];
const result = numbers.filter(number =&gt; number &gt; 3);</p>
<pre><code>
filter의 장점은 for문으로 직접 돌리는 것보다 훨씬 간단하다는 것!

 + ⭐&lt;span style=&quot;background-color:yellow&quot;&gt;&lt;strong&gt;! reduce !&lt;/strong&gt;&lt;/span&gt;
 reduce(a,c,i,arr)
 -a(accumulator): 누산기
 -c(curreunt value):현재 한개한개의 값
 -i(current index): 현재 index 값
 -arr(전체 배열)

</code></pre><p>var arr1=[1,2,3,4,5];
var total=0;</p>
<p>total=arr1.reduce(fucntion(accumulator,current){
return accumulator+current;
});</p>
<p>console.log(total); //15출력</p>
<pre><code>
 + ⭐&lt;span style=&quot;background-color:yellow&quot;&gt;&lt;strong&gt;! map !&lt;/strong&gt;&lt;/span&gt;
-새로운 배열 생성하며 기존 배열에서 원하는 값을 이용하여 추가로 새로운 값을 생성할 수 있다.
</code></pre><p>var userList=[
            {firstName:&quot;bom&quot;, lastName:&quot;oh&quot;,email:&quot;<a href="mailto:bom@gmail.com">bom@gmail.com</a>&quot;},
            {firstName:&quot;bom2&quot;, lastName:&quot;oh2&quot;,email:&quot;<a href="mailto:bom2@gmail.com">bom2@gmail.com</a>&quot;},
            {firstName:&quot;bom3&quot;, lastName:&quot;oh3&quot;,email:&quot;<a href="mailto:bom3@gmail.com">bom3@gmail.com</a>&quot;},
        ];</p>
<p> var userList2=userList.map(function(user){
 return {fullName:user.lastName+user.firstName, email:user.email};
 });
 /*기존 userList에 있던 firstName과 lastName 값을 합쳐
 fullName이라는 값 생성,
 기존에 있던 email값도 가져올 수 있음 
 */</p>
<p> console.log(userList2);
 /*
 0: {fullName: &#39;ohbom&#39;, email: &#39;bom@gmail.com&#39;}
1: {fullName: &#39;oh2bom2&#39;, email: &#39;bom2@gmail.com&#39;}
2: {fullName: &#39;oh3bom3&#39;, email: &#39;bom3@gmail.com&#39;}
 */
```</p>
]]></description>
        </item>
    </channel>
</rss>