Java๋ OS์ ์ข ์์ ์ด์ง ์๋ค!!
์๋ฐ์ ํน์ง ์ค ์ ๋ช ํ ๋ง์ด ํ๋ ์๋ค.
"Write once, run anywhere." (ํ ๋ฒ ์์ฑํ๋ฉด ์ด๋์๋ ์คํ๋๋ค.)
์ฐ๋ฆฌ๋ Window, Mac, Linux ๋ฑ ๋ชจ๋ ํ๊ฒฝ์์ ์๋ฐ ์ฝ๋๋ก ์์ฑ๋ ํ์ผ์ ์คํํ ์ ์๋ค.
๐ค๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊น?
์ผ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ OS๋ง ๊ฑฐ์น๊ณ ํ๋์จ์ด๋ก ์ ๋ฌ๋๋ฏ๋ก OS์ ์ข ์์ ์ด๋ค.
=> ์ฆ, ๋ค๋ฅธ OS์์ ์คํ์ํค๊ธฐ ์ํด์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ OS์ ๋ง๊ฒ ๋ณ๊ฒฝํด์ผ ํ๋ค.
ํ์ง๋ง Java ์ ํ๋ฆฌ์ผ์ด์ ์ JVM ํ๊ณ ๋ง ์ํธ์์ฉ์ ํ๊ธฐ ๋๋ฌธ์ OS์ ํ๋์จ์ด์ ๋ ๋ฆฝ์ ์ด๋ค.
=> ๋ค๋ฅธ OS์์๋ ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝ ์์ด ์คํ ๊ฐ๋ฅ!
๐ค๊ทธ๋ ๋ค๋ฉด JVM์ด OS์ ์ข ์์ ์ด์ง ์๋?
๋ง๋ค.
JVM์ OS์ ์ข ์์ ์ด๊ธฐ ๋๋ฌธ์ ํด๋น OS์์ ์คํ ๊ฐ๋ฅํ JVM์ด ํ์ํ๋ค.
โ ์ ๋ฆฌ
๊ฐ ์ข ๋ฅ์ ์ปดํจํฐ๋ง๋ค JVM์ด๋ผ๋ ์ ๋ด ํต์ญ์ผํฐ๊ฐ ์๋ค.
์ฐ๋ฆฌ๊ฐ Java๋ก ์์ฑํ ์ฝ๋๊ฐ JVM์ ๊ฑฐ์ณ์ ์ปดํจํฐ๊ฐ ์์๋ค์ ์ ์๊ฒ ํต์ญ๋์ด ์คํ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
โญ JVM์ด๋?
Java Virtual Machine์ ์ค์๋ง
์ฆ, ์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๊ธฐ๊ณ(์ปดํจํฐ)๋ฅผ ์๋ฏธํ๋ค.
๊ธฐ๊ณ์ด, BinaryCode(์ด์ง์ฝ๋), Bytecode(๋ฐ์ดํธ์ฝ๋)
โญ ๊ธฐ๊ณ์ด
CPU๊ฐ ์ง์ ํด๋ ํ๊ณ ์คํํ ์ ์๋ ๋นํธ ๋จ์๋ก ์ฐ์ธ ์ปดํจํฐ ์ธ์ด
- 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ด๋๋ฆฌ ์ฝ๋
- ๊ธฐ๊ณ์ด๊ฐ ์ด์ง์ฝ๋๋ก ์ด๋ฃจ์ด์ก์ ๋ฟ ๋ชจ๋ ์ด์ง์ฝ๋๊ฐ ๊ธฐ๊ณ์ด์ธ ๊ฒ์ ์๋๋ค.
- ๊ธฐ๊ณ์ด๋ ํน์ ํ ์ธ์ด๊ฐ ์๋๋ค. (CPU ์ ์กฐ์ฌ์์ CPU๋ฅผ ๋ง๋ค ๋ ํด๋น CPU์์ ์ฌ์ฉํ๋ ๋ช ๋ น์ด ์งํฉ์ ๊ณต๊ฐํ๋๋ฐ, ์ด๊ฒ์ '๊ธฐ๊ณ์ด'๋ผ๊ณ ํ๋ค.)
โญ BinaryCode(์ด์ง์ฝ๋)
์ปดํจํฐ๊ฐ ์ธ์ํ ์ ์๋ 0๊ณผ 1๋ก ๊ตฌ์ฑ๋ ์ด์ง์ฝ๋
โญ ByteCode(๋ฐ์ดํธ์ฝ๋)
๊ฐ์ ์ปดํจํฐ(VM)์์ ๋์๊ฐ๋ ์คํ ํ๋ก๊ทธ๋จ์ ์ํ ์ด์ง ํํ๋ฒ
- JVM์ด ์ดํดํ ์ ์๋ ์ธ์ด๋ก ๋ณํ๋ ์๋ฐ ์์ค์ฝ๋๋ฅผ ์๋ฏธ
- ์๋ฐ ์ปดํ์ผ๋ฌ์ ์ํด ๋ณํ๋๋ ์ฝ๋์ ๋ช ๋ น์ด ํฌ๊ธฐ๊ฐ 1๋ฐ์ดํธ๋ผ์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
- ํ์ฅ์: <.class>
- ์๋ฐ ๊ฐ์ ๋จธ์ (JVM)์ด ์ค์น๋์ด ์์ผ๋ฉด, ์ด๋ค ์ด์์ฒด์ ์์๋ผ๋ ์คํ๋ ์ ์๋ค.
- JIT(Just In Time) ์ปดํ์ผ๋ฌ์ ์ํด ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ณํ๋๋ค.
์ฆ, CPU๊ฐ ์ดํดํ๋ ์ธ์ด๋ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ์ด๋ฃจ์ด์ง ๊ธฐ๊ณ์ด, ๊ฐ์ ๋จธ์ ์ด ์ดํดํ๋ ์ฝ๋๋ ๋ฐ์ดํธ ์ฝ๋์ด๋ค.
JIT ์ปดํ์ผ๋ฌ
JIT ์ปดํ์ผ(just-in-time compilation) ๋๋ ๋์ ๋ฒ์ญ(dynamic translation)์ ํ๋ก๊ทธ๋จ์ ์ค์ ์คํํ๋ ์์ ์ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ์ปดํ์ผ ๊ธฐ๋ฒ์ด๋ค.
โญ ์ธํฐํ๋ฆฌํฐ(Interpreter)
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์์ค ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํํ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ ๋๋ ํ๊ฒฝ
์คํ ์ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฝ์ด๊ฐ๋ฉด์ ํด๋น ๊ธฐ๋ฅ์ ๋์ํ๋ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ์คํํ๋ค.
โญ์ปดํ์ผ๋ฌ(Compiler)
ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฐ์ฌ ์๋ ๋ฌธ์๋ฅผ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฎ๊ธฐ๋ ์ธ์ด ๋ฒ์ญ ํ๋ก๊ทธ๋จ
ํ๋ก๊ทธ๋จ ์ ์ฒด๋ฅผ ์ค์บํ์ฌ ์ด๋ฅผ ๋ชจ๋ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ค.
JIT์ปดํ์ผ๋ฌ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋์๋ค.
์คํ ์์ ์์ ์ธํฐํ๋ฆฌํธ ๋ฐฉ์์ผ๋ก ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ๊ทธ ์ฝ๋๋ฅผ ์บ์ฑํ์ฌ, ๊ฐ์ ํจ์๊ฐ ์ฌ๋ฌ ๋ฒ ๋ถ๋ฆด ๋ ๋งค๋ฒ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฐ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ ๋ค์, ์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ์์ ์์ ์๋ฐ ๊ฐ์ ๋จธ์ ์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ JIT ์ปดํ์ผ์ ํตํด ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ค.
Java์ ์ปดํ์ผ ๊ณผ์
1. Java -> JVM
Java ์์ค์ฝ๋, ์ฆ ์์์ฝ๋(*.java)๋ CPU(์ค์ ์ฒ๋ฆฌ ์ฅ์น)๊ฐ ์ธ์ํ์ง ๋ชปํ๋ฏ๋ก ์ต์ข ์ ์ผ๋ก ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ์ ํด์ค์ผ ํ๋ค.
์์์ ๋ณธ ๊ฒ์ฒ๋ผ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ก OS๋ก ๊ฐ๋ ๊ฒ์ด ์๋๋ผ JVM์ ๊ฑฐ์ณ์ ๋๋ฌํ๊ธฐ ๋๋ฌธ์ ๋จผ์ JVM์ด ์ธ์ํ ์ ์๋ Java bytecode(*.class)๋ก ๋ณํ๋๋ค.
โ ์ ๋ฆฌ
Java compiler๊ฐ .javaํ์ผ์ JVM์ด ์ดํดํ ์ ์๋ .classํ์์ java bytecode๋ก ๋ณํํ๋ค.
โญ Java compiler๋?
์ปดํ์ผ(Compile): ์ฌ๋์ด ์ดํดํ๋ ์ธ์ด(์์์ฝ๋)๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ธ์ด(๋ชฉ์ ์ฝ๋)๋ก ๋ฐ๊พธ์ด ์ฃผ๋ ๊ณผ์ .
์์์ ์ ๋ฆฌํ ๊ฒ๊ณผ ๊ฐ์ด Java์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ฐ๊ฟ์ฃผ๋ ๋์์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฐ๋ฆฌ๊ฐ ํํ javac์ด๋ผ๊ณ ์ฐ๋ ๊ฒ์ด java compiler์ด๋ค.
2. JVM -> OS
bytecode๋ฅผ ์คํํ ์ปดํจํฐ์ ๊น๋ฆฐ JVM์ด ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ์ด์ค๋ค.
Java ์ปดํ์ผํด๋ณด๊ธฐ
Java Compiler๋ JDK๋ฅผ ์ค์นํ๋ฉด javac.exe๋ผ๋ ์คํ ํ์ผ ํํ๋ก ์ค์น๋๋ค. (JDK๋ ์๋์ ๋ฐ๋ก ์ค๋ช ํ๊ฒ ๋ค.)
์ ํํ๊ฒ๋ JDK์ binํด๋์ javac.exe๋ก ์กด์ฌํ๋ค.
1. "Hello World"๋ฅผ ์ถ๋ ฅํ๋ .javaํ์ผ ์์ฑ (HelloWorld.java)
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
2. javac ๋ช ๋ น์ด๋ก .java -> .classํ์ผ ๋ณํํ๊ธฐ (.java ํ์ผ์ ์์ฑํ ๊ฒฝ๋ก์ ๊ฐ์ ์คํ)
javac HelloWorld.java
์ด๋ ๊ฒ HelloWorld.classํ์ผ์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Java ์คํํ๊ธฐ
java <.class ํ์ผ ์ด๋ฆ>
java HelloWorld
"HelloWorld"๊ฐ ์ถ๋ ฅ๋๋ฉด์ HelloWorld.classํ์ผ์ด ์คํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ java.exe์ javac.exe์ ์ฐจ์ด
javac.exe๋ ์์์ ๋งํ๋ java compiler๋ก ์ฐ๋ฆฌ๊ฐ ์์ฑํ java ์์ค๋ฅผ bytecodeํ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์์ ์ ํ๋ค.
java.exe๋ bytecode๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ๊ธฐ ์ํด JVM์ ์คํ์ํค๋ ์์ ์ ํ๋ค.
JDK, JRE, SDK
๐ JDK
Java Development Kit (์๋ฐ ๊ฐ๋ฐ ํคํธ)
Java๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ Java์ฉ SDK (Software Development Kit)์ด๋ค.
JDK๋ JRE ๋ฟ๋ง ์๋๋ผ javac, java์ javadoc ๊ฐ์ ์๋ฐ ๊ฐ๋ฐ ํด์ ํฌํจํ๋ค.
=> ํ๋ก๊ทธ๋จ์ ์์ฑ, ์คํ, ์ปดํ์ผํ ์ ์๋ค.
๐ JRE
Java Runtime Environment (์๋ฐ ๋ฐํ์ ํ๊ฒฝ)
JVM๊ณผ ์๋ฐ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Java Class Library) ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ปดํ์ผ๋ Java ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ฐ ํ์ํ ํจํค์ง์ด๋ค.
๐ SDK
Software Development Kit (์ํํธ์จ์ด ๊ฐ๋ฐ ํคํธ)
์ผ๋ฐ์ ์ผ๋ก ์ํํธ์จ์ด ๊ธฐ์ ์๊ฐ ์ฌ์ฉํ์ฌ ํน์ ํ ์ํํธ์จ์ด ๊พธ๋ฌ๋ฏธ, ์ํํธ์จ์ด ํ๋ ์์ํฌ, ํ๋์จ์ด ํ๋ซํผ, ์ปดํจํฐ ์์คํ , ๊ฒ์๊ธฐ, ์ด์ ์ฒด์ ๋ฑ์ ์ํ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฑ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ฐ ๋๊ตฌ์ ์งํฉ์ด๋ค.
ํด๋น ๋ด์ฉ๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ์ด ์๋ JVM์ ๋ํด์๋ ์ข ๋ ์์ธํ ๋ค์ ๊ธ์์ ๋ค๋ฃฐ ์์ ์ ๋๋ค๐ฃ
Reference
[JAVA] JVM์ด๋? ๊ฐ๋ ๋ฐ ๊ตฌ์กฐ (JDK, JRE, JIT, ๊ฐ๋น์ง ์ฝ๋ ํฐ...)
'๐กCS > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] equals()์ hashCode()(+ ๋์ผ์ฑ, ๋๋ฑ์ฑ) (0) | 2023.06.09 |
---|---|
[Java] Call by value vs Call by reference (0) | 2023.06.08 |
์์ ํ์ (Primitive), ์ฐธ์กฐ ํ์ (Reference) (0) | 2023.06.07 |
์ ๊ทผ ์ ์ด์(private, default, protected, public) (0) | 2023.06.07 |
ํด๋์ค, ๊ฐ์ฒด, ์ธ์คํด์ค๋? (0) | 2023.06.07 |
๋๊ธ