DEV ℧ Developer Diary

[EffectiveJava] item66 - 네이티브 메서드는 신중히 사용하라

자바 네이티브 인터페이스

자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 가상머신(JVM)위에서 실행되고 있는 자바코드가 네이티브 응용 프로그램 그리고 C, C++ 그리고 어샘블리 같은 다른 언어로 작성된 라이브러리를 호출하거나 호출되는 것을 가능하게 하는 프로그램 프레임 워크이다.

자바 네이티브 인터페이스의 쓰임새

  • 레지스트리 같은 플랫폼 특화 기능 사용.
  • 네이티브 코드로 작성된 기존 라이브러리를 사용.
  • 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성.

플랫폼 특화의 네이티브 인터페이스

플랫폼 특화 기능을 활용하려면 네이티브 메서드를 사용해야 한다. 하지만 자바가 성숙해지면서 (OS 같은) 하부 플랫폼의 기능을 들을 점차 흡수하고 있다.

예를 들어 자바 9 이후로 새로 process API를 추가해 OS 프로세스에 접근하는 길을 열어 주었다.

성능 개선 목적의 네이티브 인터페이스

성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 거의 권장하지 않는다. 자바 초기시절(자바 3 전) 이라면 이야기가 다르지만, JVM은 그동안 엄청난 속도로 발전해왔다.

예를 들면 java.math가 처음 추가된 자바 1.1 시절 BigInteger은 C로 작성한 고성능 라이브러리에 의지했지만, 자바 3 이후로 자바로 구현되면서 튜닝한 결과 원래의 네이티브 구현보다 빨라졌다.

하지만 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선 작업이 계속돼왔으니, 정말 다중 정밀 연산 라이브러리가 필요한 경우에는 네이티브 메서드를 사용하는 걸 고려해도 좋다.

네이티브 메서드의 심각한 단점

네이티브 메서드에는 심각한 단점들이 있다.

  • 네이티브 언어가 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 더 이상 안전하지 않다.
  • 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮고 디버깅도 어렵다. 주의하지 않으면 속도가 오히려 느려질 수도 있다.
  • 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적조차 할 수 없다.
  • 네이티브 메서드와 자바 코드를 넘나들때 비용이 추가되거나, 사이의 ‘접착 코드(glue code)’를 작성해야 하는데 가독성이 떨어진다.