Java에서 함수 포인터를 사용하는 방법 ️ ✨

소개



포인터는 메모리 주소를 저장하는 개체이며 값으로 전달하는 대신 대상 개체, 배열 또는 변수 주소를 직접 가리켜 메모리를 절약할 수 있습니다. 슬프게도 Java에는 포인터에 대한 "실제"개념이 없습니다. 운 좋게도 실제 상황에 가까운 메서드 참조를 사용하는 해결 방법이 있습니다.

함수 포인터



함수 포인터는 함수의 주소를 가리키는 포인터입니다. 일부 용도는 실행에 따라 다른 함수를 호출하는 함수를 생성하거나 메서드를 동적으로 호출하기 위한 함수 포인터 배열을 저장하여 콜백 루틴을 생성하는 것입니다(예: 에뮬레이터에 대한 CPU 명령 저장).

함수 포인터 시뮬레이션



4가지 종류method references가 있으며, 특정 객체의 인스턴스 메소드를 참조하는 종류를 사용하고 있습니다.

가리키고 있는 메서드의 메서드 서명을 정의하는 인터페이스를 정의하여 시작합니다.

// Wrapping interface
private interface FunctionPointer {
  // Method signatures of pointed method
  void methodSignature(int a);
}


다음으로 대상 메서드 서명을 사용하여 메서드를 만듭니다.

public void method1(int b) {
  System.out.println("Called method1 with integer " + b);
}

public void method2(int v) {
  System.out.println("Called method2 with integer " + v);
}

public void method3(int a) {
  System.out.println("Called method3 with integer " + a);
}


다음 단계는 래핑 인터페이스의 변수를 만들고 메서드를 할당하는 것입니다. 변수는 저장되거나 실행될 함수 포인터 역할을 합니다.

// Create a variable of the interface and assign
// the method references
FunctionPointer pointer1 = this::method1;
FunctionPointer pointer2 = this::method2;

// Call both methods using their "pointer"
pointer1.methodSignature(3);
pointer2.methodSignature(2);

// Reassign and call pointer 1
pointer1 = this::method3;

pointer1.methodSignature(5);



Called method1 with integer 3

Called method2 with integer 2

Called method3 with integer 5


람다 사용



메서드 참조는 람다를 사용하여 할당할 수 있습니다.

// Create a method reference and assign a methods using a lambda.
FunctionPointer pointer1 =
  (a) -> System.out.println("Called pointer1 with int " + a);

FunctionPointer pointer2 =
  (b) -> System.out.println("Called pointer2 with int " + b);


함수 포인터 배열



래핑 인터페이스의 배열을 생성하여 메서드 참조 배열의 기능을 에뮬레이트할 수 있습니다.

// Create an array of "pointers"
FunctionPointer[] functionPointersArray = new FunctionPointer[3];

// Assign methods
functionPointersArray[0] = this::method1;
functionPointersArray[1] = this::method2;
functionPointersArray[2] = this::method3;

// Call methods    
functionPointersArray[0].methodSignature(3);
functionPointersArray[1].methodSignature(4);
functionPointersArray[2].methodSignature(5);


함수 포인터 대 직접 호출



메서드를 직접 호출하는 것보다 메서드 참조를 사용하는 경우 패널티가 있는지 궁금할 수 있습니다. 대답은 '예'이지만 작은 것입니다.



위의 차트에서 직접 메서드 호출은 저장된 메서드보다 람다를 호출하는 추가 단계 때문에 메서드 참조를 사용하는 것보다 거의 5배 더 빠릅니다. 솔직히 성능 저하를 눈치채지 못할 수도 있으므로 걱정하지 마십시오.

결론



포인터는 값으로 전달하는 대신 개체의 주소를 직접 가리키는 변수입니다. 함수 포인터는 메모리 소비를 줄일 수 있는 함수의 주소를 직접 가리킵니다. Java에는 포인터가 없지만 메서드 참조 또는 람다를 사용하여 동작을 에뮬레이트할 수 있습니다. 메서드 참조를 사용하는 것은 직접 메서드 호출보다 느리지만 기능 사용을 방해할 정도는 아닙니다.

이것이 도움이 되었으면 내 newsletter 또는 supporting me에 가입하는 것을 고려하십시오. 읽어 주셔서 감사합니다!

좋은 웹페이지 즐겨찾기