• [Java] ch1 ์ž๋ฐ”์˜ ํŠน์ง•, JVM๊ณผ JIT ์ปดํŒŒ์ผ๋Ÿฌ

    2023. 8. 9.

    by. @leeeun

    about java

    • sun์‚ฌ์—์„œ ๊ฐœ๋ฐœ
    • ๊ฐ์ฒด์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
    • ํ˜„์žฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์— ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
    • ์šฐ๋ฆฌ๋‚˜๋ผ ๊ธฐ์—…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ตฌ์„ฑ

    Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded, and dynamic language

    ํŠน์ง•

    1. ๊ฐ„๋‹จํ•˜๋‹ค
    2. ๊ฐ์ฒด์ง€ํ–ฅ์  - class ์‚ฌ์šฉ
    3. compile ์–ธ์–ด์ด์ž interpreter ์–ธ์–ด
    4. robust(๊ฐ•๋ ฅํ•˜๋‹ค) ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ์ง€์›x, ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ž๋ฐ” ์‹œ์Šคํ…œ์ด ๊ด€๋ฆฌ(exception handling๋„) ์‹œ์Šคํ…œ ๋ถ•๊ดด์˜ ์šฐ๋ คx
    5. secure ์•ˆ์ „ - ์‹คํ–‰์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์ด ์ ์Œ
    6. platform independent - ์ž๋ฐ”์˜ ์‹คํ–‰ํŒŒ์ผ์€ binary ํŒŒ์ผ, ๊ฐ€์ƒ ๋จธ์‹ ์— ์˜ํ•ด ์‹คํ–‰ → cross platform os์˜ ๊ตฌ์•  ๋ฐ›์ง€ ์•Š์Œ
    7. multhithread ์ง€์›
    8. dynamic ๋™์ 

    ์‚ฌ์šฉ๋ถ„์•ผ

    • ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ
    • ๊ฒŒ์ž„ ๊ฐœ๋ฐœ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • ๋น…๋ฐ์ดํ„ฐ, ๋ถ„์‚ฐ์ฒ˜๋ฆฌ

    GC(ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•)

    ๊ณผ JIT ์ปดํŒŒ์ผ๋Ÿฌ(ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์ ์— byte๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜) ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์†๋„ ๋Š๋ฆผ(์„ฑ๋Šฅ ์ €ํ•˜)

    • JVM : .java ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋ฅผ ์ฝ๊ณ , ๊ฒ€์ฆ, ์‹คํ–‰ํ•จ. ํ”Œ๋žซํผ๋งˆ๋‹ค ๋™์ผํ•œ ์‹คํ–‰ํ™˜๊ฒฝ์„ ๋ณด์žฅ๋ฐ›์Œ. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ Garbage Collector๊ฐ€ ์ˆ˜ํ–‰
    • JRE : Java Runtime Environment์˜ ์•ฝ์ž. JVM์— ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ธฐํƒ€ ํŒŒ์ผ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ์ž๋ฐ”๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ(์ปดํŒŒ์ผ ๋„๊ตฌ๋Š”x)
    • JDK : Java Development Kit ์˜ ์•ฝ์–ด๋กœ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋””๋ฒ„๊ฑฐ, JRE ๋“ฑ์ด ํฌํ•จ๋œ ๊ฐœ๋ฐœ ๋„๊ตฌ๋‹ค. ๋‹จ์ˆœํžˆ ์ž๋ฐ”๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” JRE(Java Runtime Environment)๋งŒ ์žˆ์–ด๋„ ๋œ๋‹ค.

    ์ž๋ฐ”ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๋‹จ๊ณ„๊ฐ€ ํ•„์š” (1) ์ปดํŒŒ์ผ (2) ์‹คํ–‰

    Compiler๋Š” javac.exe์— ํ•ด๋‹น, Java VM์€ java.exe์— ํ•ด๋‹น
    javac๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ , java๋Š” ํŒจํ‚ค์ง€์— ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• 

    1. ์†Œ์Šค์ฝ”๋“œ(MyProgram.java)๋ฅผ ์ž‘์„ฑ
    2. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ(javac)๋Š” ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํŒŒ์ผ=ํด๋ž˜์Šค ํŒŒ์ผ(MyProgram.class)์„ ์ƒ์„ฑ, ์ปดํŒŒ์ผ ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์€ Java VM(Java Virtual Machine)์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ => ์ปดํŒŒ์ผ
    3. Java VM(JVM)์€ ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž๋ฐ” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ํ†ตํ•ด ํ•ด์„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. => ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๊ณผ์ •
    4. MyProgram ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ปดํ“จํ„ฐ์— ๋ฐ˜์˜

    exeํŒŒ์ผ์ด ์•„๋‹Œ classํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ ํ›„ ์‹คํ–‰
     

    JIT์ปดํŒŒ์ผ๋Ÿฌ

    Just In Time ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์•ฝ์ž์ด๋ฉฐ, ๊ธฐ์กด JVM์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ๊ณผ์ •๊ณผ ๊ทธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ธํ„ฐํ”„๋ฆฌํ„ฐํ•˜๋Š” 2๊ฐ€์ง€์˜ ๊ณผ์ •์„ ๋ชจ๋‘ ๊ฑฐ์ณ์•ผ ํ•˜๊ณ  ํŠนํžˆ๋‚˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์€ ๋Ÿฐํƒ€์ž„ ์‹œ ์ฝ”๋“œ๋ฅผ ํ•œ์ค„์”ฉ ์ฝ์–ด๋“ค์—ฌ ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ฆผ
    -> JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋„์ž…

    (1) ์ปดํŒŒ์ผ ๋ฐฉ์‹ : ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ปดํ“จํ„ฐ๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” native machine (๊ธฐ๊ณ„)์–ด๋กœ ๋ณ€ํ™˜

    (2) ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹ : ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋นŒ๋“œ์‹œ์— ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋‹ค๊ฐ€, ๋Ÿฐํƒ€์ž„์‹œ์— ํ•œ์ค„ ํ•œ์ค„ ์ฝ์–ด๊ฐ€๋ฉฐ ๋ณ€ํ™˜

    ์ž๋ฐ”๊ฐ€ ์ปดํŒŒ์ผ, ์ธํ„ฐ ํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์„ ๋ชจ๋‘ ๊ฑฐ์น˜๋Š” ์ด์œ 

    WORA(Write once, run anywhere)์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : ์ž๋ฐ”๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๋จธ์‹ ๊ณผ ๋ณ„๊ฐœ์˜ ๊ฐ€์ƒ ๋จธ์‹ (JVM)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ํ•˜๋“œ์›จ์–ด์— JVM์„ ๋™์ž‘์‹œํ‚ด์œผ๋กœ์จ ์ž๋ฐ” ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ•˜๋“œ์›จ์–ด์—์„œ ๋™์ž‘๋˜๊ฒŒ ํ•œ ๊ฒƒ์ด๋‹ค. Java ์†Œ์Šค์ฝ”๋“œ(.java)๋Š” CPU๊ฐ€ ์ธ์‹์„ ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Java๋Š” JVM์ด๋ผ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ๊ฑฐ์ณ์„œ OS์— ๋„๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— OS๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ JVM์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ .java ํŒŒ์ผ์„ .class ํŒŒ์ผ์ธ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    • ์ž๋ฐ” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : JVM์ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒฝ์šฐ ๊ธฐ๊ณ„, ๋ฌผ๋ฆฌ์ ์ธ ๋จธ์‹ ์— ์ข…์†๋˜๋ฏ€๋กœ ์ž๋ฐ”๋Š” ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ƒ์„ฑ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค. ์ดˆ๊ธฐ ์‹คํ–‰์†๋„์™€ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์žฅ์ ์ด ์žˆ๋‹ค(ํ•œ์ค„์”ฉ ์ฝ์Œ).

    JIT ์ปดํŒŒ์ผ๋Ÿฌ ๋™์ž‘ ๋ฐฉ์‹

    JVM์€ ๊ฐ€์žฅ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ผ๋ถ€, ํŠนํžˆ ๋ฐ˜๋ณต๋ฌธ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ-> ๋ถˆํ•„์š”ํ•œ ๋ฒˆ์—ญ๊ณผ์ •์„ ์ƒ๋žตํ•˜์—ฌ ์‹คํ–‰์†๋„ ํ–ฅ์ƒ

     

    JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‹คํ–‰ ์‹œ์ ์—์„œ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ ๊ฐ™์ด ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ผ๋ฉด ์ปดํŒŒ์ผํ•˜๊ณ  ๊ทธ ์ฝ”๋“œ๋ฅผ ์บ์‹ฑ(์ €์žฅ)ํ•œ๋‹ค. JIT ์ปดํŒŒ์ผ์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ผ์–ด๋‚˜๋ฉฐ(Just-In-Time), ์ „์ฒด ์ฝ”๋“œ์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด๋ฏธ ํ•œ ๋ฒˆ ์ฝ์–ด์„œ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋Š” ์บ์‹œ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋Š”๋‹ค.

    JIT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•˜๋Š” ์กฐ๊ฑด์€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋๋Š”๊ฐ€ ์ด๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ํšŸ์ˆ˜, ๋ฉ”์„œ๋“œ์˜ ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜์˜ค๊ธฐ๊นŒ์ง€ ๋ˆ ํšŸ์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.
    JIT ์ปดํŒŒ์ผ ๊ณผ์ •์€ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ , JVM ์Šค๋ ˆ๋“œ๋Š” JIT ์ปดํŒŒ์ผ ์Šค๋ ˆ๋“œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์— ์˜ํ–ฅ์„ ์ฃผ์ง€x
    ์ปดํŒŒ์ผ์ด ์ง„ํ–‰์ค‘์ผ ๋•Œ์—๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋˜๋ฉด ์ปดํŒŒ์ผ ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉ
    => on-stack replacement(OSR)

    ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ๋ฏธ๋ฆฌ ํ•ด์ฃผ๊ณ (์ปดํŒŒ์ผ ๊ณผ์ •์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋จ) ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ธฐ๊ณ„์–ด ๋ฒˆ์—ญ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•œ๋‹ค.

    JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” C1 (ํด๋ผ์ด์–ธํŠธ ์ปดํŒŒ์ผ๋Ÿฌ), C2(์„œ๋ฒ„ ์ปดํŒŒ์ผ๋Ÿฌ)๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ C1์€ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜์ง€๋งŒ ๋œ ์ตœ์ ํ™” ๋œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, C2๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ข€ ๋” ๊ฑธ๋ฆฌ์ง€๋งŒ ๋” ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํžŒ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ JVM์€ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค.
    C2๋Š” C++๊ณผ ๊ฒฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์†๋„์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋Š”๋ฐ, ์ด๋ฅผ GraalVM์ด๋ผ๊ณ  ํ•œ๋‹ค.

    JVM ๊ตฌ์„ฑ์š”์†Œ์™€ ์—ญํ• 

    • ํด๋ž˜์Šค ๋กœ๋”(Class Loader)
    • ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area)
    • ์‹คํ–‰ ์—”์ง„(Execution Engine)
    • JNI - ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค (Native Method Interface)
    • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์†Œ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Native Method Library)
    • ํด๋ž˜์Šค๋กœ๋”

    ์ฐธ๊ณ 
    https://wikidocs.net/book/31

    https://catch-me-java.tistory.com/11

    ๋Œ“๊ธ€