변수 핸들(Variable Handle)은 하나의 변수 또는 변수 집합에 대한 참조를 의미합니다. 여기에는 힙(heap) 데이터 구조에 존재하는 정적 필드(static field), 비정적 필드(non-static field), 그리고 배열의 개별 요소까지 모두 포함됩니다.
변수 핸들은 기존의 메서드 핸들(Method Handle)과 개념적으로 유사하며, java.lang.invoke.VarHandle 클래스를 통해 표현됩니다. 객체 생성 시에는 java.lang.invoke.MethodHandles.Lookup의 정적 팩토리 메서드를 활용할 수 있으며, 일반 배열뿐 아니라 byte[] 배열의 단일 요소에 접근하는 데에도 사용할 수 있습니다.
변수 핸들의 주요 용도
- 인스턴스 필드 및 정적 필드 읽기/쓰기
- 배열 또는
byte[]배열의 특정 요소 접근 - volatile, 원자적(atomic) 연산 등 다양한 메모리 접근 모드 제공 (
getVolatile,setVolatile,compareAndSet등)
문법(Syntax)
public abstract class VarHandle extends Object예제(Example)
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.Arrays;
public class VarHandleTest {
public static void main(String args[]) {
// int 배열 요소에 접근하는 VarHandle 생성
VarHandle varHandle = MethodHandles.arrayElementVarHandle(int[].class);
int[] array = new int[5];
printArray(array);
varHandle.set(array, 2, 5); // 인덱스 2에 값 5 설정
printArray(array);
System.out.println(varHandle.get(array, 2)); // 인덱스 2의 값 조회
}
private static void printArray(int[] array) {
System.out.println(Arrays.toString(array));
}
}실행 결과(Output)
[0, 0, 0, 0, 0]
[0, 0, 5, 0, 0]
5위 예제에서 arrayElementVarHandle(int[].class)는 int 배열의 요소에 접근할 수 있는 변수 핸들을 반환합니다. set() 메서드로 인덱스 2의 값을 5로 변경한 뒤, get() 메서드로 해당 값을 다시 읽어오는 과정을 통해 변수 핸들이 배열 요소를 직접 제어할 수 있음을 확인할 수 있습니다.