네이티브 메서드는 신중히 사용하라 - Effective Java[66]
🔗 네이티브 메서드는 뭐야?
-
자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다.
-
네이티브 메서드란 C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다.
-
전통적으로 네이티브 메서드의 주요 쓰임은 다음 세 가지다.
-
첫 번째, 레지스트리 같은 플랫폼 특화 기능을 사용한다.
-
두 번째, 네이티브 코드로 작성된 기존 라이브러리를 사용한다.
- 레거시 데이터를 사용하는 레거시 라이브러리가 그 예다.
-
세 번째, 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.
-
💎 플랫폼 특화 기능을 활용하려면 네이티브 메서드를 사용해야 한다.
- 하지만 자바가 성숙해가면서 (OS 같은) 하부 플랫폼의 기능들을 점차 흡수하고 있다.
- 그래서 네이티브 메서드를 사용할 필요가 계속 줄어들고 있다.
- 자바 9는 새로 process API를 추가해 OS 프로세스에 접근하는 길을 열어주었다.
- 대체 할 만한 자바 라이브러리가 없는 네이티브 라이브러리를 사용해야 할 때도 네이티브 메서드를 써야 한다.
🔗 성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 거의 권장하지 않는다.
-
대부분 작업에서 지금의 자바는 다른 플랫폼에 견줄만한 성능을 보인다.
-
ex) java.math가 처음 추가된 자바 1.1 시절 BigInteger는 C로 작성한 고성능 라이브러리에 의지했다.
-
그러다 자바 3때 순수 자바로 다시 구현되면서 세심히 튜닝한 결과, 원래의 네이티브 구현보다도 더 빨라졌다.
-
하지만 그 후로 BigInteger는 자바 8에서 큰 수의 곱셈 성능을 개선한 것을 제외하고는 더 이상의 커다란 변화가 없었다.
-
-
-
한편, 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리(GMP)를 필두로 개선 작업이 계속돼왔다.
- 그래서 정말로 고성능의 다중 정밀 연산이 필요한 자바 프로그래머라면 이제 네이티브 메서드를 통해 GMP를 사용하는 걸 고려해도 좋다.
💎 네이티브 메서드의 심각한 단점
-
네이티브 언어가 안전하지 않으므로 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 더이상 안전하지 않다.
-
네이티브 언어는 자바보다 플랫폼을 많이 타서 이식성도 낮다.
-
디버깅도 어렵다.
-
주의하지 않으면 속도가 오히려 느려질 수도 있다.
-
가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못하고, 심지어 추적조차 할 수 없다.
-
자바 코드와 네이티브 코드의 경계를 넘나들 때마다 비용도 추가된다.
-
마지막으로 네이티브 메서드와 자바 코드 사이의 ‘접착 코드(glue code)‘를 작성해야 하는데, 이는 귀찮은 작업이기도 하거니와 가독성도 떨어진다.
네이티브 메서드를 사용하려거든 한번 더 생각해라.
네이티브 메서드가 성능을 개선해 주는 일은 많지 않다.
저수준 자원이나 네이티브 라이브러리를 사용해야만 해서 어쩔 수 없더라도 네이티브 코드는
최소한만 사용하고 철저히 테스트하라.
네이티브 코드 안에 숨은 단 하나의 버그가 애플리케이션 전체를 훼손할 수도 있다.
참조 - 이펙티브 자바 3/E - 조슈아 블로크때
Comments