자바의 객체 생명주기는 객체가 생성되고 사용되다가 더 이상 필요 없어져서 메모리에서 제거되는 과정이다. 이 과정은 다음 단계로 이루어진다: 객체 생성, 객체 사용, 객체 정리, 객체 소멸.
객체는 new
키워드를 사용하여 생성된다. 이때 생성자는 객체 초기화를 담당하며, 필요에 따라 기본 생성자와 매개변수를 받는 생성자가 정의될 수 있다.
public class Car {
private String model;
// 기본 생성자
public Car() {
this.model = "Unknown";
}
// 매개변수를 받는 생성자
public Car(String model) {
this.model = model;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car(); // 기본 생성자 호출
Car car2 = new Car("Tesla"); // 매개변수를 받는 생성자 호출
System.out.println(car1.getModel()); // 출력: Unknown
System.out.println(car2.getModel()); // 출력: Tesla
}
}
생성된 객체는 다양한 메서드를 호출하여 사용된다. 객체의 필드에 접근하거나 메서드를 호출하여 필요한 작업을 수행할 수 있다.
public class Main {
public static void main(String[] args) {
Car car = new Car("Toyota");
car.setModel("Honda");
System.out.println(car.getModel()); // 출력: Honda
}
}
객체가 더 이상 필요 없게 되면, 객체는 가비지 컬렉터에 의해 정리된다. 개발자는 객체를 명시적으로 정리할 수 없고, 가비지 컬렉션은 자동으로 수행된다.
객체가 가비지 컬렉션의 대상이 되면, 객체의 소멸자가 호출된다. 자바에서는 finalize 메서드를 통해 객체 소멸 시 추가 작업을 정의할 수 있다. 하지만 finalize 메서드는 사용을 권장하지 않으며, 대신 try-with-resources 구문이나 명시적인 자원 해제를 사용하는 것이 좋다.
public class Resource {
// 자원 정리 메서드
public void close() {
System.out.println("Resource closed.");
}
// finalize 메서드 (사용 권장하지 않음)
@Override
protected void finalize() throws Throwable {
try {
close();
} finally {
super.finalize();
}
}
}
public class Main {
public static void main(String[] args) {
Resource resource = new Resource();
resource = null; // 객체를 null로 설정하여 가비지 컬렉션의 대상이 되도록 함
// 가비지 컬렉션 강제 호출 (테스트 목적으로만 사용)
System.gc();
}
}
자바의 객체 생명주기는 객체 생성, 사용, 정리, 소멸의 과정을 거친다. 객체는 new 키워드로 생성되고, 생성자에서 초기화되며, 다양한 메서드로 사용된다. 객체가 더 이상 필요 없을 때는 가비지 컬렉터가 자동으로 정리하며, finalize 메서드는 소멸 시 추가 작업을 수행할 수 있으나 사용이 권장되지 않는다. 대신 자원 정리는 try-with-resources나 명시적인 자원 해제를 통해 관리하는 것이 좋다.