-
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)를 작성해야 하는데 귀찮으며 가독성도 안좋다
네이티브 메서드를 사용하려거든 한번 더 생각하라
네이티브 메서드가 성능을 개선해주는 일은 많지 않다
저수준 자원이나 네이티브 라이브러리를 사용해야만 해서 어쩔 수 없더라도 네이티브 코드는 최소한만 사용하고 철저히 테스트 하라
네이티브 코드 안에 숨은 단 하나의 버그가 여러분 애플리케이션 전체를 훼손할 수도 있다
'책 > 이펙티브 자바' 카테고리의 다른 글
item 68 일반적으로 통용되는 명명 규칙을 따르라 (0) 2022.04.22 item 67 최적화는 신중히 하라 (0) 2022.04.22 item 65 리플렉션보다는 인터페이스를 사용하라 (0) 2022.04.21 item 64 객체는 인터페이스를 사용해 참조하라 (0) 2022.04.21 item 63 문자열 연결은 느리니 주의하라 (0) 2022.04.21 - 자바 프로그램이 네이티브 메서드를 호출하는 기능이다