<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ted's Codding study</title>
    <link>https://ted93.tistory.com/</link>
    <description>프론트엔드 학습을 Ted 스타일대로 정리 요약 위주로 운영하고 있습니다.
프론트엔드, HTML, CSS, JavaScript, React, Github</description>
    <language>ko</language>
    <pubDate>Wed, 22 Jul 2026 11:51:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Ted93</managingEditor>
    <item>
      <title>HTTP 프로토콜의 역할과 중요성 설명.</title>
      <link>https://ted93.tistory.com/entry/HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%98-%EC%97%AD%ED%95%A0%EA%B3%BC-%EC%A4%91%EC%9A%94%EC%84%B1-%EC%84%A4%EB%AA%85</link>
      <description>&lt;h1&gt;1. HTTP 프로토콜 개요&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;HTTP (HyperText Transfer Protocol)&quot;&lt;/li&gt;
&lt;li&gt;웹 상에서 클라이언트와 서버 간의 통신을 위한 규약&lt;/li&gt;
&lt;li&gt;요청(Request)과 응답(Response)의 형식으로 데이터를 교환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. HTTP 요청과 응답 구조&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=== HTTP 요청(Request) ===&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드(Method): 작업의 종류를 지정 (예: GET, POST, PUT, DELETE)&lt;/li&gt;
&lt;li&gt;URL: 요청 대상 리소스의 위치를 지정&lt;/li&gt;
&lt;li&gt;헤더(Headers): 요청의 메타데이터를 포함 (예: 인증 정보, 콘텐츠 유형)&lt;/li&gt;
&lt;li&gt;본문(Body): POST, PUT 요청에서 데이터를 포함 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=== HTTP 응답(Response) ===&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태 코드(Status Code): 요청의 처리 결과를 나타냄 (예: 200 OK, 404 Not Found, 500 Internal Server Error)&lt;/li&gt;
&lt;li&gt;헤더(Headers): 응답의 메타데이터를 포함 (예: 콘텐츠 유형, 캐시 제어)&lt;/li&gt;
&lt;li&gt;본문(Body): 요청에 대한 실제 데이터를 포함 (예: HTML, JSON)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3 HTTP의 중요성&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준화된 통신: 모든 웹 클라이언트와 서버가 동일한 방식으로 통신 가능능&lt;/li&gt;
&lt;li&gt;인터넷의 기초: 웹 페이지, API, 웹 애플리케이션 등 다양한 웹 서비스의 기반&lt;/li&gt;
&lt;li&gt;확장성: HTTP/2, HTTP/3 등 지속적인 발전을 통해 성능과 보안이 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. HTTP 요청 예시&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 웹 브라우저에 '[&lt;a href=&quot;https://jsonplaceholdertypicodecom/posts/1'%EC%9D%84%5D(https://jsonplaceholdertypicodecom/posts/1'%EC%9D%84&quot;&gt;https://jsonplaceholdertypicodecom/posts/1'을](https://jsonplaceholdertypicodecom/posts/1'을&lt;/a&gt;) 입력하여 첫 번째 게시글을 요청&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1) HTTP 요청&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;method&quot;: &quot;GET&quot;,
  &quot;url&quot;: &quot;&amp;lt;https://jsonplaceholdertypicodecom/posts/1&amp;gt;&quot;,
  &quot;headers&quot;: {
    &quot;Accept&quot;: &quot;application/json&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메소드(Method): GET은 서버로부터 데이터를 요청하는 메소드&lt;/li&gt;
&lt;li&gt;URL: 리소스의 위치를 나타냄 여기서는 첫 번째 게시글의 정보를 요청&lt;/li&gt;
&lt;li&gt;헤더(Headers): 클라이언트가 JSON 형식의 응답을 원한다고 서버에 알림 (Accept: application/json)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2) 서버 응답&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;statusCode&quot;: 200,
  &quot;headers&quot;: {
    &quot;Content-Type&quot;: &quot;application/json&quot;
  },
  &quot;body&quot;: {
    &quot;userId&quot;: 1,
    &quot;id&quot;: 1,
    &quot;title&quot;: &quot;sunt aut facere repellat provident occaecati excepturi optio reprehenderit&quot;,
    &quot;body&quot;: &quot;quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태 코드(StatusCode): 200 OK는 요청이 성공적으로 처리되었음을 나타냄&lt;/li&gt;
&lt;li&gt;헤더(Headers): 응답 데이터의 형식이 JSON임을 나타냄 (Content-Type: application/json)&lt;/li&gt;
&lt;li&gt;본문(Body): 요청된 게시글의 정보를 JSON 형식으로 포함 여기에는 사용자 ID, 게시글 ID, 제목, 내용 등이 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3) fetch() 응답 객체의 속성들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fetch() 함수를 사용하면 Promise를 반환하며, 이 Promise는 응답 객체(Response)로 이어짐 이 객체는 다음과 같은 속성을 포함&lt;/li&gt;
&lt;li&gt;ok: 응답 상태 코드가 200-299 범위인 경우 true를 반환 요청이 성공적으로 완료되었음을 나타냄&lt;/li&gt;
&lt;li&gt;status: HTTP 상태 코드를 나타내는 정수 값 (예: 200, 404)&lt;/li&gt;
&lt;li&gt;statusText: HTTP 상태 코드에 대한 텍스트 메시지 (예: &quot;OK&quot;, &quot;Not Found&quot;)&lt;/li&gt;
&lt;li&gt;headers: 응답 헤더들을 다루는 Headers 객체 헤더를 검색하고 접근하는 데 사용&lt;/li&gt;
&lt;li&gt;url: 응답이 온 URL&lt;/li&gt;
&lt;li&gt;redirected: 요청이 리다이렉트되었는지 여부를 나타냄&lt;/li&gt;
&lt;li&gt;type: 응답의 유형을 나타냄 (예: &quot;basic&quot;, &quot;cors&quot;)&lt;/li&gt;
&lt;li&gt;body: 읽을 수 있는 스트림으로서, 응답의 본문을 제공 해당 스트림은 json(), text(), blob(), formData() 등의 메소드를 사용하여 데이터로 변환 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4) Axios 응답 객체의 속성들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Axios를 사용하면 응답 객체는 다음과 같은 속성을 포함&lt;/li&gt;
&lt;li&gt;data: 서버로부터 반환된 실제 데이터 설정에 따라 자동으로 JSON으로 파싱 가능&lt;/li&gt;
&lt;li&gt;status: HTTP 상태 코드&lt;/li&gt;
&lt;li&gt;statusText: HTTP 상태 코드에 대한 설명 문자열&lt;/li&gt;
&lt;li&gt;headers: 서버에서 응답으로 보낸 HTTP 헤더들&lt;/li&gt;
&lt;li&gt;config: 요청에 사용된 Axios의 설정 객체&lt;/li&gt;
&lt;li&gt;request: 요청을 보낼 때 사용된 XMLHttpRequest 객체 (브라우저 환경에서만 해당)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TypeScript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/83</guid>
      <comments>https://ted93.tistory.com/entry/HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%98-%EC%97%AD%ED%95%A0%EA%B3%BC-%EC%A4%91%EC%9A%94%EC%84%B1-%EC%84%A4%EB%AA%85#entry83comment</comments>
      <pubDate>Thu, 11 Jul 2024 12:33:09 +0900</pubDate>
    </item>
    <item>
      <title>HTTP.</title>
      <link>https://ted93.tistory.com/entry/HTTP</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹의 동작 원리 소개 - &quot;클라이언트-서버 아키텍처&quot; 이해&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;1. 클라이언트-서버 모델 개요&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=== 클라이언트(Client) ===&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자와 상호작용하는 장치 또는 애플리케이션&lt;/li&gt;
&lt;li&gt;보통 웹 브라우저(예: Chrome, Firefox, Safari 등)를 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 입력한 명령을 서버로 보내고&lt;/li&gt;
&lt;li&gt;서버에서 받은 데이터를 사용자에게 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=== 서버(Server) ===&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트의 요청을 처리하고 응답을 제공하는 장치 또는 애플리케이션&lt;/li&gt;
&lt;li&gt;웹 서버, 데이터베이스 서버 등이 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트로부터 요청을 받아 이를 처리하고 결과를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 클라이언트-서버 상호작용 예시&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 사용자가 웹 브라우저에서 URL을 입력&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저가 URL을 통해 서버에 접속하기 위해 HTTP 요청을 준비&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 클라이언트(브라우저)가 서버에 HTTP 요청 전송&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 요청은 클라이언트의 요구사항을 담고 있음 (예: 특정 웹 페이지를 요청)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3) 서버가 요청을 처리하고, 결과(HTML, CSS, JS 등)를 클라이언트에 응답&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버는 요청받은 작업을 수행하고, 결과 데이터를 HTTP 응답으로 클라이언트에게 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4) 클라이언트는 응답 받은 데이터를 사용자에게 표시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트는 받은 데이터를 렌더링하여 사용자에게 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 클라이언트-서버 아키텍처의 장점&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;확장성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버는 동시에 여러 클라이언트의 요청을 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유연성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트와 서버는 서로 다른 플랫폼에서 동작 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보안성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터는 중앙 서버에서 관리되고 제어&lt;/li&gt;
&lt;li&gt;클라이언트는 민감한 데이터를 직접 다루지 않음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TypeScript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/82</guid>
      <comments>https://ted93.tistory.com/entry/HTTP#entry82comment</comments>
      <pubDate>Wed, 10 Jul 2024 19:30:45 +0900</pubDate>
    </item>
    <item>
      <title>비동기 처리 프로그래밍(asynchronous).</title>
      <link>https://ted93.tistory.com/entry/%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Dasynchronous</link>
      <description>&lt;h1&gt;1. 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드의 실행이 완료될 때까지 기다리지 않고 다음 코드를 실행하는 것&lt;/li&gt;
&lt;li&gt;프로그램의 메인 흐름과 병렬적으로 작업 할 수 있는 프로그래밍 방식&lt;/li&gt;
&lt;li&gt;작업이 완료되면 결과를 받을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. 특징&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답성 향상&lt;/li&gt;
&lt;li&gt;사용자의 응답이 블로킹되지 않고, 긴 작업이 백그라운드에서 수행&lt;/li&gt;
&lt;li&gt;별도의 스레드 또는 이벤트 루프를 이용하여 동작하기 때문에, 작업이 완료될 때까지 대기하지 않고 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. 비동기 처리 장단점&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;병렬 처리와 효율성&lt;/li&gt;
&lt;li&gt;응답성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡성 증가&lt;/li&gt;
&lt;li&gt;디버깅 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;4. jsonplaceholder&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가짜 REST API 서비스&lt;/li&gt;
&lt;li&gt;실제 데이터를 사용하지 않고도 HTTP 요청을 테스트할 수 있는 가상의 데이터를 제공&lt;/li&gt;
&lt;li&gt;무료 사용 가능 간단한 테스트 및 프로토타이핑을 위해 사용되는 가짜 온라인 REST API&lt;/li&gt;
&lt;li&gt;사용자 데이터나 게시물 데이터를 요청하는 데 사용 가능 &lt;a href=&quot;https://jsonplaceholder.typicode.com/users&quot;&gt;https://jsonplaceholder.typicode.com/users&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TypeScript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/81</guid>
      <comments>https://ted93.tistory.com/entry/%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Dasynchronous#entry81comment</comments>
      <pubDate>Tue, 9 Jul 2024 15:34:40 +0900</pubDate>
    </item>
    <item>
      <title>동기 처리 프로그래밍(synchronous).</title>
      <link>https://ted93.tistory.com/entry/%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Dsynchronous</link>
      <description>&lt;h1&gt;1. 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드가 순차적으로 실행되는 것을 의미&lt;/li&gt;
&lt;li&gt;한 작업이 완료될 때까지 다음 작업은 대기(시작하지 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. 특징&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순차적 실행: 코드의 흐름 예측이 용이&lt;/li&gt;
&lt;li&gt;간단성 &amp;amp; 예측성: 프로그램의 이해가 쉽고, 디버깅이 상대적으로 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. 블로킹(Blocking) 연산의 이해&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그래밍의 진행을 막고, 해당 연산이 완료될 때까지 실행하지 못하도록 하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;블로킹의 구성요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대기 시간, 리소스 관리, 응용 프로그램의 응답성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function performCalculation(): number {
  // 시간 지연을 위한 계산식
  let sum = 0;
  for (let i = 0; i &amp;lt; 9999999000; i++) {
    sum += i;
  }
  return sum; // 계산 결과 반환
}

function performAnotherCalculation(): number {
  // 시간 지연을 위한 계산식
  let product = 1;
  for (let i = 1; i &amp;lt; 100; i++) {
    product *= i;
  }
  return product; // 계산 결과 반환
}

// 동기적 처리를 수행하는 함수
function syncFunc() {
  console.log('첫 번째 작업 시작');
  let result = performCalculation(); // 시간이 오래 걸리는 작업
  console.log(`첫 번째 작업 완료: ${result}`);

  console.log('두 번째 작업 시작');
  let anotherResult = performAnotherCalculation();
  console.log(`두 번째 작업 완료: ${anotherResult}`);
}

syncFunc();
// 첫 번째 작업 시작
// 첫 번째 작업 완료: 49999989990068890000
// 두 번째 작업 시작
// 두 번째 작업 완료: 9.33262154439441e+155

&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;4. 동기 프로그래밍의 장단점&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단성, 명확성&lt;/li&gt;
&lt;li&gt;디버깅 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답성 저하, 코드의 활용(사용)도가 저하&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TypeScript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/80</guid>
      <comments>https://ted93.tistory.com/entry/%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Dsynchronous#entry80comment</comments>
      <pubDate>Mon, 8 Jul 2024 18:14:19 +0900</pubDate>
    </item>
    <item>
      <title>제네릭, 클래스, 배열 메서드를 활용한 회원 관리 프로그램 구현.</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%9A%8C%EC%9B%90-%EA%B4%80%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;h1&gt;1. 회원 정보&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name(이름), age(나이), active(활성 상태)의 속성을 가짐&lt;/li&gt;
&lt;li&gt;active 속성은 기본값으로 true값을 가짐(회원이 기본적으로 활성 상태)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. 회원 관리 프로그램&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원을 추가(addMember)&lt;/li&gt;
&lt;li&gt;회원을 검색(findMember)&lt;/li&gt;
&lt;li&gt;회원을 제거(removeMember)&lt;/li&gt;
&lt;li&gt;활성화된 회원만 필터링(filterActiveMember)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. 기능 추가&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Member 클래스 확장&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Member 클래스를 상속받는 VIPMember 클래스를 정의&lt;/li&gt;
&lt;li&gt;rewardPoints(보상점수) 속성을 가짐&lt;/li&gt;
&lt;li&gt;생성자를 통해 초기화 가능 (Member 클래스의 속성은 super())&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회원 나이 평균 계산하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Membership 클래스에 getAverageAge 메서드를 추가&lt;/li&gt;
&lt;li&gt;현재 목록에 있는 모든 회원들의 나이 평균을 계산하여 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비활성 회원 검색 기능을 추가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Membership 클래스에 filterInactiveMembers 메서드를 추가&lt;/li&gt;
&lt;li&gt;활성 상태가 아닌(active 속성값이 false) 회원들만 필터링하여 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1719566785100&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;class Member {
  constructor(
    public name: string,
    public age: number,
    public active: boolean = true,
  ) {}
}

class Membership&amp;lt;T extends Member&amp;gt; {
  private members: T[] = [];

  addMember(member: T) {
    this.members.push(member);
  }
  findMember(name: string): T | undefined {
    return this.members.find((member) =&amp;gt; member.name === name);
  }
  removeMember(name: string): void {
    const index = this.members.findIndex((member) =&amp;gt; member.name === name);
    if (index !== -1) {
      this.members.splice(index, 1);
    }
  }

  filterActiveMembers(): T[] {
    return this.members.filter((member) =&amp;gt; member.active);
  }
}

//! MemberShip 클래스 사용 예시
let membership = new Membership&amp;lt;Member&amp;gt;();

let memberA = new Member('테드', 30);
membership.addMember(memberA);
membership.addMember(new Member('챨리', 29));
membership.addMember(new Member('마이클', 22));
membership.addMember(new Member('마커스', 25, false));

console.log(membership.findMember('챨리')); // Member { name: '챨리', age: 29, active: true }
console.log(membership.findMember('헤일리')); // undefined

let activeMembers = membership.filterActiveMembers();
console.log(activeMembers);
// [
// Member { name: '테드', age: 30, active: true },
// Member { name: '챨리', age: 29, active: true },
// Member { name: '마이클', age: 22, active: true }
// ]

membership.removeMember('챨리');
console.log(membership.findMember('챨리')); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/79</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%B0%EC%97%B4-%EB%A9%94%EC%84%9C%EB%93%9C%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%9A%8C%EC%9B%90-%EA%B4%80%EB%A6%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B5%AC%ED%98%84#entry79comment</comments>
      <pubDate>Sun, 7 Jul 2024 19:27:10 +0900</pubDate>
    </item>
    <item>
      <title>유니온 타입과 제네릭</title>
      <link>https://ted93.tistory.com/entry/%EC%9C%A0%EB%8B%88%EC%98%A8-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%A0%9C%EB%84%A4%EB%A6%AD</link>
      <description>&lt;h1&gt;1. 유니온 타입&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 타입 중 하나가 될 수 있는 값을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;function unionGeneric&amp;lt;T extends string | number&amp;gt;(value: T) {
  if (typeof value === 'string') {
    return value.toLowerCase();
  }
  return value; // string | number
}

const result1 = unionGeneric('STring');
const result2 = unionGeneric(1000);
console.log(result1, result2); // string 1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 제네릭 유틸리티 타입&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트에 내장된 일련의 제네릭 타입&lt;/li&gt;
&lt;li&gt;기존 타입을 변환하거나 조작하는데 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) Partial: 모든 속성을 선택적으로 만들어줌&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;형태: Partial&amp;lt;T&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;interface User {
  name: string;
  age: number;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 데이터 예시 사용자의 초기 데이터 지정 | 사용자 데이터 입력(생성)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const users: { [key: number]: User } = {
  1: { name: '테드', age: 30 },
  2: { name: '챨리', age: 29 },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 사용자 데이터를 업데이트하는 함수 구현 사용자의 id(key)값을 사용하여 name 또는 age의 값을 업데이트(수정)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function updateUser(id: number, changes: Partial&amp;lt;User&amp;gt;) {
  const user = users[id]; // User 타입의 객체

  if (!user) {
    console.log(`User with id ${id} not found`);
  }
  //   변경 사항 적용
  //   : 스프레드 연산자를 사용하여 해당 유저의 전체 데이터를 불러와
  //   : changes 객체에 담긴 속성의 값을 새로고침(업데이트)
  //   - 객체의 경우 키의 값이 중복되는 경우 뒤의 속성값으로 업데이트
  users[id] = { ...user, ...changes };
}

updateUser(1, { name: 'TED' });
updateUser(2, { age: 34 });
updateUser(3, { name: 'Micheal', age: 55 }); // User with id 3 not found
console.log(users[1]); // { name: 'TED', age: 30 }
console.log(users[2]); // { name: '챨리', age: 34 }
console.log(users[3]); // { name: 'Micheal', age: 55 }
// 없던 인덱스에 정보를 넣어서 새로운 객체가 생성 되었음
users[4] = { name: '안녕', age: 5 };
console.log(users[4]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) Readonly: 모든 속성을 읽기 전용 속성을 변경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;형태: Readonly&amp;lt;T&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface Human {
  name: string;
  age: number;
}

let user: Readonly&amp;lt;Human&amp;gt; = {
  // 값의 변경을 허락하지 않는 문법
  name: '테드',
  age: 30,
};

user.name = 'Ted'; // Error - 읽기 전용 속성이므로 'name'에 할당할 수 없습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유니온 타입과 제네릭 함수 작성 예시 문자열 배열과 숫자 배열 중 하나를 입력받아 배열의 첫 번째 요소를 반환하는 제네릭 함수 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;function getFirstElement&amp;lt;T extends string[] | number[]&amp;gt;(
  array: T,
): string | number {
  if (typeof array[0] === 'string') {
    return array[0] as string;
  }
  return array[0] as number;
}

const firstString = getFirstElement(['apple', 'banana', 'orange']);
const firstNumber = getFirstElement([1, 2, 3]);
console.log(firstString); // apple
console.log(firstNumber); // 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/c349f83739854f50be314d562be409b2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/c349f83739854f50be314d562be409b2?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719223502942&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;유니온 타입과 제네릭 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/c349f83739854f50be314d562be409b2?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/c349f83739854f50be314d562be409b2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BMhyE/hyWrThY6UI/bvsF6KU03PIzREteM20Qhk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/d2zQ8j/hyWoB4mZv9/aA2h6bKzCrxLaBxekJOp0k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/c349f83739854f50be314d562be409b2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/c349f83739854f50be314d562be409b2?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BMhyE/hyWrThY6UI/bvsF6KU03PIzREteM20Qhk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/d2zQ8j/hyWoB4mZv9/aA2h6bKzCrxLaBxekJOp0k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;유니온 타입과 제네릭 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>Generic</category>
      <category>partial</category>
      <category>readonly</category>
      <category>typescript</category>
      <category>유니온타입</category>
      <category>제너릭</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/78</guid>
      <comments>https://ted93.tistory.com/entry/%EC%9C%A0%EB%8B%88%EC%98%A8-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%A0%9C%EB%84%A4%EB%A6%AD#entry78comment</comments>
      <pubDate>Sat, 6 Jul 2024 15:05:03 +0900</pubDate>
    </item>
    <item>
      <title>제네릭의 제약 조건</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%9D%98-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4</link>
      <description>&lt;h1&gt;1. 제네릭의 제약 조건&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-1) 제약 조건(Constraints)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 매개변수가 특정 조건을 만족해야 한다는 것을 명시하는 방법&lt;/li&gt;
&lt;li&gt;제네릭 타입의 사용 범위를 제한, 특정 속성이나 메서드에 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-2) 제네릭 제약조건의 예시&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Lengthwise {
  // length 속성을 가지는 인터페이스
  length: number;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제약 조건 사용을 위해 T라는 제네릭 타입이 Lengthwise 인터페이스를, 확장(상속)해야 함&lt;/li&gt;
&lt;li&gt;length 속성을 포함하는 어떠한 객체든지 인자로 전달 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;function constraints&amp;lt;T extends Lengthwise&amp;gt;(arg: T): T {
  // T는 객체 타입(length 속성을 반드시 가지는)
  console.log(arg.length);
  // arg 매개변수는 반드시 .length 속성이 포함되어 있음
  return arg;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;arg 매개변수는 반드시 length 속성을 가지기 때문에 자동완성 기능에도 제공이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Constraints.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Vff6/btsIaUpDLIu/5qLq8SkGXOlgWmwGOReKwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Vff6/btsIaUpDLIu/5qLq8SkGXOlgWmwGOReKwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Vff6/btsIaUpDLIu/5qLq8SkGXOlgWmwGOReKwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Vff6%2FbtsIaUpDLIu%2F5qLq8SkGXOlgWmwGOReKwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Constraints&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;78&quot; data-filename=&quot;Constraints.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;let variable = constraints({
  length: 10,
  // length 속성을 가진 객체
  // +) 추가로 기타 속성 명시가 가능 &amp;gt;&amp;gt; 확장!
  value: 3,
  addedOption: '안녕하세요',
});

console.log(variable); // { length: 10, value: 3, addedOption: '안녕하세요' }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-3) 최소한의 속성을 가진 객체 찾기&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyof 연산자&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 형태의 타입을 따로 속성만 뽑아 유니온 타입으로 만들어주는 연산자&lt;/li&gt;
&lt;li&gt;모든 키의 이름을 유니온 타입으로 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;type Type = {
  name: string;
  age: number;
};

type Union = keyof Type;
// Union = name | age;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 사용 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;interface Index {
  [key: string]: number;
}

function findMin&amp;lt;T extends Index, K extends keyof T&amp;gt;(array: T[], key: K) {
  // array 배열 내에서 최소 값을 가진 객체를 찾기
  return array.reduce((min, item) =&amp;gt; {
    return item[key] &amp;lt; min[key] ? item : min;
  }, array[0]);
}
// 함수 사용 예시
const result = findMin([{ a: 20 }, { b: 15 }, { a: 30 }, { a: 10 }], 'a');
console.log(result); // { a: 10 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 조건부 타입&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 매개변수에 대한 조건 표현식을 기반으로 타입을 결정하는 방식&lt;/li&gt;
&lt;li&gt;if문과 유사한 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type Check&amp;lt;T&amp;gt; = T extends string ? 'String' : 'Not a String';

type Type1 = Check&amp;lt;string&amp;gt;; // String;
type Type2 = Check&amp;lt;number&amp;gt;; // Not a String

function checkType&amp;lt;T&amp;gt;(value: T): Check&amp;lt;T&amp;gt; {
  return typeof value === 'string'
    ? ('String' as Check&amp;lt;T&amp;gt;)
    : ('Not a String' as Check&amp;lt;T&amp;gt;);
}

console.log(checkType&amp;lt;string&amp;gt;('안녕하세요')); // String
console.log(checkType&amp;lt;number&amp;gt;(500)); // Not a String
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-1) 타입 단언&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트에게 개발자가 특정 값의 타입임을 알고 있음을 전달&lt;/li&gt;
&lt;li&gt;컴파일러가 타입을 정확하게 추론하지 못하는 경우&lt;/li&gt;
&lt;li&gt;개발자가 구체적인 타입을 프로그램에게 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각주 문법(as 키워드)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;someValue를 boolean 값으로 변환하는 경우&lt;/li&gt;
&lt;li&gt;해당 값의 길이가 측정되지 않아 undefined로 출력&lt;/li&gt;
&lt;li&gt;undefined: 길이 측정은 문자열일 경우에만 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let someValue: any = 'this is a string';
let strLength: number = (someValue as string).length;
console.log(strLength); // 16

someValue = true;
strLength = (someValue as string).length;
console.log(strLength); // undefined
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-2) 타입 제한 예시&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건부 타입 명시와 타입 단언을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type IsNumber&amp;lt;T&amp;gt; = T extends number ? number : string;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;processValue 함수&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 타입인 경우에는 그 숫자의 제곱근&lt;/li&gt;
&lt;li&gt;숫자가 아닌 경우에는 Not a number 문자열을 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function processValue&amp;lt;T&amp;gt;(value: T): IsNumber&amp;lt;T&amp;gt; {
  if (typeof value === 'number') {
    return Math.sqrt(value) as IsNumber&amp;lt;T&amp;gt;;
  }
  return 'Not a Number' as IsNumber&amp;lt;T&amp;gt;;
}

console.log(processValue(9)); // 3
console.log(processValue('hello')); // Not a Number
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/f6cfdb9019f44687bb0203cb9bda57ae?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/f6cfdb9019f44687bb0203cb9bda57ae?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719222875925&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;제네릭의 제약 조건 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/f6cfdb9019f44687bb0203cb9bda57ae?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/f6cfdb9019f44687bb0203cb9bda57ae&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Czi03/hyWoIPWT86/9jtgupjMnqn1s86yxxCgp1/img.png?width=2000&amp;amp;height=1050&amp;amp;face=0_0_2000_1050,https://scrap.kakaocdn.net/dn/A7IDJ/hyWrPmldIf/GzaVkZzx0H2u5xfwoqgCy0/img.png?width=2000&amp;amp;height=1050&amp;amp;face=0_0_2000_1050&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/f6cfdb9019f44687bb0203cb9bda57ae?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/f6cfdb9019f44687bb0203cb9bda57ae?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Czi03/hyWoIPWT86/9jtgupjMnqn1s86yxxCgp1/img.png?width=2000&amp;amp;height=1050&amp;amp;face=0_0_2000_1050,https://scrap.kakaocdn.net/dn/A7IDJ/hyWrPmldIf/GzaVkZzx0H2u5xfwoqgCy0/img.png?width=2000&amp;amp;height=1050&amp;amp;face=0_0_2000_1050');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;제네릭의 제약 조건 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>constraints</category>
      <category>Generic</category>
      <category>typescript</category>
      <category>제너릭</category>
      <category>제약조건</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/77</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%9D%98-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4#entry77comment</comments>
      <pubDate>Fri, 5 Jul 2024 19:54:45 +0900</pubDate>
    </item>
    <item>
      <title>제네릭(Generic)</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%9C%EB%84%A4%EB%A6%ADGeneric</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제네릭 정의&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재사용 가능한 컴포넌트(코드 단위)를 만드는데 사용&lt;/li&gt;
&lt;li&gt;컴포넌트가 처리할 데이터 타입을 미리 지정하지 않고&lt;/li&gt;
&lt;li&gt;해당 컴포넌트를 사용하는 시점에서 원하는 데이터 타입 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 제네릭의 필요성&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 중복을 줄임, 재사용 가능한 컴포넌트 생성&lt;/li&gt;
&lt;li&gt;다양한 타입을 처리하는 함수나 클래스 생성 가능&lt;/li&gt;
&lt;li&gt;타입 안정성 보장
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'컴파일' 시점에 타입을 체크&lt;/li&gt;
&lt;li&gt;'런타임'에서 발생할 수 있는 에러를 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컴파일(Compile)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스코드를 작성하고 편집하는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;런타임(Runtime)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 과정을 마친 프로그램이 사용자에 의해 실행되어 동작되어지는 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 제네릭 기본 문법&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용할 컴포넌트(변수, 함수, 클래스 등)의 이름뒤에 꺽쇠괄호(&amp;lt;&amp;gt;) 안에 타입 변수를 넣는 것&lt;/li&gt;
&lt;li&gt;함수나 클래스 등에서 사용할 타입을 명시&lt;/li&gt;
&lt;li&gt;임의의 키워드를 사용하여 명시, 일반적으로 대문자 알파벳 하나를 사용 (T: Type)&lt;/li&gt;
&lt;li&gt;해당 타입 변수는 컴포넌트 내에서 실제 데이터 타입의 자리를 대신&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;function generic&amp;lt;T&amp;gt;(arg: T): T {
  // T(Type)는 타입 변수 (단일 타입 변수)
  // : 해당 타입 변수는 입력 인수의 타입을 T로 지정
  // , 함수의 반환 타입을 T로 지정
  return arg;
}

let stringOutput = generic&amp;lt;string&amp;gt;('안녕하세요');
// let stringOutput = generic('안녕하세요'); // &amp;lt;string&amp;gt;은 생략 가능

let stringOutput2 = generic&amp;lt;string&amp;gt;(500); // Error
// 'number' 형식의 인수는 'string' 형식의 매개 변수에 할당될 수 없습니다.

let numberOutput = generic&amp;lt;number&amp;gt;(500);
// let numberOutput = generic&amp;lt;number&amp;gt;(500); // &amp;lt;number&amp;gt;는 생략 가능

let numberOutput2 = generic&amp;lt;number&amp;gt;('반갑습니다'); // Error
// 'string' 형식의 인수는 'number' 형식의 매개 변수에 할당될 수 없습니다.

console.log(stringOutput); // 안녕하세요
console.log(numberOutput); // 500
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 여러 제네릭 타입 변수 지정&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 개의 독립적인 타입을 처리해야 할 때 여러 타입 변수를 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;function pair&amp;lt;T, U&amp;gt;(first: T, second: U): [T, U] {
  return [first, second];
}

let pairOutput = pair('안녕', 5);
// let pairOutput2 = pair&amp;lt;string, number&amp;gt;(5, '안녕'); // - Error
console.log(pairOutput);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제네릭 타입을 사용했을때, 처음 사진에는 unknown 타입으로&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;generic.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Gptb/btsHSeCE6l1/SgEjqBw3XPSbY93RbYMaaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Gptb/btsHSeCE6l1/SgEjqBw3XPSbY93RbYMaaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Gptb/btsHSeCE6l1/SgEjqBw3XPSbY93RbYMaaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Gptb%2FbtsHSeCE6l1%2FSgEjqBw3XPSbY93RbYMaaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;generic&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;186&quot; data-filename=&quot;generic.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그리고 &amp;ldquo;&amp;rdquo; (빈 값)을 넣었을 때는 타입이 string으로&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;generic2.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IwGfY/btsHUichjH7/QGCLepepi0LQQWKVGitixK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IwGfY/btsHUichjH7/QGCLepepi0LQQWKVGitixK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IwGfY/btsHUichjH7/QGCLepepi0LQQWKVGitixK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIwGfY%2FbtsHUichjH7%2FQGCLepepi0LQQWKVGitixK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;generic&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;80&quot; data-filename=&quot;generic2.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 5를 넣었을 때는 number 타입으로 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;generic3.png&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNqD1/btsHUbK28TG/CXwgtevTVsjQsHVmyne0mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNqD1/btsHUbK28TG/CXwgtevTVsjQsHVmyne0mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNqD1/btsHUbK28TG/CXwgtevTVsjQsHVmyne0mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzNqD1%2FbtsHUbK28TG%2FCXwgtevTVsjQsHVmyne0mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;generic&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;78&quot; data-filename=&quot;generic3.png&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. 제네릭을 사용하는 컴포넌트들 예시&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1) 제네릭 함수&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;function genericFunc&amp;lt;T&amp;gt;(args: T[]): T[] {
  console.log('배열의 길이:', args.length);
  return args;
}

let resultFunc = genericFunc&amp;lt;boolean&amp;gt;([true, false, false]);
console.log(`함수의 반환값: ${resultFunc}`);
// 배열의 길이: 3
// 함수의 반환값: true,false,false
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2) 제네릭 인터페이스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 매개변수&amp;lt;T&amp;gt;를 가지는 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface IGeneric&amp;lt;T&amp;gt; {
  (arg: T): T; // 객체의 메서드 인터페이스 명시
}

function identity&amp;lt;T&amp;gt;(arg: T): T {
  return arg;
}

let myIdentity: IGeneric&amp;lt;number&amp;gt; = identity;
console.log(identity(5)); // 5
console.log(identity('안녕')); // 안녕
console.log(myIdentity(5)); // 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-3) 제네릭 클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 매개변수&amp;lt;T&amp;gt;를 가지는 클래스&lt;/li&gt;
&lt;li&gt;다양한 타입의 속성이나 메소드를 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class GenericClass&amp;lt;T&amp;gt; {
  value: T;
  add: (x: T, y: T) =&amp;gt; T;
  constructor(value: T, addFunction: (x: T, y: T) =&amp;gt; T) {
    this.value = value;
    this.add = addFunction;
  }
}

let myGenericNumber = new GenericClass&amp;lt;number&amp;gt;(0, function (x, y) {
  return x + y;
});
let myGenericString = new GenericClass&amp;lt;string&amp;gt;('', function (x, y) {
  return `${x}, ${y}`;
});

console.log(myGenericNumber.add(5, 3)); // 8
console.log(myGenericString.add('테', '드')); // 테, 드
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. 제네릭 예제&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 1: 제네릭 함수 작성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;reverseArray 제네릭 함수 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;function reverseArray&amp;lt;T&amp;gt;(array: T[]): T[] {
  let reverseArr = array.reverse();
  return reverseArr;
}

let stringArr = reverseArray&amp;lt;string&amp;gt;(['a', 'b', 'c']);
console.log(stringArr); // [ 'c', 'b', 'a' ]

let numberArr = reverseArray&amp;lt;number&amp;gt;([1, 2, 3]);
console.log(numberArr); // [ 3, 2, 1 ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 2: 제네릭 인터페이스 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KeyValue라는 제네릭 인터페이스를 정의&lt;/li&gt;
&lt;li&gt;인터페이스는 key와 value라는 두 개의 속성을 가지며, 각각의 타입은 제네릭으로 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;interface KeyValue&amp;lt;K, V&amp;gt; {
  key: K;
  value: V;
}

let keyValue: KeyValue&amp;lt;string, number&amp;gt; = {
  key: '테드',
  value: 5,
};

let anotherKeyValue: KeyValue&amp;lt;boolean, number&amp;gt; = {
  key: true,
  value: 55,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 3: 제네릭을 사용한 고차함수 구현&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mapArray라는 제네릭 고차함수 작성&lt;/li&gt;
&lt;li&gt;배열과 배열의 각 요소를 변환하는 콜백함수를 매개변수로 전달&lt;/li&gt;
&lt;li&gt;변환된 요소로 구성된 새 배열을 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;function mapArray&amp;lt;T, U&amp;gt;(array: T[], callback: (item: T) =&amp;gt; U): U[] {
  // T타입의 요소를 가진 배열이 map으로 전체 순회
  // 해당 타입에 따라 기능 구현 후 U타입의 배열로 반환
  return array.map(callback);
}

let numbers = [1, 2, 3, 4, 5];
let doubledNumbers = mapArray&amp;lt;number, number&amp;gt;(numbers, (x) =&amp;gt; x * 2);
console.log(doubledNumbers); // [ 2, 4, 6, 8, 10 ]

let strings = ['a', 'b', 'c'];
let uppercasedStrings = mapArray&amp;lt;string, string&amp;gt;(strings, (x) =&amp;gt;
  x.toUpperCase(),
);
console.log(uppercasedStrings); // [ 'A', 'B', 'C' ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Generic-a38258bc662843948f630ae7e9f099be?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Generic-a38258bc662843948f630ae7e9f099be?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717985483395&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;제네릭(Generic) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Generic-a38258bc662843948f630ae7e9f099be?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/a38258bc662843948f630ae7e9f099be&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/imWaK/hyWllMriE2/7NBZGnahtky01ScwRxE6F1/img.png?width=2000&amp;amp;height=464&amp;amp;face=0_0_2000_464,https://scrap.kakaocdn.net/dn/EvlwE/hyWg1vj9Xy/VdwK9s23jhX60Hjnk7MIak/img.png?width=2000&amp;amp;height=464&amp;amp;face=0_0_2000_464&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Generic-a38258bc662843948f630ae7e9f099be?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Generic-a38258bc662843948f630ae7e9f099be?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/imWaK/hyWllMriE2/7NBZGnahtky01ScwRxE6F1/img.png?width=2000&amp;amp;height=464&amp;amp;face=0_0_2000_464,https://scrap.kakaocdn.net/dn/EvlwE/hyWg1vj9Xy/VdwK9s23jhX60Hjnk7MIak/img.png?width=2000&amp;amp;height=464&amp;amp;face=0_0_2000_464');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;제네릭(Generic) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>Generic</category>
      <category>typescript</category>
      <category>제너릭</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/75</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%9C%EB%84%A4%EB%A6%ADGeneric#entry75comment</comments>
      <pubDate>Thu, 4 Jul 2024 12:05:35 +0900</pubDate>
    </item>
    <item>
      <title>팩토리 패턴(Factory Pattern)</title>
      <link>https://ted93.tistory.com/entry/%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4Factory-Pattern</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 지향 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나&lt;/li&gt;
&lt;li&gt;객체의 생성을 캡슐화하여 클라이언트 코드가 생성되는 객체의 구체적인 타입에 의존하지 않도록 하는 것&lt;/li&gt;
&lt;li&gt;코드의 유연성을 높이고, 변경에 대한 영향을 최소화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1. 팩토리 패턴의 주요 구성 요소&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) Product&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성될 객체들의 공통 인터페이스&lt;/li&gt;
&lt;li&gt;팩토리는 이 인터페이스를 구현하는 다양한 객체들을 생성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) ConcreteProduct&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Product 인터페이스를 구현하는 구체적인 클래스들&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3) Creator&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Product 객체를 생성하는 메서드(factoryMethod)를 선언하는 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-4) ConcreteCreator&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Creator 인터페이스를 구현하며, factoryMethod를 오버라이딩하여 ConcreteProduct 인스턴스를 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 팩토리 패턴의 장점&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 결합도 감소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트 코드가 구체적인 클래스를 몰라도 객체를 생성 가능, 시스템의 결합도를 낮춤&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 코드 유연성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 ConcreteProduct 클래스를 추가하더라도 기존 코드를 변경하지 않고 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3) 재사용성 향상&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 방법으로 다양한 객체를 재사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. TypeScript에서의 팩토리 패턴 구현 예제&lt;/h1&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;interface Component {
  render(): void;
}

// Button 구현
class Button implements Component {
  render(): void {
    console.log('버튼이 렌더링 됩니다');
  }
}

// Checkbox 구현
class Checkbox implements Component {
  render(): void {
    console.log('체크박스가 렌더링됩니다.');
  }
}

// Component Factory
class ComponentFactory {
  static createComponent(type: string): Component {
    switch (type) {
      case 'button':
        return new Button();
      case 'checkbox':
        return new Checkbox();
      default:
        throw new Error('유효하지 않은 컴포넌트 타입입니다');
    }
  }
}

// 클라이언트 코드
const button = ComponentFactory.createComponent('button');
button.render();
const checkbox = ComponentFactory.createComponent('checkbox');
checkbox.render();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 팩토리 패턴으로 결제 구현 예제&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 타입의 결제 방식을 처리할 수 있는 결제 시스템을 설계&lt;/li&gt;
&lt;li&gt;다양한 결제 서비스(예: 신용 카드, 페이팔, 은행 이체 등)를 처리 , 클라이언트 코드는 구체적인 결제 방식의 클래스를 몰라도 결제를 진행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요구사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 결제 방식 지원 신용 카드, 페이팔, 은행 이체 등 다양한 결제 방법을 지원&lt;/li&gt;
&lt;li&gt;결제 방식 쉽게 추가 가능 새로운 결제 방식을 추가할 때 기존 코드를 수정하지 않고 확장 가능&lt;/li&gt;
&lt;li&gt;결제 방식에 따른 처리 캡슐화 각 결제 방식에 따른 처리 로직은 해당 결제 클래스 내부에서 완결&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;팩토리 패턴 구성 요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PaymentMethod (Interface) 모든 결제 방식이 구현해야 하는 인터페이스, 주로 결제를 실행하는 메소드를 포함&lt;/li&gt;
&lt;li&gt;ConcretePaymentMethods PaymentMethod 인터페이스를 구현하는 구체적인 결제 방식 클래스&lt;/li&gt;
&lt;li&gt;PaymentFactory 결제 방식 객체를 생성하는 팩토리 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구현 코드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결제 방법 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface PaymentMethod {
  pay(amount: number): void;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신용 카드 결제 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class CreditCard implements PaymentMethod {
  pay(amount: number): void {
    console.log(`Paid ${amount} using credit card`);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이팔 결제 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class PayPal implements PaymentMethod {
  pay(amount: number): void {
    console.log(`Paid ${amount} using paypal`);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;은행 이체 결제 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class BankTransfer implements PaymentMethod {
  pay(amount: number): void {
    console.log(`Paid ${amount} using bank transfer`);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결제 방법 팩토리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;class PaymentFactory {
  static createPaymentMethod(method: string): PaymentMethod {
    switch (method) {
      case 'creditCard':
        return new CreditCard();
      case 'paypal':
        return new PayPal();
      case 'bankTransfer':
        return new BankTransfer();
      default:
        throw new Error('지원하지 않는 결제 방식입니다.');
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const paymentMethod = PaymentFactory.createPaymentMethod('paypal');
paymentMethod.pay(100); // Paid 100 using paypal

const anotherPaymentMethod = PaymentFactory.createPaymentMethod('creditCard');
anotherPaymentMethod.pay(200); // Paid 200 using credit card&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Factory-Pattern-6078afebf8634075a69ada72674152aa?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Factory-Pattern-6078afebf8634075a69ada72674152aa?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717983414084&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;팩토리 패턴(Factory Pattern)  | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Factory-Pattern-6078afebf8634075a69ada72674152aa?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/6078afebf8634075a69ada72674152aa&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ekX4Y7/hyWlbbZGnB/uxDFY3klUDGPxIyEoFhE01/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bWYl5K/hyWlgdiwsm/KrlReymsrOed4AVBQ1DqL1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Factory-Pattern-6078afebf8634075a69ada72674152aa?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Factory-Pattern-6078afebf8634075a69ada72674152aa?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ekX4Y7/hyWlbbZGnB/uxDFY3klUDGPxIyEoFhE01/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bWYl5K/hyWlgdiwsm/KrlReymsrOed4AVBQ1DqL1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;팩토리 패턴(Factory Pattern) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>factory-pattern</category>
      <category>typescript</category>
      <category>디자인패턴</category>
      <category>타입스크립트</category>
      <category>팩토리패턴</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/74</guid>
      <comments>https://ted93.tistory.com/entry/%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4Factory-Pattern#entry74comment</comments>
      <pubDate>Wed, 3 Jul 2024 18:11:02 +0900</pubDate>
    </item>
    <item>
      <title>싱글톤 패턴</title>
      <link>https://ted93.tistory.com/entry/%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4</link>
      <description>&lt;pre id=&quot;code_1717982498707&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;특정 클래스의 인스턴스가 프로그램 내에서 오직 하나만 존재하도록 보장하는 디자인 패턴
주로 자원을 공유해야 하는 상황에서 유용
일관된 상태를 유지하고 싶을 때 적합

데이터베이스 연결이나 로그 파일 핸들러와 같이 시스템 전체에서
단 하나만 있어야 하는 리소스를 관리할 때 사용&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;1. 싱글톤 패턴의 구현 방법&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 생성자를 비공개로 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 외부에서 new 키워드를 사용하여 인스턴스를 생성할 수 없도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 클래스 내부에서 인스턴스 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 자체가 자신의 유일한 인스턴스를 생성하고 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3) 전역 접근점 제공&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스에 접근할 수 있는 정적 메소드(보통 getInstance라고 명명)를 제공&lt;/li&gt;
&lt;li&gt;필요할 때 인스턴스를 생성하고, 이미 인스턴스가 존재하면 기존 인스턴스를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. TypeScript에서의 싱글톤 패턴 구현 예제&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로거 기능을 싱글톤으로 구현&lt;/li&gt;
&lt;li&gt;로거는 애플리케이션의 다양한 부분에서 메시지를 로깅하는 데 사용&lt;/li&gt;
&lt;li&gt;Logger 클래스는 자신의 유일한 인스턴스를 관리하며, 이 인스턴스에 대한 전역 접근점을 제공&lt;/li&gt;
&lt;li&gt;getInstance 메소드는 인스턴스가 아직 생성되지 않았다면 새로 생성하고, 이미 존재한다면 기존 인스턴스를 반환&lt;/li&gt;
&lt;li&gt;Logger 클래스의 모든 사용자가 동일한 인스턴스를 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// LogLevel 타입 정의
type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';

// Logger 클래스 정의
class Logger {
  private static instance: Logger;
  private logLevel: LogLevel = 'info';
  private logs: string[] = [];

  // 외부에서 직접적인 인스턴스 생성을 불가능하게 설정
  private constructor() {}

  public static getInstance(): Logger {
    // Logger.instance는 정적메서드 호출 방식임
    if (!Logger.instance) {
      Logger.instance = new Logger();
    }
    return Logger.instance;
  }

  public setLogLevel(level: LogLevel): void {
    this.logLevel = level;
  }
  public log(message: string, level: LogLevel = 'info'): void {
    const levels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'];

    // 입력된 로그 레벨이 현재 설정된 로그 레벨 이상일 때만 로그를 기록
    if (levels.indexOf(level) &amp;gt;= levels.indexOf(this.logLevel)) {
      const timestamp = new Date().toISOString();
      const formattedMsg = `[${timestamp}] [${level}]: ${message}`;

      this.logs.push(formattedMsg);
      console.log(formattedMsg);
    }
  }

  public printLogHistory(): void {
    console.log('-----전체 히스토리 출력-----');
    console.log(this.logs.join('\\n'));
  }
}
const logger = Logger.getInstance();
logger.setLogLevel('debug'); // 로그 레벨을 debug로 설정
logger.log('이것은 디버그 메세지입니다.', 'debug');
logger.log('이것은 정보출력 메세지입니다.', 'info');

logger.printLogHistory();

const anotherLogger = Logger.getInstance();
anotherLogger.printLogHistory();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로거(Logger)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어의 실행 중에 발생하는 이벤트를 기록하는 도구&lt;/li&gt;
&lt;li&gt;개발자나 시스템 관리자가 소프트웨어의 상태를 실시간으로 모니터링하거나, 나중에 문제를 진단할 수 있는 기록을 남기는 것이 가능&lt;/li&gt;
&lt;li&gt;주로 디버깅, 오류 추적, 시스템 상태 모니터링, 보안 감사 등 다양한 목적으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717982964048&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;싱글톤 패턴 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YzUxh/hyWlaRGoi0/zfobk2zRs99auO3nofPk91/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/czjoA9/hyWg5qYH6Z/FkZIMUsGSeOQGOWtiUqD81/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/7be8178ee46d44948abac9b6762c98c9?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YzUxh/hyWlaRGoi0/zfobk2zRs99auO3nofPk91/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/czjoA9/hyWg5qYH6Z/FkZIMUsGSeOQGOWtiUqD81/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;싱글톤 패턴 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>logger</category>
      <category>singleton-pattern</category>
      <category>typescript</category>
      <category>디자인패턴</category>
      <category>로거</category>
      <category>싱글톤</category>
      <category>싱글톤패턴</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/73</guid>
      <comments>https://ted93.tistory.com/entry/%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4#entry73comment</comments>
      <pubDate>Tue, 2 Jul 2024 11:29:41 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴이란?</title>
      <link>https://ted93.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 디자인에서 자주 발생하는 문제들을 해결하기 위한 잘 정립된 해결책&lt;br /&gt;패턴들은 개발 과정을 보다 효율적으로 생성하게 함&lt;br /&gt;코드의 재사용성, 유지보수성, 커뮤니케이션의 효율성을 증가&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용되는 디자인 패턴&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;1. 싱글톤 패턴(Singleton Pattern)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 인스턴스가 하나만 생성&lt;/li&gt;
&lt;li&gt;어디서든 그 인스턴스에 접근할 수 있도록 하는 패턴&lt;/li&gt;
&lt;li&gt;사용 예: 데이터베이스 연결, 로거 설정 등&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;class Singleton {
  private static instance: Singleton;

  private constructor() {
    // 생성자는 private으로 선언하여 외부에서 인스턴스를 생성 X
  }

  public static getInstance(): Singleton {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }
    return Singleton.instance;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 팩토리 패턴(Factory Pattern)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 생성 과정을 캡슐화&lt;/li&gt;
&lt;li&gt;클라이언트가 구체적인 클래스에 의존하지 않도록 하는 패턴&lt;/li&gt;
&lt;li&gt;사용 예: 다양한 타입의 객체를 생성할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;interface Product {
  operate(): void;
}

class ConcreteProductA implements Product {
  operate() {
    console.log('Product A is operating');
  }
}

class ConcreteProductB implements Product {
  operate() {
    console.log('Product B is operating');
  }
}

class Factory {
  public static createProduct(type: 'A' | 'B'): Product {
    if (type === 'A') {
      return new ConcreteProductA();
    } else {
      return new ConcreteProductB();
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/0848bbfaafab42d3a8a49b8b65c492e2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/0848bbfaafab42d3a8a49b8b65c492e2?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717971276145&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;디자인 패턴이란? | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/0848bbfaafab42d3a8a49b8b65c492e2?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/0848bbfaafab42d3a8a49b8b65c492e2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mmrsH/hyWlesYHRz/xEDfzrAHUBKftV3Wa0Yhf1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/1GYY1/hyWlaREhxz/qdi1k29UjYurKwACUC3loK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/0848bbfaafab42d3a8a49b8b65c492e2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/0848bbfaafab42d3a8a49b8b65c492e2?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mmrsH/hyWlesYHRz/xEDfzrAHUBKftV3Wa0Yhf1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/1GYY1/hyWlaREhxz/qdi1k29UjYurKwACUC3loK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;디자인 패턴이란? | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>design-pattern</category>
      <category>factory-pattern</category>
      <category>singleton-pattern</category>
      <category>typescript</category>
      <category>디자인패턴</category>
      <category>싱글톤패턴</category>
      <category>타입스크립트</category>
      <category>팩토리패턴</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/72</guid>
      <comments>https://ted93.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80#entry72comment</comments>
      <pubDate>Mon, 1 Jul 2024 08:14:51 +0900</pubDate>
    </item>
    <item>
      <title>퀴즈 - 직원 관리 시스템</title>
      <link>https://ted93.tistory.com/entry/%ED%80%B4%EC%A6%88-%EC%A7%81%EC%9B%90-%EA%B4%80%EB%A6%AC-%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
      <description>&lt;h1&gt;Employee 기본 클래스 생성&lt;/h1&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Employee {
  // 속성: name (문자열)과 id (숫자)
  // 생성자를 사용하여 초기화
  // 메서드: displayInfo() 메서드 - 직원의 정보를 출력
}
&lt;/code&gt;&lt;/pre&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Employee {
  constructor(
    public name: string,
    public id: number,
  ) {}
  displayInfo() {
    console.log(`Name: ${this.name}, Id: ${this.id}`);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Manager 클래스 생성&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Employee 클래스를 확장&lt;/p&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Manager extends Employee {
  // 추가 속성: subordinates (Employee 배열)
  // 부모 클래스의 생성자를 호출
  // 메서드: addSubordinate(employee: Employee) 메서드 - 하위 직원을 목록에 추가  
  // 메서드: listSubordinates() - 모든 하위 직원의 정보를 출력  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Manager extends Employee {
  private subordinates: Employee[] = [];
  constructor(name: string, id: number) {
    super(name, id);
  }
  addSubordinate(employee: Employee) {
    this.subordinates.push(employee);
  }
  listSubordinates(): void {
    console.log(`Manager: ${this.name}`);
    this.subordinates.forEach((emp) =&amp;gt; emp.displayInfo());
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;사용 및 출력&lt;/h1&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;const managerA = new Manager('테드', 1);
const emp1 = new Employee('찰리', 2);
const emp2 = new Employee('마이클', 3);

managerA.addSubordinate(emp1);
managerA.addSubordinate(emp2);
managerA.listSubordinates();
// Manager: 테드
// Name: 찰리, Id: 2
// Name: 브라운, Id: 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/126f533e69834acb8cc50831e0a10729?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/126f533e69834acb8cc50831e0a10729?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717400049296&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;퀴즈 - 직원 관리 시스템 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/126f533e69834acb8cc50831e0a10729?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/126f533e69834acb8cc50831e0a10729&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2r0Ka/hyWg78ARNM/hGkfpTVApQ05OOKKIdHkZK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/yruqQ/hyWdlOdhCM/ZDk5ZMzzXmbhUloUuZwkKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/126f533e69834acb8cc50831e0a10729?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/126f533e69834acb8cc50831e0a10729?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2r0Ka/hyWg78ARNM/hGkfpTVApQ05OOKKIdHkZK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/yruqQ/hyWdlOdhCM/ZDk5ZMzzXmbhUloUuZwkKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;퀴즈 - 직원 관리 시스템 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>private</category>
      <category>public</category>
      <category>typescript</category>
      <category>객체지향프로그래밍</category>
      <category>접근제한자</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/71</guid>
      <comments>https://ted93.tistory.com/entry/%ED%80%B4%EC%A6%88-%EC%A7%81%EC%9B%90-%EA%B4%80%EB%A6%AC-%EC%8B%9C%EC%8A%A4%ED%85%9C#entry71comment</comments>
      <pubDate>Sun, 30 Jun 2024 10:35:30 +0900</pubDate>
    </item>
    <item>
      <title>Static 키워드</title>
      <link>https://ted93.tistory.com/entry/Static-%ED%82%A4%EC%9B%8C%EB%93%9C</link>
      <description>&lt;h1&gt;1. 정적(Static) 메소드와 프로퍼티&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 인스턴스가 아닌 클래스 자체에 바인딩된 메소드와 프로퍼티&lt;/li&gt;
&lt;li&gt;인스턴스 없이도 클래스 이름을 통해 직접 접근하고 호출 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 바인딩(binding)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위&lt;/li&gt;
&lt;li&gt;주의 사항
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;static 멤버(메소드와 속성)는 인스턴스와 독립적이기 때문에&lt;/li&gt;
&lt;li&gt;static 메소드 내에서는 this 키워드를 사용하여 접근 할 수 X&lt;/li&gt;
&lt;li&gt;인스턴스별로 데이터를 유지할 필요가 없는 공통 기능 및 데이터에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3) 사용방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static 키워드를 사용하여 정의'&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;class Circle {
  static pi: number = 3.14;

  static calculateArea(radius: number): number {
    // 정적 메서드와 속성 호출 방법
    // - 클래스명.속성
    // - 클래스명.메서드()
    return Circle.pi * radius * radius;
  }
}

console.log(Circle.pi); // 3.14
console.log(Circle.calculateArea(5)); // 78.5
console.log(Circle.calculateArea(10)); // 314
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 접근자(Getter / Setter)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getter: 클래스의 특정 프로퍼티 값을 읽을 때 사용되는 메소드&lt;/li&gt;
&lt;li&gt;setter: 클래스의 특정 프로퍼티 값을 설정할 때 사용되는 메소드&lt;/li&gt;
&lt;li&gt;getter와 setter가 필요한 이유는 아래 코드로 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;class Person {
  private name: string;

  constructor(name: string) {
    this.name = name;
  }
}
let person1 = new Person('테드');
// 아래 코드는 name앞에 private을 public으로 수정해야만 사용 가능
// console.log(person1.name); // 테드
// person1.name = '찰리';
// console.log(person1.name); // 찰리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 사용 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;get과 set 키워드를 사용하여 정의&lt;/li&gt;
&lt;li&gt;속성 값의 유효성 검사, 계산된 프로퍼티 등에 사용&lt;/li&gt;
&lt;li&gt;데이터를 보다 안전하게 관리&lt;/li&gt;
&lt;li&gt;복잡한 로직을 캡슐화 &amp;rarr; 클래스 외부에는 간단한 인터페이스만 제공 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;class Employee {
  private _fullName: string = '';

  // private 멤버 변수에 접근하여 반환하는 getter
  get getFullName(): string {
    return this._fullName;
  }

  // private 멤버 변수에 접근하여 설정하는 setter
  set setFullName(newName: string) {
    if (newName.length &amp;gt; 0) {
      this._fullName = newName;
    } else {
      console.log('Error: name cannot be empty');
    }
  }
}

// 접근자 메서드는 () 소괄호 없이 사용 가능
let emp1 = new Employee();
emp1.setFullName = 'Ted'; // setter에 대한 사용법
let name = emp1.getFullName; // getter에 대한 사용법
console.log(name); // Ted
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Static-8649eb0a675b40008c48709e89c8d32a?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Static-8649eb0a675b40008c48709e89c8d32a?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717399817646&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Static 키워드 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Static-8649eb0a675b40008c48709e89c8d32a?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/8649eb0a675b40008c48709e89c8d32a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7b1NH/hyWgWF0tPY/ZksPfOCiDRchOp6CHz3Bl1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Faomf/hyWdehehn3/tf6xXESXXvs2yEOkBA0U9k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Static-8649eb0a675b40008c48709e89c8d32a?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Static-8649eb0a675b40008c48709e89c8d32a?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7b1NH/hyWgWF0tPY/ZksPfOCiDRchOp6CHz3Bl1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Faomf/hyWdehehn3/tf6xXESXXvs2yEOkBA0U9k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Static 키워드 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>getter</category>
      <category>setter</category>
      <category>static</category>
      <category>typescript</category>
      <category>접근자</category>
      <category>정적메서드</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/70</guid>
      <comments>https://ted93.tistory.com/entry/Static-%ED%82%A4%EC%9B%8C%EB%93%9C#entry70comment</comments>
      <pubDate>Sat, 29 Jun 2024 17:30:31 +0900</pubDate>
    </item>
    <item>
      <title>추상 클래스와 추상 메서드</title>
      <link>https://ted93.tistory.com/entry/%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%B6%94%EC%83%81-%EB%A9%94%EC%84%9C%EB%93%9C</link>
      <description>&lt;h1&gt;1. 추상 클래스와 추상 메서드&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추상 클래스: 인스턴스화 할 수 없고, 하나 이상의 추상 메서드를 포함할 수 있는 클래스&lt;/li&gt;
&lt;li&gt;공통의 기능을 정의, 상속을 통해서 해당 기능을 구현하도록 강제하는 틀을 제공&lt;/li&gt;
&lt;li&gt;abstract 키워드를 사용하여 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 추상 메서드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구체적인 구현이 없이 선언만 된 메서드&lt;/li&gt;
&lt;li&gt;메서드의 구현이란 로직이 작성되는 부분(중괄호)&lt;/li&gt;
&lt;li&gt;파생되는 클래스가 반드시 구현해야 하는 메서드의 틀을 제공&lt;/li&gt;
&lt;li&gt;추상 클래스 내에서 abstract 키워드를 사용하여 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3) 추상 클래스 / 추상 메서드 예제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동물 추상 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;abstract class Animal {
  // 추상클래스 내에서는 반드시 한 개 이상의 추상 메서드가 정의되어야 함
  // : 그 외에는 다른 일반 메서드와 일반 멤버 변수 정의도 가능
  // 추상 메서드 정의
  // : 중괄호의 로직 구현부가 존재하지 X
  abstract makeSound(): void;

  move() {
    console.log('moving~~~');
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추상 클래스를 상속한 Dog 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Dog extends Animal {} // Error - 내용은 아래 사진
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;abstract.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMJptk/btsHMgl02VE/FuzMWYDScE7tm6DsAhQ0nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMJptk/btsHMgl02VE/FuzMWYDScE7tm6DsAhQ0nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMJptk/btsHMgl02VE/FuzMWYDScE7tm6DsAhQ0nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMJptk%2FbtsHMgl02VE%2FFuzMWYDScE7tm6DsAhQ0nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;abstract&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;197&quot; data-filename=&quot;abstract.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추상 클래스를 상속받은 클래스에서는 반드시 추상 메서드를 구현!!&lt;/li&gt;
&lt;li&gt;메서드의 로직 {}중괄호를 작성해야 함!!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Dog extends Animal {
  makeSound(): void {
    console.log('멍멍');
  }
}

const myDog = new Dog();
myDog.makeSound();
myDog.move();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 인터페이스 구현(Implementing Interfaces)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드와 속성의 시그니처를 정의하는 구조체&lt;/li&gt;
&lt;li&gt;클래스가 특정 기능을 구현하도록 강제, 다형성을 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 구현 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;interface 키워드를 사용하여 정의&lt;/li&gt;
&lt;li&gt;implements 키워드를 사용하여 해당 클래스가 정의된 인터페이스를 구현함을 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3) 인터페이스 예제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스명도 대괄호 시작&lt;/li&gt;
&lt;li&gt;I인터페이스명으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface IAnimal {
  name: string;
  makeSound(): void;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;implements 키워드를 사용하여 Cat 클래스가 정의된 인터페이스를 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Cat implements IAnimal{} // Error - 내용은 아래 사진
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;implements.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZwnMP/btsHMyta9Jy/Sis6h3WhOPfoXw2TW8O8rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZwnMP/btsHMyta9Jy/Sis6h3WhOPfoXw2TW8O8rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZwnMP/btsHMyta9Jy/Sis6h3WhOPfoXw2TW8O8rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZwnMP%2FbtsHMyta9Jy%2FSis6h3WhOPfoXw2TW8O8rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;implements&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;142&quot; data-filename=&quot;implements.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'Cat' 클래스가 'IAnimal' 인터페이스를 잘못 구현합니다.&lt;br /&gt;'Cat' 형식에 'IAnimal' 형식의 name, makeSound 속성이 없습니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Cat implements IAnimal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  makeSound(): void {
    console.log('냐옹~~');
  }
}

let myCat = new Cat('야옹이');
myCat.makeSound(); // 냐옹~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 추상클래스와 인터페이스의 차이점&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추상클래스는 클래스의 '이다(is - a)'관계를 나타냄&lt;br /&gt;상속 받는 하위 클래스가 부모 클래스의 특정 종류로 간주&lt;br /&gt;EX) '동물' 추상 클래스를 상속받는 '개', '고양이' 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스는 클래스가 '할 수 있는(has - a)'관계를 나타냄&lt;br /&gt;해당 기능을 할 수 있음에 중점&lt;br /&gt;EX) '비행 가능' 인터페이스를 구현하는 '새'와 '비행기' 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통점: 확장성과 유지보수성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/88db492529e5495cab988b5239480a9b?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/88db492529e5495cab988b5239480a9b?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717382853834&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;추상 클래스와 추상 메서드 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/88db492529e5495cab988b5239480a9b?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/88db492529e5495cab988b5239480a9b&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pdczY/hyWdjiwuCd/LFcgTy0RcZglTsSJK5iJsK/img.png?width=2000&amp;amp;height=605&amp;amp;face=0_0_2000_605,https://scrap.kakaocdn.net/dn/b9oWwA/hyWdhdTpBy/RIPhl0Y1tWx8B4UuKxbI6K/img.png?width=2000&amp;amp;height=605&amp;amp;face=0_0_2000_605&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/88db492529e5495cab988b5239480a9b?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/88db492529e5495cab988b5239480a9b?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pdczY/hyWdjiwuCd/LFcgTy0RcZglTsSJK5iJsK/img.png?width=2000&amp;amp;height=605&amp;amp;face=0_0_2000_605,https://scrap.kakaocdn.net/dn/b9oWwA/hyWdhdTpBy/RIPhl0Y1tWx8B4UuKxbI6K/img.png?width=2000&amp;amp;height=605&amp;amp;face=0_0_2000_605');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;추상 클래스와 추상 메서드 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>abstract</category>
      <category>implements</category>
      <category>Interfaces</category>
      <category>typescript</category>
      <category>인터페이스</category>
      <category>추상메서드</category>
      <category>추상클래스</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/69</guid>
      <comments>https://ted93.tistory.com/entry/%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%B6%94%EC%83%81-%EB%A9%94%EC%84%9C%EB%93%9C#entry69comment</comments>
      <pubDate>Fri, 28 Jun 2024 10:48:23 +0900</pubDate>
    </item>
    <item>
      <title>상속(Inheritance)</title>
      <link>https://ted93.tistory.com/entry/%EC%83%81%EC%86%8DInheritance</link>
      <description>&lt;h1&gt;1. 상속&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 상속의 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 클래스(부모 클래스)의 속성과 메서드를&lt;/li&gt;
&lt;li&gt;다른 클래스(자식 클래스)가 받아 사용할 수 있는 기능&lt;/li&gt;
&lt;li&gt;코드의 재사용성을 증가, 유지보수성 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 구현 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;extends(확장) 키워드를 사용하여 상속을 구현&lt;/li&gt;
&lt;li&gt;자식 클래스는 부모 클래스의 모든 public과 protected 멤버를 상속받음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3) 상속의 관계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 클래스(슈퍼 클래스, 상위 클래스): 기능과 메서드를 제공&lt;/li&gt;
&lt;li&gt;자식 클래스(서브 클래스, 하위 클래스): 기능과 메서드를 전달받음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-4) 상속 예제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동물 클래스를 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }

  move(distance: number = 0) {
    console.log(`${this.name} moved ${distance}m`);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Animal 클래스를 상속받는 Dog 클래스 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;// Dog 클래스 - 자식 클래스
class Dog extends Animal {
  // name: string

  constructor(name: string) {
    // super 메서드
    // 부모 클래스의 생성자를 호출 (반드시!)
    super(name);
  }
  bark() {
    console.log('멍멍!!!');
  }

  // move(distance: number = 0) {
  //   console.log(`${this.name} moved ${distance}m`);
  // }
  // Animal 클래스에서 상속받은 메서드
}

let dog1 = new Dog('푸들');
dog1.move(10); // 푸들 moved 10m
dog1.bark(); // 멍멍!!!
console.log(dog1.name); // 푸들
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 메서드 오버라이딩(Overriding)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 클래스에서 부모 클래스의 메서드를 재정의&lt;/li&gt;
&lt;li&gt;기존의 메서드를 자식 클래스에 맞게 변경하여 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 구현 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 클래스에서 부모 클래스와 동일한 이름의 메서드를 선언하여 오버라이딩&lt;/li&gt;
&lt;li&gt;필요에 따라 super 키워드를 사용하여 부모 클래스의 메서드 호출 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 오버라이딩 예제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Animal 부모 클래스를 상속받는 Bird 자식 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;class Bird extends Animal {
  constructor(name: string) {
    super(name);
  }
  move(distance: number = 5) {
    console.log('~~~Flying~~~');
    super.move(distance);
  }
}

const bird = new Bird('짹짹이');
bird.move(); // ~~~Flying~~~
             // 짹짹이 moved 5m
						 
const bird2 = new Animal('깍깍이');
bird2.move(); // 깍깍이 moved 0m&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상속받은 기능을 해당 (자식)클래스에 맞게 재정의&lt;br /&gt;하나의 기능을 여러 이름이 아닌 하나의 이름으로 묶어서 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Inheritance-9ccd648334474fff9bd5f0f8a40ebf2c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Inheritance-9ccd648334474fff9bd5f0f8a40ebf2c?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717381428749&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;상속(Inheritance) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Inheritance-9ccd648334474fff9bd5f0f8a40ebf2c?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/9ccd648334474fff9bd5f0f8a40ebf2c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LLL2x/hyWgVtwtSb/YQlDRXYayKf3qzdroOOWVK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bAvCrn/hyWdmTO0Vh/hKj7ca0sZCZCoYkK4Aosb0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Inheritance-9ccd648334474fff9bd5f0f8a40ebf2c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Inheritance-9ccd648334474fff9bd5f0f8a40ebf2c?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LLL2x/hyWgVtwtSb/YQlDRXYayKf3qzdroOOWVK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bAvCrn/hyWdmTO0Vh/hKj7ca0sZCZCoYkK4Aosb0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;상속(Inheritance) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>extends</category>
      <category>inheritance</category>
      <category>overriding</category>
      <category>typescript</category>
      <category>상속</category>
      <category>오버라이딩</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/68</guid>
      <comments>https://ted93.tistory.com/entry/%EC%83%81%EC%86%8DInheritance#entry68comment</comments>
      <pubDate>Thu, 27 Jun 2024 12:24:32 +0900</pubDate>
    </item>
    <item>
      <title>접근제한자(접근제어자, Access Modifiers)</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%91%EA%B7%BC%EC%A0%9C%ED%95%9C%EC%9E%90%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90-Access-Modifiers</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;캡슐화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 내부 데이터를 외부에서 직접 접근하는 것을 제한, 데이터의 안정성을 보장하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;1. 접근제한자의 정의&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스의 내부 데이터를 외부에서 직접 접근하는 것을 제한하여&lt;br /&gt;사용자의 코드 흐름에 맞게 데이터를 처리하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 접근제한자의 종류(3가지)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. public&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어디서든 접근 가능(기본값 - 생략 시)&lt;/li&gt;
&lt;li&gt;기본적으로 모든 멤버가 가지고 있는 접근 제한자&lt;/li&gt;
&lt;li&gt;프로그램의 어느 곳에서나 접근 가능&lt;/li&gt;
&lt;li&gt;접근 제한자가 명시되지 않은 멤버는 모두 public으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. private&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 클래스 내부에서만 접근 가능&lt;/li&gt;
&lt;li&gt;클래스 외부에서 private한 멤버에 접근할 경우 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. protected&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 클래스 및 상속받은 하위 클래스에서만 접근 가능&lt;/li&gt;
&lt;li&gt;기본적으로 하위 클래스는 상위 클래스의 멤버에 접근 가능하지만&lt;/li&gt;
&lt;li&gt;만약 해당 멤버가 private이라면 접근 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 접근제한자 사용 목적&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 내부 구현을 숨기거나, 특정 멤버의 접근을 제한할 때 사용 안정성과 유지보수성을 높이기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Employee 클래스 정의
class Employee {
  // 멤버 변수 정의(접근 제한자)
  public name: string; // 이름
  private salary: number; // 급여
  protected department: string; // 해당 클래스 | 하위 클래스에서만 접근 가능

  constructor(name: string, salary: number, department: string) {
    this.name = name;
    this.salary = salary;
    this.department = department;
  }

  public displayInfo(): void {
    console.log(
      `이름: ${this.name} / 부서: ${this.department} / 급여: ${this.salary}`,
    );
    console.log(`보너스: ${this.calculateBonus()}`);
  }

  private calculateBonus(): number {
    return this.salary * 0.1;
  }
}

// Employee 클래스 사용 예제(인스턴스화)
let emp1 = new Employee('테드', 50000, 'IT');
console.log(emp1.name); // 테드
console.log(emp1.salary); // Error
// 'salary' 속성은 private이며 'Employee' 클래스 내에서만 액세스할 수 있습니다.
console.log(emp1.department); // Error
// 'department' 속성은 보호된 속성이며 'Employee' 클래스 및 해당 하위 클래스 내에서만 액세스할 수 있습니다.
emp1.displayInfo(); // 이름: 테드 / 부서: IT / 급여: 50000
										// 보너스: 5000
emp1.calculateBonus(); // Error
// 'calculateBonus' 속성은 private이며 'Employee' 클래스 내에서만 액세스할 수 있습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 생성자의 경우 멤버 선언 외에도 생성자의 매개변수 앞에 접근 제한자 명시 가능&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 매개변수는 같은 이름의 속성(멤버 변수)으로 선언,&lt;br /&gt;해당 매개변수의 인자는 암묵적으로 인스턴스에 할당&lt;/li&gt;
&lt;li&gt;위의 User 클래스와 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class User {
  public id: string;
  private password: string;

  constructor(id: string, password: string) {
    this.id = id;
    this.password = password;
  }
}

class User2 {
  constructor(
    public id: string,
    private password: string,
  ) {}
}

// User와 User2는 완전 동일한 코드

let user1 = new User('qwe123', 'qwert123');
console.log(user1.id); // qwe123
// console.log(user1.password); // Error

let user2 = new User('ted123', 'tedfriend123'); // ted123
console.log(user2.id);
// console.log(user2.password); // Error
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. 연습문제&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제1&lt;/h3&gt;
&lt;pre id=&quot;code_1717149417793&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Car 클래스 생성
클래스는 model과 year 두 개의 멤버 변수
매개변수로 두 개의 멤버 변수를 받는 생성자 생성
매개변수에 접근 제한자를 사용하여 변수 선언과 생성자의 초기화를 결합하여 표시
getModelAndYear라는 메서드 포함
&quot;This car is a {model} from {year}.&quot;를 출력

클래스 생성 후
car1 인스턴스 생성
model은 '아이오닉5' year은 '2024'로 설정
car1 인스턴스의 getModelAndYear 메서드를 호출&lt;/code&gt;&lt;/pre&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Car 클래스 생성
class Car {
  // public model: string;
  // public year: number;
  // constructor(model: string, year: number) {
  //   this.model = model;
  //   this.year = year;
  // }
  constructor(
    public model: string,
    public year: number,
  ) {}

  getModelAndYear() {
    console.log(`This car is a ${this.model} from ${this.year}.`);
  }
}

// car1 인스턴스 생성
let car1 = new Car('아이오닉5', 2024);
car1.getModelAndYear(); // This car is a 아이오닉5 from 2024.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제2&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;은행 계좌 클래스 생성 예제&lt;br /&gt;요구 사항&lt;br /&gt;BankAccount 클래스 완성 후 메서드 적절히 사용해보기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class BankAccount {
  // - accountNumber(계좌 번호), balance(잔액) 속성은 외부에서 직접 접근할 수 없는 속성
  // - 생성자: 계좌 번호와 초기 잔액을 매개변수로 받아 객체를 초기화
  //           초기 잔액은 선택적으로 처리(기본값 0)
  // - 메서드
  // 1. deposit(amount: number): 입금액을 받아 잔액을 증가
  // 2. withdraw(amount: number): 출금액을 받아 잔액을 감소
  //                      잔액보다 많은 금액을 출금할 수 X - 출금액이 잔고를 초과하였습니다
  // 3. getBalance(): 현재 잔액을 반환
  // 4. getAccountNumber(): 계좌번호를 반환
}

// let accountA = new BankAccount('123-456');
&lt;/code&gt;&lt;/pre&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class BankAccount {
  constructor(
    private accountNumber: string,
    private balance: number = 0,
  ) {}
  deposit(amount: number) {
    this.balance += amount;
    console.log(`입금액 ${amount}, 현재 잔액 ${this.balance}`);
  }
  withdraw(amount: number) {
    if (this.balance &amp;gt;= amount) {
      this.balance -= amount;
      console.log(`출금액 ${amount}, 현재 잔액 ${this.balance}`);
    } else console.log('출금액이 잔고를 초과하였습니다');
  }
  getBalance() {
    return this.balance;
  }
  getAccountNumber() {
    return this.accountNumber;
  }
}

let accountA = new BankAccount('123-456');
console.log(accountA.getBalance()); // 0
accountA.deposit(30000); // 입금액 30000, 현재 잔액 30000
accountA.deposit(90000); // 입금액 90000, 현재 잔액 120000
accountA.withdraw(100000); // 출금액 100000, 현재 잔액 20000
console.log(accountA.getBalance()); // 20000
accountA.withdraw(50000); // 출금액이 잔고를 초과하였습니다
console.log(accountA.getBalance()); // 20000
console.log(accountA.getAccountNumber()); // 123-456
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Access-Modifiers-b2e0ff3b65c64ca99c24cd7c23d25dba?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Access-Modifiers-b2e0ff3b65c64ca99c24cd7c23d25dba?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717149226952&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;접근제한자(접근제어자, Access Modifiers) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Access-Modifiers-b2e0ff3b65c64ca99c24cd7c23d25dba?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/b2e0ff3b65c64ca99c24cd7c23d25dba&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/G2uXu/hyWdnEDV60/NemBoEhcWY5UacVJbNUelk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bHrEnj/hyWdmeE6ZD/RJyyF3YvCJQEAqIHfXEmxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Access-Modifiers-b2e0ff3b65c64ca99c24cd7c23d25dba?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Access-Modifiers-b2e0ff3b65c64ca99c24cd7c23d25dba?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/G2uXu/hyWdnEDV60/NemBoEhcWY5UacVJbNUelk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bHrEnj/hyWdmeE6ZD/RJyyF3YvCJQEAqIHfXEmxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;접근제한자(접근제어자, Access Modifiers) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>access-modifiers</category>
      <category>private</category>
      <category>protected</category>
      <category>public</category>
      <category>typescript</category>
      <category>접근제어자</category>
      <category>접근제한자</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/67</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%91%EA%B7%BC%EC%A0%9C%ED%95%9C%EC%9E%90%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90-Access-Modifiers#entry67comment</comments>
      <pubDate>Wed, 26 Jun 2024 19:55:02 +0900</pubDate>
    </item>
    <item>
      <title>생성자(Constructor)</title>
      <link>https://ted93.tistory.com/entry/%EC%83%9D%EC%84%B1%EC%9E%90Constructor</link>
      <description>&lt;h1&gt;1. 생성자&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 생성자 함수의 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 인스턴스가 생성될 때 자동으로 호출되는 특별한 메서드&lt;/li&gt;
&lt;li&gt;인스턴스의 초기화(초기 상태 설정)&lt;/li&gt;
&lt;li&gt;속성(프로퍼티)의 초기값 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 생성자 함수 사용법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;constructor 키워드를 사용하여 클래스 내부에 정의&lt;/li&gt;
&lt;li&gt;인자를 받아서 클래스의 프로퍼티를 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3) 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스는 단 하나의 생성자만 가질 수 있다.&lt;/li&gt;
&lt;li&gt;반환값X 함수, 자신을 new 키워드와 함께 호출하는 대상(클래스)의 새로운 인스턴스를 암시적으로 반환&lt;/li&gt;
&lt;li&gt;필수적인 요소 X, 생성자가 없는 경우 자동으로 빈 생성자를 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. '사람' 클래스 정의&lt;/h1&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Person {
  // 멤버 변수 (속성, 프로퍼티)
  name: string;
  age: number;

  // 생성자 함수
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  // 메서드
  describe(): string {
    return `${this.name} is ${this.age} years old`;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스를 통해 객체를 생성하는 경우&lt;/li&gt;
&lt;li&gt;new 키워드와 클래스의 생성자를 통해 인스턴스화&lt;/li&gt;
&lt;li&gt;기본 생략된 생성자가 아닌 사용자 정의 생성자를 작성하는 경우, 해당 생성자의 매개변수에 맞춰 인자를 전달해야 함!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let person1 = new Person('테드', 30);
console.log(person1.name); // 테드
console.log(person1.describe()); // 테드 is 30 years old

let person2 = new Person('테드친구', 25);
console.log(person2.name); // 테드친구
console.log(person2.describe()); // 테드친구 is 25 years old
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 빈 생성자&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 생성자를 통해 클래스의 인스턴스가 생성될 때 실행될 로직을 정의&lt;/li&gt;
&lt;li&gt;매개변수와 반환값이 없는 함수와 유사&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function example() {
  console.log('함수 실행 시 출력됩니다.');
}
example(); // 함수 실행 시 출력됩니다.

class Dog {
  constructor() {
    console.log('멍멍!!!');
  }
}
let dog1 = new Dog(); // &quot;멍멍!!!&quot;&quot;

class Dog2 {
  constructor(barkingSound: string) {
    console.log(barkingSound);
  }
}
let dog2 = new Dog2('멍멍멍!!!'); // 멍멍멍!!!
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 클래스의 속성의 활용&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1) 속성 기본값&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수의 기본 인자와 유사한 개념&lt;/li&gt;
&lt;li&gt;클래스 속성에도 생성자로 초기화 시키기 전에 기본값 제공이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2) 읽기 전용 속성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;readonly 키워드를 사용하여 읽기 전용 속성 정의&lt;/li&gt;
&lt;li&gt;속성 선언 또는 생성자 외의 장소에서 해당 속성에 값 할당 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;class Triangle {
	// 4-1) 속성 기본값
  // width: number;
  // constructor() {
  //   this.width = 3;
  // }
  // 위에 코드는 아래 width: number = 3; 과 완전히 일치
  width: number = 3;

// 4-2) 읽기 전용 속성
  readonly height: number;
  constructor(height: number) {
    this.height = height;
  }
}

let triangle = new Triangle(5);
console.log(triangle.height); // 5

triangle.width = 4;
triangle.height = 4; // - Error: 읽기 전용 속성
console.log(triangle); // 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. this 키워드&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 현재 인스턴스를 참조하는 키워드&lt;/li&gt;
&lt;li&gt;클래스의 멤버변수나 메서드에 접근할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Human {
  // 속성
  age: number;
  intervalId: number;

  constructor() {
    this.age = 0;

    this.intervalId = setInterval(() =&amp;gt; {
      this.age++;
      console.log(this.age);
    }, 5000);
  }

  stopAging() {
    clearInterval(this.intervalId);
  }
}

let a = new Human();
console.log(a.age);
setTimeout(() =&amp;gt; {
  a.stopAging();
}, 15000);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드나 생성자 내에서는 클래스의 멤버에 접근할 때 this를 사용&lt;/li&gt;
&lt;li&gt;화살표함수의 경우 해당 함수 내에서 this를 만들어내지 못하기 때문에&lt;br /&gt;해당 함수가 선언된 범위의 this를 찾아서 사용&lt;/li&gt;
&lt;li&gt;코드의 논리 이해가 필수적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Constructor-65725d26697544ca846fb336ebaaee3a?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Constructor-65725d26697544ca846fb336ebaaee3a?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717148885611&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;생성자(Constructor) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Constructor-65725d26697544ca846fb336ebaaee3a?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/65725d26697544ca846fb336ebaaee3a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AqNK9/hyWdslGEvE/SEb2Gk8Yin9PNDKFN6ZkKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dJrs9g/hyWdseUD27/Qy9tftbgFmG6KU2KYCHCL0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Constructor-65725d26697544ca846fb336ebaaee3a?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Constructor-65725d26697544ca846fb336ebaaee3a?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AqNK9/hyWdslGEvE/SEb2Gk8Yin9PNDKFN6ZkKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dJrs9g/hyWdseUD27/Qy9tftbgFmG6KU2KYCHCL0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;생성자(Constructor) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>class</category>
      <category>constructor</category>
      <category>typescript</category>
      <category>생성자</category>
      <category>클래스</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/66</guid>
      <comments>https://ted93.tistory.com/entry/%EC%83%9D%EC%84%B1%EC%9E%90Constructor#entry66comment</comments>
      <pubDate>Tue, 25 Jun 2024 15:48:17 +0900</pubDate>
    </item>
    <item>
      <title>격파르타 [SQLD] 챌린지 후기</title>
      <link>https://ted93.tistory.com/entry/%EA%B2%A9%ED%8C%8C%EB%A5%B4%ED%83%80-SQLD-%EC%B1%8C%EB%A6%B0%EC%A7%80-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;격파르타에 참여한 이유&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보처리기사 필기를 공부하던중 SQL에 대한 부분이 어렵기도 하고 학습을 해야하기도 해서 이왕 자격증 공부하는 김에 SQLD도 같이 준비하면 되겠다 생각했습니다. 유튜브에 무료 좋은 강의들도 많지만, 실제 실습을 해보면서 학습하는 것을 좋아해서 실습도 하는 강의를 찾아보다가 환급 챌린지가 있길래 의지가 약한 저로써는 괜찮은 것 같아서 참여하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 SQLD 공부하면서 정보처리기사 필기부분에서 SQL에서도 고득점을 받았고 SQLD 까지 두개의 자격증을 함께 취득 하였습니다~~&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFj0FB/btsH9nGaEo5/d8qkkn0rbZTZ6O70jagU2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFj0FB/btsH9nGaEo5/d8qkkn0rbZTZ6O70jagU2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFj0FB/btsH9nGaEo5/d8qkkn0rbZTZ6O70jagU2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFj0FB%2FbtsH9nGaEo5%2Fd8qkkn0rbZTZ6O70jagU2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;418&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;좋았던-점&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;격파르타에서 좋았던 점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 주로 모든 필기나 학습을 노션을 이용하는데, 노션을 이용한 자료가 우선 제일 좋았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리가 너무 깔끔하게 되어 있어서, 챕터별로 학습하기가 유용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 매 파트마다 연습문제가 있어서 바로바로 복습하기가 유용했던 점이 참 좋았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사님 강의도 자격증에 맞게 불필요한 내용없이 자격증에 필요한 내용 위주로 강의해주신 점이 좋았습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;아쉬웠던-점&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;격파르타에서 아쉬웠던 점&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기출문제 해설이 너무 예전 버전이고, 기출문제 해설해주시는분이랑 강사님이랑 다른점이 아쉬웠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기출문제 해설이나 예상문제에 대한 강의부분이 추가되면 더욱 좋을 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제가 적고 아쉬워서 개인적으로 노랭이책을 사서 학습했는데 노랭이책도 상당히 도움이 되었습니다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;격파르타는 이런 분들께 추천하고 싶어요!&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아예 기초가 없는 분, 노베이스이신분이 들으시면 좋을 것 같습니다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저는 자격증 공부에 맞게..? 이론 부분에서 많은 점수를 획득하고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어려운 문제는 많이 틀려서 아래처럼 점수를 받은 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYu5i6/btsH9FGw2Fj/yPy385fwIGjlkec1sfjVl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYu5i6/btsH9FGw2Fj/yPy385fwIGjlkec1sfjVl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYu5i6/btsH9FGw2Fj/yPy385fwIGjlkec1sfjVl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYu5i6%2FbtsH9FGw2Fj%2FyPy385fwIGjlkec1sfjVl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;239&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 디스코드를 이용한 커뮤니티가 있어요. 저는 많이 활용하지는 않았지만,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디스코드에 추천 유튜브 영상이라던지, 다른 사람들이 질문하고 답변한 내용들이 많아서&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;혼자 공부하시는분들에게 많은 도움이 될 것 같아요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대부분 SQLD 공부 준비하시면서 궁금하신 내용들이 다 비슷비슷할텐데 그런 내용들이 이미 많이 올라와 있으니&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;검색에 소비하는 시간을 많이 줄일 수 있을 것 같습니다.&lt;/p&gt;</description>
      <category>SQLD 자격증 합격</category>
      <category>격파르타 장점</category>
      <category>격파르타 합격후기</category>
      <category>격파르타 후기</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/76</guid>
      <comments>https://ted93.tistory.com/entry/%EA%B2%A9%ED%8C%8C%EB%A5%B4%ED%83%80-SQLD-%EC%B1%8C%EB%A6%B0%EC%A7%80-%ED%9B%84%EA%B8%B0#entry76comment</comments>
      <pubDate>Mon, 24 Jun 2024 16:37:38 +0900</pubDate>
    </item>
    <item>
      <title>클래스(Class)</title>
      <link>https://ted93.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4Class</link>
      <description>&lt;h1&gt;1. 클래스(Class)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 클래스 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'객체'를 생성하기 위한 템플릿 또는 설계도&lt;/li&gt;
&lt;li&gt;데이터와 해당 데이터를 조작하는 코드를 함께 캡슐화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 클래스 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캡슐화: 데이터(속성)와 데이터를 처리하는 함수(메서드)를 하나로 묶는 것&lt;/li&gt;
&lt;li&gt;추상화: 복잡한 세부사항X, 필수적인 부분만을 강조하는 것&lt;/li&gt;
&lt;li&gt;상속: 한 클래스의 속성과 메서드를 다른 클래스가 상속받을 수 있는 것&lt;/li&gt;
&lt;li&gt;다형성: 하나의 인터페이스를 통해 다른 클래스의 객체(인스턴스)를 다룰 수 있는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 객체(Object)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 객체 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'클래스'에 의해서 생성된 인스턴스(instance)&lt;/li&gt;
&lt;li&gt;실제 프로그램에서 사용되는 데이터와 기능의 집합체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 객체 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태와 행동: 객체는 속성(상태)과 메서드(행동)를 갖는 것&lt;/li&gt;
&lt;li&gt;독립성: 각 객체는 독립적인 성격을 가지며 다른 객체와 상호 작용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 클래스 사용법&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 '정의' &amp;amp; 객체 '생성'&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1) 클래스 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class 키워드를 사용하여 정의&lt;/li&gt;
&lt;li&gt;클래스명은 대문자로 시작 (UpperCamelCase 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2) 클래스의 기본 구조&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;class ClassName {  
    속성(상태): (멤버) 변수, 클래스의 상태 저장
    메서드(행동): 함수, 클래스의 동작을 정의

    --- 메서드 종류 ---
    - 인스턴스 메서드
    : 일반적인 메서드, 클래스의 인스턴스를 통해 호출, 해당 객체의 속성에 접근 가능
    - 정적 메서드
    : 클래스 자체에 속하는 메서드, 인스턴스 없이 클래스명을 사용하여 호출

    --- 인스턴스(instance) ---
    : 클래스를 통해 생성된 객체
    : 실제로 생성된 객체이자 '컴퓨터 메모리에 할당된 객체'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 객체 VS 클래스 VS 인스턴스&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1) 객체&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서로 많은 데이터를 하나로 묶어서 표현한 것&lt;/li&gt;
&lt;li&gt;현실 세계의 사물이나 개념을 프로그램 내에서 표현한 것&lt;/li&gt;
&lt;li&gt;EX) 웹 페이지에서 작성할 '게시글'
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;게시글 번호, 작성자, 제목, 내용, 작성일자, 수정일자,,, 등 데이터(속성)&lt;/li&gt;
&lt;li&gt;위 데이터(속성)를 처리하는 기능(게시글 생성, 수정 등등) 기능(메서드, 행동)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2) 클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체를 만드는 도구&lt;/li&gt;
&lt;li&gt;클래스를 정의하면 해당 클래스에 속한 객체들이 가져야 할 속성과 메서드를 명시&lt;/li&gt;
&lt;li&gt;붕어빵(객체) &amp;amp; 붕어빵 틀(클래스) 같은 클래스로 만든 객체라도 각각의 객체는 서로 다른 값을 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3) 인스턴스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스에 의해 생성되어 '메모리에 할당'된 객체&lt;/li&gt;
&lt;li&gt;클래스로부터 객체를 생성하는 과정을 '인스턴스화'라고 부름&lt;/li&gt;
&lt;li&gt;붕어빵틀 클래스로 만든 붕어빵은 객체(object)&lt;br /&gt;붕어빵은 붕어빵 틀로 만든 인스턴스(instance)&lt;br /&gt;객체 == 인스턴스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. 클래스 '정의' / 객체 '생성' 예제&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'책' 클래스&lt;/li&gt;
&lt;li&gt;! 느낌표 연산자는, 컴파일러에게 무조건 값이 있을것이라고 알려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class Book {
  // --- 속성 ---
  // : 멤버 변수로 정의
  // : 클래스에 속하는 변수
  title!: string;
  author! : string;
  
  // --- 메서드 ---
  // : 클래스 내부에서 정의된 함수
  // : 객체의 행동을 나타냄
  // : 클래스의 인스턴스를 통해 호출

  // 클래스의 메서드(함수)는 선언적 함수 사용 X
  // 함수명으로 바로 구현
  describe() : string{
    return `${this.title} is written by ${this.author}`
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. 객체 생성&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스의 인스턴스는 new 키워드를 사용하여 생성&lt;/li&gt;
&lt;li&gt;new 클래스명();&lt;/li&gt;
&lt;li&gt;()는 클래스의 생성자 함수를 호출&lt;/li&gt;
&lt;li&gt;기본적으로 클래스에는 반드시 하나 이상의 생성자가 존재&lt;/li&gt;
&lt;li&gt;명시하지 않을 경우 매개변수가 없는 빈 생성자가 생략&lt;/li&gt;
&lt;li&gt;new 키워드를 사용하여 인스턴스를 생성 생성된 인스턴스를 변수에 할당하여 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;let myBook1 = new Book();
let myBook2 = new Book();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성된 인스턴스로 Book 클래스에 정의된 멤버변수와 메서드에 접근 . 연산자를 사용하여 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;console.log(myBook1.title);
console.log(myBook1.describe());
console.log(myBook2.describe());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;class.png&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DMPQA/btsHJRHzGyC/Fv1gCkCqfhl7n7OFtKDdt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DMPQA/btsHJRHzGyC/Fv1gCkCqfhl7n7OFtKDdt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DMPQA/btsHJRHzGyC/Fv1gCkCqfhl7n7OFtKDdt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDMPQA%2FbtsHJRHzGyC%2FFv1gCkCqfhl7n7OFtKDdt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;class&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;59&quot; data-filename=&quot;class.png&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스를 통해 인스턴스 생성 시&lt;/li&gt;
&lt;li&gt;생성자를 통해 클래스의 멤버 변수를 초기화&lt;/li&gt;
&lt;li&gt;해당 멤버 변수를 초기화 하지 않은 경우 undefined로 인식&lt;/li&gt;
&lt;li&gt;다음 글에서 생성자에 대해 학습&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Class-1d7627c57835472c9b6b7cadcd175eb3?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Class-1d7627c57835472c9b6b7cadcd175eb3?pvs=4&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717148419956&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;클래스(Class) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Class-1d7627c57835472c9b6b7cadcd175eb3?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/1d7627c57835472c9b6b7cadcd175eb3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lxfS3/hyWdjI2gMQ/4loKM9vIg65ykDonbd2Sd0/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420,https://scrap.kakaocdn.net/dn/bSKRIB/hyWdpCtUCg/jHS6stmWagj9xm28GUuSX0/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Class-1d7627c57835472c9b6b7cadcd175eb3?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Class-1d7627c57835472c9b6b7cadcd175eb3?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lxfS3/hyWdjI2gMQ/4loKM9vIg65ykDonbd2Sd0/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420,https://scrap.kakaocdn.net/dn/bSKRIB/hyWdpCtUCg/jHS6stmWagj9xm28GUuSX0/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;클래스(Class) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>class</category>
      <category>instance</category>
      <category>Object</category>
      <category>typescript</category>
      <category>객체</category>
      <category>인스턴스</category>
      <category>클래스</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/65</guid>
      <comments>https://ted93.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4Class#entry65comment</comments>
      <pubDate>Mon, 24 Jun 2024 11:08:12 +0900</pubDate>
    </item>
    <item>
      <title>객체 지향 프로그래밍(Object Oriented Programming, OOP)</title>
      <link>https://ted93.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DObject-Oriented-Programming-OOP</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 객체들의 집합으로 보는 패러다임(구조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 객체들은 서로 메시지를 전달하며 상호 작용&lt;/p&gt;
&lt;h1&gt;1. 객체&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태와 행동을 가지는 모든 것&lt;/li&gt;
&lt;li&gt;상태는 속성(attribute), 행동은 메서드(method)로 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. '객체 지향 프로그래밍'의 주요 개념&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-1) 클래스(Class)와 객체(Object)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통적 성질을 가진 대상들을 정의한 것&lt;/li&gt;
&lt;li&gt;데이터(속성)와 메서드(행동, 동작)을 포함&lt;/li&gt;
&lt;li&gt;ex) (요리) 레시피 필요한 재료(데이터, 속성)와 조리방법(메서드, 동작) 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스에 의해서(정의된 대로) 생성된 실체(데이터)&lt;/li&gt;
&lt;li&gt;클래스에 의해 생성되어 클래스에서 정의한 행동을 수행 가능&lt;/li&gt;
&lt;li&gt;ex) 요리된 팬케이크 레시피를 바탕으로 실제로 완성된 팬케이크, 실제로 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-2) 캡슐화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 속성과 행동(메서드)을 하나로 묶는 것&lt;/li&gt;
&lt;li&gt;외부에서 직접 접근 X, 대신 메서드(행동)를 통해서만 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-3) 상속&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 클래스가 다른 클래스의 특성과 기능을 이어받는 것&lt;/li&gt;
&lt;li&gt;코드의 재사용성을 높이고, 중복을 줄이는 것이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-4) 다형성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 인터페이스나 클래스가 여러 형태로 동작하는 것&lt;/li&gt;
&lt;li&gt;메서드 오버로딩과 오버라이딩을 통해 실현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-5) 추상화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡한 시스템을 단순화시키는 프로세스&lt;/li&gt;
&lt;li&gt;사용자가 세부 구현 내용을 몰라도 시스템을 쉽게 사용 가능하도록 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 객체 지향 프로그래밍의 장점&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3-1) 재사용성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스를 정의하면 그 클래스의 객체(인스턴스)를 여러 개 생성 가능&lt;/li&gt;
&lt;li&gt;코드의 재사용성이 증가, 개발 시간과 비용 단축&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3-2) 유지보수성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스는 코드를 논리적인 단위로 분할&lt;/li&gt;
&lt;li&gt;가독성을 향상, 유지보수 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3-3) 신뢰성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캡슐화, 상속, 다형성 등의 객제 지향 원칙은 개발자가 신뢰성 높은 코드를 작성하는 데 도움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3-4) 확장성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상속을 이용하면 기존 클래스를 확장하여 새로운 기능을 쉽게 추가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Object-Oriented-Programming-OOP-ebf516447e4945b6ac7e612105e29172?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Object-Oriented-Programming-OOP-ebf516447e4945b6ac7e612105e29172?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717147828000&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;객체 지향 프로그래밍(Object Oriented Programming, OOP) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Object-Oriented-Programming-OOP-ebf516447e4945b6ac7e612105e29172?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/ebf516447e4945b6ac7e612105e29172&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bc4bfr/hyWdqH8uc2/SYqqKeYMHOSfK770e37kZK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/exkWFe/hyWdgMjI0y/Kw997FmR2Mfe7D8SPQbq1K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Object-Oriented-Programming-OOP-ebf516447e4945b6ac7e612105e29172?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Object-Oriented-Programming-OOP-ebf516447e4945b6ac7e612105e29172?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bc4bfr/hyWdqH8uc2/SYqqKeYMHOSfK770e37kZK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/exkWFe/hyWdgMjI0y/Kw997FmR2Mfe7D8SPQbq1K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;객체 지향 프로그래밍(Object Oriented Programming, OOP) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>object-oriented-programming</category>
      <category>OOP</category>
      <category>typescript</category>
      <category>객체</category>
      <category>객체지향프로그래밍</category>
      <category>클래스</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/64</guid>
      <comments>https://ted93.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DObject-Oriented-Programming-OOP#entry64comment</comments>
      <pubDate>Sun, 23 Jun 2024 19:29:07 +0900</pubDate>
    </item>
    <item>
      <title>퀴즈 - 타입스크립트로 TODO 리스트 구현</title>
      <link>https://ted93.tistory.com/entry/%ED%80%B4%EC%A6%88-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-TODO-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%98%84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  요구 사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Todo 항목의 인터페이스 정의(ITodoItem)&lt;/li&gt;
&lt;li&gt;Todo 항목은 id(number), task(string), completed(boolean)&lt;/li&gt;
&lt;li&gt;Todo 리스트를 관리할 수 있는 함수 구현
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;addTodo: 새로운 Todo 항목을 추가&lt;/li&gt;
&lt;li&gt;completeTodo: Todo 항목의 completed 상태를 true로 변경&lt;/li&gt;
&lt;li&gt;deleteTodo: Todo 항목을 삭제 각 함수는 Todo 항목 배열을 입력받고, 변경된 배열을 반환&lt;/li&gt;
&lt;li&gt;editTodo: Todo 항목의 task를 편집 - 전체 배열 / 수정하고자하는 요소의 id / 새롭게 작성될 task 내용&lt;/li&gt;
&lt;li&gt;clearCompleted: 완료된 모든 Todo 항목을 삭제 - 전체 배열&lt;/li&gt;
&lt;li&gt;getAllTodos: 모든 Todo 항목을 조회 - 전체 배열&lt;/li&gt;
&lt;li&gt;filterTodos: 특정 상태의 Todo 항목을 필터링 - 전체 배열 / 완료 상태(true/false)&lt;/li&gt;
&lt;li&gt;toggleTodo: Todo 항목의 completed 상태를 토글 - 전체 배열 / 토글할 항목의 id&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답 - 이것만이 정답이 아닙니다~ 다양한 방법으로 구현이 가능합니다&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1717147335656&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface ITodoItem {
  id: number;
  task: string;
  completed: boolean;
}
let todos: ITodoItem[] = [];
function addTodo(task: string): ITodoItem[] {
  const newTodo: ITodoItem = {
    id: Math.max(0, ...todos.map((t) =&amp;gt; t.id)) + 1,
    // ['a', 'b', 'c']
    // &amp;gt;&amp;gt; [1, 2, 3]
    task: task,
    completed: false,
  };
  todos.push(newTodo);
  return todos;
}

function completedTodo(id: number): ITodoItem[] {
  return (todos = todos.map((todo) =&amp;gt;
    todo.id === id ? { ...todo, completed: true } : todo,
  ));
}

function deleteTodo(id: number): ITodoItem[] {
  return (todos = todos.filter((todo) =&amp;gt; todo.id !== id));
}

function editTodo(id: number, task: string): ITodoItem[] {
  return (todos = todos.map((todo) =&amp;gt;
    todo.id === id ? { ...todo, task: task } : todo,
  ));
}

function clearCompleted(completed: boolean): ITodoItem[] {
  return (todos = todos.filter((todo) =&amp;gt; todo.completed === false));
}

function getAllTodos(): void {
  console.log(todos);
}

function filterTodos(completed: boolean): void {
  console.log(todos.filter((todo) =&amp;gt; todo.completed === completed));
}

function toggleTodo(id: number): ITodoItem[] {
  return (todos = todos.map((todo) =&amp;gt;
    todo.id === id ? { ...todo, completed: !todo.completed } : todo,
  ));
}

addTodo('타입스크립트 복습하기');
addTodo('자바스크립트 복습하기');
addTodo('HTML/CSS 복습하기');
getAllTodos(); // 호출
completedTodo(1);
completedTodo(2);
getAllTodos(); // 호출
deleteTodo(2);
getAllTodos(); // 호출
filterTodos(true);
filterTodos(false);
getAllTodos(); // 호출
toggleTodo(1);
getAllTodos(); // 호출
toggleTodo(1);
getAllTodos(); // 호출&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;todo.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdQzYH/btsHKIiJsVN/CliOEhKz2WZNdn8bWVLOI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdQzYH/btsHKIiJsVN/CliOEhKz2WZNdn8bWVLOI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdQzYH/btsHKIiJsVN/CliOEhKz2WZNdn8bWVLOI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdQzYH%2FbtsHKIiJsVN%2FCliOEhKz2WZNdn8bWVLOI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;todo&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;588&quot; data-filename=&quot;todo.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/TODO-c074fee98d5843d6881d6b8b5cf8e783?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/TODO-c074fee98d5843d6881d6b8b5cf8e783?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717147631316&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;퀴즈 - 타입스크립트로 TODO 리스트 구현 | Notion&quot; data-og-description=&quot;요구 사항&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/TODO-c074fee98d5843d6881d6b8b5cf8e783?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/c074fee98d5843d6881d6b8b5cf8e783&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x8xzF/hyWdszb7B5/gYmVvB0nVYrm6gQ080QjS0/img.png?width=2000&amp;amp;height=2292&amp;amp;face=0_0_2000_2292,https://scrap.kakaocdn.net/dn/1OSrH/hyWdeOukkh/fEVRPBAVLbP8VJaxv1FUPk/img.png?width=2000&amp;amp;height=2292&amp;amp;face=0_0_2000_2292&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/TODO-c074fee98d5843d6881d6b8b5cf8e783?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/TODO-c074fee98d5843d6881d6b8b5cf8e783?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x8xzF/hyWdszb7B5/gYmVvB0nVYrm6gQ080QjS0/img.png?width=2000&amp;amp;height=2292&amp;amp;face=0_0_2000_2292,https://scrap.kakaocdn.net/dn/1OSrH/hyWdeOukkh/fEVRPBAVLbP8VJaxv1FUPk/img.png?width=2000&amp;amp;height=2292&amp;amp;face=0_0_2000_2292');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;퀴즈 - 타입스크립트로 TODO 리스트 구현 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;요구 사항&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>Todo</category>
      <category>todo-list</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <category>투두</category>
      <category>투두리스트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/63</guid>
      <comments>https://ted93.tistory.com/entry/%ED%80%B4%EC%A6%88-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-TODO-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B5%AC%ED%98%84#entry63comment</comments>
      <pubDate>Sun, 23 Jun 2024 11:22:52 +0900</pubDate>
    </item>
    <item>
      <title>타입 가드</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C</link>
      <description>&lt;h1&gt;1. 타입 가드의 정의 및 사용법&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 범위 내에서 변수의 타입을 보다 구체적인 타입으로 좁히기 위해 사용하는 식(expression)&lt;/li&gt;
&lt;li&gt;컴파일러는 해당 범위 내에서 변수가 가질 수 있는 타입을 더 명확하게 인식&lt;/li&gt;
&lt;li&gt;타입 관련 에러를 예방&lt;/li&gt;
&lt;li&gt;타입에 특화된 속성이나 메소드를 안전하게 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;function isNumber(x: any): x is number {
  return typeof x === 'number';
}
function double(x: any) {
  if (isNumber(x)) {
    console.log(x * 2);
  } else {
    console.log('Not a Number');
  }
}

double(5); // 10
double('5'); // Not a Number
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. is 키워드와 타입 가드 함수 작성 방법&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;is 키워드를 사용하여 타입 가드 함수를 정의 가능 특정 타입이 맞는지를 검사하고, 그 결과를 불리언(boolean) 값으로 반환&lt;/li&gt;
&lt;li&gt;is 키워드를 사용 타입스크립트 컴파일러는 이 함수가 참(true)을 반환할 경우 해당 변수를 특정 타입으로 간주&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Bird 인터페이스 정의
interface Bird {
  fly: () =&amp;gt; void;
  layEggs: () =&amp;gt; void;
}

// Fish 인터페이스 정의
interface Fish {
  swim: () =&amp;gt; void;
  layEggs: () =&amp;gt; void;
}

// 타입 가드 함수 정의: 입력된 pet이 Fish 타입인지 확인
function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

// Fish 타입의 객체 생성
const pet1: Fish = {
  swim: () =&amp;gt; console.log('물고기가 헤엄칩니다.'),
  layEggs: () =&amp;gt; console.log('물고기가 알을 낳습니다.'),
};

// Bird 타입의 객체 생성
const pet2: Bird = {
  fly: () =&amp;gt; console.log('새가 하늘을 날고 있습니다.'),
  layEggs: () =&amp;gt; console.log('새가 알을 낳습니다.'),
};

// 타입에 따라 적절한 메서드를 호출하는 함수
function checkPet(pet: Fish | Bird) {
  if (isFish(pet)) {
    pet.swim();
  } else {
    pet.fly();
  }
}

// checkPet 함수를 사용하여 pet1과 pet2에 대해 메서드 호출
checkPet(pet1); // 물고기가 헤엄칩니다.
checkPet(pet2); // 새가 하늘을 날고 있습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/71bac5fffcd9474bafbe155fa1ebcd62?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/71bac5fffcd9474bafbe155fa1ebcd62?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717146782360&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입 가드 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/71bac5fffcd9474bafbe155fa1ebcd62?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/71bac5fffcd9474bafbe155fa1ebcd62&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4gNvF/hyWdoKjohi/czogaILzdKCt96yk4fKmn1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/3aJXt/hyWdrtvtDL/Xg7xSnrgIKBAhTcEC1vzL1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/71bac5fffcd9474bafbe155fa1ebcd62?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/71bac5fffcd9474bafbe155fa1ebcd62?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4gNvF/hyWdoKjohi/czogaILzdKCt96yk4fKmn1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/3aJXt/hyWdrtvtDL/Xg7xSnrgIKBAhTcEC1vzL1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입 가드 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>type-guard</category>
      <category>typescript</category>
      <category>타입가드</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/62</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C#entry62comment</comments>
      <pubDate>Sat, 22 Jun 2024 23:55:15 +0900</pubDate>
    </item>
    <item>
      <title>as 키워드 (assertion)</title>
      <link>https://ted93.tistory.com/entry/as-%ED%82%A4%EC%9B%8C%EB%93%9C-assertion</link>
      <description>&lt;h1&gt;1. 타입 단언의 개념&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자가 타입스크립트 컴파일러보다 해당 값의 타입을 더 잘 알고 있음을 명시적으로 선언하는 방법&lt;/li&gt;
&lt;li&gt;컴파일러에게 &quot;이 변수의 타입을 내가 지정한 타입으로 간주해라&quot;라고 지시&lt;/li&gt;
&lt;li&gt;타입 체크 과정에서 강제로 타입을 지정하는 것이므로 주의해서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. as 키워드를 사용하여 타입 단언하기&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주로 as 키워드를 사용하여 타입 단언&lt;/li&gt;
&lt;li&gt;JSX와 함께 사용될 때 충돌을 피하기 위해 추천되는 방식&lt;/li&gt;
&lt;li&gt;사용 예제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;let someValue: any = 'this is a string';
someValue = false;
// ? someValue를 string으로 단언
let length: number = (someValue as string).length;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 실제 프로젝트에서의 타입 단언 사용&lt;/h1&gt;
&lt;details&gt;
&lt;summary&gt;HTML 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1717146299703&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;

&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
  &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
  &amp;lt;button id=&quot;myButton&quot;&amp;gt;클릭해주세요!&amp;lt;/button&amp;gt;
  &amp;lt;script src=&quot;main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;pre id=&quot;code_1717146602112&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;main.ts 파일이란 파일명을 사용한다면
tsc main.ts를 이용하여 main.js 파일로 바꿔줘야
HTML에서 script 태그로 인식할 수 있음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1) DOM API 사용 시 타입 단언을 활용하여 HTMLElement 조작&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예제: HTMLButtonElement로 단언하기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;// 버튼 요소 가져오기
const button = document.getElementById('myButton');
// button이 null이 아니라고 가정하고 HTMLButtonElement로 단언
if (button) {
  (button as HTMLButtonElement).disabled = true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) HTML 요소의 타입&lt;/p&gt;
&lt;pre id=&quot;code_1717146363487&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTMLElement 타입

각각의 HTML 요소 타입 정의
HTMLInputElement
HTMLSelectElement
HTMLFormElement
HTMLUlElement ... 등이 있다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2) 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 단언은 컴파일러를 속이는 행위일 수 있으므로, 실제 타입과 단언한 타입이 일치하지 않는 경우 런타임 오류가 발생 가능&lt;/li&gt;
&lt;li&gt;타입 단언을 사용할 때는 해당 요소의 실제 타입을 확실히 알고 사용 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3) 서버로부터 받아온 데이터에 대한 명시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON을 파싱하고, 결과를 User 타입으로 단언&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// JSON 문자열
  const jsonString = '{&quot;name&quot; : &quot;테드&quot;, &quot;age&quot; : 30}';
  interface IUser {
    name: string;
    age: number;
  }
  // JSON을 파싱하고, 결과를 User 타입으로 단언
  const userData = JSON.parse(jsonString) as IUser;
  console.log(userData.name);
  console.log(userData.age);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-4) 이벤트 객체에 대한 타입 단언&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이벤트 핸들러 내에서 이벤트 객체의 타입을 단언하여 추가적인 속성에 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt; document.getElementById('myButton2')!.addEventListener('click', (event) =&amp;gt; {
    // MouseEvent
    // KeyboardEvent
    // FocusEvent
    const mouseEvent = event as MouseEvent;
    console.log(mouseEvent.clientX, mouseEvent.clientY);
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;non-null assertion operator&quot; (null이 아님을 단언하는 연산자 - &amp;ldquo; ! &amp;rdquo; 느낌표 기호를 사용)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;표현식의 결과값이 null 또는 undefined가 아님을 컴파일러에게 알려주는 역할&lt;/li&gt;
&lt;li&gt;타입스크립트가 기본적으로 엄격한 null 검사를 수행하기 때문에, null 가능성을 명시적으로 제거해야 할 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/as-assertion-19d027bca396475f8962f6f513e1e64d?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/as-assertion-19d027bca396475f8962f6f513e1e64d?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717146411616&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;as 키워드 (assertion) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/as-assertion-19d027bca396475f8962f6f513e1e64d?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/19d027bca396475f8962f6f513e1e64d&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x31gR/hyWdjbbk5n/gU5TkgBEestDIFdE55K5W1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dvStlT/hyWdhj8i3L/tgxypq4sFi1Z5kQcvwxtbK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/as-assertion-19d027bca396475f8962f6f513e1e64d?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/as-assertion-19d027bca396475f8962f6f513e1e64d?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x31gR/hyWdjbbk5n/gU5TkgBEestDIFdE55K5W1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dvStlT/hyWdhj8i3L/tgxypq4sFi1Z5kQcvwxtbK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;as 키워드 (assertion) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>as</category>
      <category>assertion</category>
      <category>dom-api</category>
      <category>HtmlElement</category>
      <category>typescript</category>
      <category>타입단언</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/61</guid>
      <comments>https://ted93.tistory.com/entry/as-%ED%82%A4%EC%9B%8C%EB%93%9C-assertion#entry61comment</comments>
      <pubDate>Sat, 22 Jun 2024 19:09:08 +0900</pubDate>
    </item>
    <item>
      <title>인터페이스 (interface)</title>
      <link>https://ted93.tistory.com/entry/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-interface</link>
      <description>&lt;h1&gt;1. 인터페이스 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 구조를 정의하는 타입스크립트의 기능 / 함수 타입 정의 시에도 사용&lt;/li&gt;
&lt;li&gt;객체가 어떤 프로퍼티와 메서드를 가져야 하는지 명시 컴파일 시간에 타입 체킹을 위해 사용되는 개념&lt;/li&gt;
&lt;li&gt;코드의 가독성과 유지 보수성을 향상&lt;/li&gt;
&lt;li&gt;다양한 구현체에 동일한 인터페이스를 적용하여 일관성과 재사용성을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1) 그 동안 써왔던 타입 속성 예시&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type UserType = {
  name: string;
  age: number;
};

type AdminUserType = UserType &amp;amp; { admin: boolean };
type manyType = number | string | boolean;

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2) 인터페이스 명시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;interface 키워드를 사용하여 명시&lt;/li&gt;
&lt;li&gt;인터페이스명은 대문자로 시작&lt;/li&gt;
&lt;li&gt;type 속성의 선택적 프로퍼티(옵셔널)와 읽기 전용 프로퍼티 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface IUser {
  // 객체의 속성
  name?: string;
  readonly age: number;
  // 객체의 메서드
  greet(): void;
}
let employee: IUser = {
  name: '테드',
  age: 30,
  greet() {
    console.log('Hello');
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 인터페이스의 역할&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 체킹: 개발자가 의도한 대로 코드 작동 가능&lt;/li&gt;
&lt;li&gt;코드 가독성 향상&lt;/li&gt;
&lt;li&gt;코드 재사용 촉진&lt;/li&gt;
&lt;li&gt;확장 가능성 기본 인터페이스를 확장(상속)하여 멤버를 추가하거나 재정의 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 클래스에서 인터페이스 구현&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스는 implements 키워드를 사용하여 인터페이스를 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface IPerson {
  name: string;
  greet(): void;
}

// Student 클래스 사용 예시
class Student implements IPerson {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  greet(): void {
    console.log(`Hello, my name is ${this.name}`);
  }
}

const student = new Student('테드');
student.greet(); // Hello, my name is 테드
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 확장된 인터페이스&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;extends 키워드를 사용하여 확장&lt;/li&gt;
&lt;li&gt;도형을 정의하는 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;interface Shape {
  color: string;
  lineWidth: number;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사각형을 정의하는 인터페이스 도형의 인터페이스를 상속받음(Shape이 가진 모든 정의를 가짐)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Square extends Shape {
  // color: string;
  // lineWidth: number;
  sideLength: number;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통된 속성을 가진 인터페이스를 여러 번 정의하지 않아도 되기 때문에 코드 중복을 줄임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. 인터페이스(interface) VS 타입 별칭(type)&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5-1) 인터페이스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;확장 가능성 (Extendability)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 다른 인터페이스와 클래스에서 확장 가능&lt;/li&gt;
&lt;li&gt;객체 지향 프로그래밍의 상속 개념과 유사&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 타입 별칭은 '&amp;amp;'연산자를 사용하여 확장 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;병합 선언 (Declaration Merging)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 이름을 가진 인터페이스가 여러 번 선언되면 TypeScript는 이를 하나의 인터페이스로 병합&lt;/li&gt;
&lt;li&gt;타입 별칭은 불가능한 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;interface Shape {
  color: string;
  lineWidth: number;
}
interface Shape {
  name: string;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에 코드는 아래 코드로 병합된다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;interface Shape {
  color: string;
  lineWidth: number;
  name: string;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구조적 타이핑 (Structural Typing)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript는 구조적 타이핑을 사용, 인터페이스는 해당 구조를 만족하는 모든 객체를 타입으로 인정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5-2) 타입 별칭&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유연성 (Flexibility)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 별칭은 객체 타입뿐만 아니라 원시 타입, 유니온 타입, 튜플 등을 포함한 모든 타입을 별칭으로 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 인터페이스는 객체의 구조만 정의할 수 있기 때문에 원시 타입이나 유니온 타입, 튜플 타입 등을 직접적으로 표현 X&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스는 객체 구조를 정의하는 데 사용됨&lt;/li&gt;
&lt;li&gt;원시 타입이나 유니온 타입, 튜플 타입은 인터페이스로 정의할 수 없음&lt;/li&gt;
&lt;li&gt;다음과 같은 코드는 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;interface Id = number | string; // Error
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단일 선언 (Single Declaration)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 별칭은 단일 선언만 가능, 동일한 이름을 가진 타입을 다시 선언할 수 X&lt;/li&gt;
&lt;li&gt;이름 충돌을 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리터럴 타입 (Literal Types)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리터럴 타입과 결합하여 특정 값 집합을 타입으로 정의 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;type Status = 'success' | 'error' | 'loading';
function printStatus(status: Status): void {
  console.log(`Status is ${status}`);
}
printStatus('success'); // Status is success
printStatus('pending'); // Error
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스의 한계 예시 - 리터럴 타입을 정의할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;interface IStatus ='success' | 'error' | 'loading';//Error
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. 인터페이스 예시: 확장 가능한 사용자 정보 관리 시스템&lt;/h1&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface User {
  id: number;
  name: string;
}

interface Admin extends User {
  permissions: string[]; // 수정 허가, 삭제 허가 등등
}
interface Guest extends User {
  visitDate: Date;
}

const admin1: Admin = {
  id: 1,
  name: '테드',
  permissions: ['update', 'delete'],
};
const guest1: Guest = {
  id: 2,
  name: '테드친구',
  visitDate: new Date(),
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;7. 타입 별칭 예시: 복합 타입을 사용하는 API 응답 처리&lt;/h1&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;type ApiResponse = SuccessResponse | ErrorResponse;
type SuccessResponse = {
  status: 'success';
  data: any;
};
type ErrorResponse = {
  status: 'error';
  error: string;
};

const response: ApiResponse = {
  status: 'success',
  data: {
    message: '성공적으로 작동되었습니다',
  },
};

function handleResponse(response: ApiResponse) {
  if (response.status === 'success') {
    console.log('Data:', response.data);
  } else {
    console.log('Error:', response.error);
  }
}

handleResponse(response);
// Data: { message: '성공적으로 작동되었습니다' }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/interface-6268270a598e4e39ac78880957dd5b45?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/interface-6268270a598e4e39ac78880957dd5b45?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717137967145&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;인터페이스 (interface) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/interface-6268270a598e4e39ac78880957dd5b45?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/6268270a598e4e39ac78880957dd5b45&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djTKgX/hyWdseRWxF/a52KeYrhZPmZR2BjlZrSkk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dDoUI9/hyWdkHSzEr/lxm1YfvFri8Ai3TPMFwHsk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/interface-6268270a598e4e39ac78880957dd5b45?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/interface-6268270a598e4e39ac78880957dd5b45?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djTKgX/hyWdseRWxF/a52KeYrhZPmZR2BjlZrSkk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dDoUI9/hyWdkHSzEr/lxm1YfvFri8Ai3TPMFwHsk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스 (interface) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>TypeScript</category>
      <category>interface</category>
      <category>type</category>
      <category>typescript</category>
      <category>인터페이스</category>
      <category>타입</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/60</guid>
      <comments>https://ted93.tistory.com/entry/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-interface#entry60comment</comments>
      <pubDate>Fri, 21 Jun 2024 20:46:11 +0900</pubDate>
    </item>
    <item>
      <title>API 응답 처리 함수 구현 with TypeScript</title>
      <link>https://ted93.tistory.com/entry/API-%EC%9D%91%EB%8B%B5-%EC%B2%98%EB%A6%AC-%ED%95%A8%EC%88%98-%EA%B5%AC%ED%98%84-with-TypeScript</link>
      <description>&lt;h1&gt;1. 상태 및 데이터 타입 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 정보를 처리하는 API 응답 처리&lt;/li&gt;
&lt;li&gt;사용자 정보를 나타내는 타입과 API 응답 타입을 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;type User = {
  id: number;
  name: string;
  email: string;
};

type ApiResponse = {
  status: 'loading' | 'success' | 'error';
  data?: User;
  message?: string; // 성공 또는 에러 메시지 출력
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. API 응답 처리 함수 구현&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 응답에 따라 다른 작업을 수행하는 함수를 구현&lt;/li&gt;
&lt;li&gt;ApiResponse 타입의 객체를 매개변수로 받아 그 상태에 따라 적절한 로그를 출력하고, 필요한 작업을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function processApiResponse(response: ApiResponse) {
  switch (response.status) {
    case 'loading':
      console.log('데이터가 현재 로딩중입니다.');
      break;
    case 'success':
      if (response.data) {
        console.log('데이터가 성공적으로 전달되었습니다.', response.data);
        displayUserData(response.data);
      } else {
        console.log('데이터 전달은 성공했지만 데이터를 찾을 수 없습니다');
      }
      break;
    case 'error':
      console.log('에러가 발생하였습니다.');
      break;
  }
}

function displayUserData(user: User) {
  console.log(`User ID : ${user.id}`);
  console.log(`User NAME : ${user.name}`);
  console.log(`User EMAIL : ${user.email}`);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 함수 사용 예&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API에서 사용자 데이터를 요청하고 그 응답을 processApiResponse 함수를 통해 처리&lt;/li&gt;
&lt;li&gt;데이터 요청을 시뮬레이션하는 예제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;function fetchDataFromAPI(): ApiResponse {
  return {
    status: 'success',
    data: {
      id: 1,
      name: '테드',
      email: 'ted@ted.com',
    },
    message: '데이터가 성공적으로 전달되었습니다.',
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;API 응답 처리&lt;/h3&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;const response = fetchDataFromAPI();
processApiResponse(response);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;api.png&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbWXrv/btsHJODxA3P/Q0BeKQVj2qATrRYaAL9CrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbWXrv/btsHJODxA3P/Q0BeKQVj2qATrRYaAL9CrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbWXrv/btsHJODxA3P/Q0BeKQVj2qATrRYaAL9CrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbWXrv%2FbtsHJODxA3P%2FQ0BeKQVj2qATrRYaAL9CrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;api&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;87&quot; data-filename=&quot;api.png&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/API-with-TypeScript-adce5a084e354d52a7bbe18471374cc4?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/API-with-TypeScript-adce5a084e354d52a7bbe18471374cc4?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717137298647&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;API 응답 처리 함수 구현 with TypeScript | Notion&quot; data-og-description=&quot;1. 상태 및 데이터 타입 정의&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/API-with-TypeScript-adce5a084e354d52a7bbe18471374cc4?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/adce5a084e354d52a7bbe18471374cc4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pHmde/hyWdiQQMCg/uryJUHjLqFWyxSMFdqMp70/img.png?width=2000&amp;amp;height=259&amp;amp;face=0_0_2000_259,https://scrap.kakaocdn.net/dn/eCO0Y/hyWdtEQ9fc/EqTkIIfLrsYuq3dp6VPAfk/img.png?width=2000&amp;amp;height=259&amp;amp;face=0_0_2000_259&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/API-with-TypeScript-adce5a084e354d52a7bbe18471374cc4?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/API-with-TypeScript-adce5a084e354d52a7bbe18471374cc4?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pHmde/hyWdiQQMCg/uryJUHjLqFWyxSMFdqMp70/img.png?width=2000&amp;amp;height=259&amp;amp;face=0_0_2000_259,https://scrap.kakaocdn.net/dn/eCO0Y/hyWdtEQ9fc/EqTkIIfLrsYuq3dp6VPAfk/img.png?width=2000&amp;amp;height=259&amp;amp;face=0_0_2000_259');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;API 응답 처리 함수 구현 with TypeScript | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 상태 및 데이터 타입 정의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>API</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/59</guid>
      <comments>https://ted93.tistory.com/entry/API-%EC%9D%91%EB%8B%B5-%EC%B2%98%EB%A6%AC-%ED%95%A8%EC%88%98-%EA%B5%AC%ED%98%84-with-TypeScript#entry59comment</comments>
      <pubDate>Thu, 20 Jun 2024 12:35:05 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트 함수</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98</link>
      <description>&lt;h1&gt;1. 함수의 선언과 호출&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매개변수와 반환 값에 타입 지정 가능&lt;/li&gt;
&lt;li&gt;기본 함수 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;function greet(name: string): string {
  return `Hello, ${name}`;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화살표 함수: 타입 속성으로 명시하여 첨부&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type ArrowGreetType = (name: string) =&amp;gt; string;
const arrowGreet: ArrowGreetType = (name) =&amp;gt; `Hello ${name}`;
console.log(arrowGreet('테드'));
console.log(arrowGreet(1)); // - Error
// 'number' 형식의 인수는 'string' 형식의 매개 변수에 할당될 수 없습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 선택적 매개변수와 기본 매개변수&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선택적 매개변수
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;함수 호출 시 생략 가능, 매개변수를 선택적으로 허용&lt;/li&gt;
&lt;li&gt;변수명 뒤에 ? 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기본 매개변수
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;매개변수에 기본값을 할당&lt;/li&gt;
&lt;li&gt;선택적 매개변수로 매개변수가 전달되지 않은 경우 해당 기본값을 할당&lt;/li&gt;
&lt;li&gt;매개변수명 = '기본값'&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;function select(name?: string, greeting: string = 'hi') {
  if (name) {
    console.log(`${greeting}, ${name}`);
  } else {
    console.log(`${greeting}, guest`);
  }
}

// name 생략, greeting 기본값 설정
select(); // hi, guest

// 인자를 1개 전달하는 경우: name의 값으로 지정
select('hello'); // hi, hello
select('테드'); // hi, 테드

// name은 '테드', greeting은 'hello'로 지정
select('테드', 'hello'); // hello, 테드
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1) 선택적 매개변수와 기본 매개변수의 차이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두가지 모두 함수 호출 시 생략 가능&lt;/li&gt;
&lt;li&gt;선택적 매개변수는 생략된 경우: undefined로 처리&lt;/li&gt;
&lt;li&gt;기본 매개변수는 생략된 경우: 지정된 기본 값을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2) 주의사항&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;선택적 매개변수는 반드시 필수 매개변수 뒤에 작성&lt;/li&gt;
&lt;li&gt;기본 매개변수는 필수 매개변수와 선택적 매개변수 양쪽에 작성 가능&lt;/li&gt;
&lt;li&gt;기본 매개변수가 필수 매개변수 앞에 작성된 경우 - 기본 매개변수를 생략하려면 반드시 undefined를 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;  select(undefined, '안녕'); // 안녕, guest
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. Rest 매개변수&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수에 여러 개의 매개변수를 그룹화하여 배열로 전달하는 기능&lt;/li&gt;
&lt;li&gt;함수에 가변적인 수의 인자를 안전하고 효율적으로 처리하도록 하는 기능&lt;/li&gt;
&lt;li&gt;...연산자를 매개변수 앞에 사용하여 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function sum(...numbers: number[]) {
  return numbers.reduce((a, b) =&amp;gt; a + b);
}
const r1 = sum(1, 2, 3, 4, 5);
console.log(r1); // 15
const r2 = sum(11, 22, 33, 44, 55);
console.log(r2); // 165
const r3 = sum(10, 20, 30);
console.log(r3); // 60
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 인자는 name의 변수에 두 번째 인자부터는 names 배열에 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function greetEveryone(name: string, age: number, ...names: string[]) {
  return names.map((name) =&amp;gt; `Hello ${name}`).join(', ');
}
console.log(greetEveryone('테드', 30, 'a', 'b', 'c', '안녕', '테드친구'));
// Hello a, Hello b, Hello c, Hello 안녕, Hello 테드친구
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rest 매개변수 주의사항
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;항상 마지막에 위치&lt;/li&gt;
&lt;li&gt;타입 명시를 주의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;4. 함수의 '오버로딩'&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 이름의 함수에 대해 여러 매개변수의 타입과 반환 타입을 정의하는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수는 '하나 이상의 타입 시그니처'를 가질 수 있다.&lt;br /&gt;function 함수명()&lt;/li&gt;
&lt;li&gt;함수는 '단 하나의 구현'을 가질 수 있다.&lt;br /&gt;{}&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 문법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 선언부는 여러 개가 될 수 있지만, 구현은 하나만 있어야 한다.&lt;/li&gt;
&lt;li&gt;함수의 선언부: 중괄호 이전의 함수명, 매개변수 지정&lt;/li&gt;
&lt;li&gt;함수의 구현부: 중괄호와 중괄호 내의 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: any, b: any): any {
  if (typeof a === 'number' &amp;amp;&amp;amp; typeof b === 'number') {
    return a + b;
  } else if (typeof a === 'string' &amp;amp;&amp;amp; typeof b === 'string') {
    return a.concat(b);
  }
  throw new Error('Invalid arguments');
}
console.log(add(1, 2)); // 3
console.log(add('테', '드')); // 테드
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수의 오버로딩의 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수에 대한 다양한 타입의 매개변수를 제공할 수 있도록 지정&lt;/li&gt;
&lt;li&gt;+ 타입 안정성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/1aa57d4189d644d2b24c818f4db5c3d3?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/1aa57d4189d644d2b24c818f4db5c3d3?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717133096388&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입스크립트 함수 | Notion&quot; data-og-description=&quot;1. 함수의 선언과 호출&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/1aa57d4189d644d2b24c818f4db5c3d3?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/1aa57d4189d644d2b24c818f4db5c3d3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HttDZ/hyWdiQPI1n/FGNgSKgI61Ng0D957E5Xt0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bqOaK2/hyWdqVDXfI/QEGdiHTADFD2Eeo9F55H4K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/1aa57d4189d644d2b24c818f4db5c3d3?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/1aa57d4189d644d2b24c818f4db5c3d3?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HttDZ/hyWdiQPI1n/FGNgSKgI61Ng0D957E5Xt0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bqOaK2/hyWdqVDXfI/QEGdiHTADFD2Eeo9F55H4K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트 함수 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 함수의 선언과 호출&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>overloading</category>
      <category>parameter</category>
      <category>REST</category>
      <category>typescript</category>
      <category>매개변수</category>
      <category>오버로딩</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/58</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98#entry58comment</comments>
      <pubDate>Wed, 19 Jun 2024 15:25:36 +0900</pubDate>
    </item>
    <item>
      <title>객체 타입 - 덕 타이핑(duck typing)</title>
      <link>https://ted93.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%ED%83%80%EC%9E%85</link>
      <description>&lt;h1&gt;1. 객체 '리터럴&amp;rsquo;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 객체 데이터 정의&lt;br /&gt;구분자로 쉼표(,)만 사용 가능&lt;br /&gt;객체 이름은 소문자로 시작&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 '리터럴'은 객체를 정의하고 각 속성에 값을 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;type UserType = {
  name: '테드';
  height: number;
};

const user: UserType = {
  name: '테드',
  height: 177,
};

console.log(user.name);
user.name = '테드친구'; // Error - '&quot;테드친구&quot;' 형식은 '&quot;테드&quot;' 형식에 할당할 수 없습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 구조적 타이핑&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 타입을 그 구조나 멤버에 의해서 결정하는 방식&lt;/li&gt;
&lt;li&gt;객체의 형태가 같다면, 같은 타입으로 간주&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;덕 타이핑(duck typing)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체의 실제 타입보다는 객체가 가진 속성과 메서드가 어떤 타입에 맞느냐가 중요&lt;/li&gt;
&lt;li&gt;&quot;만약 어떤 것이 오리처럼 걷고, 오리처럼 꽥꽥거린다면, 그것은 오리일 것이다&quot; 라는 철학에서 이름이 유래&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974341620&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Person = {
  name: string;
  age: number;
};

function greet(person: Person): void {
  console.log(`Name: ${person.name}, / Age: ${person.age}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Person 타입이 명시적으로 구현되지 않은 객체 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974348970&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const p1 = {
  name: '테드',
  age: 50,
};
const p2 = {
  name: '테드친구',
  age: 100,
};
const p3 = {
  name: '테드친구2',
  age: 150,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;greet 함수 호출 : 인자로 Person 타입의 데이터가 전달&lt;br /&gt;Person과 구조가 같기 때문에 Person으로 취급&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974367558&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;greet(p1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조적 타이핑에 의해 Person으로 취급: hobby 속성을 무시한 채로 Person으로 인식&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974405937&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;greet(p2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Person 타입 속성의 구조와 일치하지 않음(age 속성 누락)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974421666&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;greet(p3); // Error - 에러 내용은 아래 사진 참고&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;duck typing.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN4mbF/btsHHlnhxNl/WjK6IdoRnjcDQWhVN7iOUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN4mbF/btsHHlnhxNl/WjK6IdoRnjcDQWhVN7iOUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN4mbF/btsHHlnhxNl/WjK6IdoRnjcDQWhVN7iOUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN4mbF%2FbtsHHlnhxNl%2FWjK6IdoRnjcDQWhVN7iOUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;duck-typing&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;92&quot; data-filename=&quot;duck typing.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 중첩된 객체 타입&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 내부에 또 다른 객체를 포함하는 형태&lt;/li&gt;
&lt;li&gt;복잡한 데이터를 조직화하고 관리하기 용이&lt;/li&gt;
&lt;li&gt;사용자의 프로필과 주소 정보를 포함하는 중첩된 객체 타입 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974471033&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Address = {
  street: string;
  city: string;
  zipCode: string;
};

type UserProfile = {
  username: string;
  email: string;
  address: Address;
};

let userA: UserProfile = {
  username: '테드',
  email: '테드@테드.com',
  address: {
    street: '123 St',
    city: 'Busan',
    zipCode: '12345',
  },
};

console.log(userA.username);
console.log(userA.address.city);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중첩된 객체 속성을 옵셔널 하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974488995&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type UserProfile = {
  username: string;
  email: string;
  address?: Address; // address 뒤에 ? 물음표 연산자를 사용하면
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 객체를 생략하는 경우를 대비하여 아래 사진처럼 오류가 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Nested-Object.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GU0JF/btsHGCcetPV/4yNiUews0x6oJ7JfOKqGkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GU0JF/btsHGCcetPV/4yNiUews0x6oJ7JfOKqGkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GU0JF/btsHGCcetPV/4yNiUews0x6oJ7JfOKqGkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGU0JF%2FbtsHGCcetPV%2F4yNiUews0x6oJ7JfOKqGkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Nested-Object&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;119&quot; data-filename=&quot;Nested-Object.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류를 방지하기 위해서 조건문 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716974566255&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function isAddress(user: UserProfile) {
  if (userA.address) {
    console.log(userA.address.city);
  }
}

isAddress(userA);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 인덱스 서명&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 모든 속성에 대해 타입을 정의하지 않고&lt;br /&gt;키와 값의 타입만을 정의하여 객체의 구조를 유연하게 지정하는 방법&lt;br /&gt;객체의 속성에 동적으로 접근할 수 있는 기능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유연성: 정해진 속성 이름 없이 다양한 속성을 객체에 추가 가능&lt;br /&gt;동적 데이터 처리: 런타임에 키와 값을 결정 가능&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;type UserRecord = {
  // name: string; - 일반적인 객체 속성 타입 명시
  // [propertyName: indexType]: valueType;
  // [key: string]: type,
  [key: string]: string | boolean;
};

let user1: UserRecord = {
  name: '테드',
  // UserRecord 타입은 속성명이 문자열 속성값도
  // , 반드시 문자열인 다양한 속성을 지정 가능
  age: '20',
  isStudent: false,
  // height: 177, // Error - 'number' 형식은 'string' 형식에 할당할 수 없습니다.
};

user1.email = 'qwe123';
console.log(user1); // { name: '테드', age: '20', isStudent: false, email: 'qwe123' }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/cd79a9aeeca847e3824dd8aec4c84fce?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/cd79a9aeeca847e3824dd8aec4c84fce?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716974660401&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;객체 타입 | Notion&quot; data-og-description=&quot;1. 객체 '리터럴&amp;rsquo;&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/cd79a9aeeca847e3824dd8aec4c84fce?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/cd79a9aeeca847e3824dd8aec4c84fce&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRVcEP/hyWdqgptgb/Rj4O3uFZqut9YVX962vyO1/img.png?width=2000&amp;amp;height=301&amp;amp;face=0_0_2000_301,https://scrap.kakaocdn.net/dn/dCQ0Vj/hyWdmSCu7V/Jd6eso3zAjO8blyayRQj7K/img.png?width=2000&amp;amp;height=301&amp;amp;face=0_0_2000_301&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/cd79a9aeeca847e3824dd8aec4c84fce?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/cd79a9aeeca847e3824dd8aec4c84fce?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRVcEP/hyWdqgptgb/Rj4O3uFZqut9YVX962vyO1/img.png?width=2000&amp;amp;height=301&amp;amp;face=0_0_2000_301,https://scrap.kakaocdn.net/dn/dCQ0Vj/hyWdmSCu7V/Jd6eso3zAjO8blyayRQj7K/img.png?width=2000&amp;amp;height=301&amp;amp;face=0_0_2000_301');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;객체 타입 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 객체 '리터럴&amp;rsquo;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>duck-typing</category>
      <category>index-signature</category>
      <category>nested-object</category>
      <category>typescript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/45</guid>
      <comments>https://ted93.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%ED%83%80%EC%9E%85#entry45comment</comments>
      <pubDate>Tue, 18 Jun 2024 19:25:00 +0900</pubDate>
    </item>
    <item>
      <title>리터럴 타입 (Literal)</title>
      <link>https://ted93.tistory.com/entry/%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%83%80%EC%9E%85-Literal</link>
      <description>&lt;h1&gt;1. 리터럴 타입의 정의&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정&amp;nbsp;값만을&amp;nbsp;가질&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;타입을&amp;nbsp;정의할&amp;nbsp;때&amp;nbsp;사용&amp;nbsp;특정 &lt;br /&gt;문자열, 숫자 또는 불리언 값을 정확히 지정하는 타입&lt;br /&gt;특정&amp;nbsp;값으로&amp;nbsp;제한된&amp;nbsp;타입 &lt;br /&gt;해당&amp;nbsp;값만을&amp;nbsp;가지는&amp;nbsp;상수&amp;nbsp;또는&amp;nbsp;해당&amp;nbsp;값을&amp;nbsp;타입으로&amp;nbsp;지정한&amp;nbsp;변수 &lt;br /&gt;다른&amp;nbsp;값을&amp;nbsp;할당하려고&amp;nbsp;하면&amp;nbsp;타입&amp;nbsp;에러가&amp;nbsp;발생&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수를 const로 선언하고 직접 리터럴 값을 할당(초기화)&lt;br /&gt;해당 값을 자동으로 리터럴 값으로 유추&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716972459706&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let letString = 'hello';
letString = 'hi';

const constString = 'hello';
constString = 'hi'; // Error - 상수이므로 'constString'에 할당할 수 없습니다.
const constNumber = 10;
const constBool = true;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수에 타입 명시를 리터럴 값으로 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716972491747&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let exactString: 'hello' = 'hello';
exactString = 'hi'; // - Error - '&quot;hi&quot;' 형식은 '&quot;hello&quot;' 형식에 할당할 수 없습니다.
let exactNumber = 1;
let exactBool = false;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Literal.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lljV0/btsHGCca4gM/34FsNjPhVEfn4QTHmSfwPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lljV0/btsHGCca4gM/34FsNjPhVEfn4QTHmSfwPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lljV0/btsHGCca4gM/34FsNjPhVEfn4QTHmSfwPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlljV0%2FbtsHGCca4gM%2F34FsNjPhVEfn4QTHmSfwPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Literal&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;145&quot; data-filename=&quot;Literal.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Literal2.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buFoMQ/btsHG9OekiM/cdQsKV4MCNqjprbEKAKNs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buFoMQ/btsHG9OekiM/cdQsKV4MCNqjprbEKAKNs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buFoMQ/btsHG9OekiM/cdQsKV4MCNqjprbEKAKNs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuFoMQ%2FbtsHG9OekiM%2FcdQsKV4MCNqjprbEKAKNs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Literal&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;123&quot; data-filename=&quot;Literal2.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 리터럴 타입 활용&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 type 키워드와 함께 사용&lt;br /&gt;유니언 타입과 함께 사용하여 다양한 값을 표현함과 동시에 제한 가능&lt;br /&gt;변수나 매개변수가 특정 값들 중 하나만을 가질 수 있도록 제한&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Directions 타입 속성의 경우&lt;br /&gt;string 타입의 네 가지 특정 리터럴 타입중 하나만을 가지는 타입&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716972593802&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Directions = 'up' | 'bottom' | 'left' | 'right';
let moveUp: Directions = 'up';
moveUp = '위'; // - Error - '&quot;위&quot;' 형식은 'Directions' 형식에 할당할 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 인자로서의 리터럴 타입 지정으로 함수 인자를 특정 값으로 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716972604369&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function setAlignment(align: 'left' | 'right' | 'center'): void {}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리터럴 타입은 숫자, 문자열, 불리언 등 원시 타입과 결합하여 다양하게 사용 가능&lt;br /&gt;숫자 데이터는 모든 자료를 입력 가능&lt;br /&gt;문자열 데이터는 'yes' 또는 'no'만 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716972621276&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Literal = number | 'yes' | 'no';
let gameState: Literal = 'yes';
gameState = 'yes';
gameState = 'no';
gameState = 3;
gameState = 31232132142142;
gameState = '안녕'; // - Error - '&quot;안녕&quot;' 형식은 'Literal' 형식에 할당할 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리터럴 타입의 활용 로직&lt;br /&gt;구체적인 값을 강제 | 특정 값들만 허용하는 로직 설계에 유용&lt;br /&gt;코드의 의도를 명확하게 표현 &amp;gt; 오류 감소, 자동완성 및 리팩토링에 용이&lt;/li&gt;
&lt;li&gt;리터럴 타입의 한계성&lt;br /&gt;고정된 값에만 제한되기 때문에 유연성이 떨어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Literal-d358d24a8f144fe6926436527ec030d2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Literal-d358d24a8f144fe6926436527ec030d2?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716972748840&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;리터럴 타입 (Literal) | Notion&quot; data-og-description=&quot;1. 리터럴 타입의 정의&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Literal-d358d24a8f144fe6926436527ec030d2?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/d358d24a8f144fe6926436527ec030d2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDWKUa/hyWdd9cUnm/0gjcbOyxi4BZTorOEM9rdK/img.png?width=2000&amp;amp;height=421&amp;amp;face=0_0_2000_421,https://scrap.kakaocdn.net/dn/biRHvv/hyWdio9aew/nkBF5x3MmwjBZKKFmAKHpk/img.png?width=2000&amp;amp;height=421&amp;amp;face=0_0_2000_421&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Literal-d358d24a8f144fe6926436527ec030d2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Literal-d358d24a8f144fe6926436527ec030d2?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDWKUa/hyWdd9cUnm/0gjcbOyxi4BZTorOEM9rdK/img.png?width=2000&amp;amp;height=421&amp;amp;face=0_0_2000_421,https://scrap.kakaocdn.net/dn/biRHvv/hyWdio9aew/nkBF5x3MmwjBZKKFmAKHpk/img.png?width=2000&amp;amp;height=421&amp;amp;face=0_0_2000_421');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;리터럴 타입 (Literal) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 리터럴 타입의 정의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>literal</category>
      <category>literal-type</category>
      <category>typescript</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/44</guid>
      <comments>https://ted93.tistory.com/entry/%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%83%80%EC%9E%85-Literal#entry44comment</comments>
      <pubDate>Mon, 17 Jun 2024 18:51:02 +0900</pubDate>
    </item>
    <item>
      <title>Intersection 타입</title>
      <link>https://ted93.tistory.com/entry/Intersection-%ED%83%80%EC%9E%85</link>
      <description>&lt;h1&gt;1. Intersection 타입이란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 타입을 하나로 결합하여 모든 타입의 기능을 갖춘, 단일 타입을 생성하는 방법&lt;/li&gt;
&lt;li&gt;여러 타입을 모두 만족하는 하나의 타입&lt;/li&gt;
&lt;li&gt;AND 연산자 (A 그리고 B) - &amp;amp; 기호를 사용하여 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. Intersection 타입 사용&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;type IntersectionType = Type1 &amp;amp; Type2 &amp;amp; Type3;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;type Employee = {
  name: string;
  startDate: Date;
};

type Manager = {
  name: string;
  startDate: Date;
  group: string; // 부서명
};
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에 코드에서 name과 startDate가 중복이 됨&lt;/li&gt;
&lt;li&gt;아래 처럼 Intersection 타입을 활용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt; type Manager = Employee &amp;amp; { group: string };

  let managerA: Manager = {
    name: '테드',
    startDate: new Date(),
    group: 'developer',
  };
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 인터섹션 타입의 특징&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1) 타입 결합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 타입의 속성을 결합하여 새로운 타입을 생성&lt;/li&gt;
&lt;li&gt;코드의 재사용성과 복잡한 타입의 조합 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2) 유연성과 정확성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 모든 타입의 속성을 조합&lt;/li&gt;
&lt;li&gt;유연하면서도 정확한 타입 정의 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 인터섹션 타입 예시&lt;/h1&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type Admin = {
  isAdmin: boolean;
};

// 일반 사용자
type User = {
  id: string;
  password: string;
};

// 관리 사용자
type AdminUser = User &amp;amp; Admin;

function createAdminUser(user: User): AdminUser {
  return { ...user, isAdmin: true };
  // 스프레드 연산자를 사용하는 새로운 객체 생성
}

let newAdminUser: User = {
  id: 'qwe123',
  password: 'qwe123!',
};
let adminUser1 = createAdminUser(newAdminUser);
console.log(adminUser1); // { id: 'qwe123', password: 'qwe123!', isAdmin: true }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제1&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 Intersection 타입 생성&lt;br /&gt;Person 타입과 ContactDetails 타입을 결합하여 Employee 타입을 생성&lt;br /&gt;Employee 타입은 Person의 모든 속성(name, age)과 ContactDetails의 모든 속성(email, phone)을 포함&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div markdown=&quot;1&quot;&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type Person = { name: string; age: number };
type ContactDetails = { email: string; phone: string };
type Employee = Person &amp;amp; ContactDetails;
let employee1: Employee = {
  name: '테드',
  age: 99,
  email: 'ted@ted.com',
  phone: '010-1234-5678',
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 2&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 반환 타입으로 Intersection 사용&lt;br /&gt;Vehicle 타입과 Engine 타입을 결합하여 Car 타입 생성&lt;br /&gt;createCar 함수를 구현하여, 주어진 Vehicle과 Engine 정보를 받아 Car 객체를 반환하도록 구현&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div markdown=&quot;1&quot;&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type Vehicle = {
  make: string;
  model: string;
};
type Engine = {
  engineType: string;
  horsepower: number;
};
type Car = Vehicle &amp;amp; Engine;

function createCar(vehicle: Vehicle, engine: Engine): Car {
  return { ...vehicle, ...engine };
}

let v1: Vehicle = {
  make: 'Kia',
  model: 'K5',
};
let engine: Engine = {
  engineType: 'hybrid',
  horsepower: 100,
};

const newCar = createCar(v1, engine);
console.log(newCar);
// { make: 'Kia', model: 'K5', engineType: 'hybrid', horsepower: 100 }
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 3&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 Intersection 타입 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TeamMember 타입과 Project 타입을 결합하여 TeamMemberWithProject 타입을 생성&lt;br /&gt;해당 타입을 사용해 assignProjectToTeamMember 함수를 구현&lt;br /&gt;함수는 TeamMember 객체와 Project 정보를 받아서, 이를 결합한 TeamMemberWithProject 객체를 반환&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div markdown=&quot;1&quot;&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type TeamMember = {
  memberId: string;
  name: string;
};

type Project = {
  projectId: string;
  projectName: string;
};
type TeamMemberWithProject = TeamMember &amp;amp; Project;
function assignProjectToTeamMember(
  teamMember: TeamMember,
  project: Project,
): TeamMemberWithProject {
  return { ...teamMember, ...project };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Intersection-46e8435b73d34a86b4aca4a004938a67?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Intersection-46e8435b73d34a86b4aca4a004938a67?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717059553995&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Intersection 타입 | Notion&quot; data-og-description=&quot;1. Intersection 타입이란?&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Intersection-46e8435b73d34a86b4aca4a004938a67?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/46e8435b73d34a86b4aca4a004938a67&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bP92LB/hyWdkt3qxO/wFqryjBo4wJqi12heAJro1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/denygy/hyWdquhZck/4lXWtASEc7ZVzbkOiLiLyk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Intersection-46e8435b73d34a86b4aca4a004938a67?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Intersection-46e8435b73d34a86b4aca4a004938a67?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bP92LB/hyWdkt3qxO/wFqryjBo4wJqi12heAJro1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/denygy/hyWdquhZck/4lXWtASEc7ZVzbkOiLiLyk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Intersection 타입 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Intersection 타입이란?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>intersection</category>
      <category>intersection-type</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/57</guid>
      <comments>https://ted93.tistory.com/entry/Intersection-%ED%83%80%EC%9E%85#entry57comment</comments>
      <pubDate>Sun, 16 Jun 2024 19:00:47 +0900</pubDate>
    </item>
    <item>
      <title>Union 타입</title>
      <link>https://ted93.tistory.com/entry/Union-%ED%83%80%EC%9E%85</link>
      <description>&lt;h1&gt;1. union 타입이란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 타입 중 하나가 될 수 있는 값을 나타내는 방법&lt;/li&gt;
&lt;li&gt;값에 허용된 타입을 두 개 이상으로 지정&lt;/li&gt;
&lt;li&gt;OR 연산자 (A 또는 B)&lt;/li&gt;
&lt;li&gt;| 기호를 사용하여 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. union 타입의 사용&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수, 함수의 매개변수, 반환값 등에서 모두 사용 가능&lt;/li&gt;
&lt;li&gt;타입의 유연성을 제공&lt;/li&gt;
&lt;li&gt;무분별한 any 사용을 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. union 타입의 예시(사용방법)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type UnionType = Type1 | Type2 | Type3;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;  type Any = string | number | boolean | string[];
  let value: Any = '문자';
  value = 123;
  value = true;
  value = ['1', '2'];
  // value = {}; // Error - '{}' 형식은 'Any' 형식에 할당할 수 없습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;타입 별칭의 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관리자 계정 Admin&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;type Admin = {
  id: string | number;
  password: number;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 계정 User&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type User = {
  id: string | number;
  name: string;
};
type Person = Admin | User;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 별칭의 union 타입의 경우 - 중복되지 않은 타입 속성은 옵셔널(?)과 동일&lt;br /&gt;즉 아래 Person은 위에 type Person = Admin | User; 코드와 동일함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;type Person = {
  id: string | number;
  password?: number;
  name?: string;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. union 타입의 특징&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1) 공통 필드 접근&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;union의 모든 멤버가 공유하는 속성에만 직접적으로 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2) 타입 가드 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 타입에만 존재하는 속성이나 메서드에 접근하기 위해서는 타입 가드를 사용 타입 가드 - 조건문을 통해 타입을 좁혀나가는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3) 유연성과 안정성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 타입의 사용을 가능하게 하는 유연성을 제공, 타입 가드를 적극적으로 사용하여 코드의 안정성을 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;5. union 타입 실습&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 1&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나이가 입력될 때&lt;br /&gt;숫자 : 소수점 자리가 없도록 지정하여 문자열로 반환(toFixed()) 문자 : 그대로 반환&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type Union = number | string;
function getAge(age: Union) {
  if (typeof age === 'string') {
      return age;
    }
  if (typeof age === 'number') {
    age = age.toFixed();
    return age;
  }
}

console.log(getAge(12.345)); // 12
console.log(getAge('15살')); // 15살
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고, 타입스크립트는 자동 완성 기능을 정말 잘 제공해주는데,&lt;br /&gt;type age가 string인 부분에서는 문자열 메서드를 자동완성으로 제공하고&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typeof-string.png&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ERQgD/btsHJmTuttR/csOc7kBkCy2LiBMEi3ZPRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ERQgD/btsHJmTuttR/csOc7kBkCy2LiBMEi3ZPRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ERQgD/btsHJmTuttR/csOc7kBkCy2LiBMEi3ZPRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FERQgD%2FbtsHJmTuttR%2FcsOc7kBkCy2LiBMEi3ZPRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;typeof-string&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;169&quot; data-filename=&quot;typeof-string.png&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;number 타입 조건 안에서는 number 타입의 메서드를 자동완성으로 제공한다&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typeof-number.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnMNz1/btsHJknPRh4/pqJbgvT8sOBah2fVSDoulk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnMNz1/btsHJknPRh4/pqJbgvT8sOBah2fVSDoulk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnMNz1/btsHJknPRh4/pqJbgvT8sOBah2fVSDoulk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnMNz1%2FbtsHJknPRh4%2FpqJbgvT8sOBah2fVSDoulk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;typeof-number&quot; loading=&quot;lazy&quot; width=&quot;292&quot; height=&quot;128&quot; data-filename=&quot;typeof-number.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제2&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union 타입을 사용한 변수 선언&lt;br /&gt;string, number, boolean 중 하나의 타입을 가질 수 있는 MixedType 변수를 선언하고,&lt;br /&gt;각 타입에 해당하는 값을 할당하는 예시 코드를 작성&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type MixedType = string | number | boolean;
let example1: MixedType;
example1 = '123';
example1 = 123;
example1 = true;
// example1 = []; - Error
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제3&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 매개변수에 Union 타입 적용&lt;br /&gt;number와 string 타입 중 하나를 매개변수로 받아,&lt;br /&gt;해당 값이 number일 경우 숫자를 2배로 증가시키고,&lt;br /&gt;string일 경우 그대로 반환하는 함수 doubleOrNothing을 작성&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;function doubleOrNothing(input: number | string): void {
  if (typeof input === 'number') {
    console.log(input * 2);
  }
  if (typeof input === 'string') {
    console.log(input);
  }
}
doubleOrNothing(10); // 20
doubleOrNothing('hello'); // hello
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제4&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union 타입과 타입 가드를 활용한 고급 예제&lt;br /&gt;Admin과 User 타입 명시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Admin은 id (number 타입)와 isAdmin (boolean 타입) 속성을,&lt;br /&gt;User는 id (number 타입)와 username (string 타입) 속성 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 타입의 유니온 타입을 사용하여 Person 타입을 선언하고,&lt;br /&gt;id, isAdmin, username 중 적절한 속성을 가진 객체를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Person 타입의 객체를 매개변수로 받아 Admin인지 User인지를 구분해 출력하는 함수 identifyPerson을 작성&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;type Admin = { id: number; isAdmin: boolean };
type User = { id: number; username: string };
type PersonType = Admin | User;
function identifyPerson(person: PersonType) {
  if ('isAdmin' in person) {
    return console.log('Admin입니다');
  }
  if ('username' in person) {
    return console.log('User입니다');
  }
}
const adminPerson: PersonType = { id: 1, isAdmin: true };
const userPerson: PersonType = { id: 2, username: 'typescriptUser' };

identifyPerson(adminPerson); // Admin입니다
identifyPerson(userPerson); // User입니다
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제5&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 프로젝트에서의 Union 활용 실제 서버와의 통신에 있어 다양한 형태의 응답을 처리하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 정보가 있는 경우 : { name: string, email: string }&lt;br /&gt;사용자 정보가 없는 경우 : { error: string }&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;type Success = {
  name: string;
  email: string;
};
type Fail = {
  error: string;
};
type UserResponse = Success | Fail;
function handleResponse(response: UserResponse) {
  // in 연산자
  // : 객체의 속성이 존재하면 true, 없으면 false를 반환
  if ('error' in response) {
    console.error(response.error);
  } else {
    console.log(`${response.name}, ${response.email}`);
  }
}
handleResponse({ name: '테드', email: 'ted@ted.com' }); // 테드, ted@ted.com
handleResponse({ error: 'User not found' }); // User not found
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Union-fa61e27c275243c78f67bac7980ab998?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Union-fa61e27c275243c78f67bac7980ab998?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717056706660&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Union 타입 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Union-fa61e27c275243c78f67bac7980ab998?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/fa61e27c275243c78f67bac7980ab998&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btwbv7/hyWdlzIUU3/Fv9t4k6tJ2EalFIb4wBvV1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/2LUV5/hyWdgSHnNl/ZKK1UwCz7qmfK4r9ljMyak/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Union-fa61e27c275243c78f67bac7980ab998?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Union-fa61e27c275243c78f67bac7980ab998?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btwbv7/hyWdlzIUU3/Fv9t4k6tJ2EalFIb4wBvV1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/2LUV5/hyWdgSHnNl/ZKK1UwCz7qmfK4r9ljMyak/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Union 타입 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>type-guard</category>
      <category>typescript</category>
      <category>union</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/56</guid>
      <comments>https://ted93.tistory.com/entry/Union-%ED%83%80%EC%9E%85#entry56comment</comments>
      <pubDate>Sat, 15 Jun 2024 10:10:58 +0900</pubDate>
    </item>
    <item>
      <title>타입 어노테이션(Type Annotation)</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98Type-Annotation</link>
      <description>&lt;h1&gt;1. 타입 어노테이션(Type Annotation)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수, 함수의 매개변수, 함수의 반환값 등에 사용&lt;/li&gt;
&lt;li&gt;해당 식별자(변수명)의 타입을 명시적으로 선언&lt;/li&gt;
&lt;li&gt;보통 식별자 뒤에 콜론을 사용하여 직접 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055492330&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let number;
let anyNumber: any;
// any 타입의 변수로 명시하지 않은 경우 값을 할당할 때마다 해당 값의 타입의 변수로 재지정&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Annotation.png&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/banf0B/btsHHHrdX0p/b7J79NKWsB3y97JCOXRok1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/banf0B/btsHHHrdX0p/b7J79NKWsB3y97JCOXRok1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/banf0B/btsHHHrdX0p/b7J79NKWsB3y97JCOXRok1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbanf0B%2FbtsHHHrdX0p%2Fb7J79NKWsB3y97JCOXRok1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Annotation&quot; loading=&quot;lazy&quot; width=&quot;206&quot; height=&quot;98&quot; data-filename=&quot;Annotation.png&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수에 초기화가 되는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055528273&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  number = 123.456;
  anyNumber = 123.789;
  console.log(number.toFixed(2)); // 사용 가능
  console.log(anyNumber.toFixed(2)); // 사용 가능

  number = '전화번호';
  anyNumber = '전화번호';
  // console.log(number.toFixed(2)); // Error
  // 'toFixed' 속성이 'string' 형식에 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 타입 별칭 (Type Alias)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 타입 이름을 생성하여 기존 타입을 참조할 수 있게 하는 기능&lt;/li&gt;
&lt;li&gt;코드의 가독성과 재사용성을 향상&lt;/li&gt;
&lt;li&gt;타입 별칭은 대문자로 시작!&lt;/li&gt;
&lt;li&gt;기본 사용 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;type 키워드를 사용하여 정의&lt;/li&gt;
&lt;li&gt;type 타입별칭 = 타입; (콜론이 아닌 =(할당 연산자)를 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 변수 타입 별칭&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수의 경우 별칭 사용을 거의 하지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055539108&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Text = string;
let message: Text = '텍스트 메시지'; // 가능은 하지만 별칭 대신 string 사용 권장
let message2: Text = '텍스트 메시지2'; // 가능은 하지만 별칭 대신 string 사용 권장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 객체 타입 별칭&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 별칭 내에서도 선택적 프로퍼티와 읽기 전용 속성 사용 가능&lt;/li&gt;
&lt;li&gt;타입 별칭 명 지정 시 '데이터 변수명+Type'을 주로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055549204&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type UserType = {
name: string;
height: number;
};
const user1: UserType = {
name: '테드',
height: 177,
};
const user2: UserType = {
name: '테드친구',
height: 167,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 함수 타입 별칭&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User 타입인 매개변수를 받아 boolean 타입의 반환값을 생성하는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055561069&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type User = {
  id: string;
  name: string;
};
type ValidateUserType = (user: User) =&amp;gt; boolean;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 사용 예제&lt;/li&gt;
&lt;li&gt;사용가 입력되었을 때&lt;br /&gt;사용자의 아이디가 null인 경우(입력하지 않은 경우) false&lt;br /&gt;사용자의 아이디가 입력된 경우 true&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055590657&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const isValidUser: ValidateUserType = (user) =&amp;gt; user.id !== '';

let userA: User = {
  id: 'qwe',
  name: '테드',
};
let userB: User = {
  id: '',
  name: '테드친구',
};
console.log(isValidUser(userA)); // true
console.log(isValidUser(userB)); // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;void 타입 사용 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717055603798&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  type VoidReturnType = (x: number) =&amp;gt; void;
  const add: VoidReturnType = (x) =&amp;gt; console.log(x + x);
  add(2); // 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 함수 타입 별칭 예제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 함수 타입 별칭 정의&lt;/p&gt;
&lt;pre id=&quot;code_1717055613863&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type GreetFunction = (name: string) =&amp;gt; string;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 위의 타입 별칭을 사용하는 함수 구현&lt;/p&gt;
&lt;pre id=&quot;code_1717055627206&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const greet: GreetFunction = (name) =&amp;gt; {
	return `Hello, ${name}`;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 일반 선언적 함수에서 타입 명시 - 타입 별칭 사용 불가능&lt;/p&gt;
&lt;pre id=&quot;code_1717055640706&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function greet2(name: string): string {
  return `Hello, ${name}`;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;연습 문제&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 1 - 타입 어노테이션 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 age를 선언하고 숫자 타입으로 어노테이션을 지정&lt;br /&gt;변수 isStudent를 선언하고 불리언 타입으로 어노테이션을 지정&lt;br /&gt;위 두 변수에 적절한 값을 할당하고, 콘솔에 출력&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;let age: number;
let isStudent: boolean;
age = 30;
isStudent = true;
console.log(`Age: ${age}, isStudent: ${isStudent}`); // Age: 30, isStudent: true
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 2 - 타입 별칭 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ProductType이라는 타입 별칭을 생성&lt;br /&gt;객체, id (문자열 타입), name (문자열 타입), price (숫자 타입) 속성 포함&lt;br /&gt;ProductType 타입을 사용하여 product라는 이름의 변수를 선언하고, 적절한 값을 할당&lt;br /&gt;product 객체의 내용을 콘솔에 출력&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type ProductType = {
  id: string;
  name: string;
  price: number;
};
const product: ProductType = {
  id: 'd2',
  name: '모션 데스크',
  price: 800000,
};
console.log(product); // { id: 'd2', name: '모션 데스크', price: 800000 }
console.log(`${product.id}, ${product.name}, ${product.price}`);
// d2, 모션 데스크, 800000

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Type-Annotation-a76fc7eb5b734e228591340906090c38?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Type-Annotation-a76fc7eb5b734e228591340906090c38?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717055758600&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입 어노테이션(Type Annotation) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Type-Annotation-a76fc7eb5b734e228591340906090c38?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/a76fc7eb5b734e228591340906090c38&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kMs83/hyWdtkfsS3/Z8klmzMkknVlRXHq8m8ZJK/img.png?width=2000&amp;amp;height=951&amp;amp;face=0_0_2000_951,https://scrap.kakaocdn.net/dn/hzgjp/hyWde8qXkp/8dwWknz2csbfkivFF7rKV1/img.png?width=2000&amp;amp;height=951&amp;amp;face=0_0_2000_951&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Type-Annotation-a76fc7eb5b734e228591340906090c38?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Type-Annotation-a76fc7eb5b734e228591340906090c38?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kMs83/hyWdtkfsS3/Z8klmzMkknVlRXHq8m8ZJK/img.png?width=2000&amp;amp;height=951&amp;amp;face=0_0_2000_951,https://scrap.kakaocdn.net/dn/hzgjp/hyWde8qXkp/8dwWknz2csbfkivFF7rKV1/img.png?width=2000&amp;amp;height=951&amp;amp;face=0_0_2000_951');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입 어노테이션(Type Annotation) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>alias</category>
      <category>type</category>
      <category>type-annotation</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/55</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98Type-Annotation#entry55comment</comments>
      <pubDate>Fri, 14 Jun 2024 17:57:06 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트의 객체 타입</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EA%B0%9D%EC%B2%B4-%ED%83%80%EC%9E%85</link>
      <description>&lt;h1&gt;1. 객체 타입 지정(명시)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 타입 정의 시 {}(중괄호)를 사용하여 표현&lt;/li&gt;
&lt;li&gt;객체 타입의 경우 타입끼리의 구분 시 세미콜론(;) 사용을 권장!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체 타입 정의와 객체의 차이점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콜론의 우변에는 값 대신 해당 속성값의 타입을 명시(지정)&lt;/li&gt;
&lt;li&gt;구분자로 콤마(,) 뿐만 아니라 세미콜론(;)도 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체 타입 명시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수 명 뒤에 콜론을 사용하여 명시&lt;/li&gt;
&lt;li&gt;콜론 뒤 중괄호를 사용&lt;/li&gt;
&lt;li&gt;객체 타입 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const user: { name: string; age: number } = {
  name: '테드',
  age: 50,
  height: 169, // Error - 객체의 경우 타입으로 명시되지 않은 속성은 정의할 수 없음
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 객체의 경우 타입으로 명시된 값은 반드시 정의되어 있어야 함! 만약 위 코드에서 age를 주석 처리를 한다면 아래와 같은 에러가 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Object-type.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH1qqn/btsHIeIMOHP/QW5SUSvn3A42ik29vZUJ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH1qqn/btsHIeIMOHP/QW5SUSvn3A42ik29vZUJ10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH1qqn/btsHIeIMOHP/QW5SUSvn3A42ik29vZUJ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH1qqn%2FbtsHIeIMOHP%2FQW5SUSvn3A42ik29vZUJ10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;object-type&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;254&quot; data-filename=&quot;Object-type.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 객체의 선택 속성(선택적 프로퍼티)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속성명 뒤에 물음표(?)를 붙여 해당 속성이 존재하지 않을 수도 있음을 표현&lt;/li&gt;
&lt;li&gt;객체 타입에 지정된 형식 그대로를 객체로 작성&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; BUT! 선택적으로 값을 생략하고 싶은 경우 선택적 프로퍼티를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const nameAndBirthday: {
  name: string;
  birthday?: number;
} = {
  name: '테드',
  birthday: 818,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 읽기 전용 속성&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;속성명 앞에 readonly 키워드를 사용하여 해당 속성의 재할당을 금지&lt;/li&gt;
&lt;li&gt;해당 키워드가 붙은 속성은 const 키워드를 이용한 변수 정의와 유사&lt;/li&gt;
&lt;li&gt;객체의 속성값에 접근하는 방법 - 점 연산자를 사용하여 접근&lt;/li&gt;
&lt;li&gt;readonly 키워드 작성 시 속성명과 띄어쓰기 작성 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const readonlyName: {
  readonly name: string;
  age: number;
} = {
  name: '테드',
  age: 30,
};

readonlyName.name = '테드 블루'; // Error - 에러 메세지는 아래 사진 참고
console.log(readonlyName.name);

readonlyName.age = 29;
console.log(readonlyName.age);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readonly.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2O9ry/btsHIcjTwzO/omHczNKgwikqA4sivLALzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2O9ry/btsHIcjTwzO/omHczNKgwikqA4sivLALzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2O9ry/btsHIcjTwzO/omHczNKgwikqA4sivLALzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2O9ry%2FbtsHIcjTwzO%2FomHczNKgwikqA4sivLALzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;readonly&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;255&quot; data-filename=&quot;readonly.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 연습문제&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제1&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 객체 타입을 정의하고, 해당 타입을 가진 객체를 하나 생성 person: 객체는 name(문자열), age(숫자), hobby(문자열, 선택적) 속성을 가져야 한다.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div markdown=&quot;1&quot;&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const person: { name: string; age: number; hobby?: string } = {
  name: '테드',
  age: 30,
  hobby: '코딩',
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제2&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;readonly를 사용하여 car 객체 타입을 정의하고, model(읽기 전용, 문자열)과 year(숫자) 속성을 포함하는 객체를 생성 model 속성에 다른 값을 할당하려고 할 때 발생하는 오류를 설명&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div markdown=&quot;1&quot;&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;const car: { readonly model: string; year: number } = {
  model: 'Sonata',
  year: 2024,
};
car.model = 'Hyundai'; // Error - model은 readonly 속성임
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/d23d0a17ca1e4c2abc8fcfa4dee68d95?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/d23d0a17ca1e4c2abc8fcfa4dee68d95?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717052346512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입스크립트의 객체 타입 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/d23d0a17ca1e4c2abc8fcfa4dee68d95?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/d23d0a17ca1e4c2abc8fcfa4dee68d95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ew4gq/hyWdkt1HtK/vN1zV0yPc9WdjRtHO7LFI1/img.png?width=2000&amp;amp;height=712&amp;amp;face=0_0_2000_712,https://scrap.kakaocdn.net/dn/Em2nO/hyWdnEhbhI/iXTwG0jiSFkIbxn8AZTWl1/img.png?width=2000&amp;amp;height=712&amp;amp;face=0_0_2000_712&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/d23d0a17ca1e4c2abc8fcfa4dee68d95?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/d23d0a17ca1e4c2abc8fcfa4dee68d95?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ew4gq/hyWdkt1HtK/vN1zV0yPc9WdjRtHO7LFI1/img.png?width=2000&amp;amp;height=712&amp;amp;face=0_0_2000_712,https://scrap.kakaocdn.net/dn/Em2nO/hyWdnEhbhI/iXTwG0jiSFkIbxn8AZTWl1/img.png?width=2000&amp;amp;height=712&amp;amp;face=0_0_2000_712');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트의 객체 타입 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>object-type</category>
      <category>readonly</category>
      <category>type-annotation</category>
      <category>typescript</category>
      <category>객체-타입</category>
      <category>타입</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/54</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EA%B0%9D%EC%B2%B4-%ED%83%80%EC%9E%85#entry54comment</comments>
      <pubDate>Thu, 13 Jun 2024 21:01:47 +0900</pubDate>
    </item>
    <item>
      <title>타입 (Type)</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85-Type</link>
      <description>&lt;h1&gt;타입스크립트의 타입 명시 방법&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(타입 명시는) 필수 사항 X&lt;/li&gt;
&lt;li&gt;프로그램의 안정성과 가독성을 높이는 중요한 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;타입 어노테이션(Type Annotation, 타입 주석)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수명 뒤에 콜론을 이용하여 JS 코드에 타입을 정의하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;타입&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본타입(원시 타입: string, number, boolean 등)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수명 뒤에 콜론을 첨부하고 타입을 명시&lt;/li&gt;
&lt;li&gt;typeof 연산자를 사용했을 때 나타나는 변환값과 동일한 이름으로 명시&lt;/li&gt;
&lt;li&gt;String, Number, Boolean과 같이 대문자로 시작하는 타입 또한 동일한 방법으로 명시&lt;/li&gt;
&lt;li&gt;위의 형태는 JS의 '특수 내장 타입'&lt;/li&gt;
&lt;li&gt;소문자 형태의 타입 사용을 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let name: string = '테드';
// 권장) 변수명: 타입명
let height: number = 177;
let isStudent: boolean = false;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Array 배열&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서가 있는 요소의 모음을 나타내는 자료구조&lt;/li&gt;
&lt;li&gt;변수명 뒤에 콜론을 사용하여 타입명을 명시, 타입명 뒤에 배열을 나타내는 []를 첨부&lt;/li&gt;
&lt;li&gt;제네릭 타입: Array&amp;lt;타입명&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let list1: string[] = ['1', '2', '3'];
let list2: Array&amp;lt;number&amp;gt; = [1, 2, 3];
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Tuple 튜플&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고정된 수의 요소 타입 &amp;amp; 순서가 있는 타입&lt;/li&gt;
&lt;li&gt;원소의 수와 각 원소의 타입이 정확히 지정된 배열의 타입을 정의&lt;/li&gt;
&lt;li&gt;명시된 개수 만큼만 원소를 지정 가능&lt;/li&gt;
&lt;li&gt;배열과의 차이점: 튜플의 경우 Array&amp;lt;&amp;gt; 제네릭 타입 지정 방식 X&lt;/li&gt;
&lt;li&gt;타입을 지정할 때: 원소의 타입을 순서대로 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;  let nameAndHeight: [string, number] = ['테드', 177];
  // nameAndHeight = [177, '테드']; // Error - 'string' 형식은 'number' 형식에 할당할 수 없습니다.
  // nameAndHeight = ['테드', 177, 1]; // Error - '[string, number, number]' 형식은 '[string, number]' 형식에 할당할 수 없습니다. 소스에 3개 요소가 있지만, 대상에서 2개만 허용합니다.
  nameAndHeight.push(1); // push는 가능
  console.log(nameAndHeight);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. void 타입&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아무런 값이 없다&lt;/li&gt;
&lt;li&gt;주로 함수에서 반환 값이 없거나 return이 있더라도 반환하는 값이 없을 때 사용되는 타입&lt;/li&gt;
&lt;li&gt;함수의 타입 정의&lt;/li&gt;
&lt;li&gt;파라미터(매개변수)와 반환값(return값) 정의가 가능: TS의 경우 파라미터의 타입을 명시하지 않으면 오류가 발생&lt;/li&gt;
&lt;li&gt;함수의 반환값 정의는 파라미터를 정의하는 ()소괄호 뒤에, 콜론을 붙여 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;function voidType(parameter: number): void {
  console.log('반환값이 없는 함수');
  // return parameter; // Error - 'number' 형식은 'void' 형식에 할당할 수 없습니다.
  return; // 해당 return문이 없어도 void 형식이 가능
}

console.log(voidType(3)); // 반환값이 없는 함수 - undefined 지정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. null &amp;amp; undefined&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JS와 달리 TS에서 null과 undefined의 경우 각각의 값만을 가짐&lt;/li&gt;
&lt;li&gt;null과 undefined에 자기 자신의 타입 그리고 void 타입 외의 타입에 할당하는 경우 에러 발생&lt;/li&gt;
&lt;li&gt;JS &amp;rarr; null과 undefined 변수에 다른 타입의 값이 할당 가능&lt;/li&gt;
&lt;li&gt;TS &amp;rarr; null 타입의 변수에는 'null' 값만!&lt;/li&gt;
&lt;li&gt;undefined 타입의 변수에는 'undefined' 값만!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;타입 어노테이션을 통해 null | undefined로 명시하는 경우에만!&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;null과 undefined의 값은 모든 타입의 하위 타입이기 때문에, 모든 타입에 할당 가능&lt;/li&gt;
&lt;li&gt;그러나, strict 모드에서 타입 검사를 실시하면 각각의 타입에만 값 할당이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;let ufType: undefined = undefined;
// ufType = 3; // Error - '3' 형식은 'undefined' 형식에 할당할 수 없습니다.
// ufType = true; // Error - 'true' 형식은 'undefined' 형식에 할당할 수 없습니다.

let nullType: null = null;
// nullType = '널 타입'; // Error - '&quot;널 타입&quot;' 형식은 'null' 형식에 할당할 수 없습니다.

let nullNumber: number = 1;
// nullNumber = null; // Error - 'null' 형식은 'number' 형식에 할당할 수 없습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. any&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 타입에 대해서 허용하는 타입&lt;/li&gt;
&lt;li&gt;타입 검사 오류가 발생하는 것을 방지&lt;/li&gt;
&lt;li&gt;모든 타입과 호환 가능 &amp;rarr; TS를 JS처럼 사용&lt;/li&gt;
&lt;li&gt;any타입의 경우 사전에 타입 오류를 계산할 수 X &amp;rarr; 예상치 못한 에러 발생 가능성이 높음 (사용 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;let anyType: any = 3;
anyType = '문자';
anyType = true;
anyType = [];
anyType = {};
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. never&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;절대 발생하지 않는 값의 타입&lt;/li&gt;
&lt;li&gt;함수가 예외를 발생시키거나 끝나지 않을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function error(message: string): never {
  throw new Error(message);
}

error('!에러발생!');
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. bigint (es2020)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큰 정수를 다루기 위한 원시 타입&lt;/li&gt;
&lt;li&gt;Bigint 함수를 사용하여 bigint 값을 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051529323&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const oneHundred: bigint = BigInt(100);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 &quot;compilerOptions&amp;rdquo; 옵션에 &quot;target&quot;: &quot;es2016&amp;rdquo;이어서, 오류가 남 사용하기 위해서는 &amp;rarr; (lib 컴파일 옵션을 'es2020' 이상으로 변경해야 함) 필요 시 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. symbol&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전역적으로 고유한 참조값을 생성하는데 사용하는 타입&lt;/li&gt;
&lt;li&gt;유일하고 변경 불가능한 값으로 생성&lt;/li&gt;
&lt;li&gt;Symbol() 함수로 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. Quiz&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 1 : 기본 타입 정의하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;username은 문자열, userAge는 숫자, isSubscribed는 불리언 값으로 타입을 정의&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let username: string = '테드';
let userAge: number = 22;
let isSubscribed: boolean = true;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 2: 배열 타입 정의하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 배열 fruits와 숫자 배열 numbers를 정의&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let fruits: string[] = ['사과', '바나나'];
let numbers: Array&amp;lt;number&amp;gt; = [1, 2, 3];
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 3: 튜플 타입 정의하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름과 나이를 요소로 하는 튜플 person을 정의&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let person: [string, number] = ['테드', 22];
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 4: void 타입을 사용하는 함수 정의하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무런 값을 반환하지 않고, 매개변수로 받은 메시지를 콘솔에 출력하는 함수 printMessage를 정의&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;정답&lt;/summary&gt;
&lt;div&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;function printMessage(message: string): void {
  console.log(message);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Type-f379c7aac7f349cdbf09a90215606a6f?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Type-f379c7aac7f349cdbf09a90215606a6f?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717051612758&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입 (Type) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Type-f379c7aac7f349cdbf09a90215606a6f?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/f379c7aac7f349cdbf09a90215606a6f&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i0bEm/hyWdsexIcs/XTXR6VTk5Gj33FJGTT5Ex0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sfhT0/hyWdowqOSR/rEvNvSgLCrk6qqkdOsDisk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Type-f379c7aac7f349cdbf09a90215606a6f?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Type-f379c7aac7f349cdbf09a90215606a6f?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i0bEm/hyWdsexIcs/XTXR6VTk5Gj33FJGTT5Ex0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sfhT0/hyWdowqOSR/rEvNvSgLCrk6qqkdOsDisk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입 (Type) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>bigint</category>
      <category>Never</category>
      <category>Tuple</category>
      <category>type-annotation</category>
      <category>typescript</category>
      <category>타입</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/53</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85-Type#entry53comment</comments>
      <pubDate>Wed, 12 Jun 2024 22:50:00 +0900</pubDate>
    </item>
    <item>
      <title>JS/TS의 코드 퀄리티 향상과 스타일 유지를 위한 도구</title>
      <link>https://ted93.tistory.com/entry/JSTS%EC%9D%98-%EC%BD%94%EB%93%9C-%ED%80%84%EB%A6%AC%ED%8B%B0-%ED%96%A5%EC%83%81%EA%B3%BC-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%9C%A0%EC%A7%80%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EA%B5%AC</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;플러그인(확장) 기능만 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;ESLint&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 정의 및 목적&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트 코드의 문제를 식별하고 보고하기 위한 도구&lt;/li&gt;
&lt;li&gt;정적 분석 도구의 한 형태로, 코드 실행 전에 코드를 검사하여 일반적인 실수, 버그, 스타일 오류, 또는 안티패턴을 찾음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 기능&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;규칙 기반 시스템: ESLint는 수많은 규칙을 제공하며, 사용자는 이 규칙들을 켜거나 끌 수 있고, 규칙의 엄격함을 조정&lt;/li&gt;
&lt;li&gt;플러그인과 확장성: ESLint는 React, Vue, TypeScript 등 다양한 프레임워크와 라이브러리를 지원하기 위해 플러그인을 사용&lt;/li&gt;
&lt;li&gt;커스터마이징: 프로젝트의 필요에 맞게 규칙을 추가하거나 수정하여 사용자 정의 규칙 생성 가능&lt;/li&gt;
&lt;li&gt;자동 수정: 일부 규칙 위반에 대해 ESLint는 자동으로 코드를 수정할 수 있는 옵션을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Prettier&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 정의 및 목적&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 포맷터로, 코드의 기능성에 영향을 주지 않으면서 일관된 스타일을 적용하여 코드를 더 읽기 쉽고 일관적으로 작동하게 하는 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 기능&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지원 언어: JavaScript, TypeScript, CSS, HTML, JSON 등 다양한 언어와 파일 형식 지원&lt;/li&gt;
&lt;li&gt;강제 스타일: Prettier는 스타일에 관한 옵션이 제한적이므로 개발자 간의 스타일 논쟁 축소 단, Prettier가 제시하는 스타일 강제 적용&lt;/li&gt;
&lt;li&gt;통합: 대부분의 코드 에디터와 IDE에 플러그인 형태로 쉽게 통합할 수 있으며, 저장 시 자동으로 포맷을 적용하도록 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. ESLint와 Prettier 함께 사용하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ESLint와 Prettier는 서로 다른 목적으로 사용되지만, 함께 사용하면 코드의 품질과 일관성을 동시에 관리 가능&lt;/li&gt;
&lt;li&gt;ESLint는 코드 품질과 문제점을 중점으로, Prettier는 코드 스타일을 일관되게 유지&lt;/li&gt;
&lt;li&gt;eslint-plugin-prettier와 eslint-config-prettier를 통해 충돌 없이 통합 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;ESLint &amp;amp; Prettier 환경 설정&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 설치된 프로젝트 기준&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717050974464&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init -y
npm install typescript --save-dev
npx tsc --init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프로젝트의 루트 디렉터리에서 필요한 패키지를 설치&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄에 작성해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051007771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save-dev eslint @typescript-eslint/parser 
@typescript-eslint/eslint-plugin prettier 
eslint-config-prettier eslint-plugin-prettier&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. ESLint 설정 파일 생성 및 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 루트 디렉터리에 .eslintrc.js 파일 생성 : 아래 내용 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051034577&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module.exports = {
  parser: '@typescript-eslint/parser',
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'prettier',
    'plugin:prettier/recommended',
  ],
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: 'module',
  },
env: {
  browser: true, // 브라우저 환경 설정
  node: true, // Node.js 환경 설정
  es2021: true, // ES2021 전역 변수 사용 가능
},
  rules: {
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/no-explicit-any': 'warn',
    'prettier/prettier': ['error', { endOfLine: 'auto' }],
  },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Prettier 설정 파일 생성 및 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 루트 디렉터리에 .prettierrc 파일 생성 : 아래 내용 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051059988&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;singleQuote&quot;: true,
  &quot;semi&quot;: true,
  &quot;useTabs&quot;: false,
  &quot;tabWidth&quot;: 2,
  &quot;trailingComma&quot;: &quot;all&quot;,
  &quot;printWidth&quot;: 200,
  &quot;endOfLine&quot;: &quot;auto&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. ESLint와 Prettier를 통합하기 위한 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1) .eslintignore 파일 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ESLint가 무시할 파일과 디렉토리를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051074080&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node_modules
dist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2) Prettier 통합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.prettierignore 파일 생성, 무시할 파일과 디렉토리를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051085495&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node_modules
dist&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. VSCode 설정 (선택 사항)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Visual Studio Code 사용 시, ESLint와 Prettier를 자동으로 실행하도록 설정&lt;/li&gt;
&lt;li&gt;VSCode의 설정 파일(.vscode/settings.json)에 다음 설정 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051105919&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;editor.formatOnSave&quot;: true,
  &quot;editor.defaultFormatter&quot;: &quot;esbenp.prettier-vscode&quot;,
  &quot;eslint.validate&quot;: [
    &quot;javascript&quot;,
    &quot;javascriptreact&quot;,
    &quot;typescript&quot;,
    &quot;typescriptreact&quot;
  ],
  &quot;editor.codeActionsOnSave&quot;: {
    &quot;source.fixAll.eslint&quot;: &quot;explicit&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. package.json에 스크립트 추가&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package.json 파일에 ESLint와 Prettier 실행 스크립트를 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051116404&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;scripts&quot;: {
    &quot;lint&quot;: &quot;eslint src/**/*.{ts,tsx}&quot;,
    &quot;format&quot;: &quot;prettier --write 'src/**/*.{ts,tsx,js,json}'&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 프로젝트 구조에 따른 실행&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src 디렉토리에 있는 TypeScript 파일을 검사하고 포맷팅하는 명령어&lt;/li&gt;
&lt;li&gt;ESLint 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051134314&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run lint&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Prettier 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717051160325&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run format&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. prettier 만 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-1) Prettier를 개발 의존성으로 설치&lt;/h3&gt;
&lt;pre class=&quot;q&quot;&gt;&lt;code&gt;npm install --save-dev prettier
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-2) Prettier 설정 파일 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 루트 디렉터리에 .prettierrc 파일을 생성하고 원하는 설정을 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-3) Prettier 무시 파일 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 루트 디렉터리에 .prettierignore 파일을 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-4) 스크립트 추가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package.json 파일에 Prettier를 실행할 수 있는 스크립트를 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;{
  &quot;scripts&quot;: {
    &quot;format&quot;: &quot;prettier --write \\&quot;src/**/*.{js,jsx,ts,tsx,json,css,scss,md}\\&quot;&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-5) prettier 실행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터미널 또는 명령 프롬프트에서 아래 명령어를 실행하여 코드를 포맷&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run format
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-6) VSCode와 연동&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VSCode 확장 프로그램 설치&lt;/li&gt;
&lt;li&gt;VSCode의 설정 파일(settings.json)에 다음 내용을 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;{
  &quot;editor.formatOnSave&quot;: true,
  &quot;editor.defaultFormatter&quot;: &quot;esbenp.prettier-vscode&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/JS-TS-a87e84f1cbf94e2b9543063d29a09412?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/JS-TS-a87e84f1cbf94e2b9543063d29a09412?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717051264722&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JS/TS의 코드 퀄리티 향상과 스타일 유지를 위한 도구 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/JS-TS-a87e84f1cbf94e2b9543063d29a09412?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/a87e84f1cbf94e2b9543063d29a09412&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AkMzK/hyWddPdWzi/rDFQKdyat6RdGykXOSbmfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/zZ7Se/hyWdd2KckY/ypdvmNRBnO75OnOhSkN1FK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/JS-TS-a87e84f1cbf94e2b9543063d29a09412?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/JS-TS-a87e84f1cbf94e2b9543063d29a09412?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AkMzK/hyWddPdWzi/rDFQKdyat6RdGykXOSbmfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/zZ7Se/hyWdd2KckY/ypdvmNRBnO75OnOhSkN1FK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JS/TS의 코드 퀄리티 향상과 스타일 유지를 위한 도구 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>.eslintignore</category>
      <category>eslint</category>
      <category>package.json</category>
      <category>Prettier</category>
      <category>도구</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/52</guid>
      <comments>https://ted93.tistory.com/entry/JSTS%EC%9D%98-%EC%BD%94%EB%93%9C-%ED%80%84%EB%A6%AC%ED%8B%B0-%ED%96%A5%EC%83%81%EA%B3%BC-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%9C%A0%EC%A7%80%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%8F%84%EA%B5%AC#entry52comment</comments>
      <pubDate>Tue, 11 Jun 2024 16:40:21 +0900</pubDate>
    </item>
    <item>
      <title>ts-node, export 키워드</title>
      <link>https://ted93.tistory.com/entry/ts-node-export-%ED%82%A4%EC%9B%8C%EB%93%9C</link>
      <description>&lt;h1&gt;typescript&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JS의 슈퍼셋 &amp;gt;&amp;gt; TS 파일을 JS 파일로 변환해야만 코드 실행 가능&lt;/li&gt;
&lt;li&gt;tsc로 TS 코드를 JS로 변환(컴파일)&lt;/li&gt;
&lt;li&gt;node로 변환시킨 JS 코드를 실행
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;TS 코드 수정 시 계속하여 JS 코드로 변환을 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;매번 tsc fileName 후 node fileName을 실행 시키는 것이 번거로움&lt;/li&gt;
&lt;li&gt;npm install -g ts-node 설치 후&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;ts-node 명령어를 통해 코드 컴파일과 실행을 동시 진행 가능
ts-node 명령어의 경우 JS 파일이 생성되지 X
ts-node fileName 으로 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;js 파일에서는 message()가 오류가 없음, 런타임환경에서 오류 발생&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;javascript.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci0Ve8/btsHCRtDK9k/OW6cZErjeUoY9zdSl87Qj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci0Ve8/btsHCRtDK9k/OW6cZErjeUoY9zdSl87Qj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci0Ve8/btsHCRtDK9k/OW6cZErjeUoY9zdSl87Qj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci0Ve8%2FbtsHCRtDK9k%2FOW6cZErjeUoY9zdSl87Qj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;javascript&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;168&quot; data-filename=&quot;javascript.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ts 파일에서는 실행전에 오류를 발생시켜서 실수를 방지해줌&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sj0Fk/btsHB8Ql4au/OPI3I0HZErKQxr9d2xkhyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sj0Fk/btsHB8Ql4au/OPI3I0HZErKQxr9d2xkhyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sj0Fk/btsHB8Ql4au/OPI3I0HZErKQxr9d2xkhyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSj0Fk%2FbtsHB8Ql4au%2FOPI3I0HZErKQxr9d2xkhyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;typescript&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;290&quot; data-filename=&quot;typescript.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;export 키워드&lt;/h1&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;// export const tmp = '';
{
  let message;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. export 키워드가 없는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;export 키워드가 없으면, c_scope.ts 파일은 여전히 모듈로 간주되지만, 명시적으로 내보내는 변수가 없으므로 message 변수가 전역 스코프와 충돌 가능성 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;export.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4qt42/btsHDGLRq9I/Z9koSgfcqeCIjW2nnKfkIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4qt42/btsHDGLRq9I/Z9koSgfcqeCIjW2nnKfkIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4qt42/btsHDGLRq9I/Z9koSgfcqeCIjW2nnKfkIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4qt42%2FbtsHDGLRq9I%2FZ9koSgfcqeCIjW2nnKfkIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;export&quot; loading=&quot;lazy&quot; width=&quot;1036&quot; height=&quot;490&quot; data-filename=&quot;export.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript 파일과 JavaScript 파일 모두 전역 스코프에 message 변수를 선언&lt;/li&gt;
&lt;li&gt;message 변수가 전역 스코프에서 중복 선언되어 충돌이 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. export가 있는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;typeScript 파일에서 export 키워드를 사용하면, 해당 파일은 모듈로 인식 tmp와 message 변수는 typescript.ts 모듈의 스코프 내에 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;export2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAHdE8/btsHDXmjCBY/xvEL176RzImGHJAKkJKtiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAHdE8/btsHDXmjCBY/xvEL176RzImGHJAKkJKtiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAHdE8/btsHDXmjCBY/xvEL176RzImGHJAKkJKtiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAHdE8%2FbtsHDXmjCBY%2FxvEL176RzImGHJAKkJKtiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;export&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;528&quot; data-filename=&quot;export2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 파일이 독립적인 스코프를 가짐&lt;/li&gt;
&lt;li&gt;message 변수가 export되지 않았기 때문에, 해당 변수는 a_typeScript.ts 파일 내에서만 유효, 다른 파일의 message 변수와 충돌하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/ts-node-export-d3173395ddaf46ef9741ff6d2a4ab77c?pvs=4&quot;&gt;https://short-echidna-b16.notion.site/ts-node-export-d3173395ddaf46ef9741ff6d2a4ab77c?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716803118803&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;ts-node, export 키워드 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/ts-node-export-d3173395ddaf46ef9741ff6d2a4ab77c?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/d3173395ddaf46ef9741ff6d2a4ab77c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQpmNk/hyV91a7TLI/mKvI97hvOcr80tTNwklMD0/img.png?width=2000&amp;amp;height=781&amp;amp;face=0_0_2000_781,https://scrap.kakaocdn.net/dn/PcSMi/hyV9SZygi4/I8UHYXXYWlbQtIv0p7tPPK/img.png?width=2000&amp;amp;height=781&amp;amp;face=0_0_2000_781&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/ts-node-export-d3173395ddaf46ef9741ff6d2a4ab77c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/ts-node-export-d3173395ddaf46ef9741ff6d2a4ab77c?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQpmNk/hyV91a7TLI/mKvI97hvOcr80tTNwklMD0/img.png?width=2000&amp;amp;height=781&amp;amp;face=0_0_2000_781,https://scrap.kakaocdn.net/dn/PcSMi/hyV9SZygi4/I8UHYXXYWlbQtIv0p7tPPK/img.png?width=2000&amp;amp;height=781&amp;amp;face=0_0_2000_781');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ts-node, export 키워드 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>export</category>
      <category>javascript</category>
      <category>module</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/39</guid>
      <comments>https://ted93.tistory.com/entry/ts-node-export-%ED%82%A4%EC%9B%8C%EB%93%9C#entry39comment</comments>
      <pubDate>Mon, 10 Jun 2024 09:11:53 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트 프로젝트 디렉토리 구조</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
      <description>&lt;h1&gt;1. src(source)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 코드를 저장&lt;/li&gt;
&lt;li&gt;모든 타입스크립트 파일(.ts)을 해당 폴더 내에 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. node_modules&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트에서 사용하는 모든 NPM 패키지를 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. package.json&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트의 메타데이터와 사용하는 npm 패키지의 목록을 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716976998507&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: 프로젝트의 이름

version: 프로젝트의 현재 버전

description: 프로젝트에 대한 간단한 설명

main: 프로젝트의 엔트리 포인트 이 파일은 프로젝트를 시작할 때 Node.js가 처음으로 실행하는 파일

scripts: 프로젝트에서 사용할 스크립트를 정의하는 곳 (EX) 테스트를 실행하거나
프로젝트를 빌드하는 등의 커맨드를 정의할 수 있음

dependencies: 프로젝트에서 사용하는 패키지의 목록과 버전 정보
이 패키지들은 프로젝트의 실행에 필요한 패키지

devDependencies: 프로젝트의 개발에만 필요한 패키지의 목록과 버전 정보
이 패키지들은 테스팅, 빌드, 문서 생성 등의 개발 작업에 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. tsconfig.json&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 컴파일러의 설정을 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716977042579&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;compilerOptions: 컴파일러 옵션을 설정하는 객체 이 객체에는 여러 하위 옵션이 있음

target: 컴파일된 코드가 실행될 ECMAScript 버전을 지정 (EX) &quot;ES5&quot;, &quot;ES2015&quot; 등을 지정할 수 있음

module: 사용할 모듈 시스템을 지정 (EX) &quot;CommonJS&quot;, &quot;ES2015&quot;, &quot;AMD&quot; 등을 지정할 수 있음

outDir: 컴파일된 자바스크립트 파일이 위치할 디렉토리를 지정

strict: 모든 엄격한 타입-체킹 옵션을 활성화

esModuleInterop: ES 모듈과의 상호 운용성을 활성화

include: 컴파일에 포함될 파일 또는 디렉토리의 리스트

exclude: 컴파일에서 제외될 파일 또는 디렉토리의 리스트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. dist&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일된 자바스크립트 파일(.js)를 저장&lt;/li&gt;
&lt;li&gt;타입스크립트 컴파일러를 실행하면 src 폴더의 ts파일들이 해당 폴더로 컴파일되어 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. .gitignore&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git에 업로드 시키지 않을 내용을 관리하는 파일&lt;/li&gt;
&lt;li&gt;일반적으로 JS/TS/React 프로젝트 업로드 시, node_modules 폴더는 gitignore로 명시하는 것을 권장&lt;/li&gt;
&lt;li&gt;package.json에 명시된 내용을 npm install 명령어를 사용하는 경우 해당 프로젝트에 설치(node_modules를 포함)&lt;/li&gt;
&lt;li&gt;.gitignore 파일에 아래의 명령어 첨부하면 해당 폴더가 무시 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716977064101&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node_modules/
*/node_modules&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/582f6aeca8cf43b38f25e6e000a920ba?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/582f6aeca8cf43b38f25e6e000a920ba?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716977127468&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입스크립트 프로젝트 디렉토리 구조 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/582f6aeca8cf43b38f25e6e000a920ba?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/582f6aeca8cf43b38f25e6e000a920ba&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rLXts/hyWdhX6bpY/5dDu6AuQKt4sp53YT69010/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/blOEuK/hyWdkUPtg2/1Wp1EVJ1TnhjIwxgXLlD3k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/582f6aeca8cf43b38f25e6e000a920ba?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/582f6aeca8cf43b38f25e6e000a920ba?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rLXts/hyWdhX6bpY/5dDu6AuQKt4sp53YT69010/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/blOEuK/hyWdkUPtg2/1Wp1EVJ1TnhjIwxgXLlD3k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트 프로젝트 디렉토리 구조 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>.gitignore</category>
      <category>dist</category>
      <category>node_modules</category>
      <category>package.json</category>
      <category>tsconfig.json</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/46</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0#entry46comment</comments>
      <pubDate>Sun, 9 Jun 2024 20:04:51 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트 환경설정</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95</link>
      <description>&lt;h1&gt;1. Node.js 설치 전 삭제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript의 '런타임(JS의 프로그램들을 실행할 수 있는 환경)' 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TS는 JS의 슈퍼셋이기 때문에 'Node.js'환경에서 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;where node &amp;gt; 설치된 경로를 알려줌&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;윈도우(Windows)&lt;/summary&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 윈도우 키 &amp;gt; 프로그램 추가/제거 &amp;gt; Node.js 검색 후 삭제&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 아래 경로에 해당하는 디렉터리 삭제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윈도우 키 + r (실행 창)&lt;/li&gt;
&lt;li&gt;윈도우 키 &amp;gt; 파일 탐색기 C:\Program Files\Nodejs C:\Program Files (x86)\Nodejs&lt;/li&gt;
&lt;li&gt;C:\사용자\User\AppData\Roaming\npm C:\Users\User\AppData\Roaming\npm&lt;/li&gt;
&lt;li&gt;C:\사용자\ITPS\AppData\Roaming\npm C:\Users\ITPS\AppData\Roaming\npm&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 삭제 됬는지 확인 - cmd 입력(명령 프롬프트 실행)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node -v npm -v&lt;/li&gt;
&lt;li&gt;(내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. - 삭제 완료)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details&gt;
&lt;summary&gt;맥(MacOS)&lt;/summary&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Homebrew를 사용하여 Node 제거하는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용 프로그램 &amp;gt; 유틸리티 폴더 &amp;gt; 터미널 실행 brew uninstall --force node&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 터미널 실행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node -v npm -v&lt;/li&gt;
&lt;li&gt;(내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. - 삭제 완료)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1&gt;2. Node.js 설치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript의 '런타임(JS의 프로그램들을 실행할 수 있는 환경)' 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TS는 JS의 슈퍼셋이기 때문에 'Node.js'환경에서 동작 :공식 웹 사이트(구글 &amp;gt; node.js 검색)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nodejs.org/en&quot;&gt;https://nodejs.org/en&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTS(Long Term Support) 버전 설치를 권장(안정적) : 파일 탐색기 &amp;gt; 다운로드 &amp;gt; 다운로드 된 node.js 실행&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 완료 여부 확인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윈도우 키 + r &amp;gt; cmd(명령 프롬프트 창)&lt;br /&gt;node -v / npm -v&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm.png&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq4fZA/btsHFvYse3j/knARi7QmrsPXkThYjqVXu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq4fZA/btsHFvYse3j/knARi7QmrsPXkThYjqVXu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq4fZA/btsHFvYse3j/knARi7QmrsPXkThYjqVXu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq4fZA%2FbtsHFvYse3j%2FknARi7QmrsPXkThYjqVXu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;96&quot; data-filename=&quot;npm.png&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Windows에서 npm 실행이 되지 않을 경우&lt;/summary&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Node.js 시 npm이 자동 설치)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윈도우 키 &amp;gt; 시스템 환경 변수 편집&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;path.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTiyB4/btsHGyGJc3Y/etXVh1u6arLu2B3zT4wRNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTiyB4/btsHGyGJc3Y/etXVh1u6arLu2B3zT4wRNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTiyB4/btsHGyGJc3Y/etXVh1u6arLu2B3zT4wRNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTiyB4%2FbtsHGyGJc3Y%2FetXVh1u6arLu2B3zT4wRNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;path&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;68&quot; data-filename=&quot;path.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 속성 &amp;gt; 고급 &amp;gt; 우측 하단의 환경 변수 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;environment-variable.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzwF4N/btsHEYfAfLL/ogqP4BN2iDKKDGTJEdbuA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzwF4N/btsHEYfAfLL/ogqP4BN2iDKKDGTJEdbuA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzwF4N/btsHEYfAfLL/ogqP4BN2iDKKDGTJEdbuA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzwF4N%2FbtsHEYfAfLL%2FogqP4BN2iDKKDGTJEdbuA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;environment-variable&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;523&quot; data-filename=&quot;environment-variable.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(아래)사용자 변수에서 변수 Path 더블 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;path2.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swV2v/btsHEZySFTR/gLkJDr7EGkLkbshWyaCJK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swV2v/btsHEZySFTR/gLkJDr7EGkLkbshWyaCJK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swV2v/btsHEZySFTR/gLkJDr7EGkLkbshWyaCJK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FswV2v%2FbtsHEZySFTR%2FgLkJDr7EGkLkbshWyaCJK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;path&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;205&quot; data-filename=&quot;path2.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'사용자 이름'에 대한 사용자 변수 설정&lt;/li&gt;
&lt;li&gt;파일 탐색기 &amp;gt; c드라이브 &amp;gt; 사용자(Users) &amp;gt; 자신의 컴퓨터 이름(ITPS) &amp;gt; AppData &amp;gt; Roaming &amp;gt; npm 경로를 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AppData.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ol9BZ/btsHFLtgLnd/3688ECzDwbcs4oc0SYhDk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ol9BZ/btsHFLtgLnd/3688ECzDwbcs4oc0SYhDk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ol9BZ/btsHFLtgLnd/3688ECzDwbcs4oc0SYhDk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOl9BZ%2FbtsHFLtgLnd%2F3688ECzDwbcs4oc0SYhDk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;AppData&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;88&quot; data-filename=&quot;AppData.png&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(npm 폴더가 존재하지 않을 경우 생성 후 경로 복사) : C:\Users\ITPS\AppData\Roaming\npm&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm2.png&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfdh59/btsHFJI0bBz/PiHZh0BNPuzkGvbVRkJAk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfdh59/btsHFJI0bBz/PiHZh0BNPuzkGvbVRkJAk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfdh59/btsHFJI0bBz/PiHZh0BNPuzkGvbVRkJAk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfdh59%2FbtsHFJI0bBz%2FPiHZh0BNPuzkGvbVRkJAk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;npm&quot; loading=&quot;lazy&quot; width=&quot;279&quot; height=&quot;186&quot; data-filename=&quot;npm2.png&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(아래)시스템 변수 Path 설정 파일 탐색기 &amp;gt; c드라이브 &amp;gt; Program Files &amp;gt; nodejs 경로를 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nodejs.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBFeQF/btsHFpxePLj/ejpr93Zwht4qnWDN859Ta0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBFeQF/btsHFpxePLj/ejpr93Zwht4qnWDN859Ta0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBFeQF/btsHFpxePLj/ejpr93Zwht4qnWDN859Ta0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBFeQF%2FbtsHFpxePLj%2Fejpr93Zwht4qnWDN859Ta0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;nodejs&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;155&quot; data-filename=&quot;nodejs.png&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사한 경로를 Path 변수란에 새로 만들기 클릭 &amp;gt; 경로 삽입 (삽입 시 마지막에 \\(원화)기호 첨부) C:\\Program Files\\nodejs\\&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nodejs2.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/307tS/btsHGBXFoFi/FsuOVZxZ0iCMOMp1cjKC0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/307tS/btsHGBXFoFi/FsuOVZxZ0iCMOMp1cjKC0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/307tS/btsHGBXFoFi/FsuOVZxZ0iCMOMp1cjKC0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F307tS%2FbtsHGBXFoFi%2FFsuOVZxZ0iCMOMp1cjKC0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;nodejs&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;247&quot; data-filename=&quot;nodejs2.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경 변수 편집 후에는 컴퓨터 자체 '다시 시작'을 권장 &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;npm3.png&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0pgpa/btsHGk2UmWW/YTYTIMsWpLaqITMQSrqnN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0pgpa/btsHGk2UmWW/YTYTIMsWpLaqITMQSrqnN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0pgpa/btsHGk2UmWW/YTYTIMsWpLaqITMQSrqnN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0pgpa%2FbtsHGk2UmWW%2FYTYTIMsWpLaqITMQSrqnN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;nodejs&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;96&quot; data-filename=&quot;npm3.png&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에 명령어가 잘 나오면 설정 완료(Node.js 시 npm이 자동 설치)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1&gt;3. npm이란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NPM(Node Package Manager)은 Node.js의 기본 패키지 관리 도구&lt;br /&gt;NPM을 이용하면 자바스크립트의 라이브러리를 쉽게 설치하고&lt;br /&gt;관리 프로젝트의 의존성을 관리, 작은 스트립트 실행 등의 기능을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 설치 시 NPM은 자동 설치&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;npm 설치 확인 명령어: npm -v&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm 기본 명령어&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1) npm init&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 Node.js 프로젝트를 시작, 기본값으로 package.json 파일을 생성&lt;/li&gt;
&lt;li&gt;-y 옵션 추가 (npm init -y) 질문 없이 기본값으로 package.json 파일을 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716894924212&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package name: 프로젝트의 이름을 입력/ 기본값은 현재 디렉터리의 이름

version: 패키지의 시작 버전을 입력/ 기본값은 1.0.0

description: 프로젝트의 간단한 설명을 입력

entry point: 프로젝트의 메인 파일을 지정/ 기본값은 index.js

test command: 테스트를 실행할 때 사용할 명령어를 입력

git repository: 프로젝트의 Git 저장소 URL을 입력

keywords: 프로젝트를 설명하는 키워드를 쉼표로 구분하여 입력

author: 패키지의 저자 정보를 입력

license: 사용할 라이센스를 입력/ 기본값은 ISC&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2) npm install&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package.json 파일에 명시된 모든 의존성을 설치: 특정 패키지 설치 방법&lt;/li&gt;
&lt;li&gt;npm install 패키지명&lt;/li&gt;
&lt;li&gt;-D | --save-dev 옵션 추가 &amp;rarr; 개발 의존성으로 패키지를 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3) npm uninstall&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패키지를 제거&lt;/li&gt;
&lt;li&gt;특정 패키지 제거 방법 &amp;rarr; npm uninstall 패키지명&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 타입스크립트 설치 (npm 사용, -g 옵션을 사용)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트를 사용하기 위해 전역 또는 로컬 환경에 타입스크립트를 설치&lt;/li&gt;
&lt;li&gt;전역 설치(global한 설치 / -g 옵션 추가) &amp;rarr; 개발자의 컴퓨터 전체에 기능 추가&lt;/li&gt;
&lt;li&gt;프로젝트 별 설치(개발 의존성) &amp;rarr; 개발자가 현재 사용하고 있는 프로젝트 내에 기능 추가&lt;/li&gt;
&lt;li&gt;git bash를 사용 (vscode 내에서 터미널 열기: ctrl + shift + `) -&amp;gt; D_TypeScript 폴더로 이동&lt;/li&gt;
&lt;li&gt;git bash 환경에서 하위 폴더 이동
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;cd 폴더 경로&lt;/li&gt;
&lt;li&gt;cd D_TypeScript&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;npm install -g typescript (어느 경로에서든지 설치 가능)
npm install --save-dev typescript
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 설치 확인 명령어 &amp;rarr; tsc -v (Version 5.4.2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. tsc란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tsc(TypeScript Compiler)&lt;/li&gt;
&lt;li&gt;타입스크립트(.ts) 파일을 자바스크립트(.js) 파일로 변환하는 도구&lt;/li&gt;
&lt;li&gt;브라우저와 Node.js가 타입스크립트를 직접 실행할 수 없기 때문에 tsc로 코드 변환이 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;tsc 컴파일 명령어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tsc 파일명.ts&lt;/li&gt;
&lt;li&gt;위 명령어를 실행하면 같은 이름의 .js 파일이 생성&lt;/li&gt;
&lt;li&gt;해당 .js파일은 원래 타입스크립트 코드에서 타입 정보가 제거된 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;tsc의 옵션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 tsconfig.json 파일에 정의&lt;/li&gt;
&lt;li&gt;tsc가 해당 파일을 참조하여 컴파일을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716897513771&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;target : 컴파일된 js 버전을 지정

module : 사용할 모듈 시스템을 지정

strict : 모든 엄격한 타입체크 옵션을 활성화

outDir : 컴파일된 파일이 위치할 디렉토리를 지정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. 타입스크립트 패키지 설치&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;npm을 사용하여 타입스크립트 패키지 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 디렉토리 생성&lt;/li&gt;
&lt;li&gt;프로젝트의 모든 파일과 폴더를 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1) 원하는 위치에서 터미널 오픈&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mkdir 프로젝트명 : make directory - 프로젝트 디렉토리 생성&lt;/li&gt;
&lt;li&gt;cd 프로젝트명 : 생성한 디렉토리로 이동&lt;/li&gt;
&lt;li&gt;cd&amp;nbsp;명령어&amp;nbsp;:&amp;nbsp;사용자가&amp;nbsp;현재&amp;nbsp;위치하는&amp;nbsp;디렉토리(폴더)를&amp;nbsp;변경할&amp;nbsp;때&amp;nbsp;사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716897600260&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;특정 디렉토리로 이동
cd 전체_디렉토리_경로

홈 디렉토리로 이동
cd | cd ~

상위 디렉토리로 이동
cd ..

이전 디렉토리로 이동
cd -

C:\\프론트엔드-테드\\frontend
mkdir D_TypeScript
cd D_TypeScript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2) npm 초기화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 Node.js 프로젝트 시작, npm init -y 명령어를 통해 기본값으로 package.json 파일을 생성&lt;/li&gt;
&lt;li&gt;package.json 파일
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Node.js 프로젝트의 메타데이터를 담고 있는 파일&lt;/li&gt;
&lt;li&gt;프로젝트의 이름, 버전, 설명, 저자, 라이선스 등의 정보를 저장&lt;/li&gt;
&lt;li&gt;프로젝트에서 사용하는 패키지 목록과 버전 정보를 관리&lt;/li&gt;
&lt;li&gt;프로젝트의 시작점을 지정 | 스크립트의 정의 등에 대한 기능을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;해당 프로젝트를 새롭게 재설치하려는 경우 해당 디렉토리의 package.json을 삭제하고 다시 npm init -y 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3) npm을 이용하여 '타입스크립트 패키지' 설치&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 설치(프로젝트 내)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm install typescript --save-dev&lt;/li&gt;
&lt;li&gt;프로젝트 디렉토리 내에서 타입스크립트를 설치&lt;/li&gt;
&lt;li&gt;해당 명령은 타입스크립트 프로젝트의 개발 의존성으로 추가&lt;/li&gt;
&lt;li&gt;(devDependecies에 추가) : 배포 시에는 포함되지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) devDependecies: 개발 과정에서만 필요한 패키지들의 목록(-D)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) dependencies: 프로젝트 실행에 필요한 패키지들의 목록(-S)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 설치(컴퓨터 내)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm install -g typescript&lt;/li&gt;
&lt;li&gt;시스템 전체에서 타입스크립트를 사용&lt;/li&gt;
&lt;li&gt;컴퓨터의 어느 위치에서든 타입스크립트 컴파일러(tsc)를 사용 가능 (설치되어 있는 경우 업데이트로 설치)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-4) tsconfig.json 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입스크립트 프로젝트의 설정을 저장하는 파일&lt;/li&gt;
&lt;li&gt;타입스크립트 컴파일러가 프로젝트를 컴파일하는 방법을 지정&lt;/li&gt;
&lt;li&gt;예) 출력 디렉토리 위치, 사용할 모듈 시스템, 지원하는 ESMAScript 버전 등을 관리&lt;/li&gt;
&lt;li&gt;npx tsc --init&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-5) tsconfig.json 기본 구성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 컴파일러 옵션은 주석을 해제하여 사용 가능&lt;/li&gt;
&lt;li&gt;(프로젝트의 특성 | 각 회사의 규정에 따라 적용 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716897662727&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;compilerOptions : 컴파일러에 대한 다양한 설정을 포함

target : 컴파일된 JavaScript의 ECMAScript 버전을 지정(ES5, ES6)

module : 모듈 시스템을 지정

strict : 모든 엄격한 타입 체킹 옵션을 활성화(true/ 비활성화 - false)

outDir : 컴파일된 파일이 위치할 디렉토리를 지정

esModuleIntrop : CommonJS 모듈을 ES6 모듈처럼 가져오기를 허용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/69f6179d15fd41abb470210f10b632be?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/69f6179d15fd41abb470210f10b632be?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716897786481&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입스크립트 환경설정 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/69f6179d15fd41abb470210f10b632be?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/69f6179d15fd41abb470210f10b632be&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blg3Od/hyWdkAnjEr/KaW8h8ns2B2kxw8ykkZSn1/img.png?width=2000&amp;amp;height=1073&amp;amp;face=0_0_2000_1073&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/69f6179d15fd41abb470210f10b632be?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/69f6179d15fd41abb470210f10b632be?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blg3Od/hyWdkAnjEr/KaW8h8ns2B2kxw8ykkZSn1/img.png?width=2000&amp;amp;height=1073&amp;amp;face=0_0_2000_1073');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트 환경설정 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>init</category>
      <category>node</category>
      <category>node.js</category>
      <category>NPM</category>
      <category>tsc</category>
      <category>tsconfig.json</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/41</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95#entry41comment</comments>
      <pubDate>Sat, 8 Jun 2024 14:50:34 +0900</pubDate>
    </item>
    <item>
      <title>타입스크립트 정의</title>
      <link>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%95%EC%9D%98</link>
      <description>&lt;h1&gt;1. 타입스크립트란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트(JavaScript)를 기반으로 하는 오픈 소스 프로그래밍 언어 (Microsoft에서 개발과 유지를 담당)&lt;/li&gt;
&lt;li&gt;JS의 상위 집합인 언어(확장, superset)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;JS의 모든 기능을 포함&lt;/li&gt;
&lt;li&gt;정적 타입 기능을 추가하여 JS의 단점을 보완한 언어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타입스크립트가 자바스크립트의 모든 기능을 포함하고 있으며, 그 위에 추가적인 기능을 더하고 있다는 것을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. 타입스크립트의 필요성(도입 배경)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에러의 사전 방지&lt;/li&gt;
&lt;li&gt;자바스크립트는 동적 타입 언어, 변수의 타입이 실행 시점에 결정(런타임)&lt;/li&gt;
&lt;li&gt;'컴파일' 시점에서 오류를 발생하여 에러 실행을 방지&lt;/li&gt;
&lt;li&gt;코드 가이드 및 자동 완성(개발 생산성 향상)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. 동적 타입(JS) VS 정적 타입(TS)&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동적 타입(JS)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 시점 타입 결정&lt;/li&gt;
&lt;li&gt;변수의 타입이 코드가 실행될 때 결정, 유연한 타입 변환을 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정적 타입(TS)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 시점 타입 결정&lt;/li&gt;
&lt;li&gt;코드 작성 단계에서 변수의 타입을 명시해야 함, 타입 오류가 있을 경우 컴파일 과정에서 발견&lt;/li&gt;
&lt;li&gt;오류 발생을 사전에 방지, 개발 도구에서의 자동 완성을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;4. 타입스크립트 장단점&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 타입 체킹&lt;/li&gt;
&lt;li&gt;개발 도구의 효율성&lt;/li&gt;
&lt;li&gt;객체 지향 프로그래밍 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습 곡선 존재&lt;/li&gt;
&lt;li&gt;개발 시간이 증가&lt;/li&gt;
&lt;li&gt;라이브러리의 타입 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/6b551c4c9de54f89adffad0abafafe4c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/6b551c4c9de54f89adffad0abafafe4c?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716889689562&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;타입스크립트 정의 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/6b551c4c9de54f89adffad0abafafe4c?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/6b551c4c9de54f89adffad0abafafe4c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dIfJy1/hyWdnjwbm3/Mat97lakMurwKKkDieUHV0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/EpEAG/hyV9ZEAOHv/XoLX3O5qSrsW4HvcWuTP20/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/6b551c4c9de54f89adffad0abafafe4c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/6b551c4c9de54f89adffad0abafafe4c?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dIfJy1/hyWdnjwbm3/Mat97lakMurwKKkDieUHV0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/EpEAG/hyV9ZEAOHv/XoLX3O5qSrsW4HvcWuTP20/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트 정의 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <category>typescript</category>
      <category>타입스크립트</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/40</guid>
      <comments>https://ted93.tistory.com/entry/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%95%EC%9D%98#entry40comment</comments>
      <pubDate>Fri, 7 Jun 2024 09:22:43 +0900</pubDate>
    </item>
    <item>
      <title>정규표현식 - RegExp</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-RegExp</link>
      <description>&lt;pre id=&quot;code_1717050476868&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JavaScript에서의 정규표현식은 RegExp 객체를 통해 다양한 방식으로 활용 가능
RegExp 생성자와 주요 메서드들(test(), exec(), match(), search(), replace(), split())의 사용
이를 통해 문자열 검색, 검증, 수정 및 분할 작업을 효과적으로 수행 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;1. RegExp 생성자&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RegExp 객체는 두 가지 방법으로 생성 가능&lt;/li&gt;
&lt;li&gt;리터럴 방식과 생성자 함수를 이용하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 리터럴 방식&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;const regex = /pattern/flags;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 생성자 함수&lt;/h3&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;const regex = new RegExp(&quot;pattern&quot;, &quot;flags&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) pattern: 정규표현식의 패턴 부분&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) flags: 검색 옵션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;g : 전역 검색&lt;/li&gt;
&lt;li&gt;i : 대소문자 구분 없이 검색&lt;/li&gt;
&lt;li&gt;m : 여러 줄 검색&lt;/li&gt;
&lt;li&gt;u : 유니코드; 패턴을 유니코드 코드 포인트의 시퀀스로 취급&lt;/li&gt;
&lt;li&gt;s : dotAll 모드; . 특수 문자가 줄바꿈 문자도 매치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. RegExp 메서드&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) test()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열이 정규표현식과 매치되는지 여부를 확인&lt;/li&gt;
&lt;li&gt;반환값: true 또는 false&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const regex = /hello/i;
console.log(regex.test('Hello World')); // true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) exec()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규표현식과 매치되는 정보를 찾아 배열로 반환&lt;/li&gt;
&lt;li&gt;반환값: 매치된 정보의 배열 또는 null&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;const regex2 = /a(b)c/;
const result2 = regex2.exec('abc');
console.log(result2); // [ 'abc', 'b', index: 0, input: 'abc', groups: undefined ]
console.log(result2.index); // 0
console.log(result2.input); // abc
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. String 메서드&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) match()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열에서 정규표현식과 매치되는 부분을 찾기&lt;/li&gt;
&lt;li&gt;반환값: 매치된 결과의 배열 또는 null&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const text3 = 'Hello World';
const matches3 = text3.match(/hello/i);
console.log(matches3); // [ 'Hello', index: 0, input: 'Hello World', groups: undefined ]
console.log(matches3[0]); // Hello
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) search()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열에서 정규표현식과 매치되는 부분의 인덱스를 반환&lt;/li&gt;
&lt;li&gt;반환값: 인덱스(찾지 못하면 -1)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;// const text3 = 'Hello World'; // 위에 있던 코드
console.log(text3.search(/world/i)); // 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) replace()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규표현식과 매치되는 부분을 다른 문자열로 대체&lt;/li&gt;
&lt;li&gt;반환값: 새로운 문자열&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;// const text3 = 'Hello World'; // 위에 있던 코드
console.log(text3.replace(/world/i, 'JavaScript')); // Hello JavaScript
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) split()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규표현식을 구분자로 사용하여 문자열을 배열로 분할&lt;/li&gt;
&lt;li&gt;반환값: 분할된 문자열의 배열&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;const text4 = 'apple,     banana, cherry';
const result4 = text4.split(/,\\s*/);
console.log(result4); // [ 'apple', 'banana', 'cherry' ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/RegExp-31d4099072dc43eca30d77682697e14c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/RegExp-31d4099072dc43eca30d77682697e14c?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717050580482&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;정규표현식 - RegExp | Notion&quot; data-og-description=&quot;JavaScript에서의 정규표현식은 RegExp 객체를 통해 다양한 방식으로 활용 가능&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/RegExp-31d4099072dc43eca30d77682697e14c?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/31d4099072dc43eca30d77682697e14c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLhwef/hyWdeHl841/7mXjkTSTn1tlF85VeH8ytk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bMDvFH/hyWdhRAq5f/ylJjFFcSKtkJtSBJiMg1n0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/RegExp-31d4099072dc43eca30d77682697e14c?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/RegExp-31d4099072dc43eca30d77682697e14c?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLhwef/hyWdeHl841/7mXjkTSTn1tlF85VeH8ytk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bMDvFH/hyWdhRAq5f/ylJjFFcSKtkJtSBJiMg1n0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;정규표현식 - RegExp | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript에서의 정규표현식은 RegExp 객체를 통해 다양한 방식으로 활용 가능&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>exec</category>
      <category>flags</category>
      <category>javascript</category>
      <category>MATCH</category>
      <category>Pattern</category>
      <category>regex</category>
      <category>regular-expression</category>
      <category>test</category>
      <category>자바스크립트</category>
      <category>정규표현식</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/51</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-RegExp#entry51comment</comments>
      <pubDate>Thu, 6 Jun 2024 16:28:47 +0900</pubDate>
    </item>
    <item>
      <title>정규표현식 - 비밀번호 복잡성 검증 예제</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EB%B3%B5%EC%9E%A1%EC%84%B1-%EA%B2%80%EC%A6%9D-%EC%98%88%EC%A0%9C</link>
      <description>&lt;h1&gt;1. 비밀번호 복잡성 검증&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비밀번호 정책을 강화하기 위해, 대문자, 소문자, 숫자, 특수 문자가 각각 최소 하나씩 포함되어야 하며, 전체 길이가 8자 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규표현식 : /^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[^\da-zA-Z]).{8,}$/&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function validatePassword(password) {
  const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).{8,}$/;
  console.log(regex.test(password));
}
validatePassword('Password123!'); // true
validatePassword('password123!'); // false
validatePassword('Password123'); // false
validatePassword('Password!'); // false
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;^(?=.[a-z])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떠한 문자든지 여러개 작성&lt;/li&gt;
&lt;li&gt;반드시 최소 한개의 소문자를 포함해서 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(?=.*[A-Z])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 동일하지만 최소 한 개의 대문자를 포함하여 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(?=.*\d)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 동일하지만 최소 한 개의 숫자를 포함하여 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(?=.*[^\da-zA-Z])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자, 영문자(대, 소문자)를 제외한 문자 중(즉, 특수기호를 의미) 한 개를 반드시 포함&lt;/li&gt;
&lt;li&gt;최소 한 개 이상의 특수기호를 포함하여 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.{8,}$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 길이가 최소 8자 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 비밀번호 복잡성 검증&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비밀번호 6-10자 이내 대문자, 소문자, 숫자가 각각 최소 하나씩 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규표현식 : /^(?=.[a-z])(?=.[A-Z])(?=.*\d).{6,10}$/&lt;/h3&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;function validatePassword2(password) {
  const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,10}$/;
  console.log(regex.test(password));
}
validatePassword2('Pass12'); // true
validatePassword2('P1assWd2'); // true
validatePassword2('Pass1'); // false - 길이 부족
validatePassword2('Pass1231234'); // false - 길이 초과
validatePassword2('pass1231234'); // false - 길이 초과 &amp;amp; 대문자 사용 X
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(?=.[a-z])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 내에 최소 한 개의 소문자가 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(?=.[A-Z])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 내에 최소 한 개의 대문자가 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(?=.*\d)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 내에 최소 한 개의 숫자가 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.{6,10}&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 길이가 최소 6자리에서 최대 10자리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/d001a63d66564a2191bce9793ebab711?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/d001a63d66564a2191bce9793ebab711?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717049890117&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;정규표현식 - 비밀번호 복잡성 검증 예제 | Notion&quot; data-og-description=&quot;1. 비밀번호 복잡성 검증&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/d001a63d66564a2191bce9793ebab711?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/d001a63d66564a2191bce9793ebab711&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSug6x/hyWdmk463t/ybQYcL9pkNdrJmKjNFpSZk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/kKJk7/hyWdg6c5ol/ddfVk9Y5zAkbjmaLeAEniK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/d001a63d66564a2191bce9793ebab711?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/d001a63d66564a2191bce9793ebab711?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSug6x/hyWdmk463t/ybQYcL9pkNdrJmKjNFpSZk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/kKJk7/hyWdg6c5ol/ddfVk9Y5zAkbjmaLeAEniK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;정규표현식 - 비밀번호 복잡성 검증 예제 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 비밀번호 복잡성 검증&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>javascript</category>
      <category>lookahead</category>
      <category>MATCH</category>
      <category>regex</category>
      <category>regular-expression</category>
      <category>test</category>
      <category>자바스크립트</category>
      <category>정규표현식</category>
      <category>캡처</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/50</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EB%B3%B5%EC%9E%A1%EC%84%B1-%EA%B2%80%EC%A6%9D-%EC%98%88%EC%A0%9C#entry50comment</comments>
      <pubDate>Wed, 5 Jun 2024 22:18:20 +0900</pubDate>
    </item>
    <item>
      <title>정규표현식 고급 패턴 매칭</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4-%EB%A7%A4%EC%B9%AD</link>
      <description>&lt;h1&gt;1. 패턴 매칭&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) 캡처 그룹 (abc)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캡처 그룹은 괄호로 묶인 부분 패턴을 매치, 해당 결과를 저장하여 나중에 참조 할 수 있도록 함&lt;/li&gt;
&lt;li&gt;매칭된 데이터를 추출하거나 후방 참조와 함께 사용될 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제: 이름 분리하기&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const myName = 'Ted Blue';
const regexName = /(\\w+) (\\w+)/;
const matchName = myName.match(regexName);
console.log(matchName);
console.log(matchName[1]);
console.log(matchName[2]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;match.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dp1h2k/btsHHiyhYG8/UutokIKbXPIgiz8glqNUf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dp1h2k/btsHHiyhYG8/UutokIKbXPIgiz8glqNUf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dp1h2k/btsHHiyhYG8/UutokIKbXPIgiz8glqNUf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdp1h2k%2FbtsHHiyhYG8%2FUutokIKbXPIgiz8glqNUf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;match&quot; loading=&quot;lazy&quot; width=&quot;232&quot; height=&quot;226&quot; data-filename=&quot;match.png&quot; data-origin-width=&quot;232&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) 비캡처 그룹 (?:abc)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비캡처 그룹은 괄호로 묶인 부분 패턴을 매치&lt;/li&gt;
&lt;li&gt;매치 결과를 저장하지 않아 후방 참조에 사용 불가&lt;/li&gt;
&lt;li&gt;그룹화는 필요하지만, 데이터 저장은 필요 없을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제: 선택적 표현 매칭&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http:// 또는 https:// 선택적으로 매치하지만 저장하지 않는 경우&lt;/p&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;const url = '&amp;lt;https://www.example.com&amp;gt;';
const regexUrl = /(?:https?:\\/\\/)?(www\\.\\w+\\.\\w+)/;
const matchUrl = url.match(regexUrl); // 일치할 경우 해당 표현식의 배열 형태로 값 반환
console.log(matchUrl);
console.log(matchUrl[1]); // www.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;match2.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8pXPt/btsHIOpbgyN/wgikO4vLI3OKeBYECYwHHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8pXPt/btsHIOpbgyN/wgikO4vLI3OKeBYECYwHHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8pXPt/btsHIOpbgyN/wgikO4vLI3OKeBYECYwHHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8pXPt%2FbtsHIOpbgyN%2FwgikO4vLI3OKeBYECYwHHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;match&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;179&quot; data-filename=&quot;match2.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;match로 반환되는 배열 값
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0번째 인덱스 - 정규식과 일치하는 전체 문자열이 저장&lt;/li&gt;
&lt;li&gt;1번째 인덱스부터 캡쳐 그룹과 일치하는 문자열이 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 긍정 및 부정의 전방탐색(lookahead)&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패턴의 일부를 확인하지만 그 부분을 결과에 포함하지 X&lt;/li&gt;
&lt;li&gt;전방탐색을 활용하면 특정 조건을 만족하는 위치에서만 매칭을 수행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) 긍정 전방탐색 (?=...)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;긍정 전방탐색은 특정 패턴 뒤에 지정한 패턴이 존재해야 매치되는 구조&lt;/li&gt;
&lt;li&gt;특정 문자 뒤에 원하는 문자가 오는 경우에만 매치를 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제: 비밀번호 유효성 검사&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호에서 최소 하나의 숫자를 포함하는 경우를 검사하는 예&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const password = 'Password123';
const regexPassword = /(?=.*\\d).*/;
// .: 모든 문자열(줄바꿈을 제외한) - 숫자, 한글, 영어, 특수기호, 공백
// * : 0개 이상
// 즉 위에 정규식은 =&amp;gt; 어느 위치든 비밀번호에 숫자가 하나 이상 포함
const isValid = regexPassword.test(password);
console.log(isValid); // true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) 부정 전방탐색 (?!...)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부정 전방탐색은 특정 패턴 뒤에 지정한 패턴이 존재하지 않아야 매치되는 구조&lt;/li&gt;
&lt;li&gt;특정 문자 뒤에 원하지 않는 문자가 오지 않는 경우에만 매치를 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제: 금지된 단어 제외&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 내에서 특정 금지된 단어를 제외한 다른 단어와 매치하는 예&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;const text = 'apple pie';
const regexNoText = /\\b(?!apple\\b)\\w+/;
// const regexNoText = /\\b(?!apple\\b)\\w+/g; // ['pie']
const matches = text.match(regexNoText);
console.log(matches);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;match3.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhiCSS/btsHHkQrtXX/eXG5kdMrd2iAROKPU1e4I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhiCSS/btsHHkQrtXX/eXG5kdMrd2iAROKPU1e4I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhiCSS/btsHHkQrtXX/eXG5kdMrd2iAROKPU1e4I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhiCSS%2FbtsHHkQrtXX%2FeXG5kdMrd2iAROKPU1e4I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;match&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;48&quot; data-filename=&quot;match3.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;+) 정규 표현식을 나타내는 // 기호 뒤의 g는 검색 옵션&lt;/li&gt;
&lt;li&gt;global 전역 검색&lt;/li&gt;
&lt;li&gt;모든 검색 결과를 배열로 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/6b7fe3d059b8407e81795ae4cd1b95e6?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/6b7fe3d059b8407e81795ae4cd1b95e6?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717048377338&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;정규표현식 고급 패턴 매칭 | Notion&quot; data-og-description=&quot;1. 패턴 매칭&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/6b7fe3d059b8407e81795ae4cd1b95e6?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/6b7fe3d059b8407e81795ae4cd1b95e6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YMWg1/hyWdmyBTYn/Qlkl8uOJeQdw6vL8REPfn0/img.png?width=2000&amp;amp;height=1948&amp;amp;face=0_0_2000_1948,https://scrap.kakaocdn.net/dn/bwLuwk/hyWdjhAiRG/w8Jfn1HXmuKPar3TPxhhJk/img.png?width=2000&amp;amp;height=1948&amp;amp;face=0_0_2000_1948&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/6b7fe3d059b8407e81795ae4cd1b95e6?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/6b7fe3d059b8407e81795ae4cd1b95e6?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YMWg1/hyWdmyBTYn/Qlkl8uOJeQdw6vL8REPfn0/img.png?width=2000&amp;amp;height=1948&amp;amp;face=0_0_2000_1948,https://scrap.kakaocdn.net/dn/bwLuwk/hyWdjhAiRG/w8Jfn1HXmuKPar3TPxhhJk/img.png?width=2000&amp;amp;height=1948&amp;amp;face=0_0_2000_1948');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;정규표현식 고급 패턴 매칭 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 패턴 매칭&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>javascript</category>
      <category>lookahead</category>
      <category>MATCH</category>
      <category>regex</category>
      <category>regular-expression</category>
      <category>자바스크립트</category>
      <category>정규표현식</category>
      <category>캡처</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/49</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4-%EB%A7%A4%EC%B9%AD#entry49comment</comments>
      <pubDate>Wed, 5 Jun 2024 12:54:17 +0900</pubDate>
    </item>
    <item>
      <title>정규표현식 - 실습 간단한 패턴 만들기</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EC%8B%A4%EC%8A%B5-%EA%B0%84%EB%8B%A8%ED%95%9C-%ED%8C%A8%ED%84%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
      <description>&lt;h1&gt;1. 이메일 주소 검증&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일 주소가 유효한지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규표현식 : /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;function validateEmail(email) {
  const regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$/;
  console.log(regex.test(email));
}

validateEmail('ted@gmail.com'); // true
validateEmail('tedgmail.com'); // false
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정규표현식을 하나씩 자세히 보면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;^[a-zA-Z0-9._-]+&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;^ 뒤의 문자로 시작&lt;/li&gt;
&lt;li&gt;[소문자, 대문자, 숫자, 마침표, 언더스코어, 하이픈] 중 하나&lt;/li&gt;
&lt;li&gt;+ 1개 이상 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앞의 문자들 뒤에 @ 기호 첨부&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;^[a-zA-Z0-9._-]+ 위의 설명과 동일한 내용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;\.[a-zA-Z]{2,6}&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인의 TLD(최상위 도메인)는 마침표.으로 시작&lt;/li&gt;
&lt;li&gt;알파벳(대문자, 소문자 모두 가능) 2~6개로 첨부&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 전화번호 포맷 매칭&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 전화번호 포맷을 매칭하기 위한 정규표현식&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규표현식 : /^(\+\d{1,3}\s?)?(\(\d{3}\)|\d{3})[\s.-]?\d{3}[\s.-]?\d{4}$/&lt;/h3&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;function validateNumber(number) {
  const regex = /^(\\+\\d{1,3}\\s?)?(\\(\\d{3}\\)|\\d{3})[\\s.-]?\\d{3}[\\s.-]?\\d{4}$/;
  console.log(regex.test(number));
}

validateNumber('+82 123-456-7890'); // true
validateNumber('123-456-7890'); // true
validateNumber('(123)-456-7890'); // true
validateNumber('1234567890'); // true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정규표현식을 하나씩 자세히 보면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;^(\+\d{1,3}\s?)?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;+ 플러스 기호로 시작&lt;/li&gt;
&lt;li&gt;숫자가 1개 3개 사이로 작성&lt;/li&gt;
&lt;li&gt;/s - space(공백)가 없거나 최대 한번만&lt;/li&gt;
&lt;li&gt;전체 국제번호 표기가 없거나 최대 한번만 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(\(\d{3}\)|\d{3})&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\( - 열리는 소괄호 리터럴 문자&lt;/li&gt;
&lt;li&gt;\d{3} - 숫자 3자리 작성&lt;/li&gt;
&lt;li&gt;\) - 닫히는 소괄호 리터럴 문자&lt;/li&gt;
&lt;li&gt;| - OR(또는)&lt;/li&gt;
&lt;li&gt;\d{3} - 숫자 3자리 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[\s.-]?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공백, 마침표, 하이픈 중 하나를 택 [abc]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;\d{3}[\s.-]?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에 설명 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;\d{4}$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규표현식의 끝은 숫자 4자리&lt;/li&gt;
&lt;li&gt;※ \d의 d는 decimal 10진수(숫자)를 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. URL 인식&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL을 인식하기 위한 정규표현식은 다음과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규표현식 : /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-])\/?$/&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;function validateURL(url) {
  const regex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/;
  console.log(regex.test(url));
}

validateURL('&amp;lt;https://naver.com&amp;gt;');
validateURL('&amp;lt;http://naver.com&amp;gt;');
validateURL('naver.com');
validateURL('&amp;lt;http://naver.com/path/to/&amp;gt;');
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정규표현식을 하나씩 자세히 보면&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;^(https?:\/\/)?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\/\/ 는 더블유가 아니고 \ / \ / 슬래시 기호를 사용하기 위함임&lt;/li&gt;
&lt;li&gt;https:// 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;http://로 시작하는 것이 선택적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;([\da-z.-]+)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\d는 [0-9]와 같은 표현임&lt;/li&gt;
&lt;li&gt;숫자, 알파벳(소문자), 점, 하이픈 구성이 1개 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;\.([a-z.]{2,6})&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리터럴 문자 마침표(.) 뒤에 알파벳(소문자)와 점 중에 2 ~ 6개 사이의 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;([\/\w .-])&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\w는 [a-zA-Z0-9_]와 같은 표현임&lt;/li&gt;
&lt;li&gt;리터럴 문자 슬래시(/) 또는 (알파벳, 숫자, 언더스코어) 또는 공백 또는 마침표 또는 하이픈(-)이 0회 이상 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;\/?$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL의 종료는 /로 종료를 허용&lt;/li&gt;
&lt;li&gt;리터럴 슬래시가 없거나 최대 하나만 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;노션으로 보고 싶다면?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/778f30f6dc2746c9961791b94e5ded3a?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/778f30f6dc2746c9961791b94e5ded3a?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717030694348&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;정규표현식 - 실습 간단한 패턴 만들기 | Notion&quot; data-og-description=&quot;이메일 주소 검증&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/778f30f6dc2746c9961791b94e5ded3a?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/778f30f6dc2746c9961791b94e5ded3a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qeweb/hyWdfF9NHJ/pcmIyWA61x3f3p1TqlPSPk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/uFPA2/hyWdrs27Me/l8cZFUBA8fcjopB66zTbE1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/778f30f6dc2746c9961791b94e5ded3a?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/778f30f6dc2746c9961791b94e5ded3a?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qeweb/hyWdfF9NHJ/pcmIyWA61x3f3p1TqlPSPk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/uFPA2/hyWdrs27Me/l8cZFUBA8fcjopB66zTbE1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;정규표현식 - 실습 간단한 패턴 만들기 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이메일 주소 검증&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>javascript</category>
      <category>regex</category>
      <category>regex.test()</category>
      <category>regular-expression</category>
      <category>자바스크립트</category>
      <category>정규표현식</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/48</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EC%8B%A4%EC%8A%B5-%EA%B0%84%EB%8B%A8%ED%95%9C-%ED%8C%A8%ED%84%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0#entry48comment</comments>
      <pubDate>Tue, 4 Jun 2024 16:58:19 +0900</pubDate>
    </item>
    <item>
      <title>정규표현식 개요 - Regular Expression</title>
      <link>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B0%9C%EC%9A%94-Regular-Expression</link>
      <description>&lt;h1&gt;정규표현식의 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규표현식은 문자열을 처리할 때 사용하는 문법&lt;/li&gt;
&lt;li&gt;복잡한 문자열 패턴을 정의하고 검색, 대체, 추출 작업을 수행하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;+) 역사&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규표현식은 1950년대 후반 수학자 스티븐 클레이니에 의해 처음 소개&lt;/li&gt;
&lt;li&gt;이후 UNIX 운영 체제의 텍스트 처리 도구들에서 사용&lt;/li&gt;
&lt;li&gt;JavaScript에서는 1990년대 후반부터 정규표현식 지원 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본 용도 &amp;amp; 응용 분야&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색(Search): 특정 패턴이나 조건에 맞는 문자열을 찾기&lt;/li&gt;
&lt;li&gt;검증(Validation): 이메일 주소, 전화번호 등 입력된 데이터의 형식이 올바른지 확인&lt;/li&gt;
&lt;li&gt;분리(Splitting): 문자열을 특정 패턴을 기준으로 여러 부분으로 나누기&lt;/li&gt;
&lt;li&gt;대체(Replacement): 문자열 내의 특정 패턴을 찾아 다른 문자열로 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;+) 응용 분야&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발: 폼 데이터 검증, URL 파싱 등 데이터 분석: 로그 파일에서 정보 추출, 데이터 정제 등 소프트웨어 개발: 소스 코드에서 패턴 검색 및 수정 네트워킹: 프로토콜 메시지 분석 및 검증&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;+) JavaScript에서 정규표현식을 사용하는 이유&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유연성: JavaScript는 웹 브라우저와 서버(Node.js) 양쪽 모두에서 실행 , 정규표현식을 이용해 다양한 문자열 처리 작업을 유연하게 수행 가능&lt;/li&gt;
&lt;li&gt;효율성: 복잡한 문자열 검사를 코드 몇 줄로 간단하게 처리 , 개발 시간과 비용 절감&lt;/li&gt;
&lt;li&gt;표준화: ECMAScript 표준의 일부로 정규표현식이 포함 , JavaScript 환경에서의 호환성과 예측 가능성 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주석이나 공백 허용 X&lt;/li&gt;
&lt;li&gt;여러가지 기호를 혼합 사용&lt;/li&gt;
&lt;li&gt;가독성이 좋지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;정규표현식 기본 문법 및 패턴&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 정규식 구성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;슬래쉬( / ) 문자 두개 사이로 정규식 기호가 들어가는 형태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 메타 문자와 리터럴 문자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 메타 문자 : 정규표현식 내에서 특별한 의미를 가지는 문자&lt;/h3&gt;
&lt;pre id=&quot;code_1717030219896&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;. :어떤 하나의 문자와 일치(줄바꿈 문자 제외)
\d: 숫자와 일치 [0-9]와 동일
\D: 숫자가 아닌 모든 문자와 일치 [^0-9]와 동일
\w: 단어 문자(알파벳, 숫자, 밑줄)와 일치 [a-zA-Z0-9_]와 동일
\W: 단어 문자가 아닌 모든 문자와 일치 [^a-zA-Z0-9_]와 동일
\s: 모든 공백 문자(스페이스, 탭, 줄바꿈 등)와 일치
\S: 공백이 아닌 모든 문자와 일치
\특수기호: 특수기호 \* \^ \&amp;amp; \! \? ...등&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 리터럴 문자 : 메타문자로 활용되는 알파벳을 실제의 문자로 활용하고 싶은 경우 \(백슬래시)를 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\.: .(마침표) 문자 그 자체를 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 문자 클래스&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자 클래스는 특정 문자 중 하나를 매치&lt;/li&gt;
&lt;li&gt;문자 클래스는 특정 문자 집합 중 하나와 일치시키고 싶을 때 사용합니다&lt;/li&gt;
&lt;li&gt;[ ] 대괄호: 괄호 안의 문자들 중 하나 / -하이픈을 사용하여 범위 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717030241818&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[abc]: 'a', 'b', 또는 'c'와 일치
[^abc]: 'a', 'b', 'c'를 제외한 모든 문자와 일치
[a-z]: 모든 소문자와 일치
[A-Z]: 모든 대문자와 일치
[0-9]: 모든 숫자와 일치
[a-zA-Z]: 모든 알파벳 문자와 일치

^문자열 : 특정 문자열로 시작 (시작점) - /^www/
문자열$ : 특정 문자열로 끝남 (종착점) - /com$/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 문자 클래스를 사용하면 특정 범위의 문자를 쉽게 지정 가능 : [a-z]는 소문자 알파벳 중 하나와 일치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 수량자&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수량자는 바로 앞의 요소가 몇 번 나타나는지 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717030260682&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{n}
바로 앞의 요소가 정확히 n번 작성
예: a{3}는 &quot;aaa&quot;와 일치

{n,}
바로 앞의 요소가 n번 이상 작성
예: a{2,}는 &quot;aa&quot;, &quot;aaa&quot;, &quot;aaaa&quot;, 등과 일치

{n,m}
바로 앞의 요소가 최소 n번, 최대 m번 작성
예: a{2,4}는 &quot;aa&quot;, &quot;aaa&quot;, &quot;aaaa&quot;와 일치

+
바로 앞의 요소가 1번 이상 작성 (최소 한개 또는 여러개)
예: a+는 &quot;a&quot;, &quot;aa&quot;, &quot;aaa&quot;, 등과 일치

*
바로 앞의 요소가 0번 이상 작성
예: a*는 &quot;&quot;, &quot;a&quot;, &quot;aa&quot;, &quot;aaa&quot;, 등과 일치

?
바로 앞의 요소가 0번 또는 1번 작성
예: a?는 &quot;&quot;, &quot;a&quot;와 일치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 위치를 지정하는 앵커&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앵커는 문자열 내의 특정 위치를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1717030281519&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\b
단어 경계와 일치 단어와 공백 또는 문자열의 시작/끝 사이의 위치
예: \ba\는 &quot;a cat&quot;에서 'a '와 일치

\B
단어 경계가 아닌 위치와 일치
예: \Ba\는 &quot;an apple&quot;에서 'a'와 일치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Regular-Expression-802a4734e3d8499c8f689c54fa13a44f?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Regular-Expression-802a4734e3d8499c8f689c54fa13a44f?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717030352557&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;정규표현식 개요 - Regular Expression | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Regular-Expression-802a4734e3d8499c8f689c54fa13a44f?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/802a4734e3d8499c8f689c54fa13a44f&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iq8eM/hyWdtj8uQe/ggcuDcwaP6JMRnFzUdcOgk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bdoFEB/hyWdi3XIBU/XzBWlGiP50MTXbGu8wt4Jk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Regular-Expression-802a4734e3d8499c8f689c54fa13a44f?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Regular-Expression-802a4734e3d8499c8f689c54fa13a44f?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iq8eM/hyWdtj8uQe/ggcuDcwaP6JMRnFzUdcOgk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bdoFEB/hyWdi3XIBU/XzBWlGiP50MTXbGu8wt4Jk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;정규표현식 개요 - Regular Expression | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>javascript</category>
      <category>regex</category>
      <category>regular-expression</category>
      <category>자바스크립트</category>
      <category>정규표현식</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/47</guid>
      <comments>https://ted93.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B0%9C%EC%9A%94-Regular-Expression#entry47comment</comments>
      <pubDate>Mon, 3 Jun 2024 10:52:37 +0900</pubDate>
    </item>
    <item>
      <title>로컬 스토리지 Todo 예제 - 정답</title>
      <link>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-Todo-%EC%98%88%EC%A0%9C-%EC%A0%95%EB%8B%B5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 스토리지를 활용한 Todo 예제 정답입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;절대 제가 작성한 코드가 무조건 적인 정답은 아니며, 여러분의 생각과 다르다면 그것이 정답일 것입니다~~&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;HTML 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716969353915&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;Todo List Application&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;todoInput&quot; placeholder=&quot;Add new task...&quot; aria-label=&quot;New task input&quot;&amp;gt;
        &amp;lt;button onclick=&quot;addTodo()&quot;&amp;gt;Add Task&amp;lt;/button&amp;gt;
        &amp;lt;ul id=&quot;todoList&quot;&amp;gt;&amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script src=&quot;main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details&gt;
&lt;summary&gt;CSS 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716969353919&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;body {
  background-color: #f4f4f4;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  margin: 0;
}

.container {
  background: white;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);
  width: 500px;
}

input[type='text'] {
  width: calc(100% - 22px);
  padding: 10px;
  margin-bottom: 10px;
  border: 2px solid #ddd;
  border-radius: 4px;
}

button {
  padding: 10px;
  background-color: #5cb85c;
  border: none;
  border-radius: 4px;
  color: white;
  font-size: 16px;
  cursor: pointer;
}

button:hover {
  background-color: #4cae4c;
}

ul {
  list-style: none;
  padding: 0;
}

li {
  background: #eee;
  margin-top: 8px;
  padding: 10px;
  border-radius: 4px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

button.deleteBtn {
  background-color: #d9534f;
  border: none;
  border-radius: 4px;
  padding: 5px 10px;
  color: white;
  cursor: pointer;
  width: 80px;
  min-width: 60px;
}

button.deleteBtn:hover {
  background-color: #c9302c;
}

#error {
  color: red;
  text-align: center;
}
.hidden {
  visibility: hidden;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details&gt;
&lt;summary&gt;전체 JS 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716969422589&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let todos = [];

document.addEventListener('DOMContentLoaded', () =&amp;gt; {
  todos = JSON.parse(localStorage.getItem('todos')) || [];
  renderTodos(todos);
});

function addTodo() {
  const input = document.getElementById('todoInput');
  const newTodo = input.value.trim();
  if (newTodo) {
    todos.push(newTodo);
    localStorage.setItem('todos', JSON.stringify(todos));
    renderTodos(todos);
    input.value = '';
  }
}

function renderTodos() {
  const list = document.getElementById('todoList');
  list.innerHTML = '';

  todos.forEach((todo, index) =&amp;gt; {
    const li = document.createElement('li');
    li.textContent = todo;

    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = 'Delete';
    deleteBtn.onclick = () =&amp;gt; removeTodo(index);

    li.appendChild(deleteBtn);
    list.appendChild(li);
  });
}

function removeTodo(index) {
  todos.splice(index, 1);
  localStorage.setItem('todos', JSON.stringify(todos));
  renderTodos(todos);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;1. 할 일 목록을 저장할 빈 배열을 선언&lt;/h1&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot;&gt;&lt;code&gt;let todos = [];
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;2. DOMContentLoaded 이벤트가 발생하면, 즉 문서 로딩이 완료되면 함수들을 실행&lt;/h1&gt;
&lt;pre id=&quot;code_1716969353924&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;☝ 로직
1. 기존에 todos에서 로컬스토리지에 저장된 값이 있다면 꺼내오고 없다면 빈 배열을 할당
2. 렌더링 함수를 호출 (밑에서 구현 예정)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1716969434783&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.addEventListener('DOMContentLoaded', () =&amp;gt; {
  todos = JSON.parse(localStorage.getItem('todos')) || [];
  renderTodos(todos);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;3. 할 일을 추가하는 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1716969353925&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;☝ 로직
1. addTodo 함수 구현
2. input을 가져오고, 새로운 투두에 그 인풋의 값을 넣어줌
3. 만약 새로운 투두가 있다면, 투두리스트에 추가해주고
4. 로컬 스토리지에도 추가해줌
5. 렌더링 함수를 호출하고, 인풋의 값은 비워줌&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1716969442995&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function addTodo() {
  const input = document.getElementById('todoInput');
  const newTodo = input.value.trim();
  if (newTodo) {
    todos.push(newTodo);
    localStorage.setItem('todos', JSON.stringify(todos));
    renderTodos(todos);
    input.value = '';
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;4. 할 일 목록을 렌더링하는 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1716969353925&quot; class=&quot;lsl&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;☝ 로직
1. list를 가져오고, list의 HTML을 빈 값으로 할당
2. todos배열을 순회하면서, li 요소를 생성
3. li 요소의 값은 todo로 채워줌
4. delete 버튼을 생성하고 값은 Delete로 채워줌
5. delete 버튼을 클릭했을 때 removeTodo 함수를 호출
6. removeTodo 함수는 (밑에서 구현 예정)
7. li 요소의 자식으로 버튼을 추가하고
8. list의 자식으로 li를 추가&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1716969452003&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function renderTodos() {
  const list = document.getElementById('todoList');
  list.innerHTML = '';

  todos.forEach((todo, index) =&amp;gt; {
    const li = document.createElement('li');
    li.textContent = todo;

    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = 'Delete';
    deleteBtn.onclick = () =&amp;gt; removeTodo(index);

    li.appendChild(deleteBtn);
    list.appendChild(li);
  });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;color: #000000;&quot;&gt;5. 할 일을 삭제하는 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1716969353925&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;☝ 로직
1. index를 인자로 받아옴
2. 배열의 메소드를 호출해서 인자로 넣어준 index를 삭제
3. 로컬 스토리지에도 업데이트
4. 렌더링 함수를 호출&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1716969463929&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function removeTodo(index) {
  todos.splice(index, 1);
  localStorage.setItem('todos', JSON.stringify(todos));
  renderTodos(todos);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;6. 다른 버전으로 리팩토링&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://seungjushin93.github.io/mini-todos/&quot;&gt;데모 웹사이트&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/SeungjuShin93/mini-todos&quot;&gt;깃허브&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 코드에서 달라진 부분 위주로 주석으로 설명 첨부&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;JS 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716969511511&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let toDos = [];

document.addEventListener('DOMContentLoaded', () =&amp;gt; {
  toDos = JSON.parse(localStorage.getItem('toDos')) || [];
  const list = document.getElementById('todoList');
  // 버튼에 하나하나 이벤트 리스너 다는 것을 피하고
  // list 하나에만 이벤트 리스너를 설계
  list.addEventListener('click', (e) =&amp;gt; {
    const btnId = e.target.dataset.btnId;
    console.log(btnId);
    if (btnId) {
      removeTodo(btnId);
    }
  });
  renderPage(toDos);
});

// 엔터 키로도 addTodo가 작동하도록 설계
document.addEventListener('keydown', (e) =&amp;gt; {
  if (e.key === 'Enter') {
    addTodo();
  }
});

function addTodo() {
  const input = document.getElementById('todoInput');
  let newTodo = input.value.trim();
  const p = document.getElementById('error');
  if (newTodo) {
    const data = JSON.parse(localStorage.getItem('toDos'));
    if (data &amp;amp;&amp;amp; data.includes(newTodo)) {
      // 기존에 이미 존재하는 todo가 있는지 확인
      // 존재한다면 에러 메세지를 출력해줌
      p.classList.remove('hidden');
      renderPage(toDos);
      return;
    }
    p.classList.add('hidden');
    toDos.push(newTodo);
    localStorage.setItem('toDos', JSON.stringify(toDos));
    renderPage(toDos);
    input.value = '';
  }
}

function renderPage(toDos) {
  const list = document.getElementById('todoList');
  list.innerHTML = '';
  toDos.forEach((todo, index) =&amp;gt; {
    const li = document.createElement('li');
    li.innerText = todo;
    const deleteBtn = document.createElement('button');
    deleteBtn.innerText = 'Delete';
    // 원하는 버튼을 삭제하기 위해서 dataset을 설정
    deleteBtn.dataset.btnId = index;
    li.appendChild(deleteBtn);
    list.appendChild(li);
  });
}

// 기존 index 대신에 btnId를 인자로 전달
function removeTodo(btnId) {
  toDos.splice(btnId, 1);
  localStorage.setItem('toDos', JSON.stringify(toDos));
  renderPage(toDos);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Todo-0495232881534a55957e0c3e1aa9afc7?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Todo-0495232881534a55957e0c3e1aa9afc7?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716969482635&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;로컬 스토리지 Todo 예제 - 정답 | Notion&quot; data-og-description=&quot;로컬 스토리지를 활용한 Todo 예제 정답입니다.&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Todo-0495232881534a55957e0c3e1aa9afc7?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/0495232881534a55957e0c3e1aa9afc7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/N7wiG/hyWdrsP7kB/yQqPm69KVarawPQgKIaVgK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/phYrR/hyV9PhPhbl/tRLKdGQe87ut8HJ9NndpT0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Todo-0495232881534a55957e0c3e1aa9afc7?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Todo-0495232881534a55957e0c3e1aa9afc7?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/N7wiG/hyWdrsP7kB/yQqPm69KVarawPQgKIaVgK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/phYrR/hyV9PhPhbl/tRLKdGQe87ut8HJ9NndpT0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;로컬 스토리지 Todo 예제 - 정답 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;로컬 스토리지를 활용한 Todo 예제 정답입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>JavaScript</category>
      <category>getItem</category>
      <category>JSON</category>
      <category>localstorage</category>
      <category>parse</category>
      <category>setItem</category>
      <category>stringify</category>
      <category>Todo</category>
      <category>todo-list</category>
      <category>todos</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/43</guid>
      <comments>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-Todo-%EC%98%88%EC%A0%9C-%EC%A0%95%EB%8B%B5#entry43comment</comments>
      <pubDate>Sun, 2 Jun 2024 22:00:40 +0900</pubDate>
    </item>
    <item>
      <title>로컬 스토리지 Todo 예제</title>
      <link>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-Todo-%EC%98%88%EC%A0%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;해당 페이지는 연습용으로 질문만 있고 정답은 다음 글에서 공개합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 코드와 CSS 코드를 복붙한 후 main.js를 생성해서 아래 설명대로 한번 작성해보세요!&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;HTML 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716969017476&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;Todo List Application&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;todoInput&quot; placeholder=&quot;Add new task...&quot; aria-label=&quot;New task input&quot;&amp;gt;
        &amp;lt;button onclick=&quot;addTodo()&quot;&amp;gt;Add Task&amp;lt;/button&amp;gt;
        &amp;lt;ul id=&quot;todoList&quot;&amp;gt;&amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;script src=&quot;main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details&gt;
&lt;summary&gt;CSS 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716968839390&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body {
  background-color: #f4f4f4;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  margin: 0;
}

.container {
  background: white;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);
  width: 500px;
}

input[type='text'] {
  width: calc(100% - 22px);
  padding: 10px;
  margin-bottom: 10px;
  border: 2px solid #ddd;
  border-radius: 4px;
}

button {
  padding: 10px;
  background-color: #5cb85c;
  border: none;
  border-radius: 4px;
  color: white;
  font-size: 16px;
  cursor: pointer;
}

button:hover {
  background-color: #4cae4c;
}

ul {
  list-style: none;
  padding: 0;
}

li {
  background: #eee;
  margin-top: 8px;
  padding: 10px;
  border-radius: 4px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

button.deleteBtn {
  background-color: #d9534f;
  border: none;
  border-radius: 4px;
  padding: 5px 10px;
  color: white;
  cursor: pointer;
  width: 80px;
  min-width: 60px;
}

button.deleteBtn:hover {
  background-color: #c9302c;
}

#error {
  color: red;
  text-align: center;
}
.hidden {
  visibility: hidden;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1&gt;1. 할 일 목록을 저장할 빈 배열을 선언&lt;/h1&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;let todos = [];
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. DOMContentLoaded 이벤트가 발생하면, 즉 문서 로딩이 완료되면 함수들을 실행&lt;/h1&gt;
&lt;pre id=&quot;code_1716968914505&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;☝ 로직
1. 기존에 todos에서 로컬스토리지에 저장된 값이 있다면 꺼내오고 없다면 빈 배열을 할당
2. 렌더링 함수를 호출 (밑에서 구현 예정)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 할 일을 추가하는 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1716968924983&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;☝ 로직
1. addTodo 함수 구현
2. input을 가져오고, 새로운 투두에 그 인풋의 값을 넣어줌
3. 만약 새로운 투두가 있다면, 투두리스트에 추가해주고
4. 로컬 스토리지에도 추가해줌
5. 렌더링 함수를 호출하고, 인풋의 값은 비워줌&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 할 일 목록을 렌더링하는 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1716968960805&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;☝ 로직
1. list를 가져오고, list의 HTML을 빈 값으로 할당
2. todos배열을 순회하면서, li 요소를 생성
3. li 요소의 값은 todo로 채워줌
4. delete 버튼을 생성하고 값은 Delete로 채워줌
5. delete 버튼을 클릭했을 때 removeTodo 함수를 호출
6. removeTodo 함수는 (밑에서 구현 예정)
7. li 요소의 자식으로 버튼을 추가하고
8. list의 자식으로 li를 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. 할 일을 삭제하는 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1716969047980&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;☝ 로직
1. index를 인자로 받아옴
2. 배열의 메소드를 호출해서 인자로 넣어준 index를 삭제
3. 로컬 스토리지에도 업데이트
4. 렌더링 함수를 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Todo-23b6602b8fe44956a57fc234c81d8fe1?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://short-echidna-b16.notion.site/Todo-23b6602b8fe44956a57fc234c81d8fe1?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716969224183&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;로컬 스토리지 Todo 예제 | Notion&quot; data-og-description=&quot;해당 페이지는 연습용으로 질문만 있고 정답은 다음 글에서 공개합니다&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Todo-23b6602b8fe44956a57fc234c81d8fe1?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/23b6602b8fe44956a57fc234c81d8fe1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0smrX/hyWdoCSy3A/dDYDl9DhFkbpPzL3fjbaZk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xwLeg/hyWdh4PsnF/hlMQiYiJqAn6r5zyQSAEKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Todo-23b6602b8fe44956a57fc234c81d8fe1?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Todo-23b6602b8fe44956a57fc234c81d8fe1?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0smrX/hyWdoCSy3A/dDYDl9DhFkbpPzL3fjbaZk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xwLeg/hyWdh4PsnF/hlMQiYiJqAn6r5zyQSAEKk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;로컬 스토리지 Todo 예제 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 페이지는 연습용으로 질문만 있고 정답은 다음 글에서 공개합니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>getItem</category>
      <category>JSON</category>
      <category>localstorage</category>
      <category>parse</category>
      <category>setItem</category>
      <category>stringify</category>
      <category>Todo</category>
      <category>todo-list</category>
      <category>todos</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/42</guid>
      <comments>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-Todo-%EC%98%88%EC%A0%9C#entry42comment</comments>
      <pubDate>Sun, 2 Jun 2024 10:52:36 +0900</pubDate>
    </item>
    <item>
      <title>로컬 스토리지2 (Local Storage)</title>
      <link>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%802-Local-Storage</link>
      <description>&lt;h1&gt;1. localStorage.getItem(key)의 기본 사용법&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localStorage.getItem 메소드는 지정된 키에 해당하는 값을 로컬 스토리지에서 검색하여 반환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키에 해당하는 데이터가 없으면 null을 반환&lt;/li&gt;
&lt;li&gt;해당 메소드는 데이터를 조회할 때 사용되며, 매우 간단하고 직관적인 API를 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;'key'는 데이터에 접근하기 위해 사용되는 식별자
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 식별자를 통해 저장된 값을 검색 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예제&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// localStorage.setItem('username', '테드');
// localStorage.setItem('key', 'value'); 
// 앞선 예제에서 넣었던 setItem 목록

let value = localStorage.getItem('key');
console.log(value);

let username = localStorage.getItem('username');
console.log(username);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;localStorage.png&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vj0Ds/btsHDfOipIp/a1Rel3aEOmOFAuag1WJ301/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vj0Ds/btsHDfOipIp/a1Rel3aEOmOFAuag1WJ301/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vj0Ds/btsHDfOipIp/a1Rel3aEOmOFAuag1WJ301/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvj0Ds%2FbtsHDfOipIp%2Fa1Rel3aEOmOFAuag1WJ301%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;localStorage&quot; loading=&quot;lazy&quot; width=&quot;260&quot; height=&quot;139&quot; data-filename=&quot;localStorage.png&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 복잡한 데이터 타입 처리&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지는 기본적으로 문자열 데이터만을 저장&lt;/li&gt;
&lt;li&gt;객체와 같은 복잡한 데이터 타입을 조회할 때는 문자열에서 다시 해당 타입으로 변환하는 과정이 필요&lt;/li&gt;
&lt;li&gt;JSON.parse() 메소드를 사용&lt;/li&gt;
&lt;li&gt;현재 로컬 스토리지의 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;parse.png&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egqLiM/btsHDMLH8Xe/HKuxxd9LO6CH3IM8Sb3lq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egqLiM/btsHDMLH8Xe/HKuxxd9LO6CH3IM8Sb3lq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egqLiM/btsHDMLH8Xe/HKuxxd9LO6CH3IM8Sb3lq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegqLiM%2FbtsHDMLH8Xe%2FHKuxxd9LO6CH3IM8Sb3lq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;156&quot; data-filename=&quot;parse.png&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 데이터 조회 예제&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let storedData = localStorage.getItem('사용자정보');
let userInfo = JSON.parse(storedData);
console.log(userInfo);
console.log(userInfo.name);
console.log(userInfo.age);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;getItem.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTEav/btsHDAxYg8e/0xp2rh6vM0AqjJybhKd0u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTEav/btsHDAxYg8e/0xp2rh6vM0AqjJybhKd0u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTEav/btsHDAxYg8e/0xp2rh6vM0AqjJybhKd0u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTEav%2FbtsHDAxYg8e%2F0xp2rh6vM0AqjJybhKd0u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;getItem&quot; loading=&quot;lazy&quot; width=&quot;347&quot; height=&quot;228&quot; data-filename=&quot;getItem.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 주의 사항&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) null 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localStorage.getItem이 null을 반환할 경우를 대비하여, 데이터를 사용하기 전에 이를 확인하고 적절히 처리&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 보안&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장된 데이터는 사이트 간 스크립팅(XSS) 공격에 노출될 수 있으므로, 외부 입력을 직접 저장하거나 조회할 때는 주의가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. JS 로컬 스토리지 데이터 삭제&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localStorage.removeItem(key) 및 localStorage.clear() 사용법&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개별 데이터 항목을 삭제하거나 저장된 모든 데이터를 한 번에 삭제 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) localStorage.removeItem(key) 사용법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localStorage.removeItem 메소드는 지정된 키에 해당하는 항목을 로컬 스토리지에서 삭제&lt;/li&gt;
&lt;li&gt;특정 키를 사용하여 로컬 스토리지에서 단일 데이터 항목을 제거할 때 사용&lt;/li&gt;
&lt;li&gt;localStorage.removeItem('key');
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'key'는 삭제하고자 하는 데이터의 식별자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제: 사용자 이름 삭제하기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;localStorage.removeItem('username');
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) localStorage.clear() 전체 삭제 사용법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localStorage.clear() 메소드는 로컬 스토리지 내의 모든 데이터를 삭제&lt;/li&gt;
&lt;li&gt;로컬 스토리지를 완전히 초기화할 때 유용, 특정 애플리케이션에서 사용자의 설정을 리셋하거나 개인 정보 보호를 위해 데이터를 클리어할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX) 사용자가 로그아웃할 때 로컬 스토리지의 모든 데이터를 삭제 개인 정보 보호가 강화&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;localStorage.clear();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/2-Local-Storage-f3a822c34d534ff7b3db186ab6e6a190?pvs=4&quot;&gt;https://short-echidna-b16.notion.site/2-Local-Storage-f3a822c34d534ff7b3db186ab6e6a190?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716803236532&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;로컬 스토리지2 (Local Storage) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/2-Local-Storage-f3a822c34d534ff7b3db186ab6e6a190?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/f3a822c34d534ff7b3db186ab6e6a190&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PMg4v/hyV9VWe3X9/rSn5CPmPoUKsKXQCNVL9V1/img.png?width=2000&amp;amp;height=1069&amp;amp;face=0_0_2000_1069,https://scrap.kakaocdn.net/dn/bD8qCU/hyWdfZO2vI/FrK4EjikoRHjwLd5DHDKE1/img.png?width=2000&amp;amp;height=1069&amp;amp;face=0_0_2000_1069&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/2-Local-Storage-f3a822c34d534ff7b3db186ab6e6a190?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/2-Local-Storage-f3a822c34d534ff7b3db186ab6e6a190?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PMg4v/hyV9VWe3X9/rSn5CPmPoUKsKXQCNVL9V1/img.png?width=2000&amp;amp;height=1069&amp;amp;face=0_0_2000_1069,https://scrap.kakaocdn.net/dn/bD8qCU/hyWdfZO2vI/FrK4EjikoRHjwLd5DHDKE1/img.png?width=2000&amp;amp;height=1069&amp;amp;face=0_0_2000_1069');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;로컬 스토리지2 (Local Storage) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>clear</category>
      <category>getItem</category>
      <category>JSON</category>
      <category>JSON.parse()</category>
      <category>localstorage</category>
      <category>parse</category>
      <category>removeItem</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/37</guid>
      <comments>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%802-Local-Storage#entry37comment</comments>
      <pubDate>Sat, 1 Jun 2024 10:06:14 +0900</pubDate>
    </item>
    <item>
      <title>로컬 스토리지 (Local Storage)</title>
      <link>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-Local-Storage</link>
      <description>&lt;h1&gt;1. 로컬 스토리지의 정의&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;웹 브라우저가 제공하는 저장 공간&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 컴퓨터에 영구적으로 데이터를 저장 가능&lt;/li&gt;
&lt;li&gt;HTML5 웹 스토리지 사양의 일부로 도입, 쿠키의 한계를 극복하고 더 큰 저장 용량과 더 나은 보안을 제공&lt;/li&gt;
&lt;li&gt;로컬 스토리지를 통해 저장된 데이터는 서버에 자동으로 전송되지 않으며, 웹 페이지가 로컬 데이터를 직접 제어 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. 로컬 스토리지의 용도&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 사용자 경험 개선&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지는 사용자의 기본 설정, 테마 선택, 언어 설정 등을 저장하여 , 다음 방문 때 웹사이트가 이 설정들을 기억하도록 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 상태 유지&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 어플리케이션에서 사용자의 세션 정보나 로그인 상태를 관리할 수 있어, 브라우저를 종료 후 재접속했을 때도 이전 상태를 유지 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 오프라인 데이터 저장&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 연결이 끊겨도 접근 가능한 정보를 저장함으로써, 오프라인 기능을 제공하는 애플리케이션에서 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 성능 향상&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 요청 없이 로컬에서 데이터를 빠르게 불러올 수 있어, 웹 애플리케이션의 반응 속도와 효율성을 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 로컬 스토리지의 장점&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 대용량 저장&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지는 약 5MB의 데이터를 저장 가능&lt;/li&gt;
&lt;li&gt;쿠키의 4KB 제한에 비해 훨씬 큰 용량을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 간단한 API&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지는 간단한 setItem, getItem, removeItem, clear 등의 메소드를 제공 , 데이터의 저장 및 관리를 쉽게 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 서버 부하 감소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 서버가 아닌 클라이언트에 저장, 서버로의 요청이 줄어들어 서버 부하가 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 영구 저장&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지에 저장된 데이터는 브라우저 세션 간에도 유지 , 사용자가 명시적으로 삭제하지 않는 한 계속 보존&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 보안성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 클라이언트 측에만 저장되고 HTTP 요청을 통해 서버에 전송 X, 쿠키에 비해 보안성 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. JS 로컬 스토리지 데이터 저장&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지는 웹 브라우저가 제공하는 데이터 저장 공간&lt;/li&gt;
&lt;li&gt;사용자가 브라우저를 닫아도 저장된 데이터가 유지&lt;/li&gt;
&lt;li&gt;localStorage 객체를 통해 간단하게 데이터를 저장하고, 조회 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) localStorage.setItem(key, value) 사용법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localStorage.setItem 메소드는 로컬 스토리지에 데이터를 저장하는 데 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 매개변수를 받으며&lt;/li&gt;
&lt;li&gt;첫 번째 매개변수는 데이터에 접근할 때 사용할 키(key)&lt;/li&gt;
&lt;li&gt;두 번째 매개변수는 저장할 데이터의 값(value)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 데이터 저장하기&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 형식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;localStorage.setItem('key', 'value');
localStorage.setItem('key2', 'value2');
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'key'는 데이터에 접근하기 위한 식별자&lt;/li&gt;
&lt;li&gt;'value'는 해당 키에 저장할 값&lt;/li&gt;
&lt;li&gt;저장된 데이터는 브라우저 세션 간에 유지, 사용자가 브라우저를 닫았다가 다시 열어도 데이터를 잃지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 예제: 사용자 이름 저장하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 코드는 'username'이라는 키에 'John Doe'라는 값을 로컬 스토리지에 저장&lt;/li&gt;
&lt;li&gt;해당 데이터는 이후에 localStorage.getItem('username')을 호출하여 언제든지 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;localStorage.setItem('username', '테드');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setItem.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA0SYe/btsHCTxZh62/1F4igbFYaYIoIfkXbUmf30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA0SYe/btsHCTxZh62/1F4igbFYaYIoIfkXbUmf30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA0SYe/btsHCTxZh62/1F4igbFYaYIoIfkXbUmf30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA0SYe%2FbtsHCTxZh62%2F1F4igbFYaYIoIfkXbUmf30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;setItem&quot; loading=&quot;lazy&quot; width=&quot;802&quot; height=&quot;269&quot; data-filename=&quot;setItem.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 데이터 유형과 직렬화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지는 기본적으로 문자열 데이터만 저장 가능&lt;/li&gt;
&lt;li&gt;객체나 배열 같은 복잡한 데이터 유형을 저장하려면, 이를 문자열 형태로 직렬화&lt;/li&gt;
&lt;li&gt;JavaScript에서는 JSON.stringify() 메소드를 사용하여 객체를 문자열로 변환 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 저장 예제&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let userInfo = {
  name: '테드',
  age: 30,
};

localStorage.setItem('사용자정보', JSON.stringify(userInfo));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JSON.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biGYJy/btsHCASUvea/R1c7mjBsokPk4Gqy9vqKJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biGYJy/btsHCASUvea/R1c7mjBsokPk4Gqy9vqKJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biGYJy/btsHCASUvea/R1c7mjBsokPk4Gqy9vqKJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiGYJy%2FbtsHCASUvea%2FR1c7mjBsokPk4Gqy9vqKJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;JSON&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;106&quot; data-filename=&quot;JSON.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 보안 및 사용 제한&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 스토리지에 저장된 데이터는 HTTPS를 사용하지 않는 경우 탈취될 위험 가능성 존재 O&lt;/li&gt;
&lt;li&gt;크로스-사이트 스크립팅(XSS) 공격에 취약할 수 있으므로, 사용자 입력을 직접 저장하기 전에 적절히 검증하고 소독하는 것이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Local-Storage-c2c390ceba4744ee95b2d4395ba9e21e?pvs=4&quot;&gt;https://short-echidna-b16.notion.site/Local-Storage-c2c390ceba4744ee95b2d4395ba9e21e?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716803276574&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;로컬 스토리지 (Local Storage) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/Local-Storage-c2c390ceba4744ee95b2d4395ba9e21e?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/c2c390ceba4744ee95b2d4395ba9e21e&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwPxxZ/hyV9TxncKK/PhWTkCwrS99B0gee0dPHG0/img.png?width=2000&amp;amp;height=671&amp;amp;face=0_0_2000_671,https://scrap.kakaocdn.net/dn/syotY/hyWdooVRUE/d0QBYqpXU3iQ2pekFAika0/img.png?width=2000&amp;amp;height=671&amp;amp;face=0_0_2000_671&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/Local-Storage-c2c390ceba4744ee95b2d4395ba9e21e?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/Local-Storage-c2c390ceba4744ee95b2d4395ba9e21e?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwPxxZ/hyV9TxncKK/PhWTkCwrS99B0gee0dPHG0/img.png?width=2000&amp;amp;height=671&amp;amp;face=0_0_2000_671,https://scrap.kakaocdn.net/dn/syotY/hyWdooVRUE/d0QBYqpXU3iQ2pekFAika0/img.png?width=2000&amp;amp;height=671&amp;amp;face=0_0_2000_671');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;로컬 스토리지 (Local Storage) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>JSON</category>
      <category>localstorage</category>
      <category>setItem</category>
      <category>stringify</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/36</guid>
      <comments>https://ted93.tistory.com/entry/%EB%A1%9C%EC%BB%AC-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-Local-Storage#entry36comment</comments>
      <pubDate>Fri, 31 May 2024 14:49:34 +0900</pubDate>
    </item>
    <item>
      <title>JS 웹 스토리지 개요</title>
      <link>https://ted93.tistory.com/entry/JS-%EC%9B%B9-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EA%B0%9C%EC%9A%94</link>
      <description>&lt;h1&gt;1. Client-side Storage란?&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트 측 저장소로서 웹 브라우저를 통해 사용자의 컴퓨터나 모바일 장치에 직접 데이터를 저장하는 기술&lt;/li&gt;
&lt;li&gt;서버 대신 사용자의 로컬 환경(브라우저 자체)에 데이터를 보관함으로써 더 빠르고 효율적인 데이터 접근을 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;2. Client-side Storage의 특징&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;퍼포먼스 개선: 서버와의 통신 필요성을 줄여, 응답 시간과 성능이 향상&lt;/li&gt;
&lt;li&gt;오프라인 액세스: 네트워크 연결이 없어도 데이터에 접근 가능&lt;/li&gt;
&lt;li&gt;사용자 경험 개선: 개인 설정이나 이전 상태를 저장하여, 사용자에게 맞춤화된 경험을 제공&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. 클라이언트 사이드 스토리지의 용도&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;세션 관리: 로그인 상태, 사용자 프로필 설정, 테마 선택 등의 사용자 세션 정보를 저장&lt;/li&gt;
&lt;li&gt;양식 데이터 저장: 사용자가 양식을 입력하는 도중 페이지를 실수로 벗어나더라도, 이미 입력된 정보를 저장&lt;/li&gt;
&lt;li&gt;쇼핑 카트 데이터 유지: 쇼핑 사이트에서 사용자가 카트에 추가한 항목을 유지&lt;/li&gt;
&lt;li&gt;게임 상태 저장: 게임 진행 상태를 로컬에 저장해, 다음 접속 때 이전의 진행 상태를 유지 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;4. 클라이언트 사이드 스토리지의 종류&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 쿠키 (Cookies)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징: 작은 텍스트 파일로, 서버가 사용자의 브라우저에 데이터를 저장하도록 요청할 때&lt;/li&gt;
&lt;li&gt;저장 용량: 약 4KB&lt;/li&gt;
&lt;li&gt;수명: 만료 날짜 설정 가능&lt;/li&gt;
&lt;li&gt;서버와의 통신: 모든 HTTP 요청과 함께 서버로 전송됨(네트워크 대역폭을 사용)&lt;/li&gt;
&lt;li&gt;보안: 쉽게 접근 및 변조 가능하므로 보안 측면에서 취약&lt;/li&gt;
&lt;li&gt;사용 예: 세션 관리, 사용자 추적, 개인화 설정에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 웹 스토리지 (Web Storage)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-1) 로컬 스토리지 (LocalStorage)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징: 브라우저 세션 간에도 데이터를 저장할 수 있으며, 사용자가 직접 삭제하지 않는 한 데이터가 유지&lt;/li&gt;
&lt;li&gt;저장 용량: 최대 5MB&lt;/li&gt;
&lt;li&gt;수명: 데이터는 브라우저 세션이 종료되어도 유지됨&lt;/li&gt;
&lt;li&gt;서버와의 통신: 데이터는 클라이언트 측에만 저장되며, 요청 시 서버로 전송되지 않음&lt;/li&gt;
&lt;li&gt;보안: HTTPS 사용 시 외부 접근 방지 가능하지만 XSS 공격에 취약할 수 있음&lt;/li&gt;
&lt;li&gt;사용 예: 대량의 데이터 저장, 사용자 설정 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-2) 세션 스토리지 (SessionStorage)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징: 브라우저 세션 동안만 데이터를 저장하며, 탭을 닫으면 데이터가 삭제&lt;/li&gt;
&lt;li&gt;저장 용량: 최대 5MB&lt;/li&gt;
&lt;li&gt;수명: 탭 또는 윈도우가 닫힐 때까지만 데이터 유지&lt;/li&gt;
&lt;li&gt;서버와의 통신: 로컬 스토리지와 마찬가지로 클라이언트 측에만 저장&lt;/li&gt;
&lt;li&gt;보안: 로컬 스토리지와 유사하나, 탭이 닫히면 데이터가 삭제되어 임시 정보 저장에 적합&lt;/li&gt;
&lt;li&gt;사용 예: 임시 정보의 저장(예: 한 세션 동안의 폼 입력 데이터)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3) 캐시 (Cache)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징: 웹 페이지나 애플리케이션의 자원(이미지, 스크립트 파일, 스타일시트 등)을 로컬에 저장해 빠른 로딩을 도모&lt;/li&gt;
&lt;li&gt;용도: 자주 사용되는 리소스의 재요청을 줄여, 로딩 시간을 단축하고 네트워크 트래픽을 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;5. 시나리오 기반 사용 추천&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키: 사용자 인증 토큰 등의 작은 데이터와 서버와의 지속적인 상태 유지가 필요한 정보를 저장할 때 사용&lt;/li&gt;
&lt;li&gt;로컬 스토리지: 사용자의 설정이나 큰 양의 데이터를 장기간 저장할 필요가 있을 때 이용&lt;/li&gt;
&lt;li&gt;세션 스토리지: 쇼핑 카트의 내용물 또는 한 페이지 내 세션 동안 필요한 정보를 저장할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/JS-a3668c269ad7436b9cff01d70a96bcc5?pvs=4&quot;&gt;https://short-echidna-b16.notion.site/JS-a3668c269ad7436b9cff01d70a96bcc5?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716803395983&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JS 웹 스토리지 개요 | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/JS-a3668c269ad7436b9cff01d70a96bcc5?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/a3668c269ad7436b9cff01d70a96bcc5&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zxJAi/hyV9VB0d2H/I7TlWwPKLkDAerUjsLnhrk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cAP02i/hyV9ND20kh/eh6Zkbnv4QBFosKPhsKXtK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/JS-a3668c269ad7436b9cff01d70a96bcc5?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/JS-a3668c269ad7436b9cff01d70a96bcc5?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zxJAi/hyV9VB0d2H/I7TlWwPKLkDAerUjsLnhrk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cAP02i/hyV9ND20kh/eh6Zkbnv4QBFosKPhsKXtK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JS 웹 스토리지 개요 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>Cache</category>
      <category>client-side-storage</category>
      <category>cookies</category>
      <category>storage</category>
      <category>web-storage</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/33</guid>
      <comments>https://ted93.tistory.com/entry/JS-%EC%9B%B9-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EA%B0%9C%EC%9A%94#entry33comment</comments>
      <pubDate>Thu, 30 May 2024 19:50:13 +0900</pubDate>
    </item>
    <item>
      <title>방문자 수 카운트 - 쿠키활용</title>
      <link>https://ted93.tistory.com/entry/%EB%B0%A9%EB%AC%B8%EC%9E%90-%EC%88%98-%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EC%BF%A0%ED%82%A4%ED%99%9C%EC%9A%A9</link>
      <description>&lt;details&gt;
&lt;summary&gt;HTML 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716772941689&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;

&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;Todo List Application&amp;lt;/title&amp;gt;
  &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
  &amp;lt;div class=&quot;app&quot;&amp;gt;
    &amp;lt;h1&amp;gt;방문자 수 카운터&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;이 페이지의 방문자 수: &amp;lt;span id=&quot;visitCount&quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;script src=&quot;main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details&gt;
&lt;summary&gt;CSS 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716772750284&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body, html {
  margin: 0;
  padding: 0;
  background-color: #f4f4f4;
}

.app {
  background: white;
  max-width: 400px;
  margin: 50px auto;
  padding: 20px;
  text-align: center;
  box-shadow: 0 0 10px rgba(0,0,0,0.1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details&gt;
&lt;summary&gt;JS 코드&lt;/summary&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1716772761159&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.addEventListener('DOMContentLoaded', () =&amp;gt; {
  const visitCountElement = document.getElementById('visitCount');

  //&amp;amp; 방문 횟수를 업데이트하는 함수 정의
  function updateVisitCount() {
    let visits = getCookie('visits');
    visits = visits ? parseInt(visits) + 1 : 1;

    setCookie('visits', visits, 365);
    visitCountElement.textContent = visits;

    //&amp;amp; 쿠키 설정 함수 정의
    function setCookie(name, value, days) {
      let expires = '';
      if (days) {
        const date = new Date();
        date.setTime(date.getTime() + 365 * 24 * 60 * 60 * 1000);
        expires = 'expires=' + date.toUTCString();
      }

      document.cookie = name + '=' + value + ';' + expires + ';path=/';
    }

    //&amp;amp; 쿠키 가져오는 함수 정의
    function getCookie(name) {
      let nameEQ = name + '=';

      let ca = document.cookie.split(';');
      console.log(ca);
      for (let i = 0; i &amp;lt; ca.length; i++) {
        let c = ca[i].trim();
        console.log(c);
        if (c.indexOf(nameEQ) === 0) {
          console.log(nameEQ.length);
          console.log(c.length);
          return c.substring(nameEQ.length, c.length);
        }
      }

      return null;
    }
  }
  updateVisitCount();
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;counter.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkYg0m/btsHCQaeUeK/0tWC0KO7UAQeaqgX7HIEd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkYg0m/btsHCQaeUeK/0tWC0KO7UAQeaqgX7HIEd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkYg0m/btsHCQaeUeK/0tWC0KO7UAQeaqgX7HIEd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkYg0m%2FbtsHCQaeUeK%2F0tWC0KO7UAQeaqgX7HIEd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;counter&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;216&quot; data-filename=&quot;counter.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 화면에서 새로고침하거나, 페이지를 새로 들어갈 때마다 방문자 수의 카운트를 1씩 증가시키는 코드를 구현 - 단 쿠키를 활용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre id=&quot;code_1716772246813&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  기본 로직
모든 요소는 DOMContentLoaded 이벤트 안에 구현
방문 횟수를 업데이트 하는 함수를 정의
쿠키를 설정하는 함수를 정의
쿠키를 가져오는 함수를 정의
방문 횟수를 업데이트하는 함수를 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;방문 횟수를 업데이트 하는 함수를 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'visits'라는 이름의 쿠키 값을 가져옴 &amp;rarr; 쿠키 값이 있으면 1을 증가, 없으면 1로 설정&lt;/li&gt;
&lt;li&gt;setCookie 함수를 호출해서 (만들 예정), 쿠키 visits를 업데이트하고 유효기간은 임의로 1년으로 설정&lt;/li&gt;
&lt;li&gt;HTML 요소에 방문 횟수를 표시해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;document.addEventListener('DOMContentLoaded', () =&amp;gt; {
  const visitCountElement = document.getElementById('visitCount');

  // 방문 횟수를 업데이트하는 함수 정의
  function updateVisitCount() {
    let visits = getCookie('visits');
    visits = visits ? parseInt(visits) + 1 : 1;

    setCookie('visits', visits, 365);
    visitCountElement.textContent = visits;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;쿠키 설정 함수 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키의 만료 문자열을 초기화&lt;/li&gt;
&lt;li&gt;만료일이 주어진 경우에 현재 날짜와 시간을 가져와서 만료일 뒤로 expires 날짜 설정&lt;/li&gt;
&lt;li&gt;expires와 쿠기값 변경에 대해서는 앞의 글 &lt;a href=&quot;https://ted93.tistory.com/entry/쿠키2-Cookie&quot;&gt;https://ted93.tistory.com/entry/쿠키2-Cookie&lt;/a&gt; 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;// updateVisitCount 함수 끝나는 곳 아래에 작성
// 쿠키 설정 함수 정의
function setCookie(name, value, days) {
  let expires = '';
  if (days) {
    const date = new Date();
    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
    expires = 'expires=' + date.toUTCString();
  }
  document.cookie = name + '=' + value + ';' + expires + ';path=/';
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;쿠키 가져오는 함수 정의&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 코드는 아래 사진과 함께 예를 들어서 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// setCookie함수 끝나는 곳 아래에 작성
// 쿠키 가져오는 함수 정의
function getCookie(name) {
  let nameEQ = name + '=';

  let ca = document.cookie.split(';');
  console.log(ca);
  for (let i = 0; i &amp;lt; ca.length; i++) {
    let c = ca[i].trim();
	  if (c.indexOf(nameEQ) === 0) {
      console.log(nameEQ.length);
      console.log(c.length);
      return c.substring(nameEQ.length, c.length);
    }
  }

  return null;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지가 처음 로드 되었을 때 콘솔에 찍어보면 아래 사진과 같이 나오고&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;console2.png&quot; data-origin-width=&quot;126&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvIC3j/btsHCV3AE8J/g9i1CgtbBZHPNyu6FYgpg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvIC3j/btsHCV3AE8J/g9i1CgtbBZHPNyu6FYgpg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvIC3j/btsHCV3AE8J/g9i1CgtbBZHPNyu6FYgpg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvIC3j%2FbtsHCV3AE8J%2Fg9i1CgtbBZHPNyu6FYgpg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;console&quot; loading=&quot;lazy&quot; width=&quot;126&quot; height=&quot;51&quot; data-filename=&quot;console2.png&quot; data-origin-width=&quot;126&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;updateVisitCount() 함수 의 내용 중 visits = visits ? parseInt(visits) + 1 : 1; 이 부분에 의해서&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;counter.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhWAfQ/btsHCs1WiUK/oR3un4BJrUrC916QWKo8Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhWAfQ/btsHCs1WiUK/oR3un4BJrUrC916QWKo8Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhWAfQ/btsHCs1WiUK/oR3un4BJrUrC916QWKo8Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhWAfQ%2FbtsHCs1WiUK%2FoR3un4BJrUrC916QWKo8Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;counter&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;216&quot; data-filename=&quot;counter.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방문자 수의 카운트는 1로 된다&lt;/li&gt;
&lt;li&gt;그리고 한번 더 새로고침을 하게 될 경우의 콘솔 창은 아래와 같이 나오고&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;console.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7xeY/btsHD9fD8ZX/rtpYAi8A6NC2axgjkVesi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7xeY/btsHD9fD8ZX/rtpYAi8A6NC2axgjkVesi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7xeY/btsHD9fD8ZX/rtpYAi8A6NC2axgjkVesi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7xeY%2FbtsHD9fD8ZX%2FrtpYAi8A6NC2axgjkVesi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;console&quot; loading=&quot;lazy&quot; width=&quot;307&quot; height=&quot;151&quot; data-filename=&quot;console.png&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서 우리가 호출할 때 사용할 파라미터인 visits를 넣어보면 c.indexOf(nameEQ) === 0 를 만족하게 되고&lt;/li&gt;
&lt;li&gt;substring에 의해서 &amp;ldquo;visits=&amp;rdquo; 다음에 나올 숫자를 리턴하게 된다&lt;/li&gt;
&lt;li&gt;updateVisitCount 함수에 의해서 숫자가 있기 때문에 +1 한 숫자로 setCookie에 의해서 업데이트가 될 것이고&lt;/li&gt;
&lt;li&gt;visitCountElement.textContent = visits; 에 의해서 HTML에도 업데이트가 될 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cookie.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ow2Tk/btsHBUYTbPI/sA2A2erVaR4Om7tFPtSI2K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ow2Tk/btsHBUYTbPI/sA2A2erVaR4Om7tFPtSI2K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ow2Tk/btsHBUYTbPI/sA2A2erVaR4Om7tFPtSI2K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ow2Tk/btsHBUYTbPI/sA2A2erVaR4Om7tFPtSI2K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;cookie&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;338&quot; data-filename=&quot;cookie.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/614fe0fd33744daa92cf005febfb03e7?pvs=4&quot;&gt;https://short-echidna-b16.notion.site/614fe0fd33744daa92cf005febfb03e7?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716803420215&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;방문자 수 카운트 - 쿠키활용 | Notion&quot; data-og-description=&quot;HTML 코드&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/614fe0fd33744daa92cf005febfb03e7?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/614fe0fd33744daa92cf005febfb03e7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bViLrS/hyV9WHBTUy/WKAGwYoUDKo9MscF3ZQKY1/img.png?width=2000&amp;amp;height=876&amp;amp;face=0_0_2000_876,https://scrap.kakaocdn.net/dn/d4rTjW/hyV9XmeKyG/8z7hX70kIShgsrr65nf4s0/img.png?width=2000&amp;amp;height=876&amp;amp;face=0_0_2000_876&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/614fe0fd33744daa92cf005febfb03e7?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/614fe0fd33744daa92cf005febfb03e7?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bViLrS/hyV9WHBTUy/WKAGwYoUDKo9MscF3ZQKY1/img.png?width=2000&amp;amp;height=876&amp;amp;face=0_0_2000_876,https://scrap.kakaocdn.net/dn/d4rTjW/hyV9XmeKyG/8z7hX70kIShgsrr65nf4s0/img.png?width=2000&amp;amp;height=876&amp;amp;face=0_0_2000_876');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;방문자 수 카운트 - 쿠키활용 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 코드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>cookie</category>
      <category>Date</category>
      <category>expires</category>
      <category>getcookie</category>
      <category>parseInt</category>
      <category>setTime</category>
      <category>substring</category>
      <category>Visits</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/38</guid>
      <comments>https://ted93.tistory.com/entry/%EB%B0%A9%EB%AC%B8%EC%9E%90-%EC%88%98-%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EC%BF%A0%ED%82%A4%ED%99%9C%EC%9A%A9#entry38comment</comments>
      <pubDate>Wed, 29 May 2024 15:15:02 +0900</pubDate>
    </item>
    <item>
      <title>쿠키2 (Cookie)</title>
      <link>https://ted93.tistory.com/entry/%EC%BF%A0%ED%82%A42-Cookie</link>
      <description>&lt;h1&gt;1. 쿠키 접근 및 읽기&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;document.cookie 속성을 사용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 속성은 쿠키를 세미콜론(;)으로 구분된 이름=값 쌍의 문자열로 반환&lt;/li&gt;
&lt;li&gt;특정 쿠키의 값을 읽기 위해서는 해당 문자열을 파싱&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. 쿠키 값을 가져오는 방법&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;document.cookie에서 반환된 문자열을 분석&lt;/li&gt;
&lt;li&gt;특정 쿠키의 이름을 찾아 그 값을 추출&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키 문자열 분리 :document.cookie로부터 반환된 문자열을 세미콜론을 기준으로 분리하여 개별 쿠키를 배열로 변환&lt;/li&gt;
&lt;li&gt;쿠키 파싱 : 각 쿠키 문자열을 = 기호를 사용하여 이름과 값으로 분리&lt;/li&gt;
&lt;li&gt;값 추출 : 특정 이름을 가진 쿠키의 값을 찾기&lt;/li&gt;
&lt;li&gt;사용 예제: 사용자의 'username' 쿠키 값을 검색하고 콘솔에 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1716766295234&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// document.cookie = 'username= tedBlue1; path=/;'; // 앞선 예제에서 추가 했었음
document.cookie = 'age=100; path=/;';

function getCookieValue(cookieName) {
  let cookies = document.cookie.split(';');
  for (let i = 0; i &amp;lt; cookies.length; i++) {
    let cookie = cookies[i];
    let parts = cookie.split('=');
    let name = parts[0].trim();
    if (name === cookieName) {
      return parts[1] || '';
    }
  }
  return '';
}

let username = getCookieValue('username');
let age = getCookieValue('age');
// : 쿠키를 가져올 때 내용 값이 없는 경우 null을 반환

if (username &amp;amp;&amp;amp; age) {
  console.log(`username은 ${username}`);
  console.log(`age는 ${age}`);
} else {
  console.log('해당 쿠키를 찾을 수 없습니다.');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cookie.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmjZEr/btsHDxgVLeX/DFR6lzTmr08QIRME863HKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmjZEr/btsHDxgVLeX/DFR6lzTmr08QIRME863HKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmjZEr/btsHDxgVLeX/DFR6lzTmr08QIRME863HKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmjZEr%2FbtsHDxgVLeX%2FDFR6lzTmr08QIRME863HKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;cookie&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;156&quot; data-filename=&quot;cookie.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;getCookie.png&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GUi4L/btsHB4GZfXN/c4QDs4YKF65igpDqNwxyFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GUi4L/btsHB4GZfXN/c4QDs4YKF65igpDqNwxyFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GUi4L/btsHB4GZfXN/c4QDs4YKF65igpDqNwxyFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGUi4L%2FbtsHB4GZfXN%2Fc4QDs4YKF65igpDqNwxyFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;getCookie&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;133&quot; data-filename=&quot;getCookie.png&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;3. JS 쿠키 수정 및 삭제: 쿠키 값 변경 및 만료시켜 삭제하기&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 쿠키 값 변경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키의 값을 변경하는 것은 실질적으로 새로운 값을 가진 쿠키를 같은 이름으로 다시 설정&lt;/li&gt;
&lt;li&gt;document.cookie를 사용하여 쿠키를 설정할 때 동일한 쿠키 이름에 다른 값을 지정하면 기존의 쿠키 값이 변경&lt;/li&gt;
&lt;li&gt;쿠키의 이름, 새로운 값을, 그리고 만료일을 인자로 받아 쿠키를&lt;/li&gt;
&lt;li&gt;새로운 만료 기간과 함께 쿠키를 설정하면 기존의 값을 덮어쓰고, 새로운 값과 만료일을 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;function updateCookie(name, value, daysToExpire = 1) {
  let date = new Date();
  date.setTime(date.getTime() + daysToExpire * (24 + 9) * 60 * 60 * 1000);
  let expires = `expires= ${date.toUTCString()}`;
  document.cookie = `${name} = ${value}; path=/; ${expires};`;
}

updateCookie('age', '500');
updateCookie('username', 'blueTed', 7);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 작성일 기준(2024년5월27일 오전 8시22분) 하루 뒤에 age가 만료되고(인자의 default 값이 1임)&lt;br /&gt;1주일 뒤에 username이 만료됨(인자를 7로 전달)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;updateCookie.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btL9zv/btsHD90YcoI/WUFzuHlBhwkLDpP1hYbyK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btL9zv/btsHD90YcoI/WUFzuHlBhwkLDpP1hYbyK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btL9zv/btsHD90YcoI/WUFzuHlBhwkLDpP1hYbyK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtL9zv%2FbtsHD90YcoI%2FWUFzuHlBhwkLDpP1hYbyK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;updateCookie&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;160&quot; data-filename=&quot;updateCookie.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 쿠키 만료시켜 삭제하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키를 삭제하는 공식적인 방법 X&lt;/li&gt;
&lt;li&gt;만료 날짜를 과거로 설정하여 브라우저가 쿠키를 더 이상 유효하지 않은 것으로 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function deleteCookie(name) {
  document.cookie = `${name}=; expires=Fri, 26 May 2024 00:00:00 GMT; path=/;`;
}

deleteCookie('age');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;deleteCookie.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y5OOv/btsHBM05HGP/4fr9hCllwEKfUiUt3r36I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y5OOv/btsHBM05HGP/4fr9hCllwEKfUiUt3r36I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y5OOv/btsHBM05HGP/4fr9hCllwEKfUiUt3r36I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY5OOv%2FbtsHBM05HGP%2F4fr9hCllwEKfUiUt3r36I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;deleteCookie&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;131&quot; data-filename=&quot;deleteCookie.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;노션으로 보고 싶다면?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/2-Cookie-09010051ea8f4dcc8a922608cab32cc2?pvs=4&quot;&gt;https://short-echidna-b16.notion.site/2-Cookie-09010051ea8f4dcc8a922608cab32cc2?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716803458117&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;쿠키2 (Cookie) | Notion&quot; data-og-description=&quot;목차&quot; data-og-host=&quot;short-echidna-b16.notion.site&quot; data-og-source-url=&quot;https://short-echidna-b16.notion.site/2-Cookie-09010051ea8f4dcc8a922608cab32cc2?pvs=4&quot; data-og-url=&quot;https://short-echidna-b16.notion.site/09010051ea8f4dcc8a922608cab32cc2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsBEor/hyWdhwzB0N/eNrP5hkiw4h0UGVwlKLwkK/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420,https://scrap.kakaocdn.net/dn/mq7Ym/hyV9UpsONy/h9hDOvKthS79hBIUOROEaK/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420&quot;&gt;&lt;a href=&quot;https://short-echidna-b16.notion.site/2-Cookie-09010051ea8f4dcc8a922608cab32cc2?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://short-echidna-b16.notion.site/2-Cookie-09010051ea8f4dcc8a922608cab32cc2?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsBEor/hyWdhwzB0N/eNrP5hkiw4h0UGVwlKLwkK/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420,https://scrap.kakaocdn.net/dn/mq7Ym/hyV9UpsONy/h9hDOvKthS79hBIUOROEaK/img.png?width=2000&amp;amp;height=420&amp;amp;face=0_0_2000_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;쿠키2 (Cookie) | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;short-echidna-b16.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>cookie</category>
      <category>deletecookie</category>
      <category>document.cookie</category>
      <category>getcookie</category>
      <category>updatecookie</category>
      <author>Ted93</author>
      <guid isPermaLink="true">https://ted93.tistory.com/35</guid>
      <comments>https://ted93.tistory.com/entry/%EC%BF%A0%ED%82%A42-Cookie#entry35comment</comments>
      <pubDate>Tue, 28 May 2024 09:37:14 +0900</pubDate>
    </item>
  </channel>
</rss>