본문 바로가기

회고/이펙티브 자바 3판

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

반응형

자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 여기서 네이티브 메서드란 C나 C++같은 네이티브 프로그래밍 언어로 작성된 메서드를 말한다. 

 

네이티브 메서드의 주요 쓰임은 다음 3가지이다. 하지만 반박이 더 내용이 많다.

1. 레지스트리 같은 플랫폼 특화 기능을 사용한다.

-> 자바가 성숙해가면서 OS같은 하부 플랫폼의 기능들을 점차 흡수하고 있다. 그래서 네이티브 메서드를 사용할 필요가 계속 줄어들고 있다. 예컨대 자바 9은 새로 process API를 추가해 OS 프로세스에 접근하는 길을 열어주었다. 

 

2. 네이티브 코드로 작성된 기존 라이브러리를 사용한다. 레거시 라이브러리이다.

-> 대체할만한, 자바라이브러리가 없다면 기존 라이브러리를 써야 한다.

 

3. 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 네이티브 언어로 작성한다

-> 하지만 성능 개선 목적의 네이티브 메서드 사용은 거의 권장하지 않는다. JVM은 엄청난 속도로 발전하고 있다. 예컨대 java.math가 처음 추가된 자바 1.1 시절에는 BigInteger라는 C로 작성한 고성능 라이브러리에 의지했다. 하지만 자바 3때 순수 자바로 다시 구현되면서 세심한 튜닝을 한 결과, 원래의 네이티브 구현보다도 더 빨라졌다. 이후 자바에서는 커다란 변화가 없었는데, 네이티브 라이브러리 쪽은 GNU에서 GMP를 필두고 개선 작업이 계속 되었다. 따라서, 정말 고성능의 다중 정밀 연산이 필요하다면 네이티브 메서드를 통한 GMP를 사용하는 걸 고려해도 좋다.

 

네이티브 메서드의 단점

 메모리 훼손 오류로부터 더이상 안전하지 않다. 이식성이 낮고, 디버깅이 어렵기 때문에 주의하지 않으면 속도가 오히려 늦어질 수도 있다. 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적조차 할 수 없다. 자바와 네이티브 코드의 경계를 넘나들 때마다 비용도 추가된다. 마지막으로 네이티브 메서드와 자바 코드 사이의 '접착코드(glue code)'를 작성해야 하는데, 이는 귀찮은 작업이기도 하고 가독성도 떨어진다.

 

*느낀점

항상 자바 JVM의 구조를 살펴보면 나오는 것이 JNI 영역이었다. 네이티브 메서드에 관한 영역이라고만 외웠는데, 좀 더 구체적인 역할과 최근 동향에 대해 알 수 있었다. 자바가 언제까지 계속 사용될지 모르지만, 현재 굉장히 많은 발전으로 플랫폼의 호환성 증가와, 성능 개선이 이루어졌다. 물론, 절대적인 것은 없으므로 좋은 기능들을 고려해야겠지만, 최대한 JNI없이 자바에서 효율을 낼 수 있도록 고려하면 충분히 좋은 프로그램을 만들 수 있을것이라고 생각한다.

반응형