class vs object vs array

moon.kick·2025년 2월 19일
0
/ 프로젝트 루트
│   ├── 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 대상
    }
}

코드 설명:

  1. Test 클래스에는 int a 변수와 aa() 메서드가 정의됨.
  2. main() 메서드에서 Test 객체를 생성하고 변수 및 메서드를 호출함.
  3. Test 객체를 저장하는 배열을 생성하여 각각의 인덱스에 새로운 객체를 할당함.
  4. arr[0]a 값을 변경하고 aa() 메서드를 호출함.
  5. arr[0] = arr[1]; 실행 시, arr[0]이 참조하던 객체는 다른 참조가 없으므로 가비지 컬렉션 대상이 됨.

네, 맞습니다! Test[] arr = new Test[3];를 실행한 후에, arr 배열에는 Test 객체를 저장할 3개의 공간(메모리 주소)이 생성됩니다. 다만, new Test[3]은 단순히 Test 객체를 저장할 배열을 할당하는 것이지, 객체를 즉시 생성하는 것은 아닙니다.

객체 생성 과정:

  1. 배열만 생성됨 (객체는 없음)

    Test[] arr = new Test[3]; 
    • arr 배열이 생성되지만, 아직 null 값만 들어 있음.
    arr[0] = null
    arr[1] = null
    arr[2] = null
  2. 각 배열 요소에 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]이 가리키던 객체는 가비지 컬렉션 대상이 됨. 연결이 끊어짐.
profile
@mgkick

0개의 댓글