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

Java 9에서 MethodHandles 클래스가 중요한 이유와 활용법

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 클래스는 리플렉션보다 가볍고 빠른 대안으로 활용될 수 있으며, 동적 언어 런타임 구현이나 고성능 프레임워크 개발에서 특히 유용하게 사용됩니다.