/ 프로젝트 루트
│ ├── Test.java
│ ├── /Test(object) =t (Test 객체 변수지정)
│ │ ├── a (변수)
│ │ ├── aa (메서드)
│ │ ├── Test (array) (같은이름의 객체이지만 얘는 배열인것이야)
│ │ │ ├── [0] → Test 객체 (가비지 컬렉션 대상 가능)
│ │ │ ├── [1] → Test 객체 (이름이 같은 3개의 Test객체들임)
│ │ │ ├── [2] → Test 객체
Test.java: Test 클래스 정의./Test: t라는 Test 객체가 생성된 공간./Test: Test라는 배열을 저장하는 공간.arr[0], arr[1], arr[2]: 각각 Test 3행 배열arr[0] = arr[1]; 실행 후, 원래 arr[0]이 참조하던 객체는 가비지 컬렉션 대상.코드
class Test { // 클래스 선언
int a; // 인스턴스 변수
public void aa() { // 메서드 선언
System.out.println("Method aa() called.");
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성
Test t = new Test();
t.a = 10;
t.aa();
// 배열 선언 및 객체 할당
Test[] arr = new Test[3]; // 주소 공간 3개 할당
arr[0] = new Test();
arr[1] = new Test();
arr[2] = new Test();
// 객체 값 변경
arr[0].a = 50;
arr[0].aa();
// 주소 복사 및 가비지 컬렉션 대상 생성
arr[0] = arr[1]; // arr[0]의 기존 객체는 GC 대상
}
}
Test 클래스에는 int a 변수와 aa() 메서드가 정의됨.main() 메서드에서 Test 객체를 생성하고 변수 및 메서드를 호출함.Test 객체를 저장하는 배열을 생성하여 각각의 인덱스에 새로운 객체를 할당함.arr[0]의 a 값을 변경하고 aa() 메서드를 호출함.arr[0] = arr[1]; 실행 시, arr[0]이 참조하던 객체는 다른 참조가 없으므로 가비지 컬렉션 대상이 됨.네, 맞습니다! Test[] arr = new Test[3];를 실행한 후에, arr 배열에는 Test 객체를 저장할 3개의 공간(메모리 주소)이 생성됩니다. 다만, new Test[3]은 단순히 Test 객체를 저장할 배열을 할당하는 것이지, 객체를 즉시 생성하는 것은 아닙니다.
배열만 생성됨 (객체는 없음)
Test[] arr = new Test[3];
arr 배열이 생성되지만, 아직 null 값만 들어 있음.arr[0] = null
arr[1] = null
arr[2] = null
각 배열 요소에 Test 객체를 할당
arr[0] = new Test();
arr[1] = new Test();
arr[2] = new Test();
arr[0], arr[1], arr[2] 각각이 새로운 Test 객체를 참조함.arr[0] → Test 객체 @주소1
arr[1] → Test 객체 @주소2
arr[2] → Test 객체 @주소3
arr[0], arr[1], arr[2])는 서로 독립적인, 이름만 같은 각각의 Test 객체를 가리키고 있음.Test 객체가 3개 생성된 것이 맞음.arr[0] = arr[1];을 하면 arr[0]이 기존 객체(주소1)를 버리고 arr[1]과 같은 객체(주소2)를 가리키게 되면서 원래 arr[0]이 가리키던 객체는 가비지 컬렉션 대상이 됨. 연결이 끊어짐.