Contents
item66. 네이티 메서드는 신중히 사용하라.
   Mar 21, 2023     3 min read

⚓️서론

자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다.

여기서 네이티브 메서드란? C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다.

네이티브라는 것은 많이 들어봤지만 실질적으로 코드를 본적이 없다. 이 글을 통해서 자바 네이티브 인터페이스를 알아가보자.

이 아이템은 한 페이지 분량으로 매우 짧은 글이다. 사실 서론을 쓸지 고민하다가 간략하게나마 작성했다.


➡️네이티브 메서드의 주요 쓰임

1️⃣ 레지스트리 같은 플랫폼 특화 기능을 사용한다.

  • 자바가 진화함에따라 하부 플랫폼의 기능을 흡수하고 있음.
  • 자바9 새로 process API를 추가해 OS프로세스에 접근하는 길을 열어주었다.
    • process API

        @Slf4j
        public class JavaProcess {
            public static void printProcessInfo() throws IOException {
                ProcessHandle processHandle = ProcessHandle.current();
                ProcessHandle.Info processInfo = processHandle.info();
      
                log.info("PID: " + processHandle.pid());
                log.info("Arguments: " + processInfo.arguments());
                log.info("Command: " + processInfo.command());
                log.info("Instant: " + processInfo.startInstant());
                log.info("Total CPU duration: " + processInfo.totalCpuDuration());
                log.info("User: " + processInfo.user());
      
            }
            public static void main(String[] args) throws IOException {
                printProcessInfo();
            }
        }
      

      결과 :

        PID: 6331
        Arguments: Optional[[Ljava.lang.String;@52f759d7]
        Command: Optional[/Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home/bin/java]
        Instant: Optional[2023-03-21T08:48:26.679Z]
        Total CPU duration: Optional[PT0.597789S]
        User: Optional[dante]
      

2️⃣ 네이티브 코드로 작성된 기존 라이브러리를 사용한다.

  • 레거시 데이터를 사용하는 레거시 라이브러리 (ex.Java OpenGL)
  • Java에 Java로 된 라이브러리가 없을 경우 네이티브 라이브러리를 사용해야할 때

3️⃣ 성능 개선할 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.

  • 자바 초기 시절 (자바 3전)이라면 이야기가 다르지만, JVM은 빠른 속도로 발전함.
  • 현재 자바는 다른 플랫폼에 견줄만한 성능을 보인다
    • 예시) java.math 1.1 시절 BingInteger(C로 작성한 고성능 라이브러리)

➡️네이티브 메서드의 단점

1️⃣메모리 훼손 오류

  • 네이티브 언어가 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 더 이상 안전하지 않다.

2️⃣이식성

  • 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성이 낮다.
  • 디버깅도 더 어렵다.

3️⃣성능과 비용, 가독성

  • 주의하지 않으면 속도가 오히려 느려질 수도 있다.
  • 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적도차 할 수 없다.
  • 자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용이 추가된다.
  • 네이티브 메서드와 자바 코드 사이의 ‘접착 코드(glue code)’를 작성해야 한다. 따라서 개발할 것이 늘어나고 가독성도 떨어지게된다.

✅핵심 정리

  • 네이티브 메서드를 사용할려면 한번 더 생각하라. 네이티브 메서드가 성능을 개선해주는 일은 많지 않다.
  • 저수준 자원이나 네이티브 라이브러리를 사용해야만 해서 어쩔 수 없더라도 네이티브 코드는 최소한만 사용하고 철저히 테스트하라.
  • 네이티브 코드 안에 숨은 단 하나의 버그가 애플리케이션 전체를 훼손할 가능성이 있다.

📎참고