[Effective Java] Day 33 - Item 66 :: 네이티브 메서드는 신중히 사용하라

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

Native method(네이티브 메서드)

C나 c++같은 네이티브 프로그래밍 언어로 작성한 메서드

주요쓰임

  1. 레지스트리 같은 플랫폼 특화 기능을 사용함
  2. 네이티브 코드로 작성된 기존 라이브러리 사용
    • 레거시 데이터를 사용하는 레거시 라이브러리
    • 대체할 만한 Java 라이브러리가 없는 경우 네이티브 라이브러리를 사용함
  3. 성능개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성

성능 개선 목적의 네이티브 메서드 사용은 권장하지 않는다.

  • 자바 3 이전의 초기시절이라면 얘기가 다르지만, JVM은 그동안 빠른 속도로 발전해왔다.
  • 대부분 작업에서 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다.
    • ex) BigInteger
      • Java.math가 추가된 자바 1.1때: C로 작성한 고성능 라이브러리에 의존
      • Java 3: 순수 자바로 다시 구현되면서 원래의 네이티브 구현보다 더 빨라짐
  • 네이티브 라이브러리는 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선작업이 계속돼왔다.
    • 그러므로 고성능의 다중 정밀 연산이 필요하다면 네이티브 메서드를 통해 GMP를 사용하는 것을 고려해보자.

단점

  • 네이티브 언어가 안전하지 않으므로(item 50) 네이티브 메서드를 사용하는 다른 애플리케이션도 메모리 훼손 오류로 부터 불안전하다.
  • 네이티브 언어는 자바보다 플랫폼을 많이 타 이식성이 낮다.
  • 디버깅이 어렵다
  • 주의하지 않으면 오히려 속도가 더 느려진다
  • 네이티브 메모리는 가비지 컬렉터가 자동 회수하지 못하며, 추적도 불가능하다(ITEM 8)
  • 자바 코드와 네이티브 코드의 경계를 넘나들 때 비용이 발생한다.
  • 네이티브 코드와 자바 코드 사이 접착코드(glue code)를 작성해야하나, 귀찮고 가독성도 떨어진다.

정리

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

참고