Java, static 변수 필요성
static 키워드는 멤버 변수에 메소드에 사용하는 키워드이다.
static 키워드가 왜 필요한지 코드를 통해 알아보도록 한다.
아래는 클래스를 통해 생성된 객체의 수를 세워보는 프로그램이다.
인스턴스 내부 변수 카운트 저장하기
클래스 생성자에게 인스턴스 내부로 count 변수를 저장하도록 한다.
Data.java
package static2;
public class Data {
public String name;
public int count;
public Data(String name) {
this.name = name;
count++;
}
}
Main.java
package static2;
public class Main {
public static void main(String[] args) {
Data data1 = new Data("First");
System.out.println("First Count = " + data1.count);
Data data2 = new Data("Second");
System.out.println("Second Count = " + data2.count);
Data data3 = new Data("Third");
System.out.println("Third Count = " + data3.count);
}
}
Main 실행 결과
First Count = 1
Second Count = 1
Third Count = 1
생성한 클래스 갯수를 세워보는 프로그램인데 원하는 결과가 출력되지 않는다.
Heap 영역을 그림으로 살펴보자
인스턴스에 저장된 데이터
다음 코드를 실행하였을 때 Heap 영역을 살펴본다.
First Data
Data data1 = new Data("First");
System.out.println("First Count = " + data1.count);
- new Data 으로 인해 힙 영역에 새로운 x00000001 인스턴스가 생성하였다.
- 생성자에서 count++ 호출로 count 값 1이 된다.
Second Data
Data data2 = new Data("Second");
System.out.println("Second Count = " + data2.count);
- new Data 으로 인해 힙 영역에 새로운 x00000002 인스턴스가 생성하였다.
- 생성자에서 count++ 호출로 count 값 1이 된다.
Third Data
Data data3 = new Data("Third");
System.out.println("Third Count = " + data3.count);
- new Data 으로 인해 힙 영역에 새로운 x00000003 인스턴스가 생성하였다.
- 생성자에서 count++ 호출로 count 값 1이 된다.
이와 같이 Data에 사용한 멤버 변수 count 값은 인스턴스 끼리 공유되지 않는 점을 볼 수 있다. 그로 인해 문제점을 찾았으니, 이 변수를 서로 공유하도록 한다.
Counter 클래스 추가하여 개선하기
앞서 말한 코드에서 Counter 클래스를 추가하고 main() 코드에서 외부 인스턴스로 생성하여 카운터를 증가 시켜 프로그램을 동작하도록 한다.
Counter.java
package static2;
public class Counter {
public int count;
}
Data.java
Counter 클래스를 받을 수 있도록 생성자 매개변수를 추가하였다.
package static2;
public class Data {
public String name;
public int count;
public Data(String name, Counter counter) {
this.name = name;
counter.count++;
}
}
Main.java
package static2;
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
Data data1 = new Data("First", counter);
System.out.println("First Count = " + counter.count);
Data data2 = new Data("Second", counter);
System.out.println("Second Count = " + counter.count);
Data data3 = new Data("Third", counter);
System.out.println("Third Count = " + counter.count);
}
}
- 코드 실행 시 힙 영역에서는 다음과 같은 일이 발생되어 정상적으로 생성한 클래스의 개수를 불려올 수 있었다.
main() 코드 결과
First Count = 1
Second Count = 2
Third Count = 3
문제점
- Counter 라는 별도의 클래스를 추가하여 사용해야 했다.
- 생성자의 매개변수를 불가피하게 추가되어 호출부분과 함께 복잡성이 증가하였다.
다음 시간에 공용으로 static 키워드를 사용하여 개선하도록 한다.