
๋ค์ด๊ฐ๊ธฐ์ ์์
Java๋ฅผ ๊ตญ๋น๋ฅผ ํตํด ๊ณต๋ถํ๋ฉด์ ํด๋น ์ธ์ด์ ๋ํ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ ํํํ ํ๊ณ ์ถ๋ค๋ ๋ชฉํ๊ฐ ์์๋ค.
ํ๋๋ ์์๋์ง 2020๋ ์ด ๋๋๊ธฐ ์ ์ ๋ฐฑ๊ธฐ์ ๋๊ป์ ์ด์ํ๋ Online Java Study์ ์ฐธ์ฌํ ์ ์๊ฒ ๋์๋ค.๊ทธ๋์ ์ค๋ ๊ธฐ๊ฐ ๊น๋จน๊ณ ์ง๋ด๋ Java ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ ํํํ ํ๊ณ , ์์ง ๋ชปํ๋ ๋ถ๋ถ์ ์ฑ์ฐ๋ ์๊ฐ์ด ๋ ์ ์๋๋ก ๊พธ์คํ ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค.
Java Compile Structure
Java๋ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ก์,
์ด๋ ํ ์ด์์ฒด์ ์์๋ ๋์ผํ๊ฒ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ์ ์๋๋ก ํ๋ ํน์ง์ ๊ฐ์ง๋ค.

- 
Java File Build
- .java → Java Compiler(javac) → .class
- Java Compiler(javac)๊ฐ .java ํ์ฅ์ ํ์ผ์ JVM(Java Virture Machine)์ด ์ดํดํ ์ ์๋ Bytecode๋ก ๋ฒ์ญํ์ฌ ํ์ฅ์๊ฐ .class ํ์ฅ์ ํ์ผ์ ์์ฑํ๋ค.
 
 
 - .java → Java Compiler(javac) → .class
 - 
JVM
- Class Loader
 - Runtime Data Areas
 - Execution Engine
- ๋ฒ์ญ๋ .class ํ์ฅ์ ํ์ผ์ JVM์ ๊ตฌ์ฑ์์ ์ค ํ๋์ธ Class Loader๋ฅผ ํตํด Bytecode๋ฅผ Runtime Data Areas์ ๋ก๋ํ๋ค.
Runtime Data Areas์์ ์ด์์ฒด์  ์์์ ์คํ๋ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น ๋ฐ์ผ๋ฉด Bytecode๋ฅผ Execution Engine์ผ๋ก ์ด๋ํ์ฌ Interpreter ํน์ JIT Compiler๋ฅผ ํตํด ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ค. 
 - ๋ฒ์ญ๋ .class ํ์ฅ์ ํ์ผ์ JVM์ ๊ตฌ์ฑ์์ ์ค ํ๋์ธ Class Loader๋ฅผ ํตํด Bytecode๋ฅผ Runtime Data Areas์ ๋ก๋ํ๋ค.
 
 
Bytecode
Java Compiler๋ฅผ ์ด์ฉํด .java๋ฅผ JVM์ด ์ดํดํ ์ ์๋๋ก ๋ฒ์ญํ ์ฝ๋์ด๋ฉฐ, .class ํ์ฅ์๋ฅผ ๊ฐ์ง๋ค.
๊ฐ๊ฐ์ Bytecode๋ 1byte๋ก ๊ตฌ์ฑ๋์ง๋ง ๋ช ๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ด ์ด ๋ช ๋ฐ์ดํธ๋ก ๊ตฌ์ฑ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๋ํ, Bytecode๋ฅผ ์กฐ์ํด ๋ง์ ๊ฒ๋ค์ ํ์ฉํ  ์ ์๋ค.
- ํ๋ก๊ทธ๋จ ๋ถ์
- ์ฝ๋์์ ๋ฒ๊ทธ ์ฐพ๋ ํด
 - ์ฝ๋ ๋ณต์ก๋ ๊ณ์ฐ
 
 - ํด๋์ค ํ์ผ ์์ฑ
- ํ๋ก์
 - ํน์  API ํธ์ถ ์ ๊ทผ ์ ํ
 - ์ค์นผ๋ผ ๊ฐ์ ์ธ์ด์ ์ปดํ์ผ๋ฌ
 
 - ํ๋กํ์ผ๋ฌ
 - ์ต์ ํ
 
์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋ .java ํ์ผ
package Week_01;
public class Day_01 {
    public static void main(String[] args) {
        System.out.println("Hello Study!");
    }
}
IntelliJ์์ Bytecode ํ์ธํ๊ธฐ
- IntelliJ → Command + A → Show Bytecode
 
// class version 55.0 (55)
// access flags 0x21
public class Week_01/Day_01 {
  // compiled from: Day_01.java
  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this LWeek_01/Day_01; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 5 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "Hello Study!"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 6 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}
javap๋ฅผ ์ด์ฉํด .class ํ์ผ ํ์ธํ๊ธฐ
- Terminal → javap -v -l -p ๊ฒฝ๋ก์ ํ์ผ ์ด๋ฆ.class
 
public class Week_01.Day_01
  minor version: 0
  major version: 55
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #5                          // Week_01/Day_01
  super_class: #6                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #18            // Hello Study!
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // Week_01/Day_01
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               Day_01.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Class              #23            // java/lang/System
  #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #18 = Utf8               Hello Study!
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               Week_01/Day_01
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public Week_01.Day_01();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello Study!
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 5: 0
        line 6: 8
}
JVM
Java Virtual Machine, .class ํ์ผ์ ์ปดํ์ผํด ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ค.

JVM์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ๊ฒ์ด ๋ชฉ์ ์ธ ํ๋ก๊ทธ๋จ์ด๋ค.
์ด์ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋๋ฐ, Java ํ๋ก๊ทธ๋จ์ด ์ด๋ ๊ธฐ๊ธฐ๋ ์ด์์ฒด์  ์์์๋ ์คํ๋  ์ ์๊ฒ ํด์ค๋ค. ๋ํ, ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ  ์ต์ ํํ๋ค.(Garbage Collection)
JVM Components
์ด๋ ๊ฒ JVM์ด OS์ ์ข ์์ ์ด์ง ์์ผ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ธ ๊ฐ์ง์ ๊ตฌ์ฑ์์๊ฐ ํจ๊ป ์ผํ๋ค.
- 
Class Loader
Class Loader๋ Bytecode๋ก ๊ตฌ์ฑ๋ .class ํ์ผ์ Runtime Data Areas์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ๊ธฐ ์ํด ์ฝ์ด ๋ค์ธ๋ค.
 - 
Runtime Data Areas
Runtime Data Areas(๋ฐํ์ ๋ฐ์ดํฐ ์์ญ)์ JVM์ด ์ด์์ฒด์ ์ ์คํ๋๋ฉด์ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. ํด๋น ์์ญ์๋ 6๊ฐ๋ก ๋๋์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ๋๋ค.
- ๊ฐ ์ค๋ ๋๋ง๋ค ํ ๋น ๋ฐ๋ ์์ญ
- PC Register
 - JVM Stack
 - Native Method Stack
 
 - ๋ชจ๋  ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ
- Heap
 - Method Area
 - Runtime Constant Pool
 
 
 - ๊ฐ ์ค๋ ๋๋ง๋ค ํ ๋น ๋ฐ๋ ์์ญ
 - 
Execution Engine
Class Loader๋ฅผ ํตํด JVM ๋ด์ Runtime Data Areas์ ๋ฐฐ์น๋ Bytecode๋ Execution Engine์ ์ํด ์คํ๋๋ฉฐ, Execution Engine์ Bytecode๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํ๋ค.
์ด๋ Interpreter ํ์ ํน์ JIT Compiler๋ฅผ ํตํด ์คํํ๋ฉฐ, Garbage Collection์ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๋ฅผ ์งํํ๋ค. 
- Interpreter
- ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ์ฝ๋๋ฅผ ํ ํ์ฉ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ค.
์คํ ์๋๊ฐ ๋๋ฆฌ์ง๋ง ์ฝ๋ ๋ฒ์ญ์ ์ฆ์ ์คํ์ด ๊ฐ๋ฅํ๋ฉฐ ํ ์คํธ์ ์ฉ์ดํ๋ค. 
 - ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ์ฝ๋๋ฅผ ํ ํ์ฉ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ค.
 - JIT Compiler
- Bytecode๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ๊ฒ์ Interpreter์ ๋น์ทํ์ง๋ง ์บ์ฑ ํด๋์ ๊ฐ์ ํจ์๊ฐ ์ฌ๋ฌ๋ฒ ๋ถ๋ ค๋ ๊ฐ์ ๊ธฐ๊ณ์ด๋ฅผ ์๋กญ๊ฒ ์์ฑํ์ง ์๊ณ ๊ธฐ์กด์ ๊ธฐ๊ณ์ด๋ฅผ ๋ถ๋ฌ์จ๋ค.
 
 - Garbage Collection
- Java์์๋ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ฌ ํด์ฒดํ์ง ์๋๋ฐ, ์ด ๋ Garbage Collection์ด ๋ ์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด๋ฅผ ์ง์ฐ๋ ์ญํ ์ ํ๋ค. ์ด๋, GC๋ Heap ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ง ๋ค๋ฃจ๋ฉฐ Young / Old ์์ญ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ค.
 
 
JIT Compiler
- Bytecode๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ  ๋ JIT Compiler๋ฅผ ์ฌ์ฉํ๋ค.
JVM์ด Interpreter๋ฅผ ์ด์ฉํด Btyecode์์ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ ๋, ๋ฐ๋ณต๋๋ ๋ด์ฉ์ ์ปดํ์ผํด์ ์ฌ์ฉํ๋ค. ์ด๋, ์ต์ด ์คํ ์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ์ด ์์๋๊ธด ํ์ง๋ง ์ต์ด ์คํํ๋ฉด ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ํ, ์ปดํ์ผ ์์ด Interpreter๋ง ํ๋ ๊ฒฝ์ฐ๋ณด๋ค ๋ฐ๋ณต์ ์ธ ์์ ์ ํ ๋ ๋์ ํจ์จ์ ๋ผ ์ ์๋ค. 
Runtime
์ง๊ธ๊น์ง Eclipse๋ IntelliJ๋ก ์์ฝ๊ฒ ์ปดํ์ผํ๋ฉด์ ์ ์ ์๋ฆฌ์ ๋ํด์๋ ์๊ณ ์์๋ค. ์ด๋ฒ ์๊ฐ์ ํตํด ์ง์  ์ปดํ์ผ ํด๋ณด์!
๋๋ ๋ฏธ๋ฆฌ ์์ฑํ .java ํ์ผ์ ์ด์ฉํด ์ปดํ์ผ ํด๋ณผ ๊ณํ์ด๋ค.ํฐ๋ฏธ๋์ ์ด๊ณ , ์ปดํ์ผํ๊ณ ์ ํ๋ .java ํ์ผ์ด ์๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ค.
๊ทธ ์ดํ์ ํด๋น ๊ฒฝ๋ก์ ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธํ๋ค.
 cd ๊ฒฝ๋ก/ํ์ผ์ด๋ฆ.java
 ls

ํ์ผ์ ํ์ธํ๋ค๋ฉด Java Compiler๋ฅผ ์ด์ฉํด .java ํ์ผ์ Bytecode์ .class ํ์ผ๋ก ์ปดํ์ผํ๋ค.
๊ทธ ํ, .class ํ์ผ์ด ์๊ฒผ๋์ง ํ์ธํ๋ค.
 javac ํ์ผ์ด๋ฆ.java
 ls

.class ํ์ผ์ JVM์ผ๋ก ์ปดํ์ผํ๊ธฐ ์ํด์๋ src ํด๋๋ก ์ด๋ํด์ผ ํ๋ค.cd .. ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ์์ ๊ฒฝ๋ก๋ก ์ด๋ํ๊ฒ ๋๋ฉฐ, src ํด๋์์ ํจํค์ง/ํ์ผ ์ด๋ฆ์ ์ด์ฉํด .class ํ์ผ์ ์ปดํ์ผํ๋ค.
 cd ..
 java ํจํค์ง/ํ์ผ์ด๋ฆ

JDK / JRE
Java Development Kit / Java Runtime Enviroment
JDK = JRE + @
JDK
๋ง์น ์ธ์ฅํ๋๋ USB ๋ฑ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ์ฅ์น์๋ ๊ฐ๋ค.
์ฆ, JRE๋ฅผ ํฌํจํ Compiler, Debuger ๋ฑ ๋ค์ํ ๊ฐ๋ฐ๋๊ตฌ๋ฅผ ํฌํจํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
JRE
๋ฌด๋ฃ PDF Reader์ฒ๋ผ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
JVM, Java API, ๊ธฐ๋ณธ ์ ๊ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ Java๋ก ๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ๊ตฌ์ฑ์์๋ฅผ ๋ด๊ณ ์๋ค.
Reference
Java Compile Structure, JVM Components
- Naver D2
 
https://d2.naver.com/helloworld/1230
Runtime
- ๋ฐฑ๊ธฐ์ ๋ ๊ธฐ์ ๋ธ๋ก๊ทธ
 
macOS ํฐ๋ฏธ๋ ์๋ฐ ์ปดํ์ผ ์คํ ๋ฐฉ๋ฒ
ํฐ๋ฏธ๋(Terminal)์์ ์๋ฐ(Java) ์คํํ๊ธฐ! ์ดํด๋ฆฝ์ค(Eclipse), ์ธํ ๋ฆฌJ(IntelliJ)์์ ์์ฑํ ์๋ฐ ์ฝ๋๋ฅผ ํฐ๋ฏธ๋์์ ์คํํ๋ ค๊ณ ํฉ๋๋ค. ์์ฑ๋ ์๋ฐ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์คํ์์ผ์ผ ๋๋๋ฐ ๋ฐฉ๋ฒ์ ์
whitepaek.tistory.com
- ์ปดํ์ผ์์ ์คํ๊น์ง
 
Back to the Essence - Java ์ปดํ์ผ์์ ์คํ๊น์ง - (2)
Back to the Essence - Java ์ปดํ์ผ์์ ์คํ๊น์ง - (2)Java 11 JVM ์คํ์ ๊ธฐ์ค์ผ๋ก Java ์์ค ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์ปดํ์ผ๋๊ณ ์คํ๋๋์ง ์ด์ง ๊น๊ฒ ์์๋ณด์. ์ด๋ฒ์ 2ํ ์คํ ํธ์ด๋ค. 1ํ ์ปดํ์ผ ํธ์ ์ฌ๊ธฐ์..
homoefficio.github.io
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| F004 - Reference Type (0) | 2021.05.08 | 
|---|---|
| F003 - Access Modifier (0) | 2021.05.06 | 
| F002 - Primitive Type (0) | 2021.05.06 | 
| F001 - psvm (0) | 2021.05.06 | 
| TIL_W02 | Variable, Primitive / Reference Type, Literal, Array (0) | 2020.12.15 |