홈 › 고급 › 07 / 10

Java 21 모던 문법

var, record, 텍스트 블록, switch 식, 패턴 매칭, sealed
섹션 7진행 0 / 10

4. 응용 변형 예제

변형 1: 스트림 중간 결과를 지역 record 로

java
record NameAmount(String name, BigDecimal amount) {}
var top = orders.stream()
        .map(o -> new NameAmount(o.customer(), o.amount()))
        .sorted(Comparator.comparing(NameAmount::amount).reversed())
        .limit(3).toList();

Map.Entry 나 Object[] 로 짝을 나르던 코드가 이름 있는 타입이 됩니다. 메서드 밖에서 쓸 일이 없으면 지역 record 로 충분합니다.

변형 2: API 응답을 sealed 로 표현

java
sealed interface ApiResult<T> permits Ok, Fail {}
record Ok<T>(T data) implements ApiResult<T> {}
record Fail<T>(int status, String message) implements ApiResult<T> {}

String render(ApiResult<User> r) {
    return switch (r) {
        case Ok<User>(User u) -> "환영합니다, " + u.name();
        case Fail<User>(int s, String m) when s == 401 -> "다시 로그인하세요";
        case Fail<User>(int s, String m) -> "오류 " + s + ": " + m;
    };
}

예외 대신 결과 타입으로 실패를 표현하면, 호출자가 실패 처리를 빠뜨릴 수 없습니다. 제네릭 record 도 해체 패턴이 됩니다.

변형 3: 텍스트 블록으로 JSON 테스트 데이터

java
String body = """
        {
          "orderNo": %d,
          "items": [{"code": "A1", "qty": 2}]
        }
        """.formatted(1001);

테스트 코드의 요청 본문, MyBatis 동적 SQL 조각, 이메일 템플릿이 텍스트 블록의 자리입니다. 값 주입은 신뢰할 수 있는 값에만 씁니다.

변형 4: instanceof 패턴으로 equals 줄이기

java
@Override public boolean equals(Object o) {
    return o instanceof Member m && id == m.id;      // 검사·캐스팅·비교가 한 줄
}

중급 07 의 세 줄짜리 equals 가 한 줄이 됩니다. instanceof 가 false 면 && 뒤를 평가하지 않으므로 null 도 안전합니다.