아이템 66. 네이티브 메서드는 신중히 사용하라.
- JNI는 사용 경우 : OS 플랫폼 특화 기능이 필요하거나, 네이티브 라이브러리를 대체할 자바 라이브러리가 없는 경우.
- JNI 사용하면 안되는 경우 : 성능 개선을 위해서 사용할 때.
- JNI 단점 : 네이티브 언어가 타입 안전하지 않아 자바가 타입 안전하지 않게 되고, 플랫폼 이식성이 낮아짐.
JNI란?
JNI(Java Native INterface)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 네이티브 메서드는 C, C++ 같은 네이티브 프로그래밍 언어로 작성된 메서드를 의미한다.
JNI를 사용해야 할 필요가 있을 때
- OS 플랫폼 특화 기능을 활용하고 싶을 때
- 네이티브 라이브러리를 대체할만한 자바 라이브러리가 없을 때
자바는 최근 성숙해가면서 OS 같은 하부 플랫폼의 기능들을 점차 흡수하고 있다. 이 말은 자바가 JNI를 이용해서 네이티브 라이브러리를 사용할 필요가 점점 없어지고 있다는 것이다. 그럼에도 불구하고 위 두 가지 경우에 해당한다면 JNI를 이용하는 것을 고려해 볼 수 있다.
사용하면 안되는 경우.
- 성능을 개선할 목적으로 JNI를 사용하는 것은 거의 권장하지 않음.
초기 자바는 성능 문제가 있었으나, 최근의 자바는 다른 플랫폼에 견줄만한 성능을 보인다. 따라서 성능을 개선할 목적으로 JNI를 사용할 필요는 없어졌다. 한 가지 예외가 있는데, 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리 (GMP)위주로 개선 작업이 계속 진행되어왔고, GMP의 활용이 필요하다면 JNI를 사용하는 것이 좋다.
JNI의 단점은?
이렇게 JNI를 사용하지 말라고 한 이유는 네이티브 메서드에는 심각한 단점이 존재하기 때문이다. 아래에서 볼 수 있듯이 JNI를 사용하면 플랫폼 이식성도 떨어지고, 타입 안전하지 못하기 때문에 어플리케이션 전체가 타입 불안전하게 된다.
- 네이티브 언어는 안전하지 않음 → JNI를 사용하는 어플리케이션도 메모리 훼손 오류로부터 안전하지 않음.
- 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮다. 디버깅도 어려움.
- GC가 네이티브 메모리는 자동 회수하지 못하고, 추적할 수도 없음.
- Java - JNI를 넘나들 때 추가 비용이 생성됨.
- Java - JNI 사이에 접착 코드도 추가해야함.
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Effective Java : 아이템 83. 지연 초기화는 신중히 사용하라 (0) | 2023.09.06 |
---|---|
Effective Java : 아이템 67. 최적화는 신중히 하라 (0) | 2023.09.06 |
Effective Java : 아이템 65. 리플렉션보다는 인터페이스를 사용하라. (0) | 2023.09.06 |
Effective Java : 아이템 84. 프로그램의 동작을 스레드 스케쥴러에 기대지 말라 (0) | 2023.09.05 |
Effective Java : 아이템 81. wait, notify보다는 동시성 유틸리티를 애용하라. (0) | 2023.09.04 |