λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java][JVM][OOP] μžλ°” λ©”λͺ¨λ¦¬ ꡬ쑰 + 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°œλ… 지원

좜처

Gemini

ChatGPT


μžλ°” λ©”λͺ¨λ¦¬ ꡬ쑰

μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ, JVM(Java Virtual Machine)은 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μ•„ 이λ₯Ό μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•œλ‹€. 각 μ˜μ—­μ€ κ³ μœ ν•œ λͺ©μ μœΌλ‘œ 가지며 ν”„λ‘œκ·Έλž¨ 싀행에 ν•„μš”ν•œ 데이터λ₯Ό μ €μž₯ν•˜λŠ”μ—­ν• μ„ ν•œλ‹€.

μžλ°” λ©”λͺ¨λ¦¬ λͺ¨λΈμ€ JVM κ΅¬ν˜„μ— 따라 λ‹€μ†Œ 차이가 μžˆμ„ 수 μžˆλ‹€.

 

μžλ°”μ˜ λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP) κ°œλ…μ„ 효율적으둜 μ§€μ›ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆλ‹€. μžλ°”λŠ” 객체 지ν–₯ μ–Έμ–΄λ‘œμ„œ 객체와 클래슀의 κ°œλ…μ„ μ€‘μ‹¬μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λ©°, 이와 같은 ꡬ쑰λ₯Ό 효과적으둜 μ§€μ›ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬ 관리λ₯Ό μ„€κ³„ν–ˆλ‹€.

 

μ£Όμš” λ©”λͺ¨λ¦¬ μ˜μ—­

1. Method Area λ©”λͺ¨λ¦¬ μ˜μ—­

ν΄λž˜μŠ€μ™€ κ΄€λ ¨λœ 메타데이터λ₯Ό μ €μž₯ν•œλ‹€. 클래슀 정보, λ©”μ†Œλ“œ, 정적 λ³€μˆ˜(static variables), μƒμˆ˜ ν’€(Constant Pooll)등을 μ €μž₯ν•˜λŠ” μ˜μ—­.

JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λ©°, ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€.

static λ³€μˆ˜, μƒμˆ˜, μΈν„°νŽ˜μ΄μŠ€ 등이 이 μ˜μ—­μ— μ €μž₯λœλ‹€.

λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” 곡간이닀.

  • PermGen μ˜μ—­ : Java 8  이전 λ²„μ „μ—μ„œλŠ” Perm μ˜μ—­μ΄ λ©”μ†Œλ“œ μ˜μ—­μ„ κ΄€λ¦¬ν–ˆμ§€λ§Œ, Java 8λΆ€ν„°λŠ” Metaspace둜 λ³€κ²½λ˜μ—ˆλ‹€. MetaspaceλŠ” Native λ©”λͺ¨λ¦¬λ₯΄ μ‚¬μš©ν•΄ 더 μœ μ—°ν•œ λ©”λͺ¨λ¦¬ 관리λ₯Ό μ œκ³΅ν•œλ‹€.

객체 지ν–₯ κ°œλ…κ³Όμ˜ μ—°κ΄€μ„±

  • 클래슀 λ‘œλ”©: 클래슀 λ‘œλ”(Class Loader)에 μ˜ν•΄ ν΄λž˜μŠ€κ°€ λ‘œλ“œλ˜κ³ , κ·Έ 메타데이터가 λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯λœλ‹€.
  • 정적 멀버 : 정적 λ©”μ„œλ“œμ™€ λ³€μˆ˜λŠ” λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯λ˜μ–΄ 클래슀 μˆ˜μ€€μ—μ„œ κ³΅μœ λœλ‹€.

μž₯점

  • ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œμ˜ 메타데이터λ₯Ό μ€‘μ•™μ—μ„œ κ΄€λ¦¬ν•˜μ—¬ 효율적으둜 μ ‘κ·Όν•  수 μžˆλ‹€.
  • 정적 λ³€μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•΄ ν”„λ‘œκ·Έλž¨μ˜ 일관성을 μœ μ§€ν•œλ‹€.

단점

  • λ©”μ„œλ“œ μ˜μ—­μ˜ 크기가 μ œν•œμ μ΄λ©°, λ§Žμ€ ν΄λž˜μŠ€κ°€ λ‘œλ“œλ˜λ©΄ λ©”λͺ¨λ¦¬ λΆ€μ‘± 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€.

예

public class Example {
    // λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯λ˜λŠ” 정적 λ³€μˆ˜
    static int staticVariable = 10;
    
    public static void staticMethod() {
        // λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯λ˜λŠ” 정적 λ©”μ„œλ“œ
    }
}

 

2. Heap νž™ μ˜μ—­

객체 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” 곡간이닀.

new μ—°μ‚°μžλ₯Ό 톡해 μƒμ„±λœ 객체듀(λ°°μ—΄ 포함)은 λͺ¨λ‘ νž™ μ˜μ—­μ— ν• λ‹Ήλœλ‹€.

Garbage Collector(GC)에 μ˜ν•΄ κ΄€λ¦¬λ˜λ©°, 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” κ°μ²΄λŠ” μžλ™μœΌλ‘œ νšŒμˆ˜λœλ‹€.

νž™ μ˜μ—­μ€ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ™μ μœΌλ‘œ 변경될 수 μžˆλ‹€.

ꡬ쑰적으둜 큰 λ©”λͺ¨λ¦¬ 곡간을 가진닀.

 

객체 지ν–₯ κ°œλ…κ³Όμ˜ μ—°κ΄€μ„±

  • 객체와 클래슀: 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λͺ¨λ“  λ°μ΄ν„°λŠ” 객체 ν˜•νƒœλ‘œ ν‘œν˜„λ˜λ©°, κ°μ²΄λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€.
  • μΈμŠ€ν„΄μŠ€ : 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯되고, μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€κ°€ μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆλ‹€.

 

νŠΉμ§•

1. λ©”λͺ¨λ¦¬ ν• λ‹Ή 및 ν•΄μ œ

  • 동적 ν• λ‹Ή : 객체가 μƒμ„±λ˜λ©΄ νž™μ— λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœλ‹€.
  • 가비지 μ»¬λž™μ…˜(Garbage Collection) : μ‚¬μš©λ˜μ§€ μ•ŠλŠ” κ°μ²΄λŠ” μžλ™μœΌλ‘œλ©”λͺ¨λ¦¬κ°€ ν•΄μ œλœλ‹€. μ΄λŠ” Java의 μ€‘μš”ν•œ λ©”λͺ¨λ¦¬ 관리 κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ, κ°œλ°œμžκ°€ 직접 λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό 관리할 ν•„μš”λŠ” μ—†λ‹€.

2. 데이터 μ €μž₯

  • 객체와 λ°°μ—΄ : λͺ¨λ“  객체와 배열은 νž™μ— μ €μž₯λœλ‹€. 객체가 ν¬ν•¨ν•˜λŠ” λ‹€λ₯Έ 객체듀(쀑첩 객체)도 λͺ¨λ‘ νž™μ— μ €μž₯λœλ‹€.

3. λ²”μœ„

  • μ „μ—­ λ²”μœ„ : νž™μ— μ €μž₯된 λ°μ΄ν„°λŠ” μ• ν”Œλ¦¬κ²Œμ΄μ…˜μ˜ 전체 수λͺ… λ™μ•ˆ μœ νš¨ν•˜λ‹€. 즉, μ „μ—­μ μœΌλ‘œ 접근이 κ°€λŠ₯ν•˜λ‹€.

4. Thread-Safe μ•„λ‹˜

  • νž™μ€ μ—¬λŸ¬ μŠ€λ ˆλ“œ 간에 κ³΅μœ λ˜λ―€λ‘œ, μ μ ˆν•œ 동기화 없이 μŠ€λž˜λ“œμ— μ•ˆμ „ν•˜μ§€ μ•Šλ‹€. λ”°λΌμ„œ λ™μ‹œμ„± 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ κ°œλ°œμžκ°€ 직접 μŠ€λ ˆλ“œ 동기화 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€.

 

예

public class HeapExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30); // νž™μ— μ €μž₯λ˜λŠ” 객체
        person.displayInfo();
    }
}

class Person {
    String name; // μ°Έμ‘° λ³€μˆ˜
    int age;     // κΈ°λ³Έ 데이터 νƒ€μž…

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

 

  • 'Person' κ°μ²΄λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€. 
  • 객체의 λ©€λ²„λ³€μˆ˜ 'name'κ³Ό 'age' μ—­μ‹œ νž™μ— μ €μž₯λœλ‹€.

νž™μ˜ ν•œκ³„

  • λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 증가 : λ§Žμ€ 객체λ₯Ό μƒμ„±ν•˜λ©° νž™ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•œλ‹€. λ©”λͺ¨λ¦¬ λˆ„μˆ˜(memory leak)κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.
  • 가비지 μ»¬λ ‰μ…˜ μ˜€λ²„ν—€λ“œ : 가비지 μ»¬λ ‰μ…˜μ΄ μ‹€ν–‰λ˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ  수 μžˆλ‹€. 특히 νž™ λ©”λͺ¨λ¦¬κ°€ ν¬κ±°λ‚˜ 각비지 μ»¬λ ‰μ…˜μ΄ 빈번히 μΌμ–΄λ‚˜λŠ” 경우 μ΄λŸ¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. 

3. Stack μŠ€νƒ μ˜μ—­

λ©”μ„œλ“œ 호좜 μ‹œλ§ˆλ‹€ μŠ€νƒ ν”„λ ˆμž„(stack frames)이 μƒμ„±λ˜λŠ” μ˜μ—­μ΄λ‹€.

μŠ€νƒ ν”„λ ˆμž„μ—λŠ” 지역 λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ μ£Όμ†Œ 등이 μ €μž₯λœλ‹€.

λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ΄ ν•΄μ œλœλ‹€.

μŠ€νƒ μ˜μ—­μ€ LIFO(Last In First Out) λ°©μ‹μœΌλ‘œ κ΄€λ¦¬λœλ‹€.

각 μŠ€λ ˆλ“œλŠ” μžμ‹ μ˜ μŠ€νƒ λ©”λͺ¨λ¦¬λ₯Ό 가지고 μžˆλ‹€.

 

객체 지ν–₯ κ°œλ…κ³Όμ˜ μ—°κ΄€μ„±

  • λ©”μ„œλ“œ 호좜과 μ‹€ν–‰: 객체의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ–„ μŠ€νƒ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•΄ μ‹€ν–‰ ν™˜κ²½μ„ κ΅¬μ„±ν•œλ‹€.
  • 지역 λ³€μˆ˜ : λ©”μ„œλ“œμ˜ 지역 λ³€μˆ˜λŠ” μŠ€νƒ λ©”λͺ¨λ¦¬μ— μ €μž₯되며, λ©”μ„œλ“œ μ’…λ£Œ μ‹œ μžλ™μœΌλ‘œ ν•΄μ œλœλ‹€.

 

νŠΉμ§•

1. λ©”λͺ¨λ¦¬ ν• λ‹Ή 및 ν•΄μ œ

  • μžλ™ 관리 : λ©”μ†Œλ“œκ°€ 호좜되면 λ©”λͺ¨λ¦¬κ°€ μžλ™μœΌλ‘œ ν• λ‹Ήλ˜κ³ , λ©”μ†Œλ“œ 싀행이 λλ‚˜λ©΄ λ©”λͺ¨λ¦¬κ°€ μžλ™μœΌλ‘œ ν•΄μ œλœλ‹€.
  • λΉ λ₯Έ μ ‘κ·Ό : μŠ€νƒμ€ LIFO κ΅¬μ‘°μ΄λ―€λ‘œ κ°€μž₯ λ§ˆμ§€λ§‰μ— μΆ”κ°€λœ 데이터에 λŒ€ν•œ 접근이 λΉ λ₯΄λ‹€

2. 데이터 μ €μž₯

  • ν”„λ¦¬λ―Έν‹°λΈŒ νƒ€μž… : int, double, boolean λ“±μ˜ κΈ°λ³Έ 데이터 νƒ€μž…μ€ μŠ€νƒμ— 직접 μ €μ•„λœλ‹€.
  • μ°Έμ‘° λ³€μˆ˜ : 객체의 μ°Έμ‘°κ°€ μŠ€νƒμ— μ €μž₯되며, μ‹€μ œ 객체 λ°μ΄ν„°λŠ” νž™μ— μ €μž₯λœλ‹€.

3. λ²”μœ„

  • 블둝 레벨 : λ³€μˆ˜μ˜ 유효 λ²”μœ„λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€. 블둝을 λ²—μ–΄λ‚˜λ©΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλœλ‹€.

4. Thread-Safe

  • 각 μŠ€λ ˆλ“œλŠ” μ‚¬μ§„μ˜ μŠ€νƒμ„ 가지고 μžˆμœΌλ―€λ‘œ, λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ κ³΅μœ λ˜μ§€ μ•Šμ•„ 기본적으둜 μŠ€λ ˆλ“œ μ•ˆμ „ν•˜λ‹€

μ˜ˆμ‹œ

public class StackExample {
    public static void main(String[] args) {
        int number = 10; // μŠ€νƒμ— μ €μž₯λ˜λŠ” κΈ°λ³Έ 데이터 νƒ€μž…
        String text = "Hello"; // μŠ€νƒμ— μ €μž₯λ˜λŠ” μ°Έμ‘° νƒ€μž…
        printNumber(number); // λ©”μ†Œλ“œ 호좜둜 μƒˆλ‘œμš΄ μŠ€νƒ ν”„λ ˆμž„ 생성
    }

    public static void printNumber(int num) {
        System.out.println(num);
    }
}
  • 'number' λ³€μˆ˜λŠ” μŠ€νƒμ— μ €μž₯λœλ‹€.
  • 'printNuber' λ©”μ†Œλ“œ 호좜 μ‹œ μƒˆλ‘œμš΄ μŠ€νƒ ν”„λ ˆμž„μ΄ μƒμ„±λ˜μ–΄ 'num' λ§€κ°œλ³€μˆ˜κ°€ κ·Έ μŠ€νƒ ν”„λ ˆμž„μ— μ €μž₯λœλ‹€.

μŠ€νƒμ˜ ν•œκ³„

  • ν•œμ •λœ 크기 : μŠ€νƒ λ©”λͺ¨λ¦¬λŠ” ν•œμ •λœ 크기λ₯Ό 가지며, λ„ˆλ¬΄ κΉŠμ€ μž¬κ·€ ν˜ΈμΆœμ΄λ‚˜ λ§Žμ€ 둜컬 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, 'StackOverflowError'κ°€ λ°œμƒν•  수 μžˆλ‹€.

4. Native Method Stack λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ

Java μ½”λ“œμ—μ„œ native ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λ˜λŠ” μ˜μ—­μ΄λ‹€.

λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλŠ” λ‹€λ₯Έ μ–Έμ–΄(C, C++)둜 μž‘μ„±λœ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°μ— μ‚¬μš©λœλ‹€.

JNI(Java Native Interface)λ₯Ό 톡해 λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, 이 μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œμ˜ 호좜 정보와 κ΄€λ ¨λœ 데이터λ₯Ό μ €μž₯ν•œλ‹€.

 

객체 지ν–₯ κ°œλ…κ³Όμ˜ μ—°κ΄€μ„±

  • μžλ°”λŠ” μˆœμˆ˜ν•œ 객체 지ν–₯ μ–Έμ–΄λ‘œ μ„€κ³„λ˜μ—ˆμ§€λ§Œ, μ‹œμŠ€ν…œ μˆ˜μ€€μ˜ μž‘μ—…μ΄λ‚˜ μ„±λŠ₯ ν–₯상을 μœ„ν•΄ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œκ°€ ν•„μš”ν•  λ•Œ 이 μŠ€νƒμ„ μ‚¬μš©ν•œλ‹€.

μž₯점

  • λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό 효율적으둜 μ‹€ν–‰ν•  수 μžˆμ–΄, μ„±λŠ₯ ν–₯상 및 μ‹œμŠ€ν…œ μžμ›μ— λŒ€ν•œ 접근이 κ°€λŠ₯ν•˜λ‹€.

단점

  • λ„€μ΄ν‹°λΈŒ λ©”μŠ€λ“œλŠ” JVM의 λ©”λͺ¨λ¦¬ 관리와 λ‹€λ₯΄κ²Œ λ™μž‘ν•  수 있으며, λ²„κ·Έλ‚˜ λ³΄μ•ˆ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

5. Program Counter Register ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„° λ ˆμ§€μŠ€ν„°

ν˜„μž¬ μ‹€ν–‰ 쀑인 JVM λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ ˆμ§€μŠ€ν„°μ΄λ‹€.

각 μŠ€λ ˆλ“œλ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜λ©°, μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 쀑인 λͺ…λ Ήμ–΄λŠ” μΆ”μ ν•œλ‹€.

 

객체 지ν–₯ κ°œλ…κ³Όμ˜ μ—°κ΄€μ„±

PC λ ˆμ§€μŠ€ν„°λŠ” 객체 지ν–₯의 직접적인 κ΅¬ν˜„κ³Ό 관련은 μ—†μ§€λ§Œ, JVM의 λͺ…λ Ήμ–΄ 싀행을 좔적해 객체 λ©”μ„œλ“œ ν˜ΈμΆœμ„ κ΄€λ¦¬ν•œλ‹€.

μž₯점

μŠ€λ ˆλ“œ κ°„μ˜ μ‹€ν–‰ 흐름을 관리해 λ©€ν‹°μŠ€λ ˆλ”©μ„ μ§€μ›ν•œλ‹€.

단점

νŠΉμ • λͺ…λ Ήμ–΄ μ‹€ν–‰ μ‹œμ μ—μ„œλ§Œ μ‚¬μš©λ˜λ©°, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ€ 맀우 μž‘λ‹€

각 μ˜μ—­μ˜ μ—­ν• κ³Ό νŠΉμ§•

μ˜μ—­ μ„€λͺ…

Method Area 클래슀 정보 μ €μž₯, static λ³€μˆ˜, μƒμˆ˜ λ“±
Heap 객체 μΈμŠ€ν„΄μŠ€ μ €μž₯, GC 관리
Stack  λ©”μ„œλ“œ 호좜 μ‹œ μŠ€νƒ ν”„λ ˆμž„ 생성, 지역 λ³€μˆ˜, λ§€κ°œλ³€μˆ˜ μ €μž₯
Native Mathod Stack λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ 호좜 μ‹œ μ‚¬μš©
Program Counter Register  ν˜„μž¬ μ‹€ν–‰ 쀑인 λͺ…λ Ήμ–΄ μ£Όμ†Œ μ €μž₯

 

μŠ€νƒκ³Ό νž™μ˜ 차이점

νŠΉμ§• μŠ€νƒ Stack νž™ Heap
μ €μž₯ ꡬ쑰 LIFO ꡬ쑰 (Last-In-First-Out) 동적 ꡬ쑰(Dynamic Allocation)
μ €μž₯ 데이터 κΈ°λ³Έ νƒ€μž…, μ°Έμ‘° λ³€μˆ˜ 객체, λ°°μ—΄
λ©”λͺ¨λ¦¬ ν• λ‹Ή μžλ™(λ©”μ†Œλ“œ 호좜 μ‹œ) μˆ˜λ™(new ν‚€μ›Œλ“œλ₯Ό 톡해 객체 생성 μ‹œ)
λ©”λͺ¨λ¦¬ ν•΄μ œ μžλ™(λ©”μ†Œλ“œ μ’…λ£Œ μ‹œ) 가비지 μ»¬λ ‰μ…˜μ— μ˜ν•΄ μžλ™ ν•΄μ œ
λ²”μœ„ 블둝 래벨 (지역 λ³€μˆ˜) 전역적 λ²”μœ„(객체 μ „μ—­ μ ‘κ·Ό κ°€λŠ₯)
μŠ€λ ˆλ“œ μ•ˆμ „μ„± μŠ€λ ˆλ“œ μ•ˆμ „(각 μŠ€λ ˆλ“œμ— κ°œλ³„ ν• λ‹Ή) μŠ€λ ˆλ“œ μ•ˆμ „ν•˜μ§€ μ•ŠμŒ(μ—¬λŸ¬ μŠ€λ ˆλ“œ κ°„ 곡유됨)
μ„±λŠ₯ λΉ λ₯Έ μ ‘κ·Ό(κ³ μ • 크기, 지역적 데이터) μƒλŒ€μ μœΌλ‘œ 느림(동적 ν• λ‹Ή, 전역적 데이터)
크기 μ œν•œμ (μŠ€νƒ μ˜€λ²„ν”ŒλŸ¬μš° λ°œμƒ κ°€λŠ₯) μƒλŒ€μ μœΌλ‘œ 큼(νž™ λ©”λͺ¨λ¦¬ λΆ€μ‘± κ°€λŠ₯)

 

μžλ°” λ©”λͺ¨λ¦¬ ꡬ쑰의 μƒν˜Έ μž‘μš©

객체 생성과 λ©”μ„œλ“œ 호좜

1. 객체 생성

  • 클래슀λ₯Ό 톡해 객체λ₯Ό μƒμ„±ν•˜λ©΄, ν•΄λ‹Ή κ°μ²΄λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€.
  • 클래슀의 λ©”νƒ€λ°μ΄ν„°λŠ” 이미 λ©”μ„œλ“œ μ˜μ—­μ— λ‘œλ“œλ˜μ–΄ 있으며, 이 정보λ₯Ό 톡해 객체의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ νž™μ— ν• λ‹Ήλœλ‹€.

2. λ©”μ„œλ“œ 호좜

  • λ©”μ„œλ“œ 호좜 μ‹œ, μŠ€νƒμ— μƒˆλ‘œμš΄ ν”„λ ˆμž„μ΄ μƒμ„±λ˜κ³  λ©”μ„œλ“œμ˜ 싀행에 ν•„μš”ν•œ 지역 λ³€μˆ˜κ°€ μ €μž₯λœλ‹€.
  • λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜λ©΄μ„œ 객체의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 있으며, νž™μ— μ €μž₯된 객체의 데이터λ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.

정적 λ³€μˆ˜μ™€ λ©”μ„œλ“œ

  • 정적 λ³€μˆ˜μ™€ λ©”μ„œλ“œλŠ” λ©”μ„œλ“œ μ˜μ—­μ— μ €μž₯되며, 클래슀 μˆ˜μ€€μ—μ„œ κ΄€λ¦¬λœλ‹€.
  • λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•  수 있으며, μΈμŠ€ν„΄μŠ€κ°€ 없어도 클래슀 이름을 톡해 μ ‘κ·Όν•  수 μžˆλ‹€.

λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ 호좜

  • λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλŠ” μžλ°”μ˜ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒμ„ μ‚¬μš©ν•΄ μ‹€ν–‰λœλ‹€.
  • JNIλ₯Ό 톡해 λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, μžλ°” 객체의 νž™ λ©”λͺ¨λ¦¬μ— μžˆλŠ” 데이터λ₯Ό λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œμ— 전달할 수 μžˆλ‹€.

 

λ©”λͺ¨λ¦¬ 관리

  • Garbage Collector : νž™ μ˜μ—­μ—μ„œ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜
  • Stack Overflow : μŠ€νƒ μ˜μ—­μ΄ 가득 μ°¨μ„œ 더 이상 μƒˆλ‘œμš΄ μŠ€νƒ ν”„λ ˆμž„μ„ 생성할 수 μ—†λŠ” 경우 λ°œμƒν•˜λŠ” μ—λŸ¬. λ¬΄ν•œ μž¬κ·€ ν˜ΈμΆœμ΄λ‚˜ λ„ˆλ¬΄ λ§Žμ€ 지역 λ³€μˆ˜ μ‚¬μš©μ΄ 원인이 될 수 μžˆλ‹€.
  • OutOfMemoryError : 힘 μ˜μ—­μ— 더 이상 객체λ₯Ό ν• λ‹Ήν•  곡간이 없을 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬. λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‚˜ λ„ˆλ¬΄ 큰 객체 생성이  원인이 될 수 μžˆλ‹€.