소스: java-src/advanced/07_modern_java (Shape, PaymentResult, Main).
cd java-src/advanced/07_modern_java
javac -encoding UTF-8 *.java && java -Dstdout.encoding=UTF-8 Mainvar list = new ArrayList<String>();
var count = 0;
for (var e : Map.of("k", 1).entrySet()) System.out.println(e.getKey() + "=" + e.getValue());list 타입: ArrayList, count 타입은 int 라 count = "x" 는 컴파일 오류, price = 1000
for-each 의 var: k=1 (Map.Entry<String,Integer> 를 안 써도 된다)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); }
}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.0moveX 가 새 Point 를 돌려주고 원본은 그대로입니다. 잘못된 값은 생성 시점에 막힙니다.
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칸)가 보존됐습니다. 닫는 """ 가 내용과 같은 열에 있었기 때문입니다.
String desc = switch (s) { // Shape 는 sealed. default 없음
case Circle c -> "원 r=" + c.r();
case Rect r -> "사각형 " + r.w() + "x" + r.h();
case Triangle t -> "삼각형";
};day 1 → 주말
day 4 → 평일
day 7 → 주말
원 r=1.0case Triangle t 를 지우면 "switch 식이 모든 가능한 입력 값을 다루지 않습니다" 로 컴파일이 실패합니다.
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 + "초 후 재조회";
};
}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 와 캐스팅이 한 줄도 없습니다.
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