item 66 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์ž๋ฐ” ๋„ค์ดํ‹ฐ๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค(Java Native Interface, JNI)

์ž๋ฐ” ๋„ค์ดํ‹ฐ๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค(Java Native Interface, JNI)๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ž€ C๋‚˜ C++ ๊ฐ™์€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋งํ•œ๋‹ค.

์ „ํ†ต์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์˜ ์ฃผ์š” ์“ฐ์ž„์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋‹ค.

  1. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ™์€ ํ”Œ๋žซํผ ํŠนํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  2. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋œ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ทธ ์˜ˆ๋‹ค)

  3. ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ๋ชฉ์ ์œผ๋กœ ์„ฑ๋Šฅ์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๋Š” ์˜์—ญ๋งŒ ๋”ฐ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•œ๋‹ค.

์ง„ํ™”ํ•˜๋Š” Java

ํ”Œ๋žซํผ ํŠนํ™” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”๊ฐ€ ์„ฑ์ˆ™ํ•ด๊ฐ€๋ฉด์„œ OS ๊ฐ™์€ ํ•˜๋ถ€ ํ”Œ๋žซํผ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ ์ฐจ ํก์ˆ˜ํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ๊ณ„์† ์ค„์–ด๋“ค๊ณ  ์žˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ ์ž๋ฐ” 9๋Š” ์ƒˆ๋กœ process API๋ฅผ ์ถ”๊ฐ€ํ•ด OS ํ”„๋กœ์„ธ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ธธ์„ ์—ด์–ด์ฃผ์—ˆ๋‹ค.


์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ๋ชฉ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. JVM์€ ๊ทธ๋™์•ˆ ์—„์ฒญ๋‚œ ์†๋„๋กœ ๋ฐœ์ „ํ•ด์™”๋‹ค.

๋Œ€๋ถ€๋ถ„ ์ž‘์—…์—์„œ ์ง€๊ธˆ์˜ ์ž๋ฐ”๋Š” ๋‹ค๋ฅธ ํ”Œ๋žซํผ์— ๊ฒฌ์ค„๋งŒํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.

์˜ˆ์ปจ๋Œ€ java.math๊ฐ€ ์ฒ˜์Œ ์ถ”๊ฐ€๋œ ์ž๋ฐ” 1.1 ์‹œ์ ˆ BigInteger๋Š” C๋กœ ์ž‘์„ฑํ•œ ๊ณ ์„ฑ๋Šฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์ง€ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ์ž๋ฐ” 3 ๋•Œ ์ˆœ์ˆ˜ ์ž๋ฐ”๋กœ ๋‹ค์‹œ ๊ตฌํ˜„๋˜๋ฉด์„œ ํŠœ๋‹๋œ ๊ฒฐ๊ณผ, ์›๋ž˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌํ˜„๋ณด๋‹ค๋„ ๋” ๋นจ๋ผ์กŒ๋‹ค.

ํ•˜์ง€๋งŒ, ๊ทธ ํ›„๋กœ BigInteger๋Š” ์ž๋ฐ” 8์—์„œ ํฐ ์ˆ˜์˜ ๊ณฑ์…ˆ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š”  ๋” ์ด์ƒ์˜ ์ปค๋‹ค๋ž€ ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ๋‹ค. 

๋ฐ˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ชฝ์€ GNU ๋‹ค์ค‘ ์ •๋ฐ€ ์—ฐ์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(GMP)๋ฅผ ํ•„๋‘๋กœ ๊ฐœ์„  ์ž‘์—…์ด ๊ณ„์†๋ผ์™”๋‹ค. 

๊ทธ๋ž˜์„œ ๊ณ ์„ฑ๋Šฅ์˜ ๋‹ค์ค‘ ์ •๋ฐ€ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด GMP ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์˜ ๋‹จ์ 

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์—๋Š” ์‹ฌ๊ฐํ•œ ๋‹จ์ ์ด ์žˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ๋ฉ”๋ชจ๋ฆฌ ํ›ผ์† ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ๋” ์ด์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋Š” ์ž๋ฐ”๋ณด๋‹ค ํ”Œ๋žซํผ ์˜์กด๋„๊ฐ€ ๋†’์•„ ์ด์‹์„ฑ๋„ ๋‚ฎ๋‹ค. ๋””๋ฒ„๊น…๋„ ๋” ์–ด๋ ต๋‹ค. ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์†๋„๊ฐ€ ์˜คํžˆ๋ ค ๋Š๋ ค์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  GC๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ถ”์ ๋„ ๋ชปํ•œ๋‹ค. ์ž๋ฐ” ์ฝ”๋“œ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋‚˜๋“ค ๋•Œ๋งˆ๋‹ค ๋น„์šฉ๋„ ์ถ”๊ฐ€๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์™€ ์ž๋ฐ” ์ฝ”๋“œ ์‚ฌ์ด์˜ '์ ‘์ฐฉ ์ฝ”๋“œ'๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ท€์ฐฎ์€ ์ž‘์—…์ด๊ธฐ๋„ ํ•˜๊ณ  ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง„๋‹ค.