티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기


자바의 네이티브 인터페이스(Java native interface, JNI)는 C나 C++ 등의 native programming language로 작성된 native method를 호출하는 데 이용되는 기능이다. 네이티브 메서드가 수행하는 임의의 계산은 네이티브 언어로 실행되며, 자바 언어로 전달된다.

전통적으로 네이티브 메서드는 세 가지 용도로 쓰였다. 네이티브 메서드를 사용하면 레지스트리(registry)나 파일 락(file lock) 같은 특정 플랫폼에 고유한 기능을 이용할 수 있다.

또한 이미 구현되어 있는 라이브러리를 이용할 수 있으며, 그 라이브러리를 통해 기존 데이터를 활용할 수 있다.

마지막으로, 네이티브 메서드를 사용하면 성능이 중요한 부분의 처리를 네이티브 언어에 맡길 수 있다.

특정 플랫폼에만 있는 기능을 이용하는 데는 네이티브 메서드가 적당하다. 하지만 자바 플랫폼이 발전하면서, 특정 플랫폼에서만 발견할 수 있었던 기능들도 제공되기에 이르렀다.

따라서 네이티브 메서드를 통해 성능을 개선하는 것은 추천하고 싶지 않다. 현재 JVM은 훨씬 빠르고 네이티브 메서드 없이도 그에 필적하는 성능을 내는 것이 가능하다.

네이티브 메서드에는 심각한 문제가 있다. 네이티브 언어는 안전하지 않으므로(규칙 39), 네이티브 메서드를 이용하는 프로그램은 메모리 훼손 문제(memory corruption error)로부터 자유로울 수 없다. 게다가 네이티브 언어는 플랫폼 종속적이므로 이식성이 낮다.

또한 네이티브 코드를 사용하는 프로그램은 디버깅하기도 훨씬 어렵다. 네이티브 코드를 넘나드는데 필요한 기본적인 비용 때문에, 네이티브 메서드가 하는 일이 별로 없다면 오히려 성능을 떨어뜨릴 수도 있다. 게다가 네이티브 메서드를 사용하려면 이해하기도 어렵고 작성하기도 난감한 적찹코드(glue code)를 작성해야 한다.

요약

네이티브 메서드를 사용하는 것은 재고하라. 그럴 일이 있을지는 모르겠으나 굳이 그래야 한다면, 성능 개선 용도로만 써라. 저수준(low-level) 자원이나 기존 라이브러리(legacy library)를 이용하기 위해 네이티브 메서드를 사용해야 한다면, 네이티브 코드는 가능하면 줄이고 광범위한 테스트를 거치기 바란다. 네이티브 코드에 있는 아주 작은 버그라도 시스템 전체를 훼손시킬 수 있다.

댓글