package CHAPTER05;

class Person3 {
    String name;

    Person3(String name) {
        this.name = name;
    }
}
public class C5_27_ObjectReference1 {
    public static void main(String[] args) {
        
        // Person3 타입의 참조 변수 p 선언 후, "낙수"라는 이름을 가진 Person3 객체 생성
        // 생성된 객체는 힙(Heap) 메모리에 할당되고, 참조 변수 p가 해당 객체를 가리킴
        Person3 p = new Person3("낙수"); 
        
        // 현재 참조하고 있는 객체의 name 필드와 객체의 고유 hashCode() 출력
        // hashCode()는 객체의 메모리 주소를 기반으로 생성된 정수 값(객체 식별용)
        System.out.println(p.name + p.hashCode()); 
        
        // 새로운 Person3 객체("진부연")를 생성하여 p가 이 객체를 참조하도록 변경
        // 이 시점에서 기존 "낙수" 객체는 더 이상 참조되지 않으므로 가비지 컬렉션(GC)의 대상이 됨
        p = new Person3("진부연");  
       
        // 참조 변수가 새롭게 가리키는 객체의 name 필드와 hashCode() 출력
        // "낙수" 객체와는 다른 메모리 공간에 있는 "진부연" 객체의 정보가 출력됨
        System.out.println(p.name + p.hashCode()); 
    }
}
