JAVA/Effective Java

[아이템 66] 네이티브 메서드는 신중히 사용하라

꾸준함. 2024. 3. 19. 09:52

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

  • "네이티브 메서드"는 일반적으로 특정 프로그래밍 언어로 작성된 코드가 아닌, 시스템의 네이티브 코드로 구현된 함수
  • 이러한 메서드들은 일반적으로 고성능이 필요한 작업이나 특정 플랫폼과의 상호 작용을 수행할 때 사용
  • 네이티브 메서드는 일반적으로 C나 C++와 같은 저수준 언어로 작성되며, 특정 플랫폼의 기능에 직접 액세스 가능

 

전통적인 네이티브 메서드의 주요 쓰임

전통적인 네이티브 메서드의 주요 쓰임은 다음과 같습니다.

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

 

하지만 자바 버전이 올라가면서 OS와 같은 하부 플랫폼의 기능들을 점차 흡수하고 있기 때문에 네이티브 메서드를 사용할 필요가 계속 줄어들고 있습니다.

  • ex) 자바 9 버전부터는 새로 process API를 추가해 OS 프로세스에 접근 가능

 

 

 

네이티브 메서드를 성능 개선의 목적으로 사용하지 말자

  • 전통적인 네이티브 메서드의 주요 쓰임과 상충되는 내용
  • 자바 1.3 버전 이전에는 네이티브 메서드를 통해 유의미한 성능 개선을 달성할 수 있었지만 현재 JVM은 많이 발전했음
    • 대부분의 작업에서 자바는 다른 플랫폼과 견줄만한 성능을 보임

 

  • 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선 작업이 진행되어 왔음
    • 고성능의 다중 정밀 연산이 필요한 경우에는 네이티브 메서드를 통해 GMP를 사용하는 것을 고려하는 것을 권장
    • BigInteger는 상대적으로 느리고 자바 8 버전에서 큰 수의 곱셈 성능을 개선한 것을 제외하고 더 이상 커다란 변화가 없는 상황

 

https://stackoverflow.com/questions/2556340/gmp-vs-java-big-integers

 

네이티브 메서드의 단점

  • 아이템 50에서 간략하게 언급했다시피 네이티브 메서드를 사용하면 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충동 오류로부터 안전하지 않음
  • 네이티브 언어는 플랫폼 종속성이 존재하기 때문에 이식성이 좋지 않음
  • 디버깅이 어려움
  • 주의하지 않으면 속도가 오히려 느려질 수도 있음
  • GC가 네이브 메모리는 자동 회수하지 못하고, 심지어 추적조차 할 수 없음
  • 자바 코드와 네이티브 코드의 경계를 넘나 들때마다 비용 발생
    • 자바 코드와 네이티브 코드 간의 접착 코드(glue code)를 작성해야 하는데 귀찮은 작업일 뿐만 아니라 가독성 측면에서도 좋지 않음

 

정리

  • 네이티브 메서드를 사용하기 전에 한번 더 고민하는 것을 권장
    • 네이티브 메서드가 성능 향상에 도움을 주지 못할 확률이 높음
    • 네이티브 메서드를 사용해야한다면 최소한으로 사용하고 철저한 테스트 필요
    • 네이티브 메서드 안에 숨은 단 하나의 버그가 애플리케이션 전체를 훼손할 수 있으며 앞서 언급했다시피 디버깅 및 추적이 어려워 시간을 엄청 소모할 수 있음

 

참고

이펙티브 자바

반응형