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 키워드를 사용하여 개선하도록 한다.