개인룸/도윤
Item66. 네이티브 메서드는 신중히 사용하라
UroJem
2023. 8. 29. 00:23
자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다.
네이티브 메서드란 C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다.
네이티브 메서드의 주요 쓰임
- 레지스트리 같은 플랫폼 트고하 기능 사용
- 네이티브 코드로 작성된 기존 라이브러리 사용. 레거시 데이터를 사용하는 레거시 라이브러리가 그 예
- 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성
플랫폼 특화 기능을 활용하려면 네이티브 메서드를 사용해야 하지만 자바가 발전하면서 OS같은 하부 플랫폼의 기능을 점차 흡수하고 있어서 네이티브 메서드를 사용할 필요가 계속 줄어들고 있다.
대체할 만한 자바 라이브러리가 없는 네이티브 라이브러리를 사용할 때는 네이티브 메서드를 써야한다.
성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 권장하지 않는다.
자바 3 이전 초기 시절이라면 이야기가 다르지만 JVM의 발전 속도가 빨라 대부분 자바 프로그래밍 언어로 해결할 수 있다.
정말로 고 성능의 다중 정밀 연산이 필요하다면 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선작업이 계속 되어 왔기 때문에 네이티브 메서드를 통해 GMP를 사용하는걸 고려해도 좋다.
하지만 네이티브 메서드의 심각한 단점으로
- 네이티브 언어는 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션은 메모리 훼손 오류로 안전하지 않다.
- 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮고 디버깅도 더 어렵다.
- 주의하지 않으면 속도가 오히려 느려질 수 있다.
- 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고 추적조차 할 수 없다.
- 자바 코드와 네이티브 코드의 경계를 넘나들 때 마다 비용도 추가된다.
- 마지막으로 네이티브 메서드와 자바 코드 사이의 접착코드를 작성하는 것도 귀찮은 작업이기도 하고 가독성도 떨어지니 주의해서 사용해야 한다.
핵심정리
네이티브 메서드를 사용하려거든 한번 더 생각하라. 네이티브 메서드가 성능을 개선해주는 일은 많지 않다. 저수준 자원이나 네이티브 라이브러리를 사용해야만 해서 어쩔 수 없더라도 네이티브 코드는 최소한만 사용하고 철저히 테스트하라. 네이티브 코드 안에 숨은 단 하나의 버그가 애플리케이션 전체를 훼손할 수도 있다.