<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on Korobopolly's Dev Blog</title><link>https://korobopolly.github.io/series/java/</link><description>Recent content in Java on Korobopolly's Dev Blog</description><generator>Hugo</generator><language>ko</language><lastBuildDate>Mon, 16 Feb 2026 13:16:00 +0900</lastBuildDate><atom:link href="https://korobopolly.github.io/series/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Java 동시성 프로그래밍 - ExecutorService, 동기화, Context Switching</title><link>https://korobopolly.github.io/posts/java-concurrency/</link><pubDate>Mon, 16 Feb 2026 13:16:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/java-concurrency/</guid><description>&lt;h2 id="동시성-프로그래밍이란"&gt;동시성 프로그래밍이란&lt;/h2&gt;
&lt;p&gt;현대 애플리케이션은 여러 작업을 동시에 처리해야 합니다. 파일 업로드를 받으면서 DB 쿼리를 실행하고, API 요청을 처리하는 등 멀티태스킹은 필수입니다. Java는 강력한 동시성 라이브러리를 제공하여 이런 작업을 안전하고 효율적으로 처리할 수 있게 합니다.&lt;/p&gt;
&lt;p&gt;이 글에서는 Thread 기본부터 ThreadPool, 동기화 메커니즘까지 실전 예제와 함께 알아봅니다.&lt;/p&gt;
&lt;h2 id="thread와-runnable-기본"&gt;Thread와 Runnable 기본&lt;/h2&gt;
&lt;h3 id="thread-생성-방법"&gt;Thread 생성 방법&lt;/h3&gt;
&lt;p&gt;Java에서 스레드를 생성하는 두 가지 방법이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Thread 클래스 상속&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;class&lt;/span&gt; &lt;span style="color:#f9e2af"&gt;MyThread&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;extends&lt;/span&gt; Thread {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#89b4fa;font-weight:bold"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;void&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;run&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#89b4fa"&gt;out&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;println&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;Thread 실행: &amp;#34;&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; Thread.&lt;span style="color:#89b4fa"&gt;currentThread&lt;/span&gt;().&lt;span style="color:#89b4fa"&gt;getName&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 사용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyThread thread &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#cba6f7"&gt;new&lt;/span&gt; MyThread();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;thread.&lt;span style="color:#89b4fa"&gt;start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Runnable 인터페이스 구현 (권장)&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java 디자인 패턴 - Singleton, Builder, Observer, Strategy 구현</title><link>https://korobopolly.github.io/posts/java-design-patterns/</link><pubDate>Mon, 16 Feb 2026 13:15:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/java-design-patterns/</guid><description>&lt;h2 id="디자인-패턴이란"&gt;디자인 패턴이란&lt;/h2&gt;
&lt;p&gt;디자인 패턴은 소프트웨어 설계에서 반복적으로 나타나는 문제들에 대한 재사용 가능한 해결책입니다. &amp;quot;바퀴를 다시 발명하지 마라&amp;quot;는 원칙처럼, 검증된 설계 방법을 배우고 적용하면 유지보수가 쉽고 확장 가능한 코드를 작성할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이 글에서는 실무에서 자주 쓰이는 핵심 패턴들을 Java 코드와 함께 알아봅니다.&lt;/p&gt;
&lt;h2 id="디자인-패턴의-분류"&gt;디자인 패턴의 분류&lt;/h2&gt;
&lt;p&gt;GoF(Gang of Four)는 23가지 패턴을 세 가지로 분류했습니다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;생성 패턴 (Creational)&lt;/strong&gt;: 객체 생성 방식 - Singleton, Builder, Factory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;구조 패턴 (Structural)&lt;/strong&gt;: 객체 조합 방식 - Facade, Adapter, Decorator&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;행위 패턴 (Behavioral)&lt;/strong&gt;: 객체 간 통신 방식 - Observer, Strategy, Template Method&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;모든 패턴을 외울 필요는 없습니다. 문제를 만났을 때 &amp;quot;이 상황에 맞는 패턴이 있나?&amp;quot;를 떠올릴 수 있으면 충분합니다.&lt;/p&gt;</description></item><item><title>Java Stream API - filter, map, collect와 병렬 스트림</title><link>https://korobopolly.github.io/posts/java-stream-api/</link><pubDate>Mon, 16 Feb 2026 13:14:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/java-stream-api/</guid><description>&lt;h2 id="stream-api란"&gt;Stream API란?&lt;/h2&gt;
&lt;p&gt;Java 8에서 도입된 Stream API는 컬렉션 데이터를 함수형 스타일로 처리할 수 있게 해주는 강력한 도구입니다. Stream을 사용하면 데이터를 선언적으로 처리하고, 병렬 처리를 쉽게 구현할 수 있으며, 코드의 가독성을 크게 향상시킬 수 있습니다.&lt;/p&gt;
&lt;p&gt;Stream은 데이터의 흐름을 나타내며, 원본 데이터를 변경하지 않고 중간 연산과 최종 연산을 통해 데이터를 처리합니다. 이러한 특성 덕분에 불변성을 유지하면서도 효율적인 데이터 처리가 가능합니다.&lt;/p&gt;
&lt;h2 id="stream-생성-방법"&gt;Stream 생성 방법&lt;/h2&gt;
&lt;p&gt;Stream을 생성하는 다양한 방법이 있습니다.&lt;/p&gt;
&lt;h3 id="컬렉션으로부터-생성"&gt;컬렉션으로부터 생성&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; list &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Arrays.&lt;span style="color:#89b4fa"&gt;asList&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;Apple&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;Banana&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;Cherry&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; stream &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; list.&lt;span style="color:#89b4fa"&gt;stream&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 병렬 스트림&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; parallelStream &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; list.&lt;span style="color:#89b4fa"&gt;parallelStream&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="배열로부터-생성"&gt;배열로부터 생성&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;String&lt;span style="color:#89dceb;font-weight:bold"&gt;[]&lt;/span&gt; array &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; {&lt;span style="color:#a6e3a1"&gt;&amp;#34;Apple&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;Banana&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;Cherry&amp;#34;&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; stream &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Arrays.&lt;span style="color:#89b4fa"&gt;stream&lt;/span&gt;(array);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 범위 지정&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;int&lt;/span&gt;&lt;span style="color:#89dceb;font-weight:bold"&gt;[]&lt;/span&gt; numbers &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; {1, 2, 3, 4, 5};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IntStream stream &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Arrays.&lt;span style="color:#89b4fa"&gt;stream&lt;/span&gt;(numbers, 1, 4); &lt;span style="color:#6c7086;font-style:italic"&gt;// 2, 3, 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="streamof-사용"&gt;Stream.of() 사용&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; stream &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Stream.&lt;span style="color:#89b4fa"&gt;of&lt;/span&gt;(&lt;span style="color:#a6e3a1"&gt;&amp;#34;Apple&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;Banana&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;Cherry&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; numberStream &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Stream.&lt;span style="color:#89b4fa"&gt;of&lt;/span&gt;(1, 2, 3, 4, 5);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="범위-생성"&gt;범위 생성&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 1부터 10까지 (10 포함)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IntStream range &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; IntStream.&lt;span style="color:#89b4fa"&gt;rangeClosed&lt;/span&gt;(1, 10);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 1부터 10까지 (10 미포함)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IntStream range2 &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; IntStream.&lt;span style="color:#89b4fa"&gt;range&lt;/span&gt;(1, 10);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="무한-스트림-생성"&gt;무한 스트림 생성&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// iterate: 초기값부터 시작해서 함수를 반복 적용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; evenNumbers &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Stream.&lt;span style="color:#89b4fa"&gt;iterate&lt;/span&gt;(0, n &lt;span style="color:#89dceb;font-weight:bold"&gt;-&amp;gt;&lt;/span&gt; n &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; 2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// generate: 매번 새로운 값을 생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;Double&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; randomNumbers &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Stream.&lt;span style="color:#89b4fa"&gt;generate&lt;/span&gt;(Math::random);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;// 무한 스트림은 limit()으로 제한 필요&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stream&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style="color:#89dceb;font-weight:bold"&gt;&amp;gt;&lt;/span&gt; first10Evens &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Stream.&lt;span style="color:#89b4fa"&gt;iterate&lt;/span&gt;(0, n &lt;span style="color:#89dceb;font-weight:bold"&gt;-&amp;gt;&lt;/span&gt; n &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; 2).&lt;span style="color:#89b4fa"&gt;limit&lt;/span&gt;(10);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="중간-연산-intermediate-operations"&gt;중간 연산 (Intermediate Operations)&lt;/h2&gt;
&lt;p&gt;중간 연산은 Stream을 반환하므로 여러 개를 연결(chaining)할 수 있습니다. 중간 연산은 지연 평가(lazy evaluation)되어 최종 연산이 호출될 때까지 실행되지 않습니다.&lt;/p&gt;</description></item><item><title>Lombok 핵심 어노테이션 - @Data, @Builder, Spring Boot 실전 패턴</title><link>https://korobopolly.github.io/posts/java-lombok/</link><pubDate>Mon, 16 Feb 2026 13:11:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/java-lombok/</guid><description>&lt;h2 id="lombok이란"&gt;Lombok이란&lt;/h2&gt;
&lt;p&gt;Java로 개발하다 보면 getter, setter, 생성자, toString, equals 같은 반복적인 코드를 매번 작성해야 합니다. Lombok은 어노테이션만으로 이런 보일러플레이트 코드를 컴파일 시점에 자동 생성해주는 라이브러리입니다.&lt;/p&gt;
&lt;h3 id="lombok-없이-vs-있을-때"&gt;Lombok 없이 vs 있을 때&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Lombok 없이:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;class&lt;/span&gt; &lt;span style="color:#f9e2af"&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;private&lt;/span&gt; Long id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;private&lt;/span&gt; String name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;private&lt;/span&gt; String email;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;User&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;User&lt;/span&gt;(Long id, String name, String email) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;id&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;name&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;email&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; email;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; Long &lt;span style="color:#89b4fa"&gt;getId&lt;/span&gt;() { &lt;span style="color:#cba6f7"&gt;return&lt;/span&gt; id; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;void&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;setId&lt;/span&gt;(Long id) { &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;id&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; id; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; String &lt;span style="color:#89b4fa"&gt;getName&lt;/span&gt;() { &lt;span style="color:#cba6f7"&gt;return&lt;/span&gt; name; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;void&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;setName&lt;/span&gt;(String name) { &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;name&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; name; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; String &lt;span style="color:#89b4fa"&gt;getEmail&lt;/span&gt;() { &lt;span style="color:#cba6f7"&gt;return&lt;/span&gt; email; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;void&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;setEmail&lt;/span&gt;(String email) { &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;email&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; email; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#89b4fa;font-weight:bold"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; String &lt;span style="color:#89b4fa"&gt;toString&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;return&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;User{id=&amp;#34;&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; id &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;, name=&amp;#34;&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; name &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;, email=&amp;#34;&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; email &lt;span style="color:#89dceb;font-weight:bold"&gt;+&lt;/span&gt; &lt;span style="color:#a6e3a1"&gt;&amp;#34;}&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#89b4fa;font-weight:bold"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;boolean&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;equals&lt;/span&gt;(Object o) { &lt;span style="color:#6c7086;font-style:italic"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#89b4fa;font-weight:bold"&gt;@Override&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;int&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;hashCode&lt;/span&gt;() { &lt;span style="color:#6c7086;font-style:italic"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Lombok 사용:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java 17+ 최신 문법 - Record, Sealed Class, Pattern Matching, Virtual Thread</title><link>https://korobopolly.github.io/posts/java-modern-features/</link><pubDate>Mon, 16 Feb 2026 13:10:00 +0900</pubDate><guid>https://korobopolly.github.io/posts/java-modern-features/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;Java는 6개월마다 새로운 버전을 출시하며 지속적으로 발전하고 있습니다. Java 17은 LTS(Long-Term Support) 버전으로, 이후 Java 21도 LTS로 지정되었습니다. 이 글에서는 Java 17 이상에서 도입된 주요 기능들을 실제 코드 예제와 함께 살펴보겠습니다.&lt;/p&gt;
&lt;h2 id="1-sealed-classes-봉인-클래스"&gt;1. Sealed Classes (봉인 클래스)&lt;/h2&gt;
&lt;p&gt;Sealed Classes는 Java 17에서 정식 기능으로 추가되었으며, 클래스 계층 구조를 명시적으로 제어할 수 있게 해줍니다. 어떤 클래스가 특정 클래스를 상속할 수 있는지를 제한함으로써 더 안전하고 예측 가능한 코드를 작성할 수 있습니다.&lt;/p&gt;
&lt;h3 id="기본-문법"&gt;기본 문법&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;sealed&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;class&lt;/span&gt; &lt;span style="color:#f9e2af"&gt;Shape&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; permits Circle, Rectangle, Triangle {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6c7086;font-style:italic"&gt;// 공통 메서드&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;final&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;class&lt;/span&gt; &lt;span style="color:#f9e2af"&gt;Circle&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;extends&lt;/span&gt; Shape {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;private&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;final&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; radius;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;Circle&lt;/span&gt;(&lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; radius) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;radius&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; radius;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;area&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;return&lt;/span&gt; Math.&lt;span style="color:#89b4fa"&gt;PI&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;*&lt;/span&gt; radius &lt;span style="color:#89dceb;font-weight:bold"&gt;*&lt;/span&gt; radius;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;final&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;class&lt;/span&gt; &lt;span style="color:#f9e2af"&gt;Rectangle&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;extends&lt;/span&gt; Shape {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;private&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;final&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;private&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;final&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;Rectangle&lt;/span&gt;(&lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; width, &lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; height) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;width&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; width;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;this&lt;/span&gt;.&lt;span style="color:#89b4fa"&gt;height&lt;/span&gt; &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;double&lt;/span&gt; &lt;span style="color:#89b4fa"&gt;area&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cba6f7"&gt;return&lt;/span&gt; width &lt;span style="color:#89dceb;font-weight:bold"&gt;*&lt;/span&gt; height;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f38ba8"&gt;public&lt;/span&gt; non&lt;span style="color:#89dceb;font-weight:bold"&gt;-&lt;/span&gt;&lt;span style="color:#f38ba8"&gt;sealed&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;class&lt;/span&gt; &lt;span style="color:#f9e2af"&gt;Triangle&lt;/span&gt; &lt;span style="color:#f38ba8"&gt;extends&lt;/span&gt; Shape {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6c7086;font-style:italic"&gt;// 다른 클래스가 Triangle을 상속할 수 있음&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="주요-특징"&gt;주요 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sealed&lt;/code&gt; 키워드로 봉인 클래스 선언&lt;/li&gt;
&lt;li&gt;&lt;code&gt;permits&lt;/code&gt; 절로 허용할 하위 클래스 명시&lt;/li&gt;
&lt;li&gt;하위 클래스는 반드시 &lt;code&gt;final&lt;/code&gt;, &lt;code&gt;sealed&lt;/code&gt;, &lt;code&gt;non-sealed&lt;/code&gt; 중 하나로 선언&lt;/li&gt;
&lt;li&gt;도메인 모델링 시 타입 안전성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-pattern-matching-패턴-매칭"&gt;2. Pattern Matching (패턴 매칭)&lt;/h2&gt;
&lt;h3 id="instanceof-패턴-매칭"&gt;instanceof 패턴 매칭&lt;/h3&gt;
&lt;p&gt;기존의 instanceof 검사 후 캐스팅하는 번거로운 과정을 간소화합니다.&lt;/p&gt;</description></item></channel></rss>