<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Dev Notes</title>
    <link>https://achieve-dev.tistory.com/</link>
    <description>Developer who loves AI and server development</description>
    <language>ko</language>
    <pubDate>Fri, 10 Jul 2026 06:18:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>JoonYong</managingEditor>
    <image>
      <title>Dev Notes</title>
      <url>https://tistory1.daumcdn.net/tistory/6745477/attach/1310f59b1f8b40c8aa8c8928a949b5d2</url>
      <link>https://achieve-dev.tistory.com</link>
    </image>
    <item>
      <title>[AI] DX, AX란? - X의 의미</title>
      <link>https://achieve-dev.tistory.com/79</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTTTlg/btsMtdTjZmU/MeKCpZfRFYJXascHzaWjWk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTTTlg/btsMtdTjZmU/MeKCpZfRFYJXascHzaWjWk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTTTlg/btsMtdTjZmU/MeKCpZfRFYJXascHzaWjWk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTTTlg%2FbtsMtdTjZmU%2FMeKCpZfRFYJXascHzaWjWk%2Fimg.webp&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;452&quot; height=&quot;452&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기업과 조직의 혁신을 이끄는 두 가지 중요한 개념인 &lt;b&gt;DX (Digital Transformation)&lt;/b&gt;와 &lt;b&gt;AX(AI Transformation)&lt;/b&gt;에 대해 이야기해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;1. DX (Digital Transformation)란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DX (Digital Transformation)&lt;/b&gt;는 기존의 아날로그 업무 프로세스를 디지털 기술을 활용하여 혁신하는 과정을 의미합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주요 내용&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;디지털 기술 활용&lt;/b&gt;: 클라우드, ERP, CRM 등 다양한 IT 인프라를 도입하여 업무를 자동화하고 효율성을 높입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 비용 절감, 업무 효율성 증대, 사용자 경험 개선 등 기존 시스템을 혁신하는 데 중점을 둡니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;2. AI Transformation (AX)란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI Transformation (AX)&lt;/b&gt;는 기존의 디지털 전환(DX)을 한 걸음 더 발전시켜, &lt;b&gt;인공지능(AI)&lt;/b&gt; 기술을 중심으로 업무 전반을 혁신하는 과정을 말합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주요 내용&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인공지능 활용&lt;/b&gt;: AI를 이용한 데이터 분석, 예측, 자동화 및 의사결정 지원 시스템을 도입합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: AI 기술을 통해 업무 방식 자체를 혁신하고, 미래 경쟁력을 확보하는 데 초점을 맞춥니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1 data-end=&quot;1068&quot; data-start=&quot;1034&quot;&gt;3. 왜 &amp;lsquo;Transformation&amp;rsquo;을 &amp;lsquo;X&amp;rsquo;로 쓸까?&lt;/h1&gt;
&lt;p data-end=&quot;1238&quot; data-start=&quot;1070&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;디지털 트랜스포메이션(Digital Transformation)&amp;rdquo;은 길지만 사용 빈도가 높은 용어입니다. 흔히 &lt;b&gt;DT&lt;/b&gt;라고 줄여 쓰기도 하지만, &lt;b&gt;DX&lt;/b&gt;라는 표기도 자주 보게 됩니다. 여기서 궁금증이 생길 수 있습니다. 트랜스포메이션(Transformation)을 왜 &lt;b&gt;X&lt;/b&gt;로 표현할까요?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1450&quot; data-start=&quot;1240&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1303&quot; data-start=&quot;1240&quot;&gt;&lt;b&gt;X는 '교차(cross)' 또는 '바꾸다(trans-)'의 의미&lt;/b&gt;를 담을 수 있다는 설명이 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1369&quot; data-start=&quot;1304&quot;&gt;영어권에서는 X의 두 선이 교차하는 시각적 형태가 &lt;b&gt;이동&lt;/b&gt;이나 &lt;b&gt;변환&lt;/b&gt;을 보여준다고 해석하기도 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1450&quot; data-start=&quot;1370&quot;&gt;그래서 &lt;b&gt;cross-&lt;/b&gt;나 &lt;b&gt;trans-&lt;/b&gt;를 포함하는 단어의 일부를 &lt;b&gt;X&lt;/b&gt;로 표기해, 변화를 직관적으로 강조하는 용례가 생겼습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1535&quot; data-start=&quot;1452&quot; data-ke-size=&quot;size16&quot;&gt;이러한 맥락에서 &lt;b&gt;DX&lt;/b&gt;는 &amp;ldquo;디지털&amp;rdquo;과 &amp;ldquo;트랜스포메이션&amp;rdquo;을 결합한 축약어로, &lt;b&gt;AX&lt;/b&gt; 역시 &amp;ldquo;AI&amp;rdquo;와 &amp;ldquo;트랜스포메이션&amp;rdquo;을 결합한 축약어입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;4. DX와 AX의 차이점&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 전환 방식은 모두 기술을 통한 변화라는 공통점을 지니고 있지만, 그 접근 방식과 적용 범위에서 큰 차이를 보입니다.&lt;/p&gt;
&lt;table style=&quot;height: 101px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;th style=&quot;height: 21px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;height: 21px;&quot;&gt;&lt;b&gt;DX (Digital Transformation)&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;height: 21px;&quot;&gt;&lt;b&gt;AX (AI Transformation)&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;기존 업무의 디지털화 및 효율성 증대&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;AI를 통한 업무 혁신 및 미래 경쟁력 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;기술 활용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;클라우드, ERP, CRM 등 디지털 인프라 활용&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;머신러닝, 딥러닝, 자동화 기술 등 AI 중심 솔루션 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;적용 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;문서 관리, 고객 관리, 내부 프로세스 디지털화&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;데이터 분석, 예측, 자동화, 의사결정 지원, 맞춤형 서비스 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;비용 절감, 업무 효율성 증가&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;혁신적 비즈니스 모델 도입, 미래 지향적 운영 체제 구축&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DX&lt;/b&gt;는 기존 시스템을 디지털화하여 효율성을 높이는 데 초점을 맞춘다면, &lt;b&gt;AX&lt;/b&gt;는 AI의 혁신적 기능을 통해 업무 방식을 근본적으로 재구성하고 새로운 가치를 창출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size16&quot;&gt;[Reference]&lt;/h4&gt;
&lt;figure id=&quot;og_1740358599830&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;이제는 DX를 넘어 AX의 시대로&quot; data-og-description=&quot;이제는 '모든 것이 디지털 (All Things Digital)'인 시대가 되었다. 디지털 전환 (Digital transformation)은 '환경변화에 유연하게 대응하면서 디지털 기술을 적용하여 기존의 전통적인 사회 구조를 혁신시&quot; data-og-host=&quot;brunch.co.kr&quot; data-og-source-url=&quot;https://brunch.co.kr/@3e62d5b81c26457/130&quot; data-og-url=&quot;https://brunch.co.kr/@3e62d5b81c26457/130&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fFmu5/hyYjIsETAg/gC8OhOezdWiTVVBK3GGXb0/img.jpg?width=600&amp;amp;height=384&amp;amp;face=0_0_600_384,https://scrap.kakaocdn.net/dn/DW2Wr/hyYjjT3xY1/26hDYFEAYp141nJb7pqTWK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/iIpck/hyYjjmbQxx/SBKN3Mq26cRg9vcAAkkib1/img.jpg?width=600&amp;amp;height=424&amp;amp;face=0_0_600_424&quot;&gt;&lt;a href=&quot;https://brunch.co.kr/@3e62d5b81c26457/130&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brunch.co.kr/@3e62d5b81c26457/130&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fFmu5/hyYjIsETAg/gC8OhOezdWiTVVBK3GGXb0/img.jpg?width=600&amp;amp;height=384&amp;amp;face=0_0_600_384,https://scrap.kakaocdn.net/dn/DW2Wr/hyYjjT3xY1/26hDYFEAYp141nJb7pqTWK/img.jpg?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/iIpck/hyYjjmbQxx/SBKN3Mq26cRg9vcAAkkib1/img.jpg?width=600&amp;amp;height=424&amp;amp;face=0_0_600_424');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;이제는 DX를 넘어 AX의 시대로&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이제는 '모든 것이 디지털 (All Things Digital)'인 시대가 되었다. 디지털 전환 (Digital transformation)은 '환경변화에 유연하게 대응하면서 디지털 기술을 적용하여 기존의 전통적인 사회 구조를 혁신시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brunch.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1740358214740&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;디지털트랜스포메이션을 DX로 쓰는 이유 &amp;mdash; 북저널리즘&quot; data-og-description=&quot;디지털트랜스포메이션(Digital Transformation)이라는 말이 있다. 2021년 7월 11일 현재 구글에서 'Digital Transformation'을 검색한 결과는 약 4억9900만건에 달하고, 한국어 음차 표기인 '디지털트랜스포메이&quot; data-og-host=&quot;www.bookjournalism.com&quot; data-og-source-url=&quot;https://www.bookjournalism.com/@imc/30&quot; data-og-url=&quot;https://www.bookjournalism.com/@imc/30&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hAUo8/hyYjC65INm/6Klhs5f3CZXarF9ySqsAZ1/img.jpg?width=960&amp;amp;height=600&amp;amp;face=0_0_960_600&quot;&gt;&lt;a href=&quot;https://www.bookjournalism.com/@imc/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.bookjournalism.com/@imc/30&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hAUo8/hyYjC65INm/6Klhs5f3CZXarF9ySqsAZ1/img.jpg?width=960&amp;amp;height=600&amp;amp;face=0_0_960_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;디지털트랜스포메이션을 DX로 쓰는 이유 &amp;mdash; 북저널리즘&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;디지털트랜스포메이션(Digital Transformation)이라는 말이 있다. 2021년 7월 11일 현재 구글에서 'Digital Transformation'을 검색한 결과는 약 4억9900만건에 달하고, 한국어 음차 표기인 '디지털트랜스포메이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.bookjournalism.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI</category>
      <category>AX</category>
      <category>DX</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/79</guid>
      <comments>https://achieve-dev.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 24 Feb 2025 10:01:23 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] AI 언어 모델 종류 정리(LLM, SLM, sLLM, VLM, Vertical)</title>
      <link>https://achieve-dev.tistory.com/78</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2P8lE/btsL3iHSzEi/emY5zcX3rWydodu3KHREL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2P8lE/btsL3iHSzEi/emY5zcX3rWydodu3KHREL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2P8lE/btsL3iHSzEi/emY5zcX3rWydodu3KHREL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2P8lE%2FbtsL3iHSzEi%2FemY5zcX3rWydodu3KHREL0%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;741&quot; height=&quot;232&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이번 글에서는 LLM, SLM, sLLM, VLM, Vertical AI 등의 다양한 언어모델의 개념을 정리하고, 각각의 차이점과 활용 가능성을 살펴보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. AI 모델의 주요 개념&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. LLM (Large Language Model) - 대규모 언어 모델&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 대량의 데이터를 학습하여 다양한 자연어 처리를 수행하는 AI 모델이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: GPT-4, Claude, Gemini, Llama&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 자연어 생성, 번역, 코드 작성, 문서 요약 등의 기능 수행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한계&lt;/b&gt;: 방대한 자원이 필요하며, 최신 데이터 반영이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. SLM (Small Language Model) - 소형 언어 모델&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SLM은 LLM 대비 경량화된 모델로, 성능은 유지하면서도 효율적으로 작동한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: Mistral 7B, Phi-2, Gemma&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 적은 연산 자원으로 실행 가능하며, 엣지 컴퓨팅 및 온디바이스 AI에 적합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용 분야&lt;/b&gt;: 스마트폰 AI 비서, 경량 AI 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. sLLM (Structured LLM) - 구조화된 LLM&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sLLM은 특정 도메인에 맞게 구조화된 데이터 학습이 가능하도록 설계된 모델이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 데이터베이스, 법률 문서, 금융 데이터 분석에 적합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용&lt;/b&gt;: RAG(Retrieval-Augmented Generation)과 결합하여 특정 도메인 AI 구축&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. VLM (Vision-Language Model) - 비전-언어 모델&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VLM은 텍스트뿐만 아니라 이미지와 영상을 함께 이해하는 모델이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: GPT-4V, Gemini, BLIP, Flamingo&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 이미지 캡셔닝, 멀티모달 검색, AI 아트 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활용&lt;/b&gt;: 이미지 분석, 영상 기반 챗봇, 의료 영상 판독&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Vertical AI - 특정 산업 특화 AI&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vertical AI는 특정 산업이나 도메인에 맞춰 개발된 AI 모델이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의료 AI&lt;/b&gt;: PathAI, BioGPT (의료 문서 분석, 질병 진단)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;법률 AI&lt;/b&gt;: Harvey AI, Casetext (법률 문서 검색 및 요약)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;금융 AI&lt;/b&gt;: BloombergGPT (주식 예측, 금융 뉴스 분석)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 특정 산업의 데이터를 활용하여 높은 정확도를 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 모델들은 점점 더 세분화되면서 다양한 용도로 활용되고 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;일반적인 언어 생성이 필요하다면 LLM&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컴퓨팅 자원이 적은 환경에서는 SLM&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특정 구조화된 데이터 처리가 필요하면 sLLM&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지와 텍스트를 함께 이해하려면 VLM&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특정 산업에 최적화된 AI를 원한다면 Vertical AI&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Reference]&lt;/p&gt;
&lt;figure id=&quot;og_1738407898772&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Visual Language Models (VLM): A Deep Dive into the Future of Multimodal AI&quot; data-og-description=&quot;Introduction&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@Er.Devanshu/visual-language-models-vlm-a-deep-dive-into-the-future-of-multimodal-ai-71fcd7c640d6&quot; data-og-url=&quot;https://medium.com/@Er.Devanshu/visual-language-models-vlm-a-deep-dive-into-the-future-of-multimodal-ai-71fcd7c640d6&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hLBYz/hyX70noJDi/i9aT5I4znnKkpt0AbbJbTk/img.gif?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432,https://scrap.kakaocdn.net/dn/jgO2v/hyX7RYgMjv/ksxhsh7ZMCJB1Vy7rwib21/img.jpg?width=1358&amp;amp;height=935&amp;amp;face=0_0_1358_935,https://scrap.kakaocdn.net/dn/cInLZF/hyX70AWPxB/x2cwqHrHKjrXYcKlxU7Sgk/img.png?width=1358&amp;amp;height=798&amp;amp;face=0_0_1358_798&quot;&gt;&lt;a href=&quot;https://medium.com/@Er.Devanshu/visual-language-models-vlm-a-deep-dive-into-the-future-of-multimodal-ai-71fcd7c640d6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@Er.Devanshu/visual-language-models-vlm-a-deep-dive-into-the-future-of-multimodal-ai-71fcd7c640d6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hLBYz/hyX70noJDi/i9aT5I4znnKkpt0AbbJbTk/img.gif?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432,https://scrap.kakaocdn.net/dn/jgO2v/hyX7RYgMjv/ksxhsh7ZMCJB1Vy7rwib21/img.jpg?width=1358&amp;amp;height=935&amp;amp;face=0_0_1358_935,https://scrap.kakaocdn.net/dn/cInLZF/hyX70AWPxB/x2cwqHrHKjrXYcKlxU7Sgk/img.png?width=1358&amp;amp;height=798&amp;amp;face=0_0_1358_798');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Visual Language Models (VLM): A Deep Dive into the Future of Multimodal AI&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Introduction&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/LLM</category>
      <category>LLM</category>
      <category>sLLM</category>
      <category>slm</category>
      <category>vertical ai</category>
      <category>VLM</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/78</guid>
      <comments>https://achieve-dev.tistory.com/78#entry78comment</comments>
      <pubDate>Sat, 1 Feb 2025 20:16:47 +0900</pubDate>
    </item>
    <item>
      <title>[LLM] LLM 모델과 에이전트의 차이점</title>
      <link>https://achieve-dev.tistory.com/77</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxwEiP/btsL4LPDsRV/TKftbzAgLqxdD0nIGYvpYK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxwEiP/btsL4LPDsRV/TKftbzAgLqxdD0nIGYvpYK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxwEiP/btsL4LPDsRV/TKftbzAgLqxdD0nIGYvpYK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxwEiP%2FbtsL4LPDsRV%2FTKftbzAgLqxdD0nIGYvpYK%2Fimg.webp&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;1792&quot; height=&quot;1024&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx?utm_source=share&amp;amp;utm_medium=member_desktop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Teddy님이 링크드인에 올려주신 너무 좋은 글&lt;/a&gt;을 참고하여 정리한 내용입니다. &lt;br /&gt;평소에 Teddy님의 영상과 글을 자주 보고 있는데, 정말 많은 도움을 받고 있습니다. &lt;br /&gt;항상 좋은 인사이트를 공유해 주셔서 감사합니다!   &lt;br /&gt;아래는 Teddy님이 정리해 주신 내용을 기반으로 LLM 모델과 에이전트의 차이점을 정리한 내용과 함께, 제가 생각하는 부분을 덧붙여 보았습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. LLM 모델 vs 에이전트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 개발자들 사이에서 &lt;b&gt;LLM 모델과 에이전트&lt;/b&gt;에 대한 관심이 높아지고 있습니다. 두 개념이 비슷해 보일 수 있지만, 기능적으로 상당한 차이가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1. 지식의 범위&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;: 학습 데이터 내에서만 정보를 제공하며, 최신 데이터나 외부 시스템과의 연결이 불가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;: API 호출, 데이터베이스 접근, 인터넷 검색을 활용해 실시간으로 최신 정보를 가져올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 생각:&lt;/b&gt;&lt;br /&gt;단순한 질의응답에서는 LLM만으로도 충분할 수 있지만, 최신 정보를 반영해야 하는 분야에서는 에이전트의 역할이 절대적입니다. 특히 뉴스 요약, 금융 데이터 분석 같은 작업에서는 에이전트가 훨씬 강력한 무기가 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2. 문맥 관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;: 이전 대화 내용을 기억하지 않으며, 매번 새로운 질문처럼 처리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;: 세션 기록을 관리하며, 연속적인 문맥을 이해하고 자연스러운 대화를 이어나갈 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 생각:&lt;/b&gt;&lt;br /&gt;챗봇을 개발하다 보면, LLM 모델이 매번 질문을 독립적으로 처리하는 한계를 쉽게 체감할 수 있습니다. 사용자가 맥락을 공유하면서 자연스럽게 대화를 이어나갈 수 있으려면, 결국 에이전트 기반의 구조가 필요하다는 생각이 듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 3. 작업 처리 방식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;: 단순한 질문-응답 방식으로 동작하며, 복잡한 작업 수행이 어렵습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;: API 호출, 데이터 검색, 계산 등 다단계 작업을 계획하고 실행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 생각:&lt;/b&gt;&lt;br /&gt;개발자 입장에서 보면, 단순히 응답을 반환하는 것과, 실제로 동작하는 기능을 수행하는 것은 차원이 다릅니다. 예를 들어, LLM이 &quot;이벤트 A와 B가 충돌하니 일정을 조정하세요&quot;라고 알려주는 것과, 에이전트가 직접 캘린더 API를 활용하여 일정을 변경하는 것은 전혀 다른 수준의 기능이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  4. 도구 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;: 외부 시스템과 연동하려면 추가적인 개발이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;: 검색, 계산, 외부 연결 등의 기능이 기본적으로 내장되어 있어 작업 효율성이 뛰어납니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 생각:&lt;/b&gt;&lt;br /&gt;에이전트가 더 발전하면, AI가 단순한 조언자가 아니라, &lt;b&gt;사용자의 보조 비서로 실질적인 역할을 할 가능성이 높다&lt;/b&gt;고 생각합니다. 개인적인 일정 관리, 업무 자동화, 데이터 분석까지 AI가 직접 실행하는 시대가 머지않았다고 느껴집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  5. 추론 및 의사결정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;: 복잡한 논리를 처리하려면 CoT(Chain-of-Thought) 같은 기법을 별도로 적용해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;: CoT, ReAct 등의 추론 프레임워크가 기본적으로 포함되어 있어 효과적인 의사결정이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 생각:&lt;/b&gt;&lt;br /&gt;LLM 모델도 논리적인 사고를 할 수 있지만, 이를 활용하는 방식이 제한적입니다. 반면, 에이전트는 다양한 의사결정 알고리즘을 활용할 수 있어, &lt;b&gt;더 정교하고 전략적인 판단을 내릴 수 있는 가능성이 크다&lt;/b&gt;고 봅니다. 특히 AI가 스스로 문제 해결을 위해 여러 단계를 거치는 모습을 보면, 기존 LLM 모델과는 확연한 차이가 느껴집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 6. 성과 및 신뢰성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;: 결과 해석이 어렵고, 복잡한 작업에서는 오류 발생 가능성이 높습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;: 작업 과정이 투명하게 보이며, 오류 발생을 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 생각:&lt;/b&gt;&lt;br /&gt;AI 모델의 신뢰성은 앞으로 더 중요해질 것 같습니다. 특히 금융, 의료, 법률 같은 분야에서는 단순한 응답이 아니라, &lt;b&gt;어떻게 그 결과가 도출되었는지를 설명할 수 있는 구조가 필수적&lt;/b&gt;입니다. 에이전트 기반 시스템이 더 발전하면, AI가 단순한 도구가 아니라 &lt;b&gt;진짜 전문가처럼 신뢰받는 조력자&lt;/b&gt;가 될 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 모델과 에이전트는 각기 다른 장점과 한계를 가지고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LLM 모델&lt;/b&gt;은 단순한 질의응답이나 특정 영역에서 강력한 성능을 발휘하지만,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트&lt;/b&gt;는 복잡한 작업 처리, 실시간 데이터 활용, 연속적인 대화 유지에 강점을 가집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변화하는 환경과 요구사항을 고려했을 때, &lt;b&gt;에이전트의 역할은 점점 더 중요해질 것&lt;/b&gt;으로 보입니다. 앞으로 LLM 모델을 단순히 사용하는 것에서 벗어나, &lt;b&gt;에이전트를 활용한 AI 시스템&lt;/b&gt;을 설계하는 방향으로 나아가야 할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size16&quot;&gt;[&lt;span style=&quot;text-align: start;&quot;&gt;Reference]&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1oEjiRCTbd54aSdB_eEe3UShxLBWK9xkt/view&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://drive.google.com/file/d/1oEjiRCTbd54aSdB_eEe3UShxLBWK9xkt/view&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738401734260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Newwhitepaper_Agents2.pdf&quot; data-og-description=&quot;&quot; data-og-host=&quot;drive.google.com&quot; data-og-source-url=&quot;https://drive.google.com/file/d/1oEjiRCTbd54aSdB_eEe3UShxLBWK9xkt/view&quot; data-og-url=&quot;https://drive.google.com/file/d/1oEjiRCTbd54aSdB_eEe3UShxLBWK9xkt/view?usp=embed_facebook&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1oEjiRCTbd54aSdB_eEe3UShxLBWK9xkt/view&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://drive.google.com/file/d/1oEjiRCTbd54aSdB_eEe3UShxLBWK9xkt/view&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Newwhitepaper_Agents2.pdf&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;drive.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx?utm_source=share&amp;amp;utm_medium=member_desktop&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx?utm_source=share&amp;amp;utm_medium=member_desktop&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738401870250&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;LinkedIn Teddy Lee 페이지: #agent #llm&quot; data-og-description=&quot;LLM 모델과 에이전트의 차이점 출처: https://lnkd.in/gkeQhzty 최근 에이전트에 대한 관심이 높아지고 있습니다. 이 두 가지는 언뜻 보기에 유사해 보일 수 있지만, 기능적 측면에서 상당한 차이점을 가&quot; data-og-host=&quot;kr.linkedin.com&quot; data-og-source-url=&quot;https://www.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx?utm_source=share&amp;amp;utm_medium=member_desktop&quot; data-og-url=&quot;https://kr.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/unvxR/hyX7U8xbxX/TRNJp6DzmFoHfzYJ2dpyr1/img.jpg?width=800&amp;amp;height=670&amp;amp;face=0_0_800_670,https://scrap.kakaocdn.net/dn/cKSHfa/hyX70HE0C0/pej2xKhdCDpPm6oyB0WQ2k/img.jpg?width=800&amp;amp;height=670&amp;amp;face=0_0_800_670&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx?utm_source=share&amp;amp;utm_medium=member_desktop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.linkedin.com/posts/teddy-lee_agent-llm-activity-7284466981066489856--6tx?utm_source=share&amp;amp;utm_medium=member_desktop&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/unvxR/hyX7U8xbxX/TRNJp6DzmFoHfzYJ2dpyr1/img.jpg?width=800&amp;amp;height=670&amp;amp;face=0_0_800_670,https://scrap.kakaocdn.net/dn/cKSHfa/hyX70HE0C0/pej2xKhdCDpPm6oyB0WQ2k/img.jpg?width=800&amp;amp;height=670&amp;amp;face=0_0_800_670');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LinkedIn Teddy Lee 페이지: #agent #llm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LLM 모델과 에이전트의 차이점 출처: https://lnkd.in/gkeQhzty 최근 에이전트에 대한 관심이 높아지고 있습니다. 이 두 가지는 언뜻 보기에 유사해 보일 수 있지만, 기능적 측면에서 상당한 차이점을 가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kr.linkedin.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/LLM</category>
      <category>LLM</category>
      <category>에이전트</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/77</guid>
      <comments>https://achieve-dev.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 1 Feb 2025 19:02:19 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] REST API 개발 시 Location 헤더의 필요성과 사용 방법</title>
      <link>https://achieve-dev.tistory.com/76</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/68cAU/btsKof6VgK6/wJFjKQZtogKNRBiXcorzH1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/68cAU/btsKof6VgK6/wJFjKQZtogKNRBiXcorzH1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/68cAU/btsKof6VgK6/wJFjKQZtogKNRBiXcorzH1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F68cAU%2FbtsKof6VgK6%2FwJFjKQZtogKNRBiXcorzH1%2Fimg.webp&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;930&quot; height=&quot;410&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;code&gt;Location&lt;/code&gt; 헤더란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Location&lt;/code&gt; 헤더는 HTTP 응답 헤더 중 하나로, 서버가 클라이언트에게 &lt;b&gt;새로 생성된 리소스의 URI를 명시적으로 전달&lt;/b&gt;할 때 사용됩니다. 주로 &lt;code&gt;POST&lt;/code&gt; 요청으로 리소스를 생성한 후 응답 코드 &lt;b&gt;201(Created)&lt;/b&gt;와 함께 제공되며, 클라이언트가 생성된 리소스를 쉽게 접근할 수 있도록 돕습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;code&gt;Location&lt;/code&gt; 헤더가 필요한 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RESTful API 설계에서 &lt;code&gt;Location&lt;/code&gt; 헤더는 다음과 같은 이유로 유용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;리소스 위치 명확화&lt;/b&gt;: 클라이언트는 &lt;code&gt;Location&lt;/code&gt; 헤더에 포함된 URI를 통해 &lt;b&gt;서버가 생성한 리소스의 정확한 위치&lt;/b&gt;를 알 수 있습니다. 예를 들어, 차단된 계정에 대한 URI를 전달받으면 클라이언트는 해당 URI를 통해 차단 상태를 쉽게 조회하거나 해제 요청을 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;후속 작업의 간편화&lt;/b&gt;: 차단 리소스에 대한 추가 작업(조회, 해제 등)을 쉽게 수행할 수 있습니다. 클라이언트는 URI를 사용하여 후속 요청을 간편하게 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RESTful 설계 원칙 준수&lt;/b&gt;: RESTful API 설계에서 생성된 리소스의 위치를 클라이언트에게 제공함으로써 명확하고 일관된 리소스 관리를 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;code&gt;Location&lt;/code&gt; 헤더 사용 예시: 계정 차단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Spring Boot에서 계정을 차단하는 API에서 &lt;code&gt;Location&lt;/code&gt; 헤더를 포함하여 새로 생성된 차단 리소스 URI를 제공하는 방법을 살펴보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;차단 API 예시 코드&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

@PostMapping(&quot;/api/v1/block&quot;)
public ResponseEntity&amp;lt;Void&amp;gt; block(@RequestBody BlockRequest blockRequest, @CurrentProfile Long blockerProfileId) {
    Block block = blockService.create(blockRequest, blockerProfileId); // 차단 리소스 생성
    URI location = ServletUriComponentsBuilder.fromCurrentRequest() // 현재 요청 URI 가져오기
                    .path(&quot;/{blockId}&quot;) // 새로 생성된 리소스의 ID 경로 추가
                    .buildAndExpand(block.getBlockId()) // {blockId} 부분에 실제 ID 값 설정
                    .toUri(); // URI 객체로 변환
    return ResponseEntity.created(location).build(); // 201 응답과 Location 헤더 포함
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;ServletUriComponentsBuilder.fromCurrentRequest()&lt;/code&gt;: 현재 요청 URI를 기반으로 새 URI 생성&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.path(&quot;/{blockId}&quot;)&lt;/code&gt;: URI 끝에 &lt;code&gt;/blockId&lt;/code&gt;를 추가하여 새로 생성된 차단 리소스의 URI 형식을 만듭니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.buildAndExpand(block.getBlockId())&lt;/code&gt;: &lt;code&gt;{blockId}&lt;/code&gt; 부분에 실제 생성된 차단 ID를 채워 최종 URI를 완성합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.toUri()&lt;/code&gt;: URI 객체로 변환하여 &lt;code&gt;ResponseEntity.created(location).build()&lt;/code&gt;와 함께 응답을 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;응답 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드가 실행되면, 서버는 다음과 같은 형태의 응답을 클라이언트에게 보냅니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;HTTP/1.1 201 Created
Location: http://yourserver/api/v1/block/12345&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Location&lt;/code&gt; 헤더는 RESTful API에서 새로 생성된 리소스의 위치를 명확히 전달함으로써, 클라이언트가 리소스에 쉽게 접근하고 후속 작업을 효율적으로 수행할 수 있도록 돕습니다. 계정 차단과 같은 리소스 생성 시 &lt;code&gt;Location&lt;/code&gt; 헤더를 포함하면 클라이언트에게 보다 직관적이고 명확한 API 경험을 제공합니다.&lt;/p&gt;</description>
      <category>Spring/Spring</category>
      <category>created</category>
      <category>Location</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/76</guid>
      <comments>https://achieve-dev.tistory.com/76#entry76comment</comments>
      <pubDate>Wed, 30 Oct 2024 13:36:56 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 배포(Deployment), AWS EC2(Elastic Compute Cloud)의 개념</title>
      <link>https://achieve-dev.tistory.com/75</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daMXeQ/btsJ7v9RYk4/L2gyyWQgYhF4EzXWqf3p70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daMXeQ/btsJ7v9RYk4/L2gyyWQgYhF4EzXWqf3p70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daMXeQ/btsJ7v9RYk4/L2gyyWQgYhF4EzXWqf3p70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaMXeQ%2FbtsJ7v9RYk4%2FL2gyyWQgYhF4EzXWqf3p70%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;422&quot; height=&quot;422&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개발자라면 한 번쯤은 &quot;이제 기능 구현도 끝났고, 테스트도 끝났으니 배포하자!&quot;라는 말을 들어봤을 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이때의 배포는 무슨 뜻일까요? 오늘은 &lt;b&gt;배포(Deployment)&lt;/b&gt;의 개념과 서버 배포에 필수적인&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;AWS &lt;b&gt;EC2(Elastic Compute Cloud)&lt;/b&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 배포(Deployment)란 무엇인가?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMzwxi/btsJ810FvRo/6jx06aQobtetE66Ps1yd11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMzwxi/btsJ810FvRo/6jx06aQobtetE66Ps1yd11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMzwxi/btsJ810FvRo/6jx06aQobtetE66Ps1yd11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMzwxi%2FbtsJ810FvRo%2F6jx06aQobtetE66Ps1yd11%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;392&quot; height=&quot;241&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배포(Deployment)&lt;/b&gt;란 개발된 애플리케이션을 &lt;b&gt;다른 사용자들이 인터넷을 통해 사용할 수 있도록&lt;/b&gt; 만드는 과정을 의미합니다. 우리가 만든 웹 애플리케이션이나 서버가 실제로 다른 사람들에게 제공되려면 인터넷 상에서 실행되고 있어야 합니다. 이를 위해 배포는 필수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발할 때는 주로 &lt;b&gt;localhost&lt;/b&gt;라는 주소로 웹 애플리케이션을 테스트합니다. 하지만 &lt;b&gt;localhost&lt;/b&gt;는 개인 컴퓨터에서만 접근 가능한 주소입니다. 배포를 통해 고유한&lt;b&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;IP 주소(ex. 124.16.2.9)&lt;/span&gt;&lt;/b&gt;나 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;도메인(ex. &lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;www.naver.com)&lt;/span&gt;&lt;/b&gt;을 부여받으면, 이제 다른 컴퓨터에서도 그 주소를 통해 해당 웹사이트나 서버에 접근할 수 있게 됩니다. 이렇게 서비스가 사용자들에게 제공될 준비가 된 상태를 &lt;b&gt;배포가 완료된 상태&lt;/b&gt;라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개발이 완료된 후, 다른 사용자들이 애플리케이션을 사용하게 하려면 반드시 &lt;b&gt;배포(Deployment)&lt;/b&gt; 과정이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;1.1) 현업에서 가장 많이 사용하는 배포 서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현업에서는&lt;b&gt; AWS EC2&lt;/b&gt;가 &lt;b&gt;가장 널리 사용됩니다&lt;/b&gt;. 이는 &lt;b&gt;확장성, 다양한 서비스와의 통합, 글로벌 인프라&lt;/b&gt;를 제공하기 때문입니다. &lt;b&gt;AWS&lt;/b&gt;는 특히 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;백엔드 서버와 데이터베이스 배포&lt;/b&gt;&lt;/span&gt;에 강점을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에도 &lt;b&gt;GCP App Engine&lt;/b&gt;과 &lt;b&gt;Azure App Service&lt;/b&gt;는 클라우드 인프라 관리의 복잡성을 줄여주는 PaaS(Platform as a Service)로 인기가 있으며, &lt;b&gt;Vercel&lt;/b&gt;과 &lt;b&gt;Netlify&lt;/b&gt;는 &lt;b&gt;프론트엔드 배포에 특화된 도구&lt;/b&gt;로 많이 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. AWS EC2란?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8LqCo/btsJ8T9wqW0/ZxZsBBnE0y8akoe0z93CIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8LqCo/btsJ8T9wqW0/ZxZsBBnE0y8akoe0z93CIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8LqCo/btsJ8T9wqW0/ZxZsBBnE0y8akoe0z93CIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8LqCo%2FbtsJ8T9wqW0%2FZxZsBBnE0y8akoe0z93CIK%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;312&quot; height=&quot;312&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;2.1) EC2(Elastic Compute Cloud)란 무엇인가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;AWS EC2(Elastic Compute Cloud)&lt;/b&gt;는 한마디로 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;컴퓨터를 빌려서 원격으로 접속하여 사용하는 서비스&lt;/b&gt;&lt;/span&gt;입니다. 쉽게 말해, AWS에서 제공하는 서버(컴퓨터)를 빌려 사용하는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;2.2) 왜 EC2를 사용할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 배포하기 위해서는 컴퓨터가 필요합니다. 하지만 내 컴퓨터로 서버를 운영하려면 몇 가지 문제가 생깁니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;24시간 서버 가동&lt;/b&gt;: 서버가 계속 실행되어야 하기 때문에 컴퓨터를 항상 켜놔야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 문제&lt;/b&gt;: 내 컴퓨터에 인터넷을 통해 외부에서 접근할 수 있도록 설정하면 보안적으로 큰 위험이 생깁니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 &lt;b&gt;AWS EC2&lt;/b&gt;를 사용합니다. EC2는 우리가 필요할 때만 컴퓨터를 빌려서 서버를 운영할 수 있도록 해줍니다. 추가로 &lt;b&gt;오토스케일링, 로드밸런싱&lt;/b&gt; 등의 기능도 제공하여 서버 운영을 보다 효율적이고 안전하게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;2.3) 현업에서의 EC2 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 현업에서도 &lt;b&gt;EC2&lt;/b&gt;는 주로 &lt;b&gt;백엔드 서버 배포&lt;/b&gt;에 사용됩니다. AWS EC2에 서버를 올려 놓으면, 사용자가 그 서버에 접속하여 데이터를 주고받거나 요청을 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 웹 페이지도 EC2에 배포할 수 있을까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 웹 페이지를 배포할 때는 &lt;b&gt;AWS EC2&lt;/b&gt;를 사용할 수도 있지만, 일반적으로는 &lt;b&gt;Vercel&lt;/b&gt;, &lt;b&gt;Netlify&lt;/b&gt;, &lt;b&gt;AWS S3&lt;/b&gt; 같은 서비스가 더 많이 사용됩니다. 프론트엔드는 EC2보다 이러한 서비스들이 더 적합한 경우가 많기 때문입니다. 그래서 AWS EC2는 주로 &lt;b&gt;백엔드 서버 배포에 많이 사용된다&lt;/b&gt;고 기억하면 충분합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DevOps/AWS</category>
      <category>AWS</category>
      <category>deployment</category>
      <category>EC2</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/75</guid>
      <comments>https://achieve-dev.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 16 Oct 2024 16:59:43 +0900</pubDate>
    </item>
    <item>
      <title>[Java] String vs StringBuilder vs StringBuffer - 성능 비교 실험</title>
      <link>https://achieve-dev.tistory.com/74</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/45p1u/btsJ4bCfWfG/t7p8zEG03GShlH0Sm6wqg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/45p1u/btsJ4bCfWfG/t7p8zEG03GShlH0Sm6wqg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/45p1u/btsJ4bCfWfG/t7p8zEG03GShlH0Sm6wqg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F45p1u%2FbtsJ4bCfWfG%2Ft7p8zEG03GShlH0Sm6wqg1%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;382&quot; height=&quot;254&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Java에서 문자열을 다루는 방법은 다양하며, 대표적으로 &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;StringBuilder&lt;/code&gt;, &lt;code&gt;StringBuffer&lt;/code&gt;가 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 세 가지 클래스는 각각의 특징과 성능이 다르기 때문에, 사용 상황에 따라 적합한 것을 선택하는 것이 중요합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스트에서는 &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;StringBuilder&lt;/code&gt;, &lt;code&gt;StringBuffer&lt;/code&gt;의 차이점과 장단점을 비교해 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. String, StringBuilder, StringBuffer란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서는 문자열을 다루기 위한 여러 가지 클래스가 제공됩니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;String&lt;/b&gt;: &lt;b&gt;불변(immutable)&lt;/b&gt; 객체로, 한 번 생성되면 수정할 수 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringBuilder&lt;/b&gt;: &lt;b&gt;가변(mutable)&lt;/b&gt; 객체로, 동기화를 지원하지 않아 싱글 스레드 환경에서 빠르게 동작합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringBuffer&lt;/b&gt;: &lt;b&gt;가변(mutable)&lt;/b&gt; 객체로, 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. String의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;String&lt;/code&gt;은 &lt;b&gt;불변 객체&lt;/b&gt;로, &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;문자열을 변경하려면 새로운 객체를 생성&lt;/span&gt;&lt;/b&gt;해야 합니다. 이로 인해 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;메모리를 더 많이 사용&lt;/b&gt;&lt;/span&gt;할 수 있으며, 반복적인 수정이 있을 경우 성능 저하가 발생할 수 있습니다. 그러나 불변성 덕분에 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;멀티스레드 환경에서 안전&lt;/b&gt;&lt;/span&gt;하게 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스레드 안전성&lt;/b&gt;: 불변 객체이기 때문에 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리 효율성&lt;/b&gt;: 동일한 문자열은 &lt;b&gt;String Pool&lt;/b&gt;에 저장되어 재사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;성능 저하&lt;/b&gt;: 문자열을 수정할 때마다 새로운 객체가 생성되기 때문에, 대량의 문자열 조작 작업에는 비효율적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 코드&lt;/h3&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;String str = &quot;Hello&quot;;
str += &quot; World&quot;;  // 새로운 String 객체가 생성됨&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;a title=&quot;StringBuilder&quot; href=&quot;https://achieve-dev.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;StringBuilder&lt;/a&gt;의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;StringBuilder&lt;/code&gt;는 &lt;b&gt;Java 1.5&lt;/b&gt;에서 도입된 가변 문자열 클래스입니다. &lt;code&gt;String&lt;/code&gt;의 성능 문제를 해결하기 위해, 문자열을 조작할 때 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;기존 객체를 수정할 수 있도록 설계&lt;/b&gt;&lt;/span&gt;되었습니다. 또한, 동기화를 지원하지 않기 때문에 &lt;b&gt;싱글 스레드 환경&lt;/b&gt;에서 가장 빠르게 동작합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빠른 성능&lt;/b&gt;: 동기화가 필요 없기 때문에, &lt;code&gt;StringBuffer&lt;/code&gt;보다 빠르게 문자열을 조작할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메서드 체이닝 지원&lt;/b&gt;: 메서드를 연결해서 사용할 수 있어 코드가 간결해집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;멀티스레드 안전성 없음&lt;/b&gt;: 동기화를 지원하지 않으므로, 멀티스레드 환경에서는 &lt;code&gt;StringBuffer&lt;/code&gt;를 사용하는 것이 안전합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 코드&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);
sb.append(&quot; World&quot;).append(&quot;!&quot;);
System.out.println(sb.toString());  // 출력: Hello World!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. StringBuffer의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;StringBuffer&lt;/code&gt;는 &lt;b&gt;Java 1.0&lt;/b&gt;부터 존재하는 클래스입니다. &lt;code&gt;StringBuilder&lt;/code&gt;와 유사하지만, &lt;b&gt;동기화(synchronization)&lt;/b&gt;를 지원하여 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;멀티스레드 환경에서 안전&lt;/b&gt;&lt;/span&gt;하게 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;멀티스레드 안전성&lt;/b&gt;: 동기화를 지원하여 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가변성&lt;/b&gt;: 문자열을 조작할 때 기존 객체를 수정하여 메모리와 성능을 최적화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;성능&lt;/b&gt;: 동기화가 추가되어 있어, 싱글 스레드 환경에서는 &lt;code&gt;StringBuilder&lt;/code&gt;보다 성능이 떨어질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 코드&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuffer sb = new StringBuffer(&quot;Hello&quot;);
sb.append(&quot; World&quot;).append(&quot;!&quot;);
System.out.println(sb.toString());  // 출력: Hello World!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. String, StringBuilder, StringBuffer 비교&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;특성&lt;/th&gt;
&lt;th&gt;String&lt;/th&gt;
&lt;th&gt;StringBuilder&lt;/th&gt;
&lt;th&gt;StringBuffer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가변성&lt;/td&gt;
&lt;td&gt;불변(Immutable)&lt;/td&gt;
&lt;td&gt;가변(Mutable)&lt;/td&gt;
&lt;td&gt;가변(Mutable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;멀티스레드 안전성&lt;/td&gt;
&lt;td&gt;안전(Thread-safe)&lt;/td&gt;
&lt;td&gt;안전하지 않음&lt;/td&gt;
&lt;td&gt;안전(Thread-safe)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;성능&lt;/td&gt;
&lt;td&gt;느림(새 객체 생성)&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;td&gt;상대적으로 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;동기화&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;String&lt;/b&gt;: 변경이 적고, 안정성이 중요한 경우 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringBuilder&lt;/b&gt;: 싱글 스레드 환경에서 반복적인 문자열 조작이 필요한 경우 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringBuffer&lt;/b&gt;: 멀티스레드 환경에서 문자열 조작이 필요한 경우 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 성능 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;StringBuffer&lt;/code&gt;, &lt;code&gt;StringBuilder&lt;/code&gt;의 성능을 비교를 직접 해봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/weuO6/btsJ3KekkhP/cTeMYbphQpH9Do5n12WQQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/weuO6/btsJ3KekkhP/cTeMYbphQpH9Do5n12WQQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/weuO6/btsJ3KekkhP/cTeMYbphQpH9Do5n12WQQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FweuO6%2FbtsJ3KekkhP%2FcTeMYbphQpH9Do5n12WQQ0%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;629&quot; height=&quot;922&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;String&lt;/b&gt;: &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;25ms&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(문자열을 계속 생성하기 때문에 가장 느립니다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringBuffer&lt;/b&gt;: &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;2ms&lt;/b&gt; &lt;/span&gt;(&lt;code&gt;StringBuilder&lt;/code&gt;보다 느리지만, 멀티스레드 환경에서 안전합니다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StringBuilder&lt;/b&gt;: &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;1ms&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(가장 빠른 성능을 보여줍니다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9U3au/btsJ26hSetI/kix9wTITXhHq0nJ798hsrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9U3au/btsJ26hSetI/kix9wTITXhHq0nJ798hsrk/img.png&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;74&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.2913%; margin-right: 10px;&quot; data-widthpercent=&quot;49.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9U3au/btsJ26hSetI/kix9wTITXhHq0nJ798hsrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9U3au%2FbtsJ26hSetI%2Fkix9wTITXhHq0nJ798hsrk%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;160&quot; height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7uvn/btsJ3JGvtzf/I8Jo90UQT8HMCCh67eLp80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7uvn/btsJ3JGvtzf/I8Jo90UQT8HMCCh67eLp80/img.png&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;75&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.13&quot; style=&quot;width: 49.5459%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7uvn/btsJ3JGvtzf/I8Jo90UQT8HMCCh67eLp80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7uvn%2FbtsJ3JGvtzf%2FI8Jo90UQT8HMCCh67eLp80%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;163&quot; height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 언제 무엇을 사용해야 할까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;변경이 적은 문자열&lt;/b&gt;: &lt;code&gt;String&lt;/code&gt;을 사용하여 메모리 효율성과 안정성을 유지할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;싱글 스레드 환경에서 반복적인 문자열 조작&lt;/b&gt;: &lt;code&gt;StringBuilder&lt;/code&gt;를 사용하여 빠르고 효율적으로 문자열을 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티스레드 환경에서 문자열 조작&lt;/b&gt;: &lt;code&gt;StringBuffer&lt;/code&gt;를 사용하여 스레드 안전성을 보장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Reference&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728645948517&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;What is String vs StringBuilder vs StringBuffer in Java - Java Ocean&quot; data-og-description=&quot;In Java, String, StringBuilder and StringBuffer are three different classes used for handling text data, but they have distinct characteristics and are used&quot; data-og-host=&quot;javaocean.in&quot; data-og-source-url=&quot;https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/&quot; data-og-url=&quot;https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What is String vs StringBuilder vs StringBuffer in Java - Java Ocean&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In Java, String, StringBuilder and StringBuffer are three different classes used for handling text data, but they have distinct characteristics and are used&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;javaocean.in&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/Java</category>
      <category>java</category>
      <category>string</category>
      <category>StringBuffer</category>
      <category>StringBuilder</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/74</guid>
      <comments>https://achieve-dev.tistory.com/74#entry74comment</comments>
      <pubDate>Fri, 11 Oct 2024 20:54:14 +0900</pubDate>
    </item>
    <item>
      <title>[Java] StringBuilder 메서드 정리</title>
      <link>https://achieve-dev.tistory.com/73</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjQcFE/btsJ4boFTHi/50brvDfh59LJipAnVR9D3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjQcFE/btsJ4boFTHi/50brvDfh59LJipAnVR9D3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjQcFE/btsJ4boFTHi/50brvDfh59LJipAnVR9D3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjQcFE%2FbtsJ4boFTHi%2F50brvDfh59LJipAnVR9D3K%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;249&quot; height=&quot;247&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘 문제를 풀며 자주 사용했던 &lt;code&gt;StringBuilder&lt;/code&gt;를 더 깊이 공부하고, 주요 메서드를 정리했습니다. &lt;code&gt;StringBuilder&lt;/code&gt;는 문자열을 효율적으로 다룰 수 있는 강력한 도구로, 이를 잘 활용하면 성능을 크게 향상시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. StringBuilder란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;StringBuilder&lt;/code&gt;는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;가변(mutable)&lt;/b&gt;&lt;/span&gt; 문자열을 처리하기 위해 Java 1.5(Java 5)에서 도입된 클래스입니다. Java의 &lt;code&gt;String&lt;/code&gt; 클래스는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;불변(immutable)&lt;/b&gt;&lt;/span&gt;이기 때문에 문자열을 조작할 때마다 새로운 객체가 생성되는데, 이는 성능 문제를 야기할 수 있습니다. 반면 &lt;code&gt;StringBuilder&lt;/code&gt;는 기존 객체를 수정하여 &lt;b&gt;효율적&lt;/b&gt;으로 문자열을 조작할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;StringBuilder의 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가변성&lt;/b&gt;: 문자열을 추가, 수정, 삭제할 때 기존 객체를 재사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;싱글 스레드 환경에 최적화&lt;/b&gt;: 동기화를 지원하지 않으므로 멀티스레드 환경에서는 사용하지 않는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능&lt;/b&gt;: &lt;code&gt;String&lt;/code&gt;보다 빠르고, 멀티스레드 동기화를 지원하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;code&gt;StringBuffer&lt;/code&gt;&lt;/span&gt;보다 가볍고 빠릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. StringBuilder의 생성자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;StringBuilder&lt;/code&gt;는 다양한 방법으로 객체를 생성할 수 있습니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.1 기본 생성자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈 문자열로 초기화합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728644633504&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder();&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 문자열을 인자로 받는 생성자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 문자열 값을 설정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728644762733&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3&amp;nbsp; 초기 용량을 설정하는 생성자&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 용량을 설정하여 성능을 최적화할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728644823451&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(50);  // 초기 용량을 50으로 설정&lt;/code&gt;&lt;/pre&gt;
&lt;address&gt;&amp;nbsp;&lt;/address&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. StringBuilder의 주요 메서드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 append()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열의 끝에 문자열, 숫자, 문자 등을 추가합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);
sb.append(&quot; World&quot;);
sb.append(123);
System.out.println(sb.toString());  // 출력: Hello World123&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 타입(&lt;code&gt;String&lt;/code&gt;, &lt;code&gt;char&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt; 등)을 받을 수 있어 편리합니다.&lt;/li&gt;
&lt;li&gt;반환 타입이 &lt;code style=&quot;letter-spacing: 0px;&quot;&gt;StringBuilder&lt;/code&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이므로, 메서드 체이닝이 가능합니다:&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;sb.append(&quot; World&quot;).append(123).append('!');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 insert()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 위치에 문자열이나 값을 삽입합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);
sb.insert(5, &quot; Java&quot;);
System.out.println(sb.toString());  // 출력: Hello Java&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 인덱스에 값을 삽입할 수 있으며, 이 때 문자열이 자동으로 오른쪽으로 이동합니다.&lt;/li&gt;
&lt;li&gt;다양한 타입(&lt;code&gt;String&lt;/code&gt;, &lt;code&gt;char&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; 등)을 삽입할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 delete()&amp;nbsp; deleteCharAt()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열의 특정 부분을 삭제합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello World&quot;);
sb.delete(5, 11);  // 인덱스 5부터 11 이전까지 삭제
System.out.println(sb.toString());  // 출력: Hello

sb.deleteCharAt(0);  // 첫 번째 문자 'H' 삭제
System.out.println(sb.toString());  // 출력: ello&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;delete(int start, int end)&lt;/code&gt;: 특정 범위(start ~ end-1)의 문자열을 삭제합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deleteCharAt(int index)&lt;/code&gt;: 특정 인덱스의 문자 하나를 삭제합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4 replace()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 인덱스 범위의 문자열을 다른 문자열로 교체합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello World&quot;);
sb.replace(6, 11, &quot;Java&quot;);
System.out.println(sb.toString());  // 출력: Hello Java&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;replace(int start, int end, String str)&lt;/code&gt;: 인덱스 &lt;code&gt;start&lt;/code&gt;부터 &lt;code&gt;end-1&lt;/code&gt;까지의 문자열을 &lt;code&gt;str&lt;/code&gt;로 대체합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.5 reverse()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 반전시킵니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);
sb.reverse();
System.out.println(sb.toString());  // 출력: olleH&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간단한 메서드로 문자열을 뒤집을 수 있어 알고리즘 문제에서 유용하게 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.6 setCharAt()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 인덱스의 문자를 변경합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);
sb.setCharAt(1, 'a');
System.out.println(sb.toString());  // 출력: Hallo&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정된 인덱스의 문자 하나를 교체할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.7 substring()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;String&lt;/code&gt; 클래스의 &lt;code&gt;substring()&lt;/code&gt;과 비슷하게, &lt;code&gt;StringBuilder&lt;/code&gt;의 문자열 일부를 추출할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello World&quot;);
String sub = sb.substring(6, 11);
System.out.println(sub);  // 출력: World&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;substring(int start, int end)&lt;/code&gt;: &lt;code&gt;start&lt;/code&gt;부터 &lt;code&gt;end-1&lt;/code&gt;까지의 문자열을 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.8 length()와 capacity()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;length()&lt;/code&gt;&lt;/b&gt;: 현재 &lt;code&gt;StringBuilder&lt;/code&gt;의 문자열 길이를 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;capacity()&lt;/code&gt;&lt;/b&gt;: 현재 &lt;code&gt;StringBuilder&lt;/code&gt;의 용량(메모리 크기)을 반환합니다. 문자열의 길이보다 크며, 필요에 따라 자동으로 증가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(&quot;Hello&quot;);
System.out.println(sb.length());   // 출력: 5
System.out.println(sb.capacity()); // 기본 용량 16 + 문자열 길이 5 = 21&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.9 trimToSize()&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;StringBuilder&lt;/code&gt;의 실제 문자열 길이에 맞춰 용량을 줄입니다. 메모리 최적화에 유용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;StringBuilder sb = new StringBuilder(50);
sb.append(&quot;Hello&quot;);
sb.trimToSize();
System.out.println(sb.capacity());  // 출력: 5 (Hello의 길이)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. StringBuilder의 성능 최적화 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기 용량 설정&lt;/b&gt;: 반복적인 추가 작업이 예상되는 경우, 초기 용량을 설정하여 메모리 할당을 줄일 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메서드 체이닝 활용&lt;/b&gt;: &lt;code&gt;append()&lt;/code&gt; 메서드처럼 반환값이 &lt;code&gt;StringBuilder&lt;/code&gt;인 메서드를 연결하여 한 줄에 여러 작업을 수행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리 최적화&lt;/b&gt;: 작업이 끝난 후 &lt;code&gt;trimToSize()&lt;/code&gt; 메서드를 사용하여 불필요한 용량을 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. StringBuilder 사용 시 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;멀티스레드 환경에서 사용하지 말 것&lt;/b&gt;: &lt;code&gt;StringBuilder&lt;/code&gt;는 동기화를 지원하지 않으므로 멀티스레드 환경에서는 &lt;code&gt;StringBuffer&lt;/code&gt;를 사용하는 것이 안전합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변경이 적은 문자열에는 String 사용&lt;/b&gt;: 불필요하게 &lt;code&gt;StringBuilder&lt;/code&gt;를 사용하는 것보다, 변경이 거의 없는 문자열에는 &lt;code&gt;String&lt;/code&gt;을 사용하는 것이 더 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/Java</category>
      <category>java</category>
      <category>StringBuilder</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/73</guid>
      <comments>https://achieve-dev.tistory.com/73#entry73comment</comments>
      <pubDate>Fri, 11 Oct 2024 20:15:04 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 8. 객체 지향 프로그래밍 (OOP)</title>
      <link>https://achieve-dev.tistory.com/72</link>
      <description>&lt;div data-pm-slice=&quot;0 0 []&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TuD40/btsJ1caFvsi/Y9kzt0kSbOP5uNQf4SCPk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TuD40/btsJ1caFvsi/Y9kzt0kSbOP5uNQf4SCPk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TuD40/btsJ1caFvsi/Y9kzt0kSbOP5uNQf4SCPk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTuD40%2FbtsJ1caFvsi%2FY9kzt0kSbOP5uNQf4SCPk0%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;250&quot; height=&quot;250&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. 객체 지향 프로그래밍의 필요성&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;객체 지향 프로그래밍(OOP)은 코드의 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;재사용성&lt;/span&gt;&lt;/b&gt;과 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;유지 보수성&lt;/b&gt;&lt;/span&gt;을 향상시키기 위해 필요한 프로그래밍 패러다임입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;OOP는 현실 세계의 개념을 클래스와 객체로 모델링하여 문제를 직관적으로 해결할 수 있도록 돕습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;코드의 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;중복을 줄이고, 프로그램의 확장성을 높여주는 주요한 특징&lt;/span&gt;&lt;/b&gt;을 가지고 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. 객체 지향 프로그래밍의 주요 개념&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체 지향 프로그래밍은 네 가지 주요한 특징으로 구성됩니다: &lt;/span&gt;&lt;span&gt;&lt;b&gt;캡슐화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;b&gt;상속&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;b&gt;다형성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;b&gt;추상화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. 캡슐화 (Encapsulation)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;캡슐화는 데이터를 보호하고, 외부에서 직접 접근할 수 없도록 은닉하는 개념입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;클래스 내부의 필드와 메서드를 캡슐화하여, 객체의 상태를 안전하게 유지할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;예시)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;접근 제어자 &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;을 사용하여 접근 범위를 제한합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class Car(private val brand: String, private val model: String) {
    fun startEngine() {
        println(&quot;$brand $model의 엔진이 켜졌습니다.&quot;)
    }
}

fun main() {
    val myCar = Car(&quot;Hyundai&quot;, &quot;Sonata&quot;)
    myCar.startEngine()  // 출력: Hyundai Sonata의 엔진이 켜졌습니다.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. 상속 (Inheritance)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;상속은 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;기존의 클래스를 재사용&lt;/span&gt;&lt;/b&gt;하여 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;새로운 클래스를 생성&lt;/span&gt;&lt;/b&gt;하는 방법입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;상속을 통해 코드 중복을 줄이고, 공통된 기능을 부모 클래스에서 정의하여 자식 클래스에서 활용할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;open class Animal(val name: String) {
    fun eat() {
        println(&quot;$name이(가) 먹고 있습니다.&quot;)
    }
}

class Dog(name: String): Animal(name) {
    fun bark() {
        println(&quot;$name이(가) 멍멍 짖습니다.&quot;)
    }
}

fun main() {
    val dog = Dog(&quot;바둑이&quot;)
    dog.eat()  // 출력: 바둑이가 먹고 있습니다.
    dog.bark() // 출력: 바둑이가 멍멍 짖습니다.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. 다형성 (Polymorphism)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;다형성은 하나의 객체가 여러 가지 형태를 가질 수 있는 성질을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;상속과 함께 사용되어 부모 클래스의 참조 변수로 자식 클래스의 객체를 참조할 수 있으며, 동일한 인터페이스를 구현하여 다른 동작을 수행할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;open class Animal {
    open fun sound() {
        println(&quot;동물이 소리를 냅니다.&quot;)
    }
}

class Cat: Animal() {
    override fun sound() {
        println(&quot;야옹!&quot;)
    }
}

fun main() {
    val myAnimal: Animal = Cat()
    myAnimal.sound()  // 출력: 야옹!
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. 추상화 (Abstraction)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;추상화는 공통적인 속성과 기능을 추출하여 클래스로 정의하는 것을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;불필요한 세부 사항은 숨기고 중요한 기능만을 드러내어 복잡성을 줄입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;abstract class Appliance(val name: String) {
    abstract fun turnOn()
}

class WashingMachine(name: String): Appliance(name) {
    override fun turnOn() {
        println(&quot;$name이(가) 작동을 시작합니다.&quot;)
    }
}

fun main() {
    val washer = WashingMachine(&quot;삼성 세탁기&quot;)
    washer.turnOn()  // 출력: 삼성 세탁기가 작동을 시작합니다.
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Kotlin/Kotlin 입문</category>
      <category>Kotlin</category>
      <category>OOP</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/72</guid>
      <comments>https://achieve-dev.tistory.com/72#entry72comment</comments>
      <pubDate>Thu, 10 Oct 2024 16:58:57 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 7. 함수</title>
      <link>https://achieve-dev.tistory.com/71</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqfGg7/btsJ05QjXuN/CKiIYeyXwArHLOA9C7A3Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqfGg7/btsJ05QjXuN/CKiIYeyXwArHLOA9C7A3Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqfGg7/btsJ05QjXuN/CKiIYeyXwArHLOA9C7A3Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqfGg7%2FbtsJ05QjXuN%2FCKiIYeyXwArHLOA9C7A3Yk%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;250&quot; height=&quot;250&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 함수의 필요성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3GbM4/btsJ12FgDa9/D49jKsVZzyjsosMKKuUrFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3GbM4/btsJ12FgDa9/D49jKsVZzyjsosMKKuUrFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3GbM4/btsJ12FgDa9/D49jKsVZzyjsosMKKuUrFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3GbM4%2FbtsJ12FgDa9%2FD49jKsVZzyjsosMKKuUrFk%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;536&quot; height=&quot;510&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수는 입력값에 따라 출력값을 만들어 반환하는 &lt;span style=&quot;color: #f89009;&quot;&gt;수학적 개념과 유사&lt;/span&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;함수를 사용하면 반복되는 로직을 효율적으로 관리하고 재사용&lt;/span&gt;할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;예시) function이 2x + 1일 때:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; input: 2 ⟶ output: 5&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; input: 8 ⟶ output: 17&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 함수 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 특정 작업을 수행하는 코드의 블록입니다. 함수를 정의하고 필요할 때마다 호출함으로써 &lt;span style=&quot;color: #f89009;&quot;&gt;코드 중복을 줄이고 프로그램의 구조를 개선&lt;/span&gt;할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 선언과 호출&lt;/h3&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// 함수 선언(예시)
fun 함수명(input1: 변수타입, input2: 변수타입): 반환되는변수타입 {
     return 반환값
}

// 함수 선언
fun sum(a: Int, b: Int): Int {
    return a + b
}

// 함수 호출
fun main() {
    val result: Int = sum(3, 5)
    println(&quot;result=$result&quot;) // 출력: result=8
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 함수의 종류&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N03m7/btsJ0cbxkUl/IZ86sVPQP2zBbAdNPnisIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N03m7/btsJ0cbxkUl/IZ86sVPQP2zBbAdNPnisIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N03m7/btsJ0cbxkUl/IZ86sVPQP2zBbAdNPnisIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN03m7%2FbtsJ0cbxkUl%2FIZ86sVPQP2zBbAdNPnisIK%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;635&quot; height=&quot;165&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;input: O / output: O&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun sum(a: Int, b: Int): Int {
    return a + b
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;input: O / output: X&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun printSumResult(a: Int, b: Int) {
    println(a + b)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;input: X / output: O&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun getSystemCurrentTime(): Long {
    return System.currentTimeMillis()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;input: X / output: X&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun log() {
    println(&quot;Hello Kotlin&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Return&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수에서 &lt;code&gt;return&lt;/code&gt; 키워드는 함수의 실행을 종료하고, 필요한 경우 값을 반환합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환타입이 있는 메서드는 반드시 값을 반환해주어야 합니다&lt;/li&gt;
&lt;li&gt;반환값이 없는 함수에서도 return 을 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;return 을 만나면 즉시 함수를 빠져나갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun sum(a: Int, b: Int): Int {
    if (a == 0) {
        return 0
    }
    return a + b
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1029&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ozz08/btsJ0PNHGho/7BkXIy4WyenMCTB2mKJ3lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ozz08/btsJ0PNHGho/7BkXIy4WyenMCTB2mKJ3lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ozz08/btsJ0PNHGho/7BkXIy4WyenMCTB2mKJ3lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fozz08%2FbtsJ0PNHGho%2F7BkXIy4WyenMCTB2mKJ3lk%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;1919&quot; height=&quot;1029&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1029&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Kotlin/Kotlin 입문</category>
      <category>Kotlin</category>
      <category>함수</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/71</guid>
      <comments>https://achieve-dev.tistory.com/71#entry71comment</comments>
      <pubDate>Thu, 10 Oct 2024 16:43:39 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] 6. 배열</title>
      <link>https://achieve-dev.tistory.com/70</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBhXRG/btsJYUhGRPM/MlAUA8PZYQMRVy02KP4ZQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBhXRG/btsJYUhGRPM/MlAUA8PZYQMRVy02KP4ZQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBhXRG/btsJYUhGRPM/MlAUA8PZYQMRVy02KP4ZQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBhXRG%2FbtsJYUhGRPM%2FMlAUA8PZYQMRVy02KP4ZQK%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;250&quot; height=&quot;250&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 배열의 필요성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열은 여러 데이터를 하나의 변수에 할당하여 관리할 수 있게 해주어, 코드의 효율성을 높여줍니다.&lt;/li&gt;
&lt;li&gt;예를 들어, 여러 회원의 운동 기록을 각각 다루는 대신 배열을 사용하여 간단히 관리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun main() {
    val member1 = 100
    val member2 = 300
    val member3 = 250
    println(&quot;member1의 3대 운동은 $member1입니다&quot;)
    println(&quot;member2의 3대 운동은 $member2입니다&quot;)
    println(&quot;member3의 3대 운동은 $member3입니다&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 배열 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 생성하는 방법은 &lt;code&gt;2가지&lt;/code&gt;가 있습니다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1) 배열의 크기를 정하고 초기값 지정하여 생성&lt;/h3&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;fun main() {
        val array = Array&amp;lt;변수타입&amp;gt;(배열사이즈) { 초기값 }
    val array = Array&amp;lt;Int&amp;gt;(3) { 0 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2) 특정값을 넣어서 배열을 생성하는 경우&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;fun main() {
        val array = arrayOf&amp;lt;변수타입&amp;gt;(특정값1, 특정값2, 특정값3)
        val arr2 = arrayOf&amp;lt;Int&amp;gt;(10, 20, 30)

    array[0] = 100
    println(&quot;값=${array[0]}&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 인덱스를 잘못 사용했을 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선언하지 않은 Index를 사용할 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun main() {
    val array = Array&amp;lt;Int&amp;gt;(3) { 0 }
    println(&quot;값=${array[3]}&quot;)  // 에러 발생
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Index 3 out of bounds for length 3&lt;/code&gt; 에러 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IwnMB/btsJ0C0RK6n/5TpROEplA5hpLaEnPDCZLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IwnMB/btsJ0C0RK6n/5TpROEplA5hpLaEnPDCZLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IwnMB/btsJ0C0RK6n/5TpROEplA5hpLaEnPDCZLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIwnMB%2FbtsJ0C0RK6n%2F5TpROEplA5hpLaEnPDCZLk%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;958&quot; height=&quot;68&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 2차원 배열&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PoFza/btsJ0hvStDe/pf97zveTk7DiMlIICq8d50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PoFza/btsJ0hvStDe/pf97zveTk7DiMlIICq8d50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PoFza/btsJ0hvStDe/pf97zveTk7DiMlIICq8d50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPoFza%2FbtsJ0hvStDe%2Fpf97zveTk7DiMlIICq8d50%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;631&quot; height=&quot;169&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 안에 배열을 넣어 2차원 배열을 생성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;fun main() {
    val records = arrayOf(
        arrayOf(1, 2, 3, 4, 5),
        arrayOf(6, 7, 8, 9, 10),
    )
    records[0][2] = 33
    for (row in records) {
        for (column in row) {
            println(&quot;value=$column&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/olSge/btsJX8t2jIy/ABgIZo5F7YIT8mzmm4H3r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/olSge/btsJX8t2jIy/ABgIZo5F7YIT8mzmm4H3r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/olSge/btsJX8t2jIy/ABgIZo5F7YIT8mzmm4H3r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FolSge%2FbtsJX8t2jIy%2FABgIZo5F7YIT8mzmm4H3r0%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;548&quot; height=&quot;107&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1033&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfiXjG/btsJZN9QR0k/PvqkWktnXsK4HHLEYKoTQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfiXjG/btsJZN9QR0k/PvqkWktnXsK4HHLEYKoTQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfiXjG/btsJZN9QR0k/PvqkWktnXsK4HHLEYKoTQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfiXjG%2FbtsJZN9QR0k%2FPvqkWktnXsK4HHLEYKoTQK%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;646&quot; height=&quot;348&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1033&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Kotlin/Kotlin 입문</category>
      <category>Kotlin</category>
      <category>배열</category>
      <author>JoonYong</author>
      <guid isPermaLink="true">https://achieve-dev.tistory.com/70</guid>
      <comments>https://achieve-dev.tistory.com/70#entry70comment</comments>
      <pubDate>Wed, 9 Oct 2024 16:36:02 +0900</pubDate>
    </item>
  </channel>
</rss>