class Tv { // Tv의 멤버변수 String color; boolean power; int channel; // Tv의 메서드 void power() { power = ! power; } void channelUp() { ++channel; } void channelDown() { --channel; } } public class TvTest { public static void main(String[] args) { Tv t1 = new Tv(); // Tv = t1; t1 = new Tv(); 한문장으로 표현 Tv t2 = new Tv(); System.out.println("t1의 채널은 " + t1.channel + "입니다."); System.out.println("t2의 채널은 " + t2.channel + "입니다."); t1.channel = 7; t2.channel = 8; System.out.println("t1의 채널은 " + t1.channel + "입니다."); System.out.println("t2의 채널은 " + t2.channel + "입니다."); t2 = t1; // t1이 저장하고 있는 값(주소)를 t2에 저장한다. t1.channelDown(); // t1에 저장되어 있는 주소(객체) 값이 변경, 따라서 t2도 같은 주소를 참조하고 있어서 아래와 같은 결과가 나온다. System.out.println("t1의 채널은 " + t1.channel + "입니다."); System.out.println("t2의 채널은 " + t2.channel + "입니다."); // 같은 주소값을 저장하고 있다. System.out.println(t1); System.out.println(t2); } }
예제 코드를 보면, t2 = t1; 을 하면서 두 변수 모두 같은 주소(인스턴스)를 저장하고 있다.
원래 t2가 가리키고 있던 인스턴스는 어떻게 될까?
인스턴스는 메모리 공간을 차지하고 있다.
인스턴스는 자신을 참조하고 있는 참조변수가 하나도 없으면 더 이상 사용될 수 없다.
따라서 자바의 가비지 컬렉터(Garbage Collector)에 의해 자동으로 메모리에서 제거된다.