Java, static 변수 요약하기

용어 정리

static 변수 사용 코드를 살펴본다.

public class Data {
    public String name;
    /* static */
    public static int count;
}

예제 코드의 name 과 count 는 멤버 변수이다.
멤버 변수는 static변수와 일반변수 를 분류할 수 있다.


멤버 변수 종류

  • 인스턴스 변수: static 키워드가 붙지 않은 String name 멤버 변수이다.
    • 인스턴스 변수는 생성해야만 사용할 수 있다.
    • 인스턴스 변수는 생성할 때마다 새롭게 만들어진다.
    • 인스턴스에 소속되어있다.
  • 클래스 변수: static 키워드가 붙은 static int count 멤버 변수이다.
    • 용어로는 클래스 변수, 정적 변수, static 변수로 불려오고 있다.
    • 인스턴스와 다르게 클래스에 바로 접근해서 사용
    • 클래스에 소속되어있다.
    • 클래스 변수는 자바 프로그램 시작시 1개가 만들어진다. 여러 곳에서 공용으로 사용할 수 있다.

변수와 생명주기

  • 지역 변수: 메소드 생성시 스택 영역에 있는 스택프레임에 보관, 메소드 종료시 스택 프레임 제거와 지역변수도 함께 제거된더. 가장 짦은 생명주기
  • 인스턴스 변수: 인스턴스 변수는 힙 영역에 GC 발생되기 전까지 생존으로 지역 변수보다 생명주기가 길다.
  • 클래스 변수: 메소드 영역의 static 영역으로 보관되는 변수, 프로그램 전체에 사용, 클래스 변수는 JVM 로딩 시 생성되며 JVM이 종료될 때까지 있으므로 가장 생명주기가 길다.

정적(Static) 이름은 다른 변수들은 동적(Dynamic)으로 제거되지만, static 은 프로그램 시작과 함께 종료할 때까지 남아있다. 정적인 변수로 불려오고 있다.


Static 멤버변수 접근 법

static 변수는 클래스와 인스턴스를 통해서 접근할 수 있다.
하지만 인스턴스를 통한 접근은 좋지 않다.

Data.java

public class Data {
    public String name;
    /* static */
    public static int count;

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

Main.java

public class Main {
    public static void main(String[] args) {
        // add new Data
        Data data4 = new Data("Fourth");
        // access instance field
        System.out.println("Fourth Count = " + data4.count);

        // add new Data
        Data data5 = new Data("Fifth");
        // access class field
        System.out.println("Fifth Count = " + Data.count);
    }
}

출력 결과

Fourth Count = 1
Fifth Count = 2

인스턴스를 통한 접근 data4.count 과 클래스를 통한 Data.count 모두 정상적으로 동작하는 것을 볼 수 있다. 하지만, 인스턴스보다 클래스를 통한 접근하는 것을 권장하는데 이는 클래스로 통한 접근을 한다면 static 변수인 것을 한 눈에 들어오기 때문이다. 인스턴스 변수로 선언한 경우 이것이 static 변수인지 일반 변수인지 클래스를 직접 확인하지 않는 한 호출하는 쪽에서는 분간하기 어렵다.