item 66 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์๋ฐ ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค(Java Native Interface, JNI)
์๋ฐ ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค(Java Native Interface, JNI)๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ธฐ์ ์ด๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋๋ C๋ C++ ๊ฐ์ ๋ค์ดํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ๋ฉ์๋๋ฅผ ๋งํ๋ค.
์ ํต์ ์ผ๋ก ๋ค์ดํฐ๋ธ ๋ฉ์๋์ ์ฃผ์ ์ฐ์์ ๋ค์ ์ธ ๊ฐ์ง๋ค.
-
๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ํ๋ซํผ ํนํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
-
๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์์ฑ๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. (๋ ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ ๊ฑฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ทธ ์๋ค)
-
์ฑ๋ฅ ๊ฐ์ ์ ๋ชฉ์ ์ผ๋ก ์ฑ๋ฅ์ ๊ฒฐ์ ์ ์ธ ์ํฅ์ ์ฃผ๋ ์์ญ๋ง ๋ฐ๋ก ๋ค์ดํฐ๋ธ ์ธ์ด๋ก ์์ฑํ๋ค.
์งํํ๋ Java
ํ๋ซํผ ํนํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ ค๋ฉด ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ํ์ง๋ง ์๋ฐ๊ฐ ์ฑ์ํด๊ฐ๋ฉด์ OS ๊ฐ์ ํ๋ถ ํ๋ซํผ์ ๊ธฐ๋ฅ๋ค์ ์ ์ฐจ ํก์ํ๊ณ ์๋ค.
๊ทธ๋์ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ๊ณ์ ์ค์ด๋ค๊ณ ์๋ค. ์์ปจ๋ ์๋ฐ 9๋ ์๋ก process API๋ฅผ ์ถ๊ฐํด OS ํ๋ก์ธ์ค์ ์ ๊ทผํ๋ ๊ธธ์ ์ด์ด์ฃผ์๋ค.
์ฑ๋ฅ์ ๊ฐ์ ํ ๋ชฉ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฑฐ์ ๊ถ์ฅํ์ง ์๋๋ค. JVM์ ๊ทธ๋์ ์์ฒญ๋ ์๋๋ก ๋ฐ์ ํด์๋ค.
๋๋ถ๋ถ ์์ ์์ ์ง๊ธ์ ์๋ฐ๋ ๋ค๋ฅธ ํ๋ซํผ์ ๊ฒฌ์ค๋งํ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
์์ปจ๋ java.math๊ฐ ์ฒ์ ์ถ๊ฐ๋ ์๋ฐ 1.1 ์์ BigInteger๋ C๋ก ์์ฑํ ๊ณ ์ฑ๋ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์งํ๋ค.
๊ทธ๋ฌ๋ค ์๋ฐ 3 ๋ ์์ ์๋ฐ๋ก ๋ค์ ๊ตฌํ๋๋ฉด์ ํ๋๋ ๊ฒฐ๊ณผ, ์๋์ ๋ค์ดํฐ๋ธ ๊ตฌํ๋ณด๋ค๋ ๋ ๋นจ๋ผ์ก๋ค.
ํ์ง๋ง, ๊ทธ ํ๋ก BigInteger๋ ์๋ฐ 8์์ ํฐ ์์ ๊ณฑ์
์ฑ๋ฅ์ ๊ฐ์ ํ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋ ์ด์์ ์ปค๋ค๋ ๋ณํ๊ฐ ์์๋ค.
๋ฐ๋ฉด ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ชฝ์ GNU ๋ค์ค ์ ๋ฐ ์ฐ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(GMP)๋ฅผ ํ๋๋ก ๊ฐ์ ์์
์ด ๊ณ์๋ผ์๋ค.
๊ทธ๋์ ๊ณ ์ฑ๋ฅ์ ๋ค์ค ์ ๋ฐ ์ฐ์ฐ์ด ํ์ํ ์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํตํด GMP ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํ ์๋ ์๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋์ ๋จ์
๋ค์ดํฐ๋ธ ๋ฉ์๋์๋ ์ฌ๊ฐํ ๋จ์ ์ด ์๋ค. ๋ค์ดํฐ๋ธ ์ธ์ด๊ฐ ์์ ํ์ง ์์ผ๋ฏ๋ก ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ํผ์ ์ค๋ฅ๋ก๋ถํฐ ๋ ์ด์ ์์ ํ์ง ์๋ค.
๋ค์ดํฐ๋ธ ์ธ์ด๋ ์๋ฐ๋ณด๋ค ํ๋ซํผ ์์กด๋๊ฐ ๋์ ์ด์์ฑ๋ ๋ฎ๋ค. ๋๋ฒ๊น ๋ ๋ ์ด๋ ต๋ค. ์ฃผ์ํ์ง ์์ผ๋ฉด ์๋๊ฐ ์คํ๋ ค ๋๋ ค์ง ์๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ GC๋ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ํ์ํ์ง ๋ชปํ๊ณ ์ถ์ ๋ ๋ชปํ๋ค. ์๋ฐ ์ฝ๋์ ๋ค์ดํฐ๋ธ ์ฝ๋์ ๊ฒฝ๊ณ๋ฅผ ๋๋๋ค ๋๋ง๋ค ๋น์ฉ๋ ์ถ๊ฐ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ค์ดํฐ๋ธ ๋ฉ์๋์ ์๋ฐ ์ฝ๋ ์ฌ์ด์ '์ ์ฐฉ ์ฝ๋'๋ฅผ ์์ฑํด์ผ ํ๋๋ฐ, ์ด๋ ๊ท์ฐฎ์ ์์ ์ด๊ธฐ๋ ํ๊ณ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๋ค.