-
객체의 생성과 참조JAVA/궁금증 2024. 9. 15. 08:52
1. 인스턴스 내부 변수에 카운트 저장
public class Data1 { public String name; public int count; public Data1(String name) { this.name = name; count++; } }
public class DataCountMain1 { public static void main(String[] args) { Data1 data1 = new Data1("A"); System.out.println("A count=" + data1.count); Data1 data2 = new Data1("B"); System.out.println("B count=" + data2.count); Data1 data3 = new Data1("C"); System.out.println("C count=" + data3.count); } }
결국 A,B,C의 count 값은 다 1이다.
왜냐하면 new 키워드를 사용하여 객체를 생성할 때마다 자바는 메모리의 새로운 공간을 할당하고, 해당 공간에 객체를 저장한다. 즉, 객체를 생성할 때마다 Data 1 인스턴스는 새로 만들어진다. 그리고 인스턴스에 포함된 count변수도 새로 만들어진다(새로운 메모리 주소가 생긴다).
2. 외부 인스턴스에 카운트 저장
public class Counter { public int count; }
외부 인스턴스를 공유해보자.
public class Data2 { public String name; public Data2(String name, Counter counter) { this.name = name; counter.count++; } }
count 멤버 변수는 없다. 대신 Counter 인스턴스를 전달받는다.
public static void main(String[] args) { Counter counter = new Counter(); Data2 data1 = new Data2("A", counter); System.out.println("A count=" + counter.count); Data2 data2 = new Data2("B", counter); System.out.println("B count=" + counter.count); Data2 data3 = new Data2("C", counter); System.out.println("C count=" + counter.count); }
실행결과는 다음과 같다.
A count=1
B count=2
C count=3왜? 외부에서 생성된 인스턴스는 새로운 객체를 생성할 때마다 같은 인스턴스의 참조하기 때문이다.
객체의 상태 유지 이유
자바에서 객체는 참조(reference)를 통해 관리된다. 즉, 외부에서 생성된 Counter 객체는 메모리상에 한 번만 존재하고, 여러 객체가 그 객체를 참조한다. 새로운 객체들이 해당 Counter 객체를 참조하기 때문에, 이 객체는 초기화되지 않는다.
'JAVA > 궁금증' 카테고리의 다른 글
왜 static 메서드는 오버라이딩 될 수 없을까? (0) 2024.10.02 .dot 사용: 1. 객체의 멤버에 접근할 때 2. 클래스의 정적(static) 멤버에 접근할 때 (0) 2024.09.15 생성자 다시 기본 정리(do it! 자바) (0) 2024.09.15 인스턴스 객체화하는 이유 (0) 2024.09.01 생성자는 클래스 당 몇 개 만들 수 있을까? (0) 2024.08.25