ν΄λΉ κΈμ λ€νμ§μ‘΄λμ Back to the Essence - Java μ»΄νμΌμμ μ€νκΉμ§ 1νΈκ³Ό 2νΈμ λ³΄κ³ μ 리ν κΈμ΄λ€.
λ°νμμμ μ€ν μμ μ κ²½μ° λ€νμ§μ‘΄λμ΄ κ΅μ₯ν μΉμ ν μ€λͺ μ ν΄μ£Όμ ¨κΈ° λλ¬Έμ κ·Έκ²μ 보λ κ²μ μΆμ²νλ€.
μ ν΅μ μΈ μ»΄νμΌμ κ²½μ° κΈ°κ³κ° μ΄ν΄νλ κΈ°κ³μ΄λ‘ λ³ννλ κ²μ λ§νλ€.
λνμ μΌλ‘ C μΈμ΄μ κ²½μ° λ€μκ³Ό κ°μ μ»΄νμΌ κ³Όμ μ κ±°μΉκ² λλ€.
[CμΈμ΄] β μ μ²λ¦¬ β μ»΄νμΌ β μ΄μ
λΈλ¦¬ β λ§ν¬ β [κΈ°κ³μ΄]
μ°λ¦¬κ° νλ‘κ·Έλλ°ν C μΈμ΄λ μ£Όμ μ κ±°, include νμΌ μΈλΌμΈν λ±μ μ μ²λ¦¬ κ³Όμ μ κ±°μΉκ³ , μ»΄νμΌ λ¨κ³λ₯Ό κ±°μ³ μ΄μ
λΈλ¦¬μ΄λ‘ λ³κ²½νλ€.
μ΄ν μ΄μ
λΈλ¬κ° μ΄λ₯Ό κΈ°κ³μ΄λ‘ λ³κ²½νκ³ , μ¬μ©ν 곡μ λΌμ΄λΈλ¬λ¦¬ λ±μ ν©μ³(λ§ν¬) μ΅μ’
μ€ν νμΌμ μμ±νλ€.
μ΄λ¬ν μ ν΅μ μΈ μ»΄νμΌλ¬λ κΈ°κ³κ° μ΄ν΄ν μ μλ κΈ°κ³μ΄λ‘ λ³ννλ€λ λͺ©μ μ κ°μ§λ€.
νμ§λ§, μλ°μμμ μ»΄νμΌμ μ΄μλ μ‘°κΈ λ€λ₯΄λ€.
Javaλ₯Ό νλ²μ΄λΌλ μ¬μ©ν΄λ³΄μμΌλ©΄ Javaκ° C/C++ μΈμ΄μλ λ€λ₯΄κ² JVM(Java Virtual Machine)μ΄λΌλ κ°μ λ¨Έμ μμμ μ€νλλ κ²μ μ μ μλ€.
μ΄λ¬ν JVMμμλ κΈ°κ³μ΄λ‘ νλ‘κ·Έλ¨μ μ€ννλ κ²μ΄ μλ λ°μ΄νΈμ½λλΌλ μλ‘μ΄ μ€κ° λ¨κ³ μΈμ΄μμ λ°λ‘ νλ‘κ·Έλ¨μ μ€ννλ©°, λ§ν¬ κ³Όμ μ JVMμ μν΄ λμ μΌλ‘ μνλλ€.
κ·Έλ¬λ―λ‘ Javaμμ μ»΄νμΌμ Java μΈμ΄λ‘ μμ±λ μ½λλ₯Ό JVMμ΄ μμ λ€μ μ μλ λ°μ΄νΈμ½λλ‘ λ³ννλ κ²μ λͺ©μ μ λκ³ μλ€.
κ·Έλ λ€κ³ κΈ°κ³μ΄λ‘ λ³κ²½μ μνλ κ²μ μλλ€.
JVMμμλ μ€ν νΌν¬λ¨Όμ€λ₯Ό μν΄ JIT(Just-In-Time) μ»΄νμΌλ¬λ₯Ό μ¬μ©νμ¬ μμ£Ό μ¬μ©λκ±°λ μ’ λ ν¨μ¨μ μΌλ‘ 지 μ μλ μ½λλ₯Ό κΈ°κ³μ΄λ‘ λ³ννμ¬ μ¬μ©νκΈ°λ νλ€.
μ΄ν λΆμκΈ°(Lexer/Tokenizer)κ° μμ€ μ½λλ₯Ό λ¬Έμ λ¨μλ‘ μ½μ΄ μ΄νμ(Lexeme)λ₯Ό μλ³ λ° μ΄λ₯Ό μ€λͺ
νλ ν ν° μ€νΈλ¦Όμ μμ±νλ€.
μ΄νμλ μλ³μ΄ κ°λ₯ν λ¬Έμμ΄λ‘ λ€μκ³Ό κ°λ€.
-
ν€μλ(Keyword)
public
,class
,main
λ± -
리ν°λ΄(Literals)
"μλ νμΈμ!"
,1L
,2.3f
λ± -
μλ³μ(Identifiers)
λ³μ μ΄λ¦, μμ μ΄λ¦, ν¨μ μ΄λ¦ λ±
-
μ°μ°μ(Operators)
+
,-
λ± -
κ΅¬λΆ λ¬Έμ(Punctuation characters)
,
,[]
,{}
λ±
μ΄λ κ² μμ±λ μλ³μ ν ν°μ μ¬λ³Ό ν μ΄λΈμ μ μ₯λκ³ λ€μ λ¨κ³μμ μ¬μ©λλ€.
ꡬ문 λΆμκΈ°(Parser)κ° μ΄μ λ¨κ³μμ λμ¨ ν ν° μ€νΈλ¦Όμ΄ λ¬Έλ²μ λ§λμ§ κ²μ¬νκ³ μ΄κ° λ§λ€λ©΄ Parse Tree(Abstract Syntax TreeλΌκ³ λ λΆλ¦Ό)λ₯Ό μμ±νκ³ , λ§μ§ μλ€λ©΄ μ»΄νμΌ μλ¬λ₯Ό λΈλ€.
μ΄ λ¨κ³μμλ νμ κ²μ¬μ μλ νμ λ³νλ±μ΄ μνλλ©°, Parse Treeμ νμ μ 보 λ±μ΄ μΆκ°λλ€.
int jong = "nan";
λ€μκ³Ό κ°μ μ½λλ ꡬ문 λΆμ λ¨κ³κΉμ§λ μλ¬μμ΄ ν΅κ³Όνλ, μλ―Έ λΆμ λ¨κ³λ₯Ό κ±°μΉλ©΄μ μλ¬κ° λ°μνλ€.
μ¬λ¬ λ¨κ³λ₯Ό κ±°μ³ μμ±λ Parse Treeλ₯Ό κΈ°λ°μΌλ‘ κΈ°κ³μ΄λ‘ λ³ννκΈ° μ’μ μ€κ° μ½λλ‘ μμ±νλ€.
μ¬κΈ°μ μ μ€κ° μ½λκ° νμν κΉ? λΌκ³ μλ¬Έμ κ°μ§ μ μλ€.
μ΄λ JVMμ μ¬μ©νλ μ΄μ μΈ "μ’
μμ±"μ μλ€.
λ§μ½ μ΄λ ν νμ¬κ° μκ³ κ·Έ νμ¬λ κΈ°μ‘΄μ μ΄λ ν μΈμ΄λ‘ μ€λ§νΈν°, ν
μ€ν¬ν λ±μ λμλλ νλ‘κ·Έλ¨μ λ§λ€μλ€κ³ νμ.
κ·Έ μΈμ΄κ° κ΅μ₯ν ꡬμμ΄κ³ μλ‘μ΄ κ°λ°μκ° μ μ
μ΄ μλ μΈμ΄μ¬μ λ€λ₯Έ μΈμ΄λ‘ λμμ ν΄μΌλλ μν©μ΄ μΌμ΄λλ©΄, κ°κ°μ μ νλ§λ€ νλ‘κ·Έλ¨μ λ§λ€μ΄μΌ νλ€.
μ κ·Έλ¦Όμ 보면 μΈκ°μ§ μΈμ΄λ‘ μΈκ°μ λμλλ νλ‘κ·Έλ¨μ λ§λ€μμ μμ μ΄ 9κ°μ νλ‘κ·Έλ¨μ λ§λ€μ΄μΌ λλ κ²μ΄λ€.
νμ§λ§, μ€κ° μΈμ΄λ‘ λ³ννκ³ μ΄λ₯Ό λμκ° μ μλ κ°μ λ¨Έμ μ λ§λ λ€λ©΄?
κ°μμ νλμ©μ νλ‘κ·Έλ¨λ§ λ§λ€λ©΄ λκΈ° λλ¬Έμ ν¨μ¨μ±μ΄ λμμ§λ€.
μ΄ λ¨κ³μμλ μ€κ° μ½λλ₯Ό μμ±νλ κ²λΏλ§ μλλΌ μ¬μ§κ² λ§λ€μ΄μλ μ 보λ€λ‘ ν΄λμ€/μΈν°νμ΄μ€μ μμ ν(Constant Pool)μ λ§λλ λ° μ¬μ©λλ€.
μμ νμ κ²½μ° μ€μ λ‘ μ½λκ° λμκ°λ©΄μ ν΄λμ€/μΈν°νμ΄μ€κ° μμ±λ λ μ¬μ©νλ Run-Time Constant Poolμ ꡬμ±νλλ° μ¬μ©λλ€.
μ€κ° μ½λλ₯Ό λ ν¨μ¨μ μΈ κΈ°κ³μ΄λ‘ λ³ννκΈ° μν΄ μ΅μ ν κ³Όμ μ κ±°μΉκ² λλ€.
μ΅μ ν λ°©λ²μ λ€μκ³Ό κ°μ΄ λ§€μ° λ€μνλ€.
-
Peephole μ΅μ ν
μ€λ³΅ λͺ λ Ήμ΄ λ° λλ¬ λΆκ°λ₯ν μ½λ μ κ±°, μ μ΄ νλ¦ μ΅μ ν, λΉμ©μ΄ μ μ μ°μ°μλ‘ λ³ν λ±
-
μ§μ μ΅μ ν
μ§μ κ³΅ν΅ λΆλΆ μ κ±°, λ³΅μ¬ μ ν, μμ ν΄λ© λ±
-
루ν μ΅μ ν
μ½λ μ΄λ, κ·λ© λ³μ μ΅μ ν, 루ν μ΅ν©/κ΅ν/μ κ° λ±
-
μ μ μ΅μ ν
μ μ κ³΅ν΅ λΆλΆμ μ κ±°, μμ ν΄λ© λ±
μλ° μ΄ν리μΌμ΄μ
μ μ€ννλ λͺ
λ Ήμ΄λ java
μ΄λ€.
μ΄ λͺ
λ Ήμ΄λ JRE(Java Runtime Environment)λ₯Ό μμνκ³ , μΈμλ‘ μ§μ λ ν΄λμ€λ₯Ό λ‘λ© νμ main()
λ©μλλ₯Ό νΈμΆνλ€.
μλ°λ‘ νλ‘κ·Έλλ°μ νλ€λ³΄λ©΄ JDK, JRE λ±λ± λ§μ΄ λ€μ΄λ΄€μ κ²μ΄λ€.
μ΄λ€μ μκ΄ κ΄κ³λ λ€μ κ·Έλ¦Όκ³Ό κ°λ€.
-
JDK (Java Development Kit)
μλ°λ₯Ό κ°λ°ν λ μ¬μ©λλ λꡬ λͺ¨μμΌλ‘ μ»΄νμΌλ¬, μμ΄μ λΈλ¬, λλ²κ±° λ±μ μ 곡νλ€.
-
JRE (Java Runtime Environment)
μλ°λ‘ λ§λ€μ΄μ§ νλ‘κ·Έλ¨μ μ€ννκΈ° μν΄ ν΄λμ€ λ‘λ, κΈ°λ³Έ λΌμ΄λΈλ¬λ¦¬ λ±μ μ 곡νλ€.
-
JVM (Java Virtual Machine)
μΈν°ν리ν°, JIT μ»΄νμΌλ¬, λ§μ»€, κ°λΉμ§ 컬λ¦ν° λ± μ¬λ¬ OSμ λ 립μ μΌλ‘ μ€ν λ μ μλ μΆμμΈ΅μ μ 곡νλ€.
κ°λ¨νκ² μ 리λ₯Ό ν΄λ³΄λ©΄, JDKλ₯Ό ν΅ν΄ κ°λ°μκ° μμ±ν μ½λλ₯Ό λ°μ΄νΈ μ½λλ‘ λ³κ²½νκ³ μ΄λ₯Ό JREλ₯Ό μ¬μ©νμ¬ μ€νλμ΄μ§λ©° JVMμ΄ κ΅¬λλλ©΄μ λ°μ΄νΈ μ½λλ₯Ό μ€ννκ² λλ€.
λ°λ‘ μ μ₯μμ JVM μΈλΆ νκ²½μμλΆν° μ€μ νλ‘κ·Έλ¨μ΄ μ€ννκΈ° μ§μ κΉμ§ μμ보μλ€.
λ§μ κ°λ°μκ° μμνλ€μνΌ κ°λ¨νκ² λΏ
νκ³ μ€νλλ κ²μ΄ μλλ€.
κ·ΈλΌ μΈλΆμ μΌλ‘ μ΄λ»κ² μ€νλλμ§ μ΄ν΄λ³΄μ.
λͺ
λ Ήμ΄λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ΄ μ€νλ λ, Class Loader(ν΄λμ€ λ‘λ)κ° μμ ν΄λμ€(κ°λ°μκ° μ μν ν΄λμ€)λ₯Ό μμ±νκ² λλλ° μ΄λ JVM μμ μλ λ©λͺ¨λ¦¬μ ν΄λΉ ν΄λμ€λ₯Ό μ μ¬νλ€λ λ»μ΄λ€.
JVM μμ λ©λͺ¨λ¦¬ μμμ΄ λ°λ‘ μμΌλ©° μ°λ¦¬λ μ΄κ²μ Run-Time Data AreaλΌκ³ νλ€.
μ΄ λ©λͺ¨λ¦¬ μμμ ν¬κ² 6κ° κ΅¬μμΌλ‘ λ€μκ³Ό κ°μ΄ λλ μ μλ€.
- Heap (JVM λ¨μ)
- Method Area (JVM λ¨μ)
- Run-Time Constant Pool (Class λ¨μ)
- PC Register (μ€λ λ λ¨μ)
- JVM Stack (μ€λ λ λ¨μ)
- Native Method Stack (μ€λ λ λ¨μ)
κ°λ‘ μμ JVM, Class, μ€λ λ λ¨μλ₯Ό μ μ΄ λμλλ° μ΄λ 3κ°μ λ¨μλ‘ ν΄λΉ μμλ€μ΄ μμ±λκ³ μμ λκΈ° λλ¬Έμ΄λ€.
Heap κ³Ό Method Area μ JVMμ΄ κ΅¬λ λμ΄μ§ λ κ°μ΄ μμ±/μλ©Έμ νλ©° νλμ© μμ±λλ€.
Run-TIme Constant Pool μ ν΄λμ€κ° λ‘λλμ΄ μμ±μ κ°μ΄ μμ±λλ©° μλͺ μ£ΌκΈ°λ₯Ό ν¨κ»νλ€.
λλ¨Έμ§ PC Register, JVM Stack, Native Method Stack μ μ€λ λμ κ°μ΄ μμ±/μλ©Έ λλ€.
μ΄μ μ€νλλ μμλ³λ‘ μμλ€μ μμΈν μ΄ν΄λ³΄λλ‘ νμ.
ν μμμ μΈμ€ν΄μ€ν λ λͺ¨λ κ°μ²΄, ν΄λμ€ λ°°μ΄ λ±μ μ μ₯νλ 곡κ°μ΄λ©°, μ€λ λλΌλ¦¬ 곡μ κ° κ°λ₯νλ€..
μ¬κΈ°μ ν λΉλ λ©λͺ¨λ¦¬λ λͺ
μμ μΈ λ°©λ²μΌλ‘λ μ λ νμνμ§ λͺ»νκ³ μ€μ§, Garbage Collectorμ μν΄ νμλλ€.
νλμ λ©μλ λ°μ΄ν°, μμ±μ λ° λ©μλ μ½λ λ΄μ©, λ°νμ μμ ν λ±μ μ μ₯νλ κ³³μ΄λ€.
μ μ₯λλ λ΄μ©μ κ²½μ° λ°μ΄νΈμ½λμ λ΄μ©κ³Ό κ±°μ μΌμΉνλλ° μ΄λ λ°μ΄νΈμ½λμ μμ νμ ν¬ν¨νκΈ° λλ¬Έμ΄λ€.
λν, λ°νμ μμ νμ μμ νμ κΈ°λ°μΌλ‘ λ©μλ μμμ μ μ₯ν λ μμ±λλ€.
λ©μλ μμμ λ
Όλ¦¬μ μΌλ‘ ν μμμ μΌλΆμ΄μ§λ§, μ€νμμλ μ΄ μμΉλ₯Ό κ°μ νμ§ μλλ€.
μ¦, λ©μλ μμμ μμΉλ JVMμ μ΄λ»κ² ꡬννλλμ λ°λΌ λ¬λΌμ§ μ μλ€.
OpenJDKμ μ¬μ©λλ Hotspot VMμ κ²½μ°, μ΄ λ©μλ μμμ MetaspaceλΌλ μ΄λ¦μ μ¬μ©νμ¬ κ΅¬ννλ€.(JAVA 8 μ΄μ λΆν°, κ·Έ μ΄μ μλ Permanent Area)
μμμ μμ ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ μ μ¬νλ©΄μ μμμ΄ λλ€κ³ νμλ€.
μ΄ μμ ν΄λμ€λ₯Ό λ‘λ©νλ 주체λ ν΄λμ€ λ‘λμ΄λ©°, μ΄λ JREμμ 3κ°μ§ λ΄μ₯λ ν΄λμ€ λ‘λ(Bootstrap, Platform, System)λ₯Ό μ 곡νλ€.
μμ ν΄λμ€λ μμ€ν
ν΄λμ€ λ‘λκ° λ‘λ©μνκ³ , μμ€ν
ν΄λμ€ λ‘λλ νλ«νΌ ν΄λμ€ λ‘λκ°, νλ«νΌ ν΄λμ€ λ‘λλ λΆνΈμ€νΈλ© ν΄λμ€ λ‘λκ° λ‘λ©μνκ³ λΆνΈμ€νΈλ© ν΄λμ€ λ‘λλ JREκ° μ‘°μ±λ λ μ€νλλ€.
μ¦, JRE μ€ν β λΆνΈμ€νΈλ© β νλ«νΌ β μμ€ν
β μμ ν΄λμ€ μμΌλ‘ μ€νμ΄ λλ κ²μ΄λ€.
ν΄λμ€κ° μμ±λλ©΄μ λ°νμ μμ νλ ν¨κ» μμ±λλ€.
μ΄κ³³μλ μ»΄νμΌμμ μ μ μλ μ«μ 리ν°λ΄ κ°λΆν° λ°νμμμ ν΄μλλ λ©μλμ νλ μ°Έμ‘°κΉμ§ μ¬λ¬ μ’
λ₯μ μμκ° μ μ₯λλ€.
ν΄λμ€/μΈν°νμ΄μ€μ Super ν΄λμ€/μΈν°νμ΄μ€, λλ λ°°μ΄μ μμμ ν΄λμ€/μΈν°νμ΄μ€λ₯Ό νμΈ, μ€λΉνκ³ μ¬λ³Όλ¦ μ°Έμ‘°λ₯Ό ν΄μνλ κ³Όμ μ λ§ν¬λΌκ³ νλ€.
μ½κ² λ§νμλ©΄, μ½λ μ€κ°μ λ€λ₯Έ ν΄λμ€λ₯Ό μ°Έμ‘°ν μΌμ΄ μκ²Όμ λ ν΄λΉ ν΄λμ€λ₯Ό λ‘λνκΈ° μν κ³Όμ μ΄λΌκ³ 보면 λλ€.
-
νμΈ(Verification)
ν΄λμ€ νΉμ μΈν°νμ΄μ€μ λ°μ΄λ리 ννμ΄ κ΅¬μ‘°μ μΌλ‘ μ¬λ°λ₯Έμ§λ₯Ό 보μ₯ν΄μ£Όλ κ³Όμ
-
μ€λΉ(Preparing)
ν΄λμ€λ μΈν°νμ΄μ€μ μ μ (Static) νλλ₯Ό μμ±νκ³ κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ννλ κ³Όμ
κΈ°λ³Έκ°μ΄ μλ νΉμ κ°μΌλ‘ μ μ νλλ₯Ό μ΄κΈ°ννλ κ²μ ν΄λΉ κ³Όμ μ΄ μλ μ΄κΈ°ν κ³Όμ μμ λ°λ‘ μ²λ¦¬ -
ν΄μ(Resolution)
λ°νμ μμ νμ μλ μ¬λ³Όλ¦ μ°Έμ‘°κ° κ΅¬μ²΄μ μΈ κ°μ κ°λ¦¬ν€λλ‘ λμ μΌλ‘ κ²°μ μ νλ κ³Όμ
JVM μ€νμμ λ§ν¬ κ³Όμ μ΄ μΈμ μ€νλμΌ νλ€λ λͺ
νν κ·μ μ νμ§ μμκΈ° λλ¬Έμ JVM ꡬν체λ§λ€ λ¬λΌμ§ μ μλ€.
μ§μ°(lazy) λ§ν¬ μ λ΅μ μ¬μ©νλ κ²½μ° ν΄λμ€/μΈν°νμ΄μ€μ ν¬ν¨λ μ¬λ³Όλ¦ μ°Έμ‘°λ μ€μ μ°Έμ‘°κ° μ¬μ©λ λ κ°λ³μ μΌλ‘ ν΄μλμ§λ§(μ΄κΈ°ν κ³Όμ μ κ±°μΉ νμ ν΄μμ΄ λ μ μμ), μ¦μ(eager) λ§ν¬ μ λ΅μ κ²½μ° ν΄λμ€/μΈν°νμ΄μ€κ° νμΈ λ λ λͺ¨λ μ¬λ³Όλ¦ μ°Έμ‘°κ° ν΄μλλ€.
μ΄κΈ°ν(Initialization)λ ν΄λμ€/μΈν°νμ΄μ€μ μ΄κΈ°ν λ©μλλ₯Ό μ€νν λ μνλλ κ³Όμ μ΄λ€.
μ΄κ³³μμ μ΄κΈ°νλ "μ μ (Static) μ΄κΈ°νλ₯Ό νλ€."λΌκ³ ν μ μλ€.
μ΄κΈ°ν λ©μλμλ μΈμ€ν΄μ€ μ΄κΈ°ν λ©μλ, ν΄λμ€/μΈν°νμ΄μ€ μ΄κΈ°ν λ©μλκ° μ‘΄μ¬νλ€.
-
μΈμ€ν΄μ€ μ΄κΈ°ν λ©μλ
μ°λ¦¬κ° ν΄λμ€ λ΄λΆμ μ μΈνλ μμ±μκ° μ΄μ ν΄λΉνλ©°, ν΄λμ€λ 0κ° μ΄μμ μΈμ€ν΄μ€ μ΄κΈ°ν λ©μλλ₯Ό κ°μ§κ³ μλ€.
μΈμ€ν΄μ€ μ΄κΈ°ν λ©μλλ λ€μκ³Ό κ°μ 쑰건μ μΆ©μ‘±ν΄μΌ λλ€.- ν΄λμ€ μμ μ μ
- λ°μ΄νΈμ½λ μμμ
<init>
μ΄λΌλ νΉμν μ΄λ¦μΌλ‘ νν - λ°ν νμ
μ
void
μΈμ€ν΄μ€ μ΄κΈ°ν λ©μλλ νμ μΈμ€ν΄μ€λ₯Ό μμ±νλ μν μ νκ³ , ν΄λμ€/μΈν°νμ΄μ€ μ΄κΈ°ν λ©μλλ₯Ό νΈμΆνλ€.
-
ν΄λμ€/μΈν°νμ΄μ€ μ΄κΈ°ν λ©μλ
μμ λ§ν¬ λ¨κ³μμ νΉμ κ°μΌλ‘ μ μ νλλ₯Ό μ΄κΈ°ν νκΈ° μν΄μλ λ°λ‘ μ²λ¦¬νλ€κ³ μΈκΈμ νμλλ°, ν΄λΉ λ©μλκ° κ·Έ μν μ 맑μμ νλ€.
μ΄ λ©μλλ ν΄λμ€/μΈν°νμ΄μ€μ 1κ°λ§ μ‘΄μ¬ν μ μμΌλ©° λ€μκ³Ό κ°μ 쑰건μ μΆ©μ‘±ν΄μΌ λλ€.
- λ°μ΄νΈμ½λ μμμ
<clinit>
μ΄λΌλ νΉμν μ΄λ¦μΌλ‘ νν - λ°ν νμ
μ
void
- class νμΌ λ²μ 51 μ΄μμμλ
ACC_STATIC
νλκ·Έκ° λΆμ
μ΄ λ©μλλ μ€νμμλ ꡬ체μ μΈ μ€λͺ μ΄ μ‘΄μ¬ νμ§ μμ§λ§, static λΈλ‘λ€μ λ΄μ©μ νλλ‘ ν©μΉ κ²μ΄λΌκ³ λ³Ό μ μλ€.
public class initializationTest { public final static int i ; static { i = 1; } public final static int j ; static { j = 2; } } /* λ°μ΄νΈμ½λ μΌλΆλΆ static {}; descriptor: ()V flags: ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_1 1: putstatic #2 // Field i:I 4: iconst_2 5: putstatic #3 // Field j:I 8: return LineNumberTable: line 8: 0 line 12: 4 line 13: 8 */
μμ κ°μ μ½λκ° μ‘΄μ¬ν λ, λ°μ΄νΈμ½λλ₯Ό μ΄ν΄λ³΄λ©΄ νλμ λΈλ(
static{}
) μΌλ‘ λ³κ²½λ κ²μ λ³Ό μ μλ€. - λ°μ΄νΈμ½λ μμμ
μ΄ μμ λΆν° μ€μ νλ‘κ·Έλ¨μ΄ μ€νλλ€.
νλ‘κ·Έλ¨μ΄ μ€νλκΈ° μν΄ νλ‘κ·Έλ¨ νλ¦μ μ΅μ λ¨μμΈ μ€λ λκ° μ‘΄μ¬ν΄μΌ λλ©°, JVMμμλ main()
λ©μλλ₯Ό νΈμΆνκΈ° μν΄ Mainμ΄ λλ μ€λ λλ₯Ό μμ±νλ€.
λ©μΈ μ€λ λκ° μμ±λλ©΄ PC λ μ§μ€ν°, JVM μ€ν, λ€μ΄ν°λΈ λ©μλ μ€νμ΄ ν¨κ» μμ±λλ€.
PC λ μ§μ€ν°λ νμ¬ μ€νμ€μΈ λ©μλκ° λ€μ΄ν°λΈ λ©μλκ° μλλ©΄ νμ¬ μ€ν μ€μΈ JVM λͺ λ Ήμ΄μ μμΉκ° μ μ₯λκ³ , λ€μ΄ν°λΈ λ©μλμΌ κ²½μ° μ μ₯λλ κ°μ μ μ λμ§ μλλ€(undefined).
JVM μ€νμ μ΄λ¦μμ μ μ μλ―μ΄ LIFO λ°©μμΌλ‘ λμνλ©° νλ μ(Frame)μ΄λΌλ λ¨μλ‘ μ μ₯μ΄ λλ€.
νλ μμ λ°μ΄ν°λ μ€κ° κ²°κ³Όμ μ μ₯, λμ λ§ν¬, κ° λ°ν, μμΈ λμ€ν¨μΉμ μ¬μ©λλ€.
μ¦, λ©μλκ° νΈμΆλ λλ§λ€ μ νλ μμ΄ μμ±λμ΄ μ€νμ μμ΄κ³ , λ©μλ νΈμΆμ΄ μ μμ μΌλ‘ μλ£ λκ±°λ μμΈκ° λμ Έμ§λ©΄ νλ μμ μ€νμμ λΉ μ§λ©° μλ©Έλλ€.
νλ μμ λ‘컬 λ³μ λ°°μ΄, μ€νΌλλ μ€ν, ν΄λΉ λ©μλκ° μν ν΄λμ€μ λ°νμ μμ νμ λν μ°Έμ‘°λ‘ κ΅¬μ±λλ€.
Local Variables
λ‘컬 λ³μ λ°°μ΄μ ν¬κΈ°λ μ»΄νμΌ νμμ κ²°μ λλ©°, λ°μ΄νΈμ½λμμ
Code
μμ±μlocals
λ‘ νμλλ€.
long
κ³Όdouble
μ κ²½μ° 2κ°μ μ¬λ‘―μ κ±Έμ³ μ μ₯λκ³ λλ¨Έμ§λ 1κ°μ μ¬λ‘―μ μ μ₯λλ€.λ©μλκ° ν΄λμ€ λ©μλμΌ κ²½μ°, μΈμλ 0λ² μ¬λ‘―λΆν° μ°¨λ‘λλ‘ μ μ₯λλ€.
μΈμ€ν΄μ€ λ©μλμΌ κ²½μ°μλthis
κ° 0λ² μ¬λ‘―, μΈμλ€μ΄ 1λ² μ¬λ‘―λΆν° μ°¨λ‘λλ‘ μ μ₯λλ€.
λλ¨Έμ§ μ§μ λ³μλ€μ΄ λλ¨Έμ§ μ¬λ‘―μ μ μ₯λλ€.Operand Stack
μ€νΌλλ μ€νμ μ΅λ κΉμ΄λ μ»΄νμΌ νμμ κ²°μ λκ³ λΉμ΄μλ μνλ‘ μμ±λλ©°, λ°μ΄νΈμ½λμμ
Code
μμ±μstack
μΌλ‘ νμλλ€.
λ©μλμ μ λ¬λλ νλΌλ―Έν°λ₯Ό μ€λΉνκ±°λ λ©μλκ° λ°ννλ κ²°κ³Όκ°μ λ°μ λ λ± κ±°μ λͺ¨λ κ³Όμ μμ μ€νΌλλ μ€νμ΄ μ¬μ©λλ€.Reference To Run-Time Constant Pool
μ΄λ¦ κ·Έλλ‘ ν΄λΉ νλ μμ λμλλ λ©μλκ° μν ν΄λμ€μ λ°νμ μμ νμ λν μ°Έμ‘°λ₯Ό μλ―Ένλ€.
λ³΄ν΅ C μ€νμ΄λΌκ³ λΆλ₯΄λ©°, μλ°κ° μλ λ€λ₯Έ μΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ λ©μλλ₯Ό μ§μνκΈ° μν΄ μ¬μ©λλ μ€νμ΄λ€.
JVMμ΄ λ°λμ λ€μ΄ν°λΈ λ©μλλ₯Ό μ§μνλ κ²μ΄ μλκΈ° λλ¬Έμ λ€μ΄ν°λΈ λ©μλ μ€ν μμ νμλ μλλ€.
μμ±λ λ°μ΄νΈ μ½λμ μλ λͺ
λ Ήμ΄μ λ°λΌ μ¬ν μμ±λ μ 보λ€μ κ°μ§κ³ λ©μλλ₯Ό μμ±νλ€.
λ€νμ§μ‘΄λμ΄ λ€μ΄μ£Όμ μ λΉν μμκ° μκΈ°μ κ·Έκ²μ 보면μ μ΄λ»κ² μ€νλλμ§ λ³΄λ©΄ μ’μκ² κ°λ€.(κ·Έλ¦Όλ μμ΄ μ΄ν΄νκΈ° νΈν¨)