[Effective Java] Day 33 - Item 66 :: 네이티브 메서드는 신중히 사용하라
in Java on Java
Last modified at:
Java Native Interface(자바 네이티브 인터페이스, JNI): 자바 프로그램이 네이티브 메서드를 호출하는 기술
Native method(네이티브 메서드)
C나 c++같은 네이티브 프로그래밍 언어로 작성한 메서드
주요쓰임
- 레지스트리 같은 플랫폼 특화 기능을 사용함
- 네이티브 코드로 작성된 기존 라이브러리 사용
- 레거시 데이터를 사용하는 레거시 라이브러리
- 대체할 만한 Java 라이브러리가 없는 경우 네이티브 라이브러리를 사용함
- 성능개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성
성능 개선 목적의 네이티브 메서드 사용은 권장하지 않는다.
- 자바 3 이전의 초기시절이라면 얘기가 다르지만, JVM은 그동안 빠른 속도로 발전해왔다.
- 대부분 작업에서 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다.
- ex) BigInteger
- Java.math가 추가된 자바 1.1때: C로 작성한 고성능 라이브러리에 의존
- Java 3: 순수 자바로 다시 구현되면서 원래의 네이티브 구현보다 더 빨라짐
- ex) BigInteger
- 네이티브 라이브러리는 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선작업이 계속돼왔다.
- 그러므로 고성능의 다중 정밀 연산이 필요하다면 네이티브 메서드를 통해 GMP를 사용하는 것을 고려해보자.
단점
- 네이티브 언어가 안전하지 않으므로(item 50) 네이티브 메서드를 사용하는 다른 애플리케이션도 메모리 훼손 오류로 부터 불안전하다.
- 네이티브 언어는 자바보다 플랫폼을 많이 타 이식성이 낮다.
- 디버깅이 어렵다
- 주의하지 않으면 오히려 속도가 더 느려진다
- 네이티브 메모리는 가비지 컬렉터가 자동 회수하지 못하며, 추적도 불가능하다(ITEM 8)
- 자바 코드와 네이티브 코드의 경계를 넘나들 때 비용이 발생한다.
- 네이티브 코드와 자바 코드 사이 접착코드(glue code)를 작성해야하나, 귀찮고 가독성도 떨어진다.
정리
- 네이티브 메서드를 사용하려거든 한번 더 생각해라
- 네이티브 메서드가 성능을 개선해주는 일은 많지 않다.
- 저수준 자원이나 네이티브 라이브러리를 사용해야만 해서 어쩔 수 없다면, 최소한만 사용하고 철저하게 테스트해라
- 네이티브 코드 안에 숨은 하나의 버그가 어플리케이션 전체에 영향을 줄 수도 있다.
참고
- 네이티브 메서드를 작성하여 dll 파일에 접근하는 예
- 네이티브 메서드를 가져다 쓰는 예