배경 및 맥락
Project Valhalla는 Java가 오래 유지해 온 객체 모델의 한계를 줄이기 위한 장기 프로젝트다. Java에서는 primitive를 제외한 대부분의 값이 reference object로 표현되기 때문에, 순수한 값처럼 보이는 domain type도 object identity, indirection, heap allocation, synchronization 가능성 같은 비용과 의미를 함께 갖는다.
JEP 401은 이 문제를 value classes and objects라는 preview feature로 다룬다. 목표는 개발자가 좌표, 날짜, 금액, Optional 같은 불변 domain value를 class처럼 표현하면서도, JVM이 더 조밀하고 효율적인 layout을 선택할 수 있게 하는 것이다. 이는 단순 syntax sugar가 아니라 Java 언어, VM, 표준 라이브러리의 계약을 함께 바꾸는 변화다.
핵심 내용
OpenJDK JEP 401은 final fields만 갖고 object identity가 없는 value object를 Java Platform에 도입한다. 값 객체는 위치나 identity가 아니라 field value로 구분되며, JVM은 프로그램 의미를 깨지 않는 범위에서 stack allocation, dense heap layout, 더 나은 cache locality 같은 최적화를 적용할 여지를 얻는다.
JEP 문서는 Integer, Long, Optional, LocalDate, LocalDateTime, Duration 등 java.*의 여러 class가 value class로 다뤄질 수 있음을 설명한다. 동시에 synchronized, identity-sensitive reference API, deep reflection, final field mutation과 같은 기존 관행에는 제약이 생긴다. 이 변화는 preview feature로 시작되므로 개발자는 opt-in으로 실험할 수 있지만, 라이브러리 작성자에게는 호환성 검토가 필요하다.
경쟁 구도 / 비교
C# struct나 C/C++ value-like type은 오래전부터 값 중심 표현을 제공했지만, Java는 billions of lines of existing code와 managed runtime의 안정성을 지켜야 한다. JEP 401은 Java 개발자가 새로운 memory model을 직접 관리하지 않도록 하면서, identity-free object라는 더 제한된 계약을 통해 JVM 최적화 자유도를 넓히려는 접근이다.
기존 JVM 최적화도 escape analysis와 scalar replacement를 통해 일부 객체 할당을 제거할 수 있었지만, 이는 compiler가 특정 상황을 증명할 때만 가능했다. Value class는 개발자가 “이 타입은 identity가 중요하지 않다”는 계약을 명시해, library와 runtime이 더 예측 가능한 최적화 여지를 갖게 한다는 점에서 다르다.
의미
산업적으로 JEP 401은 Java가 클라우드와 엔터프라이즈 워크로드에서 계속 경쟁력을 유지하기 위해 deep runtime engineering을 이어가고 있음을 보여준다. AI 인프라와 데이터 집약 애플리케이션이 늘수록 메모리 밀도, GC 압력, cache locality는 애플리케이션 비용과 직결된다.
실무적으로는 “preview가 나오면 바로 성능이 좋아진다”는 식으로 접근하면 위험하다. 먼저 identity comparison, synchronization on boxed values, reflection 기반 framework, serialization, ORM, bytecode enhancement가 value class와 충돌하지 않는지 점검해야 한다. 플랫폼 팀은 early-access build와 preview compile 옵션으로 테스트 매트릭스를 만들고, domain model 중 value semantics가 명확한 타입부터 실험하는 것이 적절하다.