Effective Java : 아이템 66. 네이티브 메서드는 신중히 사용하라

    아이템 66. 네이티브 메서드는 신중히 사용하라.

    • JNI는 사용 경우 : OS 플랫폼 특화 기능이 필요하거나, 네이티브 라이브러리를 대체할 자바 라이브러리가 없는 경우.
    • JNI 사용하면 안되는 경우 : 성능 개선을 위해서 사용할 때. 
    • JNI 단점 : 네이티브 언어가 타입 안전하지 않아 자바가 타입 안전하지 않게 되고, 플랫폼 이식성이 낮아짐. 

    JNI란?

    JNI(Java Native INterface)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 네이티브 메서드는 C, C++ 같은 네이티브 프로그래밍 언어로 작성된 메서드를 의미한다. 


    JNI를 사용해야 할 필요가 있을 때

    • OS 플랫폼 특화 기능을 활용하고 싶을 때
    • 네이티브 라이브러리를 대체할만한 자바 라이브러리가 없을 때

    자바는 최근 성숙해가면서 OS 같은 하부 플랫폼의 기능들을 점차 흡수하고 있다. 이 말은 자바가 JNI를 이용해서 네이티브 라이브러리를 사용할 필요가 점점 없어지고 있다는 것이다. 그럼에도 불구하고 위 두 가지 경우에 해당한다면 JNI를 이용하는 것을 고려해 볼 수 있다. 


    사용하면 안되는 경우.

    • 성능을 개선할 목적으로 JNI를 사용하는 것은 거의 권장하지 않음.

    초기 자바는 성능 문제가 있었으나, 최근의 자바는 다른 플랫폼에 견줄만한 성능을 보인다. 따라서 성능을 개선할 목적으로 JNI를 사용할 필요는 없어졌다. 한 가지 예외가 있는데, 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리 (GMP)위주로 개선 작업이 계속 진행되어왔고, GMP의 활용이 필요하다면 JNI를 사용하는 것이 좋다.


    JNI의 단점은?

    이렇게 JNI를 사용하지 말라고 한 이유는 네이티브 메서드에는 심각한 단점이 존재하기 때문이다. 아래에서 볼 수 있듯이 JNI를 사용하면 플랫폼 이식성도 떨어지고, 타입 안전하지 못하기 때문에 어플리케이션 전체가 타입 불안전하게 된다.

    • 네이티브 언어는 안전하지 않음 → JNI를 사용하는 어플리케이션도 메모리 훼손 오류로부터 안전하지 않음.
    • 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮다. 디버깅도 어려움. 
    • GC가 네이티브 메모리는 자동 회수하지 못하고, 추적할 수도 없음. 
    • Java - JNI를 넘나들 때 추가 비용이 생성됨.
    • Java - JNI 사이에 접착 코드도 추가해야함. 

    댓글

    Designed by JB FACTORY