처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.06.20 29
#AI

10년을 기다린 자바의 대수술, Project Valhalla가 드디어 온다

Hacker News 원문 보기
10년을 기다린 자바의 대수술, Project Valhalla가 드디어 온다

자바가 10년 동안 준비해 온 거대한 변화

자바 개발자라면 ‘Project Valhalla(발할라 프로젝트)’라는 이름을 어디선가 들어보셨을 거예요. 그런데 워낙 오래 ‘작업 중’ 상태였던 터라 “그거 아직도 안 끝났어?” 하던 분들도 많죠. 이게 무려 2014년쯤부터 시작된 프로젝트거든요. 자바의 아주 근본적인 부분을 손보는 일이라 10년 넘게 신중하게 다듬어왔고, 이제 JDK 28에 그 첫 결실이 담겨 나온다는 소식이에요. 오늘은 도대체 이게 뭘 바꾸려는 건지, 왜 이렇게 오래 걸렸는지 쉽게 풀어볼게요.

문제의 뿌리: 자바의 모든 객체는 ‘정체성’을 갖는다

자바에는 두 종류의 데이터가 있어요. int, double 같은 기본형(primitive)과 String, Integer 같은 객체(object)요. 기본형은 값 그 자체로 메모리에 콕 박혀 있어서 가볍고 빨라요. 반면 객체는 무거워요. 왜 그러냐면, 자바의 모든 객체는 ‘정체성(identity)’이라는 걸 갖기 때문이에요.

이게 뭐냐면, 객체 하나하나가 메모리 어딘가에 자기만의 주소를 갖고 있고, 우리는 변수에 그 주소(참조)를 들고 다니는 거예요. 그래서 값이 똑같은 두 객체라도 ==로 비교하면 false가 나오죠(주소가 다르니까요). 이 정체성 때문에 객체에는 보이지 않는 ‘머리(header)’가 붙어요. 객체마다 관리용 정보가 따라붙고, 변수는 실제 값이 아니라 ‘값이 있는 곳을 가리키는 화살표(포인터)’만 들고 있어요. 그래서 CPU가 실제 값을 보려면 화살표를 따라 메모리를 한 번 더 다녀와야 하는데(이걸 ‘포인터 추적’이라고 해요), 이게 쌓이면 성능을 갉아먹어요.

예를 들어 Point 객체 100만 개를 배열에 담으면, 메모리에는 진짜 좌표값이 줄줄이 있는 게 아니라 ‘화살표 100만 개’가 들어 있고 실제 좌표는 힙 여기저기 흩어져 있어요. 좌표 하나 읽을 때마다 흩어진 메모리를 들쑤셔야 하니 캐시 효율이 엉망이 되죠.

Valhalla의 해법: ‘값처럼 동작하는 클래스’

발할라의 핵심 아이디어는 한 문장으로 요약돼요. ‘클래스처럼 코딩하되, int처럼 동작하게(Codes like a class, works like an int).’ 바로 ‘값 클래스(value class)’라는 새로운 종류를 도입하는 거예요.

값 클래스는 정체성을 포기해요. “나는 주소 같은 거 필요 없고, 내 안의 값이 같으면 그냥 같은 거야”라고 선언하는 거죠. 정체성을 버리는 대신 JVM이 마음껏 최적화할 자유를 얻어요. 머리(header)를 떼어낼 수 있고, 무엇보다 ‘평탄화(flattening)’가 가능해져요. 아까 그 Point 배열이 화살표 100만 개가 아니라 실제 좌표값이 메모리에 빽빽하게 줄지어 들어가는 거예요. 포인터를 따라다닐 필요가 없으니 CPU 캐시 효율이 확 좋아지고, 기본형 배열만큼 빨라질 수 있어요. 코드는 여전히 평범한 클래스처럼 메서드도 쓰고 캡슐화도 하면서요.

여기에 ‘null 제한 타입’이라는 개념도 같이 와요. 값을 평탄하게 박아 넣으려면 “이 자리는 절대 비어(null) 있지 않다”는 보장이 필요하거든요. 그래서 null이 될 수 없는 타입과 그냥 null 허용 타입을 구분하는 문법이 들어와요.

왜 이렇게 오래 걸렸나, 그리고 업계 맥락

10년이 걸린 건 자바의 철칙인 ‘하위 호환성’ 때문이에요. 기존 코드 한 줄도 깨지면 안 되니까, 제네릭·자동 박싱·리플렉션 같은 자바의 온갖 기능과 새 값 타입이 매끄럽게 맞물리도록 설계하느라 시간이 걸린 거죠. 사실 이건 자바만의 고민이 아니에요. C#은 일찍부터 struct라는 값 타입을 갖고 있었고, Rust나 Go도 값 타입을 언어 차원에서 자연스럽게 다뤄요. 자바는 뒤늦게, 하지만 기존 생태계를 깨지 않으면서 이 영역을 따라잡으려는 셈이에요.

한국 개발자에게 주는 시사점

당장 코드를 다 뜯어고칠 필요는 없어요. 하지만 대용량 데이터를 다루거나, 좌표·금액·복소수처럼 ‘작은 값 묶음’을 엄청나게 많이 만드는 시스템(게임 서버, 금융 계산, 데이터 처리 파이프라인 등)이라면 발할라가 게임 체인저가 될 수 있어요. GC(가비지 컬렉션) 부담이 줄고 메모리도 아끼니까요. 지금부터 “어떤 클래스가 정체성이 진짜 필요 없는가”를 구분하는 눈을 길러두면, 발할라가 정식으로 들어왔을 때 바로 활용할 수 있어요. 면접에서도 ‘값 타입과 참조 타입의 차이’는 단골 질문이라 개념을 잡아두면 두루 쓸모 있고요.

마무리

발할라는 ‘자바가 객체의 무게를 덜고 기본형의 속도를 넘본다’는 한마디로 정리돼요. 여러분 코드에서 사실은 정체성이 필요 없는데 그냥 객체로 만들고 있던 클래스, 혹시 떠오르는 게 있나요?


🔗 출처: Hacker News

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

AI 도구, 직접 활용해보세요

AI 시대, 코딩으로 수익을 만드는 방법을 배울 수 있습니다.

AI 활용 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.