Java에서 개체 삭제

Rupam Yadav 2023년10월12일
  1. Java는 null을 참조하여 ‘객체’를 삭제합니다
  2. Java는null을 참조하여 범위에 제한된 객체를 삭제합니다
Java에서 개체 삭제

다음 예제에서는 Java에서 객체를 삭제하고 가비지 수집기를 사용하는 방법을 배웁니다.

Java는 null을 참조하여 ‘객체’를 삭제합니다

Java 객체 삭제의 첫 번째 예에서는 변수nameage를 초기화하는 생성자를 사용하여 클래스를 만듭니다. main 메소드에서는User 클래스의object가 생성되고nameage 값이 전달됩니다. 이제 객체가 초기화되었으므로이를 사용하여 age을 얻고 비교하여 메시지를 표시 할 수 있습니다. 그러나 그 후에는 더 이상 사용할 수 없도록myObject를 삭제하고 싶습니다.

이를 위해 myObject를 다시 한 번 초기화하지만 null로 초기화합니다. myObjectnull이면이를 사용하여 메서드 나 변수를 호출 할 수 없으며 그렇게하면 예외가 발생합니다. System.gc()는 남은 쓰레기를 수집하는 데 사용되므로 빈 필드 나 메모리를 확보하기 위해 남은 객체가 없습니다.

User 클래스에finalize()메소드가 있음을 알 수 있습니다. 가비지를 수집하기 전에 개체에서 호출되는 재정의 된 메서드입니다.

public class JavaDeleteObject {
  public static void main(String[] args) {
    User myObject = new User("John", 30);
    int userAge = myObject.age;

    if (userAge > 25) {
      System.out.println("User age is : " + userAge);
    } else {
      System.out.println("User age is less than 25 : " + userAge);
    }
    myObject = null;
    System.gc();

    System.out.println(myObject.age);
  }
}

class User {
  String name;
  int age;

  User(String n, int a) {
    name = n;
    age = a;
  }

  protected void finalize() {
    System.out.println("Object is garbage collected.");
  }
}

출력:

User age is : 30
Object is garbage collected.
Exception in thread "main" java.lang.NullPointerException
	at com.company.JavaDeleteObject.main(JavaDeleteObject.java:18)

Java는null을 참조하여 범위에 제한된 객체를 삭제합니다

아래 표시된 코드에는 클래스의 매개 변수화 된 생성자를 사용하여 값이 할당 된 세 개의 데이터 멤버가있는 Student클래스가 있습니다. showDetails()메소드와showNextIndex()메소드가 있습니다. 또한 다음 학생의 색인을 표시하는finalize()메소드가 있습니다.

Student 클래스의 새 객체는new 키워드를 사용하여 생성됩니다. Student 클래스 메서드는student1student2 객체에서 호출됩니다. 코드의 뒷부분에서 범위 내에 더 많은 Student클래스 개체를 만들었습니다. 사용 후System.gc()를 호출하여JVM이이 범위에서 생성 된 두 객체를 가비지 수집하도록 요청합니다.

nextIndex 값은 범위에 들어가기 전에3으로 증가하고 범위를 떠나기 전에5로 증가합니다. nextIndex 값을 감소시키기 위해 객체가 가비지 수집되기 전에5 값에System.runFinalization()을 두 번 사용하여finalize()메서드를 호출합니다.

그러면 범위 내에있는 값을 제외하고 올바른nextIndex 값이 표시됩니다.

class Student {
  private int index;
  private String name;
  private int age;
  private static int nextIndex = 1;

  Student(String name, int age) {
    this.name = name;
    this.age = age;
    this.index = nextIndex++;
  }

  public void showDetails() {
    System.out.println("Student at Index : " + index + ", Student name: " + name + ", age: " + age);
  }

  public void showNextIndex() {
    System.out.println("Next Index: " + nextIndex);
  }

  protected void finalize() {
    --nextIndex;
  }
}

class UseStudent {
  public static void main(String[] args) {
    Student student1 = new Student("John", 23);
    Student student2 = new Student("Doe", 20);
    student1.showDetails();
    student2.showDetails();
    student1.showNextIndex();
    student2.showNextIndex();
    {
      Student student3 = new Student("Sam", 22);
      Student student4 = new Student("Ben", 21);
      student3.showDetails();
      student4.showDetails();
      student3.showNextIndex();
      student4.showNextIndex();

      student3 = student4 = null;
      System.gc();
      System.runFinalization();
    }
    student2.showNextIndex();
  }
}

출력:

Student at Index : 1, Student name: John, age: 23
Student at Index : 2, Student name: Doe, age: 20
Next Index: 3
Next Index: 3
Student at Index : 3, Student name: Sam, age: 22
Student at Index : 4, Student name: Ben, age: 21
Next Index: 5
Next Index: 5
Next Index: 3
작가: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

관련 문장 - Java Object