콜백 작동 원리
소개
Java API를 사용할 때 콜백을 구현해야 하는 다양한 상황이 있습니다. 대표적인 예로는 ` ContentObserver`를 통해 콘텐츠 변경 사항을 감지하는 콜백이나, ` Handler.Callback`와 같은 Java 인터페이스를 구현하는 콜백 등이 있습니다.
QtJenny는 Java API가 사용하는 방식에 따라, Java 인터페이스를 구현하는 경우와 Java 클래스를 확장하는 경우 모두에서 이러한 콜백을 구현할 수 있도록 지원합니다. Android에서도 제공하는 많은 크로스 플랫폼 Java API는 인터페이스 형태의 콜백을 사용하지만, Android는 일부 상황에서 추상 기본 클래스도 사용하며, 대표적인 예로 ContentObserver 가 있습니다.
Java 인터페이스 구현
다음 다이어그램은 C++에서 Java 인터페이스를 구현할 때의 구조와 각 부분 간의 논리적 구분을 보여줍니다.
작동 방식은 다음과 같습니다. Java 인터페이스를 래핑하는 ` java.reflect.Proxy`을 사용하여, 인터페이스 메서드에 대한 호출을 ` InvocationHandler`의 일반 ` invoke() ` 메서드로 전달합니다.
InvocationHandler 인터페이스는 프로젝트별 NativeInvocationHandler (사용자 애플리케이션에서 제공)에 의해 구현되며, 해당 구현체는 프로젝트에서 제공하는 네이티브 범용 호출 메서드를 호출합니다. 이 네이티브 메서드는 Java 인터페이스를 모방하는 생성된 C++ 클래스 내의 범용 qt_invoke() 가상 함수를 호출합니다.
마지막으로, Qt C++ 프로젝트의 사용자 코드는 해당 생성된 클래스를 상속받고, 그 안의 가상 함수를 재정의합니다.
Java 클래스 확장
다음 다이어그램은 C++에서 Java 클래스를 확장하는 과정의 구조와 각 부분 간의 논리적 구분을 보여줍니다.
작동 방식은 다음과 같습니다. 먼저 Java 하위 클래스를 생성하고, 이 클래스가 프로젝트에서 제공하는 Java 클래스인 NativeInvocationHandler 의 제네릭 invoke() 메서드를 호출합니다.
` NativeInvocationHandler `는 프로젝트에서 제공하는 네이티브 범용 호출 메서드를 호출합니다. 이 네이티브 메서드는 Java 클래스를 모방하는 생성된 C++ 클래스 내의 범용 ` qt_invoke() ` 가상 함수를 호출합니다.
마지막으로, Qt C++ 프로젝트의 사용자 코드는 해당 생성된 클래스를 상속받고, 그 안의 가상 함수를 재정의합니다.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.