item 66 Jung incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e ์•„์ดํ…œ 66๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.

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

package com.example.jni;

public class JNIJava {
    static {
        System.loadLibrary("libJNI_CPP");
    }

    // Obviously, native methods may not have a body defined in Java
    public native void printString(String name);
    public static native double average(int[] nums);

    public static void main(final String[] args) {
        JNIJava jniJava = new JNIJava();
        jniJava.printString("Invoked C++ 'printString' from Java");

        double d = average(new int[]{1, 2, 3, 4, 7});
        System.out.println("Got result from C++ 'average': " + d);
    }
}

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

  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ™์€ ํ”Œ๋žซํผ ํŠนํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค
  • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋œ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
  • ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ๋ชฉ์ ์œผ๋กœ ์„ฑ๋Šฅ์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๋Š” ์˜์—ญ๋งŒ ๋”ฐ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•œ๋‹ค.

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

public class RuntimeTest {
    public static void main(String[] args) throws IOException, InterrupedException {
        Runtime rt = Runtime.getRuntime();
        Process pc = null;
        try {
            //์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰
            pc = rt.exec("์‹คํ–‰ ํ•  ํ”„๋กœ๊ทธ๋žจ ๊ฒฝ๋กœ ๋˜๋Š” ๋ช…๋ น์–ด");
	    System.out.println("Microsoft Excel Excute!!");
	} catch (IOException e) {
	    e.printStackTrace();
	} finally {
       	    // ๋ช…๋ น์–ด ์ข…๋ฃŒ์‹œ ๊นŒ์ง€ ๋Œ€๊ธฐ
	    pc.waitFor();
	    // ๋ช…๋ น์–ด ์ข…๋ฃŒ์‹œ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค ์ œ๊ฑฐ
	    pc.destroy();
	}
    }
}

์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ๋ชฉ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

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

  • ์ž๋ฐ”๋ณด๋‹ค ํ”Œ๋žซํผ์„ ๋งŽ์ด ํƒ€์„œ ์ด์‹์„ฑ๋„ ๋‚ฎ๋‹ค
  • ๋””๋ฒ„๊น…๋„ ๋” ์–ด๋ ต๋‹ค
  • ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์†๋„๊ฐ€ ์˜คํžˆ๋ ค ๋Š๋ ค์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ž๋™ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ถ”์  ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ์™€ ์ž๋ฐ” ์ฝ”๋“œ ์‚ฌ์ด์˜ '์ ‘์ฐฉ ์ฝ”๋“œ(glue code)'๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ท€์ฐฎ์€ ์ž‘์—…์ด๊ธฐ๋„ ํ•˜๊ฑฐ๋‹ˆ์™€ ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง„๋‹ค.

์ •๋ฆฌ

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ฑฐ๋“  ํ•œ๋ฒˆ ๋” ์ƒ๊ฐํ•˜๋ผ. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ด์ฃผ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š๋‹ค. ์ €์ˆ˜์ค€ ์ž์›์ด๋‚˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ด์„œ ์–ด์ฉ” ์ˆ˜ ์—†๋”๋ผ๋„ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” ์ตœ์†Œํ•œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜๋ผ.

๋ ˆํผ๋Ÿฐ์Šค