MethodHandles 클래스는 Java 7 버전에서 처음 도입되었습니다. 이 클래스는 기능성을 향상시키기 위한 다양한 정적(static) 메서드들을 제공하며, 크게 세 가지 범주로 나눌 수 있습니다.
- Lookup(조회) 메서드: 메서드나 필드에 대한 메서드 핸들을 생성하는 데 사용됩니다.
- Combinator(조합) 메서드: 이미 존재하는 메서드 핸들을 결합하거나 변형하여 새로운 핸들을 만듭니다.
- 팩토리(Factory) 메서드: 일반적인 JVM 연산이나 제어 흐름 패턴을 흉내 내는 메서드 핸들을 생성합니다.
Java 9에서는 이러한 MethodHandles 클래스가 한층 강화되었으며, arrayLength(), arrayConstructor(), zero() 등 여러 가지 유용한 새로운 정적 메서드들이 추가되었습니다. 이를 통해 배열 길이 조회, 배열 생성, 기본값 반환 같은 작업을 메서드 핸들 방식으로 손쉽게 처리할 수 있게 되었습니다.
문법(Syntax)
public class MethodHandles extends Object
예제 코드
아래 예제는 Java 9에서 새롭게 추가된 주요 정적 메서드들의 실제 사용 방법을 보여줍니다.
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
public class MethodHandlesTest {
public void MethodHandle1() {
try {
// arrayLength(): 배열의 길이를 반환하는 메서드 핸들 생성
MethodHandle methodHandleLength = MethodHandles.arrayLength(int[].class);
int[] array = new int[] {5, 10, 15, 20};
int arrayLength = (int) methodHandleLength.invoke(array);
System.out.println("메서드 핸들로 구한 배열 길이: " + arrayLength);
// arrayConstructor(): 지정된 크기의 배열을 생성하는 메서드 핸들 생성
MethodHandle methodHandleConstructor = MethodHandles.arrayConstructor(int[].class);
int[] newArray = (int[]) methodHandleConstructor.invoke(3);
System.out.println("메서드 핸들로 생성한 배열 크기: " + newArray.length);
// zero(): 해당 타입의 기본값(default value)을 반환
int x = (int) MethodHandles.zero(int.class).invoke();
System.out.println("메서드 핸들로 얻은 int 기본값: " + x);
String y = (String) MethodHandles.zero(String.class).invoke();
System.out.println("메서드 핸들로 얻은 String 기본값: " + y);
} catch(Throwable e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
new MethodHandlesTest().MethodHandle1();
}
}실행 결과
메서드 핸들로 구한 배열 길이: 4 메서드 핸들로 생성한 배열 크기: 3 메서드 핸들로 얻은 int 기본값: 0 메서드 핸들로 얻은 String 기본값: null
정리
Java 9에서 추가된 arrayLength()는 배열의 길이를 가져오는 핸들을, arrayConstructor()는 주어진 크기만큼의 새 배열을 생성하는 핸들을 만들어 줍니다. 또한 zero()는 전달된 타입의 기본값을 반환하는데, 원시 타입인 경우 0, 참조 타입인 경우 null을 돌려줍니다. 이처럼 MethodHandles 클래스는 리플렉션보다 가볍고 빠른 대안으로 활용될 수 있으며, 동적 언어 런타임 구현이나 고성능 프레임워크 개발에서 특히 유용하게 사용됩니다.