Java, static 변수 사용하기
클래스를 생성한 갯수를 세는 프로그램을 만들 때 static 없이 사용하였더니 복잡한 문제가 두개가 있었다.
- Counter 라는 별도의 클래스를 추가해야했던 점
- 생성자의 Counter 를 추가하고 호출 부분과 함께 사용하기가 불편한 점
이번에는 static 키워드를 사용하여 공용으로 사용하는 변수를 만들어 개선해보도록 한다.
Data.java
- count 변수 선언에서 int 타입 앞으로 static 키워드를 붙여주었다.
- 멤버 변수에 static 키워드를 붙이면 이를 정적 변수, Static 변수, 클래스 변수라 불리온다.
- 객체 생성한 경우 생성자가 정적 변수 count의 값을 증가시킨다.
package static2;
public class Data {
public String name;
/* static */
public static int count;
public Data(String name) {
this.name = name;
count++;
}
}
Main.java
- count 변수를 불려올 때 class 명 다음에 dot(.) 접근으로 클래스에 직접 접근하는 것을 볼 수 있다.
package static2;
public class Main {
public static void main(String[] args) {
Data data1 = new Data("First");
System.out.println("First Count = " + Data.count);
Data data2 = new Data("Second");
System.out.println("Second Count = " + Data.count);
Data data3 = new Data("Third");
System.out.println("Third Count = " + Data.count);
}
}
Main 출력 결과
First Count = 1
Second Count = 2
Third Count = 3
static 정리
new Data 인스턴스를 생성하는 부분에서 그림으로 살펴보도록 한다.
Data("First")
- static 이 붙은 멤버 변수는 메모리 구조에서 메소드 영역에서 관리한다.
- static 멤버 변수는 힙 영역에 생성되지 않는다. 메소드 영역에서 이를 관리한다.
- Data("First") 인스턴스를 생성하면 생성자를 호출한다.
- Data("First") 생성자는 static 멤버 변수인 count++ 코드를 실행하고, 인스턴스 영역이 아닌 메소드 영역에서 count 값을 증가시킨다.
Data data1 = new Data("First");
System.out.println("First Count = " + Data.count);

Data("Second")
- Data("Second") 인스턴스를 생성하면 생성자를 호출한다.
- Data("Second") 생성자는 static 멤버 변수인 count 값을 증가시킨다.
Data data2 = new Data("Second");
System.out.println("Second Count = " + Data.count);

Data("Third")
- Data("Second") 인스턴스를 생성하면 생성자를 호출한다.
- Data("Second") 생성자는 static 멤버 변수인 count 값을 증가시킨다.

이제 메소드 영역의 count 변수 값 3으로 변경되었다.
static 이 붙어있는 클래스 변수에 접근하려면 Data.count 와 같이 클래스명과 dot(.) 변수명으로 접근한다.
공용 변수 사용으로 이전 코드의 Counter 클래스가 제거되고, 호출과 생성자가 복잡한 것이 해소된 것을 볼 수 있다.
💡
Data 생성자 코드에서 자신의 정적 변수는 클래스명을 생략해도 된다.
클래스명을 생략하지 않은 경우 Data.java 는 다음과 같이 코드를 작성한다.
public class Data {
public String name;
/* static */
public static int count;
public Data(String name) {
this.name = name;
Data.count++;
}
}