package static1;
public class Data1 {
public String name;
public int count;
public Data1(String name) {
this.name = name;
count++;
}
}
생성된 객체의 수를 세어야 한다. 따라서 객체가 생성될 때 마다 생성자를 통해 인스턴스의 멤버 변수인 count
값을 증가시킨다.
package static1;
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);
}
}
객체를 생성하고 카운트 값을 출력한다.
이 프로그램은 기대한 대로 작동하지 않는다. 객체를 생성할 때 마다 Data1
인스턴스가 새로 만들어지고 인스턴스에 포함된 count
변수도 새로 만들어지기 때문이다.
처음 Data1(”A”)
인스턴스를 생성하면 count
값은 0으로 초기화 된다. 생성자에서 count++
을 호출했으므로 count
의 값은 1이 된다.
Data(”B”)
인스턴스를 생성하면 새로운 인스턴스를 생성한다. 이 새로운 인스턴스의 count
값은 0으로 초기화 된다. 생성자에서 count++
을 호출했으므로 count
의 값은 1이 된다.
Data1(”C”)
인스턴스를 생성하면 이전 인스턴스는 관계없는 새로운 인스턴스를 생성한다. 이 새로운 인스턴스의 count
값은 0으로 초기화 된다. 생성자에서 count++
을 호출했으므로 count
의 값은 1이 된다.
인스턴스에 사용되는 멤버 변수 count
값은 인스턴스끼리 서로 공유되지 않는다. 이 문제를 해결하려면 변수를 서로 공유해야 한다.
package static1;
public class Counter {
public int count;
}
package static1;
public class Data2 {
public String name;
public Data2(String name, Counter counter) {
this.name = name;
counter.count++;
}
}
count
멤버 변수가 없다. 대신에 생성자에서 Counter
인스턴스를 추가로 전달 받는다.counter
인스턴스에 있는 count
변수의 값을 하나 증가시킨다.package static1;
public class DataCountMain2 {
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);
}
}
Counter
인스턴스를 공용으로 사용한 덕분에 객체를 생성할 때 마다 값을 정확하게 증가시킬 수 있다.
Data2(”A”)
인스턴스를 생성하면 생성자를 통해 Counter
인스턴스에 있는 count
값을 하나 증가시킨다. count
값은 1이 된다.
Data2(”B”)
인스턴스를 생성하면 생성자를 통해 Counter
인스턴스에 있는 count
값을 하나 증가시킨다. count
값은 2가 된다.
Data2(”C”)
인스턴스를 생성하면 생성자를 통해 Counter
인스턴스에 있는 count
값을 하나 증가시킨다. count
값은 3이 된다.
결과적으로 Data2
의 인스턴스가 3개 생성되고, count
값도 인스턴스 숫자와 같은 3으로 정확하게 측정된다.
단점
Data2
클래스와 관련된 일인데,Counter
라는 별도의 클래스를 추가로 사용해야 한다.- 생성자의 매개변수도 추가되고, 생성자가 복잡해진다. 생성자를 호출하는 부분도 복잡해진다.