μΆμ²
ChatGPT
"ν΄λμ€κ° λ‘λλλ€" μ μλ―Έ
μλ° νλ‘κ·Έλ¨μ΄ μ€νλλ λμ JVM(Java Virtual Machine)μ΄ ν΄λμ€ νμΌμ λ©λͺ¨λ¦¬μ λ‘λν΄ νλ‘κ·Έλ¨μμ μ¬μ©ν μ€λΉλ₯Ό νλ κ³Όμ μ μλ―Ένλ€.
μ΄ κ³Όμ μ ν΄λμ€μ λ°μ΄νΈ μ½λκ° λ©λͺ¨λ¦¬μ μ μ¬λκ³ μ΄ ν μ¬μ©μκ° ν΄λμ€μ λ©μλλ₯Ό νΈμΆνκ±°λ κ°μ²΄λ₯Ό μμ±ν μ μλ μνλ‘ λ§λλ μΌλ ¨μ λ¨κ³λ€μ ν¬ν¨νλ€.
ν΄λμ€ λ‘λ© κ³Όμ
- ν΄λμ€ λ‘λ© Class Loading
- λ§νΉ Linking
- μ΄κΈ°ν Initialization
- μ¬μ© κ°λ₯ μν
1. ν΄λμ€ λ‘λ© Class Loading
- λ°μ΄νΈ μ½λ μ½κΈ°
JVMμ ν΄λμ€ νμΌ(*.class)μμ λ°μ΄νΈμ½λλ₯Ό μ½μ΄λ€μΈλ€.
- λ‘λ κ²°μ
JVMμ ν΄λμ€λ₯Ό λ‘λνκΈ° μν΄ μ¬μ©ν ν΄λμ€ λ‘λλ₯Ό κ²°μ νλ€. ν΄λμ€ λ‘λλ ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ μ μ¬νλ μν μ νλ€.
ν΄λμ€ λ‘λ μ’ λ₯ μ€λͺ μ μλμ
2. λ§νΉ Linking
- κ²μ¦ Verification
λ‘λλ ν΄λμ€ νμΌμ λ°μ΄νΈμ½λκ° μ ν¨νμ§ νμΈνλ€. μ΄ λ¨κ³μμλ λ©λͺ¨λ¦¬ μΉ¨λ² λ°©μ§, μ€ν κ²μ¦ λ± λ³΄μ κ²μ¬λ₯Ό μννλ€.
- μ€λΉ Preparation
ν΄λμ€μ μ μΈλ λͺ¨λ μ μ νλλ₯Ό μν λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ κΈ°λ³Έκ°μ μ€μ νλ€.
- ν΄κ²° Resolution
ν΄λμ€κ° μ¬μ©νλ λͺ¨λ μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό μ€μ λ©λͺ¨λ¦¬ μ£Όμλ‘ λ³κ²½νλ€.
- μ¬λ³Όλ¦ λ νΌλ°μ€λ? > [Java] μ¬λ³Όλ¦ λ νΌλ°μ€ Symbolic Reference
3. μ΄κΈ°ν Initialization
- μ μ μ΄κΈ°ν λΈλ‘ λ° μ μ λ³μ μ΄κΈ°ν
ν΄λμ€μ μ μλ static μ΄κΈ°ν λΈλ‘κ³Ό static λ³μκ° μ΄ μμ μμ μ΄κΈ°νλλ€. μ΄κΈ°νλ ν΄λμ€μ μ μ λΈλ‘μ΄ μλ κ²½μ° μ€νλλ©°, κ·Έ μΈμ κ²½μ°μλ κΈ°λ³Έκ°μ΄ ν λΉλλ€.
- ν΄λμ€ μμ±μ μ€ν
static νλμ μ΄κΈ° κ°μ μ€μ νκΈ° μν ν΄λμ€ μμ±μ(<clinit> λ©μλ)κ° νΈμΆλλ€.
μμ
public class MyClass {
static int staticValue = 10;
static {
staticValue = 20; // ν΄λμ€κ° λ‘λλ λ μ€ν
System.out.println("Static block executed");
}
}
4. μ¬μ© κ°λ₯ μν
μ΄κΈ°νκ° μλ£λ ν ν΄λμ€λ μΈμ€ν΄μ€νμ¬ κ°λ₯ν μνκ° λλ€. μ΄ μνμμλ ν΄λμ€λ₯Ό μ¬μ©νκ±°λ κ°μ²΄λ₯Ό μμ±νκ±°λ static λ©μλλ₯Ό νΈμΆν μ μλ€.
μμ
public class Example {
static int count = 0;
static {
System.out.println("Class Example is loaded");
}
public static void printMessage() {
System.out.println("Hello from Example");
}
public Example() {
count++;
System.out.println("Object created");
}
public static void main(String[] args) {
// ν΄λμ€ λ‘λ©: Example ν΄λμ€λ μ¬κΈ°μ μ²μ λ±μ₯νλ―λ‘ λ‘λλ©λλ€.
Example.printMessage(); // Static blockμ΄ λ¨Όμ μ€νλ¨
// κ°μ²΄ μμ±: μ΄λ―Έ λ‘λλμμΌλ―λ‘ λ°λ‘ κ°μ²΄κ° μμ±λ©λλ€.
Example obj1 = new Example();
Example obj2 = new Example();
}
}
ν΄λμ€ λ‘λ© μμ
ν΄λμ€κ° μ²μ μ¬μ©λ λ λ‘λλλ€.
1. ν΄λμ€μ μΈμ€ν΄μ€ μμ± μ
ν΄λμ€λ‘ κ°μ²΄λ₯Ό μμ±ν κ²½μ°μ΄λ€.
2. ν΄λμ€μ μ μ λ©μλ νΈμΆ μ
static ν€μλκ° λΆμ ν¨μλ₯Ό νΈμΆν κ²½μ°
3. ν΄λμ€μ μ μ λ³μ ν λΉ μ
static ν€μλκ° λΆκ³ , final ν€μλλ λΆμ§ μμ λ³μλ₯Ό νΈμΆν κ²½μ°
4. ν΄λμ€μ μμκ° μλ μ μ λ³μλ₯Ό μ¬μ©ν μ
static final λ³μκ° μμμΌ κ²½μ°μλ ν΄λμ€ λ‘λκ° μΌμ΄λμ§ μκ³ , static final λ³μκ° λ°νμμ κ³μ°λλ κ°μ΄λ©΄ ν΄λμ€ λ‘λμ ν΄λμ€ μ΄κΈ°νκ° μΌμ΄λλ€.
1. static final λ³μκ° λ°νμμ κ³μ°νλ κ°μΌ κ²½μ°, ν΄λμ€κ° λ‘λλλ€.
public class MyClass {
public static final int CONSTANT = new Random().nextInt();
}
public static final int VALUE = Math.max(10, 20);
- κ°μ΄ μ€ν μμ μ κ³μ°λμ΄μΌ νλ―λ‘, ν΄λΉ ν΄λμ€λ₯Ό λ‘λνκ³ μ΄κΈ°νν΄μΌ νλ€.
2. staic final λ³μκ° μμμΌ κ²½μ°, ν΄λμ€κ° λ‘λλμ§ μλλ€. μ»΄νμΌλ¬κ° μμ ν(constant pool)μ ν΄λΉ κ°μ μ§μ λ£μ΄ μΈλΌμΈ(inline) μ²λ¦¬νκΈ° λλ¬Έμ΄λ€.
public class MyClass {
public static final int CONSTANT = 42;
}
- μ»΄νμΌ νμ μμλ μ»΄νμΌ μμ μ κ·Έ κ°μ νμ ν μ μλ λ³μλ‘, κΈ°λ³Έμ μΌλ‘ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§κ³ μλ€.
- κΈ°λ³Έ νμ (Primitive Type)μ΄λ λ¬Έμμ΄μ΄μ΄μΌ νλ€.
- μμ ννμμΌλ‘ μ μλμ΄μΌ νλ€. μλ₯Ό λ€μ΄, int = 5 + 3; μ²λΌ μ»΄νμΌ μμ μ κ·Έ κ°μ μ μ μμ΄μΌ νλ€.
- μμ ννμ : μ»΄νμΌ μμ μ κ·Έ κ°μ κ²°μ ν μ μλ ννμ.
- μ 1: 리ν°λ΄ μμ μ¬μ©
- public static final int CONSTANT = 10;
- μ 2: κΈ°λ³Έ νμ
κ°μ μ°μ μ°μ°
- public static final int ANOTHER_CONSTANT = 5 + 3;
- μ 3: κΈ°μ‘΄ μμλ€κ°μ μ°μ°
- public static final int CONSTANT_A = 4;
- public static final int CONSTANT_B = CONSTANT_A * 2;
- μ 4: λ¬Έμμ΄ κ²°ν©
- public static final String GREETING = "Hello, " + "World!";
- μ 1: 리ν°λ΄ μμ μ¬μ©
- μμ ννμ : μ»΄νμΌ μμ μ κ·Έ κ°μ κ²°μ ν μ μλ ννμ.
- μ΄λ¬ν κ²½μ°μ μ»΄νμΌλ¬λ μμμ κ°μ μ°Έμ‘°ν λ μ€μ λ³μλ₯Ό μ°Έμ‘°νμ§ μκ³ μ§μ κ° μ체λ₯Ό μ½λμ μ½μ νλ€. μ΄λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ μ€ν μλκ° λΉ¨λΌμ§κ³ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ€μ΄λ λ€. λ°λΌμ static final λ³μλ₯Ό μ¬μ©νλ μ½λμμλ λ³μκ° μ μΈλ ν΄λμ λν μ°Έμ‘°κ° λΆνμνκ² λλ€.
ν΄λμ€ λ‘λ©μ μ’ λ₯
μλ°μμ ν΄λμ€ λ‘λ©μ λ κ°μ§ μ£Όμ λ°©μμΌλ‘ μ΄λ£¨μ΄μ§λ€.
1. μ μ λ‘λ© Static Loading
μΌλ°μ μΌλ‘ 'new' ν€μλλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νκ±°λ, static λ©μλ/λ³μμ μ κ·Όν λ λ°μνλ€.
νλ‘κ·Έλ¨ μμ μμ μ λͺ¨λ ν΄λμ€κ° λ©λͺ¨λ¦¬μ λ‘λλλ λ°©μ. JVMμ μν΄ μλμΌλ‘ λ‘λλλ€. μΌλ°μ μΈ μν©μμλ μλ° μ»΄νμΌλ¬κ° 미리 κ²°μ λ ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ μ¬λ¦¬λ©°, λͺ¨λ ν΄λμ€μ λ©μλλ νλ‘κ·Έλλ―Έμ΄ μμλ λλΆν° μ¬μ©ν μ€λΉκ° λλ€.
μμ
// Static loading example
Example obj = new Example(); // Example ν΄λμ€κ° λ‘λλ¨
2. λμ λ‘λ© Dynamic Loading
νλ‘κ·Έλ¨ μ€ν μ€ νΉμ 쑰건μ΄λ μꡬμ¬νμ λ°λΌ ν΄λμ€κ° νμν λ κ·Έ λμμΌ λ©λͺ¨λ¦¬μ λ‘λλλ λ°©μ. μ΄ λ°©μμ 미리 μ μ μλ ν΄λμ€λ μΈλΆ 리μμ€μ λν μ’ μμ±μ μ²λ¦¬ν λ μ¬μ©λλ€.
Reflection APIλ₯Ό μ¬μ©ν΄ μ€ν μκ°μ ν΄λμ€λ₯Ό λ‘λνκ³ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
μμ
// Dynamic loading example
try {
Class<?> clazz = Class.forName("com.example.DynamicClass");
Object obj = clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
ν΄λμ€ λ‘λ Class Loader
JVMμλ ν΄λμ€ λ‘λ©μ μννλ ν΄λμ€ λ‘λκ° μ‘΄μ¬νλ€. μ΄λ€μ ν΄λμ€ νμΌμ λ‘λ© κ²½λ‘ λ° λ°©μμ λ°λΌ ꡬλΆλλ€.
1. λΆνΈμ€νΈλ© ν΄λμ€ λ‘λ Bootstrap Class Loader
- JRE κΈ°λ³Έ ν΄λμ€(Java API, java.lang., java.util λ±)λ₯Ό λ‘λνλ€.
- λ€μ΄ν°λΈ μ½λλ‘ κ΅¬νλμ΄ μμΌλ©°, 'rt.jar' νμΌμ λ΄μ©μ λ©λͺ¨λ¦¬μ μ¬λ¦°λ€.
2. νμ₯ ν΄λμ€ λ‘λ Extenstion Class Loader
- JDKμ νμ₯ λλ ν λ¦¬μΈ 'jre/lib/ext'μ μλ ν΄λμ€λ₯Ό λ‘λνλ€.
- λ³΄ν΅ λΆνΈμ€λ₯΄λ°° ν΄λμ€ λ‘λμ μν΄ λ‘λλμ§ μμ ν΄λμ€λ₯Ό λ΄λΉνλ€.
3. μμ€ν ν΄λμ€ λ‘λ System/Application Class Loader
- μμ© νλ‘κ·Έλ¨ ν΄λμ€ κ²½λ‘(classpath)μ μλ ν΄λμ€λ₯Ό λ‘λνλ€.
- μλ° νλ‘κ·Έλ¨μ΄ μ€νλ λ κΈ°λ³Έμ μΌλ‘ μ¬μ©λλ ν΄λμ€ λ‘λμ΄λ€.
ν΄λμ€ λ‘λ©μ μ€μμ±
λ©λͺ¨λ¦¬ ν¨μ¨μ±
ν΄λμ€λ νμν λλ§ λ©λͺ¨λ¦¬μ λ‘λλμ΄ λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μ ννλ€.
보μ
ν΄λμ€ λ‘λλ λ°μ΄νΈμ½λλ₯Ό κ²μ¦νμ¬ JVMμ μμ μ±μ 보μ₯νλ€. μ μμ μΈ μ½λλ₯Ό μ€ννκΈ° μ μ μ°¨λ¨ν μ μλ€.
μ μ°μ±
ν΄λμ€ λ‘λλ₯Ό μ¬μ©νλ©΄ λμ μΌλ‘ ν΄λμ€λ₯Ό λ‘λνκ³ , μλ° μ ν리μΌμ΄μ μμ νλ¬κ·ΈμΈ μμ€ν μ ꡬννλ κ²μ΄ κ°λ₯νλ€.
μμ½
"ν΄λμ€κ° λ‘λλλ€"λ κ²μ μλ° νλ‘κ·Έλ¨μμ ν΄λμ€κ° JVMμ μν΄ λ©λͺ¨λ¦¬λ‘ μ½νμ Έ μ¬μ© κ°λ₯ν μνκ° λλ κ³Όμ μ μλ―Ένλ€. μ΄ κ³Όμ μ ν΄λμ€μ μ μλ₯Ό λ©λͺ¨λ¦¬λ‘ κ°μ Έμ€κ³ , μ μ λ³μμ λ©μλλ₯Ό μ΄κΈ°ννλ©°, κ·Έ ν κ°μ²΄ μΈμ€ν΄μ€κ° μμ±λ μ μλλ‘ μ€λΉνλ κ²μ ν¬ν¨νλ€. ν΄λμ€ λ‘λ©μ νλ‘κ·Έλ¨μ μμλΆν° κ°μ²΄ μμ±μ μ΄λ₯΄λ μ 체 λ¨κ³ κ³Όμ μ νμ λ¨κ³λ‘, ν¨μ¨μ μ΄κ³ μμ ν νλ‘κ·Έλ¨ μ€νμ μν΄ μ€μνλ€.
ChatGPTμκ² μ΄ κΈμ μΆμ²λ₯Ό λ¬Όμλ€.
ν΄λμ€ λ‘λ©μ λν μΆμ²
- The Java Language Specification
- λ΄μ©: μ΄ λ¬Έμλ μλ° μΈμ΄μ 곡μ μ¬μμ μ€λͺ νλ©°, ν΄λμ€ λ‘λ©κ³Ό μ΄κΈ°ν κ³Όμ μ λν ꡬ체μ μΈ μ 보λ₯Ό μ 곡ν©λλ€. ν΄λμ€ λ‘λ©μ λ°νμ μ ν΄λμ€ νμΌμ λ©λͺ¨λ¦¬μ λ‘λνκ³ , κ²μ¦ λ° μ€λΉ, ν΄μ, μ΄κΈ°ν λ¨κ³λ₯Ό κ±°μΉλ κ³Όμ μ λλ€.
- μ€λͺ
:
- λ‘λ(Loading): ν΄λμ€ νμΌμ μ½μ΄ λ©λͺ¨λ¦¬μ λ‘λν©λλ€.
- λ§ν¬(Linking):
- κ²μ¦(Verification): ν΄λμ€ νμΌμ νμ λ° λ°μ΄νΈμ½λμ μ ν¨μ±μ κ²μ¦ν©λλ€.
- μ€λΉ(Preparation): ν΄λμ€ λ³μ(static λ³μ)λ₯Ό μν λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°νν©λλ€.
- ν΄μ(Resolution): μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό λ©λͺ¨λ¦¬μ μ€μ μ£Όμλ‘ λ³νν©λλ€.
- μ΄κΈ°ν(Initialization): ν΄λμ€ λ³μμ μ΄κΈ°ν μ½λκ° μ€νλ©λλ€.
- λ§ν¬: The Java Language Specification
- Java Virtual Machine Specification
- λ΄μ©: μ΄ λ¬Έμλ JVMμ λμ μ리μ λ©λͺ¨λ¦¬ κ΄λ¦¬, ν΄λμ€ λ‘λ© λ©μ»€λμ¦μ λν μμΈν μ€λͺ μ μ 곡ν©λλ€. ν΄λμ€ λ‘λ(ClassLoader)λ ν΄λμ€ νμΌμ μ½μ΄ λ©λͺ¨λ¦¬μ λ‘λνκ³ , ν΄λμ€λ₯Ό μ΄κΈ°ννμ¬ νλ‘κ·Έλ¨μ΄ μ€νλ μ€λΉλ₯Ό νλλ‘ ν©λλ€.
- μ€λͺ
:
- ν΄λμ€ λ‘λλ κΈ°λ³Έμ μΌλ‘ Bootstrap ClassLoader, Extension ClassLoader, Application ClassLoaderλ‘ κ΅¬λΆλλ©°, κ°κ°μ μν μ λ°λΌ ν΄λμ€λ₯Ό λ‘λν©λλ€.
- ν΄λμ€ λ‘λ©μ λμ (dynamic)μΌλ‘ μνλλ©°, νμν μμ μ ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ λ‘λνκ³ μ΄κΈ°νν©λλ€.
- λ§ν¬: Java Virtual Machine Specification
- "Inside the Java Virtual Machine" by Bill Venners
- λ΄μ©: μ΄ μ± μ JVMμ λ΄λΆ ꡬ쑰μ λμμ μ€λͺ νλ©°, ν΄λμ€ λ‘λ© λ©μ»€λμ¦κ³Ό λ©λͺ¨λ¦¬ λͺ¨λΈμ μμΈν λ€λ£Ήλλ€. ν΄λμ€ λ‘λ© κ³Όμ μ JVMμ΄ ν΄λμ€λ₯Ό μ΄λ»κ² λ‘λνκ³ , λ§ν¬νκ³ , μ΄κΈ°ννλμ§λ₯Ό 보μ¬μ€λλ€.
- μ€λͺ
:
- ν΄λμ€ λ‘λ©μ JVMμ ClassLoaderκ° μννλ©°, ν΄λμ€ νμΌμ λ°μ΄νΈμ½λλ₯Ό μ½μ΄ λ€μ¬ λ©λͺ¨λ¦¬μ λ‘λνκ³ , νλ‘κ·Έλ¨μ΄ μ€νλ μ€λΉλ₯Ό ν©λλ€.
- ν΄λμ€ λ‘λ© κ³Όμ μ lazy loading λ°©μμ μ¬μ©νμ¬, νμν μμ μλ§ ν΄λμ€λ₯Ό λ‘λνμ¬ λ©λͺ¨λ¦¬ μ¬μ©μ μ΅μ νν©λλ€.
- λ§ν¬: Inside the Java Virtual Machine on Amazon
- "Java Concurrency in Practice" by Brian Goetz
- λ΄μ©: μ΄ μ± μ μλ°μμμ λμμ± λ¬Έμ μ ν΄κ²° λ°©λ²μ μ€λͺ νλ©°, ν΄λμ€ λ‘λ©μ΄ λ©ν°μ€λ λ νκ²½μμ μ΄λ»κ² μμ νκ² μνλλμ§λ₯Ό λ€λ£Ήλλ€.
- μ€λͺ
:
- ν΄λμ€ λ‘λ©μ μλ°μ ν΄λμ€ λ‘λμ μν΄ κ΄λ¦¬λλ©°, λ©ν°μ€λ λ νκ²½μμλ μμ νκ² μνλλλ‘ μ€κ³λμ΄ μμ΅λλ€.
- ν΄λμ€ λ‘λ© κ³Όμ μμ λ°μν μ μλ race conditionμ λ°©μ§νκΈ° μν΄ λκΈ°ν λ©μ»€λμ¦μ μ¬μ©ν©λλ€.
- λ§ν¬: Java Concurrency in Practice on Amazon
- "Java Performance: The Definitive Guide" by Scott Oaks
- λ΄μ©: μ΄ μ± μ μλ° μ ν리μΌμ΄μ μ μ±λ₯ μ΅μ νλ₯Ό μν λ€μν κΈ°λ²μ μ€λͺ νλ©°, ν΄λμ€ λ‘λ©κ³Ό κ΄λ ¨λ μ±λ₯ μ΄μλ₯Ό λ€λ£Ήλλ€.
- μ€λͺ
:
- ν΄λμ€ λ‘λ©μ JVM μ±λ₯μ μ§μ μ μΈ μν₯μ λ―ΈμΉλ©°, ν¨μ¨μ μΈ ν΄λμ€ λ‘λ© μ λ΅μ μ ν리μΌμ΄μ μ μ±λ₯μ κ°μ ν μ μμ΅λλ€.
- **ν΄λμ€ λ°μ΄ν° 곡μ (Class Data Sharing, CDS)**μ κ°μ κΈ°λ²μ μ¬μ©νμ¬ ν΄λμ€ λ‘λ© μκ°μ μ€μ΄κ³ , λ©λͺ¨λ¦¬ μ¬μ©μ μ΅μ νν μ μμ΅λλ€.
- λ§ν¬: Java Performance on Amazon
'λΉ κ΅¬λ© μ±μ°κΈ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] λ©μλ μκ·Έλμ² Method Signature (0) | 2024.07.25 |
---|---|
[Java] μ¬λ³Όλ¦ λ νΌλ°μ€ Symbolic Reference (0) | 2024.07.25 |
[OOP][Java] κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°κ³Ό κ΄λ ¨λ λ λ²¨λ€ (0) | 2024.07.25 |
[OOP][Java] ν΄λμ€ λ 벨 vs κ°μ²΄ λ 벨 (0) | 2024.07.24 |
[Java] μλ° ν΄λμ€μμ main() λ©μλκ° staticμΌλ‘ μ μΈλλ μ΄μ /μ₯μ (1) | 2024.07.24 |