0Pricing
Java Academy · 강의

JNI보다 FFM을 사용하는 이유

더 안전한 네이티브 상호 운용을 다룹니다

JNI보다 FFM을 사용하는 이유은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

네이티브 코드 호출

Java에서 C 라이브러리를 호출하거나 힙 외부 메모리를 다뤄야 할 때가 있습니다. 전통적인 방법은 Java 네이티브 인터페이스(JNI)였습니다. 현대적인 방법은 외부 함수 및 메모리 인터페이스(FFM)이며, Java 22에서 최종 확정되었습니다(JEP 454).

이 강의에서는 FFM이 더 나은 선택인 이유를 설명합니다.

JNI에 필요했던 것

JNI는 사용하기 까다로웠습니다.

  • 다루기 불편한 JNIEXPORT 시그니처로 C 연결 코드를 작성해야 했습니다.
  • 플랫폼마다 네이티브 공유 라이브러리를 컴파일해야 했습니다.
  • Java 형식과 C 형식 사이를 수동으로 변환해야 했습니다.
  • 실수 하나로 JVM을 쉽게 충돌시킬 수 있었습니다.

순수한 Java인 FFM

FFM을 사용하면 Java만으로 네이티브 함수를 호출하고 네이티브 메모리에 접근할 수 있습니다. C 연결 코드도, 별도의 컴파일 단계도, 직접 작성한 마샬링도 필요하지 않습니다.

Java에서 네이티브 함수의 시그니처를 설명한 다음 메서드 핸들을 통해 호출합니다.

핵심 패키지

모든 기능은 java.lang.foreign에 있습니다. 주요 형식은 다음과 같습니다.

  • 함수를 찾고 연결하는 Linker와 SymbolLookup
  • 네이티브 메모리를 위한 MemorySegment
  • 결정론적 수명을 관리하는 Arena
  • 메모리 형태를 설명하는 MemoryLayout과 FunctionDescriptor

설계부터 더 안전하게

FFM은 JNI보다 훨씬 안전합니다.

  • 경계 검사가 적용된 메모리 접근
  • 수명이 Arena에 연결되어 있어 해제된 메모리의 사용이 감지됨
  • 격리로 안전하지 않은 스레드 간 접근 방지

실수로 인해 VM이 충돌하는 대신 Java 예외가 발생합니다.

응용 프로그래밍 인터페이스 맛보기

이 간단한 예제는 C의 strlen 함수를 찾고 여기에 사용할 핸들을 준비합니다. 중요한 점은 이 모든 과정이 일반적인 Java 코드라는 것입니다.

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;

public class Main {
    public static void main(String[] args) {
        Linker linker = Linker.nativeLinker();
        SymbolLookup stdlib = linker.defaultLookup();
        MethodHandle strlen = linker.downcallHandle(
            stdlib.find("strlen").orElseThrow(),
            FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
        System.out.println("Bound a handle to strlen: " + strlen);
    }
}

성능

FFM 하향 호출은 JNI에 필적하며, 생성된 스텁을 적시 컴파일러가 인라인하고 최적화할 수 있기 때문에 더 빠른 경우도 많습니다. 호출마다 건너야 하는 C 트램펄린도 없습니다.

네이티브 접근 활성화

네이티브 코드는 위험할 수 있으므로 FFM은 경고를 표시하거나 명시적인 활성화를 요구할 수 있습니다. 실행할 때 --enable-native-access=ALL-UNNAMED(또는 특정 모듈 이름)를 지정하면 접근 권한을 부여하고 경고를 없앨 수 있습니다.

sun.misc.Unsafe 대체하기

FFM은 메모리 API와 함께 오래전부터 사용이 권장되지 않았던 sun.misc.Unsafe의 오프힙 연산을 공식적으로 지원되는 방식으로 대체합니다. 네이티브 버퍼를 수동으로 관리하던 라이브러리는 안전하고 지원되는 API로 이전할 수 있습니다.

도구: jextract

대규모 C 라이브러리의 경우, 함께 제공되는 도구 jextract가 C 헤더 파일을 읽고 Java FFM 연결 코드를 자동으로 생성합니다. 서술자를 직접 작성하지 않아도 됩니다.

이 도구는 코드 생성기와 비슷한, FFM의 생산성 측면을 담당하는 도구입니다.

FFM을 사용할 때

다음과 같은 경우에는 FFM을 사용해야 합니다.

  • 기존 C/C++ 라이브러리 호출
  • 낮은 수준에서 OS와 상호 운용
  • 대규모 오프힙 버퍼를 효율적으로 관리

순수 Java 작업에는 FFM이 전혀 필요하지 않습니다.

빠른 확인

JNI보다 뛰어난 핵심 장점을 떠올려 보세요.

복습

FFM이 JNI보다 뛰어난 이유를 배웠습니다.

  • 순수 Java이므로 C 접착 코드나 추가 컴파일이 필요하지 않음
  • 안전함: 경계 검사, Arena 수명 관리, 격리
  • 필적하거나 더 나은 성능
  • sun.misc.Unsafe를 대체하며 jextract와 함께 사용

다음으로는 MemorySegment와 아레나를 사용해 네이티브 메모리를 관리합니다.

자주 묻는 질문

“JNI보다 FFM을 사용하는 이유” 강의는 무료인가요?

네 — “JNI보다 FFM을 사용하는 이유” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“JNI보다 FFM을 사용하는 이유”에서 뭘 배우나요?

더 안전한 네이티브 상호 운용을 다룹니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“JNI보다 FFM을 사용하는 이유” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JNI보다 FFM을 사용하는 이유
  2. MemorySegment와 Arena
  3. 다운콜 핸들
  4. 레이아웃과 구조체
← Java Academy(으)로 돌아가기