공공부하자개발 · 영어 학습 노트
자바
고급모던 자바와 성능0/10 완료
  • 01제네릭과 와일드카드
  • 02멀티스레드와 동기화
  • 03람다식과 함수형 인터페이스
  • 04Stream API와 병렬 처리
  • 05Optional로 NPE 방지
  • 06메서드 활용 패턴 (고급)
  • 07Java 21 모던 문법
  • 08어노테이션·리플렉션·동적 프록시
  • 09CompletableFuture 심화와 가상 스레드 실전
  • 10JVM 메모리·GC·OOM 진단
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 고급 › 07 / 10

Java 21 모던 문법

var, record, 텍스트 블록, switch 식, 패턴 매칭, sealed
섹션 7진행 0 / 10
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

3. 코드 예제

소스: java-src/advanced/07_modern_java (Shape, PaymentResult, Main).

bash
cd java-src/advanced/07_modern_java
javac -encoding UTF-8 *.java && java -Dstdout.encoding=UTF-8 Main

예제 1: var

java
var list = new ArrayList<String>();
var count = 0;
for (var e : Map.of("k", 1).entrySet()) System.out.println(e.getKey() + "=" + e.getValue());
text
list 타입: ArrayList, count 타입은 int 라 count = "x" 는 컴파일 오류, price = 1000
for-each 의 var: k=1 (Map.Entry<String,Integer> 를 안 써도 된다)

예제 2: record 의 검증과 불변 연산

java
record Point(int x, int y) {
    Point { if (x < 0 || y < 0) throw new IllegalArgumentException("음수 좌표"); }
    Point moveX(int dx) { return new Point(x + dx, y); }
}
text
Point[x=3, y=4] x=3 dist=5.0 moveX(1)=Point[x=4, y=4] equals(new Point(3,4))=true
검증: 음수 좌표
정적 팩토리 Rect[w=5.0, h=5.0] 넓이 25.0
압축 생성자 검증: 변 길이는 양수: 0.0x1.0

moveX 가 새 Point 를 돌려주고 원본은 그대로입니다. 잘못된 값은 생성 시점에 막힙니다.

예제 3: 텍스트 블록

text
SELECT o.order_no, o.amount
  FROM orders o
 WHERE o.status = 'PAID'
   AND o.order_date >= :from
{"name": "kim", "amount": 1000}  ← 따옴표 이스케이프 없음, formatted() 로 값 주입
아주 긴 문장을 소스에서는 두 줄로 쓰고 실행 시엔 한 줄로  (줄 끝 \ 는 줄바꿈 제거)

SQL 의 상대 들여쓰기(FROM 앞 공백 2칸)가 보존됐습니다. 닫는 """ 가 내용과 같은 열에 있었기 때문입니다.

예제 4: switch 식과 sealed 완전성

java
String desc = switch (s) {                 // Shape 는 sealed. default 없음
    case Circle c -> "원 r=" + c.r();
    case Rect r -> "사각형 " + r.w() + "x" + r.h();
    case Triangle t -> "삼각형";
};
text
day 1 → 주말
day 4 → 평일
day 7 → 주말
원 r=1.0

case Triangle t 를 지우면 "switch 식이 모든 가능한 입력 값을 다루지 않습니다" 로 컴파일이 실패합니다.

예제 5: 해체 패턴과 가드로 결제 결과 처리

java
static String handle(PaymentResult pr) {
    return switch (pr) {
        case null -> "결과 없음";
        case Approved(String tx, BigDecimal amt) -> "승인 " + tx + " " + amt + "원 → 주문 확정";
        case Declined(String reason, boolean retry) when retry -> "거절(" + reason + ") → 재시도 큐";
        case Declined(String reason, boolean retry) -> "거절(" + reason + ") → 사용자 안내";
        case Pending(int eta) -> "보류 → " + eta + "초 후 재조회";
    };
}
text
instanceof 패턴: HELLO
  원(1.0)
  직사각형 2.0x3.0
  정사각형 4.0
  삼각형 넓이 6.0
  승인 TX1 9900원 → 주문 확정
  거절(한도 초과) → 사용자 안내
  거절(일시 오류) → 재시도 큐
  보류 → 30초 후 재조회
  결과 없음 (case null 로 NPE 대신 처리)

Rect(2,3) 은 직사각형, Rect.square(4) 는 정사각형으로 갈렸습니다. 같은 타입을 when 조건으로 나눈 것입니다. 거절 두 건도 retryable 값에 따라 다른 case 를 탔습니다. if-else 와 캐스팅이 한 줄도 없습니다.

예제 6: 신규 API

text
String: a b|-----|true|3줄|1000원
Stream.toList() [1, 2, 3, 4, 5] getFirst=1 getLast=5 reversed=[5, 4, 3, 2, 1]  (Java 21 SequencedCollection)
List.copyOf(이미 불변) 은 같은 객체를 재사용: true / List.of 계열은 null 금지, 수정 시 UnsupportedOperationException

예제 직접 실행

아래 폴더를 JDK 21 로 컴파일하고 실행합니다.

cd java-src\advanced\07_modern_java
javac -encoding UTF-8 *.java && java Main
코드 예제
  • 예제 1: var
  • 예제 2: record 의 검증과 불변 연산
  • 예제 3: 텍스트 블록
  • 예제 4: switch 식과 sealed 완전성
  • 예제 5: 해체 패턴과 가드로 결제 결과 처리
  • 예제 6: 신규 API
이전 섹션2 핵심 원리3 / 7다음 섹션4 응용 변형 예제