핵심 정리
네이티브 메소드는 메모리 관리, 성능, 이식성, 디버깅 등에서 문제를 일으킬 수 있으므로, 정말 꼭 필요한 경우에만 사용하자.
❔ 자바 네이티브 인터페이스(Java Native Interface, JNI)
더보기
JVM이 C, C++, 어셈블리와 같은 다른 프로그래밍 언어로 작성된 애플리케이션과 상호작용하는 데 사용하는 프로그래밍 프레임워크이다. JNI는 자바 코드가 네이티브 메소드를 호출하고, 네이티브 코드(즉, C/C++ 등의 언어로 작성된 코드)가 JVM 내에서 실행되는 자바 객체를 호출하는 기능을 제공한다.
네이티브 메소드의 전통적인 주요 쓰임새
- 레지스트리 같은 플랫폼 특화 기능
- 특정 플랫폼에만 특화된 기능을 사용하기 위해 네이티브 메소드를 사용할 수 있다.
- ex. 윈도우에만 제공하는 레지스트리 기능을 자바에서 사용하고자 하는 경우 네이티브 메소드를 사용할 수 있다.
- 하지만 자바가 발전하면서 플랫폼 특화 기능들을 자체적으로 제공하는 경우가 많아졌다.
- ex. 자바 9 이상부터는 OS 프로세스에 접근하는 API를 제공한다.
- 특정 플랫폼에만 특화된 기능을 사용하기 위해 네이티브 메소드를 사용할 수 있다.
- 네이티브 코드로 작성된 기존 라이브러리 사용
- 기존 라이브러리를 재사용하기 위해서는 네이티브 메소드를 사용해야 한다.
- ex. 레거시 데이터를 사용하는 레거시 라이브러리
- 성능 개선의 목적으로 성능에 영향을 주는 부분만 사용
- 특정 연산이 자바로 작성한 것보다 네이티브 언어로 작성한 경우 훨씬 좋다면, 그 부분을 네이티브 메소드로 작성하여 성능을 개선할 수 있다.
- 현재는 성능을 개선할 목적으로 네이티브 메소드를 사용하는 것은 거의 권장하지 않는다.
GNU 다중 정밀 연산 라이브러리(GMP)가 필요한 자바 프로그래머라면 GMP를 사용하는 걸 고려해도 좋다.
네이티브 메소드의 단점
- 네이티브 언어는 메모리 훼손 오류로부터 안전하지 않다.(item 50)
- 자바는 메모리 관리를 자동으로 처리해주는 언어이므로, 개발자가 직접 메모리를 관리할 필요가 없다.
- 그러나 네이티브 언어를 사용하면 개발자가 직접 메모리를 할당하고 해제해야 한다.
- 이 과정에서 메모리 할당이나 해제를 잘못 처리하면 메모리 훼손 오류가 발생할 수 있다.
- 자바보다 플랫폼에 의존적이므로 이식성이 낮다.
- 자바 코드는 다양한 플랫폼엣 동작시킬 수 있으나, 네이티브 언어로 작성된 코드는 특정 운영체제나 하드웨어에 의존적이므로, 자바 코드보다 이식성이 낮다.
- GC는 네이티브 메모리를 자동 회수하지 못하기 때문에 추적할 수 없다.(item 8)
- 성능, 비용, 디버깅 측면에서 모두 좋지 않다.
- 자바와 네이티브 코드의 전환은 비용이 많이 들며, 이로 인해 성능이 저하될 수 있다.
'Language > Java' 카테고리의 다른 글
| [effective java] 아이템 68. 일반적으로 통용되는 명명 규칙을 따르라. (0) | 2023.07.31 |
|---|---|
| [effective java] 아이템 67. 최적화는 신중히 하라. (0) | 2023.07.31 |
| [effective java] 아이템 65. 리플렉션보다는 인터페이스를 사용하라. (0) | 2023.07.27 |
| [effective java] 아이템 64. 객체는 인터페이스를 사용해 참조하라. (0) | 2023.07.27 |
| [effective java] 아이템 63. 문자열 연결은 느리니 주의하라. (0) | 2023.07.27 |