## Lazy Constants (JEP 526)
JEP 526: Lazy Constants (Second Preview)는 Java 26에서 도입될 예정인 기능으로, '지연 초기화 상수(Lazy Constants)'를 위한 새로운 API를 제안하는 문서입니다.
이전에는 'Stable Values (JEP 502)'라는 이름으로 불렸으나, 개발자들이 더 직관적으로 이해할 수 있도록 'Lazy Constants'로 이름이 바뀌고 설계가 개선되었습니다. 핵심 내용을 알기 쉽게 정리해 드립니다.
---
### 1. 배경: 왜 필요한가?
Java에서 특정 값을 처음 필요할 때 딱 한 번만 계산(지연 초기화)하고, 그 이후에는 **상수처럼 안전하게 재사용**하고 싶을 때가 많습니다. 기존에는 이를 위해 다음과 같은 방식을 썼습니다:
- **Double-Checked Locking:** 구현이 복잡하고 실수하기 쉽습니다.
- **Lazy Holder Class:** 클래스 로딩 메커니즘을 이용하지만 코드가 다소 번잡합니다.
- **일반 필드 + null 체크:** 스레드 안전성(Thread-safety)을 직접 보장해야 하고 JVM 최적화가 어렵습니다.
### 2. 주요 개념: `LazyConstant`
JEP 526은 이를 언어/라이브러리 차원에서 공식 지원하는 **`java.lang.LazyConstant`** 클래스를 도입합니다.
### 사용 예시 (가상 코드):
Java
```java
// 선언 시점에 계산 로직(Supplier)을 정의하지만, 실행되지는 않음
static final LazyConstant CONFIG = LazyConstant.of(() -> {
System.out.println("설정 로드 중...");
return "초기화된 설정 값";
});
// 처음 get()을 호출하는 시점에 딱 한 번만 Supplier가 실행됨
String val1 = CONFIG.get();
String val2 = CONFIG.get(); // 이미 계산된 값을 반환
```
### 3. 핵심 특징
- **한 번만 실행 보장:** 여러 스레드가 동시에 `get()`을 호출해도 내부적으로 동기화되어 초기화 로직은 단 한 번만 실행됩니다.
- **JVM 최적화:** JVM은 이 값을 `final` 필드처럼 '상수'로 취급하여 매우 강력한 성능 최적화(Constant Folding 등)를 적용할 수 있습니다.
- **Null 불허:** 이번 2차 프리뷰 버전부터는 `LazyConstant`의 값으로 `null`을 가질 수 없게 설계되어 안정성을 높였습니다.
- **단순화된 API:** 이전(JEP 502)에 존재했던 복잡한 저수준 메서드(`setOrThrow`, `trySet` 등)를 제거하고, 오직 지연 초기화에만 집중하도록 단순해졌습니다.
### 4. 확장 기능: 지연 컬렉션
개별 값뿐만 아니라 **Lazy List**나 **Lazy Map**도 지원할 예정입니다. 리스트의 모든 요소를 미리 만들어두는 것이 아니라, 특정 인덱스에 접근할 때 해당 요소만 지연 초기화하는 방식입니다.
---
### 요약하자면
JEP 526은 "복잡한 동기화 코드 없이도, 성능은 상수 수준으로 빠르면서 초기화는 필요한 시점에 딱 한 번만 수행하는 안전한 도구"를 만드는 것이 목표입니다. 이를 통해 Java 애플리케이션의 시작 성능(Startup)을 개선하고 개발자의 실수를 줄일 수 있습니다.
[LazyConstants in JDK 26 - Inside Java Newscast #106](https://www.youtube.com/watch?v=BZlXZyXA4jY)
이 영상은 JDK 26에 도입된 `LazyConstant`의 개념과 기존 방식 대비 장점, 그리고 JVM 최적화가 어떻게 작동하는지를 시각적으로 잘 설명해 줍니다.
댓글
댓글 쓰기