아이템 66. 네이티브 메소드는 신중히 사용하라. - ksw6169/effective-java GitHub Wiki

네이티브 메소드란?

  • Java Native Interface(JNI)는 자바 프로그램이 네이티브 메소드를 호출하는 기술이다.
  • 여기서 네이티브 메소드란 네이티브 프로그래밍 언어(ex. C, C++)로 작성한 메소드를 말한다.

Native programming language

변환 과정 없이 플랫폼에서 바로 실행할 수 있는 언어를 말한다. C, C++이 이에 해당된다. (하지만 실제로는 바이너리 기계어로 변환된다.) 이와 반대로 Managed language는 플랫폼에서 실행되기 전에 변환 또는 해석되어야 하는 언어를 말한다. Java 또는 .NET이 이에 해당된다.

네이티브 메소드를 사용하는 방법

참고 자료 : native method 정의 및 구현ㅣ삶의 모든 순간을 즐겨라!

네이티브 메소드의 주요 용도

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

플랫폼 특화 기능을 위해 네이티브 메소드를 꼭 사용할 필요는 없다.

  • 플랫폼 특화 기능을 활용하려면 네이티브 메소드를 사용해야 한다.
  • 하지만 자바가 성숙하면서 OS 같은 하부 플랫폼의 기능들을 점차 흡수하고 있다.
  • 그래서 네이티브 메소드를 사용할 필요가 계속 줄어들고 있다.
  • 예컨대 자바 9은 새로 process API를 추가해 OS 프로세스에 접근하는 길을 열어주었다.

성능 개선을 목적으로 사용하는 것은 권장하지 않는다.

  • 성능 개선을 목적으로 네이티브 메소드를 사용하는 것은 거의 권장하지 않는다.
  • 대부분의 작업에서 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다.
  • 예컨대 BigInteger는 C로 작성한 고성능 라이브러리에 의지했으나 튜닝이 진행되면서 현재는 원래의 네이티브 구현보다도 더 빨라졌다.
  • 한편, 네이티브 라이브러리는 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선 작업이 계속돼왔다. 그래서 정말로 고성능의 다중 정밀 연산이 필요한 자바 프로그래머라면 이제 네이티브 메소드를 통해 GMP를 사용하는 것을 고려해도 좋다.

네이티브 메소드의 단점

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

Glue code

호환성이 없는 다른 코드들을 결합하기 위해 사용하는 코드

핵심 정리

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

참고 자료