์๋ฐ๋ฅผ ๊ณต๋ถํ๋ ค๊ณ 'ํผ์ ๊ณต๋ถํ๋ ์๋ฐ'๋ผ๋ ์ฑ ์ ์ฌ์ ์ฝ์ด๋ดค์๋๋ฐ, ๊ธฐ์ด ์ฑ ์ด๋ค๋ณด๋ ์๊ฒ ๋ฐฐ์ฐ๊ณ ๋๋ ๊ฒ ๊ฐ์ ์ข ๋ ์์ธํ๊ฒ(JVM ์๋ ์๋ฆฌ๋ผ๋์ง)์๊ณ ์ถ์ ๋ง์์ด ์์๋ค.
์ด์ ํฌ์คํ ์ JVM ์๋ ๋ฐฉ์์ ๋ฐ๋ก ์ฐพ์์ ์ ๋ฆฌํ ๊ฒ ์ฒ๋ผ ์ฃผ๋ก ๊ถ๊ธํ ๊ฒ ์๊ธฐ๋ฉด ๊ทธ๋ ์ฐพ์๋ณด๋ ์์ด์๋๋ฐ, ์ฐ์ฐํ ๊ด์ฐฎ์ ์ ํ๋ธ ์คํฐ๋๋ฅผ ๋ฐ๊ฒฌํด์ ์ญ ํด๋ณด๋ ค๊ณ ํ๋ค.
๋ชฉํ
์๋ฐ ์์ค ํ์ผ(.java)์ JVM์ผ๋ก ์คํํ๋ ๊ณผ์ ์ดํดํ๊ธฐ.
ํ์ตํ ๊ฒ
- JVM์ด๋ ๋ฌด์์ธ๊ฐ
- ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ
- ์คํํ๋ ๋ฐฉ๋ฒ
- ๋ฐ์ดํธ์ฝ๋๋ ๋ฌด์์ธ๊ฐ
- JIT ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ๋์ํ๋์ง
- JVM ๊ตฌ์ฑ ์์
- JDK์ JRE์ ์ฐจ์ด
JVM์ด๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ. JVM์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ ๋, Java๋ฅผ Java bytecode(.class
ํ์ผ)๋ก ์ปดํ์ผ(๋ช
๋ น์ด๋ javac
) ํ ํ ์คํํ๋ฉฐ, ์ปดํ์ผ๋ ๋ฐ์ดํธ์ฝ๋๋ java <arguments> <program name>
๋ช
๋ น์ด๋ก ์คํํ๋ค.
JVM์ ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ด์ฉํด ๋ฐํ์์ instruction(= machine code)์ผ๋ก ํด์ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉฐ JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ฉํด์ ์ธํฐํ๋ฆฌํฐ ๋์ ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ๋ฒ์ machine code๋ก ๋ณํํด์ ์ต์ ํํ๊ธฐ๋ ํ๋ค.
JVM์ ์ค๊ณ ๋ชฉํ์ด์ ํน์ง
- ์ดํ๋ฆฌ์ผ์ด์
์ฝ๋๊ฐ ๋์๊ฐ ์ ์๋ ์ปจํ
์ด๋ ์ญํ
- jvm + bytecode interpreter
- C/C++๊ณผ๋ ๋ค๋ฅด๊ฒ ์์ ํ(๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฑ) ์คํํ๊ฒฝ ์ ๊ณต
- ์ง์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉฐ, bytecode verification์ ์ ๊ณตํ๋ค.
- ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ.
- ํฌ๋ก์ค ํ๋ซํผ ์คํ ํ๊ฒฝ ์ ๊ณต (Write Once Run Anywhere)
- class ํ์ผ๋ก ๋ณํ๋ ํ์ผ์ ์ด๋ค OS(macOS, windows, linux โฆ)์ด๋ ์คํ๊ฐ๋ฅ
JIT Compiler
๋ฐํ์์ ๋ ์์ฃผ ์คํ๋๋ ๋ถ๋ถ(hot spot)์ ์ฐพ์์ ์ต์ ํํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ. ๋งค๋ฒ bytecode๋ฅผ machine code๋ก ํด์ํ์ง ์๊ณ , ํด์ํด๋ ์ฝ๋๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ฑฐ๋ ์ฝ๋ ์์ฒด๋ฅผ ์ต์ ํํ๋ค.
๋ฐ์ดํธ์ฝ๋
javac
์ปดํ์ผ๋ฌ๊ฐ java๋ฅผ ์ปดํ์ผํด์ ๋ด๋๋ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฌผ. .class
ํ์ผ์ด๋ฉฐ JVM์ด ์ด ํ์ผ์ ๋ฐํ์์ ํด์ํ๋ฉด์ ์คํํ๋ค.
๋ช
๋ น์ด ์ข
๋ฅ๋ฅผ ๋ํ๋ด๋ opcode๊ฐ 1๋ฐ์ดํธ๋ผ ๋ฐ์ดํธ์ฝ๋๋ผ ๋ถ๋ฅธ๋ค. ๋๋ต 200๊ฐ ์ ๋ ์ฌ์ฉ ์ค. Bytecode๋ ํ๋ซํผ(or ๋จธ์ )์ ์ข
์์ ์ด์ง ์์ผ๋ฉฐ ํญ์ ๋์ผํ ํฌ๋งท์ด๋ค. Endian์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ธ๋ฐ, ์ด๋ค ํ๋ซํผ์์ ์์ฑ๋์๋ ๊ฐ์, Big Endian(0x1234์ ๊ฒฝ์ฐ 12 34
๋ก ์ ์ฅํ๋ ์. Little endian์ 34 12
์ด๋ค.)์ ๋ฐ๋ฅธ๋ค.
์ปดํ์ผ/์คํ ํ๋ ๋ฐฉ๋ฒ
์ปดํ์ผ
java ์ปดํ์ผ๋ฌ๋ JDK(Java Development Kit)์ ๋ค์ด์๋ค.
javac
๋ช
๋ น์ด๋ก ์ปดํ์ผํ ์ ์๊ณ , ์ปดํ์ผ ๊ฒฐ๊ณผ๋ .class
ํ์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฐ ๋ฐ์ดํธ์ฝ๋ ํ์ผ์ด๋ค. ์ปดํ์ผํ ์๋ฐ ๋ฒ์ ์ ์ง์ ํ ์๋ ์๋ ๋ฑ ์ฌ๋ฌ ์ต์
์ ์ ๊ณตํ๋ค.
$ javac [-source <์ปดํ์ผํ ์์ค ์ฝ๋์ ์๋ฐ ๋ฒ์ >] [-target <์ปดํ์ผ๋ ์ฝ๋์ ์๋ฐ ์ง์ ๋ฒ์ >] ...
์ปดํ์ผ๋ ๋ฐ์ดํธ์ฝ๋๋ javap -c <๋ฐ์ดํธ์ฝ๋ ํ์ผ๊ฒฝ๋ก>
๋ช
๋ น์ด๋ก ํ์ธํด๋ณผ ์ ์๋ค.
์คํ
java
๋ช
๋ น์ด๋ก ์ปดํ์ผ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค.
JDK(Java Development Kit) vs JRE(Java Runtime Environment)
JRE๋ ๋ง๊ทธ๋๋ก ์คํํ๊ธฐ ์ํด ํ์ํ ๊ฒ๋ค๋ง ๋ถ๋ฆฌํด๋ ๊ฒ์ด๋ผ JRE๊ฐ JDK์์ ์ํด์๋ค. JDK์๋ JRE๋ฟ๋ง ์๋๋ผ ์ปดํ์ผ๋ฌ, ๋๋ฒ๊ฑฐ ๋ฑ ๊ฐ๋ฐ์ ํ์ํ ๋๊ตฌ๋ค์ด ํฌํจ๋์ด์๋ค. Java 9 ๋ฒ์ ๋ถํฐ๋ JRE๋ฅผ ๋ฐ๋ก ์ ๊ณตํ์ง๋ ์๋๋ค๊ณ ํ๋ค