
객체가 생성되고, 최종적으로 소멸되기까지의 과정을 객체의 생명주기라고 한다.
프로그램이 실행을 하게 되면 프로그램 내부의 객체, 변수, 코드 등은 메모리에 저장이 되게 된다.
public class MyClass {
// 생성자: 객체가 생성될 때 호출되는 메서드
public MyClass() {
System.out.println("Object is created.");
}
// 초기화 메서드
public void initialize() {
System.out.println("Object is initialized.");
}
// 사용 메서드
public void performOperation() {
System.out.println("Object is performing an operation.");
}
// 소멸자: 객체가 소멸될 때 호출되는 메서드
@Override
protected void finalize() throws Throwable {
System.out.println("Object is being destroyed.");
}
public static void main(String[] args) {
// 객체 생성
MyClass myObject = new MyClass();
// 초기화
myObject.initialize();
// 사용
myObject.performOperation();
// 객체가 더 이상 필요하지 않을 때, 소멸
myObject = null;
System.gc(); // 가비지 컬렉터 호출
}
}
예시를 보면 객체가 생성되면서 생성자가 호출이되고, 초기화 매서드를 호출해서 초기화 작업이 이루어지며, 사용 메서드를 통해서 객체가 작업을 수행하게 된다. 그리고 'myObject = null;'을 통해서 객체에 대한 참조가 해제되고 가비지 컬렉터에 의해 더이상 참조되지 않는 객체를 메모리에서 해제하게 된다.
public class StackExample {
public static void main(String[] args) {
int result = addNumbers(3, 4);
System.out.println("Result: " + result);
}
public static int addNumbers(int a, int b) {
int sum = a + b; // 지역 변수 sum 선언
int result = multiplyByTwo(sum); // 다른 함수 호출
return result;
}
public static int multiplyByTwo(int num) {
int result = num * 2; // 지역 변수 result 선언
return result;
}
}
예시를 보면서 정리를 해보면
1. main 메서드가 호출
main 메서드의 스택프레임(1층)이 쌓인다. 2. addNumbers 메서드를 호출
addNumbers 메서드의 스택프레임(2층)이 쌓인다.multiplyByTwo 메서드를 호출한다.3. multiplyByTwo 메서드 호출
multiplyByTwo 메서드의 스택프레임(3층)이 쌓인다.4. multiplyByTwo 메서드 제거
multiplyByTwo 메서드의 값이 return 된 이후 해당 스택프레임이 제거된다.5. addNumbers 메서드 제거
addNumbers 메서드의 데이터를 return 하고 해당 프레임 제거.6. main 메서드 제거
main 메서드에서 최종적으로 계산된 result 값은 출력하고 스택프레임 제거가 된다.public class HeapExample {
public static void main(String[] args) {
// 객체 생성: 힙에 메모리가 할당됨
MyClass obj1 = new MyClass("Object 1");
// 다른 객체 생성: 새로운 힙 메모리가 할당됨
MyClass obj2 = new MyClass("Object 2");
}
}
class MyClass {
private String data;
// 생성자
public MyClass(String data) {
this.data = data;
System.out.println(data + " is created.");
}
}
/* 실행결과
Object 1 is created.
Object 2 is created.
*/
(new MyClass("Object 1"))MyClass의 객체가 생성될 때, 힙에 해당 객체의 인스터스가 저장된다.Object 1이 힙에 저장된다.(new MyClass("Object 2"))힙에 저장된 메모리는 가비지 컬렉터에 의해 관리가 되며, 더 이상 참조되지 않는 객체는 자동으로 해제 처리 된다. 객체의 생명주기는 참조에 따라 동적으로 변하고, 이렇게 되면 메모리 누수를 방지하고, 프로그램이 효율적으로 동작 하도록 할수 있다.