peaches-book-study / effective-java

이펙티브 자바 3/E
0 stars 2 forks source link

Item 66. 네이티브 메서드는 신중히 사용하라 #64

Open byunghyunkim0 opened 2 months ago

byunghyunkim0 commented 2 months ago

Chapter : 9. 일반적인 프로그래밍 원칙

Item : 66. 네이티브 메서드는 신중히 사용하라

Assignee : byunghyunkim0


🍑 서론

🍑 본론

네이티브 메서드란?

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

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

    • 자바가 성숙해가면서 (OS 같은) 하부 플랫폼의 기능들을 흡수하고 있다.
    • JAVA 9은 새로 process API를 추가해 OS 프로세스에 접근가능하게 했다.

      // process API 
      private static void infoOfCurrentProcess() {
          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());
      }
  2. 네이티브 코드로 작성된 기존 라이브러리를 사용
    • 대체할 만한 자바 라이브러리가 없는 네이티브 라이브러리를 사용해야 할 때 네이티브 메서드를 사용
  3. 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 네이티브 언어로 작성
    • 성능을 개선할 목적으로 네이티브 메서드의 사용은 권장하지 않음
    • JVM은 그동안 엄청난 속도로 발전해왔다. JAVA 3이후부터는 대부분 작업에서 다른 플랫폼에 견줄만한 성능을 보인다.
    • 고성능의 다중 정밀 연산이 필요하다면 네이티브 메서드를 통해 GMP를 사용하는 걸 고려
      • GNU Multiple Precision Arithmetic Library (GMP): C 언어로 작성된 오픈 소스 라이브러리

        네이티브 메서드의 단점

  4. 네이티브 언어가 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 안전하지 않다.
  5. 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮고 디버깅도 어려움.
  6. 주의하지 않으면 속도가 느려짐
  7. 자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용 추가
  8. 네이티브 메서드와 자바 코드 사이의 접착 코드를 작성해야됨 - 귀찮은 작업이고 가독성도 떨어짐

    • 자바 코드에서 네이티브 메서드 선언
      public class NativeExample {
      public static native int add(int a, int b);
      }
    • 네이티브 메서드 구현을 위한 C/C++ 코드 작성
      
      // NativeExample.c
      #include <jni.h>

    JNIEXPORT jint JNICALL Java_NativeExample_add(JNIEnv *env, jclass cls, jint a, jint b) { return a + b; }

    - 자바와 네이티브 코드 연결을 위한 접착 코드 작성
    ```java
    // NativeExample.java
    static {
        System.loadLibrary("NativeExample");
    }

    🍑 결론

    • 네이티브 메서드를 사용하고 싶다면 한번 더 생각해라
    • 네이티브 메서드가 성능을 개선해 주는 일은 많지 않다.
    • 네이티브 메서드를 사용해야만 한다면 네이티브 코드는 최소한으로 사용하고 철저히 테스트 해라.

Referenced by

-