독서찰기(讀書札記)/이펙티브 자바

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

NoodleMan 2022. 3. 30. 00:47

자바 네이티브 인터페이스(Java Native Interface, JNI)란?

  • 자바 프로그램이 네이티브 메서드를 호출하는 기술
  • 네이티브 메서드란 C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드
  • 전통적으로 네이티브 메서드의 주요 쓰임은 다음 세 가지다.
    • 첫 번째, 레지스트리 같은 플랫폼 특화 기능을 사용한다.
    • 두 번째, 네이티브 코드로 작성된 기존 라이브러리를 사용한다.
      e.g.) 레거시 데이터를 사용하는 레거시 라이브러리
    • 세 번째, 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.

 

[Why]

성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 거의 권장하지 않는다.

  • 자바 초기 시절(자바 3 전)이라면 이야기가 다르겠지만, JVM은 그동안 엄청난 속도로 발전해왔다.
  • 대부분 작업에서 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다.

네이티브 메서드에는 심각한 단점이 있다.

  • 네이티브 언어가 안전하지 않으므로(아이템50) 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 안전하지 않다.
  • 네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮다.
  • 디버깅도 더 어렵다.
  • 주의하지 않으면 속도가 오히려 느려질 수도 있다.
  • GC가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적조차 할 수 없다(아이템8).
  • 자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용도 추가된다.
  • 네이티브 메서드와 자바 코드 사이의 '접착 코드(glue code)'를 작성해야 하는데, 이는 귀찮은 작업이기도 하고 가독성도 떨어진다.