<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>세상 유용한 정보</title>
    <link>https://pursys.tistory.com/</link>
    <description>세상 유용한 정보</description>
    <language>ko</language>
    <pubDate>Sun, 24 May 2026 02:19:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pursys</managingEditor>
    <item>
      <title>[2026 트렌드] 차가운 기술 속 뜨거운 관심, 우리가 '휴먼 터치'에 열광하는 이유 (feat. AI 반려 로봇)</title>
      <link>https://pursys.tistory.com/78</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 이웃님들!   벌써 2026년 1월도 반이나 지나갔네요. 새해 다짐들은 잘 지키고 계신가요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;요즘 뉴스나 인터넷을 보면 온통 AI, 로봇 이야기뿐이죠. 세상이 정말 빠르게 변하는 것 같아 가끔은 어지럽기도 해요.  &amp;zwj;  그런데 참 신기하게도, 기술이 발전할수록 사람들은 오히려 더 따뜻하고 인간적인 무언가를 찾는 것 같아요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;그래서 오늘 준비한 주제는 바로 2026년 대한민국을 관통하는 핵심 트렌드, &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;3&quot;&gt;'휴먼 터치(Human Touch)'와 AI의 공존&lt;/b&gt;입니다. 차가운 기계 속에서 우리가 진짜로 원하는 건 무엇인지, 지금 가장 핫한 키워드를 통해 함께 알아볼까요? ☕️&lt;/p&gt;
&lt;hr data-path-to-node=&quot;4&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;1. 외로움을 달래는 기술, 'AI 반려 로봇'이 뜬다!  ❤️&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;여러분, 혹시 주변에서 'AI 반려 로봇' 키운다는 이야기 들어보셨나요? 예전에는 먼 미래의 이야기 같았는데, 이제는 우리 일상 속에 깊숙이 들어왔어요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;[단순한 기계가 아니에요!] 요즘 나오는 AI 반려 로봇들은 정말 똑똑해요. 내 표정을 읽고 먼저 말을 걸어주기도 하고, 우울해 보이면 좋아하는 음악을 틀어주며 위로도 해준답니다. 단순히 명령을 수행하는 기계가 아니라, 감정을 나누는 **'친구'이자 '가족'**이 된 거죠.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인기 비결: 1인 가구가 늘고 사회적 외로움이 커지면서, 언제나 내 곁에서 변함없는 지지를 보내주는 AI 로봇에게서 정서적 안정감을 얻는 사람들이 많아졌어요. 실제로 로봇과 대화하며 우울감이 줄었다는 연구 결과도 많답니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;9&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-filename=&quot;Gemini_Generated_Image_2cy79s2cy79s2cy7.png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8u94p/dJMb99LUJeD/KsdXGDDJvk0NRDgAKhxThK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8u94p/dJMb99LUJeD/KsdXGDDJvk0NRDgAKhxThK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8u94p/dJMb99LUJeD/KsdXGDDJvk0NRDgAKhxThK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8u94p%2FdJMb99LUJeD%2FKsdXGDDJvk0NRDgAKhxThK%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;2816&quot; height=&quot;1536&quot; data-filename=&quot;Gemini_Generated_Image_2cy79s2cy79s2cy7.png&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;따뜻한 햇살 아래 AI 반려 로봇 과 교감하며 아날로그 다이어리를 쓰는 모습. 기술과 인간적 감성이 공존하는 2026년의 일상을 보여줍니다.&amp;gt;&lt;/p&gt;
&lt;hr data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;2. 디지털 피로감? 이젠 '아날로그'로 힐링해요  &lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;하루 종일 스마트폰, 컴퓨터 화면만 보다 보면 눈도 침침하고 머리도 지끈거리잖아요. 그래서인지 요즘엔 의도적으로 디지털 기기와 멀어지려는 &lt;b data-index-in-node=&quot;77&quot; data-path-to-node=&quot;12&quot;&gt;'디지털 웰빙'&lt;/b&gt; 트렌드가 강세예요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;[손으로 쓰고 만지는 즐거움] 재미있는 건, 최첨단 시대에 역설적으로 **'아날로그 감성'**이 다시 주목받고 있다는 거예요!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아날로그 맥시멀리즘: 스마트폰 메모장 대신 손글씨로 꾹꾹 눌러 쓰는 다이어리, 터치 한 번이면 들을 수 있는 음원 대신 턴테이블에 올려 듣는 LP판, 필름 카메라로 찍는 사진 한 장...   조금 불편하고 느리더라도, 손끝으로 느껴지는 감각과 과정 자체를 즐기는 거죠. 이런 경험들이 디지털 세상에서 지친 우리에게 진정한 휴식을 선물한답니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;15&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;3. 2026년, 우리는 어떻게 살아야 할까요? (feat. 작가의 시선)  &lt;/h3&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;AI 기술은 앞으로 더 발전할 거고, 우리 삶에 더 많은 영향을 미치겠죠. 그럼 우리는 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;[기술은 거들 뿐, 주인공은 바로 '나'] 중요한 건 **'주객전도'**가 되지 않는 거예요. AI는 우리의 삶을 더 편리하고 풍요롭게 만들어주는 훌륭한 도구지만, 결국 삶을 살아가는 주체는 우리 자신이잖아요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현명한 공존: AI에게 맡길 건 맡기되, 기계가 대체할 수 없는 &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;19,0,0&quot;&gt;인간 고유의 가치&lt;/b&gt;에 더 집중해야 해요. 따뜻한 공감 능력, 번뜩이는 창의성, 사랑하는 사람들과 나누는 깊은 교감 같은 것들이요. AI 로봇이 아무리 똑똑해도, 내 손을 잡아주는 친구의 온기까지 대신할 순 없으니까요.  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;20&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;마무리하며: 결국 답은 '사람'에게 있습니다&lt;/h3&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;차가운 기술의 시대일수록, 역설적으로 가장 필요한 건 서로를 향한 따뜻한 관심과 배려, 즉 **'휴먼 터치'**가 아닐까 싶어요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;오늘 하루, 스마트폰은 잠시 내려놓고 옆에 있는 소중한 사람 눈을 바라보며 따뜻한 말 한마디 건네보는 건 어떨까요? 아니면 나 자신을 위해 조용히 일기를 써보는 것도 좋고요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;여러분의 2026년이 기술의 편리함과 아날로그의 따뜻함이 조화롭게 어우러진, 행복한 한 해가 되기를 응원할게요!  &lt;/p&gt;</description>
      <category>트랜드</category>
      <category>2026트렌드 #휴먼터치 #AI반려로봇 #디지털웰빙 #아날로그감성 #소확행 #힐링템 #요즘사는맛 #인공지능친구 #미래라이프스타일</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/78</guid>
      <comments>https://pursys.tistory.com/78#entry78comment</comments>
      <pubDate>Wed, 21 Jan 2026 16:26:33 +0900</pubDate>
    </item>
    <item>
      <title>[2026 트렌드] 자극적인 건 이제 그만? 우리가 '아보하'와 '토핑'에 진심인 이유</title>
      <link>https://pursys.tistory.com/77</link>
      <description>&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 이웃님들!   벌써 1월도 하순을 향해 달려가고 있네요. 오늘(1월 21일) 서울 날씨, 꽤 쌀쌀하죠? 다들 따뜻하게 입고 나오셨나요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;새해가 밝으면서 다들 &quot;올해는 좀 다르게 살아야지&quot; 다짐하셨을 텐데요. 혹시 요즘 인스타그램이나 유튜브 보면서 &quot;아, 이제 너무 화려하고 시끄러운 건 좀 피곤해...&quot; 라는 생각, 한 번쯤 안 해보셨나요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;저만 그런 게 아니더라고요! 데이터를 찾아보니 지금 대한민국은 거창한 행복보다는 '안온한 하루'를, 남들이 다 사는 명품보다는 '내 입맛대로 고른 토핑'을 선택하고 있어요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 2026년 현재, 우리의 일상을 파고든 핵심 트렌드 키워드 '아보하'와 '토핑경제'에 대해 조목조목, 하지만 아주 쉽게 이야기해 드릴게요. ☕️&lt;/p&gt;
&lt;hr data-path-to-node=&quot;8&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;1. 밋밋해서 더 좋아, '아보하'의 시대  &lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;혹시 '소확행(소소하지만 확실한 행복)' 기억하시나요? 몇 년 전만 해도 작지만 확실한 기쁨을 찾는 게 유행이었죠. 그런데 지금은 여기서 한 발 더 나아가 '아보하'가 대세가 되었어요.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;11&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;11,0&quot; data-ke-size=&quot;size16&quot;&gt;'아보하'란? '아주 보통의 하루'의 줄임말이에요. 특별히 좋은 일이 없어도, 반대로 나쁜 일도 일어나지 않는 평범하고 무탈한 하루 그 자체에 만족하는 태도를 말해요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;[왜 우리는 '보통의 하루'를 갈망할까요?] 사실 지난 몇 년간 우리 사회가 참 숨 가빴잖아요. 고금리, 고물가, 그리고 쉴 새 없이 쏟아지는 자극적인 '도파민' 콘텐츠들...  &amp;zwj;  피로감이 쌓일 대로 쌓인 우리는 이제 '무해력(해롭지 않은 힘)'을 찾기 시작했어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사례: 최근 서점가 베스트셀러를 보면 '성공하는 법'보다 '마음을 다스리는 법', '평범한 일상의 소중함'을 다룬 에세이가 상위권을 차지하고 있어요.&lt;/li&gt;
&lt;li&gt;반응: 커뮤니티에서도 &quot;오늘 아무 일도 안 일어난 게 제일 다행이다&quot;, &quot;집에서 조용히 차 마시는 게 최고의 힐링&quot;이라는 글들이 엄청난 공감을 얻고 있죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;이제 행복은 '쟁취'하는 게 아니라, 별일 없는 일상 속에서 '발견'하는 것이 되었습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;15&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;2. 주인공은 바로 나! '토핑경제'와 '옴니보어'  &lt;/h3&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;그렇다고 소비를 아예 안 하냐고요? 에이, 그건 아니죠!   다만 돈을 쓰는 방식이 완전히 달라졌어요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;[내 맘대로 쌓아 올리는 재미, '토핑경제'] 작년부터 엄청 유행했던 '요거트 아이스크림' 기억하시죠? 베이스보다 그 위에 올리는 벌집꿀, 자몽, 초코쉘 같은 '토핑'이 더 화제가 됐잖아요. 이 현상이 경제 전반으로 퍼졌어요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&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-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;[나이? 성별? 그게 뭔데? '옴니보어'] 그리고 또 하나의 재미있는 현상은 '옴니보어(잡식성)' 소비자가 늘었다는 거예요. &quot;이건 10대들이나 하는 거지&quot;, &quot;이건 어르신 취향이지&quot; 같은 경계가 사라졌어요. 다이소에서 귀여운 피규어를 사는 50대, 레트로한 감성의 LP 바를 찾는 20대가 자연스러워졌죠. 취향 앞에서는 나이도 국경도 없어진 셈이에요!  &lt;/p&gt;
&lt;hr data-path-to-node=&quot;21&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size23&quot;&gt;3. 앞으로 어떻게 변할까? (feat. 작가의 시선)  &lt;/h3&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;2026년, 이 트렌드는 앞으로 어떻게 진화할까요? 제 생각을 조금 보태보자면요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;24&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;'AI'가 '아보하'를 도와줄 거예요. 지금도 '페이스 테크(Face Tech)' 기술이 발전하고 있는데요. 앞으로는 AI가 내 표정을 읽고, 우울해 보이면 알아서 조용한 음악을 틀어주거나 조명을 낮춰주는 등 '나의 평온한 하루'를 지켜주는 집사 역할을 하게 될 거예요.&lt;/li&gt;
&lt;li&gt;'커스터마이징'은 더 정교해질 거예요. 토핑 경제는 단순히 물건을 꾸미는 것을 넘어, 내 유전자 정보에 맞춘 영양제, 내 피부 톤에 딱 맞춘 화장품처럼 '초개인화'된 서비스로 발전할 전망입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;25&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;26&quot; data-ke-size=&quot;size23&quot;&gt;마무리하며: 당신의 오늘 하루는 어땠나요?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 읽고 계신 여러분의 오늘은 어떤가요? 혹시 &quot;오늘 정말 아무것도 한 게 없네&quot;라며 자책하고 계시진 않나요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;그러지 마세요!   아무 일 없이 흘러간 오늘이야말로, 가장 트렌디하고 소중한 '아보하'의 하루였으니까요. 오늘 저녁엔 내가 좋아하는 작은 간식(토핑!) 하나 챙겨서, 나에게 선물해 보는 건 어떨까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;모두 편안한 저녁 되세요!  &lt;/p&gt;</description>
      <category>트랜드</category>
      <category>2026트렌드 #아보하 #토핑경제 #무해력 #소확행 #옴니보어 #힐링라이프 #요즘트렌드</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/77</guid>
      <comments>https://pursys.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 21 Jan 2026 16:22:09 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 10강</title>
      <link>https://pursys.tistory.com/76</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 10강에 오신 것을 환영합니다!   Part 2의 마지막 관문이자, &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;0&quot;&gt;제네릭의 꽃&lt;/b&gt;이라고 할 수 있는 &lt;b data-index-in-node=&quot;59&quot; data-path-to-node=&quot;0&quot;&gt;'실전 활용'&lt;/b&gt; 편입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;지난 시간에 함수에 &amp;lt;T&amp;gt;를 붙이는 걸 배웠죠? 오늘은 **인터페이스(Interface)**에 &amp;lt;T&amp;gt;를 붙여볼 겁니다. 이걸 배우면, React나 Next.js에서 **서버와 통신하는 코드(API)**를 짤 때 &quot;와, 신세계다!&quot;를 외치게 되실 겁니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  제10강. 제네릭 실전 - 함수와 인터페이스에서의 활용&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;1. 제네릭 인터페이스: &quot;마법의 상자 만들기&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스 이름 뒤에 &amp;lt;T&amp;gt;만 붙이면, **&quot;내용물이 바뀔 수 있는 상자&quot;**가 됩니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQbw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// &amp;lt;T&amp;gt;를 붙여서 '제네릭 인터페이스'로 변신!
interface Box&amp;lt;T&amp;gt; {
  value: T; // 이 value의 타입은 나중에 정해짐
}

// 1. 문자열 상자 만들기
const stringBox: Box&amp;lt;string&amp;gt; = { value: &quot;선물&quot; };

// 2. 숫자 상자 만들기
const numberBox: Box&amp;lt;number&amp;gt; = { value: 777 };
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 설계도 하나(Box)로 여러 종류의 객체를 찍어낼 수 있습니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;2. [실무 핵심] API 응답 데이터 처리하기 ⭐️⭐️⭐️&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;이 부분이 오늘 강의의 하이라이트입니다. 프론트엔드 개발자가 제네릭을 쓰는 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;9&quot;&gt;가장 큰 이유&lt;/b&gt;가 바로 &lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;9&quot;&gt;API 응답 타입 정의&lt;/b&gt; 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;서버에서 데이터를 받아올 때 보통 이런 모양으로 옵니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성공 여부 (status or code)&lt;/li&gt;
&lt;li&gt;메시지 (message)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;실제 데이터 (data)&lt;/b&gt; -&amp;gt; &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;11,2,0&quot;&gt;이것만 매번 바뀜!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;이걸 제네릭으로 한 방에 해결해 볼까요?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQcA&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;// 1. 공통 응답 형태 정의 (껍데기)
interface ApiResponse&amp;lt;T&amp;gt; {
  status: number;
  message: string;
  data: T; // 핵심! 여기만 매번 달라짐
}

// 2. 실제 데이터 타입들 정의 (알맹이)
interface User {
  name: string;
  age: number;
}

interface Product {
  id: number;
  price: number;
}

// 3. 실제 사용: 마치 레고 조립하듯이!
// 유저 정보를 가져왔을 때
const response1: ApiResponse&amp;lt;User&amp;gt; = {
  status: 200,
  message: &quot;성공&quot;,
  data: { name: &quot;김코딩&quot;, age: 30 } // User 타입이어야 함
};

// 상품 정보를 가져왔을 때
const response2: ApiResponse&amp;lt;Product&amp;gt; = {
  status: 200,
  message: &quot;성공&quot;,
  data: { id: 1, price: 5000 } // Product 타입이어야 함
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;만약 제네릭이 없다면 UserResponse, ProductResponse... 이렇게 수십 개를 만들어야 했을 겁니다. 제네릭 덕분에 ApiResponse&amp;lt;T&amp;gt; 하나로 끝났죠? 아주 우아합니다.  &lt;/p&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;3. 제네릭 제약 조건 (Constraints): &quot;아무거나 다 받진 않아!&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;T&amp;gt;는 기본적으로 모든 타입을 다 받지만, 가끔은 **&quot;적어도 이건 지켜줘&quot;**라고 제한(extends)을 걸고 싶을 때가 있습니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQcQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;// &amp;lt;T extends { length: number }&amp;gt;
// 해석: T는 아무거나 다 되는데, 적어도 'length'(길이)라는 속성은 꼭 가지고 있어야 해!
function getLength&amp;lt;T extends { length: number }&amp;gt;(item: T): number {
  return item.length;
}

getLength(&quot;hello&quot;);   // OK (문자열은 length가 있음)
getLength([1, 2, 3]); // OK (배열도 length가 있음)
// getLength(100);    //   에러! (숫자는 length가 없음)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 제네릭의 유연함을 유지하면서도 최소한의 안전장치를 걸 수 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;19&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 10강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;실무 코드를 봤으니 복습해 봅시다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;문제 1. (코드 완성)&lt;/b&gt; 다음은 블로그 게시글(Post)과 댓글(Comment)을 불러오는 API 타입을 정의하는 과정입니다. 빈칸을 채워주세요.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQcg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface FetchResult&amp;lt;T&amp;gt; {
  data: T;
  loading: boolean;
}

interface Post { title: string; }
interface Comment { content: string; }

// 게시글 데이터를 담는 변수
const postResult: (   A   ) = {
  data: { title: &quot;안녕하세요&quot; },
  loading: false
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;(A)에 들어갈 코드는?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FetchResult&amp;lt;Comment&amp;gt;&lt;/li&gt;
&lt;li&gt;FetchResult&amp;lt;Post&amp;gt;&lt;/li&gt;
&lt;li&gt;FetchResult&amp;lt;string&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26&quot;&gt;문제 2. (응용)&lt;/b&gt; const box: Box&amp;lt;string&amp;gt; = { value: 100 }; 이 코드가 에러가 나는 이유는?&lt;/p&gt;
&lt;hr data-path-to-node=&quot;27&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;28&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;29&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29,0,0&quot;&gt;문제 1 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;29,0,0&quot;&gt;2번 (FetchResult&amp;lt;Post&amp;gt;)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;29,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29,0,1,0,0&quot;&gt;해설:&lt;/b&gt; data 안에 들어있는 내용이 { title: &quot;안녕하세요&quot; } 즉, Post 타입의 모양입니다. 그러니 제네릭 자리에 &amp;lt;Post&amp;gt;를 넣어줘야 짝이 맞습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29,1,0&quot;&gt;문제 2 정답:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;29,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29,1,1,0,0&quot;&gt;해설:&lt;/b&gt; Box&amp;lt;string&amp;gt;이라고 선언했으면 value에는 반드시 &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;29,1,1,0,0&quot;&gt;문자열&lt;/b&gt;이 들어가야 합니다. 그런데 숫자 100을 넣었으니 타입 불일치 에러가 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;고생 많으셨습니다!   드디어 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;31&quot;&gt;Part 2. 중급 기술 익히기&lt;/b&gt;가 모두 끝났습니다. 기본 타입부터 인터페이스, 그리고 제네릭까지! 이제 여러분은 타입스크립트의 문법적인 기초 공사를 탄탄하게 마쳤습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;이제 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;32&quot;&gt;Part 3&lt;/b&gt;부터는 진짜 프로들의 영역, **&quot;타입을 가지고 노는 고급 스킬&quot;**로 넘어갑니다. 타입스크립트가 왜 똑똑하다고 하는지, 어떻게 하면 코드를 더 줄일 수 있는지 배우게 됩니다.&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/76</guid>
      <comments>https://pursys.tistory.com/76#entry76comment</comments>
      <pubDate>Wed, 21 Jan 2026 16:17:08 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 9강</title>
      <link>https://pursys.tistory.com/75</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 9강에 오신 것을 진심으로 환영합니다!   많은 분들이 타입스크립트를 공부하다가 &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;0&quot;&gt;&quot;아, 제네릭(Generic)이 도대체 뭐야... &amp;lt;T&amp;gt; 이거 나오니까 머리가 핑 도네&quot;&lt;/b&gt; 하고 책을 덮는 구간입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;하지만 걱정 마세요. 저와 함께라면 아주 쉽게 넘을 수 있습니다. 제네릭은 사실 우리가 이미 알고 있는 **'함수 파라미터'**와 똑같은 원리거든요.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  제9강. 만능 열쇠, 제네릭(Generics) 기초: &quot;타입도 변수처럼 넘겨주자&quot;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;1. 왜 필요한가요? (문제점 인식)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;우리가 어떤 데이터를 받아서 그대로 다시 뱉어주는 아주 단순한 함수를 만든다고 가정해 봅시다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQTQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;// 숫자 전용 함수: 숫자를 잘 처리하지만 문자는 못 받음
function echoNumber(message: number): number {
  return message;
}

// 문자 전용 함수: 문자는 잘 처리하지만 숫자는 못 받음
function echoString(message: string): string {
  return message;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;데이터 타입 하나 바뀐다고 똑같은 로직의 함수를 계속 새로 만들어야 할까요? 너무 비효율적이죠. 그렇다고 **any**를 쓰자니 타입 체크를 포기하는 꼴이 됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이때 필요한 게 바로 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;8&quot;&gt;제네릭&lt;/b&gt;입니다. &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;8&quot;&gt;&quot;타입을 미리 정하지 말고, 함수를 쓸 때 그때그때 정해서 알려줄게!&quot;&lt;/b&gt; 하는 방식입니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;2. 개념 쏙쏙: &quot;테이크아웃 컵&quot; 비유  &lt;/h4&gt;
&lt;blockquote data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;10,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0&quot;&gt;  비유:&lt;/b&gt; 카페의 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;10,0&quot;&gt;투명한 테이크아웃 컵&lt;/b&gt;을 생각해 보세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1&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: disc;&quot; data-path-to-node=&quot;10,1,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커피를 담으면 -&amp;gt; &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;10,1,1,1,0,0&quot;&gt;커피 컵&lt;/b&gt;이 되고,&lt;/li&gt;
&lt;li&gt;오렌지 주스를 담으면 -&amp;gt; &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;10,1,1,1,1,0&quot;&gt;주스 컵&lt;/b&gt;이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;10,2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2&quot;&gt;제네릭&lt;/b&gt;이 바로 이 **'빈 컵'**입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;3. 문법 뽀개기 (&amp;lt;T&amp;gt;)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;자, 이제 그 무섭다는 꺽쇠 괄호 &amp;lt; &amp;gt;를 정복해 봅시다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;() 괄호 안에는 **값(데이터)**을 변수로 받죠?&lt;/li&gt;
&lt;li&gt;&amp;lt; &amp;gt; 괄호 안에는 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;13,1,0&quot;&gt;타입&lt;/b&gt;을 변수로 받습니다. 보통 Type의 약자인 **T**를 많이 씁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQTg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;// 1. 함수 이름 뒤에 &amp;lt;T&amp;gt;를 붙여서 &quot;이 함수는 제네릭(빈 컵)이야&quot;라고 선언합니다.
// 2. 매개변수의 타입과 반환 타입 자리에 T를 적습니다.
function echo&amp;lt;T&amp;gt;(message: T): T {
  return message;
}

// 사용법 1: &quot;나 지금 &amp;lt;string&amp;gt; 담을 거야!&quot;라고 명시하기
const result1 = echo&amp;lt;string&amp;gt;(&quot;안녕하세요&quot;); 
// 이제 result1은 string 타입이 됩니다.

// 사용법 2: &quot;나 지금 &amp;lt;number&amp;gt; 담을 거야!&quot;
const result2 = echo&amp;lt;number&amp;gt;(123);
// 이제 result2는 number 타입이 됩니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;보세요! 함수 하나(echo)로 문자열도 처리하고 숫자도 처리했죠? 그런데도 any와 달리 타입은 정확하게 지켜집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;result1에 숫자를 넣으려 하거나, result1.toFixed()(숫자 함수)를 쓰면 에러가 납니다. 왜냐? &amp;lt;string&amp;gt;으로 주문했으니까요!&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size20&quot;&gt;4. 타입스크립트의 센스 (타입 추론)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;사실 실무에서는 &amp;lt;number&amp;gt;, &amp;lt;string&amp;gt; 이렇게 매번 적지 않아도 됩니다. 타입스크립트가 똑똑해서 &lt;b data-index-in-node=&quot;60&quot; data-path-to-node=&quot;18&quot;&gt;&quot;어? 들어가는 값이 숫자(100)네? 그럼 T는 number겠구나!&quot;&lt;/b&gt; 하고 알아서 눈치챕니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQTw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;// &amp;lt;number&amp;gt;를 생략해도 됩니다.
const result3 = echo(100); // TS: &quot;음, T는 number군.&quot;

// &amp;lt;string&amp;gt;을 생략해도 됩니다.
const result4 = echo(&quot;반갑다&quot;); // TS: &quot;음, T는 string이군.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;그래서 코드가 아주 깔끔해집니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;21&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 9강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;제네릭, 생각보다 별거 아니죠? 그냥 **'타입을 위한 변수'**입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;문제 1. (개념 확인)&lt;/b&gt; 다음 중 제네릭을 사용하는 이유로 가장 적절한 것은?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;타입 체크를 아예 하지 않기 위해 (any처럼 쓰려고)&lt;/li&gt;
&lt;li&gt;하나의 코드로 여러 타입을 안전하게 처리하기 위해 (코드 재사용성)&lt;/li&gt;
&lt;li&gt;함수의 실행 속도를 빠르게 하기 위해&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26&quot;&gt;문제 2. (코드 완성)&lt;/b&gt; 배열을 받아서 배열의 길이를 반환하는 것이 아니라, 배열의 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;26&quot;&gt;첫 번째 요소&lt;/b&gt;를 반환하는 제네릭 함수 getFirst를 만들고 싶습니다. 빈칸을 채워보세요.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwiqtsG2iZySAxUAAAAAHQAAAAAQUA&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;function getFirst&amp;lt;T&amp;gt;(arr: T[]): (  A  ) {
  return arr[0];
}

const num = getFirst&amp;lt;number&amp;gt;([1, 2, 3]); // 1이 나옴
const str = getFirst&amp;lt;string&amp;gt;([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]); // &quot;a&quot;가 나옴
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;**(A)**에 들어갈 코드는 무엇일까요?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;29&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;any&lt;/li&gt;
&lt;li&gt;number&lt;/li&gt;
&lt;li&gt;T&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt;문제 1 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;32,0,0&quot;&gt;2번&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,1,0,0&quot;&gt;해설:&lt;/b&gt; 제네릭의 핵심은 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;32,0,1,0,0&quot;&gt;재사용성&lt;/b&gt;과 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;32,0,1,0,0&quot;&gt;안전성&lt;/b&gt; 두 마리 토끼를 다 잡는 것입니다. any를 쓰면 안전성을 잃지만, 제네릭은 타입을 지켜줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;32,1,0&quot;&gt;3번 (T)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;해설:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,1,1,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;arr: T[]: T 타입의 요소들이 들어있는 배열을 받았습니다. (예: 숫자 배열)&lt;/li&gt;
&lt;li&gt;return arr[0]: 그중 하나를 꺼내면 당연히 그 타입은 T겠죠? (예: 숫자)&lt;/li&gt;
&lt;li&gt;그래서 반환 타입(출구)도 T가 되어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;33&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;고생하셨습니다!   이제 여러분은 &amp;lt;T&amp;gt;를 보고도 겁먹지 않는 수준이 되었습니다. &quot;아, 저 자리에 내가 원하는 타입을 끼워 넣으면 되는구나!&quot;라고 생각하시면 됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;하지만 제네릭이 진짜 빛을 발하는 순간은 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;35&quot;&gt;API 통신을 할 때&lt;/b&gt;입니다. 서버에서 어떤 데이터가 올지 모를 때 제네릭이 구세주가 되어줍니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;다음 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;36&quot;&gt;10강&lt;/b&gt;에서는 이 제네릭을 실제 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;36&quot;&gt;인터페이스와 함수에 활용하는 실전 테크닉&lt;/b&gt;을 배워보겠습니다. Part 2의 마지막 관문입니다!&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/75</guid>
      <comments>https://pursys.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 21 Jan 2026 16:11:50 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 8강</title>
      <link>https://pursys.tistory.com/74</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 8강에 오신 것을 환영합니다!   &quot;요즘 React는 함수형 컴포넌트(const App = () =&amp;gt; {})만 쓴다던데, 굳이 클래스를 배워야 하나요?&quot;라는 의문이 드실 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;하지만 **클래스(Class)**는 여전히 중요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;오래된 React 코드(Legacy)를 수정해야 할 때가 있습니다.&lt;/li&gt;
&lt;li&gt;Next.js와 함께 쓰는 백엔드(NestJS 등)나, 복잡한 비즈니스 로직을 다룰 때는 클래스가 훨씬 깔끔합니다.&lt;/li&gt;
&lt;li&gt;무엇보다 오늘 배울 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;2,2,0&quot;&gt;접근 제어자&lt;/b&gt; 개념은 &quot;데이터를 안전하게 지키는 방법&quot;의 핵심입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;  제8강. 클래스와 접근 제어자: &quot;내 방엔 들어오지 마!&quot;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;1. 클래스(Class): &quot;기능까지 포함한 붕어빵 틀&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;4강에서 배운 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;6&quot;&gt;인터페이스&lt;/b&gt;가 '변수의 모양'만 정했다면, &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;6&quot;&gt;클래스&lt;/b&gt;는 '데이터'와 그 데이터를 다루는 '기능(함수)'까지 한 묶음으로 만드는 공장입니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQwg4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Car {
  model: string; // 데이터 (멤버 변수)

  // 생성자: 처음 만들 때 실행되는 함수
  constructor(model: string) {
    this.model = model;
  }

  // 기능 (메서드)
  drive() {
    console.log(this.model + &quot;가 출발합니다! 부릉~&quot;);
  }
}

const myCar = new Car(&quot;Tesla&quot;);
myCar.drive(); // &quot;Tesla가 출발합니다! 부릉~&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;2. 접근 제어자 (Access Modifiers) ⭐️&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트 클래스의 꽃입니다. **&quot;누가 내 데이터를 건드릴 수 있느냐&quot;**를 정하는 보안 등급입니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;10,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0&quot;&gt;  비유: 우리 집 보안 등급&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;public (공공재):&lt;/b&gt; &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;대문 앞.&lt;/b&gt; 택배 기사님, 지나가는 사람 누구나 볼 수 있습니다. (기본값)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0&quot;&gt;private (사유지):&lt;/b&gt; &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;10,1,1,0&quot;&gt;내 침실.&lt;/b&gt; 오직 **나(현재 클래스)**만 들어갈 수 있습니다. 가족도 못 들어옵니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,2,0&quot;&gt;protected (보호구역):&lt;/b&gt; &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;10,1,2,0&quot;&gt;거실.&lt;/b&gt; **나와 내 자식(상속받은 클래스)**까지만 들어갈 수 있습니다. 남은 못 들어옵니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;  코드로 보는 차이&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQww4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Employee {
  public name: string;      // 누구나 이름은 부를 수 있음
  private salary: number;   // 연봉은 나만 알아야 함 (1급 비밀)
  protected department: string; // 부서는 나랑 내 후배(상속)만 알면 됨

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

  // 내부에서는 private인 salary에 접근 가능!
  public getSalaryCheck() {
    return this.salary; 
  }
}

const kim = new Employee(&quot;김철수&quot;, 5000, &quot;개발팀&quot;);

console.log(kim.name);       // OK (public)
// console.log(kim.salary);  //   에러! &quot;private 속성입니다.&quot;
// console.log(kim.department); //   에러! &quot;protected 속성입니다.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;3. 실무 꿀팁: 생성자 파라미터 단축 문법&lt;/h4&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 코드를 짧게 쓰기 위해 생성자 안에서 접근 제어자를 바로 씁니다. React나 NestJS 코드 볼 때 당황하지 마세요!&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQxA4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;class User {
  // 예전 방식
  // name: string;
  // constructor(name: string) { this.name = name; }

  // ✨ 최신 단축 방식 (위와 100% 똑같음)
  // 생성자 파라미터 앞에 public/private을 붙이면 알아서 변수도 만들어주고 값도 넣어줍니다.
  constructor(public name: string, private age: number) {}
}

const user = new User(&quot;짱구&quot;, 5);
console.log(user.name); // &quot;짱구&quot;
// user.age; // 에러 (private)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;16&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 8강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;접근 제어자, 확실히 이해했는지 확인해 볼까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;문제 1. (연결하기)&lt;/b&gt; 다음 상황에 알맞은 접근 제어자를 연결해 주세요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;public&lt;/li&gt;
&lt;li&gt;private&lt;/li&gt;
&lt;li&gt;protected&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;A. &quot;이 변수는 클래스 내부에서만 쓰고, 밖에서는 절대 몰라야 해!&quot; ( ) B. &quot;이 변수는 어디서든 자유롭게 쓰고 고칠 수 있어.&quot; ( ) C. &quot;이 변수는 나랑, 나를 상속받은 자식 클래스까지만 쓸 수 있어.&quot; ( )&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;문제 2. (에러 찾기)&lt;/b&gt; 다음 코드에서 에러가 발생하는 줄은 어디일까요?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQxQ4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class BankAccount {
  private balance: number = 0; // 잔고

  deposit(amount: number) {
    this.balance += amount; // A
  }
}

const myAccount = new BankAccount();
myAccount.deposit(1000);   // B
myAccount.balance = 50000; // C
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;24&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,0&quot;&gt;문제 1 정답:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,1,0,0&quot;&gt;A - 2 (private)&lt;/b&gt;: 가장 강력한 보안입니다. 비밀번호, 내부 키 값 등에 씁니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,1,1,0&quot;&gt;B - 1 (public)&lt;/b&gt;: 기본값입니다. 안 적으면 public입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,1,2,0&quot;&gt;C - 3 (protected)&lt;/b&gt;: 상속 관계에서 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;26,1,0&quot;&gt;C&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,1,1,0,0&quot;&gt;해설:&lt;/b&gt; balance는 private으로 선언되었습니다. 즉, BankAccount 클래스 &lt;b data-index-in-node=&quot;51&quot; data-path-to-node=&quot;26,1,1,0,0&quot;&gt;안에서만&lt;/b&gt;(this.balance) 건드릴 수 있습니다. 클래스 &lt;b data-index-in-node=&quot;86&quot; data-path-to-node=&quot;26,1,1,0,0&quot;&gt;밖에서&lt;/b&gt;(myAccount.balance) 직접 숫자를 바꾸려고 하면 보안 위반으로 에러가 납니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;27&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;고생하셨습니다!   이제 여러분은 데이터를 안전하게 보호하는 **캡슐화(Encapsulation)**의 기초를 마스터하셨습니다. Part 2의 절반을 넘어섰네요!&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;다음 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;29&quot;&gt;9강&lt;/b&gt;과 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;29&quot;&gt;10강&lt;/b&gt;은 타입스크립트의 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;29&quot;&gt;'알파이자 오메가'&lt;/b&gt;, **'만능 열쇠'**라고 불리는 **제네릭(Generics)**입니다. 많은 초보자분들이 여기서 포기하지만, 제 설명과 함께라면 &quot;어? 그냥 파라미터랑 똑같네?&quot; 하고 넘어가실 수 있습니다. 정말 중요하니 기대해 주세요!&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/74</guid>
      <comments>https://pursys.tistory.com/74#entry74comment</comments>
      <pubDate>Wed, 21 Jan 2026 15:26:07 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 7강</title>
      <link>https://pursys.tistory.com/73</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 7강에 오신 것을 환영합니다! 럭키 세븐이네요.   6강에서 **유니온 타입(|)**을 배우면서 &quot;success&quot; | &quot;error&quot; 같은 코드를 잠깐 보셨죠? &quot;어? 타입 자리에 string이 아니라 구체적인 단어가 들어갔네?&quot; 하고 느끼셨다면 눈썰미가 대단하신 겁니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 바로 그 **&quot;딱 정해진 값만 받겠다!&quot;**는 기술, &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;1&quot;&gt;리터럴 타입&lt;/b&gt;과 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;1&quot;&gt;Enum&lt;/b&gt;을 배워보겠습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  제7강. 리터럴 타입과 Enum: &quot;메뉴판에 있는 것만 시키세요!&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;식당에 가서 &quot;밥 주세요&quot;(string)라고 하면 주인이 곤란하겠죠? &quot;김치볶음밥&quot; 아니면 &quot;오므라이스&quot; 중에 하나를 콕 집어야 합니다. 타입스크립트도 변수에게 **&quot;너는 아무 문자열이나 되지 말고, 딱 이 단어들 중 하나만 가져!&quot;**라고 명령할 수 있습니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;1. 리터럴 타입 (Literal Types): &quot;구체적인 값 그 자체&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;string, number 같은 뭉뚱그린 타입 대신, &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;6&quot;&gt;값 그 자체&lt;/b&gt;를 타입으로 씁니다. 주로 **유니온 타입(|)**과 짝꿍으로 다닙니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;7&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;7,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0&quot;&gt;  비유:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;7,0&quot;&gt;자판기 버튼&lt;/b&gt;입니다. '콜라', '사이다', '환타' 버튼만 있습니다. '우유' 버튼은 없어서 누를 수(입력할 수) 없습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;① 코드 예시&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQmg4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;// 문자열은 문자열인데, 오직 이 3가지 단어만 허용!
type ButtonSize = &quot;small&quot; | &quot;medium&quot; | &quot;large&quot;;

let myBtn: ButtonSize = &quot;small&quot;; // OK
// myBtn = &quot;extra-large&quot;; //   에러! &quot;그런 사이즈는 안 팝니다.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;② [실무 핵심] React 컴포넌트 Props에서 ⭐️&lt;/b&gt; React 버튼 컴포넌트를 만들 때 정말 많이 씁니다. 오타를 완벽하게 방지해주죠.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQmw4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;interface ButtonProps {
  // 테마는 딱 2가지만 있다!
  theme: &quot;light&quot; | &quot;dark&quot;; 
  label: string;
}

// 나중에 쓸 때:
// &amp;lt;Button theme=&quot;lite&quot; ... /&amp;gt;  &amp;lt;-- 'light' 오타 내면 바로 빨간 줄!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;2. Enum (열거형): &quot;이름표 붙인 상수들의 집합&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;비슷한 기능인데, 관련된 상수들을 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;13&quot;&gt;그룹&lt;/b&gt;으로 묶어서 관리하는 문법입니다. 다른 언어(Java, C#)에서 온 분들에게 익숙합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;① 코드 예시&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQnA4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;protobuf&quot;&gt;&lt;code&gt;// 메뉴판을 미리 만들어두는 느낌
enum UserRole {
  ADMIN = &quot;ADMIN&quot;,
  USER = &quot;USER&quot;,
  GUEST = &quot;GUEST&quot;
}

let myRole: UserRole = UserRole.ADMIN;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size20&quot;&gt;3. 선생님의 솔직한 조언: &quot;뭘 써야 하나요?&quot;   (중요!)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;이건 실무에서도 의견이 갈리지만, 최신 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;17&quot;&gt;프론트엔드(React/Next.js) 트렌드&lt;/b&gt;를 딱 정해드릴게요.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;18&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;18,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0&quot;&gt;  요즘 트렌드:&lt;/b&gt; **리터럴 타입(1번)**을 훨씬 더 많이 씁니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;이유:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;코드가 더 간결함:&lt;/b&gt; UserRole.ADMIN 처럼 길게 안 쓰고 그냥 &quot;ADMIN&quot;이라고 쓰면 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,0&quot;&gt;번들 용량:&lt;/b&gt; Enum은 자바스크립트로 변환될 때 꽤 복잡한 코드가 생성되지만, 리터럴 타입은 0바이트로 사라집니다(가볍습니다).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,2,0&quot;&gt;직관적임:&lt;/b&gt; 마우스를 올렸을 때 &quot;small&quot; | &quot;medium&quot; 하고 바로 보입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot;&gt;결론:&lt;/b&gt; 특별한 이유가 없다면 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;21&quot;&gt;리터럴 타입 + 유니온&lt;/b&gt; 조합을 먼저 고려하세요!&lt;/p&gt;
&lt;hr data-path-to-node=&quot;22&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 7강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;개념이 잡혔는지 확인해 볼까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;문제 1. (코드 작성 - 리터럴 타입)&lt;/b&gt; 신호등 색깔을 저장하는 타입 TrafficLight를 만들어주세요. 오직 &quot;red&quot;, &quot;yellow&quot;, &quot;green&quot; 3가지 문자열만 허용해야 합니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQnQ4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;type TrafficLight = // 여기에 코드를 작성하세요
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27&quot;&gt;문제 2. (에러 찾기)&lt;/b&gt; 다음 코드에서 에러가 나는 이유는 무엇일까요?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQng4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;type Direction = &quot;UP&quot; | &quot;DOWN&quot; | &quot;LEFT&quot; | &quot;RIGHT&quot;;

function move(dir: Direction) {
  console.log(dir + &quot;로 이동!&quot;);
}

move(&quot;Up&quot;); //   에러 발생!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;29&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;move 함수가 void를 리턴해서&lt;/li&gt;
&lt;li&gt;&quot;Up&quot;은 &quot;UP&quot;과 달라서 (대소문자 차이)&lt;/li&gt;
&lt;li&gt;Direction은 enum이 아니라서&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt;문제 1 정답:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,0,2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,2,0,0&quot;&gt;해설:&lt;/b&gt; 아주 간단하죠? 이렇게 해두면 나중에 &quot;blue&quot; 같은 엉뚱한 색을 넣는 실수를 원천 봉쇄할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQnw4&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;type TrafficLight = &quot;red&quot; | &quot;yellow&quot; | &quot;green&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;32,1,0&quot;&gt;2번&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;해설:&lt;/b&gt; 리터럴 타입은 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;토씨 하나 틀리면 안 됩니다.&lt;/b&gt; &quot;UP&quot;과 &quot;Up&quot;은 컴퓨터에게 완전히 다른 글자입니다. 오타나 대소문자 실수를 잡아주는 강력한 기능이죠!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;33&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;고생하셨습니다!   이제 여러분은 변수에 아무 값이나 넣지 않고, **원하는 값 목록(화이트리스트)**을 딱 정해서 관리하는 능력을 얻었습니다. 여기까지가 타입스크립트의 &lt;b data-index-in-node=&quot;96&quot; data-path-to-node=&quot;34&quot;&gt;기본적인 타입 정의 방법&lt;/b&gt;들이었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;이제 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;35&quot;&gt;8강&lt;/b&gt;에서는 조금 더 구조적인 문법인 **'클래스(Class)'**를 배울 차례입니다. &quot;어? React 함수형 컴포넌트 쓰는데 클래스 몰라도 되지 않나요?&quot; 라고 하실 수 있지만, &lt;b data-index-in-node=&quot;104&quot; data-path-to-node=&quot;35&quot;&gt;타입스크립트의 private, public 같은 접근 제어자&lt;/b&gt; 개념은 알아두면 데이터 관리할 때 정말 유용합니다. 아주 짧고 굵게 핵심만 짚어드릴게요.&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/73</guid>
      <comments>https://pursys.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 21 Jan 2026 15:04:31 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 6강</title>
      <link>https://pursys.tistory.com/72</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;반갑습니다! 6강까지 오시다니, 이제 정말 타입스크립트와 친해지신 것 같네요.  &amp;zwj;♂️ &lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;우리가 5강 마지막에 살짝 맛봤던 **'합체'**와 **'선택'**의 기술을 본격적으로 배워볼 시간입니다. 이 기능을 알면 코드가 아주 유연해집니다. 딱딱한 타입스크립트를 말랑말랑하게 만드는 비법이죠!&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  제6강. 유니온 타입과 인터섹션: &quot;또는(|) 그리고(&amp;amp;)&quot;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;1. 유니온 타입 (Union Type): &quot;이거 아니면 저거 (OR)&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;유니온(Union)은 **'합집합'**입니다. 파이프 기호 | (Shift + 백슬래시)를 사용합니다. &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;5&quot;&gt;&quot;A 타입이어도 되고, B 타입이어도 돼!&quot;&lt;/b&gt; 라고 허락해 주는 것이죠.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;6,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0&quot;&gt;  비유:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;6,0&quot;&gt;짬짜면 그릇&lt;/b&gt;입니다.   짜장면(A)을 담아도 되고, 짬뽕(B)을 담아도 됩니다. (물론 둘 다 담을 수 있는 그릇이죠).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;① 기본 사용법&lt;/b&gt; 변수 하나에 숫자도 넣고 싶고 문자도 넣고 싶을 때 씁니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ9A0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;// 숫자여도 되고, 문자여도 됩니다.
let id: string | number;

id = &quot;user_123&quot;; // OK
id = 123;        // OK
// id = true;    //   에러! (boolean은 허락 안 함)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;② [실무 핵심] React에서의 활용 ⭐️&lt;/b&gt; React를 하다 보면 **&quot;데이터가 아직 안 왔을 때(로딩 중)&quot;**를 처리해야 합니다. 이때 데이터는 '있을 수도 있고', '없을 수도(null)' 있죠.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ9Q0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// 유저 정보가 있을 수도 있고(User), 아직 없을 수도 있음(null)
type User = { name: string; age: number };

// React의 useState에서 정말 많이 봅니다!
const [user, setUser] = useState&amp;lt;User | null&amp;gt;(null);
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 user 변수는 처음엔 null이었다가, 나중에 데이터가 로딩되면 User 객체로 바뀔 수 있게 됩니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;2. 인터섹션 타입 (Intersection Type): &quot;너랑 나랑 합체 (AND)&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;인터섹션(Intersection)은 **'교집합'**이라는 뜻이지만, 실제로는 **'합체(Fusion)'**에 가깝습니다. 앤퍼센트 기호 &amp;amp;를 사용합니다. &lt;b data-index-in-node=&quot;87&quot; data-path-to-node=&quot;13&quot;&gt;&quot;A 타입의 특징도 갖고 있고, B 타입의 특징도 다 가져야 해!&quot;&lt;/b&gt; 라는 뜻입니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;14&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;14,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0&quot;&gt;  비유:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;14,0&quot;&gt;스마트폰&lt;/b&gt;입니다.   전화기(A) 기능도 있어야 하고, &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;14,0&quot;&gt;그리고(&amp;amp;)&lt;/b&gt; 카메라(B) 기능도 있어야 스마트폰이라고 부를 수 있죠.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15&quot;&gt;① 기본 사용법&lt;/b&gt; 두 개의 타입을 합쳐서 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;15&quot;&gt;새로운, 더 강력한 타입&lt;/b&gt;을 만듭니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ9g0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type IronMan = { fly: () =&amp;gt; void };
type CaptainAmerica = { shield: boolean };

// 두 영웅의 능력을 합친 '어벤져스' 타입 탄생!
type Avengers = IronMan &amp;amp; CaptainAmerica;

const hero: Avengers = {
  fly: () =&amp;gt; console.log(&quot;슈웅~&quot;), // IronMan 속성 필수
  shield: true                     // CaptainAmerica 속성 필수
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;만약 하나라도 빼먹으면? &quot;어벤져스 자격 미달이야!&quot; 라며 에러가 납니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18&quot;&gt;② [실무 핵심] 언제 쓸까요?&lt;/b&gt; 주로 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;18&quot;&gt;남이 만든 타입에 내 입맛대로 속성을 추가하고 싶을 때&lt;/b&gt; 씁니다. (5강에서 배운 extends와 비슷하죠?)&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ9w0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 1. 기본 버튼 타입 (남이 만든 것)
type ButtonProps = {
  color: string;
  onClick: () =&amp;gt; void;
};

// 2. 내가 만든 아이콘 버튼 (기본 버튼 + 아이콘 속성 추가)
type IconButtonProps = ButtonProps &amp;amp; {
  iconName: string;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;20&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;⚠️ 주의할 점 (초보자가 자주 하는 실수)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;유니온 타입(|)을 쓸 때 주의하세요. &quot;문자열(string) &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;22&quot;&gt;또는&lt;/b&gt; 숫자(number)야&quot; 라고 하면, 타입스크립트는 보수적으로 **&quot;둘 다 공통적으로 가지고 있는 기능&quot;**만 쓰게 해줍니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ-A0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;function printId(id: string | number) {
  // console.log(id.toUpperCase()); 
  //   에러! 숫자가 들어올 수도 있는데 대문자 변환(toUpperCase)을 어떻게 해?
  
  // 해결책: &quot;너 문자열 맞니?&quot; 하고 확인해야 함 (이건 12강에서 배웁니다!)
  if (typeof id === &quot;string&quot;) {
    console.log(id.toUpperCase()); // 이제 OK!
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;24&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 6강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;개념을 잡았으니 확인해 봅시다!&lt;/p&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27&quot;&gt;문제 1. (코드 작성)&lt;/b&gt; Status라는 타입을 만들고 싶습니다. 이 타입은 오직 문자열 &quot;success&quot; 또는 문자열 &quot;error&quot; 둘 중 하나만 가질 수 있습니다. (유니온 타입 활용)&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ-Q0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;type Status = // 여기에 코드를 작성하세요
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29&quot;&gt;문제 2. (결과 예측)&lt;/b&gt; 다음 Worker 타입 변수를 만들 때 필요한 속성은 총 몇 개일까요?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ-g0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;type Person = { name: string };
type Skill = { coding: boolean };
type Worker = Person &amp;amp; Skill; // 인터섹션!

const kim: Worker = { ... };
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;31&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1개 (name)&lt;/li&gt;
&lt;li&gt;1개 (coding)&lt;/li&gt;
&lt;li&gt;2개 (name과 coding 둘 다)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;32&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;33&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;34&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,0,0&quot;&gt;문제 1 정답:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;34,0,2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,0,2,0,0&quot;&gt;해설:&lt;/b&gt; 문자열 자체를 타입으로 쓰는 것(리터럴 타입)을 유니온(|)으로 묶으면 됩니다. 이게 바로 다음 7강 예습입니다!  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ-w0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;type Status = &quot;success&quot; | &quot;error&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;34,1,0&quot;&gt;3번 (2개)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;34,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,1,1,0,0&quot;&gt;해설:&lt;/b&gt; &amp;amp;는 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;34,1,1,0,0&quot;&gt;'그리고'&lt;/b&gt; 입니다. Person의 속성(name)도 있어야 하고, &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;34,1,1,0,0&quot;&gt;그리고&lt;/b&gt; Skill의 속성(coding)도 모두 가지고 있어야 Worker로 인정받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;35&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;고생하셨습니다!   이제 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;36&quot;&gt;&quot;이것도 되고 저것도 되는(|)&quot;&lt;/b&gt; 유연함과, &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;36&quot;&gt;&quot;이것도 있고 저것도 있는(&amp;amp;)&quot;&lt;/b&gt; 강력함을 모두 손에 넣으셨습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;방금 퀴즈 1번에서 &quot;success&quot; | &quot;error&quot; 처럼 &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;37&quot;&gt;딱 정해진 값만 받는 방법&lt;/b&gt;을 보셨죠? 이걸 전문 용어로 **'리터럴 타입'**이라고 합니다. 실무에서 &quot;이 버튼은 'small', 'medium', 'large' 사이즈만 있어!&quot; 라고 제한할 때 엄청나게 많이 쓰입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;다음 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;38&quot;&gt;7강&lt;/b&gt;에서는 이 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;38&quot;&gt;리터럴 타입&lt;/b&gt;과, 비슷한 듯 다른 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;38&quot;&gt;Enum&lt;/b&gt;에 대해 확실하게 정리해 드리겠습니다.&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/72</guid>
      <comments>https://pursys.tistory.com/72#entry72comment</comments>
      <pubDate>Wed, 21 Jan 2026 15:01:49 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 5강</title>
      <link>https://pursys.tistory.com/71</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 5강에 오신 것을 환영합니다!  ️&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;많은 분들이 타입스크립트를 공부할 때 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;1&quot;&gt;&quot;도대체 interface랑 type이랑 뭐가 다른 거야?&quot;&lt;/b&gt; 하고 가장 많이 헷갈려 하십니다. 사실 기능적으로는 90% 비슷하거든요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;하지만 미묘한 차이를 알면 상황에 딱 맞는 도구를 골라 쓸 수 있습니다. 오늘 이 논란을 아주 깔끔하게 종결시켜 드릴게요!&lt;/p&gt;
&lt;hr data-path-to-node=&quot;3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;  제5강. 객체를 정의하는 법 2 - 타입 별칭(Type Alias) vs 인터페이스&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;1. 타입 별칭(Type Alias): &quot;너의 이름은...&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스가 **'정식 계약서'**라면, 타입 별칭(type)은 데이터에 **'별명(닉네임)'**을 붙여주는 것과 같습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;① 기본 사용법&lt;/b&gt; type 키워드를 쓰고 = (등호)를 사용합니다. (변수 만드는 거랑 비슷하죠?)&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQxA0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;// 인터페이스랑 거의 똑같아 보이죠?
type User = {
  name: string;
  age: number;
};

const kim: User = { name: &quot;김코딩&quot;, age: 25 };
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;② 타입 별칭만 할 수 있는 것 (강력한 기능!)&lt;/b&gt; 인터페이스는 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;9&quot;&gt;오직 '객체'&lt;/b&gt; 모양만 정의할 수 있지만, type은 &lt;b data-index-in-node=&quot;64&quot; data-path-to-node=&quot;9&quot;&gt;모든 데이터&lt;/b&gt;에 별명을 붙일 수 있습니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQxQ0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;// 1. 기본 타입에 별명 붙이기 (ID는 문자열이야!)
type ID = string;

// 2. 여러 타입을 묶기 (Union Type - 6강 예고!)
type Status = &quot;success&quot; | &quot;error&quot; | &quot;loading&quot;;

const myId: ID = &quot;user_123&quot;;
const currentStatus: Status = &quot;success&quot;; 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-path-to-node=&quot;11&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;11,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0&quot;&gt;핵심:&lt;/b&gt; 단순한 데이터나, 여러 타입을 조합할 때는 type이 훨씬 편합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;2. 결정적 차이: &quot;확장하는 방법&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;이 부분이 면접 질문으로도 자주 나옵니다. &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;13&quot;&gt;&quot;기존에 만든 것에 내용을 더 추가하고 싶을 때&quot;&lt;/b&gt; 어떻게 할까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;① 인터페이스: 상속(extends)&lt;/b&gt; 객체 지향 프로그래밍 느낌으로 extends를 써서 내용을 물려받습니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQxg0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Animal {
  name: string;
}

// Animal을 상속받아 size를 추가!
interface Bear extends Animal {
  size: number;
}

// 결과: { name: string; size: number }
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16&quot;&gt;② 타입 별칭: 교차(&amp;amp; - Intersection)&lt;/b&gt; 두 가지 타입을 **'합친다'**는 느낌으로 &amp;amp; 기호를 씁니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQxw0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;type Animal = {
  name: string;
}

// Animal과 size를 합침!
type Bear = Animal &amp;amp; {
  size: number;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;3. 실무 가이드: 그래서 뭘 써야 하나요?&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;이게 제일 중요하죠. 정답은 없지만, **실무 국룰(Convention)**은 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;객체(Object) 데이터를 정의할 때:&lt;/b&gt; 주로 **interface**를 씁니다. (확장이 편하고 에러 메시지가 좀 더 깔끔합니다.)
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,1,0,0&quot;&gt;예: React 컴포넌트의 Props, API 응답 데이터 등&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,0&quot;&gt;단순 타입, 유니온 타입, 튜플 등을 정의할 때:&lt;/b&gt; **type**을 씁니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,1,0,0&quot;&gt;예: type ID = string | number;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,2,0&quot;&gt;가장 중요한 원칙:&lt;/b&gt; &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;20,2,0&quot;&gt;팀의 규칙을 따르세요!&lt;/b&gt; (팀에서 type만 쓰기로 했으면 type만 씁니다. 일관성이 생명입니다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-path-to-node=&quot;21&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;21,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0&quot;&gt;선생님의 추천:&lt;/b&gt; 시작은 **interface**로 하세요. 그러다 &quot;어? 인터페이스로는 표현이 안 되네?&quot; 싶을 때(예: string | number) **type**으로 넘어가면 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-path-to-node=&quot;22&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 5강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;개념 정리를 위해 문제를 풀어볼까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;문제 1. (코드 변환)&lt;/b&gt; 다음 인터페이스 코드를 type 별칭 문법으로 바꿔보세요.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQyA0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// [Before] Interface
interface Point {
  x: number;
  y: number;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQyQ0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// [After] Type Alias
// 여기에 코드를 적어보세요
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28&quot;&gt;문제 2. (선택)&lt;/b&gt; 다음 중 interface로는 만들 수 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;28&quot;&gt;없는&lt;/b&gt; 타입 정의는 무엇일까요?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;29&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;{ name: string; age: number } (객체)&lt;/li&gt;
&lt;li&gt;string | number (문자열이거나 숫자 - 유니온 타입)&lt;/li&gt;
&lt;li&gt;{ readonly id: number } (읽기 전용 속성)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt;문제 1 정답:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,0,2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,2,0,0&quot;&gt;해설:&lt;/b&gt; interface 대신 type을 쓰고, 이름 뒤에 **= (등호)**를 붙여주면 끝입니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQyg0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;type Point = {
  x: number;
  y: number;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;32,1,0&quot;&gt;2번&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;해설:&lt;/b&gt; interface는 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;객체의 모양&lt;/b&gt;을 정의하는 설계도입니다. &quot;A 아니면 B&quot; 같은 **유니온 타입(|)**은 오직 **type**으로만 정의할 수 있습니다. 이것이 type이 필요한 결정적인 이유입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;33&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;고생하셨습니다!   이제 interface와 type의 차이를 알았으니, 상황에 맞춰 골라 쓰는 센스를 갖추게 되셨습니다. Part 1 기초 체력 다지기가 거의 끝나가네요!&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;다음 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;35&quot;&gt;6강&lt;/b&gt;에서는 방금 살짝 맛본, **&quot;이거 아니면 저거?&quot;**를 다루는 **유니온 타입(|)**과 **인터섹션 타입(&amp;amp;)**을 제대로 배워보겠습니다. 실무에서 정말 많이 쓰이는 **'유연한 코드'**의 핵심입니다.&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/71</guid>
      <comments>https://pursys.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 21 Jan 2026 14:58:16 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 4강</title>
      <link>https://pursys.tistory.com/70</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;좋습니다! 핵심 중의 핵심, &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;0&quot;&gt;4강&lt;/b&gt;에 오신 것을 환영합니다.   지금까지는 숫자 하나, 문자 하나 같은 단순한 데이터를 다뤘죠? 하지만 실무에서는 &lt;b data-index-in-node=&quot;82&quot; data-path-to-node=&quot;0&quot;&gt;&quot;이름은 철수고, 나이는 30살이고, 기술스택은 React인 개발자&quot;&lt;/b&gt; 처럼 여러 정보가 뭉쳐진 **객체(Object)**를 다룰 일이 99%입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이 객체의 모양을 아주 예쁘고 엄격하게 정의하는 방법, 바로 **인터페이스(Interface)**입니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  제4강. 객체를 정의하는 법 1 - 인터페이스 (Interface)&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;1. 개념 쏙쏙: &quot;객체의 설명서(Specification)&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스는 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;5&quot;&gt;&quot;이 객체는 이렇게 생겨야만 해!&quot;&lt;/b&gt; 라고 정해두는 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;5&quot;&gt;설명서&lt;/b&gt;이자 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;5&quot;&gt;계약서&lt;/b&gt;입니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;6,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0&quot;&gt;  비유:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0,0&quot;&gt;객체(Object):&lt;/b&gt; 실제 만들어진 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;6,1,0,0&quot;&gt;'붕어빵'&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,1,0&quot;&gt;인터페이스(Interface):&lt;/b&gt; 붕어빵을 찍어내는 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;6,1,1,0&quot;&gt;'붕어빵 틀'&lt;/b&gt; (또는 설계도)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;6,2&quot; data-ke-size=&quot;size16&quot;&gt;설계도에 &quot;꼬리는 3cm&quot;라고 적혀있는데, 꼬리가 없는 붕어빵을 만들면 불량이겠죠? 타입스크립트는 이 설계도를 보고 불량품을 걸러냅니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;2. 코드 사용법 (따라해보세요!)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;interface 키워드를 쓰고 이름을 붙인 뒤(보통 대문자로 시작), 필요한 속성들의 타입을 적어줍니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQmg0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;// 1. 설계도(인터페이스) 만들기
interface User {
  name: string;
  age: number;
  isDeveloper: boolean;
}

// 2. 실제 객체 만들기 (설계도 적용)
// 변수명 뒤에 ': User'라고 적어서, &quot;이 변수는 User 설계도를 따릅니다&quot;라고 선언합니다.
const member1: User = {
  name: &quot;김코딩&quot;,
  age: 28,
  isDeveloper: true
};

//   에러 상황
const member2: User = {
  name: &quot;이철수&quot;,
  age: 30
  // 앗! isDeveloper가 빠졌네요. 
  // 에러: 'isDeveloper' 속성이 'User' 형식에 없지만 필수입니다.
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;3. 실무 꿀팁: 옵션과 읽기 전용&lt;/h4&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 모든 속성이 다 필수인 건 아닙니다. 그리고 절대 수정하면 안 되는 값도 있죠.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;선택적 속성 (?):&lt;/b&gt; &quot;있어도 되고 없어도 돼&quot; (3강에서 배운 것과 같아요!)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;읽기 전용 (readonly):&lt;/b&gt; &quot;처음에 만들 때만 넣고, 나중엔 절대 수정 불가!&quot; (주민번호, ID 같은 것)&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQmw0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;interface Car {
  readonly id: number; // 자동차 고유 번호 (수정 불가)
  model: string;       // 모델명
  color?: string;      // 색상 (없을 수도 있음)
}

const myCar: Car = {
  id: 12345,
  model: &quot;Tesla&quot;
  // color는 없어도 에러 안 남! (?) 덕분이죠.
};

// myCar.id = 99999; //   에러! readonly라 수정할 수 없습니다.
myCar.model = &quot;Ionic&quot;; // 이건 수정 가능!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;4. React에서의 활용 미리보기&lt;/h4&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;나중에 우리가 만들 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;15&quot;&gt;게시판의 게시글&lt;/b&gt; 데이터를 이렇게 정의하게 됩니다. 벌써 실무 느낌이 나죠?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQnA0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Post {
  id: number;
  title: string;
  content: string;
  author?: string; // 작성자는 익명일 수도 있으니 선택값으로!
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;17&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 4강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;인터페이스, 이제 감이 좀 오시나요? 간단한 퀴즈로 확인해 봅시다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20&quot;&gt;문제 1. (코드 작성)&lt;/b&gt; 다음 요구사항에 맞는 Pizza 인터페이스를 작성해 보세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name은 문자열이고 필수입니다.&lt;/li&gt;
&lt;li&gt;price는 숫자이고 필수입니다.&lt;/li&gt;
&lt;li&gt;topping은 문자열 배열(string[])이고, &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;21,2,0&quot;&gt;있어도 되고 없어도 됩니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQnQ0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Pizza {
  // 여기에 코드를 적어보세요
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23&quot;&gt;문제 2. (OX 퀴즈)&lt;/b&gt; readonly가 붙은 속성은 객체가 만들어진 이후에도 마음대로 값을 바꿀 수 있다. (O / X)&lt;/p&gt;
&lt;hr data-path-to-node=&quot;24&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,0&quot;&gt;문제 1 정답:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26,0,2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,2,0,0&quot;&gt;해설:&lt;/b&gt; 선택 사항이므로 속성명 뒤에 ?를 붙여야 하고, 여러 개의 토핑이 들어갈 수 있으니 문자열 배열 string[]을 사용하면 완벽합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQng0&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface Pizza {
  name: string;
  price: number;
  topping?: string[]; // 핵심! 물음표(?)와 배열([])을 잘 썼나요?
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;26,1,0&quot;&gt;X&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,1,1,0,0&quot;&gt;해설:&lt;/b&gt; readonly는 '읽기 전용'입니다. 처음에 값을 할당할 때 외에는 &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;26,1,1,0,0&quot;&gt;절대 수정할 수 없습니다.&lt;/b&gt; 데이터가 꼬이는 걸 방지하는 아주 좋은 기능이죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;27&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;고생 많으셨습니다!   이제 여러분은 **&quot;데이터의 설계도&quot;**를 그릴 줄 아는 개발자가 되었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;그런데 타입스크립트 코드를 보다 보면 interface 말고 type이라는 것으로 똑같이 만드는 걸 볼 수 있을 거예요. &quot;어? 둘 다 비슷한 것 같은데 도대체 뭘 써야 하지?&quot;   혼란스러우시죠?&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;다음 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;30&quot;&gt;5강&lt;/b&gt;에서는 &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;30&quot;&gt;'타입 별칭(Type Alias) vs 인터페이스'&lt;/b&gt;, 이 영원한 난제를 아주 깔끔하게 정리해 드립니다. 이것만 알면 기본기는 졸업입니다!&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/70</guid>
      <comments>https://pursys.tistory.com/70#entry70comment</comments>
      <pubDate>Wed, 21 Jan 2026 14:52:52 +0900</pubDate>
    </item>
    <item>
      <title>Typescript 완벽 가이드｜기초부터 실전까지 한 번에 정리 - 3강</title>
      <link>https://pursys.tistory.com/69</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 좋습니다! 속도가 아주 좋네요.   바로 &lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;0&quot;&gt;3강&lt;/b&gt;으로 들어가 봅시다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이번 시간에는 프로그래밍의 꽃, **'함수(Function)'**를 다뤄볼 겁니다. React나 Next.js를 하다 보면 컴포넌트도 결국 함수고, 이벤트 처리하는 것도 함수고... 온통 함수 세상이죠? 여기서 타입을 딱 잡아두면 에러가 획기적으로 줄어듭니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;  제3강. 함수에도 타입을 입혀보자: &quot;입구와 출구를 지켜라!&quot;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;함수는 **'자판기'**와 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;입구 (Parameter, 매개변수):&lt;/b&gt; 동전을 넣는 곳&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;내부 로직:&lt;/b&gt; 윙~ 하고 돌아가는 기계 장치&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;출구 (Return, 반환값):&lt;/b&gt; 음료수가 나오는 곳&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;타입스크립트는 이 자판기의 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;6&quot;&gt;입구와 출구에 경비원을 세우는 것&lt;/b&gt;입니다. &quot;이 입구엔 500원짜리만 들어와!&quot;, &quot;이 출구에선 콜라만 나와야 해!&quot;라고 말이죠.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;1. 함수의 기본 문법 (입구와 출구 정의하기)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 함수에 딱 두 군데만 신경 쓰면 됩니다. () 안쪽과 () 바깥쪽입니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ8Aw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;// (a: number, b: number)  &amp;lt;-- 입구(매개변수): 숫자만 들어와!
// : number                &amp;lt;-- 출구(반환값): 나갈 땐 무조건 숫자여야 해!
function add(a: number, b: number): number {
  return a + b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;이걸 요즘 React에서 많이 쓰는 **화살표 함수(Arrow Function)**로 바꾸면 이렇게 됩니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ8Qw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;const add = (a: number, b: number): number =&amp;gt; {
  return a + b;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;꿀팁:&lt;/b&gt; 사실 '출구(반환값)' 타입은 안 적어도 타입스크립트가 알아서 추측(추론)해 줍니다. a랑 b가 숫자면 더한 값도 당연히 숫자겠지? 하고요. 하지만, &lt;b data-index-in-node=&quot;88&quot; data-path-to-node=&quot;12,0,0&quot;&gt;명확하게 적어주는 습관&lt;/b&gt;이 실수를 줄여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;2. 실무 꿀팁: &quot;있을 수도, 없을 수도?&quot; (선택적 매개변수 ?)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;실무를 하다 보면 어떤 값은 꼭 필요하지만, 어떤 값은 없어도 될 때가 있습니다. 예를 들어, 회원가입할 때 '이름'은 필수지만 '별명'은 선택사항일 수 있죠.&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;이때 변수명 뒤에 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;15&quot;&gt;물음표(?)&lt;/b&gt; 만 붙이면 됩니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ8gw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// nickname 뒤에 ?가 붙었죠? &quot;문자열이거나, 아니면 아예 없거나(undefined)&quot;라는 뜻입니다.
function printProfile(name: string, nickname?: string) {
  console.log(`이름: ${name}`);
  
  if (nickname) {
    console.log(`별명: ${nickname}`);
  } else {
    console.log(&quot;별명 없음&quot;);
  }
}

printProfile(&quot;김코딩&quot;);             // OK! (별명 안 넣어도 됨)
printProfile(&quot;이철수&quot;, &quot;스파이더맨&quot;); // OK! (별명 넣어도 됨)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-path-to-node=&quot;17&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;17,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0&quot;&gt;⚠️ 주의:&lt;/b&gt; 선택적 매개변수(?)는 무조건 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;17,0&quot;&gt;필수 매개변수 뒤에&lt;/b&gt; 와야 합니다. (nickname?: string, name: string) 순서로 쓰면 에러가 납니다. (중요한 게 먼저 와야 하니까요!)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;3. React에서의 활용 (맛보기)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;나중에 자세히 배우겠지만, React 컴포넌트도 함수죠? &quot;이 컴포넌트는 name이라는 문자열을 받아서 HTML(JSX)을 뱉어내는 함수야!&quot;라고 정의하는 식입니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ8ww&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 간단한 예시 (나중에 더 자세히 배웁니다)
const WelcomeMessage = (name: string): string =&amp;gt; {
  return `환영합니다, ${name}님!`;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;21&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size23&quot;&gt;✍️ 3강 미니 퀴즈 &amp;amp; 실습&lt;/h3&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;개념을 잡았으니 문제를 풀어봅시다!&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;문제 1. (코드 완성)&lt;/b&gt; 두 개의 숫자 price(가격)와 count(개수)를 받아서, 총금액(숫자)을 반환하는 함수 calculateTotal을 만들려고 합니다. 빈칸 (A)와 (B)에 들어갈 코드는?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ9Aw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;function calculateTotal(price: number, count: number): (A) {
  return price * count;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;(A): string&lt;/li&gt;
&lt;li&gt;(A): number&lt;/li&gt;
&lt;li&gt;(A): void&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27&quot;&gt;문제 2. (에러 찾기)&lt;/b&gt; 다음 코드에서 에러가 발생하는 이유는 무엇일까요?&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi2ieTz8JaSAxUAAAAAHQAAAAAQ9Qw&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;TypeScript&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;function greet(name?: string, age: number) {
  console.log(name, age);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;29&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;name은 문자열인데 숫자를 넣어서&lt;/li&gt;
&lt;li&gt;age에 타입을 지정하지 않아서&lt;/li&gt;
&lt;li&gt;선택적 매개변수(?)가 필수 매개변수보다 앞에 와서&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;✅ 정답 및 해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt;문제 1 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;32,0,0&quot;&gt;2번 (number)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,1,0,0&quot;&gt;해설:&lt;/b&gt; 숫자끼리 곱하면 결과도 당연히 숫자(number)가 나와야겠죠? string은 문자열, void는 리턴값이 없을 때 씁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,0&quot;&gt;문제 2 정답:&lt;/b&gt; &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;32,1,0&quot;&gt;3번&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;해설:&lt;/b&gt; 아까 배운 꿀팁 기억나시죠? &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;32,1,1,0,0&quot;&gt;물음표(?) 붙은 녀석은 항상 맨 뒤&lt;/b&gt;로 가야 합니다. function greet(age: number, name?: string) 순서로 바꿔야 에러가 사라집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;33&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;수고하셨습니다!   이제 함수에 데이터가 들어오고 나가는 길목을 완벽하게 통제할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;그런데 지금까지는 숫자, 문자 같은 간단한 것만 다뤘죠? 실무에서는 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;35&quot;&gt;{ name: &quot;철수&quot;, age: 30, skills: [&quot;React&quot;] }&lt;/b&gt; 처럼 복잡한 &lt;b data-index-in-node=&quot;88&quot; data-path-to-node=&quot;35&quot;&gt;'객체(Object)'&lt;/b&gt; 데이터를 훨씬 많이 다룹니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;이런 객체의 모양을 정의하는 **'설계도'**를 만드는 방법, 바로 **4강 '인터페이스(Interface)'**에서 배울 차례입니다. 타입스크립트의 꽃이라고 할 수 있죠!&lt;/p&gt;</description>
      <category>개발/Typescript</category>
      <category>타입스크립트강의 #TypeScript강좌 #타입스크립트기초 #타입스크립트입문 #타입스크립트독학 #TS강의</category>
      <author>pursys</author>
      <guid isPermaLink="true">https://pursys.tistory.com/69</guid>
      <comments>https://pursys.tistory.com/69#entry69comment</comments>
      <pubDate>Wed, 21 Jan 2026 14:48:22 +0900</pubDate>
    </item>
  </channel>
</rss>