[Java] static 변수1

코드 속의 "진돌"·2024년 2월 20일
0
post-thumbnail

✅ 인스턴스 내부 변수에 카운트 저장


✏️ Data1

package static1;

public class Data1 {
  public String name;
  public int count;

  public Data1(String name) {
    this.name = name;
    count++;
  }
}

생성된 객체의 수를 세어야 한다. 따라서 객체가 생성될 때 마다 생성자를 통해 인스턴스의 멤버 변수인 count 값을 증가시킨다.



✏️ DataCountMain1

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 값은 인스턴스끼리 서로 공유되지 않는다. 이 문제를 해결하려면 변수를 서로 공유해야 한다.




✅ 외부 인스턴스에 카운트 저장


✏️ Counter

package static1;

public class Counter {
  public int count;
}
  • 이 객체를 공유해서 필요할 때마다 카운트 값을 증가할 것이다.



✏️ Data2

package static1;

public class Data2 {
  public String name;

  public Data2(String name, Counter counter) {
    this.name = name;
    counter.count++;
  }
}
  • 여기에는 count 멤버 변수가 없다. 대신에 생성자에서 Counter 인스턴스를 추가로 전달 받는다.
  • 생성자가 호출되면 counter 인스턴스에 있는 count 변수의 값을 하나 증가시킨다.



✏️ DataCountMain2

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라는 별도의 클래스를 추가로 사용해야 한다.
  • 생성자의 매개변수도 추가되고, 생성자가 복잡해진다. 생성자를 호출하는 부분도 복잡해진다.
profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글