๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’กCS/Java

Java์˜ ๋™์ž‘ ์›๋ฆฌ

by hyeon-z 2023. 6. 7.

 

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, ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ...)

JIT ์ปดํŒŒ์ผ๋Ÿฌ - ์œ„ํ‚ค๋ฐฑ๊ณผ

๋Œ“๊ธ€