책/이펙티브 자바
item 66 네이티브 메서드는 신중히 사용하라
함께자라기
2022. 4. 21. 17:54
ITEM 66 네이티브 메서드는 신중히 사용하라
자바 네이티브 인터페이스(Java Native Interface, JNI)
- 자바 프로그램이 네이티브 메서드를 호출하는 기능이다
- 네이티브 메서드: C, C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드
전통적으로 네이티브 메서드는 아래 3가지 경우에 주로 사용된다
- 레지스트리 같은 플랫폼 특화 기능을 사용한다
- 네이티브 코드로 작성된 기존 라이브러리를 사용한다
- 레거시 데이터를 사용하는 레거시 라이브러리가 그 예다
- 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다
플랫폼 특화 기능을 활용하려면 네이티브 메서드를 사용해야 하지만 자바가 성숙해지며(OS 같은) 하부 플랫폼의 기능을 흡수하고 있다
- 따라서 네이티브 메서드를 사용할 필요가 점차 줄어들고 있다
- ex) 자바9는 process API를 추가해 OS 프로세스에 접근하는 길을 열어주었다
- 대체할 만한 자바 라이브러리가 없는 네이티브 라이브러리를 사용해야 하는 경우도 네이티브 메서드를 써야 한다
성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 거의 권장하지 않는다
- 자바 초기(자바3 전)이면 이야기가 다르지만 JVM은 그동안 엄청난 속도로 발전했다
- 대부분의 작업에서 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다
네이티브 메서드의 심각한 단점
- 네이티브 언어가 안전하지 않으므로(item 50) 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 안전하지 않다
- 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮으며 디버깅도 더 어렵고 주의하지 않으면 속도도 느려질 수 있다
- 또한 가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고 심지어 추적도 못한다
- 자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용도 추가된다
- 네이티브 메서드와 자바 코드 사이의 접착 코드(glue code)를 작성해야 하는데 귀찮으며 가독성도 안좋다