Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9의 Compact Strings와 Java 6의 Compressed Strings, 무엇이 다를까?

Java 문자열 최적화 기술의 변화

Java는 버전이 올라가면서 메모리 효율성을 높이기 위한 문자열 최적화 기술을 여러 차례 도입했습니다. 그중 대표적인 것이 Java 6에서 처음 등장한 Compressed Strings(압축 문자열)과, 이를 대체하기 위해 Java 9에서 새롭게 도입된 Compact Strings(컴팩트 문자열)입니다. 두 기술은 이름이 비슷하지만 내부 구현 방식과 성능 면에서 확연한 차이가 있습니다.

Compact Strings란?

Compact Strings는 Java 9에서 도입된 기능으로, 기존 Java 6의 Compressed Strings를 대체합니다. 핵심적인 변화는 다음과 같습니다.

  • 내부 저장 구조를 기존의 char[] 배열 대신 byte[] 배열로 변경했습니다.
  • 새로운 필드인 coder가 추가되어, 해당 문자열이 LATIN1(1바이트) 형식인지 UTF16(2바이트) 형식인지 식별할 수 있습니다.

덕분에 영문이나 숫자처럼 Latin-1 문자 집합으로 표현 가능한 문자열은 절반 수준의 메모리만 사용하면서도, 한글·한자 같은 멀티바이트 문자도 UTF16으로 자동 전환되어 안전하게 처리됩니다.

Compressed Strings란?

Compressed Strings는 Java 6에서 도입된 실험적 기능입니다. 이 기능은 다음과 같은 특징을 가집니다.

  • 문자당 1바이트로 표현 가능한 경우에는 byte[] 배열을 사용합니다.
  • 그렇지 않은 경우에는 기존 방식대로 문자당 2바이트의 char[] 배열을 사용합니다.

다만 이 기능은 기본적으로 비활성화되어 있어, JVM 실행 시 아래 옵션을 명시적으로 지정해야만 동작했습니다.

-XX:+UseCompressedStrings

두 기술의 핵심 차이점

1. 언패킹(Un-packing) 및 리패킹(Re-packing) 불필요

Compressed Strings는 압축된 상태와 원래 상태 사이를 오갈 때 추가적인 변환 작업이 필요했지만, Compact Strings는 별도의 언패킹이나 리패킹 과정 없이 동작합니다. 따라서 런타임 성능 면에서 Compact Strings가 더 유리합니다.

2. 기본 활성화 여부

Java 6의 Compressed Strings는 기본값이 비활성화였고, 반면 Compact Strings는 Java 9부터 기본적으로 활성화되어 있습니다. 필요에 따라 아래 옵션으로 비활성화할 수 있습니다.

-XX:-CompactStrings

3. 안정성과 일관성

Compressed Strings는 압축 여부에 따라 내부 표현이 달라져 예상치 못한 동작을 유발할 수 있었지만, Compact Strings는 coder 필드를 통해 문자열 인코딩 형식을 명확히 관리하므로 훨씬 안정적입니다.

정리

결론적으로, Java 9의 Compact Strings는 Java 6의 Compressed Strings보다 구조적으로 개선된 기술입니다. byte[] 기반 저장과 coder 필드를 통한 형식 관리 덕분에 메모리 사용량을 줄이면서도 변환 오버헤드 없이 더 나은 런타임 성능을 제공하며, 별도 설정 없이도 기본 적용된다는 점이 가장 큰 장점입니다.