Java Virtual Machine
Last updated
Last updated
"Java๊ฐ ๋ญ์ผ?"๋ผ๋ ์ง๋ฌธ์ ๋ฐ์์ ๋, ๊ฐ๋จํ "ํ๋ก๊ทธ๋๋ฐ ์ธ์ด"๋ผ๊ณ ๋๋ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ํ์ง๋ง Java๋ ๋จ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ ์ํ๊ธฐ์๋ ๋๋ฌด๋ ํฐ ๊ฐ๋ ์ ๋๋ค. Java๋ 'Write Once, Run Everywhere'๋ผ๋ ์ฒ ํ์ผ๋ก ์์๋์ด ๋ฐ์ ํ ๊ฐ๋ ์ ๋๋ค. ์ด ์ฒ ํ์ ์คํํ๊ธฐ ์ํด Java๋ ๋ค ๊ฐ์ง ์ํธ ์ฐ๊ด๋ ๊ธฐ์ ์ ์ฎ์ด๋์์ต๋๋ค:
The Java Programming Language
The Java Class File Format
The Java Application Programming Interface (Java API)
The Java Virtual Machine (JVM)
์ด ๋ค ๊ฐ์ง ๊ธฐ์ ์ ์ดํด๋ณด๊ธฐ ์ ์, Java๋ก ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ์ํํ๋ ๊ณผ์ ์ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. Eclipse๋ NetBeans ๊ฐ์ IDE ํ๊ฒฝ์ด๋ ๋ฉ๋ชจ์ฅ ๊ฐ์ ํ
์คํธ ์๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ Java ์์ค ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, .java
ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
์ด Java ์์ค ํ์ผ์ ๋จ์ํ ์ฝ๋๋ง์ ๋ด๊ณ ์๋ ํ์ผ์ผ ๋ฟ, ์์ฒด๋ก๋ ์คํ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฅผ ๊ฐ๋ฐ์์ ์๋๋๋ก ์คํํ๊ธฐ ์ํด์๋ ์ปดํ์ผ์ ํตํด .class
ํ์ผ์ ํํ๋ก ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด ์์
์ '์ปดํ์ผ(Compile)'์ด๋ผ๊ณ ํฉ๋๋ค. Java์์๋ ๋ณดํต JDK์ ๋ด์ฅ๋์ด ์๋ 'javac' ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ฉํ์ฌ ์ํํฉ๋๋ค. ์ด ์์
์ ๊ฑฐ์น๋ฉด ์์ค ํ์ผ๊ณผ ๊ฐ์ ์ด๋ฆ์ด์ง๋ง .class
ํ์ฅ์๋ฅผ ๊ฐ์ง ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
์ด .class
ํ์ผ์ ์คํ ๊ฐ๋ฅํ ํํ์ ํ์ผ์
๋๋ค. ๊ทธ๋ฌ๋, ์คํํ ์ ์๋ ํํ๋ผ๋ ๊ฒ์ ๋จ์ง ์คํ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด์ง, exe ํ์ผ์ฒ๋ผ ๋๋ธํด๋ฆญ์ ํ๊ฑฐ๋ ํ๋กฌํํธ ์์์ ํ์ผ ์ด๋ฆ์ ์ฃผ๊ณ ์ํฐ๋ฅผ ์น๋ค๊ณ ํด์ ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ ์๋๋๋ค. ์ด ํ์ผ์ ๊ฐ๋ฐ์์ ์๋๋๋ก ์คํํ๊ธฐ ์ํด์๋ ์ต์ํ JRE(Java Runtime Environment)๊ฐ ํ์ํฉ๋๋ค. ๋ฌผ๋ก JDK์์๋ ๊ฐ๋ฅํฉ๋๋ค. JDK์๋ JRE๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด์๋ 'java'๋ผ๋ ํ๋ก๊ทธ๋จ์ ํธ์ถํ์ฌ ์ฐ๋ฆฌ๊ฐ ์์ฑํ .class
ํ์ผ์ ์ธ์๋ก ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค. ์ด๋ 'java' ํ๋ก๊ทธ๋จ์ Java ์คํ ํ๊ฒฝ์ .class
ํ์ผ์ ๋ก๋ฉํ๊ณ , Java Virtual Machine(JVM)์ ํ๋์ ํ๋ก์ธ์ค๋ก ์ฌ๋ฆฌ๋ ์์
์ ํจ๊ป ์ํํฉ๋๋ค. ๊ทธ ์ดํ ํด๋์ค ํ์ผ์ ๋ถ์ํ์ฌ JRE ๋ด์ Java Application Programming Interface(Java API)์ ํจ๊ป ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ก ํ๋ ๊ฒ์
๋๋ค.
์์ ๊ณผ์ ์ค์์ .java
๋ผ๋ ํ์ฅ์๋ฅผ ๊ฐ์ง ์์ค ํ์ผ๋ก .class
ํ์ผ์ ์์ฑํ๋ ์์ ์ '์ปดํ์ผ ํ์(Compile Time)'์ด๋ผ๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ์ ๊ฑฐ์ณ ์์ฑ๋ .class
ํ์ผ์ ์คํํ๋ ์์ ์ '๋ฐํ์(Run Time)'์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ ๊ทธ๋ฆผ์ Java ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ์ํ๋๋์ง๋ฅผ ๋์ํํ ๊ฒ์
๋๋ค.
์ด ๊ทธ๋ฆผ์ ์์ธํ ์ดํด๋ณด๋ฉด ์์์ ์ธ๊ธํ Java๋ฅผ ๊ตฌ์ฑํ๋ ๋ค ๊ฐ์ง ๊ธฐ์ ๋ค์ด ๋ชจ๋ ํฌํจ๋์ด ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฒ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ์ฌ์ฉํ ๊ฒ์ Java Programming Language์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฑํ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ๋ฉด Java Class File Format์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด๋ฅผ ์คํํ๊ธฐ ์ํด์๋ Java Virtual Machine์ ๊ตฌ๋์์ผ ํด๋์ค ํ์ผ์ ๋ก๋ฉํฉ๋๋ค.
JVM์ผ๋ก ๋ก๋ฉ๋ ํ๋ก๊ทธ๋จ์ ๋จ๋ ์ผ๋ก ์ํํ๋ ๊ฒ์ด ์๋๋ผ Java Application Programming Interface์ ๋์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ๋น๋ก์ ์คํ๋๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ค ๊ฐ์ง ๊ธฐ์ ์ ๊ฐ๊ฐ ์ด๋ค ๊ฒ์ด๋ฉฐ ์ด๋ค์ด ์ด๋ป๊ฒ Java์ ์ฒ ํ์ ์คํํ๊ณ ์๋์ง ์์ธํ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
The Java Programming Language
Java ์ธ์ด๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, ์์ฐ์ฑ๊ณผ ๋์ ์ธ ๋ฉด์์ ํฐ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Java๋ ๋น๊ต์ ์ต์ ์ ์ํํธ์จ์ด ๊ธฐ์ ์ด ์ ์ฉ๋ ์ธ์ด๋ก, ๊ฐ์ฒด์งํฅ ์ธ์๋ ๋ฉํฐ์ค๋ ๋ฉ, ๊ตฌ์กฐํ๋ ์๋ฌ ํธ๋ค๋ง, ๊ฐ๋น์ง ์ปฌ๋ ์ , ๋์ ๋งํฌ ๋ฐ ๋์ ํ์ฅ ๋ฑ์ ๊ธฐ์ ๋ค์ด ์ ๋ชฉ๋์ด ์์ต๋๋ค.
ํนํ, Java์ Class ํ์ผ์ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํ๋ ๊ฒ์ด ์๋๋ผ, JVM์ด ์ฝ์ ์ ์๋ ํํ๋ก ๋ฒ์ญ๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค. ์ด๋ JVM ์์์ ๋ค์ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํ๋ฉ๋๋ค. ์คํ์ ์ํ ๋งํฌ ์์ ์ ๊ทธ๋ ์ผ์ด๋๊ฒ ๋ฉ๋๋ค. Class ํ์ผ์ ์คํ ์ ๋งํฌ๋ฅผ ํ ์ ์๋๋ก Symbolic Reference๋ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด Symbolic Reference๋ ๋ฐํ์ ์์ ์์ ๋ฉ๋ชจ๋ฆฌ์์์ ์ค์ ๋ก ์กด์ฌํ๋ ๋ฌผ๋ฆฌ์ ์ธ ์ฃผ์๋ก ๋์ฒด๋๋ ์์ ์ธ ๋งํฌ๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ '๋์ ๋งํฌ(Dynamic Linking)'๋ผ๊ณ ํฉ๋๋ค.
์ด Dynamic Linking ๊ธฐ์ ๋๋ถ์ Class ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ์ ์งํ ์ ์์ต๋๋ค. Java์ ์ฒ ํ์ ๊ตฌํํ๋ ์๋ฏธ๋ก ํ์ฅ๋ฉ๋๋ค. Java๋ ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ ํ์ผ๋ง ์์ผ๋ฉด ๊ทธ๋๋ก ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ํ ๋คํธ์ํฌ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ ์กํ๊ณ ๋ฐฐํฌํ๋ ๋ฐ ์์ด์ ํ์ผ์ ํฌ๊ธฐ๋ ์์์๋ก ์ ๋ฆฌํฉ๋๋ค.
The Java Class File Format
Java๋ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด Class ํ์ผ๋ก ์ฌ์์ฑํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด๋ ๊ฒ ์์ฑ๋ Class ํ์ผ์ ๋ค์์ ๋ค ๊ฐ์ง ํน์ง์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
Compactํ ํํ
Bytecode๋ก์ ๋ณ๊ฒฝ
ํ๋ซํผ ๋ ๋ฆฝ์
๋คํธ์ํฌ ๋ฐ์ดํธ ์ค๋์ ์ฌ์ฉ
Java์ ์ฒ ํ์ ๊ฐ์ฅ ๋๋๋ฌ์ง๊ฒ ๋๋ณํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด Class File Format์ ๋๋ค. Class ํ์ผ์ Bytecode๋ฅผ Binary ํํ๋ก ๋ด์๋์ ๊ฒ์ ๋๋ค. Bytecode๋ JVM์ด ์ฝ์ ์ ์๋ ์ธ์ด๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ค์ ๋งํด, Java์์ ์ปดํ์ผ์ด๋ผ๊ณ ํ๋ ๊ฒ์ ํ ์คํธ ๊ธฐ๋ฐ์ ์ฌ์ฉ์ ์นํ์ ์ธ Java ์ธ์ด๋ฅผ JVM์ด ์ฝ์ ์ ์๋ ์ธ์ด๋ก ๋ฒ์ญํ ๊ฒ์ ๋๋ค.
JVM์ Class๋ฅผ ๋ก๋ฉํ ํ ์ฌ๊ธฐ์ Bytecode๋ฅผ ์ฝ์ด๋ค์ฌ ์คํ ๊ฐ๋ฅํ๋๋ก ํด์(Interpret)ํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. Class๊ฐ ๋ก๋๋ ํ์๋ JIT(Just-In-Time) Compiler๋ Hotspot Compiler์ ๊ฐ์ Execution Engine์ ๊ฑฐ์ณ ์คํ๋ฉ๋๋ค.
Bytecode๋ Java์ ์ฒ ํ์ ์คํํ๋ ์ค์ํ ์์ ์ค ํ๋์ ๋๋ค. Bytecode๊ฐ JVM์ ์ํ ์ธ์ด๋ผ๋ ์ , ๋ชจ๋ ์ฝ๋๊ฐ Bytecode์ Binary ํํ๋ก ์ค์ฒดํ๋ Class๋ผ๋ ๊ฒ, ์ด๊ฒ์ด ํ๋ซํผ์ ์ ์ฝ์ ๋ฐ์ด๋์ ์ ์๊ฒ ๋์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
The Java Application Interface
Java Application Interface, ์ฆ Java API๋ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์งํฉ์ผ๋ก, Java ํ๋ก๊ทธ๋จ์ด ์ด์์ฒด์ ์ ์์๊ณผ ์ํธ์์ฉํ ์ ์๋๋ก ๋๋ ์ธํฐํ์ด์ค ์ญํ ์ ํฉ๋๋ค. Java API๋ OS ์์คํ ๊ณผ Java ํ๋ก๊ทธ๋จ ์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ๊ฐ๊ต ์ญํ ์ ํฉ๋๋ค. Java API๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํตํด OS ์์๊ณผ ์ฐ๊ณ๋์ด ์์ผ๋ฉฐ, Java ํ๋ก๊ทธ๋จ๊ณผ ๋ง๋ฟ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด Java ํ๋ก๊ทธ๋จ์ ํ๋ซํผ์ ์๊ด์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
The Java Virtual Machine (JVM)
Java์ ๋ค ๊ฐ์ง ๊ตฌ์ฑ ์์ ์ค ๊ฐ์ฅ ํต์ฌ์ ์ธ ๊ฒ์ ๋จ์ฐ Java Virtual Machine(JVM)์ ๋๋ค. JVM์ Java ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๋จธ์ ์ผ๋ก, ๋ฌผ๋ฆฌ์ ์ธ ํํ๊ฐ ์๋ ์ํํธ์จ์ด๋ก ์กด์ฌํ๋ฉฐ, ํ๋์ ๊ฐ๋ ์ผ๋ก ์กด์ฌํฉ๋๋ค. JVM์ ์ ์๋ ์คํ(Specification)์ ๊ตฌํํ ๋ ์์ ์ธ Runtime Instance์ ๋๋ค.
JVM์ ์ญํ ์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ Java ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ Class ํ์ผ์ JVM์ผ๋ก ๋ก๋ฉํ๊ณ Bytecode๋ฅผ ํด์(Interpret)ํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ํ ๋นํ๊ณ ๊ด๋ฆฌํ๋ฉฐ, ์ ๋ณด ์ฒ๋ฆฌ ์์ ์ ํฌ๊ดํฉ๋๋ค. ์ด ๋ JVM์ Thread ๊ด๋ฆฌ ๋ฐ Garbage Collection๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ ์์ ๋ ์ํํฉ๋๋ค.
JVM์ ๊ธฐ๋ณธ์ ์ธ ์ํคํ ์ฒ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
JVM์ ClassLoader System์ ํตํด ํด๋์ค ํ์ผ๋ค์ ๋ก๋ฉํฉ๋๋ค. ๋ก๋ฉ๋ ํด๋์ค ํ์ผ๋ค์ Execution Engine์ ํตํด ํด์๋ฉ๋๋ค. ์ด๋ ๊ฒ ํด์๋ ํ๋ก๊ทธ๋จ์ Runtime Data Areas์ ๋ฐฐ์น๋์ด ์ค์ง์ ์ธ ์ํ์ด ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ฌํ ์คํ ๊ณผ์ ์์์ JVM์ ํ์์ ๋ฐ๋ผ Thread Synchronization๊ณผ Garbage Collection ๊ฐ์ ๊ด๋ฆฌ ์์ ์ ์ํํ๊ฒ ๋ฉ๋๋ค.
์ด ์ฑ ์ ์ ๋ฐ๋ถ๋ JVM์ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ๋ํด ์์๋ณด๋ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ผ๋ก๋ JVM์ ๊ฐ ๋ชจ๋์ ์ค๋ช ํ๋ ์์ผ๋ก ์ ๊ฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.