티스토리 뷰

Java & Kotlin

[Java] 프로젝트 발할라(Project Valhalla)를 통해 알아보는 자바 언어의 진화

망나니개발자 2025. 7. 1. 10:00
반응형



1. 프로젝트 발할라(Project Valhalla)를 통해 알아보는 자바 언어의 진화


[ 프로젝트 발할라(Project Valhalla) 란? ]

프로젝트 발할라는 객체 지향 프로그래밍의 추상화와 원시 타입의 뛰어난 성능 특성을 결합한 값 객체(value objects)의 도입과 제네릭(generic)에 대한 원시 타입의 지원을 강화하는 등의 작업을 통해 많은 개선을 이뤄내고자 하고 있다. 대표적으로 다음과 같은 기능들이 여러 배포에 걸쳐 추가될 것이다.

  1. Value Classes and Objects: 객체에 identity를 부여하지 않음으로써 최적화된 인코딩을 가능하게 하는 값 클래스와 객체를 도입함
  2. Null-Restricted and Nullable Types: 널-인지 타입에 대한 언어적 지원과 널-제한의 런타임 강제 적용을 제공하는 널 제한 및 널 허용 타입을 추가함
  3. Null-Restricted Value Class Types: 널-제한 값 클래스 타입을 필드 및 배열에서 사용할 때의 성능을 개선함
  4. Enhanced Primitive Boxing: 기본형을 객체처럼 다룰 수 있도록 하는 향상된 원시타입의 박싱 기능을 제공함
  5. Parametric JVM: 제네릭 클래스 및 메서드의 파라미터화를 런타임에 보존하고 최적화함

 

 

이러한 프로젝트 발할라는 "Codes like a class, works like an int(클래스처럼 코딩하고, int처럼 동작하라)”와 같은 슬로건을 내걸면서, 개발자는 객체처럼 코드를 작성하지만 실행 성능은 primitive처럼 빠르고 효율적이도록 하는 것을 목표로 하고 있다.

 

 

 

[ Value Classes and Objects ]

기존 방식 객체의 문제들

대표적으로 값 클래스와 값 객체(Value Classes and Objects)의 도입을 통해 이런 부분을 해결하고자 한다.

개발자들은 단순한 도메인 값을 표현해야 하는 경우가 많다. 예를 들어 배송지, RGB 색상 등이 이러한 케이스인데, 이를 보통 record 클래스로 구현하게 될 것이다. 하지만 이러한 기존의 구현은 모든 객체에 정체성(Identity)을 부여하므로 같은 값의 객체라도 == 비교 시에 의도한 대로 값이 나오지 않는다.

var c = new Color(255, 0, 0);
var d = new Color(255, 0, 0);
System.out.println(c == d);  // false!

 

 

equals()는 같다고 해도 ==는 false가 나오는 혼란스러운 상황일 뿐만 아니라 객체의 정체성은 단순 값 표현에서 무의미하거나 오히려 해가 되는 경우가 많다. 또한 identity 비교는 모든 객체 별로 힙 공간을 할당하여 성능상 비용도 크며, 특히나 배열 접근 시에는 캐시 미스로 인해 문제가 생기곤 한다.

예를 들어 Point[]와 같은 배열을 사용한다고 하자. 공식 JVM 명세에는 객체가 메모리 내에서 어떻게 배치되어야 하는지에 대한 구체적인 규칙이 없지만, 현재의 의미론은 거의 강제적으로 '포인터 방식'을 택하게 한다. 자바 객체는 참조(reference)를 통해 사용되는데, 실제 객체는 힙에 따로 저장되고 변수는 그 주소(포인터)만 들고 있기 때문에 각 배열의 인덱스에 존재하는 값은 다음과 같이 힙의 Point 객체의 임의의 주소일 것이다.

 

 

따라서 메모리 할당의 규칙성이 없기 때문에 CPU 캐시의 효과를 누릴 수 없다. 왜냐하면 CPU는 메모리에서 데이터를 가져와서 연산하는데, 메모리로의 접근은 느리기 때문에 CPU는 데이터를 미리 가까운 곳(캐시)에 저장해두고 빠르게 다시 접근하려고 한다. 이때 CPU는 인접한 주소의 데이터들도 함께 가져오는데, 자바는 참조 타입 기반의 간접 참조 방식(indirection)으로 동작하기 때문에 캐시 미스가 발생할 가능성이 높고, 성능 상의 저하가 있는 것이다.

 

 

 

값 클래스와 값 객체의 도입

따라서 자바는 정체성이 없는 값 클래스와 값 객체를 도입하고, 두 객체의 필드 값이 동일하다면 언제 어떻게 생성되었는지와 관계없이 == 연산자로 비교했을 때 같은 것으로 간주하고자 한다. 또한 JVM 내에서 동일한 값인 경우에 대한 최적화도 관리하기 때문에 성능 상의 이점도 생길 수 있다. 이러한 value 클래스는 다음과 같이 사용할 수 있을 것이다.

value record Color(byte red, byte green, byte blue) {
    ...
}

 

 

 

값 클래스와 값 객체를 기반으로 하는 최적화 기법

이러한 값 객체를 사용하면 JVM의 2가지 최적화 기법인 스칼라화(scalarization)와 힙 평면화(heap flattening)의 장점을 누릴 수 있다. 먼저 값 객체는 정체성(identity)이 없어, 객체가 주소로 구분되지 않고 내부 필드 값만으로 판단된다. 따라서 JVM은 메모리나 성능 측면에서 더 많은 자유를 가지므로 복사하거나 중복 저장해도 문제가 없을 뿐만 아니라 평소에는 스택에 할당되다가 필요할 때만 힙 객체로 할당시킬 수 있다.

먼저 대표적인 스칼라화 최적화에 대해 알아보도록 하자. 스칼라화(scalarization)란 값 객체를 참조하지 않고, 필드 값 자체만을 분리해서 저장하거나 전달하는 방식이다. 예를 들어 Color라는 값 클래스가 r, g, b 필드를 가진다면, 우리는 코드를 다음과 같이 작성할 것이다.

Color c = new Color(255, 0, 0);

 

 

하지만 JVM 내부적으로는 참조라는 개념을 지워서 이를 inline하는 방식으로 다음과 같이 처리를 시키는 것이다. 이를 통해 필드명, 캡슐화, 생성자 검사 등 모든 클래스 기능을 생략할 수 있는 것이다.

// JVM이 내부적으로 이렇게 최적화함
byte c_r = 255;
byte c_g = 0;
byte c_b = 0;

 

 

그 다음은 힙 평면화 (Heap Flattening)인데, 이는 값 객체의 필드 값을 직접 배열이나 필드에 평면(flat)하게 저장하는 것이다. 앞서 살펴본 Point 배열이 현재는 다음과 같은 형태로 구성됨을 앞서 살펴보았다.

 

 

 

 

[ 원시 타입(primitive type)과 참조 타입(reference type) 세계의 통합 ]

자바 언어에는 int, long과 같은 원시 타입과 함께 Integer, Long과 같은 참조 타입이 존재한다. 물론 객체 타입으로 모든 것을 표현할 순 있지만, 추상화와 효율성 측면에서는 원시 타입을 쓰는 것이 효율적이다. 따라서 자바는 초기 설계부터 이 둘을 구분하였고, 다르게 사용하도록 하였다.

하지만 자바 5에 제네릭이 도입되면서부터 원시 타입과 참조 타입간의 간극이 생겨나기 시작했고, 자바 8에 함수형 인터페이스가 도입되면서 이러한 간극이 극대화되었다. 왜냐하면 원시 타입을 제네릭 타입으로 사용할 수 없는 것이 가장 큰 이유였다.

따라서 자바에서는 이 두 세계의 간극을 통합하고자 하고 있으며, 이를 위한 전제 작업이 바로 앞서 살펴본 값 클래스와 값 객체의 도입이다. 이를 통해 기존의 Integer와 같은 Wrapper 클래스도 값 클래스로 전환함으로써, 인라인 가능한 구조가 되어 원시 타입처럼 동작하는 구조로 개선하고자 하는 것이다. 그리고 이러한 개선으로 인해 자연스럽게 새로운 숫자 타입을 만들어 사용할 수 있는 것이다. ex) ComplexNumber, Decimal128 등의 직접적인 구현 및 사용

하지만 원시 타입과 참조 타입 사이에는 nullable 가능성에서 차이가 있어서, 언어적 차원에서 Nullability에 대한 표현력이 필요해졌다. 따라서 앞서 살펴본 프로젝트 발할라의 작업으로 Null-Restricted and Nullable Types와 Null-Restricted Value Class Types 같은 작업들이 자연스래 추가된 것이다.

이렇듯 프로젝트 발할라(Project Valhalla)는 단순히 타입을 추가하는 차원의 개선이 아니라, JVM의 메모리 배치에 대한 개선과 nullability에 대한 새로운 문법적 도입까지 큰 변화를 일으키는 작업이다. 오랜 기간에 걸쳐서 신중하게 자바에 큰 변화를 주고 있는 만큼, 많은 긍정적인 영향을 줄 것으로 기대된다.

 

 

 

참고자료

 

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함